From 3eaf027e30a3a28d75fb8f93cd30387a777c5814 Mon Sep 17 00:00:00 2001 From: kumavis Date: Thu, 14 Jan 2016 18:26:54 -0800 Subject: [PATCH] migrate to new ui + provider --- Gruntfile.js | 5 +- TODO | 49 +++++++++ app/manifest.json | 2 +- app/popup.html | 17 +-- app/scripts/background.js | 28 +---- app/scripts/lib/metamask-provider.js | 149 ++++++++------------------- app/scripts/popup.js | 14 ++- package.json | 8 +- 8 files changed, 115 insertions(+), 157 deletions(-) create mode 100644 TODO diff --git a/Gruntfile.js b/Gruntfile.js index fbd73f33a..f6e69f967 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -148,7 +148,7 @@ module.exports = function (grunt) { dest: '<%= config.dist %>', src: [ '*.{ico,png,txt}', - 'images/{,*/}*.{webp,gif}', + 'images/{,*/}*.*', '{,*/}*.html', 'styles/{,*/}*.css', 'styles/fonts/{,*/}*.*', @@ -164,7 +164,6 @@ module.exports = function (grunt) { cwd: '<%= config.app %>', dest: '<%= config.dist %>', src: [ - 'images/{,*/}*.*', 'scripts/chromereload.js', ] }] @@ -278,7 +277,7 @@ module.exports = function (grunt) { 'clean', 'concurrent:dist', 'uglify', - 'copy:dist', + 'copy:basic', 'chromeManifest:dist', 'compress', ]); diff --git a/TODO b/TODO new file mode 100644 index 000000000..12e4ba234 --- /dev/null +++ b/TODO @@ -0,0 +1,49 @@ +TODO + +### plugin + + - [ ] ui + - [ ] designer + - [ ] design + - [ ] stack + - [x] frontend + - [ ] build tools + + - [ ] data source + - [x] geth node + - [ ] rpc proxy + - [x] geth node + - [ ] whitelist + - [ ] (perf) proxy-level caching + - [ ] (perf) block listener websocket + - [ ] provider engine + - [x] top-level cache + - [x] top-level current block + - [x] subproviders should act like normal providers + - [x] return in payload wrapper + - [ ] subprovider implementations + - [x] static + - [ ] filters + - [x] block + - [x] log + - [ ] pendingTx + - [x] rpc + - [x] vm + - [x] tx signing + + - [ ] dev ops + - [ ] test api load + - [ ] publish plugin to store + + - [ ] external info + - [ ] soft launch email + - [ ] consensys blog post? + +(2) dapp fallback lib + iframe wrapper api + data source + ? + +(3) browser-browser + +(4) mobile extension / app diff --git a/app/manifest.json b/app/manifest.json index 5d1df7b54..96be7c53a 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,6 +1,6 @@ { "name": "__MSG_appName__", - "version": "0.0.49", + "version": "0.1.0", "manifest_version": 2, "description": "__MSG_appDescription__", "icons": { diff --git a/app/popup.html b/app/popup.html index b72d499d1..6d85a9811 100644 --- a/app/popup.html +++ b/app/popup.html @@ -2,23 +2,10 @@ - Typo Blaster - + MetaMask Plugin +
\ No newline at end of file diff --git a/app/scripts/background.js b/app/scripts/background.js index b880b1b8c..7ddd258e2 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,34 +1,10 @@ -const ZeroClientProvider = require('web3-provider-engine') +const MetaMaskProvider = require('./lib/metamask-provider') // const PortStream = require('./lib/port-stream.js') const identitiesUrl = 'https://alpha.metamask.io/identities/' // var unsignedTxs = {} -var zeroClient = new ZeroClientProvider({ - rpcUrl: 'https://rawrpc.metamask.io/', -}) - -// // setup badge click handler -// chrome.browserAction.onClicked.addListener(function(activeTab) { -// // chrome.tabs.create({ url: identitiesUrl }) -// tabbernackle() -// }) - - -// function tabbernackle(){ -// chrome.tabs.create({ -// url: 'about:blank',//chrome.extension.getURL('dialog.html'), -// active: false -// }, function(tab) { -// // After the tab has been created, open a window to inject the tab -// chrome.windows.create({ -// tabId: tab.id, -// type: 'panel', -// focused: true -// // incognito, top, left, ... -// }); -// }); -// } +var zeroClient = MetaMaskProvider() // setup messaging chrome.runtime.onConnect.addListener(connectRemote) diff --git a/app/scripts/lib/metamask-provider.js b/app/scripts/lib/metamask-provider.js index c52de82b4..fea6d1f9f 100644 --- a/app/scripts/lib/metamask-provider.js +++ b/app/scripts/lib/metamask-provider.js @@ -1,122 +1,55 @@ -var HttpProvider = require('web3/lib/web3/httpprovider.js') -var ethUtils = require('ethereumjs-util') -var async = require('async') +const ProviderEngine = require('web3-provider-engine') +const CacheSubprovider = require('web3-provider-engine/subproviders/cache.js') +const StaticSubprovider = require('web3-provider-engine/subproviders/static.js') +const FilterSubprovider = require('web3-provider-engine/subproviders/filters.js') +const VmSubprovider = require('web3-provider-engine/subproviders/vm.js') +const LightWalletSubprovider = require('web3-provider-engine/subproviders/lightwallet.js') +const RpcSubprovider = require('web3-provider-engine/subproviders/rpc.js') -module.exports = MetamaskProvider +module.exports = metamaskProvider +function metamaskProvider(opts){ -function MetamaskProvider(forwardPayload, host) { - this.handlers = [] - this.forwardPayload = forwardPayload - this.http = new HttpProvider(host) -} + var engine = new ProviderEngine() -MetamaskProvider.prototype.send = function (payload) { - if (Array.isArray(payload)) { - return payload.map( this.handlePayload.bind(this) ) - } else { - return this.handlePayload( payload ) - } -} + // cache layer + engine.addProvider(new CacheSubprovider()) -MetamaskProvider.prototype.sendAsync = function (payload, cb) { - if (Array.isArray(payload)) { - async.map( payload, this.handlePayload.bind(this), cb ) - } else { - this.handlePayload( payload, cb ) - } -} + // static results + engine.addProvider(new StaticSubprovider({ + web3_clientVersion: 'MetaMask-ProviderEngine/v0.0.0/javascript', + net_listening: true, + eth_hashrate: '0x0', + eth_mining: false, + eth_syncing: true, + }) -MetamaskProvider.prototype.handlePayload = function (payload, cb) { - var _this = this - var isSync = !cb - var resolvedSync = true - var result = undefined + // filters + engine.addProvider(new FilterSubprovider()) - // TODO - this should be injected from Vapor dapp starts - var exposedAccounts = ['0xa06ef3ed1ce41ade87f764de6ce8095c569d6d57'] + // vm + engine.addProvider(new VmSubprovider()) - switch (payload.method) { - - case 'web3_sha3': - var inputHex = stripHexStringPrefix(payload.params[0]) - var hash = '0x'+ethUtils.sha3(new Buffer(inputHex, 'hex')).toString('hex') - return handleResult(null, wrapResponse(payload, hash)) - - case 'eth_sendTransaction': - this.forwardPayload(payload) - return handleResult(null, wrapResponse(payload, '')) + // id mgmt + engine.addProvider(new LightWalletSubprovider()) - case 'eth_coinbase': - var currentAddress = exposedAccounts[0] - return handleResult(null, wrapResponse(payload, currentAddress)) + // data source + engine.addProvider(new RpcSubprovider({ + rpcUrl: 'https://testrpc.metamask.io/', + })) - case 'eth_accounts': - return handleResult(null, wrapResponse(payload, exposedAccounts)) + // log new blocks + engine.on('block', function(block){ + // lazy hack - move caching and current block to engine + engine.currentBlock = block + console.log('================================') + console.log('BLOCK CHANGED:', '#'+block.number.toString('hex'), '0x'+block.hash.toString('hex')) + console.log('================================') + }) - case 'eth_gasPrice': - // TODO - this should be dynamically set somehow - var gasPrice = '0x01' - return handleResult(null, wrapResponse(payload, [gasPrice])) + // start polling for blocks + engine.start() - case 'eth_call': - var params = payload.params - // default 'from' to default account - var args = params[0] - if (!args.from) { - var currentAddress = exposedAccounts[0] - args.from = currentAddress - } - // default block to latest - params[1] = params[1] || 'latest' - // turn on debug trace - params[2] = global.DEBUG_RPC - return handleNormally() - - default: - return handleNormally() - } + return engine - resolvedSync = false - - function handleNormally(){ - if (isSync) { - return handleResult(null, _this.http.send(payload)) - } else { - _this.http.sendAsync(payload, handleResult) - } - } - - // helper for normalizing handling of sync+async responses - function handleResult(err, resp) { - if (isSync) { - return resp - } else { - if (resolvedSync) { - process.nextTick(cb.bind(null, err, resp)) - } else { - cb(err, resp) - } - } - } -} - -function wrapResponse(payload, result){ - return { - jsonrpc: payload.jsonrpc, - id: payload.id, - result: result, - } -} - -function stripHexStringPrefix(hex) { - if (!hex) { - return hex - } - - if (hex.slice(0, 2) === '0x') { - return hex.slice(2); - } else { - return hex; - } } \ No newline at end of file diff --git a/app/scripts/popup.js b/app/scripts/popup.js index 53dabeb33..03530ce66 100644 --- a/app/scripts/popup.js +++ b/app/scripts/popup.js @@ -1 +1,13 @@ -document.body.innerHTML = "real talk" \ No newline at end of file +const MetaMaskUi = require('metamask-ui') +const MetaMaskUiCss = require('metamask-ui/css') +const injectCss = require('inject-css') + + +var container = document.getElementById('app-content') + +var css = MetaMaskUiCss() +injectCss(css) + +var app = MetaMaskUi({ + container: container, +}) diff --git a/package.json b/package.json index 0df2cea7c..237cedf00 100644 --- a/package.json +++ b/package.json @@ -2,13 +2,15 @@ "name": "metamask-crx", "version": "0.0.0", "public": false, + "scripts": { + "start": "grunt dev", + "build": "grunt build" + }, "dependencies": { "async": "^1.4.0", - "blockapps-web3": "git://github.com/kumavis/blockapps-web3.git#9c1ee8e99efe277804fc47d8b11142abbc46180c", "ethereumjs-tx": "^0.6.7", "ethereumjs-util": "^1.3.5", - "object.entries": "^1.0.2", - "readable-stream": "^2.0.5", + "inject-css": "^0.1.1", "web3": "^0.15.1", "web3-provider-engine": "^1.2.0" },