diff --git a/extensions/etherscan-general/index.js b/extensions/etherscan-general/index.js index f5a8ffd17c..cb189cdf8d 100644 --- a/extensions/etherscan-general/index.js +++ b/extensions/etherscan-general/index.js @@ -40,7 +40,7 @@ function load () { } }) setInterval(function () { - remix.call('app', 'detectNetWork', [], function (error, result) { + remix.call('network', 'detectNetWork', [], function (error, result) { if (error) console.log(error) if (network.innerHTML !== result[0].name + ' - ' + result[0].id) { currentNetWork = result[0].name diff --git a/package.json b/package.json index 5a2957f12d..f2e5a76d0a 100644 --- a/package.json +++ b/package.json @@ -65,7 +65,7 @@ }, "dependencies": { "http-server": "0.9.0", - "remix-plugin": "0.0.1-alpha.43", + "remix-plugin": "0.0.2-alpha.3", "remixd": "0.1.8-alpha.6" }, "repository": { diff --git a/src/app.js b/src/app.js index a0e6475f79..6633a93926 100644 --- a/src/app.js +++ b/src/app.js @@ -6,7 +6,6 @@ var yo = require('yo-yo') var async = require('async') var request = require('request') var remixLib = require('remix-lib') -var EventManager = require('./lib/events') var registry = require('./global/registry') var UniversalDApp = require('./universal-dapp.js') var UniversalDAppUI = require('./universal-dapp-ui.js') @@ -54,9 +53,8 @@ import { EntityStore } from './lib/store' import { RemixAppManager } from './remixAppManager' import { LandingPage } from './app/ui/landing-page/landing-page' import framingService from './framingService' -import { ApiFactory } from 'remix-plugin' -import { TxListenerModule } from './app/tabs/txlistener-module' import { ThemeModule } from './app/tabs/theme-module' +import { NetworkModule } from './app/tabs/network-module' var css = csjs` html { box-sizing: border-box; } @@ -116,11 +114,9 @@ var css = csjs` } ` -class App extends ApiFactory { +class App { constructor (api = {}, events = {}, opts = {}) { - super() var self = this - this.event = new EventManager() self._components = {} registry.put({api: self, name: 'app'}) @@ -171,14 +167,6 @@ class App extends ApiFactory { run.apply(self) } - get profile () { - return { - name: 'app', - description: 'service - provides information about current context (network).', - methods: ['getExecutionContextProvider', 'getProviderEndpoint', 'detectNetWork', 'addProvider', 'removeProvider'] - } - } - render () { var self = this if (self._view.el) return self._view.el @@ -250,45 +238,6 @@ class App extends ApiFactory { if (callback) callback(error) }) } - - getExecutionContextProvider () { - return new Promise((resolve, reject) => { - resolve(executionContext.getProvider()) - }) - } - - getProviderEndpoint () { - return new Promise((resolve, reject) => { - if (executionContext.getProvider() === 'web3') { - resolve(executionContext.web3().currentProvider.host) - } else { - reject('no endpoint: current provider is either injected or vm') - } - }) - } - - detectNetWork () { - return new Promise((resolve, reject) => { - executionContext.detectNetwork((error, network) => { - if (error) return reject(error) - resolve(network) - }) - }) - } - - addProvider (name, url) { - return new Promise((resolve, reject) => { - executionContext.addProvider({ name, url }) - resolve() - }) - } - - removeProvider (name) { - return new Promise((resolve, reject) => { - executionContext.removeProvider(name) - resolve() - }) - } } module.exports = App @@ -329,7 +278,7 @@ Please make a backup of your contracts and start using http://remix.ethereum.org registry.put({api: self._components.compilersArtefacts, name: 'compilersartefacts'}) // ----------------- UniversalDApp ----------------- - var udapp = new UniversalDApp(registry) + const udapp = new UniversalDApp(registry) // TODO: to remove when possible registry.put({api: udapp, name: 'udapp'}) udapp.event.register('transactionBroadcasted', (txhash, networkName) => { @@ -337,14 +286,14 @@ Please make a backup of your contracts and start using http://remix.ethereum.org if (txLink) registry.get('logCallback').api.logCallback(yo`${txLink}`) }) - var udappUI = new UniversalDAppUI(udapp, registry) + const udappUI = new UniversalDAppUI(udapp, registry) // TODO: to remove when possible registry.put({api: udappUI, name: 'udappUI'}) // ----------------- Tx listener ----------------- - var transactionReceiptResolver = new TransactionReceiptResolver() + const transactionReceiptResolver = new TransactionReceiptResolver() - var txlistener = new Txlistener({ + const txlistener = new Txlistener({ api: { contracts: function () { if (self._components.compilersArtefacts['__last']) return self._components.compilersArtefacts['__last'].getContracts() @@ -358,8 +307,9 @@ Please make a backup of your contracts and start using http://remix.ethereum.org udapp: udapp.event }}) registry.put({api: txlistener, name: 'txlistener'}) + udapp.startListening(txlistener) - var eventsDecoder = new EventsDecoder({ + const eventsDecoder = new EventsDecoder({ api: { resolveReceipt: function (tx, cb) { transactionReceiptResolver.resolve(tx, cb) @@ -368,11 +318,6 @@ Please make a backup of your contracts and start using http://remix.ethereum.org }) registry.put({api: eventsDecoder, name: 'eventsdecoder'}) - /* - that proxy is used by appManager to broadcast new transaction event - */ - const txListenerModule = new TxListenerModule(txlistener) - txlistener.startListening() // TODO: There are still a lot of dep between editorpanel and filemanager @@ -385,9 +330,13 @@ Please make a backup of your contracts and start using http://remix.ethereum.org // ----------------- file manager ---------------------------- self._components.fileManager = new FileManager() - var fileManager = self._components.fileManager + const fileManager = self._components.fileManager registry.put({api: fileManager, name: 'filemanager'}) + // ----------------- Network ---------------------------- + const networkModule = new NetworkModule() + registry.put({api: networkModule, name: 'network'}) + // ----------------- theme module ---------------------------- const themeModule = new ThemeModule() registry.put({api: themeModule, name: 'themeModule'}) @@ -397,7 +346,7 @@ Please make a backup of your contracts and start using http://remix.ethereum.org registry.put({ api: self._components.editorpanel, name: 'editorpanel' }) // ----------------- Renderer ----------------- - var renderer = new Renderer() + const renderer = new Renderer() registry.put({api: renderer, name: 'renderer'}) // ----------------- app manager ---------------------------- @@ -413,17 +362,18 @@ Please make a backup of your contracts and start using http://remix.ethereum.org const pluginManagerComponent = new PluginManagerComponent() const swapPanelComponent = new SwapPanelComponent('swapPanel', appStore, appManager, { default: true, displayHeader: true }) + registry.put({api: appManager.proxy(), name: 'pluginmanager'}) + + pluginManagerComponent.setApp(appManager) + pluginManagerComponent.setStore(appStore) + + // ----------------- Vertical Icon ---------------------------- const verticalIconsComponent = new VerticalIconsComponent('swapPanel', appStore) const swapPanelApi = new SwapPanelApi(swapPanelComponent, verticalIconsComponent) // eslint-disable-line const mainPanelApi = new SwapPanelApi(mainPanelComponent, verticalIconsComponent) // eslint-disable-line const verticalIconsApi = new VerticalIconsApi(verticalIconsComponent) // eslint-disable-line - - registry.put({api: appManager.proxy(), name: 'pluginmanager'}) registry.put({api: verticalIconsApi, name: 'verticalicon'}) - pluginManagerComponent.setApp(appManager) - pluginManagerComponent.setStore(appStore) - self._components.editorpanel.init() self._components.fileManager.init() @@ -469,16 +419,15 @@ Please make a backup of your contracts and start using http://remix.ethereum.org let sourceHighlighters = registry.get('editor').api.sourceHighlighters appManager.init([ - this.api(), landingPage.api(), udapp.api(), fileManager.api(), sourceHighlighters.api(), - txListenerModule.api(), filePanel.api(), // { profile: support.profile(), api: support }, settings.api(), pluginManagerComponent.api(), + networkModule.api(), themeModule.api() ]) @@ -496,8 +445,8 @@ Please make a backup of your contracts and start using http://remix.ethereum.org // The event listener needs to be registered as early as possible, because the // parent will send the message upon the "load" event. - var filesToLoad = null - var loadFilesCallback = function (files) { filesToLoad = files } // will be replaced later + let filesToLoad = null + let loadFilesCallback = function (files) { filesToLoad = files } // will be replaced later window.addEventListener('message', function (ev) { if (typeof ev.data === typeof [] && ev.data[0] === 'loadFiles') { @@ -515,7 +464,7 @@ Please make a backup of your contracts and start using http://remix.ethereum.org self.loadFiles(filesToLoad) } - var txLogger = new TxLogger() // eslint-disable-line + const txLogger = new TxLogger() // eslint-disable-line txLogger.event.register('debuggingRequested', (hash) => { if (!appStore.isActive('debugger')) appManager.activateOne('debugger') debug.debugger().debug(hash) @@ -547,9 +496,9 @@ Please make a backup of your contracts and start using http://remix.ethereum.org } udapp.resetAPI(transactionContextAPI) - var queryParams = new QueryParams() + const queryParams = new QueryParams() - var loadingFromGist = self.loadFromGist(queryParams.get()) + const loadingFromGist = self.loadFromGist(queryParams.get()) if (!loadingFromGist) { // insert ballot contract if there are no files to show self._components.filesProviders['browser'].resolveDirectory('browser', (error, filesList) => { diff --git a/src/app/components/plugin-manager-component.js b/src/app/components/plugin-manager-component.js index 5be1d9a220..91c2912215 100644 --- a/src/app/components/plugin-manager-component.js +++ b/src/app/components/plugin-manager-component.js @@ -2,7 +2,7 @@ const yo = require('yo-yo') const csjs = require('csjs-inject') const EventEmitter = require('events') const LocalPlugin = require('./local-plugin') -import { Plugin, ApiFactory } from 'remix-plugin' +import { Plugin, BaseApi } from 'remix-plugin' const css = csjs` .pluginSearch { @@ -34,10 +34,21 @@ const css = csjs` } ` -class PluginManagerComponent extends ApiFactory { +const profile = { + displayName: 'plugin manager', + name: 'pluginManager', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzU1IDQ1M3EzNyAzOCAzNyA5MC41dC0zNyA5MC41bC00MDEgNDAwIDE1MCAxNTAtMTYwIDE2MHEtMTYzIDE2My0zODkuNSAxODYuNXQtNDExLjUtMTAwLjVsLTM2MiAzNjJoLTE4MXYtMTgxbDM2Mi0zNjJxLTEyNC0xODUtMTAwLjUtNDExLjV0MTg2LjUtMzg5LjVsMTYwLTE2MCAxNTAgMTUwIDQwMC00MDFxMzgtMzcgOTEtMzd0OTAgMzcgMzcgOTAuNS0zNyA5MC41bC00MDAgNDAxIDIzNCAyMzQgNDAxLTQwMHEzOC0zNyA5MS0zN3Q5MCAzN3oiLz48L3N2Zz4=', + description: 'start/stop services, modules and plugins', + kind: 'settings', + location: 'swapPanel' +} + +class PluginManagerComponent extends BaseApi { constructor () { - super() + super(profile) this.event = new EventEmitter() this.views = { root: null, @@ -47,19 +58,6 @@ class PluginManagerComponent extends ApiFactory { this.filter = '' } - get profile () { - return { - displayName: 'plugin manager', - name: 'pluginManager', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzU1IDQ1M3EzNyAzOCAzNyA5MC41dC0zNyA5MC41bC00MDEgNDAwIDE1MCAxNTAtMTYwIDE2MHEtMTYzIDE2My0zODkuNSAxODYuNXQtNDExLjUtMTAwLjVsLTM2MiAzNjJoLTE4MXYtMTgxbDM2Mi0zNjJxLTEyNC0xODUtMTAwLjUtNDExLjV0MTg2LjUtMzg5LjVsMTYwLTE2MCAxNTAgMTUwIDQwMC00MDFxMzgtMzcgOTEtMzd0OTAgMzcgMzcgOTAuNS0zNyA5MC41bC00MDAgNDAxIDIzNCAyMzQgNDAxLTQwMHEzOC0zNyA5MS0zN3Q5MCAzN3oiLz48L3N2Zz4=', - description: 'start/stop services, modules and plugins', - kind: 'settings', - location: 'swapPanel' - } - } - setApp (appManager) { this.appManager = appManager } diff --git a/src/app/editor/SourceHighlighters.js b/src/app/editor/SourceHighlighters.js index 85c69e2537..e2ea39bb76 100644 --- a/src/app/editor/SourceHighlighters.js +++ b/src/app/editor/SourceHighlighters.js @@ -1,24 +1,24 @@ 'use strict' const SourceHighlighter = require('./sourceHighlighter') -import { ApiFactory } from 'remix-plugin' +import { EditorApi } from 'remix-plugin' -class SourceHighlighters extends ApiFactory { +const profile = { + displayName: 'source highlighters', + name: 'editor', + description: 'service - highlight source code' +} + +// EditorApi: +// - methods: ['highlight', 'discardHighlight'], + +class SourceHighlighters extends EditorApi { constructor () { - super() + super(profile) this.highlighters = {} } - get profile () { - return { - displayName: 'source highlighters', - name: 'sourceHighlighters', - methods: ['highlight', 'discardHighlight'], - description: 'service - highlight source code' - } - } - highlight (lineColumnPos, filePath, hexColor) { const { from } = this.currentRequest try { diff --git a/src/app/files/browser-files-tree.js b/src/app/files/browser-files-tree.js index 3c8eecf991..34df82b5db 100644 --- a/src/app/files/browser-files-tree.js +++ b/src/app/files/browser-files-tree.js @@ -2,12 +2,16 @@ var EventManager = require('../../lib/events') -import { ApiFactory } from 'remix-plugin' - -class FilesTree extends ApiFactory { +import { BaseApi } from 'remix-plugin' +class FilesTree extends BaseApi { constructor (name, storage) { - super() + super({ + name: name, + methods: ['get', 'set', 'remove'], + description: + 'service - read/write file to the `config` explorer without need of additionnal permission.' + }) this.event = new EventManager() this.storage = storage this.type = name @@ -15,15 +19,6 @@ class FilesTree extends ApiFactory { this.tree = {} } - get profile () { - // TODO should make them promisable - return { - name: this.type, - methods: ['get', 'set', 'remove'], - description: 'service - read/write file to the `config` explorer without need of additionnal permission.' - } - } - exists (path, cb) { cb(null, this._exists(path)) } @@ -114,7 +109,11 @@ class FilesTree extends ApiFactory { if (!this.storage.rename(unprefixedoldPath, unprefixednewPath)) { return false } - this.event.trigger('fileRenamed', [this.type + '/' + unprefixedoldPath, this.type + '/' + unprefixednewPath, isFolder]) + this.event.trigger('fileRenamed', [ + this.type + '/' + unprefixedoldPath, + this.type + '/' + unprefixednewPath, + isFolder + ]) return true } return false @@ -122,7 +121,7 @@ class FilesTree extends ApiFactory { resolveDirectory (path, callback) { if (path[0] === '/') path = path.substring(1) - if (!path) return callback(null, { [this.type]: { } }) + if (!path) return callback(null, { [this.type]: {} }) var tree = {} path = this.removePrefix(path) @@ -143,7 +142,6 @@ class FilesTree extends ApiFactory { if (path[0] === '/') return path.substring(1) return path } - } module.exports = FilesTree diff --git a/src/app/files/fileManager.js b/src/app/files/fileManager.js index 0ed8a3395d..373f6451e3 100644 --- a/src/app/files/fileManager.js +++ b/src/app/files/fileManager.js @@ -1,20 +1,31 @@ 'use strict' -import { ApiFactory } from 'remix-plugin' import yo from 'yo-yo' const EventEmitter = require('events') var globalRegistry = require('../../global/registry') var CompilerImport = require('../compiler/compiler-imports') var toaster = require('../ui/tooltip') +import { FileSystemApi } from 'remix-plugin' /* attach to files event (removed renamed) trigger: currentFileChanged */ -class FileManager extends ApiFactory { +const profile = { + displayName: 'file manager', + name: 'fileManager', + description: 'service - read/write to any files or folders, require giving permissions', + permission: true +} + +// File System profile +// - events: ['currentFileChanged'] +// - methods: ['getFolder', 'getCurrentFile', 'getFile', 'setFile'] + +class FileManager extends FileSystemApi { constructor (localRegistry) { - super() + super(profile) this.openedFiles = {} // list all opened files this.events = new EventEmitter() this._components = {} @@ -42,18 +53,6 @@ class FileManager extends ApiFactory { this._deps.localhostExplorer.event.register('closed', (event) => { this.removeTabsOf(this._deps.localhostExplorer) }) } - get profile () { - return { - displayName: 'file manager', - name: 'fileManager', - methods: ['getFilesFromPath', 'getCurrentFile', 'getFile', 'setFile'], - events: ['currentFileChanged'], - description: 'service - read/write to any files or folders, require giving permissions', - permission: true, - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjk2IDM4NHE0MCAwIDY4IDI4dDI4IDY4djEyMTZxMCA0MC0yOCA2OHQtNjggMjhoLTk2MHEtNDAgMC02OC0yOHQtMjgtNjh2LTI4OGgtNTQ0cS00MCAwLTY4LTI4dC0yOC02OHYtNjcycTAtNDAgMjAtODh0NDgtNzZsNDA4LTQwOHEyOC0yOCA3Ni00OHQ4OC0yMGg0MTZxNDAgMCA2OCAyOHQyOCA2OHYzMjhxNjgtNDAgMTI4LTQwaDQxNnptLTU0NCAyMTNsLTI5OSAyOTloMjk5di0yOTl6bS02NDAtMzg0bC0yOTkgMjk5aDI5OXYtMjk5em0xOTYgNjQ3bDMxNi0zMTZ2LTQxNmgtMzg0djQxNnEwIDQwLTI4IDY4dC02OCAyOGgtNDE2djY0MGg1MTJ2LTI1NnEwLTQwIDIwLTg4dDQ4LTc2em05NTYgODA0di0xMTUyaC0zODR2NDE2cTAgNDAtMjggNjh0LTY4IDI4aC00MTZ2NjQwaDg5NnoiLz48L3N2Zz4=' - } - } - fileRenamedEvent (oldName, newName, isFolder) { if (!isFolder) { this._deps.config.set('currentFile', '') @@ -223,7 +222,7 @@ class FileManager extends ApiFactory { } } - getFilesFromPath (path) { + getFolder (path) { // TODO : Change provider with promise return new Promise((resolve, reject) => { const provider = this.fileProviderOf(path) diff --git a/src/app/files/remixd-handle.js b/src/app/files/remixd-handle.js index f0cf7b8162..6787e2104d 100644 --- a/src/app/files/remixd-handle.js +++ b/src/app/files/remixd-handle.js @@ -1,5 +1,5 @@ -import { ApiFactory } from 'remix-plugin' let globalRegistry = require('../../global/registry') +import { BaseApi } from 'remix-plugin' var yo = require('yo-yo') var modalDialog = require('../ui/modaldialog') @@ -18,23 +18,21 @@ var css = csjs` } ` -export class RemixdHandle extends ApiFactory { +const profile = { + name: 'remixd', + methods: [], + events: [], + description: 'using Remixd daemon, allow to access file system', + kind: 'other' +} + +export class RemixdHandle extends BaseApi { constructor (fileSystemExplorer, locahostProvider) { - super() + super(profile) this.fileSystemExplorer = fileSystemExplorer this.locahostProvider = locahostProvider } - get profile () { - return { - name: 'remixd', - methods: [], - events: [], - description: 'using Remixd daemon, allow to access file system', - kind: 'other' - } - } - deactivate () { this.locahostProvider.close((error) => { if (error) console.log(error) diff --git a/src/app/panels/file-panel.js b/src/app/panels/file-panel.js index 5a42d28a2f..5042ca2943 100644 --- a/src/app/panels/file-panel.js +++ b/src/app/panels/file-panel.js @@ -6,7 +6,7 @@ var { RemixdHandle } = require('../files/remixd-handle.js') var globalRegistry = require('../../global/registry') var css = require('./styles/file-panel-styles') -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' var canUpload = window.File || window.FileReader || window.FileList || window.Blob @@ -27,10 +27,21 @@ var canUpload = window.File || window.FileReader || window.FileList || window.Bl - call fileProvider API */ -module.exports = class Filepanel extends ApiFactory { +const profile = { + name: 'fileExplorers', + displayName: 'file explorers', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjk2IDM4NHE0MCAwIDY4IDI4dDI4IDY4djEyMTZxMCA0MC0yOCA2OHQtNjggMjhoLTk2MHEtNDAgMC02OC0yOHQtMjgtNjh2LTI4OGgtNTQ0cS00MCAwLTY4LTI4dC0yOC02OHYtNjcycTAtNDAgMjAtODh0NDgtNzZsNDA4LTQwOHEyOC0yOCA3Ni00OHQ4OC0yMGg0MTZxNDAgMCA2OCAyOHQyOCA2OHYzMjhxNjgtNDAgMTI4LTQwaDQxNnptLTU0NCAyMTNsLTI5OSAyOTloMjk5di0yOTl6bS02NDAtMzg0bC0yOTkgMjk5aDI5OXYtMjk5em0xOTYgNjQ3bDMxNi0zMTZ2LTQxNmgtMzg0djQxNnEwIDQwLTI4IDY4dC02OCAyOGgtNDE2djY0MGg1MTJ2LTI1NnEwLTQwIDIwLTg4dDQ4LTc2em05NTYgODA0di0xMTUyaC0zODR2NDE2cTAgNDAtMjggNjh0LTY4IDI4aC00MTZ2NjQwaDg5NnoiLz48L3N2Zz4=', + description: ' - ', + kind: 'fileexplorer', + location: 'swapPanel' +} + +module.exports = class Filepanel extends BaseApi { constructor (localRegistry) { - super() + super(profile) var self = this self._components = {} self._components.registry = localRegistry || globalRegistry @@ -132,18 +143,5 @@ module.exports = class Filepanel extends ApiFactory { self.render = function render () { return element } } - - get profile () { - return { - name: 'fileExplorers', - displayName: 'file explorers', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjk2IDM4NHE0MCAwIDY4IDI4dDI4IDY4djEyMTZxMCA0MC0yOCA2OHQtNjggMjhoLTk2MHEtNDAgMC02OC0yOHQtMjgtNjh2LTI4OGgtNTQ0cS00MCAwLTY4LTI4dC0yOC02OHYtNjcycTAtNDAgMjAtODh0NDgtNzZsNDA4LTQwOHEyOC0yOCA3Ni00OHQ4OC0yMGg0MTZxNDAgMCA2OCAyOHQyOCA2OHYzMjhxNjgtNDAgMTI4LTQwaDQxNnptLTU0NCAyMTNsLTI5OSAyOTloMjk5di0yOTl6bS02NDAtMzg0bC0yOTkgMjk5aDI5OXYtMjk5em0xOTYgNjQ3bDMxNi0zMTZ2LTQxNmgtMzg0djQxNnEwIDQwLTI4IDY4dC02OCAyOGgtNDE2djY0MGg1MTJ2LTI1NnEwLTQwIDIwLTg4dDQ4LTc2em05NTYgODA0di0xMTUyaC0zODR2NDE2cTAgNDAtMjggNjh0LTY4IDI4aC00MTZ2NjQwaDg5NnoiLz48L3N2Zz4=', - description: ' - ', - kind: 'fileexplorer', - location: 'swapPanel' - } - } } diff --git a/src/app/plugin/bundle.js b/src/app/plugin/bundle.js deleted file mode 100644 index 8888bc1f06..0000000000 --- a/src/app/plugin/bundle.js +++ /dev/null @@ -1,94 +0,0 @@ -(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o this._newMessage(event), false) - } - - listen (key, type, callback) { - if (!this._notifications[key]) this._notifications[key] = {} - this._notifications[key][type] = callback - } - - call (key, type, params, callback) { - this._id++ - this._pendingRequests[this._id] = callback - window.parent.postMessage(JSON.stringify({ - action: 'request', - key, - type, - value: params, - id: this._id - }), '*') - } - - _newMessage (event) { - if (!event.data) return - if (typeof event.data !== 'string') return - - var msg - try { - msg = JSON.parse(event.data) - } catch (e) { - return console.log('unable to parse data') - } - const {action, key, type, value} = msg - if (action === 'notification') { - if (this._notifications[key] && this._notifications[key][type]) { - this._notifications[key][type](value) - } - } else if (action === 'response') { - const {id, error} = msg - if (this._pendingRequests[id]) { - this._pendingRequests[id](error, value) - delete this._pendingRequests[id] - } - } - } -} - -if (window) window.RemixExtension = RemixExtension -if (module && module.exports) module.exports = RemixExtension - diff --git a/src/app/plugin/package.json b/src/app/plugin/package.json deleted file mode 100644 index ae2bbda9a0..0000000000 --- a/src/app/plugin/package.json +++ /dev/null @@ -1,71 +0,0 @@ -{ - "name": "remix-extension", - "version": "0.0.1", - "description": "Ethereum IDE and tools for the web", - "contributors": [ - { - "name": "Yann Levreau", - "email": "yann@ethdev.com" - } - ], - "main": "./index.js", - "dependencies": { - "babel-eslint": "^7.1.1", - "babel-plugin-transform-object-assign": "^6.22.0", - "babel-preset-es2015": "^6.24.0", - "babelify": "^7.3.0", - "standard": "^7.0.1", - "tape": "^4.6.0" - }, - "scripts": { - "browserify": "browserify index.js -o bundle.js" - }, - "standard": { - "ignore": [ - "node_modules/*" - ], - "parser": "babel-eslint" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ethereum/remix-ide.git" - }, - "author": "cpp-ethereum team", - "license": "MIT", - "bugs": { - "url": "https://github.com/ethereum/remix-ide/issues" - }, - "homepage": "https://github.com/ethereum/remix-ide#readme", - "browserify": { - "transform": [ - [ - "babelify", - { - "plugins": [ - [ - "fast-async", - { - "runtimePatten": null, - "compiler": { - "promises": true, - "es7": true, - "noRuntime": true, - "wrapAwait": true - } - } - ], - "transform-object-assign" - ] - } - ], - [ - "babelify", - { - "presets": [ - "es2015" - ] - } - ] - ] - } -} diff --git a/src/app/plugin/plugin.md b/src/app/plugin/plugin.md deleted file mode 100644 index 67cb3cfa20..0000000000 --- a/src/app/plugin/plugin.md +++ /dev/null @@ -1,53 +0,0 @@ -plugin api - -# current APIs: - -## 1) notifications - -### app (key: app) - - - unfocus `[]` - - focus `[]` - -### compiler (key: compiler) - - - compilationFinished `[success (bool), data (obj), source (obj)]` - - compilationData `[compilationResult]` - -### transaction listener (key: txlistener) - - - newTransaction `tx (obj)` - -## 2) interactions - -### app - - - getExecutionContextProvider `@return {String} provider (injected | web3 | vm)` - - getProviderEndpoint `@return {String} url` - - updateTitle `@param {String} title` - - detectNetWork `@return {Object} {name, id}` - - addProvider `@param {String} name, @param {String} url` - - removeProvider `@return {String} name` - -### config - - - setConfig `@param {String} path, @param {String} content` - - getConfig `@param {String} path` - - removeConfig `@param {String} path` - -### compiler - - getCompilationResult `@return {Object} compilation result` - -### udapp (only VM) - - runTx `@param {Object} tx` - - getAccounts `@return {Array} acccounts` - - createVMAccount `@param {String} privateKey, @param {String} balance (hex)` - -### editor - - getFilesFromPath `@param {Array} [path]` - - getCurrentFile `@return {String} path` - - getFile `@param {String} path` - - setFile `@param {String} path, @param {String} content` - - highlight `@param {Object} lineColumnPos {start: {line, column}, end: {line, column}}, @param {String} path, @param {String} hexColor` - - discardHighlight - diff --git a/src/app/plugin/pluginAPI.js b/src/app/plugin/pluginAPI.js deleted file mode 100644 index cf708523e0..0000000000 --- a/src/app/plugin/pluginAPI.js +++ /dev/null @@ -1,150 +0,0 @@ -'use strict' -var executionContext = require('../../execution-context') -var SourceHighlighter = require('../editor/sourceHighlighter') -/* - Defines available API. `key` / `type` -*/ -module.exports = (pluginManager, fileProviders, fileManager, compilesrArtefacts, udapp) => { - let highlighters = {} - return { - app: { - getExecutionContextProvider: (mod, cb) => { - cb(null, executionContext.getProvider()) - }, - getProviderEndpoint: (mod, cb) => { - if (executionContext.getProvider() === 'web3') { - cb(null, executionContext.web3().currentProvider.host) - } else { - cb('no endpoint: current provider is either injected or vm') - } - }, - updateTitle: (mod, title, cb) => { - pluginManager.plugins[mod].modal.setTitle(title) - if (cb) cb() - }, - detectNetWork: (mod, cb) => { - executionContext.detectNetwork((error, network) => { - cb(error, network) - }) - }, - addProvider: (mod, name, url, cb) => { - executionContext.addProvider({ name, url }) - cb() - }, - removeProvider: (mod, name, cb) => { - executionContext.removeProvider(name) - cb() - } - }, - config: { - setConfig: (mod, path, content, cb) => { - fileProviders['config'].set(mod + '/' + path, content) - cb() - }, - getConfig: (mod, path, cb) => { - cb(null, fileProviders['config'].get(mod + '/' + path)) - }, - removeConfig: (mod, path, cb) => { - cb(null, fileProviders['config'].remove(mod + '/' + path)) - if (cb) cb() - } - }, - compiler: { - getCompilationResult: (mod, cb) => { - cb(null, compilesrArtefacts['__last']) - }, - sendCompilationResult: (mod, file, source, languageVersion, data, cb) => { - pluginManager.receivedDataFrom('sendCompilationResult', mod, [file, source, languageVersion, data]) - } - }, - udapp: { - runTx: (mod, tx, cb) => { - executionContext.detectNetwork((error, network) => { - if (error) return cb(error) - if (network.name === 'Main' && network.id === '1') { - return cb('It is not allowed to make this action against mainnet') - } - udapp.silentRunTx(tx, (error, result) => { - if (error) return cb(error) - cb(null, { - transactionHash: result.transactionHash, - status: result.result.status, - gasUsed: '0x' + result.result.gasUsed.toString('hex'), - error: result.result.vm.exceptionError, - return: result.result.vm.return ? '0x' + result.result.vm.return.toString('hex') : '0x', - createdAddress: result.result.createdAddress ? '0x' + result.result.createdAddress.toString('hex') : undefined - }) - }) - }) - }, - getAccounts: (mod, cb) => { - executionContext.detectNetwork((error, network) => { - if (error) return cb(error) - if (network.name === 'Main' && network.id === '1') { - return cb('It is not allowed to make this action against mainnet') - } - udapp.getAccounts(cb) - }) - }, - createVMAccount: (mod, privateKey, balance, cb) => { - if (executionContext.getProvider() !== 'vm') return cb('plugin API does not allow creating a new account through web3 connection. Only vm mode is allowed') - udapp.createVMAccount(privateKey, balance, (error, address) => { - cb(error, address) - }) - } - }, - editor: { - getFilesFromPath: (mod, path, cb) => { - fileManager.filesFromPath(path, cb) - }, - getCurrentFile: (mod, cb) => { - var path = fileManager.currentFile() - if (!path) { - cb('no file selected') - } else { - cb(null, path) - } - }, - getFile: (mod, path, cb) => { - var provider = fileManager.fileProviderOf(path) - if (provider) { - // TODO add approval to user for external plugin to get the content of the given `path` - provider.get(path, (error, content) => { - cb(error, content) - }) - } else { - cb(path + ' not available') - } - }, - setFile: (mod, path, content, cb) => { - var provider = fileManager.fileProviderOf(path) - if (provider) { - // TODO add approval to user for external plugin to set the content of the given `path` - provider.set(path, content, (error) => { - if (error) return cb(error) - fileManager.syncEditor(path) - cb() - }) - } else { - cb(path + ' not available') - } - }, - highlight: (mod, lineColumnPos, filePath, hexColor, cb) => { - var position - try { - position = JSON.parse(lineColumnPos) - } catch (e) { - return cb(e.message) - } - if (!highlighters[mod]) highlighters[mod] = new SourceHighlighter() - highlighters[mod].currentSourceLocation(null) - highlighters[mod].currentSourceLocationFromfileName(position, filePath, hexColor) - cb() - }, - discardHighlight: (mod, cb) => { - if (highlighters[mod]) highlighters[mod].currentSourceLocation(null) - cb() - } - } - } -} diff --git a/src/app/plugin/pluginManager.js b/src/app/plugin/pluginManager.js deleted file mode 100644 index 98b865537c..0000000000 --- a/src/app/plugin/pluginManager.js +++ /dev/null @@ -1,179 +0,0 @@ -'use strict' -var remixLib = require('remix-lib') -var EventManager = remixLib.EventManager -const PluginAPI = require('./pluginAPI') -/** - * Register and Manage plugin: - * - * Plugin registration is done in the settings tab, - * using the following format: - * { - * "title": "", - * "url": "" - * } - * - * structure of messages: - * - * - Notification sent by Remix: - *{ - * action: 'notification', - * key: , - * type: , - * value: - *} - * - * - Request sent by the plugin: - *{ - * id: , - * action: 'request', - * key: , - * type: , - * value: - *} - * - * - Response sent by Remix and receive by the plugin: - *{ - * id: , - * action: 'response', - * key: , - * type: , - * value: , - * error: (see below) - *} - * => The `error` property is `undefined` if no error happened. - * => In case of error (due to permission, system error, API error, etc...): - * error: { code, msg (optional), data (optional), stack (optional) - * => possible error code are still to be defined, but the generic one would be 500. - * - * Plugin receive 4 types of message: - * - focus (when he get focus) - * - unfocus (when he loose focus - is hidden) - * - compilationData (that is triggered just after a focus - and send the current compilation data or null) - * - compilationFinished (that is only sent to the plugin that has focus) - * - * Plugin can emit messages and receive response. - * - * CONFIG: - * - getConfig(filename). The data to send should be formatted like: - * { - * id: , - * action: 'request', - * key: 'config', - * type: 'getConfig', - * value: ['filename.ext'] - * } - * the plugin will reveice a response like: - * { - * id: , - * action: 'response', - * key: 'config', - * type: 'getConfig', - * error, - * value: ['content of filename.ext'] - * } - * same apply for the other call - * - setConfig(filename, content) - * - removeConfig - * - * See index.html and remix.js in test-browser folder for sample - * - */ -module.exports = class PluginManager { - constructor (app, compilersArtefacts, txlistener, fileProviders, fileManager, udapp) { - const self = this - self.event = new EventManager() - var pluginAPI = new PluginAPI( - this, - fileProviders, - fileManager, - compilersArtefacts, - udapp - ) - self._components = { pluginAPI } - self.plugins = {} - self.origins = {} - self.inFocus - fileManager.events.on('currentFileChanged', (file) => { - self.broadcast(JSON.stringify({ - action: 'notification', - key: 'editor', - type: 'currentFileChanged', - value: [ file ] - })) - }) - - txlistener.event.register('newTransaction', (tx) => { - self.broadcast(JSON.stringify({ - action: 'notification', - key: 'txlistener', - type: 'newTransaction', - value: [tx] - })) - }) - - window.addEventListener('message', (event) => { - if (event.type !== 'message') return - var extension = self.origins[event.origin] - if (!extension) return - - function response (key, type, callid, error, result) { - self.postToOrigin(event.origin, JSON.stringify({ - id: callid, - action: 'response', - key: key, - type: type, - error: error, - value: [ result ] - })) - } - var data = JSON.parse(event.data) - data.value.unshift(extension) - data.value.push((error, result) => { - response(data.key, data.type, data.id, error, result) - }) - if (pluginAPI[data.key] && pluginAPI[data.key][data.type]) { - pluginAPI[data.key][data.type].apply({}, data.value) - } else { - response(data.key, data.type, data.id, `Endpoint ${data.key}/${data.type} not present`, null) - } - }, false) - } - unregister (desc) { - const self = this - self._components.pluginAPI.editor.discardHighlight(desc.title, () => {}) - delete self.plugins[desc.title] - delete self.origins[desc.url] - } - register (desc, modal, content) { - const self = this - self.plugins[desc.title] = { content, modal, origin: desc.url } - self.origins[desc.url] = desc.title - } - broadcast (value) { - for (var plugin in this.plugins) { - this.post(plugin, value) - } - } - postToOrigin (origin, value) { - if (this.origins[origin]) { - this.post(this.origins[origin], value) - } - } - receivedDataFrom (methodName, mod, argumentsArray) { - // TODO check whether 'mod' as right to do that - console.log(argumentsArray) - this.event.trigger(methodName, argumentsArray) // forward to internal modules - this.broadcast(JSON.stringify({ // forward to plugins - action: 'notification', - key: mod, - type: methodName, - value: argumentsArray - })) - } - post (name, value) { - const self = this - if (self.plugins[name]) { - self.plugins[name].content.querySelector('iframe').contentWindow.postMessage(value, self.plugins[name].origin) - } - } -} diff --git a/src/app/plugin/plugins.js b/src/app/plugin/plugins.js deleted file mode 100644 index 2768c4e279..0000000000 --- a/src/app/plugin/plugins.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict' - -module.exports = { - 'oraclize': { - url: 'https://remix-plugin.oraclize.it', - title: 'Oraclize' - }, - 'solium': { - url: 'https://two-water.surge.sh', - title: 'Solium' - }, - 'ethdoc': { - url: 'https://30400.swarm-gateways.net/bzz:/ethdoc.remixide.eth', - title: 'Ethdoc' - }, - 'openzeppelin snippet': { - url: 'https://left-edge.surge.sh', - title: 'Openzeppelin snippet' - }, - 'vyper': { - url: 'https://plugin.vyper.live', - title: 'Vyper' - }, - 'slither/mythril': { - url: 'http://jittery-space.surge.sh', - title: 'Slither/Mythril' - }, - 'pipeline': { - url: 'https://pipeline.pipeos.one', - title: 'Pipeline' - } - /* - 'etherscan-general': { - url: 'http://127.0.0.1:8081', - title: 'Etherscan-general' - } - */ -} diff --git a/src/app/tabs/analysis-tab.js b/src/app/tabs/analysis-tab.js index 321189e0ea..4dfab7e930 100644 --- a/src/app/tabs/analysis-tab.js +++ b/src/app/tabs/analysis-tab.js @@ -3,31 +3,29 @@ var StaticAnalysis = require('../staticanalysis/staticAnalysisView') var EventManager = require('../../lib/events') var css = require('./styles/analysis-tab-styles') -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' import { EventEmitter } from 'events' -class AnalysisTab extends ApiFactory { +const profile = { + name: 'solidityStaticAnalysis', + displayName: 'solidity static analysis', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMjA0OCIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMjA0OCAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0yMDQ4IDE1MzZ2MTI4aC0yMDQ4di0xNTM2aDEyOHYxNDA4aDE5MjB6bS0xMjgtMTI0OHY0MzVxMCAyMS0xOS41IDI5LjV0LTM1LjUtNy41bC0xMjEtMTIxLTYzMyA2MzNxLTEwIDEwLTIzIDEwdC0yMy0xMGwtMjMzLTIzMy00MTYgNDE2LTE5Mi0xOTIgNTg1LTU4NXExMC0xMCAyMy0xMHQyMyAxMGwyMzMgMjMzIDQ2NC00NjQtMTIxLTEyMXEtMTYtMTYtNy41LTM1LjV0MjkuNS0xOS41aDQzNXExNCAwIDIzIDl0OSAyM3oiLz48L3N2Zz4=', + description: ' - ', + kind: 'analysis', + location: 'swapPanel' +} + +class AnalysisTab extends BaseApi { constructor (registry) { - super() + super(profile) this.event = new EventManager() this.events = new EventEmitter() this.registry = registry } - get profile () { - return { - name: 'solidityStaticAnalysis', - displayName: 'solidity static analysis', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMjA0OCIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMjA0OCAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0yMDQ4IDE1MzZ2MTI4aC0yMDQ4di0xNTM2aDEyOHYxNDA4aDE5MjB6bS0xMjgtMTI0OHY0MzVxMCAyMS0xOS41IDI5LjV0LTM1LjUtNy41bC0xMjEtMTIxLTYzMyA2MzNxLTEwIDEwLTIzIDEwdC0yMy0xMGwtMjMzLTIzMy00MTYgNDE2LTE5Mi0xOTIgNTg1LTU4NXExMC0xMCAyMy0xMHQyMyAxMGwyMzMgMjMzIDQ2NC00NjQtMTIxLTEyMXEtMTYtMTYtNy41LTM1LjV0MjkuNS0xOS41aDQzNXExNCAwIDIzIDl0OSAyM3oiLz48L3N2Zz4=', - description: ' - ', - kind: 'analysis', - location: 'swapPanel' - } - } - render () { var staticanalysis = new StaticAnalysis() staticanalysis.event.register('staticAnaysisWarning', (count) => { diff --git a/src/app/tabs/compile-tab.js b/src/app/tabs/compile-tab.js index 4e5680b838..f57c18cf04 100644 --- a/src/app/tabs/compile-tab.js +++ b/src/app/tabs/compile-tab.js @@ -17,12 +17,26 @@ var css = require('./styles/compile-tab-styles') const CompileTabLogic = require('./compileTab/compileTab.js') const CompilerContainer = require('./compileTab/compilerContainer.js') -import { ApiFactory } from 'remix-plugin' +import { CompilerApi } from 'remix-plugin' + +const profile = { + displayName: 'solidity compiler', + name: 'solidity', + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMywgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIgoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTMwMHB4IiBoZWlnaHQ9IjEzMDBweCIKCSB2aWV3Qm94PSIwIDAgMTMwMCAxMzAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMzAwIDEzMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8dGl0bGU+VmVjdG9yIDE8L3RpdGxlPgo8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KPGcgaWQ9IlBhZ2UtMSIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+Cgk8ZyBpZD0ic29saWRpdHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi4wMDAwMDAsIDExOC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KCQk8ZyBpZD0iR3JvdXAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgoJCQk8cGF0aCBpZD0iU2hhcGUiIG9wYWNpdHk9IjAuNDUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgICAgIiBkPSJNMzcxLjc3MiwxMzUuMzA4TDI0MS4wNjgsMzY3LjYxSC0yMC4xNThsMTMwLjYxNC0yMzIuMzAyCgkJCQlIMzcxLjc3MiIvPgoJCQk8cGF0aCBpZD0iU2hhcGVfMV8iIG9wYWNpdHk9IjAuNiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0yNDEuMDY4LDM2Ny42MWgyNjEuMzE4TDM3MS43NzIsMTM1LjMwOEgxMTAuNDU2CgkJCQlMMjQxLjA2OCwzNjcuNjF6Ii8+CgkJCTxwYXRoIGlkPSJTaGFwZV8yXyIgb3BhY2l0eT0iMC44IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3ICAgICIgZD0iTTExMC40NTYsNTk5LjgyMkwyNDEuMDY4LDM2Ny42MUwxMTAuNDU2LDEzNS4zMDgKCQkJCUwtMjAuMTU4LDM2Ny42MUwxMTAuNDU2LDU5OS44MjJ6Ii8+CgkJCTxwYXRoIGlkPSJTaGFwZV8zXyIgb3BhY2l0eT0iMC40NSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0xMTEuNzIxLDk0OC4yNzVsMTMwLjcwNC0yMzIuMzAzaDI2MS4zMThMMzczLjAzOCw5NDguMjc1CgkJCQlIMTExLjcyMSIvPgoJCQk8cGF0aCBpZD0iU2hhcGVfNF8iIG9wYWNpdHk9IjAuNiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0yNDIuNDI0LDcxNS45NzNILTE4Ljg5M2wxMzAuNjEzLDIzMi4zMDNoMjYxLjMxNwoJCQkJTDI0Mi40MjQsNzE1Ljk3M3oiLz4KCQkJPHBhdGggaWQ9IlNoYXBlXzVfIiBvcGFjaXR5PSIwLjgiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgICAgIiBkPSJNMzczLjAzOCw0ODMuNzYxTDI0Mi40MjQsNzE1Ljk3M2wxMzAuNjE0LDIzMi4zMDMKCQkJCWwxMzAuNzA0LTIzMi4zMDNMMzczLjAzOCw0ODMuNzYxeiIvPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K', + description: 'compile solidity contracts', + kind: 'compile', + permission: true, + location: 'swapPanel' +} + +// EditorApi: +// - events: ['compilationFinished'], +// - methods: ['getCompilationResult'] -class CompileTab extends ApiFactory { +class CompileTab extends CompilerApi { constructor (editor, config, renderer, swarmfileProvider, fileManager, fileProviders, pluginManager) { - super() + super(profile) this.events = new EventEmitter() this._view = { el: null, @@ -57,20 +71,6 @@ class CompileTab extends ApiFactory { ) } - get profile () { - return { - displayName: 'solidity compiler', - name: 'solidity', - methods: ['getCompilationResult'], - events: ['compilationFinished'], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IEFkb2JlIElsbHVzdHJhdG9yIDE2LjAuMywgU1ZHIEV4cG9ydCBQbHVnLUluIC4gU1ZHIFZlcnNpb246IDYuMDAgQnVpbGQgMCkgIC0tPgo8IURPQ1RZUEUgc3ZnIFBVQkxJQyAiLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9HcmFwaGljcy9TVkcvMS4xL0RURC9zdmcxMS5kdGQiPgo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zOnNrZXRjaD0iaHR0cDovL3d3dy5ib2hlbWlhbmNvZGluZy5jb20vc2tldGNoL25zIgoJIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4IiB3aWR0aD0iMTMwMHB4IiBoZWlnaHQ9IjEzMDBweCIKCSB2aWV3Qm94PSIwIDAgMTMwMCAxMzAwIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAxMzAwIDEzMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPgo8dGl0bGU+VmVjdG9yIDE8L3RpdGxlPgo8ZGVzYz5DcmVhdGVkIHdpdGggU2tldGNoLjwvZGVzYz4KPGcgaWQ9IlBhZ2UtMSIgc2tldGNoOnR5cGU9Ik1TUGFnZSI+Cgk8ZyBpZD0ic29saWRpdHkiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQwMi4wMDAwMDAsIDExOC4wMDAwMDApIiBza2V0Y2g6dHlwZT0iTVNMYXllckdyb3VwIj4KCQk8ZyBpZD0iR3JvdXAiIHNrZXRjaDp0eXBlPSJNU1NoYXBlR3JvdXAiPgoJCQk8cGF0aCBpZD0iU2hhcGUiIG9wYWNpdHk9IjAuNDUiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgICAgIiBkPSJNMzcxLjc3MiwxMzUuMzA4TDI0MS4wNjgsMzY3LjYxSC0yMC4xNThsMTMwLjYxNC0yMzIuMzAyCgkJCQlIMzcxLjc3MiIvPgoJCQk8cGF0aCBpZD0iU2hhcGVfMV8iIG9wYWNpdHk9IjAuNiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0yNDEuMDY4LDM2Ny42MWgyNjEuMzE4TDM3MS43NzIsMTM1LjMwOEgxMTAuNDU2CgkJCQlMMjQxLjA2OCwzNjcuNjF6Ii8+CgkJCTxwYXRoIGlkPSJTaGFwZV8yXyIgb3BhY2l0eT0iMC44IiBlbmFibGUtYmFja2dyb3VuZD0ibmV3ICAgICIgZD0iTTExMC40NTYsNTk5LjgyMkwyNDEuMDY4LDM2Ny42MUwxMTAuNDU2LDEzNS4zMDgKCQkJCUwtMjAuMTU4LDM2Ny42MUwxMTAuNDU2LDU5OS44MjJ6Ii8+CgkJCTxwYXRoIGlkPSJTaGFwZV8zXyIgb3BhY2l0eT0iMC40NSIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0xMTEuNzIxLDk0OC4yNzVsMTMwLjcwNC0yMzIuMzAzaDI2MS4zMThMMzczLjAzOCw5NDguMjc1CgkJCQlIMTExLjcyMSIvPgoJCQk8cGF0aCBpZD0iU2hhcGVfNF8iIG9wYWNpdHk9IjAuNiIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAgICAiIGQ9Ik0yNDIuNDI0LDcxNS45NzNILTE4Ljg5M2wxMzAuNjEzLDIzMi4zMDNoMjYxLjMxNwoJCQkJTDI0Mi40MjQsNzE1Ljk3M3oiLz4KCQkJPHBhdGggaWQ9IlNoYXBlXzVfIiBvcGFjaXR5PSIwLjgiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgICAgIiBkPSJNMzczLjAzOCw0ODMuNzYxTDI0Mi40MjQsNzE1Ljk3M2wxMzAuNjE0LDIzMi4zMDMKCQkJCWwxMzAuNzA0LTIzMi4zMDNMMzczLjAzOCw0ODMuNzYxeiIvPgoJCTwvZz4KCTwvZz4KPC9nPgo8L3N2Zz4K', - description: 'compile solidity contracts', - kind: 'compile', - permission: true, - location: 'swapPanel' - } - } - /************ * EVENTS */ diff --git a/src/app/tabs/debugger-tab.js b/src/app/tabs/debugger-tab.js index 5e1c3cb4ac..1587aadcbd 100644 --- a/src/app/tabs/debugger-tab.js +++ b/src/app/tabs/debugger-tab.js @@ -3,28 +3,26 @@ var css = require('./styles/debugger-tab-styles') var DebuggerUI = require('../debugger/debuggerUI') -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' + +const profile = { + displayName: 'debugger', + name: 'debugger', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjk2IDk2MHEwIDI2LTE5IDQ1dC00NSAxOWgtMjI0cTAgMTcxLTY3IDI5MGwyMDggMjA5cTE5IDE5IDE5IDQ1dC0xOSA0NXEtMTggMTktNDUgMTl0LTQ1LTE5bC0xOTgtMTk3cS01IDUtMTUgMTN0LTQyIDI4LjUtNjUgMzYuNS04MiAyOS05NyAxM3YtODk2aC0xMjh2ODk2cS01MSAwLTEwMS41LTEzLjV0LTg3LTMzLTY2LTM5LTQzLjUtMzIuNWwtMTUtMTQtMTgzIDIwN3EtMjAgMjEtNDggMjEtMjQgMC00My0xNi0xOS0xOC0yMC41LTQ0LjV0MTUuNS00Ni41bDIwMi0yMjdxLTU4LTExNC01OC0yNzRoLTIyNHEtMjYgMC00NS0xOXQtMTktNDUgMTktNDUgNDUtMTloMjI0di0yOTRsLTE3My0xNzNxLTE5LTE5LTE5LTQ1dDE5LTQ1IDQ1LTE5IDQ1IDE5bDE3MyAxNzNoODQ0bDE3My0xNzNxMTktMTkgNDUtMTl0NDUgMTkgMTkgNDUtMTkgNDVsLTE3MyAxNzN2Mjk0aDIyNHEyNiAwIDQ1IDE5dDE5IDQ1em0tNDgwLTU3NmgtNjQwcTAtMTMzIDkzLjUtMjI2LjV0MjI2LjUtOTMuNSAyMjYuNSA5My41IDkzLjUgMjI2LjV6Ii8+PC9zdmc+', + description: 'debug transactions', + kind: 'debugging', + location: 'swapPanel' +} -class DebuggerTab extends ApiFactory { +class DebuggerTab extends BaseApi { constructor () { - super() + super(profile) this.el = null } - get profile () { - return { - displayName: 'debugger', - name: 'debugger', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNjk2IDk2MHEwIDI2LTE5IDQ1dC00NSAxOWgtMjI0cTAgMTcxLTY3IDI5MGwyMDggMjA5cTE5IDE5IDE5IDQ1dC0xOSA0NXEtMTggMTktNDUgMTl0LTQ1LTE5bC0xOTgtMTk3cS01IDUtMTUgMTN0LTQyIDI4LjUtNjUgMzYuNS04MiAyOS05NyAxM3YtODk2aC0xMjh2ODk2cS01MSAwLTEwMS41LTEzLjV0LTg3LTMzLTY2LTM5LTQzLjUtMzIuNWwtMTUtMTQtMTgzIDIwN3EtMjAgMjEtNDggMjEtMjQgMC00My0xNi0xOS0xOC0yMC41LTQ0LjV0MTUuNS00Ni41bDIwMi0yMjdxLTU4LTExNC01OC0yNzRoLTIyNHEtMjYgMC00NS0xOXQtMTktNDUgMTktNDUgNDUtMTloMjI0di0yOTRsLTE3My0xNzNxLTE5LTE5LTE5LTQ1dDE5LTQ1IDQ1LTE5IDQ1IDE5bDE3MyAxNzNoODQ0bDE3My0xNzNxMTktMTkgNDUtMTl0NDUgMTkgMTkgNDUtMTkgNDVsLTE3MyAxNzN2Mjk0aDIyNHEyNiAwIDQ1IDE5dDE5IDQ1em0tNDgwLTU3NmgtNjQwcTAtMTMzIDkzLjUtMjI2LjV0MjI2LjUtOTMuNSAyMjYuNSA5My41IDkzLjUgMjI2LjV6Ii8+PC9zdmc+', - description: 'debug transactions', - kind: 'debugging', - location: 'swapPanel' - } - } - render () { if (this.el) return this.el diff --git a/src/app/tabs/network-module.js b/src/app/tabs/network-module.js new file mode 100644 index 0000000000..e6ff7ec0f6 --- /dev/null +++ b/src/app/tabs/network-module.js @@ -0,0 +1,66 @@ +const executionContext = require('../../execution-context') +import { NetworkApi } from 'remix-plugin' + +export const profile = { + name: 'network', + description: 'Manage the network (mainnet, ropsten, goerli...) and the provider (web3, vm, injected)' +} + +// Network API has : +// - events: ['providerChanged'] +// - methods: ['getNetworkProvider', 'getEndpoint', 'detectNetwork', 'addNetwork', 'removeNetwork'] + +export class NetworkModule extends NetworkApi { + constructor () { + super(profile) + // TODO: See with remix-lib to make sementic coherent + executionContext.event.register('contextChanged', (provider) => { + this.events.emit('providerChanged', provider) + }) + /* + // Events that could be implemented later + executionContext.event.register('removeProvider', (provider) => { + this.events.emit('networkRemoved', provider) + }) + executionContext.event.register('addProvider', (provider) => { + this.events.emit('networkAdded', provider) + }) + executionContext.event.register('web3EndpointChanged', (provider) => { + this.events.emit('web3EndpointChanged', provider) + }) + */ + } + + /** Return the current network provider (web3, vm, injected) */ + getNetworkProvider () { + return executionContext.getProvider() + } + + /** Return the current network */ + detectNetwork () { + return new Promise((resolve, reject) => { + executionContext.detectNetwork((error, network) => { + error ? reject(error) : resolve(network) + }) + }) + } + + /** Return the url only if network provider is 'web3' */ + getEndpoint () { + const provider = executionContext.getProvider() + if (provider !== 'web3') { + throw new Error('no endpoint: current provider is either injected or vm') + } + return provider.web3().currentProvider.host + } + + /** Add a custom network to the list of available networks */ + addNetwork (customNetwork) { + executionContext.addProvider(customNetwork) + } + + /** Remove a network to the list of availble networks */ + removeNetwork (name) { + executionContext.removeProvider(name) + } +} diff --git a/src/app/tabs/run-tab.js b/src/app/tabs/run-tab.js index ca6ebc8765..0ab61e97cf 100644 --- a/src/app/tabs/run-tab.js +++ b/src/app/tabs/run-tab.js @@ -12,12 +12,23 @@ var ContractDropdownUI = require('./runTab/contractDropdown.js') var Recorder = require('./runTab/model/recorder.js') var RecorderUI = require('./runTab/recorder.js') -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' + +const profile = { + name: 'run', + displayName: 'run transactions', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNTc2IDkyN2wtMTMyOCA3MzhxLTIzIDEzLTM5LjUgM3QtMTYuNS0zNnYtMTQ3MnEwLTI2IDE2LjUtMzZ0MzkuNSAzbDEzMjggNzM4cTIzIDEzIDIzIDMxdC0yMyAzMXoiLz48L3N2Zz4=', + description: 'execute and save transactions', + kind: 'run', + location: 'swapPanel' +} -class RunTab extends ApiFactory { +class RunTab extends BaseApi { constructor (udapp, udappUI, config, fileManager, editor, logCallback, filePanel, pluginManager, compilersArtefacts) { - super() + super(profile) this.event = new EventManager() this.renderInstanceContainer() @@ -28,19 +39,6 @@ class RunTab extends ApiFactory { this.renderContainer() } - get profile () { - return { - name: 'run', - displayName: 'run transactions', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNTc2IDkyN2wtMTMyOCA3MzhxLTIzIDEzLTM5LjUgM3QtMTYuNS0zNnYtMTQ3MnEwLTI2IDE2LjUtMzZ0MzkuNSAzbDEzMjggNzM4cTIzIDEzIDIzIDMxdC0yMyAzMXoiLz48L3N2Zz4=', - description: 'execute and save transactions', - kind: 'run', - location: 'swapPanel' - } - } - renderContainer () { this.container = yo`
` diff --git a/src/app/tabs/settings-tab.js b/src/app/tabs/settings-tab.js index a3a7c31fea..f013829dba 100644 --- a/src/app/tabs/settings-tab.js +++ b/src/app/tabs/settings-tab.js @@ -4,11 +4,22 @@ var tooltip = require('../ui/tooltip') var copyToClipboard = require('../ui/copy-to-clipboard') var EventManager = require('../../lib/events') var css = require('./styles/settings-tab-styles') -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' -module.exports = class SettingsTab extends ApiFactory { +const profile = { + displayName: 'settings', + name: 'settings', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMTUyIDg5NnEwLTEwNi03NS0xODF0LTE4MS03NS0xODEgNzUtNzUgMTgxIDc1IDE4MSAxODEgNzUgMTgxLTc1IDc1LTE4MXptNTEyLTEwOXYyMjJxMCAxMi04IDIzdC0yMCAxM2wtMTg1IDI4cS0xOSA1NC0zOSA5MSAzNSA1MCAxMDcgMTM4IDEwIDEyIDEwIDI1dC05IDIzcS0yNyAzNy05OSAxMDh0LTk0IDcxcS0xMiAwLTI2LTlsLTEzOC0xMDhxLTQ0IDIzLTkxIDM4LTE2IDEzNi0yOSAxODYtNyAyOC0zNiAyOGgtMjIycS0xNCAwLTI0LjUtOC41dC0xMS41LTIxLjVsLTI4LTE4NHEtNDktMTYtOTAtMzdsLTE0MSAxMDdxLTEwIDktMjUgOS0xNCAwLTI1LTExLTEyNi0xMTQtMTY1LTE2OC03LTEwLTctMjMgMC0xMiA4LTIzIDE1LTIxIDUxLTY2LjV0NTQtNzAuNXEtMjctNTAtNDEtOTlsLTE4My0yN3EtMTMtMi0yMS0xMi41dC04LTIzLjV2LTIyMnEwLTEyIDgtMjN0MTktMTNsMTg2LTI4cTE0LTQ2IDM5LTkyLTQwLTU3LTEwNy0xMzgtMTAtMTItMTAtMjQgMC0xMCA5LTIzIDI2LTM2IDk4LjUtMTA3LjV0OTQuNS03MS41cTEzIDAgMjYgMTBsMTM4IDEwN3E0NC0yMyA5MS0zOCAxNi0xMzYgMjktMTg2IDctMjggMzYtMjhoMjIycTE0IDAgMjQuNSA4LjV0MTEuNSAyMS41bDI4IDE4NHE0OSAxNiA5MCAzN2wxNDItMTA3cTktOSAyNC05IDEzIDAgMjUgMTAgMTI5IDExOSAxNjUgMTcwIDcgOCA3IDIyIDAgMTItOCAyMy0xNSAyMS01MSA2Ni41dC01NCA3MC41cTI2IDUwIDQxIDk4bDE4MyAyOHExMyAyIDIxIDEyLjV0OCAyMy41eiIvPjwvc3ZnPg==', + description: ' - ', + kind: 'settings', + location: 'swapPanel' +} + +module.exports = class SettingsTab extends BaseApi { constructor (config, editor, appManager) { - super() + super(profile) this.config = config this.editor = editor this.appManager = appManager @@ -30,18 +41,7 @@ module.exports = class SettingsTab extends ApiFactory { initTheme () { this.currentTheme = this._deps.themeModule.currentTheme() } - get profile () { - return { - displayName: 'settings', - name: 'settings', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMTc5MiIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMTc5MiAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xMTUyIDg5NnEwLTEwNi03NS0xODF0LTE4MS03NS0xODEgNzUtNzUgMTgxIDc1IDE4MSAxODEgNzUgMTgxLTc1IDc1LTE4MXptNTEyLTEwOXYyMjJxMCAxMi04IDIzdC0yMCAxM2wtMTg1IDI4cS0xOSA1NC0zOSA5MSAzNSA1MCAxMDcgMTM4IDEwIDEyIDEwIDI1dC05IDIzcS0yNyAzNy05OSAxMDh0LTk0IDcxcS0xMiAwLTI2LTlsLTEzOC0xMDhxLTQ0IDIzLTkxIDM4LTE2IDEzNi0yOSAxODYtNyAyOC0zNiAyOGgtMjIycS0xNCAwLTI0LjUtOC41dC0xMS41LTIxLjVsLTI4LTE4NHEtNDktMTYtOTAtMzdsLTE0MSAxMDdxLTEwIDktMjUgOS0xNCAwLTI1LTExLTEyNi0xMTQtMTY1LTE2OC03LTEwLTctMjMgMC0xMiA4LTIzIDE1LTIxIDUxLTY2LjV0NTQtNzAuNXEtMjctNTAtNDEtOTlsLTE4My0yN3EtMTMtMi0yMS0xMi41dC04LTIzLjV2LTIyMnEwLTEyIDgtMjN0MTktMTNsMTg2LTI4cTE0LTQ2IDM5LTkyLTQwLTU3LTEwNy0xMzgtMTAtMTItMTAtMjQgMC0xMCA5LTIzIDI2LTM2IDk4LjUtMTA3LjV0OTQuNS03MS41cTEzIDAgMjYgMTBsMTM4IDEwN3E0NC0yMyA5MS0zOCAxNi0xMzYgMjktMTg2IDctMjggMzYtMjhoMjIycTE0IDAgMjQuNSA4LjV0MTEuNSAyMS41bDI4IDE4NHE0OSAxNiA5MCAzN2wxNDItMTA3cTktOSAyNC05IDEzIDAgMjUgMTAgMTI5IDExOSAxNjUgMTcwIDcgOCA3IDIyIDAgMTItOCAyMy0xNSAyMS01MSA2Ni41dC01NCA3MC41cTI2IDUwIDQxIDk4bDE4MyAyOHExMyAyIDIxIDEyLjV0OCAyMy41eiIvPjwvc3ZnPg==', - description: ' - ', - kind: 'settings', - location: 'swapPanel' - } - } + createThemeCheckies () { let themes = this._deps.themeModule.getThemes() const onswitchTheme = (event, name) => { diff --git a/src/app/tabs/test-tab.js b/src/app/tabs/test-tab.js index 97efc68c93..ac3cd9b6b6 100644 --- a/src/app/tabs/test-tab.js +++ b/src/app/tabs/test-tab.js @@ -3,13 +3,23 @@ var async = require('async') var tooltip = require('../ui/tooltip') var css = require('./styles/test-tab-styles') var remixTests = require('remix-tests') -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' const TestTabLogic = require('./testTab/testTab') -module.exports = class TestTab extends ApiFactory { +const profile = { + name: 'solidityUnitTesting', + displayName: 'solidity unit testing', + methods: [], + events: [], + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMjMwNCIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMjMwNCAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzI4IDQ0OGwtMzg0IDcwNGg3Njh6bS0xMjgwIDBsLTM4NCA3MDRoNzY4em04MjEtMTkycS0xNCA0MC00NS41IDcxLjV0LTcxLjUgNDUuNXYxMjkxaDYwOHExNCAwIDIzIDl0OSAyM3Y2NHEwIDE0LTkgMjN0LTIzIDloLTEzNDRxLTE0IDAtMjMtOXQtOS0yM3YtNjRxMC0xNCA5LTIzdDIzLTloNjA4di0xMjkxcS00MC0xNC03MS41LTQ1LjV0LTQ1LjUtNzEuNWgtNDkxcS0xNCAwLTIzLTl0LTktMjN2LTY0cTAtMTQgOS0yM3QyMy05aDQ5MXEyMS01NyA3MC05Mi41dDExMS0zNS41IDExMSAzNS41IDcwIDkyLjVoNDkxcTE0IDAgMjMgOXQ5IDIzdjY0cTAgMTQtOSAyM3QtMjMgOWgtNDkxem0tMTgxIDE2cTMzIDAgNTYuNS0yMy41dDIzLjUtNTYuNS0yMy41LTU2LjUtNTYuNS0yMy41LTU2LjUgMjMuNS0yMy41IDU2LjUgMjMuNSA1Ni41IDU2LjUgMjMuNXptMTA4OCA4ODBxMCA3My00Ni41IDEzMXQtMTE3LjUgOTEtMTQ0LjUgNDkuNS0xMzkuNSAxNi41LTEzOS41LTE2LjUtMTQ0LjUtNDkuNS0xMTcuNS05MS00Ni41LTEzMXEwLTExIDM1LTgxdDkyLTE3NC41IDEwNy0xOTUuNSAxMDItMTg0IDU2LTEwMHExOC0zMyA1Ni0zM3Q1NiAzM3E0IDcgNTYgMTAwdDEwMiAxODQgMTA3IDE5NS41IDkyIDE3NC41IDM1IDgxem0tMTI4MCAwcTAgNzMtNDYuNSAxMzF0LTExNy41IDkxLTE0NC41IDQ5LjUtMTM5LjUgMTYuNS0xMzkuNS0xNi41LTE0NC41LTQ5LjUtMTE3LjUtOTEtNDYuNS0xMzFxMC0xMSAzNS04MXQ5Mi0xNzQuNSAxMDctMTk1LjUgMTAyLTE4NCA1Ni0xMDBxMTgtMzMgNTYtMzN0NTYgMzNxNCA3IDU2IDEwMHQxMDIgMTg0IDEwNyAxOTUuNSA5MiAxNzQuNSAzNSA4MXoiLz48L3N2Zz4=', + description: ' - ', + location: 'swapPanel' +} + +module.exports = class TestTab extends BaseApi { constructor (fileManager, filePanel, compileTab) { - super() + super(profile) this.compileTab = compileTab this._view = { el: null } this.compileTab = compileTab @@ -20,18 +30,6 @@ module.exports = class TestTab extends ApiFactory { this.testList = yo`
` } - get profile () { - return { - name: 'solidityUnitTesting', - displayName: 'solidity unit testing', - methods: [], - events: [], - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPHN2ZyB3aWR0aD0iMjMwNCIgaGVpZ2h0PSIxNzkyIiB2aWV3Qm94PSIwIDAgMjMwNCAxNzkyIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxwYXRoIGQ9Ik0xNzI4IDQ0OGwtMzg0IDcwNGg3Njh6bS0xMjgwIDBsLTM4NCA3MDRoNzY4em04MjEtMTkycS0xNCA0MC00NS41IDcxLjV0LTcxLjUgNDUuNXYxMjkxaDYwOHExNCAwIDIzIDl0OSAyM3Y2NHEwIDE0LTkgMjN0LTIzIDloLTEzNDRxLTE0IDAtMjMtOXQtOS0yM3YtNjRxMC0xNCA5LTIzdDIzLTloNjA4di0xMjkxcS00MC0xNC03MS41LTQ1LjV0LTQ1LjUtNzEuNWgtNDkxcS0xNCAwLTIzLTl0LTktMjN2LTY0cTAtMTQgOS0yM3QyMy05aDQ5MXEyMS01NyA3MC05Mi41dDExMS0zNS41IDExMSAzNS41IDcwIDkyLjVoNDkxcTE0IDAgMjMgOXQ5IDIzdjY0cTAgMTQtOSAyM3QtMjMgOWgtNDkxem0tMTgxIDE2cTMzIDAgNTYuNS0yMy41dDIzLjUtNTYuNS0yMy41LTU2LjUtNTYuNS0yMy41LTU2LjUgMjMuNS0yMy41IDU2LjUgMjMuNSA1Ni41IDU2LjUgMjMuNXptMTA4OCA4ODBxMCA3My00Ni41IDEzMXQtMTE3LjUgOTEtMTQ0LjUgNDkuNS0xMzkuNSAxNi41LTEzOS41LTE2LjUtMTQ0LjUtNDkuNS0xMTcuNS05MS00Ni41LTEzMXEwLTExIDM1LTgxdDkyLTE3NC41IDEwNy0xOTUuNSAxMDItMTg0IDU2LTEwMHExOC0zMyA1Ni0zM3Q1NiAzM3E0IDcgNTYgMTAwdDEwMiAxODQgMTA3IDE5NS41IDkyIDE3NC41IDM1IDgxem0tMTI4MCAwcTAgNzMtNDYuNSAxMzF0LTExNy41IDkxLTE0NC41IDQ5LjUtMTM5LjUgMTYuNS0xMzkuNS0xNi41LTE0NC41LTQ5LjUtMTE3LjUtOTEtNDYuNS0xMzFxMC0xMSAzNS04MXQ5Mi0xNzQuNSAxMDctMTk1LjUgMTAyLTE4NCA1Ni0xMDBxMTgtMzMgNTYtMzN0NTYgMzNxNCA3IDU2IDEwMHQxMDIgMTg0IDEwNyAxOTUuNSA5MiAxNzQuNSAzNSA4MXoiLz48L3N2Zz4=', - description: ' - ', - location: 'swapPanel' - } - } - activate () { this.listenToEvents() } diff --git a/src/app/tabs/testTab/testTab.js b/src/app/tabs/testTab/testTab.js index 1fb04e19e1..620b40aa57 100644 --- a/src/app/tabs/testTab/testTab.js +++ b/src/app/tabs/testTab/testTab.js @@ -26,7 +26,7 @@ class TestTabLogic { var tests = [] let files try { - files = await this.fileManager.getFilesFromPath(path) + files = await this.fileManager.getFolder(path) } catch (e) { cb(e.message) } diff --git a/src/app/tabs/theme-module.js b/src/app/tabs/theme-module.js index a334a35d95..406c36ddee 100644 --- a/src/app/tabs/theme-module.js +++ b/src/app/tabs/theme-module.js @@ -1,4 +1,4 @@ -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' import { EventEmitter } from 'events' const Storage = require('remix-lib').Storage @@ -17,24 +17,22 @@ const themes = [ {name: 'Superhero', quality: 'dark', url: 'https://stackpath.bootstrapcdn.com/bootswatch/4.3.1/superhero/bootstrap.min.css'} ] -export class ThemeModule extends ApiFactory { +const profile = { + name: 'theme', + events: ['themeChanged'], + methods: ['switchTheme', 'getThemes', 'currentTheme'] +} + +export class ThemeModule extends BaseApi { constructor () { - super() + super(profile) this.events = new EventEmitter() this.storage = new Storage('style:') this.themes = themes.reduce((acc, theme) => ({ ...acc, [theme.name]: theme }), {}) this.active = this.storage.exists('theme') ? this.storage.get('theme') : 'Cerulean' } - get profile () { - return { - name: 'theme', - events: ['themeChanged'], - methods: ['switchTheme', 'getThemes', 'currentTheme'] - } - } - /** Return the active theme */ currentTheme () { return this.themes[this.active] diff --git a/src/app/tabs/txlistener-module.js b/src/app/tabs/txlistener-module.js deleted file mode 100644 index fb872dd5da..0000000000 --- a/src/app/tabs/txlistener-module.js +++ /dev/null @@ -1,23 +0,0 @@ -import { ApiFactory } from 'remix-plugin' -import { EventEmitter } from 'events' - -export class TxListenerModule extends ApiFactory { - - constructor (txlistener) { - super() - this.events = new EventEmitter() - txlistener.event.register('newTransaction', (tx) => { - this.events.emit('newTransaction', tx) - }) - } - - get profile () { - return { - name: 'txListener', - displayName: 'transaction listener', - events: ['newTransaction'], - description: 'service - notify new transactions', - permission: true - } - } -} diff --git a/src/app/ui/landing-page/landing-page.js b/src/app/ui/landing-page/landing-page.js index 6569a7bcee..9c918d9099 100644 --- a/src/app/ui/landing-page/landing-page.js +++ b/src/app/ui/landing-page/landing-page.js @@ -56,13 +56,23 @@ let css = csjs` ` import { defaultWorkspaces } from './workspace' -import { ApiFactory } from 'remix-plugin' +import { BaseApi } from 'remix-plugin' import Section from './section' -export class LandingPage extends ApiFactory { +const profile = { + displayName: 'Home', + name: 'home', + methods: [], + events: [], + description: ' - ', + icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUwIDUwIiBoZWlnaHQ9IjUwcHgiIGlkPSJMYXllcl8xIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA1MCA1MCIgd2lkdGg9IjUwcHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iNTAiIHdpZHRoPSI1MCIvPjxnPjxwYXRoIGQ9IiAgIE0yNSwxQzExLjc0NSwxLDEsMTEuNzQ1LDEsMjVzMTAuNzQ1LDI0LDI0LDI0czI0LTEwLjc0NSwyNC0yNFMzOC4yNTUsMSwyNSwxTDI1LDF6IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2Utd2lkdGg9IjIiLz48L2c+PHBhdGggZD0iICBNNDAuNjk2LDYuODMyYzAsMC0xMy4xNjksOC4yMTItMTEuNTMyLDIyLjMzMmMxLjE0Miw5Ljg1OCwxMS45MzUsMTMuMzc3LDExLjkzNSwxMy4zNzciIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iMi4wNTgzIi8+PHBhdGggZD0iICBNNy4zODUsOC45MTNjMCwwLDMuMDQxLDYuNDc2LDMuMDQxLDE4LjE2OWMwLDkuMjQ2LTMuNTgzLDEyLjkxMS0zLjU4MywxMi45MTEiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iMi4wNTgzIi8+PHBhdGggZD0iICBNMS44NTIsMjIuOTMyYzAsMCw2LjQ5Myw2LjIzMiwyMy4xNDgsNi4yMzJzMjMuNDM4LTYuMjQ2LDIzLjQzOC02LjI0NiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLXdpZHRoPSIyLjA1ODMiLz48cGF0aCBkPSIgIE0yNS42NDgsMS41NDhjMCwwLTYuODk1LDcuOTM1LTYuODk1LDIzLjQ1MkMxOC43NTQsNDAuNTE4LDI1LDQ4LjYyNSwyNSw0OC42MjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iMi4wNTgzIi8+PC9zdmc+', + location: 'mainPanel' +} + +export class LandingPage extends BaseApi { constructor (appManager, appStore) { - super() + super(profile) this.appStore = appStore this.sections = [] let load = function (item) { @@ -178,18 +188,6 @@ export class LandingPage extends ApiFactory { this.sections.push(sectionResources) } - get profile () { - return { - displayName: 'Home', - name: 'home', - methods: [], - events: [], - description: ' - ', - icon: 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjwhRE9DVFlQRSBzdmcgIFBVQkxJQyAnLS8vVzNDLy9EVEQgU1ZHIDEuMS8vRU4nICAnaHR0cDovL3d3dy53My5vcmcvR3JhcGhpY3MvU1ZHLzEuMS9EVEQvc3ZnMTEuZHRkJz48c3ZnIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDUwIDUwIiBoZWlnaHQ9IjUwcHgiIGlkPSJMYXllcl8xIiB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCA1MCA1MCIgd2lkdGg9IjUwcHgiIHhtbDpzcGFjZT0icHJlc2VydmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iNTAiIHdpZHRoPSI1MCIvPjxnPjxwYXRoIGQ9IiAgIE0yNSwxQzExLjc0NSwxLDEsMTEuNzQ1LDEsMjVzMTAuNzQ1LDI0LDI0LDI0czI0LTEwLjc0NSwyNC0yNFMzOC4yNTUsMSwyNSwxTDI1LDF6IiBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAwMDAiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLW1pdGVybGltaXQ9IjEwIiBzdHJva2Utd2lkdGg9IjIiLz48L2c+PHBhdGggZD0iICBNNDAuNjk2LDYuODMyYzAsMC0xMy4xNjksOC4yMTItMTEuNTMyLDIyLjMzMmMxLjE0Miw5Ljg1OCwxMS45MzUsMTMuMzc3LDExLjkzNSwxMy4zNzciIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iMi4wNTgzIi8+PHBhdGggZD0iICBNNy4zODUsOC45MTNjMCwwLDMuMDQxLDYuNDc2LDMuMDQxLDE4LjE2OWMwLDkuMjQ2LTMuNTgzLDEyLjkxMS0zLjU4MywxMi45MTEiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iMi4wNTgzIi8+PHBhdGggZD0iICBNMS44NTIsMjIuOTMyYzAsMCw2LjQ5Myw2LjIzMiwyMy4xNDgsNi4yMzJzMjMuNDM4LTYuMjQ2LDIzLjQzOC02LjI0NiIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjMDAwMDAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIHN0cm9rZS1taXRlcmxpbWl0PSIxMCIgc3Ryb2tlLXdpZHRoPSIyLjA1ODMiLz48cGF0aCBkPSIgIE0yNS42NDgsMS41NDhjMCwwLTYuODk1LDcuOTM1LTYuODk1LDIzLjQ1MkMxOC43NTQsNDAuNTE4LDI1LDQ4LjYyNSwyNSw0OC42MjUiIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzAwMDAwMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBzdHJva2UtbWl0ZXJsaW1pdD0iMTAiIHN0cm9rZS13aWR0aD0iMi4wNTgzIi8+PC9zdmc+', - location: 'mainPanel' - } - } - render () { let logo = 'data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAxNi4wLjAsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+DQo8c3ZnIHZlcnNpb249IjEuMSIgaWQ9IkxheWVyXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB3aWR0aD0iNTEycHgiIGhlaWdodD0iNTEycHgiIHZpZXdCb3g9IjAgMCA1MTIgNTEyIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCA1MTIgNTEyIiB4bWw6c3BhY2U9InByZXNlcnZlIj4NCjxnPg0KCTxwYXRoIGZpbGw9IiM0MTQwNDIiIGQ9Ik03MC41ODIsNDI4LjkwNGMwLjgxMSwwLDEuNjIyLDAuMjg1LDIuNDM3LDAuODUzYzAuODExLDAuNTcxLDEuMjE4LDEuMzQsMS4yMTgsMi4zMTQNCgkJYzAsMi4yNzctMS4wNTksMy40OTYtMy4xNjgsMy42NTZjLTUuMDM4LDAuODE0LTkuMzgxLDIuMzU2LTEzLjAzNyw0LjYzYy0zLjY1NSwyLjI3Ni02LjY2Myw1LjExNy05LjAxNiw4LjUyOA0KCQljLTIuMzU3LDMuNDExLTQuMTA0LDcuMjcyLTUuMjM5LDExLjU3NWMtMS4xMzksNC4zMDctMS43MDYsOC44MTQtMS43MDYsMTMuNTI0djMyLjY1M2MwLDIuMjczLTEuMTM5LDMuNDExLTMuNDEyLDMuNDExDQoJCWMtMi4yNzcsMC0zLjQxMi0xLjEzOC0zLjQxMi0zLjQxMXYtNzQuMzIzYzAtMi4yNzMsMS4xMzUtMy40MTEsMy40MTItMy40MTFjMi4yNzMsMCwzLjQxMiwxLjEzOCwzLjQxMiwzLjQxMXYxNS4xMDgNCgkJYzEuNDYyLTIuNDM3LDMuMjA2LTQuNzUyLDUuMjM5LTYuOTQ1YzIuMDI5LTIuMTkzLDQuMjY0LTQuMTQzLDYuNzAxLTUuODQ4YzIuNDM3LTEuNzA2LDUuMDc2LTMuMDg1LDcuOTE5LTQuMTQzDQoJCUM2NC43NzEsNDI5LjQzMyw2Ny42NTgsNDI4LjkwNCw3MC41ODIsNDI4LjkwNHoiLz4NCgk8cGF0aCBmaWxsPSIjNDE0MDQyIiBkPSJNMTM3Ljc3Myw0MjcuMTk4YzUuNjg1LDAsMTAuOTY2LDEuMTgxLDE1LjgzOSwzLjUzNGM0Ljg3NCwyLjM1Niw5LjA1NSw1LjQ4MiwxMi41NSw5LjM4MQ0KCQljMy40OTIsMy44OTksNi4yMTQsOC40MDcsOC4xNjQsMTMuNTI0YzEuOTQ5LDUuMTE3LDIuOTI0LDEwLjQ0LDIuOTI0LDE1Ljk2MWMwLDAuOTc2LTAuMzY2LDEuNzktMS4wOTcsMi40MzgNCgkJYy0wLjczMSwwLjY1LTEuNTgzLDAuOTc1LTIuNTU5LDAuOTc1aC02Ny45ODdjMC40ODcsNC4yMjYsMS41ODQsOC4yODUsMy4yOSwxMi4xODRjMS43MDYsMy44OTksMy45MzcsNy4zMTIsNi43MDEsMTAuMjM0DQoJCWMyLjc2MSwyLjkyNSw2LjAwOCw1LjI4MSw5Ljc0OCw3LjA2N2MzLjczNSwxLjc4OSw3Ljg3NywyLjY4MSwxMi40MjgsMi42ODFjMTIuMDIxLDAsMjEuMzYtNC43OSwyOC4wMjMtMTQuMzc3DQoJCWMwLjY0Ny0xLjEzNiwxLjYyMi0xLjcwNiwyLjkyNC0xLjcwNmMyLjI3MywwLDMuNDEyLDEuMTM5LDMuNDEyLDMuNDEyYzAsMC4xNjMtMC4xNjQsMC43My0wLjQ4NywxLjcwNQ0KCQljLTMuNDEyLDYuMDEzLTguMjA1LDEwLjQ3OS0xNC4zNzcsMTMuNDAyYy02LjE3NiwyLjkyNC0xMi42NzEsNC4zODctMTkuNDk1LDQuMzg3Yy01LjY4OSwwLTEwLjkyOC0xLjE4MS0xNS43MTgtMy41MzMNCgkJYy00Ljc5My0yLjM1NC04LjkzNi01LjQ4My0xMi40MjgtOS4zODJjLTMuNDk1LTMuODk5LTYuMjE0LTguNDA3LTguMTYzLTEzLjUyNGMtMS45NS01LjExOC0yLjkyNC0xMC40MzctMi45MjQtMTUuOTYyDQoJCWMwLTUuNTIxLDAuOTc1LTEwLjg0NCwyLjkyNC0xNS45NjFjMS45NDktNS4xMTcsNC42NjgtOS42MjUsOC4xNjMtMTMuNTI0YzMuNDkyLTMuODk4LDcuNjM0LTcuMDI0LDEyLjQyOC05LjM4MQ0KCQlDMTI2Ljg0Niw0MjguMzc5LDEzMi4wODQsNDI3LjE5OCwxMzcuNzczLDQyNy4xOTh6IE0xNjkuOTQsNDY2LjE4OGMtMC4zMjgtNC4yMjMtMS4zNDEtOC4yODUtMy4wNDYtMTIuMTg0DQoJCWMtMS43MDYtMy44OTktMy45ODItNy4zMTItNi44MjMtMTAuMjM1Yy0yLjg0NC0yLjkyNC02LjE3NS01LjI3Ny05Ljk5MS03LjA2N2MtMy44MTktMS43ODUtNy45Mi0yLjY4LTEyLjMwNi0yLjY4DQoJCWMtNC41NSwwLTguNjkyLDAuODk1LTEyLjQyOCwyLjY4Yy0zLjczOSwxLjc5LTYuOTg3LDQuMTQ0LTkuNzQ4LDcuMDY3Yy0yLjc2NCwyLjkyNC00Ljk5NSw2LjMzNi02LjcwMSwxMC4yMzUNCgkJYy0xLjcwNiwzLjg5OC0yLjgwMiw3Ljk2MS0zLjI5LDEyLjE4NEgxNjkuOTR6Ii8+DQoJPHBhdGggZmlsbD0iIzQxNDA0MiIgZD0iTTMwNC42OSw0MjcuNDQxYzUuMDM0LDAsOS41MDQsMS4wMTgsMTMuNDAyLDMuMDQ3YzMuODk5LDIuMDMzLDcuMTg5LDQuNjcyLDkuODcsNy45Mg0KCQljMi42OCwzLjI1MSw0LjcwOSw3LjA2Niw2LjA5MiwxMS40NTJjMS4zNzksNC4zODcsMi4wNyw4Ljg1NiwyLjA3LDEzLjQwMnY0My42MmMwLDAuOTc1LTAuMzY1LDEuNzg5LTEuMDk3LDIuNDM4DQoJCWMtMC43MywwLjY0Ni0xLjUwMywwLjk3NS0yLjMxMywwLjk3NWMtMi4yNzYsMC0zLjQxMi0xLjE0LTMuNDEyLTMuNDEydi00My42MmMwLTMuNTcxLTAuNTI5LTcuMTA0LTEuNTg0LTEwLjYNCgkJYy0xLjA1OS0zLjQ5MS0yLjYwMi02LjYxOC00LjYzLTkuMzgyYy0yLjAzMy0yLjc2MS00LjU5Mi00Ljk1My03LjY3Ny02LjU4Yy0zLjA4OC0xLjYyMS02LjY2Mi0yLjQzNi0xMC43MjItMi40MzYNCgkJYy01LjIsMC05LjU4NywxLjIxOC0xMy4xNTksMy42NTRjLTMuNTc0LDIuNDM4LTYuNDU3LDUuNTY2LTguNjUsOS4zODJjLTIuMTkzLDMuODE5LTMuODE4LDguMDQyLTQuODc0LDEyLjY3Mg0KCQljLTEuMDU5LDQuNjMtMS41ODQsOS4wNTgtMS41ODQsMTMuMjh2MzMuNjI5YzAsMC45NzUtMC4zNjUsMS43ODktMS4wOTYsMi40MzhjLTAuNzMxLDAuNjQ2LTEuNTA1LDAuOTc1LTIuMzE1LDAuOTc1DQoJCWMtMi4yNzYsMC0zLjQxMS0xLjE0LTMuNDExLTMuNDEydi00My42MmMwLTMuNTcxLTAuNTMtNy4xMDQtMS41ODUtMTAuNmMtMS4wNTgtMy40OTEtMi42MDEtNi42MTgtNC42MjktOS4zODINCgkJYy0yLjAzNC0yLjc2MS00LjU5Mi00Ljk1My03LjY3Ny02LjU4Yy0zLjA4Ny0xLjYyMS02LjY2My0yLjQzNi0xMC43MjItMi40MzZjLTUuMDM3LDAtOS4zNDQsMC44OTUtMTIuOTE1LDIuNjgNCgkJYy0zLjU3NSwxLjc5LTYuNTQyLDQuMjY2LTguODk1LDcuNDMzYy0yLjM1NywzLjE2Ny00LjA2Myw2Ljk0NC01LjExNywxMS4zMzFjLTEuMDU5LDQuMzg2LTEuNTg0LDkuMS0xLjU4NCwxNC4xMzR2My44OTl2MC4yNDMNCgkJdjMyLjg5N2MwLDIuMjcyLTEuMTM4LDMuNDEyLTMuNDEyLDMuNDEyYy0yLjI3NiwwLTMuNDExLTEuMTQtMy40MTEtMy40MTJ2LTc0LjU2N2MwLTIuMjczLDEuMTM1LTMuNDExLDMuNDExLTMuNDExDQoJCWMyLjI3MywwLDMuNDEyLDEuMTM4LDMuNDEyLDMuNDExdjEyLjQyOGMyLjkyNC01LjE5Nyw2Ljg2MS05LjM4MiwxMS44MTktMTIuNTVjNC45NTQtMy4xNjcsMTAuNTE3LTQuNzUyLDE2LjY5Mi00Ljc1Mg0KCQljNi45ODMsMCwxMi45OTUsMS45OTEsMTguMDMyLDUuOTdjNS4wMzMsMy45ODMsOC42ODgsOS4yMjMsMTAuOTY2LDE1LjcxOWMyLjc2LTYuMzM2LDYuNzM5LTExLjUzMywxMS45NC0xNS41OTYNCgkJQzI5MS4xMjUsNDI5LjQ3NSwyOTcuMzgsNDI3LjQ0MSwzMDQuNjksNDI3LjQ0MXoiLz4NCgk8cGF0aCBmaWxsPSIjNDE0MDQyIiBkPSJNMzc4Ljc1Myw0MjkuMzkyYzAuODExLDAsMS41ODQsMC4zNjUsMi4zMTQsMS4wOTdjMC43MzEsMC43MywxLjA5NywxLjUwNCwxLjA5NywyLjMxNHY3NC4wOA0KCQljMCwwLjgxNC0wLjM2NSwxLjU4NC0xLjA5NywyLjMxNWMtMC43MywwLjczLTEuNTA0LDEuMDk3LTIuMzE0LDEuMDk3Yy0wLjk3NSwwLTEuNzktMC4zNjYtMi40MzgtMS4wOTcNCgkJYy0wLjY1LTAuNzMxLTAuOTc1LTEuNTAxLTAuOTc1LTIuMzE1di03NC4wOGMwLTAuODExLDAuMzI0LTEuNTg0LDAuOTc1LTIuMzE0QzM3Ni45NjMsNDI5Ljc1NywzNzcuNzc4LDQyOS4zOTIsMzc4Ljc1Myw0MjkuMzkyeiINCgkJLz4NCgk8cGF0aCBmaWxsPSIjNDE0MDQyIiBkPSJNNDczLjM0LDQyOC42NmMyLjI3MywwLDMuNDEyLDEuMTM5LDMuNDEyLDMuNDExbC0wLjQ4NywxLjk1bC0yNC4zNjgsMzUuMzM0bDI0LjM2OCwzNS41NzcNCgkJYzAuMzIzLDAuOTc2LDAuNDg3LDEuNjI2LDAuNDg3LDEuOTVjMCwyLjI3Mi0xLjEzOSwzLjQxMi0zLjQxMiwzLjQxMmMtMS4zMDIsMC0yLjE5My0wLjQ4OC0yLjY4LTEuNDYzbC0yMi45MDYtMzMuMzg0DQoJCWwtMjIuNjYzLDMzLjM4NGMtMC44MTQsMC45NzUtMS43OSwxLjQ2My0yLjkyNCwxLjQ2M2MtMi4yNzcsMC0zLjQxMS0xLjE0LTMuNDExLTMuNDEyYzAtMC4zMjQsMC4xNTktMC45NzUsMC40ODYtMS45NQ0KCQlsMjQuMzY5LTM1LjU3N2wtMjQuMzY5LTM1LjMzNGwtMC40ODYtMS45NWMwLTIuMjcyLDEuMTM0LTMuNDExLDMuNDExLTMuNDExYzEuMTM0LDAsMi4xMDksMC40ODcsMi45MjQsMS40NjJsMjIuNjYzLDMzLjE0MQ0KCQlsMjIuOTA2LTMzLjE0MUM0NzEuMTQ2LDQyOS4xNDcsNDcyLjAzOCw0MjguNjYsNDczLjM0LDQyOC42NnoiLz4NCjwvZz4NCjxnPg0KCTxnPg0KCQk8ZyBvcGFjaXR5PSIwLjQ1Ij4NCgkJCTxnPg0KCQkJCTxwb2x5Z29uIGZpbGw9IiMwMTAxMDEiIHBvaW50cz0iMTUwLjczNCwxOTYuMjEyIDI1NS45NjksMzQ0LjUwOCAyNTUuOTY5LDI1OC4zODcgCQkJCSIvPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxnIG9wYWNpdHk9IjAuOCI+DQoJCQk8Zz4NCgkJCQk8cG9seWdvbiBmaWxsPSIjMDEwMTAxIiBwb2ludHM9IjI1NS45NjksMjU4LjM4NyAyNTUuOTY5LDM0NC41MDggMzYxLjI2NywxOTYuMjEyIAkJCQkiLz4NCgkJCTwvZz4NCgkJPC9nPg0KCQk8ZyBvcGFjaXR5PSIwLjYiPg0KCQkJPGc+DQoJCQkJPHBvbHlnb24gZmlsbD0iIzAxMDEwMSIgcG9pbnRzPSIyNTUuOTY5LDEyNi43ODEgMTUwLjczMywxNzQuNjExIDI1NS45NjksMjM2LjgxOCAzNjEuMjA0LDE3NC42MTEgCQkJCSIvPg0KCQkJPC9nPg0KCQk8L2c+DQoJCTxnIG9wYWNpdHk9IjAuNDUiPg0KCQkJPGc+DQoJCQkJPHBvbHlnb24gZmlsbD0iIzAxMDEwMSIgcG9pbnRzPSIxNTAuNzM0LDE3NC42MTIgMjU1Ljk2OSwyMzYuODE4IDI1NS45NjksMTI2Ljc4MiAyNTUuOTY5LDAuMDAxIAkJCQkiLz4NCgkJCTwvZz4NCgkJPC9nPg0KCQk8ZyBvcGFjaXR5PSIwLjgiPg0KCQkJPGc+DQoJCQkJPHBvbHlnb24gZmlsbD0iIzAxMDEwMSIgcG9pbnRzPSIyNTUuOTY5LDAgMjU1Ljk2OSwxMjYuNzgxIDI1NS45NjksMjM2LjgxOCAzNjEuMjA0LDE3NC42MTEgCQkJCSIvPg0KCQkJPC9nPg0KCQk8L2c+DQoJPC9nPg0KPC9nPg0KPC9zdmc+DQo=' let totalLook = yo` diff --git a/src/universal-dapp.js b/src/universal-dapp.js index a36e1f87ff..f5ab1a44ec 100644 --- a/src/universal-dapp.js +++ b/src/universal-dapp.js @@ -7,16 +7,26 @@ var TxRunner = remixLib.execution.txRunner var txHelper = remixLib.execution.txHelper var EventManager = remixLib.EventManager var executionContext = remixLib.execution.executionContext -import { ApiFactory } from 'remix-plugin' +import { UdappApi } from 'remix-plugin' +import { EventEmitter } from 'events' -module.exports = class UniversalDApp extends ApiFactory { +const profile = { + name: 'udapp', + displayName: 'universal dapp', + description: 'service - run transaction and access account', + permission: true +} + +module.exports = class UniversalDApp extends UdappApi { constructor (registry) { - super() + super(profile) + this.events = new EventEmitter() this.event = new EventManager() this._deps = { config: registry.get('config').api } + this._txRunnerAPI = { config: this._deps.config, detectNetwork: (cb) => { @@ -32,13 +42,12 @@ module.exports = class UniversalDApp extends ApiFactory { executionContext.event.register('contextChanged', this.resetEnvironment.bind(this)) } - get profile () { - return { - name: 'udapp', - displayName: 'universal dapp', - methods: ['runTestTx', 'getAccounts', 'createVMAccount'], - description: 'service - run transaction and access account' - } + // TODO : event should be triggered by Udapp instead of TxListener + /** Listen on New Transaction. (Cannot be done inside constructor because txlistener doesn't exist yet) */ + startListening (txlistener) { + txlistener.event.register('newTransaction', (tx) => { + this.events.emit('newTransaction', tx) + }) } resetEnvironment () { @@ -242,7 +251,7 @@ module.exports = class UniversalDApp extends ApiFactory { * * @param {Object} tx - transaction. */ - runTestTx (tx) { + sendTransaction (tx) { return new Promise((resolve, reject) => { executionContext.detectNetwork((error, network) => { if (error) return reject(error) diff --git a/test-browser/plugin/index.html b/test-browser/plugin/index.html index 62cac2d321..a5a861d9cc 100644 --- a/test-browser/plugin/index.html +++ b/test-browser/plugin/index.html @@ -48,7 +48,7 @@ get content of
get current
set highlight
- get files from path
+ get files from path
add network
remove network

diff --git a/test-browser/plugin/plugin.js b/test-browser/plugin/plugin.js index cb7481a134..62bb971037 100644 --- a/test-browser/plugin/plugin.js +++ b/test-browser/plugin/plugin.js @@ -18,7 +18,7 @@ window.onload = function () { }) setInterval(function () { - extension.call('app', 'detectNetWork', [], function (error, result) { + extension.call('network', 'detectNetWork', [], function (error, result) { console.log(error, result) }) }, 5000) @@ -74,18 +74,18 @@ window.onload = function () { function (error, result) { console.log(error, result) }) }) - document.querySelector('input#getfilesfrompath').addEventListener('click', function () { - extension.call('editor', 'getFilesFromPath', [document.getElementById('filename').value], + document.querySelector('input#getFolder').addEventListener('click', function () { + extension.call('fileManager', 'getFolder', [document.getElementById('filename').value], function (error, result) { console.log(error, result) }) }) document.querySelector('input#addnetwork').addEventListener('click', function () { - extension.call('app', 'addProvider', [document.getElementById('filename').value, document.getElementById('valuetosend').value], + extension.call('network', 'addProvider', [document.getElementById('filename').value, document.getElementById('valuetosend').value], function (error, result) { console.log(error, result) }) }) document.querySelector('input#removenetwork').addEventListener('click', function () { - extension.call('app', 'removeProvider', [document.getElementById('filename').value], + extension.call('network', 'removeProvider', [document.getElementById('filename').value], function (error, result) { console.log(error, result) }) }) }