1
0
mirror of https://github.com/kremalicious/metamask-extension.git synced 2024-12-23 09:52:26 +01:00

Allow dragging seed phrase during Confirm Seed Phrase (#6557)

* Add basic drag and drop functionality

* Refactor seed phrase data structure

* Insert to list when drop

* Save before refactor

* Finish DND

* Fix linter

* update package-lock.json

* Address styling feedbacks

* Add box shadow on hover

* Finish adding unit tests

* Remove describe.only
This commit is contained in:
Chi Kei Chan 2019-05-07 08:03:27 -07:00 committed by Dan J Miller
parent a58e549c3f
commit 581128503c
8 changed files with 819 additions and 278 deletions

401
package-lock.json generated
View File

@ -1746,6 +1746,16 @@
} }
} }
}, },
"@types/invariant": {
"version": "2.2.29",
"resolved": "https://registry.npmjs.org/@types/invariant/-/invariant-2.2.29.tgz",
"integrity": "sha512-lRVw09gOvgviOfeUrKc/pmTiRZ7g7oDOU6OAutyuSHpm1/o2RaBQvRhgK8QEdu+FFuw/wnWb29A/iuxv9i8OpQ=="
},
"@types/lodash": {
"version": "4.14.123",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz",
"integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q=="
},
"@types/node": { "@types/node": {
"version": "8.5.5", "version": "8.5.5",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.5.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-8.5.5.tgz",
@ -1768,6 +1778,14 @@
"@types/react": "*" "@types/react": "*"
} }
}, },
"@types/redux": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/@types/redux/-/redux-3.6.0.tgz",
"integrity": "sha1-8evh5UEVGAcuT9/KXHbhbnTBOZo=",
"requires": {
"redux": "*"
}
},
"@yarnpkg/lockfile": { "@yarnpkg/lockfile": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz",
@ -8281,6 +8299,55 @@
} }
} }
}, },
"disposables": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/disposables/-/disposables-1.0.2.tgz",
"integrity": "sha1-NsamdEdfVaLWkTVnpgFETkh7S24="
},
"dnd-core": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-3.0.2.tgz",
"integrity": "sha1-6UdXdiBTHH7jelGM1d3hfQ798PM=",
"requires": {
"@types/invariant": "^2.2.29",
"@types/lodash": "^4.14.107",
"@types/node": "^8.10.11",
"@types/redux": "^3.6.0",
"asap": "^2.0.6",
"invariant": "^2.0.0",
"lodash": "^4.2.0",
"redux": "^4.0.0"
},
"dependencies": {
"@types/node": {
"version": "8.10.48",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.48.tgz",
"integrity": "sha512-c35YEBTkL4rzXY2ucpSKy+UYHjUBIIkuJbWYbsGIrKLEWU5dgJMmLkkIb3qeC3O3Tpb1ZQCwecscvJTDjDjkRw=="
},
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
},
"redux": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz",
"integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==",
"requires": {
"loose-envify": "^1.4.0",
"symbol-observable": "^1.2.0"
}
},
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
}
}
},
"dnode": { "dnode": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/dnode/-/dnode-1.2.2.tgz", "resolved": "https://registry.npmjs.org/dnode/-/dnode-1.2.2.tgz",
@ -9804,18 +9871,18 @@
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.10.0",
"ethereumjs-util": "^6.0.0" "ethereumjs-util": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"ethereumjs-util": { "ethereumjs-util": {
"version": "6.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
"integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
"requires": { "requires": {
"bn.js": "^4.11.0", "bn.js": "^4.11.0",
"create-hash": "^1.1.2", "create-hash": "^1.1.2",
"ethjs-util": "0.1.6", "ethjs-util": "^0.1.3",
"keccak": "^1.0.2", "keccak": "^1.0.2",
"rlp": "^2.0.0", "rlp": "^2.0.0",
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
@ -9823,23 +9890,15 @@
} }
} }
} }
},
"ethjs-util": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
"integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
"requires": {
"is-hex-prefixed": "1.0.0",
"strip-hex-prefix": "1.0.0"
}
} }
} }
}, },
"ethereumjs-abi": { "ethereumjs-abi": {
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8" "bn.js": "^4.10.0",
"ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-util": { "ethereumjs-util": {
@ -9873,7 +9932,7 @@
"dependencies": { "dependencies": {
"babelify": { "babelify": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz",
"integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=",
"requires": { "requires": {
"babel-core": "^6.0.14", "babel-core": "^6.0.14",
@ -9918,18 +9977,18 @@
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.10.0",
"ethereumjs-util": "^6.0.0" "ethereumjs-util": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"ethereumjs-util": { "ethereumjs-util": {
"version": "6.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
"integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
"requires": { "requires": {
"bn.js": "^4.11.0", "bn.js": "^4.11.0",
"create-hash": "^1.1.2", "create-hash": "^1.1.2",
"ethjs-util": "0.1.6", "ethjs-util": "^0.1.3",
"keccak": "^1.0.2", "keccak": "^1.0.2",
"rlp": "^2.0.0", "rlp": "^2.0.0",
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
@ -9937,15 +9996,6 @@
} }
} }
} }
},
"ethjs-util": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
"integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
"requires": {
"is-hex-prefixed": "1.0.0",
"strip-hex-prefix": "1.0.0"
}
} }
} }
}, },
@ -9953,7 +10003,8 @@
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8" "bn.js": "^4.10.0",
"ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-util": { "ethereumjs-util": {
@ -10122,19 +10173,19 @@
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.10.0",
"ethereumjs-util": "^6.0.0" "ethereumjs-util": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"ethereumjs-util": { "ethereumjs-util": {
"version": "6.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
"integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.11.0", "bn.js": "^4.11.0",
"create-hash": "^1.1.2", "create-hash": "^1.1.2",
"ethjs-util": "0.1.6", "ethjs-util": "^0.1.3",
"keccak": "^1.0.2", "keccak": "^1.0.2",
"rlp": "^2.0.0", "rlp": "^2.0.0",
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
@ -10142,31 +10193,21 @@
} }
} }
} }
},
"ethjs-util": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
"integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
"dev": true,
"requires": {
"is-hex-prefixed": "1.0.0",
"strip-hex-prefix": "1.0.0"
}
} }
} }
}, },
"ethereumjs-abi": { "ethereumjs-abi": {
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#2863c40e0982acfc0b7163f0285d4c56427c7799", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8" "bn.js": "^4.10.0",
"ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-util": { "ethereumjs-util": {
"version": "5.2.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
"integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
"dev": true,
"requires": { "requires": {
"bn.js": "^4.11.0", "bn.js": "^4.11.0",
"create-hash": "^1.1.2", "create-hash": "^1.1.2",
@ -10267,7 +10308,8 @@
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8" "bn.js": "^4.10.0",
"ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-util": { "ethereumjs-util": {
@ -10576,7 +10618,8 @@
"version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215", "version": "git+https://github.com/ethereumjs/ethereumjs-abi.git#d84a96796079c8595a0c78accd1e7709f2277215",
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"requires": { "requires": {
"bn.js": "^4.11.8" "bn.js": "^4.10.0",
"ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-util": { "ethereumjs-util": {
@ -13616,7 +13659,7 @@
"dependencies": { "dependencies": {
"jsesc": { "jsesc": {
"version": "1.3.0", "version": "1.3.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
"integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
"dev": true "dev": true
}, },
@ -13785,13 +13828,13 @@
}, },
"babel-plugin-syntax-async-functions": { "babel-plugin-syntax-async-functions": {
"version": "6.13.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz",
"integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=",
"dev": true "dev": true
}, },
"babel-plugin-syntax-exponentiation-operator": { "babel-plugin-syntax-exponentiation-operator": {
"version": "6.13.0", "version": "6.13.0",
"resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz",
"integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=",
"dev": true "dev": true
}, },
@ -14211,7 +14254,7 @@
}, },
"babelify": { "babelify": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz",
"integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14298,7 +14341,7 @@
}, },
"bl": { "bl": {
"version": "1.2.2", "version": "1.2.2",
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
"integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14376,7 +14419,7 @@
}, },
"browserify-aes": { "browserify-aes": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
"integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14415,7 +14458,7 @@
}, },
"browserify-rsa": { "browserify-rsa": {
"version": "4.0.1", "version": "4.0.1",
"resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
"integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14604,7 +14647,7 @@
}, },
"chalk": { "chalk": {
"version": "1.1.3", "version": "1.1.3",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14688,7 +14731,7 @@
}, },
"commander": { "commander": {
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", "resolved": "http://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
"integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14787,7 +14830,7 @@
}, },
"create-hash": { "create-hash": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
"integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14800,7 +14843,7 @@
}, },
"create-hmac": { "create-hmac": {
"version": "1.1.7", "version": "1.1.7",
"resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
"integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -14891,7 +14934,7 @@
"dependencies": { "dependencies": {
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true, "dev": true,
"optional": true "optional": true
@ -14968,14 +15011,14 @@
"dependencies": { "dependencies": {
"file-type": { "file-type": {
"version": "3.9.0", "version": "3.9.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", "resolved": "http://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz",
"integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=",
"dev": true, "dev": true,
"optional": true "optional": true
}, },
"get-stream": { "get-stream": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz",
"integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=",
"dev": true, "dev": true,
"optional": true, "optional": true,
@ -14986,7 +15029,7 @@
}, },
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true, "dev": true,
"optional": true "optional": true
@ -15082,7 +15125,7 @@
}, },
"diffie-hellman": { "diffie-hellman": {
"version": "5.0.3", "version": "5.0.3",
"resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
"integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
"dev": true, "dev": true,
"optional": true, "optional": true,
@ -15292,7 +15335,7 @@
"dependencies": { "dependencies": {
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true "dev": true
} }
@ -15313,7 +15356,7 @@
}, },
"eth-json-rpc-middleware": { "eth-json-rpc-middleware": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz", "resolved": "http://registry.npmjs.org/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz",
"integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==", "integrity": "sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -15340,7 +15383,7 @@
}, },
"ethereumjs-block": { "ethereumjs-block": {
"version": "1.7.1", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz",
"integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -15456,13 +15499,13 @@
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.10.0",
"ethereumjs-util": "^6.0.0" "ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-block": { "ethereumjs-block": {
"version": "1.7.1", "version": "1.7.1",
"resolved": "https://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz", "resolved": "http://registry.npmjs.org/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz",
"integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==", "integrity": "sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -15494,7 +15537,7 @@
}, },
"fs-extra": { "fs-extra": {
"version": "0.30.0", "version": "0.30.0",
"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", "resolved": "http://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz",
"integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -15507,7 +15550,7 @@
}, },
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true "dev": true
}, },
@ -15532,7 +15575,7 @@
}, },
"web3-provider-engine": { "web3-provider-engine": {
"version": "13.8.0", "version": "13.8.0",
"resolved": "https://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz", "resolved": "http://registry.npmjs.org/web3-provider-engine/-/web3-provider-engine-13.8.0.tgz",
"integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==", "integrity": "sha512-fZXhX5VWwWpoFfrfocslyg6P7cN3YWPG/ASaevNfeO80R+nzgoPUBXcWQekSGSsNDkeRTis4aMmpmofYf1TNtQ==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -15577,7 +15620,7 @@
"dependencies": { "dependencies": {
"ethereumjs-util": { "ethereumjs-util": {
"version": "4.5.0", "version": "4.5.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz", "resolved": "http://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-4.5.0.tgz",
"integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=", "integrity": "sha1-PpQosxfuvaPXJg2FT93alUsfG8Y=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -15986,7 +16029,7 @@
}, },
"finalhandler": { "finalhandler": {
"version": "1.1.1", "version": "1.1.1",
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", "resolved": "http://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
"integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -16610,7 +16653,7 @@
}, },
"get-stream": { "get-stream": {
"version": "3.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "resolved": "http://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
"integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
"dev": true "dev": true
}, },
@ -16809,7 +16852,7 @@
}, },
"http-errors": { "http-errors": {
"version": "1.6.3", "version": "1.6.3",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
"integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17051,7 +17094,7 @@
}, },
"jsesc": { "jsesc": {
"version": "0.5.0", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "resolved": "http://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
"integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
"dev": true "dev": true
}, },
@ -17113,13 +17156,13 @@
}, },
"json5": { "json5": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz",
"integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=",
"dev": true "dev": true
}, },
"jsonfile": { "jsonfile": {
"version": "2.4.0", "version": "2.4.0",
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
"integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17201,7 +17244,7 @@
}, },
"level-iterator-stream": { "level-iterator-stream": {
"version": "1.3.1", "version": "1.3.1",
"resolved": "https://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz", "resolved": "http://registry.npmjs.org/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz",
"integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=", "integrity": "sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17222,7 +17265,7 @@
}, },
"readable-stream": { "readable-stream": {
"version": "1.1.14", "version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17292,7 +17335,7 @@
"dependencies": { "dependencies": {
"readable-stream": { "readable-stream": {
"version": "1.0.34", "version": "1.0.34",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
"integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17359,7 +17402,7 @@
}, },
"load-json-file": { "load-json-file": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17372,7 +17415,7 @@
"dependencies": { "dependencies": {
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true "dev": true
} }
@ -17458,7 +17501,7 @@
}, },
"media-typer": { "media-typer": {
"version": "0.3.0", "version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "resolved": "http://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
"dev": true "dev": true
}, },
@ -17501,7 +17544,7 @@
}, },
"merkle-patricia-tree": { "merkle-patricia-tree": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz", "resolved": "http://registry.npmjs.org/merkle-patricia-tree/-/merkle-patricia-tree-2.3.1.tgz",
"integrity": "sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw==", "integrity": "sha512-Qp9Mpb3xazznXzzGQBqHbqCpT2AR9joUOHYYPiQjYCarrdCPCnLWXo4BFv77y4xN26KR224xoU1n/qYY7RYYgw==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17517,7 +17560,7 @@
"dependencies": { "dependencies": {
"async": { "async": {
"version": "1.5.2", "version": "1.5.2",
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", "resolved": "http://registry.npmjs.org/async/-/async-1.5.2.tgz",
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
"dev": true "dev": true
}, },
@ -17629,13 +17672,13 @@
}, },
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true "dev": true
}, },
"mkdirp": { "mkdirp": {
"version": "0.5.1", "version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17686,7 +17729,7 @@
}, },
"nan": { "nan": {
"version": "2.10.0", "version": "2.10.0",
"resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "resolved": "http://registry.npmjs.org/nan/-/nan-2.10.0.tgz",
"integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA=="
}, },
"nano-json-stream-parser": { "nano-json-stream-parser": {
@ -17703,7 +17746,7 @@
}, },
"node-fetch": { "node-fetch": {
"version": "2.1.2", "version": "2.1.2",
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz", "resolved": "http://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
"integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=", "integrity": "sha1-q4hOjn5X44qUR1POxwb3iNF2i7U=",
"dev": true "dev": true
}, },
@ -17796,13 +17839,13 @@
}, },
"os-homedir": { "os-homedir": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true "dev": true
}, },
"os-locale": { "os-locale": {
"version": "1.4.0", "version": "1.4.0",
"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -17811,7 +17854,7 @@
}, },
"os-tmpdir": { "os-tmpdir": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true "dev": true
}, },
@ -17886,7 +17929,7 @@
}, },
"path-is-absolute": { "path-is-absolute": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true "dev": true
}, },
@ -17915,7 +17958,7 @@
"dependencies": { "dependencies": {
"pify": { "pify": {
"version": "2.3.0", "version": "2.3.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "resolved": "http://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
"integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
"dev": true "dev": true
} }
@ -18117,7 +18160,7 @@
}, },
"query-string": { "query-string": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", "resolved": "http://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz",
"integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -18193,7 +18236,7 @@
}, },
"readable-stream": { "readable-stream": {
"version": "2.3.6", "version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -18259,7 +18302,7 @@
}, },
"regjsgen": { "regjsgen": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz",
"integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=",
"dev": true "dev": true
}, },
@ -18565,7 +18608,7 @@
}, },
"sha.js": { "sha.js": {
"version": "2.4.11", "version": "2.4.11",
"resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
"integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
"dev": true, "dev": true,
"requires": { "requires": {
@ -18730,7 +18773,7 @@
}, },
"strip-ansi": { "strip-ansi": {
"version": "3.0.1", "version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -18816,7 +18859,7 @@
"dependencies": { "dependencies": {
"minimist": { "minimist": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
"dev": true "dev": true
} }
@ -18824,7 +18867,7 @@
}, },
"tar": { "tar": {
"version": "2.2.1", "version": "2.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
"integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
"dev": true, "dev": true,
"optional": true, "optional": true,
@ -18865,7 +18908,7 @@
"dependencies": { "dependencies": {
"bluebird": { "bluebird": {
"version": "2.11.0", "version": "2.11.0",
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", "resolved": "http://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz",
"integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=",
"dev": true, "dev": true,
"optional": true "optional": true
@ -18892,7 +18935,7 @@
}, },
"through": { "through": {
"version": "2.3.8", "version": "2.3.8",
"resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
"integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
"dev": true "dev": true
}, },
@ -19324,7 +19367,7 @@
}, },
"uuid": { "uuid": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz", "resolved": "http://registry.npmjs.org/uuid/-/uuid-2.0.1.tgz",
"integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=", "integrity": "sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w=",
"dev": true, "dev": true,
"optional": true "optional": true
@ -19439,8 +19482,8 @@
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.10.0",
"ethereumjs-util": "^6.0.0" "ethereumjs-util": "^5.0.0"
} }
}, },
"ethereumjs-block": { "ethereumjs-block": {
@ -19557,7 +19600,7 @@
}, },
"utf8": { "utf8": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz", "resolved": "http://registry.npmjs.org/utf8/-/utf8-2.1.1.tgz",
"integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=", "integrity": "sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=",
"dev": true "dev": true
} }
@ -19588,7 +19631,7 @@
}, },
"whatwg-fetch": { "whatwg-fetch": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "resolved": "http://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz",
"integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==",
"dev": true "dev": true
}, },
@ -19606,7 +19649,7 @@
}, },
"wrap-ansi": { "wrap-ansi": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "resolved": "http://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
"integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -19696,7 +19739,7 @@
}, },
"yargs": { "yargs": {
"version": "4.8.1", "version": "4.8.1",
"resolved": "https://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz", "resolved": "http://registry.npmjs.org/yargs/-/yargs-4.8.1.tgz",
"integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=", "integrity": "sha1-wMQpJMpKqmsObaFznfshZDn53cA=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -19718,7 +19761,7 @@
}, },
"yargs-parser": { "yargs-parser": {
"version": "2.4.1", "version": "2.4.1",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz", "resolved": "http://registry.npmjs.org/yargs-parser/-/yargs-parser-2.4.1.tgz",
"integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=", "integrity": "sha1-hVaN488VD/SfpRgl8DqMiA3cxcQ=",
"dev": true, "dev": true,
"requires": { "requires": {
@ -24069,7 +24112,7 @@
"dependencies": { "dependencies": {
"babelify": { "babelify": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz",
"integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=",
"requires": { "requires": {
"babel-core": "^6.0.14", "babel-core": "^6.0.14",
@ -24108,7 +24151,7 @@
}, },
"babelify": { "babelify": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz",
"integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=",
"requires": { "requires": {
"babel-core": "^6.0.14", "babel-core": "^6.0.14",
@ -26534,7 +26577,7 @@
"dependencies": { "dependencies": {
"babelify": { "babelify": {
"version": "7.3.0", "version": "7.3.0",
"resolved": "https://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz", "resolved": "http://registry.npmjs.org/babelify/-/babelify-7.3.0.tgz",
"integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=", "integrity": "sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU=",
"requires": { "requires": {
"babel-core": "^6.0.14", "babel-core": "^6.0.14",
@ -29849,16 +29892,6 @@
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
}, },
"ping-pong-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ping-pong-stream/-/ping-pong-stream-1.0.0.tgz",
"integrity": "sha1-TF6wm6atsCGInawNyr+45XcGhUo=",
"requires": {
"end-of-stream": "^1.1.0",
"readable-stream": "^2.1.5",
"tape": "^4.6.2"
}
},
"pinkie": { "pinkie": {
"version": "2.0.4", "version": "2.0.4",
"resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
@ -32546,6 +32579,84 @@
} }
} }
}, },
"react-dnd": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-3.0.2.tgz",
"integrity": "sha1-sMI9jYKWn1t740y8T4T6H/xcfdw=",
"requires": {
"disposables": "^1.0.1",
"dnd-core": "^3.0.2",
"hoist-non-react-statics": "^2.5.0",
"invariant": "^2.1.0",
"lodash": "^4.2.0",
"prop-types": "^15.5.10",
"shallowequal": "^1.0.2"
},
"dependencies": {
"hoist-non-react-statics": {
"version": "2.5.5",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-2.5.5.tgz",
"integrity": "sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw=="
},
"shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
}
}
},
"react-dnd-html5-backend": {
"version": "7.4.4",
"resolved": "https://registry.npmjs.org/react-dnd-html5-backend/-/react-dnd-html5-backend-7.4.4.tgz",
"integrity": "sha512-X/lP92ateY0glHan8mU0JzjBuZL6VHv2Gc/H9OBBxaf/ZCN1oC16MLKdesqG4x1f/NWFTNtuG3W4B99r5gPVog==",
"requires": {
"dnd-core": "^7.4.4"
},
"dependencies": {
"dnd-core": {
"version": "7.4.4",
"resolved": "https://registry.npmjs.org/dnd-core/-/dnd-core-7.4.4.tgz",
"integrity": "sha512-xR8SINDCJG9AmKSjXUMJ1PEl8ih1+xSHH8x4DgBtzScXnEtpCnV1ibDZNV0uyps9VgkXTTbYYzJdF04y0v0e3Q==",
"requires": {
"asap": "^2.0.6",
"invariant": "^2.2.4",
"redux": "^4.0.1"
}
},
"invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
"requires": {
"loose-envify": "^1.0.0"
}
},
"redux": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/redux/-/redux-4.0.1.tgz",
"integrity": "sha512-R7bAtSkk7nY6O/OYMVR9RiBI+XghjF9rlbl5806HJbQph0LJVHZrU5oaO4q70eUKiqMRqm4y07KLTlMZ2BlVmg==",
"requires": {
"loose-envify": "^1.4.0",
"symbol-observable": "^1.2.0"
},
"dependencies": {
"loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
}
}
},
"symbol-observable": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz",
"integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ=="
}
}
},
"react-docgen": { "react-docgen": {
"version": "3.0.0-beta9", "version": "3.0.0-beta9",
"resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-3.0.0-beta9.tgz", "resolved": "https://registry.npmjs.org/react-docgen/-/react-docgen-3.0.0-beta9.tgz",
@ -38924,34 +39035,24 @@
"from": "git+https://github.com/ethereumjs/ethereumjs-abi.git", "from": "git+https://github.com/ethereumjs/ethereumjs-abi.git",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.11.8", "bn.js": "^4.10.0",
"ethereumjs-util": "^6.0.0" "ethereumjs-util": "^5.0.0"
}, },
"dependencies": { "dependencies": {
"ethereumjs-util": { "ethereumjs-util": {
"version": "6.1.0", "version": "5.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-6.1.0.tgz", "resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
"integrity": "sha512-URESKMFbDeJxnAxPppnk2fN6Y3BIatn9fwn76Lm8bQlt+s52TpG8dN9M66MLPuRAiAOIqL3dfwqWJf0sd0fL0Q==", "integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
"dev": true, "dev": true,
"requires": { "requires": {
"bn.js": "^4.11.0", "bn.js": "^4.11.0",
"create-hash": "^1.1.2", "create-hash": "^1.1.2",
"ethjs-util": "0.1.6", "ethjs-util": "^0.1.3",
"keccak": "^1.0.2", "keccak": "^1.0.2",
"rlp": "^2.0.0", "rlp": "^2.0.0",
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"secp256k1": "^3.0.1" "secp256k1": "^3.0.1"
} }
},
"ethjs-util": {
"version": "0.1.6",
"resolved": "https://registry.npmjs.org/ethjs-util/-/ethjs-util-0.1.6.tgz",
"integrity": "sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w==",
"dev": true,
"requires": {
"is-hex-prefixed": "1.0.0",
"strip-hex-prefix": "1.0.0"
}
} }
} }
}, },

View File

@ -151,6 +151,8 @@
"ramda": "^0.24.1", "ramda": "^0.24.1",
"react": "^15.6.2", "react": "^15.6.2",
"react-addons-css-transition-group": "^15.6.0", "react-addons-css-transition-group": "^15.6.0",
"react-dnd": "^3.0.2",
"react-dnd-html5-backend": "^7.4.4",
"react-dom": "^15.6.2", "react-dom": "^15.6.2",
"react-hyperscript": "^3.0.0", "react-hyperscript": "^3.0.0",
"react-inspector": "^2.3.0", "react-inspector": "^2.3.0",

View File

@ -8,7 +8,9 @@ import {
INITIALIZE_SEED_PHRASE_ROUTE, INITIALIZE_SEED_PHRASE_ROUTE,
} from '../../../../helpers/constants/routes' } from '../../../../helpers/constants/routes'
import { exportAsFile } from '../../../../helpers/utils/util' import { exportAsFile } from '../../../../helpers/utils/util'
import { selectSeedWord, deselectSeedWord } from './confirm-seed-phrase.state' import DraggableSeed from './draggable-seed.component'
const EMPTY_SEEDS = Array(12).fill(null)
export default class ConfirmSeedPhrase extends PureComponent { export default class ConfirmSeedPhrase extends PureComponent {
static contextTypes = { static contextTypes = {
@ -27,10 +29,32 @@ export default class ConfirmSeedPhrase extends PureComponent {
} }
state = { state = {
selectedSeedWords: [], selectedSeedIndices: [],
shuffledSeedWords: [], shuffledSeedWords: [],
// Hash of shuffledSeedWords index {Number} to selectedSeedWords index {Number} pendingSeedIndices: [],
selectedSeedWordsHash: {}, draggingSeedIndex: -1,
hoveringIndex: -1,
isDragging: false,
}
shouldComponentUpdate (nextProps, nextState, nextContext) {
const { seedPhrase } = this.props
const {
selectedSeedIndices,
shuffledSeedWords,
pendingSeedIndices,
draggingSeedIndex,
hoveringIndex,
isDragging,
} = this.state
return seedPhrase !== nextProps.seedPhrase ||
draggingSeedIndex !== nextState.draggingSeedIndex ||
isDragging !== nextState.isDragging ||
hoveringIndex !== nextState.hoveringIndex ||
selectedSeedIndices.join(' ') !== nextState.selectedSeedIndices.join(' ') ||
shuffledSeedWords.join(' ') !== nextState.shuffledSeedWords.join(' ') ||
pendingSeedIndices.join(' ') !== nextState.pendingSeedIndices.join(' ')
} }
componentDidMount () { componentDidMount () {
@ -39,6 +63,26 @@ export default class ConfirmSeedPhrase extends PureComponent {
this.setState({ shuffledSeedWords }) this.setState({ shuffledSeedWords })
} }
setDraggingSeedIndex = draggingSeedIndex => this.setState({ draggingSeedIndex })
setHoveringIndex = hoveringIndex => this.setState({ hoveringIndex })
onDrop = targetIndex => {
const {
selectedSeedIndices,
draggingSeedIndex,
} = this.state
const indices = insert(selectedSeedIndices, draggingSeedIndex, targetIndex, true)
this.setState({
selectedSeedIndices: indices,
pendingSeedIndices: indices,
draggingSeedIndex: -1,
hoveringIndex: -1,
})
}
handleExport = () => { handleExport = () => {
exportAsFile('MetaMask Secret Backup Phrase', this.props.seedPhrase, 'text/plain') exportAsFile('MetaMask Secret Backup Phrase', this.props.seedPhrase, 'text/plain')
} }
@ -65,23 +109,34 @@ export default class ConfirmSeedPhrase extends PureComponent {
} }
handleSelectSeedWord = (word, shuffledIndex) => { handleSelectSeedWord = (word, shuffledIndex) => {
this.setState(selectSeedWord(word, shuffledIndex)) this.setState({
selectedSeedIndices: [...this.state.selectedSeedIndices, shuffledIndex],
pendingSeedIndices: [...this.state.pendingSeedIndices, shuffledIndex],
})
} }
handleDeselectSeedWord = shuffledIndex => { handleDeselectSeedWord = shuffledIndex => {
this.setState(deselectSeedWord(shuffledIndex)) this.setState({
selectedSeedIndices: this.state.selectedSeedIndices.filter(i => shuffledIndex !== i),
pendingSeedIndices: this.state.pendingSeedIndices.filter(i => shuffledIndex !== i),
})
} }
isValid () { isValid () {
const { seedPhrase } = this.props const { seedPhrase } = this.props
const { selectedSeedWords } = this.state const { selectedSeedIndices, shuffledSeedWords } = this.state
const selectedSeedWords = selectedSeedIndices.map(i => shuffledSeedWords[i])
return seedPhrase === selectedSeedWords.join(' ') return seedPhrase === selectedSeedWords.join(' ')
} }
render () { render () {
const { t } = this.context const { t } = this.context
const { history } = this.props const { history } = this.props
const { selectedSeedWords, shuffledSeedWords, selectedSeedWordsHash } = this.state const {
selectedSeedIndices,
shuffledSeedWords,
draggingSeedIndex,
} = this.state
return ( return (
<div className="confirm-seed-phrase"> <div className="confirm-seed-phrase">
@ -102,31 +157,30 @@ export default class ConfirmSeedPhrase extends PureComponent {
<div className="first-time-flow__text-block"> <div className="first-time-flow__text-block">
{ t('selectEachPhrase') } { t('selectEachPhrase') }
</div> </div>
<div className="confirm-seed-phrase__selected-seed-words"> <div
{ className={classnames('confirm-seed-phrase__selected-seed-words', {
selectedSeedWords.map((word, index) => ( 'confirm-seed-phrase__selected-seed-words--dragging': draggingSeedIndex > -1,
<div })}
key={index} >
className="confirm-seed-phrase__seed-word" { this.renderPendingSeeds() }
> { this.renderSelectedSeeds() }
{ word }
</div>
))
}
</div> </div>
<div className="confirm-seed-phrase__shuffled-seed-words"> <div className="confirm-seed-phrase__shuffled-seed-words">
{ {
shuffledSeedWords.map((word, index) => { shuffledSeedWords.map((word, index) => {
const isSelected = index in selectedSeedWordsHash const isSelected = selectedSeedIndices.includes(index)
return ( return (
<div <DraggableSeed
key={index} key={index}
className={classnames( seedIndex={index}
'confirm-seed-phrase__seed-word', index={index}
'confirm-seed-phrase__seed-word--shuffled', draggingSeedIndex={this.state.draggingSeedIndex}
{ 'confirm-seed-phrase__seed-word--selected': isSelected } setDraggingSeedIndex={this.setDraggingSeedIndex}
)} setHoveringIndex={this.setHoveringIndex}
onDrop={this.onDrop}
className="confirm-seed-phrase__seed-word--shuffled"
selected={isSelected}
onClick={() => { onClick={() => {
if (!isSelected) { if (!isSelected) {
this.handleSelectSeedWord(word, index) this.handleSelectSeedWord(word, index)
@ -134,9 +188,8 @@ export default class ConfirmSeedPhrase extends PureComponent {
this.handleDeselectSeedWord(index) this.handleDeselectSeedWord(index)
} }
}} }}
> word={word}
{ word } />
</div>
) )
}) })
} }
@ -152,4 +205,80 @@ export default class ConfirmSeedPhrase extends PureComponent {
</div> </div>
) )
} }
renderSelectedSeeds () {
const { shuffledSeedWords, selectedSeedIndices, draggingSeedIndex } = this.state
return EMPTY_SEEDS.map((_, index) => {
const seedIndex = selectedSeedIndices[index]
const word = shuffledSeedWords[seedIndex]
return (
<DraggableSeed
key={`selected-${seedIndex}-${index}`}
className="confirm-seed-phrase__selected-seed-words__selected-seed"
index={index}
seedIndex={seedIndex}
word={word}
draggingSeedIndex={draggingSeedIndex}
setDraggingSeedIndex={this.setDraggingSeedIndex}
setHoveringIndex={this.setHoveringIndex}
onDrop={this.onDrop}
draggable
/>
)
})
}
renderPendingSeeds () {
const {
pendingSeedIndices,
shuffledSeedWords,
draggingSeedIndex,
hoveringIndex,
} = this.state
const indices = insert(pendingSeedIndices, draggingSeedIndex, hoveringIndex)
return EMPTY_SEEDS.map((_, index) => {
const seedIndex = indices[index]
const word = shuffledSeedWords[seedIndex]
return (
<DraggableSeed
key={`pending-${seedIndex}-${index}`}
index={index}
className={classnames('confirm-seed-phrase__selected-seed-words__pending-seed', {
'confirm-seed-phrase__seed-word--hidden': draggingSeedIndex === seedIndex && index !== hoveringIndex,
})}
seedIndex={seedIndex}
word={word}
draggingSeedIndex={draggingSeedIndex}
setDraggingSeedIndex={this.setDraggingSeedIndex}
setHoveringIndex={this.setHoveringIndex}
onDrop={this.onDrop}
droppable={!!word}
/>
)
})
}
}
function insert (list, value, target, removeOld) {
let nextList = [...list]
if (typeof list[target] === 'number') {
nextList = [...list.slice(0, target), value, ...list.slice(target)]
}
if (removeOld) {
nextList = nextList.filter((seed, i) => {
return seed !== value || i === target
})
}
if (nextList.length > 12) {
nextList.pop()
}
return nextList
} }

View File

@ -1,41 +0,0 @@
export function selectSeedWord (word, shuffledIndex) {
return function update (state) {
const { selectedSeedWords, selectedSeedWordsHash } = state
const nextSelectedIndex = selectedSeedWords.length
return {
selectedSeedWords: [ ...selectedSeedWords, word ],
selectedSeedWordsHash: { ...selectedSeedWordsHash, [shuffledIndex]: nextSelectedIndex },
}
}
}
export function deselectSeedWord (shuffledIndex) {
return function update (state) {
const {
selectedSeedWords: prevSelectedSeedWords,
selectedSeedWordsHash: prevSelectedSeedWordsHash,
} = state
const selectedSeedWords = [...prevSelectedSeedWords]
const indexToRemove = prevSelectedSeedWordsHash[shuffledIndex]
selectedSeedWords.splice(indexToRemove, 1)
const selectedSeedWordsHash = Object.keys(prevSelectedSeedWordsHash).reduce((acc, index) => {
const output = { ...acc }
const selectedSeedWordIndex = prevSelectedSeedWordsHash[index]
if (selectedSeedWordIndex < indexToRemove) {
output[index] = selectedSeedWordIndex
} else if (selectedSeedWordIndex > indexToRemove) {
output[index] = selectedSeedWordIndex - 1
}
return output
}, {})
return {
selectedSeedWords,
selectedSeedWordsHash,
}
}
}

View File

@ -0,0 +1,126 @@
import React, { Component } from 'react'
import PropTypes from 'prop-types'
import classnames from 'classnames'
import { DragSource, DropTarget } from 'react-dnd'
class DraggableSeed extends Component {
static propTypes = {
// React DnD Props
connectDragSource: PropTypes.func.isRequired,
connectDropTarget: PropTypes.func.isRequired,
isDragging: PropTypes.bool,
isOver: PropTypes.bool,
canDrop: PropTypes.bool,
// Own Props
onClick: PropTypes.func.isRequired,
setHoveringIndex: PropTypes.func.isRequired,
index: PropTypes.number,
draggingSeedIndex: PropTypes.number,
word: PropTypes.string,
className: PropTypes.string,
selected: PropTypes.bool,
droppable: PropTypes.bool,
}
static defaultProps = {
className: '',
onClick () {},
}
componentWillReceiveProps (nextProps, nextContext) {
const { isOver, setHoveringIndex } = this.props
if (isOver && !nextProps.isOver) {
setHoveringIndex(-1)
}
}
render () {
const {
connectDragSource,
connectDropTarget,
isDragging,
index,
word,
selected,
className,
onClick,
isOver,
canDrop,
} = this.props
return connectDropTarget(connectDragSource(
<div
key={index}
className={classnames('btn-secondary confirm-seed-phrase__seed-word', className, {
'confirm-seed-phrase__seed-word--selected btn-primary': selected,
'confirm-seed-phrase__seed-word--dragging': isDragging,
'confirm-seed-phrase__seed-word--empty': !word,
'confirm-seed-phrase__seed-word--active-drop': !isOver && canDrop,
'confirm-seed-phrase__seed-word--drop-hover': isOver && canDrop,
})}
onClick={onClick}
>
{ word }
</div>
))
}
}
const SEEDWORD = 'SEEDWORD'
const seedSource = {
beginDrag (props) {
setTimeout(() => props.setDraggingSeedIndex(props.seedIndex), 0)
return {
seedIndex: props.seedIndex,
word: props.word,
}
},
canDrag (props) {
return props.draggable
},
endDrag (props, monitor) {
const dropTarget = monitor.getDropResult()
if (!dropTarget) {
setTimeout(() => props.setDraggingSeedIndex(-1), 0)
return
}
props.onDrop(dropTarget.targetIndex)
},
}
const seedTarget = {
drop (props) {
return {
targetIndex: props.index,
}
},
canDrop (props) {
return props.droppable
},
hover (props) {
props.setHoveringIndex(props.index)
},
}
const collectDrag = (connect, monitor) => {
return {
connectDragSource: connect.dragSource(),
isDragging: monitor.isDragging(),
}
}
const collectDrop = (connect, monitor) => {
return {
connectDropTarget: connect.dropTarget(),
isOver: monitor.isOver(),
canDrop: monitor.canDrop(),
}
}
export default DropTarget(SEEDWORD, seedTarget, collectDrop)(DragSource(SEEDWORD, seedSource, collectDrag)(DraggableSeed))

View File

@ -3,46 +3,97 @@
margin-bottom: 12px; margin-bottom: 12px;
} }
&__selected-seed-words {
min-height: 190px;
max-width: 496px;
border: 1px solid #CDCDCD;
border-radius: 6px;
background-color: $white;
margin: 24px 0 36px;
padding: 12px;
}
&__shuffled-seed-words { &__shuffled-seed-words {
max-width: 496px; max-width: 575px;
} }
&__seed-word { &__seed-word {
display: inline-block; display: inline-flex;
color: #5B5D67; flex-flow: row nowrap;
background-color: #E7E7E7; align-items: center;
justify-content: center;
padding: 8px 18px; padding: 8px 18px;
min-width: 64px; width: 128px;
height: 41px;
margin: 4px; margin: 4px;
text-align: center; text-align: center;
border-radius: 4px;
&--selected { cursor: move;
background-color: #85D1CC;
color: $white;
}
&--shuffled { &--shuffled {
cursor: pointer; cursor: pointer;
margin: 6px; margin: 6px;
} }
&--selected {
color: $white;
}
&--dragging {
margin: 0;
}
&--empty {
background-color: transparent;
border-color: transparent;
cursor: default;
&:hover,
&:active {
background-color: transparent;
border-color: transparent;
cursor: default;
box-shadow: none !important;
}
}
&--hidden {
display: none !important;
}
&--drop-hover {
background-color: transparent;
border-color: transparent;
color: transparent;
}
@media screen and (max-width: 575px) { @media screen and (max-width: 575px) {
font-size: .875rem; font-size: .875rem;
padding: 6px 18px; padding: 6px 18px;
} }
} }
button { &__selected-seed-words {
margin-top: 0xp; display: flex;
flex-flow: row wrap;
min-height: 161px;
max-width: 575px;
border: 1px solid #CDCDCD;
border-radius: 6px;
background-color: $white;
margin: 24px 0 36px;
padding: 12px;
&__pending-seed {
display: none;
}
&__selected-seed {
display: inline-flex;
&:hover {
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25);
}
}
&--dragging {
.confirm-seed-phrase__selected-seed-words__pending-seed {
display: inline-flex;
}
.confirm-seed-phrase__selected-seed-words__selected-seed {
display: none;
}
}
} }
} }

View File

@ -8,6 +8,8 @@ import {
INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE, INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE,
DEFAULT_ROUTE, DEFAULT_ROUTE,
} from '../../../helpers/constants/routes' } from '../../../helpers/constants/routes'
import HTML5Backend from 'react-dnd-html5-backend'
import {DragDropContextProvider} from 'react-dnd'
export default class SeedPhrase extends PureComponent { export default class SeedPhrase extends PureComponent {
static propTypes = { static propTypes = {
@ -28,43 +30,45 @@ export default class SeedPhrase extends PureComponent {
const { seedPhrase } = this.props const { seedPhrase } = this.props
return ( return (
<div className="first-time-flow__wrapper"> <DragDropContextProvider backend={HTML5Backend}>
<div className="app-header__logo-container"> <div className="first-time-flow__wrapper">
<img <div className="app-header__logo-container">
className="app-header__metafox-logo app-header__metafox-logo--horizontal" <img
src="/images/logo/metamask-logo-horizontal.svg" className="app-header__metafox-logo app-header__metafox-logo--horizontal"
height={30} src="/images/logo/metamask-logo-horizontal.svg"
/> height={30}
<img />
className="app-header__metafox-logo app-header__metafox-logo--icon" <img
src="/images/logo/metamask-fox.svg" className="app-header__metafox-logo app-header__metafox-logo--icon"
height={42} src="/images/logo/metamask-fox.svg"
width={42} height={42}
/> width={42}
/>
</div>
<Switch>
<Route
exact
path={INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE}
render={props => (
<ConfirmSeedPhrase
{ ...props }
seedPhrase={seedPhrase}
/>
)}
/>
<Route
exact
path={INITIALIZE_SEED_PHRASE_ROUTE}
render={props => (
<RevealSeedPhrase
{ ...props }
seedPhrase={seedPhrase}
/>
)}
/>
</Switch>
</div> </div>
<Switch> </DragDropContextProvider>
<Route
exact
path={INITIALIZE_CONFIRM_SEED_PHRASE_ROUTE}
render={props => (
<ConfirmSeedPhrase
{ ...props }
seedPhrase={seedPhrase}
/>
)}
/>
<Route
exact
path={INITIALIZE_SEED_PHRASE_ROUTE}
render={props => (
<RevealSeedPhrase
{ ...props }
seedPhrase={seedPhrase}
/>
)}
/>
</Switch>
</div>
) )
} }
} }

View File

@ -0,0 +1,169 @@
import React from 'react'
import assert from 'assert'
import { shallow } from 'enzyme'
import sinon from 'sinon'
import ConfirmSeedPhrase from '../confirm-seed-phrase/confirm-seed-phrase.component'
function shallowRender (props = {}, context = {}) {
return shallow(
<ConfirmSeedPhrase {...props} />,
{
context: {
t: str => str + '_t',
...context,
},
}
)
}
describe('ConfirmSeedPhrase Component', () => {
it('should render correctly', () => {
const root = shallowRender({
seedPhrase: '鼠 牛 虎 兔 龍 蛇 馬 羊 猴 雞 狗 豬',
})
assert.equal(
root.find('.confirm-seed-phrase__seed-word--shuffled').length,
12,
'should render 12 seed phrases'
)
})
it('should add/remove selected on click', () => {
const metricsEventSpy = sinon.spy()
const pushSpy = sinon.spy()
const root = shallowRender(
{
seedPhrase: '鼠 牛 虎 兔 龍 蛇 馬 羊 猴 雞 狗 豬',
history: { push: pushSpy },
},
{
metricsEvent: metricsEventSpy,
}
)
const seeds = root.find('.confirm-seed-phrase__seed-word--shuffled')
// Click on 3 seeds to add to selected
seeds.at(0).simulate('click')
seeds.at(1).simulate('click')
seeds.at(2).simulate('click')
assert.deepEqual(
root.state().selectedSeedIndices,
[0, 1, 2],
'should add seed phrase to selected on click',
)
// Click on a selected seed to remove
root.state()
root.update()
root.state()
root.find('.confirm-seed-phrase__seed-word--shuffled').at(1).simulate('click')
assert.deepEqual(
root.state().selectedSeedIndices,
[0, 2],
'should remove seed phrase from selected when click again',
)
})
it('should render correctly on hover', () => {
const metricsEventSpy = sinon.spy()
const pushSpy = sinon.spy()
const root = shallowRender(
{
seedPhrase: '鼠 牛 虎 兔 龍 蛇 馬 羊 猴 雞 狗 豬',
history: { push: pushSpy },
},
{
metricsEvent: metricsEventSpy,
}
)
const seeds = root.find('.confirm-seed-phrase__seed-word--shuffled')
// Click on 3 seeds to add to selected
seeds.at(0).simulate('click')
seeds.at(1).simulate('click')
seeds.at(2).simulate('click')
// Dragging Seed # 2 to 0 placeth
root.instance().setDraggingSeedIndex(2)
root.instance().setHoveringIndex(0)
root.update()
const pendingSeeds = root.find('.confirm-seed-phrase__selected-seed-words__pending-seed')
assert.equal(pendingSeeds.at(0).props().seedIndex, 2)
assert.equal(pendingSeeds.at(1).props().seedIndex, 0)
assert.equal(pendingSeeds.at(2).props().seedIndex, 1)
})
it('should insert seed in place on drop', () => {
const metricsEventSpy = sinon.spy()
const pushSpy = sinon.spy()
const root = shallowRender(
{
seedPhrase: '鼠 牛 虎 兔 龍 蛇 馬 羊 猴 雞 狗 豬',
history: { push: pushSpy },
},
{
metricsEvent: metricsEventSpy,
}
)
const seeds = root.find('.confirm-seed-phrase__seed-word--shuffled')
// Click on 3 seeds to add to selected
seeds.at(0).simulate('click')
seeds.at(1).simulate('click')
seeds.at(2).simulate('click')
// Drop Seed # 2 to 0 placeth
root.instance().setDraggingSeedIndex(2)
root.instance().setHoveringIndex(0)
root.instance().onDrop(0)
root.update()
assert.deepEqual(root.state().selectedSeedIndices, [2, 0, 1])
assert.deepEqual(root.state().pendingSeedIndices, [2, 0, 1])
})
it('should submit correctly', () => {
const originalSeed = ['鼠', '牛', '虎', '兔', '龍', '蛇', '馬', '羊', '猴', '雞', '狗', '豬']
const metricsEventSpy = sinon.spy()
const pushSpy = sinon.spy()
const root = shallowRender(
{
seedPhrase: '鼠 牛 虎 兔 龍 蛇 馬 羊 猴 雞 狗 豬',
history: { push: pushSpy },
},
{
metricsEvent: metricsEventSpy,
}
)
const shuffled = root.state().shuffledSeedWords
const seeds = root.find('.confirm-seed-phrase__seed-word--shuffled')
originalSeed.forEach(seed => {
const seedIndex = shuffled.findIndex(s => s === seed)
seeds.at(seedIndex).simulate('click')
})
root.update()
root.find('.first-time-flow__button').simulate('click')
assert.deepEqual(metricsEventSpy.args[0][0], {
eventOpts: {
category: 'Onboarding',
action: 'Seed Phrase Setup',
name: 'Verify Complete',
},
})
assert.equal(pushSpy.args[0][0], '/initialize/end-of-flow')
})
})