migrate to new ui + provider

feature/default_network_editable
kumavis 9 years ago
parent 709d93b5a1
commit 3eaf027e30
  1. 5
      Gruntfile.js
  2. 49
      TODO
  3. 2
      app/manifest.json
  4. 17
      app/popup.html
  5. 28
      app/scripts/background.js
  6. 149
      app/scripts/lib/metamask-provider.js
  7. 14
      app/scripts/popup.js
  8. 8
      package.json

@ -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',
]);

49
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

@ -1,6 +1,6 @@
{
"name": "__MSG_appName__",
"version": "0.0.49",
"version": "0.1.0",
"manifest_version": 2,
"description": "__MSG_appDescription__",
"icons": {

@ -2,23 +2,10 @@
<html>
<head>
<meta charset="utf-8">
<title>Typo Blaster</title>
<style>
body {
min-width: 357px;
overflow-x: hidden;
}
img {
margin: 5px;
border: 2px solid black;
vertical-align: middle;
width: 75px;
height: 75px;
}
</style>
<title>MetaMask Plugin</title>
</head>
<body>
<div id="app-content"></div>
<script src="./scripts/popup.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>

@ -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)

@ -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)
}
MetamaskProvider.prototype.send = function (payload) {
if (Array.isArray(payload)) {
return payload.map( this.handlePayload.bind(this) )
} else {
return this.handlePayload( payload )
}
}
MetamaskProvider.prototype.sendAsync = function (payload, cb) {
if (Array.isArray(payload)) {
async.map( payload, this.handlePayload.bind(this), cb )
} else {
this.handlePayload( payload, cb )
}
}
MetamaskProvider.prototype.handlePayload = function (payload, cb) {
var _this = this
var isSync = !cb
var resolvedSync = true
var result = undefined
// TODO - this should be injected from Vapor dapp starts
var exposedAccounts = ['0xa06ef3ed1ce41ade87f764de6ce8095c569d6d57']
var engine = new ProviderEngine()
switch (payload.method) {
// cache layer
engine.addProvider(new CacheSubprovider())
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))
// 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,
})
case 'eth_sendTransaction':
this.forwardPayload(payload)
return handleResult(null, wrapResponse(payload, ''))
// filters
engine.addProvider(new FilterSubprovider())
case 'eth_coinbase':
var currentAddress = exposedAccounts[0]
return handleResult(null, wrapResponse(payload, currentAddress))
// vm
engine.addProvider(new VmSubprovider())
case 'eth_accounts':
return handleResult(null, wrapResponse(payload, exposedAccounts))
// id mgmt
engine.addProvider(new LightWalletSubprovider())
case 'eth_gasPrice':
// TODO - this should be dynamically set somehow
var gasPrice = '0x01'
return handleResult(null, wrapResponse(payload, [gasPrice]))
// data source
engine.addProvider(new RpcSubprovider({
rpcUrl: 'https://testrpc.metamask.io/',
}))
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()
// 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('================================')
})
default:
return handleNormally()
}
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,
}
}
// start polling for blocks
engine.start()
function stripHexStringPrefix(hex) {
if (!hex) {
return hex
}
return engine
if (hex.slice(0, 2) === '0x') {
return hex.slice(2);
} else {
return hex;
}
}

@ -1 +1,13 @@
document.body.innerHTML = "real talk"
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,
})

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

Loading…
Cancel
Save