├── .circleci └── config.yml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── .pullapprove.yml ├── .travis.yml ├── 404.html ├── AUTHORS ├── LICENSE ├── README.md ├── Wallet.sol ├── app ├── .meteor │ ├── .finished-upgraders │ ├── .gitignore │ ├── .id │ ├── cordova-plugins │ ├── packages │ ├── platforms │ ├── release │ └── versions ├── client │ ├── index.html │ ├── index.js │ ├── lib │ │ ├── appStart.js │ │ ├── collections.js │ │ ├── ethereum │ │ │ ├── 1_web3Init.js │ │ │ ├── observeBlocks.js │ │ │ ├── observeCustomContracts.js │ │ │ ├── observeEvents.js │ │ │ ├── observePendingConfirmations.js │ │ │ ├── observeTokens.js │ │ │ ├── observeTransactions.js │ │ │ ├── observeWallets.js │ │ │ ├── tokenInterface.js │ │ │ ├── walletConnector.js │ │ │ └── walletInterface.js │ │ ├── helpers │ │ │ ├── helperFunctions.js │ │ │ └── templateHelpers.js │ │ └── thirdparty │ │ │ ├── ace.js │ │ │ ├── chance.min.js │ │ │ ├── geopattern.min.js │ │ │ ├── mode-java.js │ │ │ ├── mode-typescript.js │ │ │ ├── theme-solarized_dark.js │ │ │ ├── theme-solarized_light.js │ │ │ ├── theme-tomorrow.js │ │ │ └── theme-tomorrow_night.js │ ├── mist.js │ ├── routes.js │ ├── styles │ │ ├── elements.import.less │ │ └── main.less │ ├── templates │ │ ├── elements │ │ │ ├── account.html │ │ │ ├── account.js │ │ │ ├── accountLink.html │ │ │ ├── accountLink.js │ │ │ ├── balance.html │ │ │ ├── balance.js │ │ │ ├── compileContract.html │ │ │ ├── compileContract.js │ │ │ ├── createdContractAt.html │ │ │ ├── eventsTable.html │ │ │ ├── eventsTable.js │ │ │ ├── executeContract.html │ │ │ ├── executeContract.js │ │ │ ├── inputs │ │ │ │ ├── address.html │ │ │ │ ├── address.js │ │ │ │ ├── bool.html │ │ │ │ ├── bytes.html │ │ │ │ ├── int.html │ │ │ │ ├── json.html │ │ │ │ ├── string.html │ │ │ │ └── uint.html │ │ │ ├── newAccountButton.html │ │ │ ├── selectableUnit.html │ │ │ ├── selectableUnit.js │ │ │ ├── tokenBox.html │ │ │ ├── tokenBox.js │ │ │ ├── transactionTable.html │ │ │ ├── transactionTable.js │ │ │ ├── vulnerabilities.html │ │ │ └── vulnerabilities.js │ │ ├── layout │ │ │ ├── header.html │ │ │ ├── header.js │ │ │ ├── main.html │ │ │ └── notFound.html │ │ └── views │ │ │ ├── account.html │ │ │ ├── account.js │ │ │ ├── account_create.html │ │ │ ├── account_create.js │ │ │ ├── contracts.html │ │ │ ├── contracts.js │ │ │ ├── dashboard.html │ │ │ ├── dashboard.js │ │ │ ├── modals │ │ │ ├── addCustomContract.html │ │ │ ├── addCustomContract.js │ │ │ ├── addToken.html │ │ │ ├── addToken.js │ │ │ ├── backupContractAddress.html │ │ │ ├── eventInfo.html │ │ │ ├── eventInfo.js │ │ │ ├── interface.html │ │ │ ├── interface.js │ │ │ ├── loading.html │ │ │ ├── qrCode.html │ │ │ ├── qrCode.js │ │ │ ├── selectAccount.html │ │ │ ├── selectAccount.js │ │ │ ├── sendTransactionInfo.html │ │ │ ├── sendTransactionInfo.js │ │ │ ├── transactionInfo.html │ │ │ └── transactionInfo.js │ │ │ ├── send.html │ │ │ └── send.js │ └── window.js ├── i18n │ ├── app.ca.i18n.json │ ├── app.de.i18n.json │ ├── app.en.i18n.json │ ├── app.es.i18n.json │ ├── app.fa.i18n.json │ ├── app.fr.i18n.json │ ├── app.ja.i18n.json │ ├── app.ko.i18n.json │ ├── app.pt.i18n.json │ ├── app.ro.i18n.json │ ├── app.ru.i18n.json │ ├── app.sq.i18n.json │ ├── app.ua.i18n.json │ ├── app.zh-TW.i18n.json │ ├── app.zh.i18n.json │ ├── wallet.ca.i18n.json │ ├── wallet.de.i18n.json │ ├── wallet.en.i18n.json │ ├── wallet.es.i18n.json │ ├── wallet.fr.i18n.json │ ├── wallet.ja.i18n.json │ ├── wallet.ko.i18n.json │ ├── wallet.pt.i18n.json │ ├── wallet.ro.i18n.json │ ├── wallet.ru.i18n.json │ ├── wallet.sq.i18n.json │ ├── wallet.ua.i18n.json │ ├── wallet.zh-TW.i18n.json │ └── wallet.zh.i18n.json ├── package-lock.json ├── package.json ├── project-tap.i18n ├── public │ ├── ethereum-icon.svg │ ├── fontawesome │ │ ├── animated.less │ │ ├── bordered-pulled.less │ │ ├── core.less │ │ ├── fixed-width.less │ │ ├── font-awesome.less │ │ ├── icons.less │ │ ├── larger.less │ │ ├── list.less │ │ ├── mixins.less │ │ ├── path.less │ │ ├── rotated-flipped.less │ │ ├── stacked.less │ │ └── variables.less │ ├── i18n │ │ ├── de.json │ │ ├── es.json │ │ ├── fa.json │ │ └── ko.json │ ├── loading.css │ ├── sockjs │ │ └── info │ └── wallet-icon.png └── tests │ └── mocha │ ├── client │ └── sampleClientTest.js │ └── server │ └── sampleServerTest.js ├── build ├── 8f16113a04929a5e54ac1c6fbe1e0f272eae43bb.js ├── 8f16113a04929a5e54ac1c6fbe1e0f272eae43bb.stats.json ├── b5c0100a3fba3970004889019e9de74240e11f74.css ├── ethereum-icon.svg ├── fontawesome │ ├── animated.less │ ├── bordered-pulled.less │ ├── core.less │ ├── fixed-width.less │ ├── font-awesome.less │ ├── icons.less │ ├── larger.less │ ├── list.less │ ├── mixins.less │ ├── path.less │ ├── rotated-flipped.less │ ├── stacked.less │ └── variables.less ├── i18n │ ├── ca.json │ ├── de.json │ ├── es.json │ ├── fa.json │ ├── fr.json │ ├── ja.json │ ├── ko.json │ ├── pt.json │ ├── ro.json │ ├── ru.json │ ├── sq.json │ ├── tap-i18n.json │ ├── ua.json │ ├── zh-TW.json │ └── zh.json ├── index.html ├── loading.css ├── packages │ ├── ethereum_dapp-styles │ │ ├── fonts │ │ │ ├── Montserrat-Black.otf │ │ │ ├── Montserrat-Bold.otf │ │ │ ├── Montserrat-Hairline.otf │ │ │ ├── Montserrat-Light.otf │ │ │ ├── Montserrat-Regular.otf │ │ │ ├── SourceSansPro-Black.otf │ │ │ ├── SourceSansPro-Bold.otf │ │ │ ├── SourceSansPro-ExtraLight.otf │ │ │ ├── SourceSansPro-Light.otf │ │ │ ├── SourceSansPro-Regular.otf │ │ │ └── SourceSansPro-Semibold.otf │ │ └── icons │ │ │ ├── Simple-Line-Icons.eot │ │ │ ├── Simple-Line-Icons.svg │ │ │ ├── Simple-Line-Icons.ttf │ │ │ └── Simple-Line-Icons.woff │ └── ethereum_elements │ │ └── identicon-load.gif ├── sockjs │ └── info └── wallet-icon.png ├── images ├── body-bg.png ├── highlight-bg.jpg ├── hr.png ├── octocat-icon.png ├── tar-gz-icon.png └── zip-icon.png ├── index.html ├── javascripts └── main.js ├── params.json └── stylesheets ├── github-dark.css ├── print.css └── stylesheet.css /.circleci/config.yml: -------------------------------------------------------------------------------- 1 | # Javascript Node CircleCI 2.0 configuration file 2 | version: 2 3 | jobs: 4 | build: 5 | docker: 6 | # specify the version you desire here 7 | - image: circleci/node:7.10 8 | 9 | # Specify service dependencies here if necessary 10 | # CircleCI maintains a library of pre-built images 11 | # documented at https://circleci.com/docs/2.0/circleci-images/ 12 | # - image: circleci/mongo:3.4.4 13 | 14 | steps: 15 | - checkout 16 | - run: curl https://install.meteor.com/ | sh 17 | - run: cd app && npm install && npm run build 18 | 19 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | app/browser 2 | app/packages 3 | app/packages/* 4 | packages/ 5 | app/public/i18n/*.json 6 | app/.meteor/dev_bundle 7 | app/node_modules 8 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | build 2 | app/.meteor/local 3 | app/client/lib/thirdparty -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | singleQuote: true -------------------------------------------------------------------------------- /.pullapprove.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | groups: 3 | code-review: 4 | required: 2 5 | reset_on_push: 6 | enabled: true 7 | users: 8 | - alexvandesande 9 | - evertonfraga 10 | - frozeman 11 | - marcgarreau 12 | - PhilippLgh 13 | - ryanio 14 | 15 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: "7" 4 | 5 | sudo: required 6 | 7 | install: 8 | - cd app 9 | - npm install 10 | - curl https://install.meteor.com/ | sh 11 | 12 | script: 13 | - npm run build 14 | 15 | -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 |
3 |
55 | {{i18n 'wallet.contracts.error.compile'}}
56 |
57 |
{{this}}58 | 59 | 60 | {{else}} 61 | {{#with TemplateVar.get "compiledContracts"}} 62 |
92 | {{i18n 'wallet.send.texts.dataNotExecutable'}} 93 |
94 | {{/if}} 95 | {{/if}} 96 | {{/if}} 97 |11 | {{i18n "wallet.transactions.noneFound"}} 12 | | 13 ||||||
19 | 20 | | 21 |
{{formatTime timestamp "D"}}
37 |
48 | {{#each returnValues}}
49 | {{{toSentence name}}}: {{value}}
50 | {{/each}}
51 |
{{i18n "wallet.contracts.description" }}
16 | 17 | 18 |38 | {{{i18n "wallet.tokens.description"}}} 39 |
40 | 41 | 42 | 43 |18 | {{i18n "wallet.accounts.accountsDescription"}} 19 |
20 | 21 | 22 |37 | {{i18n "wallet.accounts.walletsDescription"}} 38 |
39 | {{else}} 40 |41 | {{{i18n "wallet.accounts.walletsDescriptionNotEnoughFunds"}}} 42 |
43 | {{/if}} 44 | 45 | 46 | 47 |{{i18n "wallet.app.texts.noAccounts.text"}}
72 |{{i18n "wallet.accounts.modal.backupWallet.description"}}
4 |{{toChecksumAddress address}}5 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/eventInfo.html: -------------------------------------------------------------------------------- 1 | 2 | {{#with event}} 3 |
8 | {{formatTime timestamp "LLLL"}}
9 |
10 | ({{formatTime timestamp "fromNow"}}{{#if $lt confirmations 10000}}, {{dapp_formatNumber confirmations "0,0"}} {{i18n "wallet.transactions.confirmations"}}{{/if}})
11 |
{{i18n "wallet.events.eventName"}} | 20 |21 | {{this.event}} 22 | | 23 |
{{i18n "wallet.events.returnValues"}} | 26 |
27 | {{#each returnValues}}
28 | {{name}}: {{value}} 29 | {{/each}} 30 | |
31 |
{{i18n "wallet.events.originContract"}} | 35 |36 | {{> elements_account_link address=address}} 37 | | 38 |
{{i18n "wallet.events.logIndex"}} | 41 |42 | {{logIndex}} 43 | | 44 |
{{i18n "wallet.events.transactionIndex"}} | 47 |48 | {{transactionIndex}} 49 | | 50 |
{{i18n "wallet.events.transactionHash"}} | 53 |54 | {{#if $eq ($.Session.get "network") "main"}} 55 | {{transactionHash.substr 0 40}}... 56 | {{else}} 57 | {{#if $eq ($.Session.get "network") "test"}} 58 | {{transactionHash.substr 0 40}}... 59 | {{else}} 60 | {{transactionHash.substr 0 40}}... 61 | {{/if}} 62 | {{/if}} 63 | | 64 |
{{i18n "wallet.events.block"}} | 67 |
68 | {{#if $eq ($.Session.get "network") "main"}}
69 |
70 | {{blockNumber}}
71 | 72 | {{blockHash.substr 0 40}}... 73 | 74 | {{else}} 75 | {{#if $eq ($.Session.get "network") "test"}} 76 | 77 | {{blockNumber}} 78 | 79 | {{blockHash.substr 0 40}}... 80 | 81 | {{else}} 82 | {{blockNumber}} 83 | 84 | {{blockHash.substr 0 40}}... 85 | {{/if}} 86 | {{/if}} 87 | |
88 |
{{i18n "wallet.modals.interface.description"}}
5 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/interface.js: -------------------------------------------------------------------------------- 1 | /** 2 | The template to display the ABI. 3 | 4 | @class [template] views_modals_interface 5 | @constructor 6 | */ 7 | 8 | Template['views_modals_interface'].helpers({ 9 | /** 10 | Return the ABI in string formart 11 | 12 | @method (jsonInterface) 13 | */ 14 | jsonInterface: function() { 15 | return JSON.stringify(this.jsonInterface, null, 2).replace(/\s+/g, ' '); 16 | } 17 | }); 18 | 19 | Template['views_modals_interface'].events({ 20 | 'focus textarea': function(e, template) { 21 | Tracker.afterFlush(function() { 22 | template.$('textarea').select(); 23 | }); 24 | } 25 | }); 26 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/loading.html: -------------------------------------------------------------------------------- 1 | 2 |{{i18n 'wallet.accounts.qrCodeLabel'}}
4 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/qrCode.js: -------------------------------------------------------------------------------- 1 | /** 2 | The template to display qrCode. 3 | 4 | @class [template] views_modals_qrCode 5 | @constructor 6 | */ 7 | 8 | Template['views_modals_qrCode'].onRendered(function(){ 9 | if(this.data && this.data.address) { 10 | var qrcodesvg = new Qrcodesvg("ethereum:" + this.data.address, 'qrcode', 150, {"ecclevel" : 1}); 11 | qrcodesvg.draw({"method": "classic", "fill-colors":["#555","#555","#666"]}, {"stroke-width":1}); 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/selectAccount.html: -------------------------------------------------------------------------------- 1 | 2 |14 | {{> elements_account_link address=from}} 15 |
16 | 17 |18 | {{#if to}} 19 | {{> elements_account_link address=to}} 20 | {{else}} 21 | {{i18n "wallet.send.createContract"}} 22 | {{/if}} 23 |
24 | 25 |
28 | + {{i18n "wallet.send.estimatedFee"}} {{estimatedFee}}
29 |
30 |
31 | {{i18n "wallet.transactions.gasPrice"}} {{dapp_formatBalance gasPrice "0,0.0[000000000000000000] unit" "ether"}}
32 |
33 | {{i18n "wallet.send.texts.estimatedGas"}} {{estimatedGas}}
34 |
35 |
36 |
37 | {{i18n "wallet.send.provideGas"}}
38 |
39 |
45 | {{i18n "wallet.send.data"}} 46 |
{{data}}47 | 48 | {{/if}} 49 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/sendTransactionInfo.js: -------------------------------------------------------------------------------- 1 | /** 2 | Template Controllers 3 | 4 | @module Templates 5 | */ 6 | 7 | /** 8 | The send transaction info template 9 | 10 | @class [template] views_modals_sendTransactionInfo 11 | @constructor 12 | */ 13 | 14 | // Set basic variables 15 | Template['views_modals_sendTransactionInfo'].helpers({ 16 | /** 17 | Calculates the fee used for this transaction in ether 18 | 19 | @method (estimatedFee) 20 | */ 21 | estimatedFee: function() { 22 | if (this.estimatedGas && this.gasPrice) 23 | return EthTools.formatBalance( 24 | new BigNumber(this.estimatedGas, 10).times( 25 | new BigNumber(this.gasPrice, 10) 26 | ), 27 | '0,0.0[0000000] unit', 28 | 'ether' 29 | ); 30 | } 31 | }); 32 | -------------------------------------------------------------------------------- /app/client/templates/views/modals/transactionInfo.html: -------------------------------------------------------------------------------- 1 | 2 | {{#with transaction}} 3 |
28 | {{formatTime timestamp "LLLL"}}
29 |
30 | ({{formatTime timestamp "fromNow"}}{{#if $lt confirmations 10000}}, {{dapp_formatNumber confirmations "0,0"}} {{i18n "wallet.transactions.confirmations"}}{{/if}})
31 |
{{i18n "wallet.transactions.amount"}} | 40 |
41 | {{#if tokenId}}
42 | {{tokenValue}}
43 | {{else}}
44 | {{formatTransactionBalance value exchangeRates}}
45 | {{#if $neq unit 'ether'}}
46 | 47 | 48 | ({{dapp_formatBalance value "0,0.00[000000] UNIT" "ether"}}) 49 | 50 | {{/if}} 51 | {{/if}} 52 | |
53 |
{{i18n "wallet.transactions.from"}} | 56 |57 | {{> elements_account_link address=from}} 58 | | 59 |
{{i18n "wallet.transactions.to"}} | 62 |63 | {{#if to}} 64 | {{> elements_account_link address=to}} 65 | {{else}} 66 | {{> elements_createdContractAt contractAddress=contractAddress deployedData=deployedData}} 67 | {{/if}} 68 | | 69 |
{{i18n "wallet.transactions.feePaid"}} | 72 |{{formatTransactionBalance fee exchangeRates}} | 73 |
{{i18n "wallet.transactions.gasUsed"}} | 76 |{{dapp_formatNumber gasUsed "0,0."}} | 77 |
{{i18n "wallet.transactions.gasPrice"}} | 80 |{{formatTransactionBalance gasPricePerMillion exchangeRates}} {{i18n "wallet.transactions.perMillionGas"}} | 81 |
{{i18n "wallet.transactions.block"}} | 85 |
86 | {{#if $eq ($.Session.get "network") "main"}}
87 |
88 | {{blockNumber}}
89 | 90 | {{blockHash.substr 0 40}}... 91 | 92 | {{else}} 93 | {{#if $eq ($.Session.get "network") "test"}} 94 | 95 | {{blockNumber}} 96 | 97 | {{blockHash.substr 0 40}}... 98 | 99 | {{else}} 100 | {{blockNumber}} 101 | 102 | {{blockHash.substr 0 40}}... 103 | {{/if}} 104 | {{/if}} 105 | |
106 |
{{i18n "wallet.transactions.deployedData"}} | 111 |
112 | {{deployedData}}113 | |
114 |
{{i18n "wallet.transactions.data"}} | 119 |
120 | {{data}}121 | |
122 |
This is an automatically generated page from the wallet app that will be hosted at wallet.ethereum.org
38 | 39 |To rebuild this execute these commands from the "app" folder:
40 | 41 |42 | git checkout gh-pages 43 | git merge develop 44 | meteor-build-client ../build --path "https://wallet.ethereum.org/" 45 |46 | 47 |
Commit the changes and push to the gh-pages branch
48 |