mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-11-26 12:29:06 +01:00
Merge branch 'master' into i#563forgotPassword
This commit is contained in:
commit
11c6c63d76
1
.gitignore
vendored
1
.gitignore
vendored
@ -13,3 +13,4 @@ builds/
|
||||
notes.txt
|
||||
app/.DS_Store
|
||||
development/bundle.js
|
||||
builds.zip
|
||||
|
14
CHANGELOG.md
14
CHANGELOG.md
@ -5,6 +5,20 @@
|
||||
- Add a back button and and functionality to unlock screen so
|
||||
that you can recover your vault from seed or create a new one
|
||||
if you forget your password.
|
||||
## 2.9.2 2016-08-24
|
||||
|
||||
- Fixed shortcut bug from preventing installation.
|
||||
|
||||
|
||||
## 2.9.1 2016-08-24
|
||||
|
||||
- Added static image as fallback for when WebGL isn't supported.
|
||||
- Transaction history now has a hard limit.
|
||||
- Added info link on account screen that visits Etherscan.
|
||||
- Fixed bug where a message signing request would be lost if the vault was locked.
|
||||
- Added shortcut to open MetaMask (Ctrl+Alt+M or Cmd+Opt/Alt+M)
|
||||
- Prevent API calls in tests.
|
||||
- Fixed bug where sign message confirmation would sometimes render blank.
|
||||
|
||||
## 2.9.0 2016-08-22
|
||||
|
||||
|
10
app/_locales/es/messages.json
Normal file
10
app/_locales/es/messages.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"appName": {
|
||||
"message": "MetaMask",
|
||||
"description": "The name of the application"
|
||||
},
|
||||
"appDescription": {
|
||||
"message": "Administración de identidad en Ethereum",
|
||||
"description": "The description of the application"
|
||||
}
|
||||
}
|
10
app/_locales/es_419/messages.json
Normal file
10
app/_locales/es_419/messages.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"appName": {
|
||||
"message": "MetaMask",
|
||||
"description": "The name of the application"
|
||||
},
|
||||
"appDescription": {
|
||||
"message": "Administración de identidad en Ethereum",
|
||||
"description": "The description of the application"
|
||||
}
|
||||
}
|
10
app/_locales/zh_CN/messages.json
Normal file
10
app/_locales/zh_CN/messages.json
Normal file
@ -0,0 +1,10 @@
|
||||
{
|
||||
"appName": {
|
||||
"message": "MetaMask",
|
||||
"description": "The name of the application"
|
||||
},
|
||||
"appDescription": {
|
||||
"message": "以太坊身份管理",
|
||||
"description": "The description of the application"
|
||||
}
|
||||
}
|
BIN
app/images/icon-512.png
Normal file
BIN
app/images/icon-512.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 41 KiB |
@ -1,9 +1,19 @@
|
||||
{
|
||||
"name": "MetaMask",
|
||||
"short_name": "Metamask",
|
||||
"version": "2.9.0",
|
||||
"version": "2.9.2",
|
||||
"manifest_version": 2,
|
||||
"description": "Ethereum Browser Extension",
|
||||
"commands": {
|
||||
"_execute_browser_action": {
|
||||
"suggested_key": {
|
||||
"windows": "Alt+Shift+M",
|
||||
"mac": "Alt+Shift+M",
|
||||
"chromeos": "Search+M",
|
||||
"linux": "Alt+Shift+M"
|
||||
}
|
||||
}
|
||||
},
|
||||
"icons": {
|
||||
"16": "images/icon-16.png",
|
||||
"128": "images/icon-128.png"
|
||||
|
@ -54,7 +54,7 @@ var __define
|
||||
function cleanContextForImports () {
|
||||
__define = global.define
|
||||
try {
|
||||
delete global.define
|
||||
global.define = undefined
|
||||
} catch (_) {
|
||||
console.warn('MetaMask - global.define could not be deleted.')
|
||||
}
|
||||
|
@ -5,6 +5,7 @@ const rp = require('request-promise')
|
||||
|
||||
const TESTNET_RPC = MetamaskConfig.network.testnet
|
||||
const MAINNET_RPC = MetamaskConfig.network.mainnet
|
||||
const txLimit = 40
|
||||
|
||||
/* The config-manager is a convenience object
|
||||
* wrapping a pojo-migrator.
|
||||
@ -15,6 +16,8 @@ const MAINNET_RPC = MetamaskConfig.network.mainnet
|
||||
*/
|
||||
module.exports = ConfigManager
|
||||
function ConfigManager (opts) {
|
||||
this.txLimit = txLimit
|
||||
|
||||
// ConfigManager is observable and will emit updates
|
||||
this._subs = []
|
||||
|
||||
@ -181,6 +184,9 @@ ConfigManager.prototype._saveTxList = function (txList) {
|
||||
|
||||
ConfigManager.prototype.addTx = function (tx) {
|
||||
var transactions = this.getTxList()
|
||||
while (transactions.length > this.txLimit - 1) {
|
||||
transactions.shift()
|
||||
}
|
||||
transactions.push(tx)
|
||||
this._saveTxList(transactions)
|
||||
}
|
||||
@ -294,9 +300,10 @@ ConfigManager.prototype.updateConversionRate = function () {
|
||||
this.setConversionPrice(0)
|
||||
this.setConversionDate('N/A')
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
ConfigManager.prototype.setConversionPrice = function(price) {
|
||||
ConfigManager.prototype.setConversionPrice = function (price) {
|
||||
var data = this.getData()
|
||||
data.conversionRate = Number(price)
|
||||
this.setData(data)
|
||||
@ -366,4 +373,3 @@ ConfigManager.prototype.createShapeShiftTx = function (depositAddress, depositTy
|
||||
}
|
||||
this.setData(data)
|
||||
}
|
||||
|
||||
|
@ -33,8 +33,16 @@ function MetamaskInpageProvider (connectionStream) {
|
||||
})
|
||||
asyncProvider.on('error', console.error.bind(console))
|
||||
self.asyncProvider = asyncProvider
|
||||
// overwrite own sendAsync method
|
||||
self.sendAsync = asyncProvider.sendAsync.bind(asyncProvider)
|
||||
// handle sendAsync requests via asyncProvider
|
||||
self.sendAsync = function(payload, cb){
|
||||
// rewrite request ids
|
||||
var request = jsonrpcMessageTransform(payload, (message) => {
|
||||
message.id = createRandomId()
|
||||
return message
|
||||
})
|
||||
// forward to asyncProvider
|
||||
asyncProvider.sendAsync(request, cb)
|
||||
}
|
||||
}
|
||||
|
||||
MetamaskInpageProvider.prototype.send = function (payload) {
|
||||
@ -92,3 +100,21 @@ function remoteStoreWithLocalStorageCache (storageKey) {
|
||||
|
||||
return store
|
||||
}
|
||||
|
||||
function createRandomId(){
|
||||
const extraDigits = 3
|
||||
// 13 time digits
|
||||
const datePart = new Date().getTime() * Math.pow(10, extraDigits)
|
||||
// 3 random digits
|
||||
const extraPart = Math.floor(Math.random() * Math.pow(10, extraDigits))
|
||||
// 16 digits
|
||||
return datePart + extraPart
|
||||
}
|
||||
|
||||
function jsonrpcMessageTransform(payload, transformFn){
|
||||
if (Array.isArray(payload)) {
|
||||
return payload.map(transformFn)
|
||||
} else {
|
||||
return transformFn(payload)
|
||||
}
|
||||
}
|
@ -208,6 +208,7 @@ module.exports = class MetamaskController {
|
||||
newUnsignedMessage (msgParams, cb) {
|
||||
var state = this.idStore.getState()
|
||||
if (!state.isUnlocked) {
|
||||
this.idStore.addUnconfirmedMessage(msgParams, cb)
|
||||
this.opts.unlockAccountMessage()
|
||||
} else {
|
||||
this.addUnconfirmedMessage(msgParams, cb)
|
||||
|
@ -4,3 +4,9 @@ machine:
|
||||
dependencies:
|
||||
pre:
|
||||
- "npm i -g testem"
|
||||
override:
|
||||
- sudo apt-get install libxss1 libappindicator1 libindicator7 lsb-base
|
||||
- curl -L -o google-chrome.deb https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
|
||||
- sudo dpkg -i google-chrome.deb
|
||||
- sudo sed -i 's|HERE/chrome\"|HERE/chrome\" --disable-setuid-sandbox|g' /opt/google/chrome/google-chrome
|
||||
- rm google-chrome.deb
|
||||
|
File diff suppressed because one or more lines are too long
406
development/states/pending-signature.json
Normal file
406
development/states/pending-signature.json
Normal file
@ -0,0 +1,406 @@
|
||||
{
|
||||
"metamask": {
|
||||
"isInitialized": true,
|
||||
"isUnlocked": true,
|
||||
"isEthConfirmed": true,
|
||||
"currentDomain": "example.com",
|
||||
"rpcTarget": "https://rawtestrpc.metamask.io/",
|
||||
"identities": {
|
||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": {
|
||||
"name": "Wallet 1",
|
||||
"address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"mayBeFauceting": false
|
||||
},
|
||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": {
|
||||
"name": "Wallet 2",
|
||||
"address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb",
|
||||
"mayBeFauceting": false
|
||||
},
|
||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d": {
|
||||
"name": "Wallet 3",
|
||||
"address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d",
|
||||
"mayBeFauceting": false
|
||||
}
|
||||
},
|
||||
"unconfTxs": {},
|
||||
"currentFiat": "USD",
|
||||
"conversionRate": 11.02269525,
|
||||
"conversionDate": 1472076963,
|
||||
"accounts": {
|
||||
"0xfdea65c8e26263f6d9a1b5de9555d2931a33b825": {
|
||||
"balance": "0x056ace16d84b1c7e78",
|
||||
"nonce": "0x17",
|
||||
"code": "0x0",
|
||||
"address": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825"
|
||||
},
|
||||
"0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb": {
|
||||
"balance": "0x00000000000000056bc75e2d63100000",
|
||||
"nonce": "0x0",
|
||||
"code": "0x0",
|
||||
"address": "0xc5b8dbac4c1d3f152cdeb400e2313f309c410acb"
|
||||
},
|
||||
"0x2f8d4a878cfa04a6e60d46362f5644deab66572d": {
|
||||
"balance": "0x00000000000000056bc75e2d63100000",
|
||||
"nonce": "0x0",
|
||||
"code": "0x0",
|
||||
"address": "0x2f8d4a878cfa04a6e60d46362f5644deab66572d"
|
||||
}
|
||||
},
|
||||
"transactions": [
|
||||
{
|
||||
"id": 1471975421223082,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471975421223082,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471975421223,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xd0fe393e2586ebded866c9f13b90494e902bc49047fbf25ba2ac96c805a2f5d3"
|
||||
},
|
||||
{
|
||||
"id": 1471975427199819,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471975427199819,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471975427199,
|
||||
"status": "rejected",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xb1f2f63f3e265f05d7c353ab38dd8b73fce8e7214489037311ee1f58a994dae3"
|
||||
},
|
||||
{
|
||||
"id": 1471975806981442,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471975806981442,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471975806981,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xeeb89e91aaeea14c4950016c45d60df8ee8874daa6f414de5cf267ea2c17bc6e"
|
||||
},
|
||||
{
|
||||
"id": 1471975810133789,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471975810133789,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471975810133,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xe54cab2e54b8495691b6d8315ca24a190cba546a9fcb056642479ce5770cec8b"
|
||||
},
|
||||
{
|
||||
"id": 1471976546865348,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb000000000000000000000000000000000000000000000000000000000000000a",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471976546865348,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471976546865,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0x54e10f77e17f28f4d12751749a2ca22f9b528592d1140ef53c6430a68e731542"
|
||||
},
|
||||
{
|
||||
"id": 1471976930101889,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471976930101889,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471976930101,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0x60b5af26fad18c5549949064b67c8f965c9f20cd3e890c69512ca3acad10ed8b"
|
||||
},
|
||||
{
|
||||
"id": 1471977268048169,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000002",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977268048169,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977268048,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0x1f96e29305ef11a9c993302c29e5419d87017e8222d4034daea0d86e155dc3aa"
|
||||
},
|
||||
{
|
||||
"id": 1471977310778630,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977310778630,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977310778,
|
||||
"status": "rejected",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef"
|
||||
},
|
||||
{
|
||||
"id": 1471977316241561,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977316241561,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977316240,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xdbd610c92d77a07c76b82e14e32674d382c45c4780dd2a550888b5cc40d54bcc"
|
||||
},
|
||||
{
|
||||
"id": 1471977344018510,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000004",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977344018510,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977344018,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0x709d871d9ded0108de9f7718a7490b19d45e5e7562b1ba6c5bf6cce56e767d48"
|
||||
},
|
||||
{
|
||||
"id": 1471977403830380,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000001",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977403830380,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977403830,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0x94f5088a127bba181b303d6427ae93cbfa9867997bea1326f30da311e36c6aca"
|
||||
},
|
||||
{
|
||||
"id": 1471977431563703,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000001",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977431563703,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977431563,
|
||||
"status": "rejected",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef"
|
||||
},
|
||||
{
|
||||
"id": 1471977436074587,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000001",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471977436074587,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471977436074,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0x5f514dfe3bd48f6f301c809a7a75f73f0fc93bc3a0e469368b84dce032aff9ec"
|
||||
},
|
||||
{
|
||||
"id": 1471991826717707,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000004",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471991826717707,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471991826717,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xab1e706f8981680a6c921f9f57f8ce573392bbb4f0fe85cf45e5cbf858fa5f3e"
|
||||
},
|
||||
{
|
||||
"id": 1471991851917592,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000004",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471991851917592,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471991851917,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xdea144f7a6f06969739f676d8702a9a11efc689e032f1981fe67afc9261dd4de"
|
||||
},
|
||||
{
|
||||
"id": 1471992032999543,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471992032999543,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471992032999,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef",
|
||||
"hash": "0xdf31b8cc0fbd2ab6727e0b63536bd4eab51a147aa29e04691e68fae28b866fb3"
|
||||
},
|
||||
{
|
||||
"id": 1471992043490878,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"to": "0x48ff0cbac0acefedf152281ee80e9a0a01d5da63",
|
||||
"data": "0x90b98a11000000000000000000000000c5b8dbac4c1d3f152cdeb400e2313f309c410acb0000000000000000000000000000000000000000000000000000000000000005",
|
||||
"origin": "localhost",
|
||||
"metamaskId": 1471992043490878,
|
||||
"metamaskNetworkId": "1471904489432"
|
||||
},
|
||||
"time": 1471992043490,
|
||||
"status": "rejected",
|
||||
"containsDelegateCall": true,
|
||||
"estimatedGas": "0x89ef"
|
||||
},
|
||||
{
|
||||
"id": 1472068030402279,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"value": "0x3782dace9d90000",
|
||||
"gas": "0x493e0",
|
||||
"to": "0x18a672e11d637fffadccc99b152f4895da069601",
|
||||
"data": "0x5b7d47a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
|
||||
"origin": "www.rouleth.com",
|
||||
"metamaskId": 1472068030402279,
|
||||
"metamaskNetworkId": "1"
|
||||
},
|
||||
"time": 1472068030402,
|
||||
"status": "rejected",
|
||||
"containsDelegateCall": false,
|
||||
"estimatedGas": "0x24704"
|
||||
},
|
||||
{
|
||||
"id": 1472068061833258,
|
||||
"txParams": {
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"value": "0x16345785d8a0000",
|
||||
"gas": "0x493e0",
|
||||
"to": "0x18a672e11d637fffadccc99b152f4895da069601",
|
||||
"data": "0x5b7d47a900000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
|
||||
"origin": "www.rouleth.com",
|
||||
"metamaskId": 1472068061833258,
|
||||
"metamaskNetworkId": "1"
|
||||
},
|
||||
"time": 1472068061833,
|
||||
"status": "confirmed",
|
||||
"containsDelegateCall": false,
|
||||
"estimatedGas": "0x24704",
|
||||
"hash": "0xb6e6ff57e7b5f6bd7f2e6dc44c39f4e858a227c9509586634ca547179345a13e"
|
||||
}
|
||||
],
|
||||
"selectedAddress": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"network": "1471904489432",
|
||||
"seedWords": null,
|
||||
"isConfirmed": true,
|
||||
"unconfMsgs": {
|
||||
"1472076978535283": {
|
||||
"id": 1472076978535283,
|
||||
"msgParams": {
|
||||
"origin": "localhost",
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"data": "hello"
|
||||
},
|
||||
"time": 1472076978535,
|
||||
"status": "unconfirmed"
|
||||
}
|
||||
},
|
||||
"messages": [
|
||||
{
|
||||
"id": 1472076978535283,
|
||||
"msgParams": {
|
||||
"origin": "localhost",
|
||||
"from": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825",
|
||||
"data": "hello"
|
||||
},
|
||||
"time": 1472076978535,
|
||||
"status": "unconfirmed"
|
||||
}
|
||||
],
|
||||
"shapeShiftTxList": [],
|
||||
"provider": {
|
||||
"type": "rpc",
|
||||
"rpcTarget": "http://localhost:8545"
|
||||
},
|
||||
"selectedAccount": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825"
|
||||
},
|
||||
"appState": {
|
||||
"menuOpen": false,
|
||||
"currentView": {
|
||||
"name": "confTx",
|
||||
"detailView": null,
|
||||
"context": "0xfdea65c8e26263f6d9a1b5de9555d2931a33b825"
|
||||
},
|
||||
"accountDetail": {
|
||||
"subview": "transactions"
|
||||
},
|
||||
"currentDomain": "ebjbdknjcgcbchkagneicjfpneaghdhb",
|
||||
"transForward": true,
|
||||
"isLoading": false,
|
||||
"warning": null
|
||||
},
|
||||
"identities": {}
|
||||
}
|
10
package.json
10
package.json
@ -5,6 +5,9 @@
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"start": "gulp dev",
|
||||
"lint": "gulp lint",
|
||||
"dev": "gulp dev",
|
||||
"dist": "gulp dist",
|
||||
"test": "npm run fastTest && npm run ci",
|
||||
"fastTest": "mocha --require test/helper.js --compilers js:babel-register --recursive \"test/unit/**/*.js\"",
|
||||
"watch": "mocha watch --compilers js:babel-register --recursive \"test/unit/**/*.js\"",
|
||||
@ -48,7 +51,7 @@
|
||||
"inject-css": "^0.1.1",
|
||||
"jazzicon": "^1.1.3",
|
||||
"menu-droppo": "^1.1.0",
|
||||
"metamask-logo": "^1.1.5",
|
||||
"metamask-logo": "^1.3.1",
|
||||
"mississippi": "^1.2.0",
|
||||
"multiplex": "^6.7.0",
|
||||
"once": "^1.3.3",
|
||||
@ -73,8 +76,8 @@
|
||||
"three.js": "^0.73.2",
|
||||
"through2": "^2.0.1",
|
||||
"vreme": "^3.0.2",
|
||||
"web3": "ethereum/web3.js#0.16.0",
|
||||
"web3-provider-engine": "^7.8.3",
|
||||
"web3": "^0.17.0-alpha",
|
||||
"web3-provider-engine": "^8.0.2",
|
||||
"web3-stream-provider": "^2.0.6",
|
||||
"xtend": "^4.0.1"
|
||||
},
|
||||
@ -105,6 +108,7 @@
|
||||
"mocha-eslint": "^2.1.1",
|
||||
"mocha-jsdom": "^1.1.0",
|
||||
"mocha-sinon": "^1.1.5",
|
||||
"nock": "^8.0.0",
|
||||
"qs": "^6.2.0",
|
||||
"qunit": "^0.9.1",
|
||||
"sinon": "^1.17.3",
|
||||
|
12
test/unit/account-link-test.js
Normal file
12
test/unit/account-link-test.js
Normal file
@ -0,0 +1,12 @@
|
||||
var assert = require('assert')
|
||||
var linkGen = require('../../ui/lib/account-link')
|
||||
|
||||
describe('account-link', function() {
|
||||
|
||||
it('adds testnet prefix to morden test network', function() {
|
||||
var result = linkGen('account', '2')
|
||||
assert.notEqual(result.indexOf('testnet'), -1, 'testnet injected')
|
||||
assert.notEqual(result.indexOf('account'), -1, 'account included')
|
||||
})
|
||||
|
||||
})
|
@ -1,9 +1,10 @@
|
||||
var assert = require('assert')
|
||||
const assert = require('assert')
|
||||
const extend = require('xtend')
|
||||
const STORAGE_KEY = 'metamask-persistance-key'
|
||||
var configManagerGen = require('../lib/mock-config-manager')
|
||||
var configManager
|
||||
const rp = require('request-promise')
|
||||
const nock = require('nock')
|
||||
|
||||
describe('config-manager', function() {
|
||||
|
||||
@ -47,6 +48,10 @@ describe('config-manager', function() {
|
||||
describe('#updateConversionRate', function() {
|
||||
it('should retrieve an update for ETH to USD and set it in memory', function(done) {
|
||||
this.timeout(15000)
|
||||
var usdMock = nock('https://www.cryptonator.com')
|
||||
.get('/api/ticker/eth-USD')
|
||||
.reply(200, '{"ticker":{"base":"ETH","target":"USD","price":"11.02456145","volume":"44948.91745289","change":"-0.01472534"},"timestamp":1472072136,"success":true,"error":""}')
|
||||
|
||||
assert.equal(configManager.getConversionRate(), false)
|
||||
var promise = new Promise(
|
||||
function (resolve, reject) {
|
||||
@ -69,6 +74,12 @@ describe('config-manager', function() {
|
||||
it('should work for JPY as well.', function() {
|
||||
this.timeout(15000)
|
||||
assert.equal(configManager.getConversionRate(), false)
|
||||
|
||||
var jpyMock = nock('https://www.cryptonator.com')
|
||||
.get('/api/ticker/eth-JPY')
|
||||
.reply(200, '{"ticker":{"base":"ETH","target":"JPY","price":"11.02456145","volume":"44948.91745289","change":"-0.01472534"},"timestamp":1472072136,"success":true,"error":""}')
|
||||
|
||||
|
||||
var promise = new Promise(
|
||||
function (resolve, reject) {
|
||||
configManager.setCurrentFiat('JPY')
|
||||
@ -233,6 +244,17 @@ describe('config-manager', function() {
|
||||
assert.equal(result.length, 1)
|
||||
assert.equal(result[0].id, 1)
|
||||
})
|
||||
|
||||
it('cuts off early txs beyond a limit', function() {
|
||||
const limit = configManager.txLimit
|
||||
for (let i = 0; i < limit + 1; i++) {
|
||||
let tx = { id: i }
|
||||
configManager.addTx(tx)
|
||||
}
|
||||
var result = configManager.getTxList()
|
||||
assert.equal(result.length, limit, `limit of ${limit} txs enforced`)
|
||||
assert.equal(result[0].id, 1, 'early txs truncted')
|
||||
})
|
||||
})
|
||||
|
||||
describe('#confirmTx', function() {
|
||||
|
@ -4,6 +4,7 @@ const Component = require('react').Component
|
||||
const h = require('react-hyperscript')
|
||||
const connect = require('react-redux').connect
|
||||
const CopyButton = require('./components/copyButton')
|
||||
const AccountInfoLink = require('./components/account-info-link')
|
||||
const actions = require('./actions')
|
||||
const ReactCSSTransitionGroup = require('react-addons-css-transition-group')
|
||||
const valuesFor = require('./util').valuesFor
|
||||
@ -44,6 +45,7 @@ AccountDetailScreen.prototype.render = function () {
|
||||
var selected = props.address || Object.keys(props.accounts)[0]
|
||||
var identity = props.identities[selected]
|
||||
var account = props.accounts[selected]
|
||||
const { network } = props
|
||||
|
||||
return (
|
||||
|
||||
@ -127,6 +129,9 @@ AccountDetailScreen.prototype.render = function () {
|
||||
bottom: '15px',
|
||||
},
|
||||
}, [
|
||||
|
||||
h(AccountInfoLink, { selected, network }),
|
||||
|
||||
h(CopyButton, {
|
||||
value: ethUtil.toChecksumAddress(selected),
|
||||
}),
|
||||
@ -136,16 +141,15 @@ AccountDetailScreen.prototype.render = function () {
|
||||
}, [
|
||||
h('div', {
|
||||
style: {
|
||||
margin: '5px',
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
},
|
||||
}, [
|
||||
h('img.cursor-pointer.color-orange', {
|
||||
src: 'images/key-32.png',
|
||||
onClick: () => this.requestAccountExport(selected),
|
||||
style: {
|
||||
margin: '0px 5px',
|
||||
width: '20px',
|
||||
height: '20px',
|
||||
height: '19px',
|
||||
},
|
||||
}),
|
||||
]),
|
||||
@ -244,6 +248,7 @@ AccountDetailScreen.prototype.transactionList = function () {
|
||||
network,
|
||||
unconfTxs,
|
||||
unconfMsgs,
|
||||
address,
|
||||
shapeShiftTxList,
|
||||
viewPendingTx: (txId) => {
|
||||
this.props.dispatch(actions.viewPendingTx(txId))
|
||||
|
42
ui/app/components/account-info-link.js
Normal file
42
ui/app/components/account-info-link.js
Normal file
@ -0,0 +1,42 @@
|
||||
const Component = require('react').Component
|
||||
const h = require('react-hyperscript')
|
||||
const inherits = require('util').inherits
|
||||
const Tooltip = require('./tooltip')
|
||||
const genAccountLink = require('../../lib/account-link')
|
||||
const extension = require('../../../app/scripts/lib/extension')
|
||||
|
||||
module.exports = AccountInfoLink
|
||||
|
||||
inherits(AccountInfoLink, Component)
|
||||
function AccountInfoLink () {
|
||||
Component.call(this)
|
||||
}
|
||||
|
||||
AccountInfoLink.prototype.render = function () {
|
||||
const { selected, network } = this.props
|
||||
const title = 'View account on etherscan'
|
||||
const url = genAccountLink(selected, network)
|
||||
|
||||
if (!url) {
|
||||
return null
|
||||
}
|
||||
|
||||
return h('.account-info-link', {
|
||||
style: {
|
||||
display: 'flex',
|
||||
alignItems: 'center',
|
||||
},
|
||||
}, [
|
||||
|
||||
h(Tooltip, {
|
||||
title,
|
||||
}, [
|
||||
h('i.fa.fa-info-circle.cursor-pointer.color-orange', {
|
||||
style: {
|
||||
margin: '5px',
|
||||
},
|
||||
onClick () { extension.tabs.create({ url }) },
|
||||
}),
|
||||
]),
|
||||
])
|
||||
}
|
@ -14,8 +14,9 @@ function Mascot () {
|
||||
pxNotRatio: true,
|
||||
width: 200,
|
||||
height: 200,
|
||||
staticImage: './images/icon-512.png',
|
||||
})
|
||||
if (!this.logo) return
|
||||
if (!this.logo.webGLSupport) return
|
||||
this.refollowMouse = debounce(this.logo.setFollowMouse.bind(this.logo, true), 1000)
|
||||
this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false)
|
||||
}
|
||||
@ -34,19 +35,24 @@ Mascot.prototype.render = function () {
|
||||
}
|
||||
|
||||
Mascot.prototype.componentDidMount = function () {
|
||||
if (!this.logo) return
|
||||
var targetDivId = 'metamask-mascot-container'
|
||||
var container = document.getElementById(targetDivId)
|
||||
container.appendChild(this.logo.canvas)
|
||||
if (!this.logo.webGLSupport) {
|
||||
var staticLogo = this.logo.staticLogo
|
||||
staticLogo.style.marginBottom = '40px'
|
||||
container.appendChild(staticLogo)
|
||||
} else {
|
||||
container.appendChild(this.logo.canvas)
|
||||
}
|
||||
}
|
||||
|
||||
Mascot.prototype.componentWillUnmount = function () {
|
||||
if (!this.logo) return
|
||||
if (!this.logo.webGLSupport) return
|
||||
this.logo.canvas.remove()
|
||||
}
|
||||
|
||||
Mascot.prototype.handleAnimationEvents = function () {
|
||||
if (!this.logo) return
|
||||
if (!this.logo.webGLSupport) return
|
||||
// only setup listeners once
|
||||
if (this.animations) return
|
||||
this.animations = this.props.animationEventEmitter
|
||||
@ -55,7 +61,7 @@ Mascot.prototype.handleAnimationEvents = function () {
|
||||
}
|
||||
|
||||
Mascot.prototype.lookAt = function (target) {
|
||||
if (!this.logo) return
|
||||
if (!this.logo.webGLSupport) return
|
||||
this.unfollowMouse()
|
||||
this.logo.lookAt(target)
|
||||
this.refollowMouse()
|
||||
|
@ -3,7 +3,6 @@ const h = require('react-hyperscript')
|
||||
const inherits = require('util').inherits
|
||||
|
||||
const AccountPanel = require('./account-panel')
|
||||
const readableDate = require('../util').readableDate
|
||||
|
||||
module.exports = PendingMsgDetails
|
||||
|
||||
@ -24,6 +23,9 @@ PendingMsgDetails.prototype.render = function () {
|
||||
return (
|
||||
h('div', {
|
||||
key: msgData.id,
|
||||
style: {
|
||||
margin: '10px 20px',
|
||||
},
|
||||
}, [
|
||||
|
||||
// account that will sign
|
||||
@ -36,11 +38,6 @@ PendingMsgDetails.prototype.render = function () {
|
||||
|
||||
// message data
|
||||
h('.tx-data.flex-column.flex-justify-center.flex-grow.select-none', [
|
||||
h('.flex-row.flex-space-between', [
|
||||
h('label.font-small', 'DATE'),
|
||||
h('span.font-small', readableDate(msgData.time)),
|
||||
]),
|
||||
|
||||
h('.flex-row.flex-space-between', [
|
||||
h('label.font-small', 'MESSAGE'),
|
||||
h('span.font-small', msgParams.data),
|
||||
|
@ -26,6 +26,7 @@ function ShiftListItem () {
|
||||
}
|
||||
|
||||
ShiftListItem.prototype.render = function () {
|
||||
|
||||
return (
|
||||
h('.transaction-list-item.flex-row', {
|
||||
style: {
|
||||
@ -113,7 +114,6 @@ ShiftListItem.prototype.renderUtilComponents = function () {
|
||||
default:
|
||||
return ''
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
ShiftListItem.prototype.renderInfo = function () {
|
||||
|
@ -19,7 +19,7 @@ function TransactionListItem () {
|
||||
}
|
||||
|
||||
TransactionListItem.prototype.render = function () {
|
||||
const { transaction, i, network } = this.props
|
||||
const { transaction, network } = this.props
|
||||
if (transaction.key === 'shapeshift') {
|
||||
if (network === '1') return h(ShiftListItem, transaction)
|
||||
}
|
||||
@ -44,7 +44,6 @@ TransactionListItem.prototype.render = function () {
|
||||
|
||||
return (
|
||||
h(`.transaction-list-item.flex-row.flex-space-between${isClickable ? '.pointer' : ''}`, {
|
||||
key: `tx-${transaction.id + i}`,
|
||||
onClick: (event) => {
|
||||
if (isPending) {
|
||||
this.props.showTx(transaction.id)
|
||||
|
@ -15,7 +15,7 @@ function TransactionList () {
|
||||
TransactionList.prototype.render = function () {
|
||||
const { txsToRender, network, unconfMsgs } = this.props
|
||||
var shapeShiftTxList
|
||||
if (network === '1'){
|
||||
if (network === '1') {
|
||||
shapeShiftTxList = this.props.shapeShiftTxList
|
||||
}
|
||||
const transactions = !shapeShiftTxList ? txsToRender.concat(unconfMsgs) : txsToRender.concat(unconfMsgs, shapeShiftTxList)
|
||||
@ -43,33 +43,46 @@ TransactionList.prototype.render = function () {
|
||||
paddingBottom: '4px',
|
||||
},
|
||||
}, [
|
||||
'Transactions',
|
||||
'History',
|
||||
]),
|
||||
|
||||
h('.tx-list', {
|
||||
style: {
|
||||
overflowY: 'auto',
|
||||
height: '305px',
|
||||
height: '300px',
|
||||
padding: '0 20px',
|
||||
textAlign: 'center',
|
||||
},
|
||||
}, (
|
||||
}, [
|
||||
|
||||
transactions.length
|
||||
? transactions.map((transaction, i) => {
|
||||
let key
|
||||
switch (transaction.key) {
|
||||
case 'shapeshift':
|
||||
const { depositAddress, time } = transaction
|
||||
key = `shift-tx-${depositAddress}-${time}-${i}`
|
||||
break
|
||||
default:
|
||||
key = `tx-${transaction.id}-${i}`
|
||||
}
|
||||
return h(TransactionListItem, {
|
||||
transaction, i, network,
|
||||
transaction, i, network, key,
|
||||
showTx: (txId) => {
|
||||
this.props.viewPendingTx(txId)
|
||||
},
|
||||
})
|
||||
})
|
||||
: [h('.flex-center', {
|
||||
: h('.flex-center', {
|
||||
style: {
|
||||
flexDirection: 'column',
|
||||
height: '100%',
|
||||
},
|
||||
}, 'No transaction history...')]
|
||||
)),
|
||||
}, [
|
||||
'No transaction history.',
|
||||
]),
|
||||
]),
|
||||
])
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -35,7 +35,7 @@ ConfirmTxScreen.prototype.render = function () {
|
||||
var unconfMsgs = state.unconfMsgs
|
||||
var unconfTxList = txHelper(unconfTxs, unconfMsgs)
|
||||
var index = state.index !== undefined ? state.index : 0
|
||||
var txData = unconfTxList[index] || {}
|
||||
var txData = unconfTxList[index] || unconfTxList[0] || {}
|
||||
|
||||
return (
|
||||
|
||||
|
@ -3,10 +3,11 @@ const Component = require('react').Component
|
||||
const h = require('react-hyperscript')
|
||||
const connect = require('react-redux').connect
|
||||
const actions = require('./actions')
|
||||
const Mascot = require('./components/mascot')
|
||||
const getCaretCoordinates = require('textarea-caret')
|
||||
const EventEmitter = require('events').EventEmitter
|
||||
|
||||
const Mascot = require('./components/mascot')
|
||||
|
||||
module.exports = connect(mapStateToProps)(UnlockScreen)
|
||||
|
||||
inherits(UnlockScreen, Component)
|
||||
|
18
ui/lib/account-link.js
Normal file
18
ui/lib/account-link.js
Normal file
@ -0,0 +1,18 @@
|
||||
module.exports = function(address, network) {
|
||||
const net = parseInt(network)
|
||||
let link
|
||||
|
||||
switch (net) {
|
||||
case 1: // main net
|
||||
link = `http://etherscan.io/address/${address}`
|
||||
break
|
||||
case 2: // morden test net
|
||||
link = `http://testnet.etherscan.io/address/${address}`
|
||||
break
|
||||
default:
|
||||
link = ''
|
||||
break
|
||||
}
|
||||
|
||||
return link
|
||||
}
|
Loading…
Reference in New Issue
Block a user