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"
},