From d352a6c7d8a1c81b207d0362106cb5606e21da36 Mon Sep 17 00:00:00 2001 From: kumavis Date: Fri, 31 Jul 2015 23:05:04 -0700 Subject: [PATCH] metamask provider skeleton --- Gruntfile.js | 27 +++++-- app/.DS_Store | Bin 0 -> 6148 bytes app/images/.DS_Store | Bin 0 -> 6148 bytes app/images/icon-128.png | Bin 5356 -> 11952 bytes app/images/icon-16.png | Bin 758 -> 1720 bytes app/images/icon-19.png | Bin 1967 -> 1720 bytes app/images/icon-38.png | Bin 4265 -> 2769 bytes app/manifest.json | 4 +- app/scripts/contentscript.js | 7 +- app/scripts/metamask-provider.js | 122 +++++++++++++++++++++++++++++++ app/scripts/web3.js | 14 +++- package.json | 2 + 12 files changed, 162 insertions(+), 14 deletions(-) create mode 100644 app/.DS_Store create mode 100644 app/images/.DS_Store create mode 100644 app/scripts/metamask-provider.js diff --git a/Gruntfile.js b/Gruntfile.js index 5f9b271ee..d0c3b8f26 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -15,6 +15,8 @@ module.exports = function (grunt) { // Time how long tasks take. Can help when optimizing build times require('time-grunt')(grunt); + grunt.loadNpmTasks('grunt-browserify'); + // Configurable paths var config = { app: 'app', @@ -36,7 +38,8 @@ module.exports = function (grunt) { files: ['<%= config.app %>/scripts/{,*/}*.js'], options: { livereload: '<%= connect.options.livereload %>' - } + }, + tasks: ['useminPrepare', 'usemin', 'browserify'], }, gruntfile: { files: ['Gruntfile.js'] @@ -61,7 +64,7 @@ module.exports = function (grunt) { } }, - // Grunt server and debug server setting + // Grunt server and dev server setting connect: { options: { port: 9000, @@ -225,6 +228,14 @@ module.exports = function (grunt) { // dist: {} // }, + browserify: { + basic: { + files: { + '<%= config.dist %>/scripts/web3.js': ['<%= config.app %>/scripts/web3.js'], + }, + }, + }, + // Copies remaining files to places other tasks can use copy: { dist: { @@ -248,16 +259,19 @@ module.exports = function (grunt) { // Run some tasks in parallel to speed up build process concurrent: { chrome: [ + 'browserify', ], dist: [ 'imagemin', - 'svgmin' + 'svgmin', + 'browserify', ], test: [ + 'browserify', ] }, - // Auto buildnumber, exclude debug files. smart builds that event pages + // Auto buildnumber, exclude dev files. smart builds that event pages chromeManifest: { dist: { options: { @@ -294,11 +308,12 @@ module.exports = function (grunt) { } }); - grunt.registerTask('debug', function () { + grunt.registerTask('dev', function () { grunt.task.run([ 'concurrent:chrome', 'connect:chrome', - 'watch' + 'build', + 'watch', ]); }); diff --git a/app/.DS_Store b/app/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..9f45b9329097849c1792338b247ac3da5bc7498f GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8rtKx7g5o7t!9%S|J;qv(LZMO-m70)X7iv>;_(R zSX2A$2`_Fo%(-gEKZDS!6Zmxz30Jg4d~Rg%X_yQB{z`G9uxu4e#lf=GFO|SvTP+O+ z=7V7@F0F6w?6(IOmsi&}w|DoCPwFT*W{)zXU^qSxEi#A!Vt^PJM+WrmXXM8*Im(F` zAO?QL0NxK4D59+~Q7Eqt7-S0om;tvGu(6lG7)ztAF;NI_K)4D8RH0nA7+i&e-_q-B zjfp}P&bV$qxc)NN9SWCUhy5+NoN-$rjl=*k@R@dfTV#2V&G31 Fcmwd4U+@3` literal 0 HcmV?d00001 diff --git a/app/images/.DS_Store b/app/images/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5008ddfcf53c02e82d7eee2e57c38e5672ef89f6 GIT binary patch literal 6148 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 KDX@e|$o~S;?c{|3 literal 5356 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 KMNUMnLSTZKC-pl3 diff --git a/app/images/icon-16.png b/app/images/icon-16.png index 7df748fba2ddbbf6c7dc55d9fac800fe42d9c062..8c644d26afa30dbd2d600b825927c9fde98146a5 100644 GIT binary patch literal 1720 zcmai!2~ZPP7{?!8sMMlWywH$i7Xp%GH-rRMJV2C0AQD7Cty^-qk$U=j0#KQ6H6$Jj=N8I9A1_dGYfd+uki+?b z{s1J}1EA3Z@Bz9sT>vCt0Q77CfG7fBMqKe3kp}>yR>kcoeK2T?-<%kw1xqrp3#}>(UD^RuI1{%L&tk>RNlQ<0|oW|Xy!_1Q}L2J8n;U2 zV(8H>r=yCeeV6YzxWlnW z?_ku}>xC%n8UZ;Y&?#@NtIn4SF<4kmC>!2D*{onzf!IUmhhzyU>8tRbd*{UgqM}gr zy3(=h&e`tf3;hLHdot3VjJ9hT?d@%Sr_=)ltQIw`Wh?!On%=gZ-lk;^8k`4n(Ld7B zw>b`Pa~)r#p|3K~-i&$uMT-XV=>2()!{wqE`R?6%`pZoF>R2Z*jp)$LgByRAX#Z62 z_I#I+VA*3VmN6ag&^W+u)HxaTOk*bJQAJksxfAy;RX1O*z28uG`dG=fcsU!#J97vK zcV@bF7YZ6`%dgi}+^j!&v%cbbUHSdSGa5eWHx;rwn4IE6$`_HIrBL7HA-#I!ikz0W z!cNO4H7Ka>^N=_a-fp7J~y>CZ;qW+Rv7)C^xz3ZHaj9p&jZ)R=kL|t zmi9Um>DHm0DaaEgrF}cqm`v@~QeWz6uQHI<-D{tfNS_{3JwK@{OP4%oJTp8z+%(%H zf(Oo^3KW`8^8YsPN@N0g{E`O;=Gxd$mTT$`Tch_sJZ^4oeV?T6b+K-2wB~j_oJ+oa zd-{}7yD~A-9+OF8>E8OWy8L%V#7EPkn?rx*Sk)AdncDOw+EQog?KQQsT|1wZ$ynH? z(>4AfX_=3q` z%5vY5lEX)i9y?xkqTJ8_DyGrcMKaD}!olk5`>Oy{fJ*IK&2k z(A8_o%F52H{d!$}={M`A&j2$wh@qn_EIdMTAW}MOHi(j)h3%Jf^>qi%mu`%<1u^mq z7cN}9bm{VyhQ_P0ia0Q5Q&m+}yi%2Lt?BxWo14{O?v|~IN!zw3r)adgUsLsIfRvt* znPo?&P_uJ#^LFIZ_NB#Y1Db6)@VTI>rJAO!;VcI;QlK>u85FDZvF3o2SWdB7_iKoL8*vTsm1XUAdrit5`VE&79LIJGI>ll zhC3OiD3LdevDo_9-Wib-CeU>~{6{C={BE_3!;fh!#>z^0Ha>MX2iF-K5jmP7Ki6vp~ k94-z$;z$=4t_zpPX2J+2tPg+8)WQrvuvF+>;k7~c7rscE(*OVf delta 745 zcmVe@Pc}N>jQhaW{*w7~7!HRb3Qx5rkAy zyO^#9yU;NPW1Gpc;Vzzj-=EU(ri%~f`906`ec+&Zi$OjP(SKH3g4a5dd}TI12dH^t z%-@a&j#X{UU)I=P$|5^lme%P&8#o^%foC!X1viou+rxn|48xGtTDrm}v_mwJAN|kBbw}U_LZuNXZL~IvcB5!FiZFrT^`=al+fXLu2U5mB zIbegYV8IRiVSl?R;T~P$^Wpdx}5K;3jTzh z{22`#4l6mR%6)d!b>6bs4_o7+^#L1cwCNc4(cDWsPht=MK@0B&Iew2F{K1XfL!J-O z>NDvqyY4Pkygu**)YAY4+EIMwBUEz)l^jRH0hIG7Dt~y=z5AUOPqH(v(~fuo!0YS3 zkckV~()gMxO%Wm1!Nyk!n>|65rnz-XJm&|lju-Izv7PT-87uI&nK$^|SQo!NwU=MK z-N+w5c~uZCp3mk!>*F8OFLL2@{vAKCI+?4#eIl7%7_Q}`yEEk4W%Al2Z++Rzhx4O? zXz_fuc7Nw{-Z)v$<)%b+cdx4$N7sx{P^$-Jn~W_k99Y4w7W_WEuPO7 zE)9{FySemf>$D%}+LfTMvkp^lHeEW9q?rfUVZlxXHg8P{qQ&!>bfkN*qYi$c4gt0! zc(xf>dAT%XPZDweHq90dPE_Xv(c<|`I?|OJKVr~V6Ez%4qF;NH6uUA3p98qt@xg%{ zSI2q<(c($wJJOXKKhRSZW%h5g16^5t;oX*+#gSKXkG>f{xWXG}S04O1DtIlPWYUqY b+{nPc>4kxqzHWwH00000NkvXXu0mjfX{m3K diff --git a/app/images/icon-19.png b/app/images/icon-19.png index 20c54d41fbae20975636931057f48c6032654362..8c644d26afa30dbd2d600b825927c9fde98146a5 100644 GIT binary patch literal 1720 zcmai!2~ZPP7{?!8sMMlWywH$i7Xp%GH-rRMJV2C0AQD7Cty^-qk$U=j0#KQ6H6$Jj=N8I9A1_dGYfd+uki+?b z{s1J}1EA3Z@Bz9sT>vCt0Q77CfG7fBMqKe3kp}>yR>kcoeK2T?-<%kw1xqrp3#}>(UD^RuI1{%L&tk>RNlQ<0|oW|Xy!_1Q}L2J8n;U2 zV(8H>r=yCeeV6YzxWlnW z?_ku}>xC%n8UZ;Y&?#@NtIn4SF<4kmC>!2D*{onzf!IUmhhzyU>8tRbd*{UgqM}gr zy3(=h&e`tf3;hLHdot3VjJ9hT?d@%Sr_=)ltQIw`Wh?!On%=gZ-lk;^8k`4n(Ld7B zw>b`Pa~)r#p|3K~-i&$uMT-XV=>2()!{wqE`R?6%`pZoF>R2Z*jp)$LgByRAX#Z62 z_I#I+VA*3VmN6ag&^W+u)HxaTOk*bJQAJksxfAy;RX1O*z28uG`dG=fcsU!#J97vK zcV@bF7YZ6`%dgi}+^j!&v%cbbUHSdSGa5eWHx;rwn4IE6$`_HIrBL7HA-#I!ikz0W z!cNO4H7Ka>^N=_a-fp7J~y>CZ;qW+Rv7)C^xz3ZHaj9p&jZ)R=kL|t zmi9Um>DHm0DaaEgrF}cqm`v@~QeWz6uQHI<-D{tfNS_{3JwK@{OP4%oJTp8z+%(%H zf(Oo^3KW`8^8YsPN@N0g{E`O;=Gxd$mTT$`Tch_sJZ^4oeV?T6b+K-2wB~j_oJ+oa zd-{}7yD~A-9+OF8>E8OWy8L%V#7EPkn?rx*Sk)AdncDOw+EQog?KQQsT|1wZ$ynH? z(>4AfX_=3q` z%5vY5lEX)i9y?xkqTJ8_DyGrcMKaD}!olk5`>Oy{fJ*IK&2k z(A8_o%F52H{d!$}={M`A&j2$wh@qn_EIdMTAW}MOHi(j)h3%Jf^>qi%mu`%<1u^mq z7cN}9bm{VyhQ_P0ia0Q5Q&m+}yi%2Lt?BxWo14{O?v|~IN!zw3r)adgUsLsIfRvt* znPo?&P_uJ#^LFIZ_NB#Y1Db6)@VTI>rJAO!;VcI;QlK>u85FDZvF3o2SWdB7_iKoL8*vTsm1XUAdrit5`VE&79LIJGI>ll zhC3OiD3LdevDo_9-Wib-CeU>~{6{C={BE_3!;fh!#>z^0Ha>MX2iF-K5jmP7Ki6vp~ k94-z$;z$=4t_zpPX2J+2tPg+8)WQrvuvF+>;k7~c7rscE(*OVf literal 1967 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 VlKHTM=wp%&z=`BWyk{4b@^4KPyo>+< literal 4265 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 diff --git a/app/manifest.json b/app/manifest.json index f053ef594..bc7518691 100644 --- a/app/manifest.json +++ b/app/manifest.json @@ -1,6 +1,6 @@ { "name": "__MSG_appName__", - "version": "0.0.1", + "version": "0.0.17", "manifest_version": 2, "description": "__MSG_appDescription__", "icons": { @@ -38,4 +38,4 @@ "web_accessible_resources": [ "scripts/web3.js" ] -} +} \ No newline at end of file diff --git a/app/scripts/contentscript.js b/app/scripts/contentscript.js index 30cf50ef9..23df227b4 100644 --- a/app/scripts/contentscript.js +++ b/app/scripts/contentscript.js @@ -1,8 +1,5 @@ -console.log('\'Allo \'Allo! Content script') - var scriptTag = document.createElement('script') -// TODO: add "script.js" to web_accessible_resources in manifest.json scriptTag.src = chrome.extension.getURL('scripts/web3.js') -// scriptTag.onload = function() { this.parentNode.removeChild(this) } -;(document.head||document.documentElement).appendChild(scriptTag) \ No newline at end of file +scriptTag.onload = function() { debugger; this.parentNode.removeChild(this) } +;(document.head||document.documentElement).appendChild(scriptTag) diff --git a/app/scripts/metamask-provider.js b/app/scripts/metamask-provider.js new file mode 100644 index 000000000..c52de82b4 --- /dev/null +++ b/app/scripts/metamask-provider.js @@ -0,0 +1,122 @@ +var HttpProvider = require('web3/lib/web3/httpprovider.js') +var ethUtils = require('ethereumjs-util') +var async = require('async') + +module.exports = MetamaskProvider + + +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'] + + 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, '')) + + case 'eth_coinbase': + var currentAddress = exposedAccounts[0] + return handleResult(null, wrapResponse(payload, currentAddress)) + + case 'eth_accounts': + return handleResult(null, wrapResponse(payload, exposedAccounts)) + + case 'eth_gasPrice': + // TODO - this should be dynamically set somehow + var gasPrice = '0x01' + return handleResult(null, wrapResponse(payload, [gasPrice])) + + 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() + } + + 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/web3.js b/app/scripts/web3.js index 2bbf95ac3..f0fec7b06 100644 --- a/app/scripts/web3.js +++ b/app/scripts/web3.js @@ -1,2 +1,14 @@ +const web3 = require('web3') +const MetamaskProvider = require('./metamask-provider.js') + + +var provider = new MetamaskProvider(forwardPayload, 'https://rpc.metamask.io') +web3.setProvider(provider) + console.log('injecting web3....') -window.web3 = {} \ No newline at end of file +window.web3 = web3 + + +function forwardPayload(){ + debugger +} \ No newline at end of file diff --git a/package.json b/package.json index 4ffa7eab7..424dd8d3a 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,8 @@ "name": "metamask", "version": "0.0.0", "dependencies": { + "async": "^1.4.0", + "ethereumjs-util": "^1.3.5", "web3": "^0.9.2" }, "devDependencies": {