OSDN Git Service

v0.1.0
authormonky <yanbo@luojilab.com>
Wed, 17 Oct 2018 15:48:29 +0000 (23:48 +0800)
committermonky <yanbo@luojilab.com>
Wed, 17 Oct 2018 15:48:29 +0000 (23:48 +0800)
30 files changed:
build/webpack.prod.conf.js
package-lock.json
package.json
src/assets/style.css
src/background/account.js [new file with mode: 0644]
src/background/bytom.js [new file with mode: 0644]
src/background/index.js
src/background/transaction.js [new file with mode: 0644]
src/common/hotWords.js [deleted file]
src/manifest.js
src/popup/App.vue
src/popup/components/spin/index.js [new file with mode: 0644]
src/popup/components/spin/spin.js [new file with mode: 0644]
src/popup/components/spin/spin.vue [new file with mode: 0644]
src/popup/framework/components/login/form-addon.vue
src/popup/framework/components/login/form-recover.vue
src/popup/framework/components/login/protocol.vue
src/popup/framework/components/menu/main.vue
src/popup/framework/components/menu/page/backup.vue
src/popup/framework/components/menu/page/creation.vue
src/popup/framework/components/menu/page/recovery.vue
src/popup/framework/components/trans/qrcode.vue
src/popup/framework/components/trans/transfer.vue
src/popup/framework/home.vue
src/popup/framework/login.vue
src/popup/index.js
src/popup/script/bytom.js [new file with mode: 0644]
static/icons/logo.png [new file with mode: 0755]
static/main.wasm [new file with mode: 0644]
updates.xml [new file with mode: 0644]

index 6daa538..b2795dd 100644 (file)
@@ -14,12 +14,6 @@ module.exports = merge(baseConf, {
       'process.env.NODE_ENV': '"production"'
     }),
     new CleanWebpackPlugin(['dist/*.*']),
-    new webpack.optimize.UglifyJsPlugin({
-      sourceMap: false,
-      compress: {
-        warnings: false
-      }
-    }),
     new webpack.LoaderOptionsPlugin({
       minimize: true
     })
index 51a87d2..f627699 100644 (file)
@@ -4,6 +4,31 @@
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+      "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+      "requires": {
+        "@babel/highlight": "7.0.0"
+      }
+    },
+    "@babel/highlight": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+      "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+      "requires": {
+        "chalk": "2.4.1",
+        "esutils": "2.0.2",
+        "js-tokens": "4.0.0"
+      },
+      "dependencies": {
+        "js-tokens": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+          "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+        }
+      }
+    },
     "abbrev": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
@@ -23,8 +48,7 @@
     "acorn": {
       "version": "5.7.2",
       "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz",
-      "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==",
-      "dev": true
+      "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw=="
     },
     "acorn-dynamic-import": {
       "version": "2.0.2",
         }
       }
     },
+    "acorn-jsx": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-4.1.1.tgz",
+      "integrity": "sha512-JY+iV6r+cO21KtntVvFkD+iqjtdpRUpGqKWgfkCdZq1R+kbreEl8EcdcJR4SmiIgsIQT33s6QzheQ9a275Q8xw==",
+      "requires": {
+        "acorn": "5.7.2"
+      }
+    },
     "ajv": {
       "version": "5.5.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
       "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
       "dev": true
     },
+    "ansi-escapes": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz",
+      "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw=="
+    },
     "ansi-html": {
       "version": "0.0.7",
       "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz",
       "version": "1.0.10",
       "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
       "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
       "requires": {
         "sprintf-js": "1.0.3"
       }
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
       "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-      "dev": true,
       "requires": {
         "array-uniq": "1.0.3"
       }
     "array-uniq": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-      "dev": true
+      "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
     },
     "array-unique": {
       "version": "0.3.2",
     "arrify": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
-      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
-      "dev": true
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
     },
     "asn1": {
       "version": "0.2.3",
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
+      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
     },
     "base": {
       "version": "0.11.2",
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
       "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
       "requires": {
         "balanced-match": "1.0.0",
         "concat-map": "0.0.1"
       "dev": true
     },
     "bytom-js-sdk": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bytom-js-sdk/-/bytom-js-sdk-1.0.2.tgz",
-      "integrity": "sha512-/PSjuA/nHm/objvWx6txpLRI2v6xaATZwinQ99TeiNukIWUyttRiFTj5T+kCR0YkyssPtOVztfVnZTfpjDUqJg==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/bytom-js-sdk/-/bytom-js-sdk-1.3.3.tgz",
+      "integrity": "sha512-5rIMrjzdp5CyXW32n2kglYEUYguoxB6cxcVYcAIfCpvgOIAUJtkmVn1YXu9rMH+0UvevGFbttUV7V3BiJZLaeg==",
       "requires": {
-        "axios": "0.18.0"
+        "axios": "0.18.0",
+        "eslint": "5.7.0"
       }
     },
     "cacache": {
         "unset-value": "1.0.0"
       }
     },
+    "caller-path": {
+      "version": "0.1.0",
+      "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+      "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+      "requires": {
+        "callsites": "0.2.0"
+      }
+    },
+    "callsites": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz",
+      "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo="
+    },
     "camel-case": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz",
       "version": "2.4.1",
       "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz",
       "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==",
-      "dev": true,
       "requires": {
         "ansi-styles": "3.2.1",
         "escape-string-regexp": "1.0.5",
           "version": "3.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
           "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
           "requires": {
             "color-convert": "1.9.2"
           }
           "version": "5.5.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
           "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-          "dev": true,
           "requires": {
             "has-flag": "3.0.0"
           }
         }
       }
     },
+    "chardet": {
+      "version": "0.7.0",
+      "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+      "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+    },
     "chokidar": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz",
         "safe-buffer": "5.1.2"
       }
     },
+    "circular-json": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz",
+      "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A=="
+    },
     "clap": {
       "version": "1.2.3",
       "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz",
         "rimraf": "2.6.2"
       }
     },
+    "cli-cursor": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
+      "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
+      "requires": {
+        "restore-cursor": "2.0.0"
+      }
+    },
+    "cli-width": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
+      "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk="
+    },
     "cliui": {
       "version": "3.2.0",
       "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
       "version": "1.9.2",
       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz",
       "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==",
-      "dev": true,
       "requires": {
         "color-name": "1.1.1"
       }
     "color-name": {
       "version": "1.1.1",
       "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz",
-      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=",
-      "dev": true
+      "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok="
     },
     "color-string": {
       "version": "0.3.0",
     "concat-map": {
       "version": "0.0.1",
       "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
+      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
     },
     "concat-stream": {
       "version": "1.6.2",
       "version": "6.0.5",
       "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
       "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-      "dev": true,
       "requires": {
         "nice-try": "1.0.5",
         "path-key": "2.0.1",
       "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=",
       "dev": true
     },
+    "deep-is": {
+      "version": "0.1.3",
+      "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+      "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ="
+    },
     "deepmerge": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.1.tgz",
         "buffer-indexof": "1.1.1"
       }
     },
+    "doctrine": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+      "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+      "requires": {
+        "esutils": "2.0.2"
+      }
+    },
     "dom-converter": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz",
         "estraverse": "4.2.0"
       }
     },
+    "eslint": {
+      "version": "5.7.0",
+      "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.7.0.tgz",
+      "integrity": "sha512-zYCeFQahsxffGl87U2aJ7DPyH8CbWgxBC213Y8+TCanhUTf2gEvfq3EKpHmEcozTLyPmGe9LZdMAwC/CpJBM5A==",
+      "requires": {
+        "@babel/code-frame": "7.0.0",
+        "ajv": "6.5.4",
+        "chalk": "2.4.1",
+        "cross-spawn": "6.0.5",
+        "debug": "4.1.0",
+        "doctrine": "2.1.0",
+        "eslint-scope": "4.0.0",
+        "eslint-utils": "1.3.1",
+        "eslint-visitor-keys": "1.0.0",
+        "espree": "4.0.0",
+        "esquery": "1.0.1",
+        "esutils": "2.0.2",
+        "file-entry-cache": "2.0.0",
+        "functional-red-black-tree": "1.0.1",
+        "glob": "7.1.2",
+        "globals": "11.8.0",
+        "ignore": "4.0.6",
+        "imurmurhash": "0.1.4",
+        "inquirer": "6.2.0",
+        "is-resolvable": "1.1.0",
+        "js-yaml": "3.12.0",
+        "json-stable-stringify-without-jsonify": "1.0.1",
+        "levn": "0.3.0",
+        "lodash": "4.17.10",
+        "minimatch": "3.0.4",
+        "mkdirp": "0.5.1",
+        "natural-compare": "1.4.0",
+        "optionator": "0.8.2",
+        "path-is-inside": "1.0.2",
+        "pluralize": "7.0.0",
+        "progress": "2.0.0",
+        "regexpp": "2.0.1",
+        "require-uncached": "1.0.3",
+        "semver": "5.5.1",
+        "strip-ansi": "4.0.0",
+        "strip-json-comments": "2.0.1",
+        "table": "5.1.0",
+        "text-table": "0.2.0"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+          "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+          "requires": {
+            "fast-deep-equal": "2.0.1",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.4.1",
+            "uri-js": "4.2.2"
+          }
+        },
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "debug": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
+          "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+          "requires": {
+            "ms": "2.1.1"
+          }
+        },
+        "esprima": {
+          "version": "4.0.1",
+          "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+        },
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+        },
+        "globals": {
+          "version": "11.8.0",
+          "resolved": "https://registry.npmjs.org/globals/-/globals-11.8.0.tgz",
+          "integrity": "sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA=="
+        },
+        "ignore": {
+          "version": "4.0.6",
+          "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+          "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+        },
+        "js-yaml": {
+          "version": "3.12.0",
+          "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz",
+          "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==",
+          "requires": {
+            "argparse": "1.0.10",
+            "esprima": "4.0.1"
+          }
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        },
+        "ms": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+          "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
+    },
+    "eslint-scope": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+      "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+      "requires": {
+        "esrecurse": "4.2.1",
+        "estraverse": "4.2.0"
+      }
+    },
+    "eslint-utils": {
+      "version": "1.3.1",
+      "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.3.1.tgz",
+      "integrity": "sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q=="
+    },
+    "eslint-visitor-keys": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
+      "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ=="
+    },
+    "espree": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/espree/-/espree-4.0.0.tgz",
+      "integrity": "sha512-kapdTCt1bjmspxStVKX6huolXVV5ZfyZguY1lcfhVVZstce3bqxH9mcLzNn3/mlgW6wQ732+0fuG9v7h0ZQoKg==",
+      "requires": {
+        "acorn": "5.7.2",
+        "acorn-jsx": "4.1.1"
+      }
+    },
     "esprima": {
       "version": "2.7.3",
       "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
       "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
       "dev": true
     },
+    "esquery": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+      "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+      "requires": {
+        "estraverse": "4.2.0"
+      }
+    },
     "esrecurse": {
       "version": "4.2.1",
       "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
       "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
-      "dev": true,
       "requires": {
         "estraverse": "4.2.0"
       }
     "estraverse": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
-      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
-      "dev": true
+      "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
     },
     "esutils": {
       "version": "2.0.2",
         }
       }
     },
+    "external-editor": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+      "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+      "requires": {
+        "chardet": "0.7.0",
+        "iconv-lite": "0.4.24",
+        "tmp": "0.0.33"
+      },
+      "dependencies": {
+        "iconv-lite": {
+          "version": "0.4.24",
+          "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+          "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+          "requires": {
+            "safer-buffer": "2.1.2"
+          }
+        }
+      }
+    },
     "extglob": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
     "fast-json-stable-stringify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "dev": true
+      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+    },
+    "fast-levenshtein": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+      "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
     },
     "fastparse": {
       "version": "1.1.1",
         "websocket-driver": "0.7.0"
       }
     },
+    "figures": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+      "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+      "requires": {
+        "escape-string-regexp": "1.0.5"
+      }
+    },
+    "file-entry-cache": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz",
+      "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=",
+      "requires": {
+        "flat-cache": "1.3.0",
+        "object-assign": "4.1.1"
+      }
+    },
     "file-loader": {
       "version": "1.1.11",
       "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
         }
       }
     },
+    "file-saver": {
+      "version": "2.0.0-rc.3",
+      "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.0-rc.3.tgz",
+      "integrity": "sha512-LZ89x9kYxsAbJFoeLFiD5dRQnGoppXn3NLmPuULYyiKeAcEHQ8TTUwzGAEWT1VjoNGCapP3z+OG2qrwPoas80Q=="
+    },
     "filename-regex": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
         "locate-path": "2.0.0"
       }
     },
+    "flat-cache": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+      "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+      "requires": {
+        "circular-json": "0.3.3",
+        "del": "2.2.2",
+        "graceful-fs": "4.1.11",
+        "write": "0.2.1"
+      },
+      "dependencies": {
+        "del": {
+          "version": "2.2.2",
+          "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+          "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+          "requires": {
+            "globby": "5.0.0",
+            "is-path-cwd": "1.0.0",
+            "is-path-in-cwd": "1.0.1",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1",
+            "rimraf": "2.6.2"
+          }
+        },
+        "globby": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+          "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+          "requires": {
+            "array-union": "1.0.2",
+            "arrify": "1.0.1",
+            "glob": "7.1.2",
+            "object-assign": "4.1.1",
+            "pify": "2.3.0",
+            "pinkie-promise": "2.0.1"
+          }
+        },
+        "pify": {
+          "version": "2.3.0",
+          "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+          "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+        }
+      }
+    },
     "flatten": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz",
     "fs.realpath": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
+      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
     },
     "fsevents": {
       "version": "1.2.4",
       "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
       "dev": true
     },
+    "functional-red-black-tree": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
+      "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc="
+    },
     "gauge": {
       "version": "2.7.4",
       "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
       "version": "7.1.2",
       "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
       "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
-      "dev": true,
       "requires": {
         "fs.realpath": "1.0.0",
         "inflight": "1.0.6",
     "graceful-fs": {
       "version": "4.1.11",
       "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-      "dev": true
+      "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
     },
     "handle-thing": {
       "version": "1.2.5",
     "has-flag": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-      "dev": true
+      "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
     },
     "has-unicode": {
       "version": "2.0.1",
     "imurmurhash": {
       "version": "0.1.4",
       "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
-      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
-      "dev": true
+      "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
     },
     "in-publish": {
       "version": "2.0.0",
       "version": "1.0.6",
       "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
       "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
       "requires": {
         "once": "1.4.0",
         "wrappy": "1.0.2"
     "inherits": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
-      "dev": true
+      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
+    },
+    "inquirer": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.0.tgz",
+      "integrity": "sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg==",
+      "requires": {
+        "ansi-escapes": "3.1.0",
+        "chalk": "2.4.1",
+        "cli-cursor": "2.1.0",
+        "cli-width": "2.2.0",
+        "external-editor": "3.0.3",
+        "figures": "2.0.0",
+        "lodash": "4.17.10",
+        "mute-stream": "0.0.7",
+        "run-async": "2.3.0",
+        "rxjs": "6.3.3",
+        "string-width": "2.1.1",
+        "strip-ansi": "4.0.0",
+        "through": "2.3.8"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "3.0.0",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
+        },
+        "strip-ansi": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+          "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+          "requires": {
+            "ansi-regex": "3.0.0"
+          }
+        }
+      }
     },
     "internal-ip": {
       "version": "1.2.0",
     "is-fullwidth-code-point": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
+      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8="
     },
     "is-glob": {
       "version": "4.0.0",
     "is-path-cwd": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
-      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=",
-      "dev": true
+      "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
     },
     "is-path-in-cwd": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz",
       "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==",
-      "dev": true,
       "requires": {
         "is-path-inside": "1.0.1"
       }
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz",
       "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=",
-      "dev": true,
       "requires": {
         "path-is-inside": "1.0.2"
       }
       "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
       "dev": true
     },
+    "is-promise": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
+      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
+    },
     "is-regex": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
         "has": "1.0.3"
       }
     },
+    "is-resolvable": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
+      "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg=="
+    },
     "is-stream": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
     },
     "isobject": {
       "version": "3.0.1",
       "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
       "dev": true
     },
+    "json-stable-stringify-without-jsonify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+      "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE="
+    },
     "json-stringify-safe": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
         "invert-kv": "1.0.0"
       }
     },
+    "levn": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+      "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+      "requires": {
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2"
+      }
+    },
     "load-json-file": {
       "version": "1.1.0",
       "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
     "mimic-fn": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
-      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
-      "dev": true
+      "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ=="
     },
     "minimalistic-assert": {
       "version": "1.0.1",
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
       "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
       "requires": {
         "brace-expansion": "1.1.11"
       }
     "minimist": {
       "version": "0.0.8",
       "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
-      "dev": true
+      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
     },
     "mississippi": {
       "version": "2.0.0",
       "version": "0.5.1",
       "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
       "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "dev": true,
       "requires": {
         "minimist": "0.0.8"
       }
     },
+    "moment": {
+      "version": "2.22.2",
+      "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz",
+      "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y="
+    },
     "move-concurrently": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz",
       "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=",
       "dev": true
     },
+    "mute-stream": {
+      "version": "0.0.7",
+      "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+      "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+    },
     "nan": {
       "version": "2.11.0",
       "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz",
         "to-regex": "3.0.2"
       }
     },
+    "natural-compare": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+      "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+    },
     "negotiator": {
       "version": "0.6.1",
       "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
     "nice-try": {
       "version": "1.0.5",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
-      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
-      "dev": true
+      "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
     },
     "no-case": {
       "version": "2.3.2",
     "object-assign": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
-      "dev": true
+      "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
     },
     "object-copy": {
       "version": "0.1.0",
       "version": "1.4.0",
       "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
       "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
       "requires": {
         "wrappy": "1.0.2"
       }
     },
+    "onetime": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+      "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+      "requires": {
+        "mimic-fn": "1.2.0"
+      }
+    },
     "opn": {
       "version": "5.3.0",
       "resolved": "https://registry.npmjs.org/opn/-/opn-5.3.0.tgz",
         "is-wsl": "1.1.0"
       }
     },
+    "optionator": {
+      "version": "0.8.2",
+      "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+      "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+      "requires": {
+        "deep-is": "0.1.3",
+        "fast-levenshtein": "2.0.6",
+        "levn": "0.3.0",
+        "prelude-ls": "1.1.2",
+        "type-check": "0.3.2",
+        "wordwrap": "1.0.0"
+      },
+      "dependencies": {
+        "wordwrap": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+          "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+        }
+      }
+    },
     "original": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz",
     "os-tmpdir": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
-      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
-      "dev": true
+      "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ="
     },
     "osenv": {
       "version": "0.1.5",
     "path-is-absolute": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
+      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
     },
     "path-is-inside": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
-      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=",
-      "dev": true
+      "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM="
     },
     "path-key": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
-      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
-      "dev": true
+      "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
     },
     "path-parse": {
       "version": "1.0.6",
     "pinkie": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
+      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
     },
     "pinkie-promise": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
       "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
       "requires": {
         "pinkie": "2.0.4"
       }
         "find-up": "2.1.0"
       }
     },
+    "pluralize": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz",
+      "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow=="
+    },
     "popper.js": {
       "version": "1.14.4",
       "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.14.4.tgz",
         "uniqs": "2.0.0"
       }
     },
+    "prelude-ls": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+      "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+    },
     "prepend-http": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
       "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
       "dev": true
     },
+    "progress": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+      "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
+    },
     "promise-inflight": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
     "punycode": {
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
-      "dev": true
+      "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
     },
     "q": {
       "version": "1.5.1",
       "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
       "dev": true
     },
+    "qrcodejs2": {
+      "version": "0.0.2",
+      "resolved": "https://registry.npmjs.org/qrcodejs2/-/qrcodejs2-0.0.2.tgz",
+      "integrity": "sha1-Rlr+Xjnxn6zsuTLBH3oYYQkUauE="
+    },
     "qs": {
       "version": "6.5.2",
       "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
         "safe-regex": "1.1.0"
       }
     },
+    "regexpp": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+      "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
+    },
     "regexpu-core": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz",
       "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
       "dev": true
     },
+    "require-uncached": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+      "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+      "requires": {
+        "caller-path": "0.1.0",
+        "resolve-from": "1.0.1"
+      },
+      "dependencies": {
+        "resolve-from": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz",
+          "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY="
+        }
+      }
+    },
     "requires-port": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
       "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
       "dev": true
     },
+    "restore-cursor": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+      "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+      "requires": {
+        "onetime": "2.0.1",
+        "signal-exit": "3.0.2"
+      }
+    },
     "ret": {
       "version": "0.1.15",
       "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
       "version": "2.6.2",
       "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
       "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
-      "dev": true,
       "requires": {
         "glob": "7.1.2"
       }
         "inherits": "2.0.3"
       }
     },
+    "run-async": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+      "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+      "requires": {
+        "is-promise": "2.1.0"
+      }
+    },
     "run-queue": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz",
         "aproba": "1.2.0"
       }
     },
+    "rxjs": {
+      "version": "6.3.3",
+      "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+      "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+      "requires": {
+        "tslib": "1.9.3"
+      }
+    },
     "safe-buffer": {
       "version": "5.1.2",
       "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
     "safer-buffer": {
       "version": "2.1.2",
       "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
-      "dev": true
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
     },
     "sass-graph": {
       "version": "2.2.4",
     "semver": {
       "version": "5.5.1",
       "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz",
-      "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==",
-      "dev": true
+      "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw=="
     },
     "send": {
       "version": "0.16.2",
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
       "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
-      "dev": true,
       "requires": {
         "shebang-regex": "1.0.0"
       }
     "shebang-regex": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
-      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
-      "dev": true
+      "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM="
     },
     "signal-exit": {
       "version": "3.0.2",
       "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
-      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
-      "dev": true
+      "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
     },
     "slash": {
       "version": "1.0.0",
       "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=",
       "dev": true
     },
+    "slice-ansi": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz",
+      "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==",
+      "requires": {
+        "is-fullwidth-code-point": "2.0.0"
+      }
+    },
     "snapdragon": {
       "version": "0.8.2",
       "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
     "sprintf-js": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
+      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
     },
     "sshpk": {
       "version": "1.14.2",
       "version": "2.1.1",
       "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
       "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-      "dev": true,
       "requires": {
         "is-fullwidth-code-point": "2.0.0",
         "strip-ansi": "4.0.0"
         "ansi-regex": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-          "dev": true
+          "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg="
         },
         "strip-ansi": {
           "version": "4.0.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
           "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-          "dev": true,
           "requires": {
             "ansi-regex": "3.0.0"
           }
         "get-stdin": "4.0.1"
       }
     },
+    "strip-json-comments": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
+      "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo="
+    },
     "supports-color": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
         "whet.extend": "0.9.9"
       }
     },
+    "table": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/table/-/table-5.1.0.tgz",
+      "integrity": "sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg==",
+      "requires": {
+        "ajv": "6.5.4",
+        "lodash": "4.17.10",
+        "slice-ansi": "1.0.0",
+        "string-width": "2.1.1"
+      },
+      "dependencies": {
+        "ajv": {
+          "version": "6.5.4",
+          "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz",
+          "integrity": "sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==",
+          "requires": {
+            "fast-deep-equal": "2.0.1",
+            "fast-json-stable-stringify": "2.0.0",
+            "json-schema-traverse": "0.4.1",
+            "uri-js": "4.2.2"
+          }
+        },
+        "fast-deep-equal": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+          "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+        },
+        "json-schema-traverse": {
+          "version": "0.4.1",
+          "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+          "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+        }
+      }
+    },
     "tapable": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.0.0.tgz",
         "xtend": "4.0.1"
       }
     },
+    "text-table": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+      "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+    },
+    "through": {
+      "version": "2.3.8",
+      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
+      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+    },
     "through2": {
       "version": "2.0.3",
       "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
       "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz",
       "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g="
     },
+    "tmp": {
+      "version": "0.0.33",
+      "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+      "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+      "requires": {
+        "os-tmpdir": "1.0.2"
+      }
+    },
     "to-arraybuffer": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
         }
       }
     },
+    "tslib": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+      "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+    },
     "tty-browserify": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
       "dev": true,
       "optional": true
     },
+    "type-check": {
+      "version": "0.3.2",
+      "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+      "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+      "requires": {
+        "prelude-ls": "1.1.2"
+      }
+    },
     "type-is": {
       "version": "1.6.16",
       "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
       "version": "4.2.2",
       "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
       "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
-      "dev": true,
       "requires": {
         "punycode": "2.1.1"
       }
       "version": "1.3.1",
       "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
       "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "dev": true,
       "requires": {
         "isexe": "2.0.0"
       }
     "wrappy": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    },
+    "write": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+      "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+      "requires": {
+        "mkdirp": "0.5.1"
+      }
     },
     "xtend": {
       "version": "4.0.1",
index c51230d..9f37091 100644 (file)
   "dependencies": {
     "axios": "^0.18.0",
     "babel-preset-es2015": "^6.24.1",
-    "bytom-js-sdk": "^1.0.2",
+    "bytom-js-sdk": "^1.3.3",
+    "file-saver": "^2.0.0-rc.3",
     "iview": "^3.0.0",
+    "moment": "^2.22.2",
+    "qrcodejs2": "0.0.2",
     "vue": "^2.5.11"
   },
   "browserslist": [
index c78758b..bb51b44 100644 (file)
@@ -57,6 +57,7 @@ h2 {
 ul {
   list-style-type: none;
   padding: 0;
+  margin: 0;
 }
 
 hr {
@@ -240,4 +241,20 @@ hr {
   border: none;
   outline: none;
   background: transparent;
+  display: inline-block;
+  width: 100%;
+}
+.form-item-label {
+  text-align: right;
+  vertical-align: middle;
+  float: left;
+  font-size: 12px;
+  line-height: 1;
+  padding: 10px 12px 10px 0;
+  box-sizing: border-box;
+}
+.form-item-content {
+  position: relative;
+  line-height: 32px;
+  font-size: 12px;
 }
diff --git a/src/background/account.js b/src/background/account.js
new file mode 100644 (file)
index 0000000..6f4213b
--- /dev/null
@@ -0,0 +1,41 @@
+import bytom from "./bytom";
+
+function account(bytom) {
+  this.bytom = bytom;
+}
+
+account.prototype.create = function(
+  accountAlias,
+  keyAlias,
+  passwd,
+  success,
+  error
+) {
+  let retPromise = new Promise((resolve, reject) => {
+    this.bytom.keys
+      .create(keyAlias, passwd)
+      .then(res => {
+          this.bytom.accounts
+              .createAccountUseServer(res.xpub, accountAlias)
+              .then(ret => {
+                  resolve(ret);
+              })
+              .catch(error => {
+                  reject(error);
+              });
+      })
+      .catch(error => {
+        reject(error);
+      });
+  });
+  return retPromise;
+};
+
+account.prototype.backup = function() {
+  return bytom.wallet.backup();
+};
+account.prototype.restore = function(walletImage) {
+  return bytom.wallet.restore(walletImage);
+};
+
+export default account;
diff --git a/src/background/bytom.js b/src/background/bytom.js
new file mode 100644 (file)
index 0000000..247cce7
--- /dev/null
@@ -0,0 +1,10 @@
+import Bytom from "bytom-js-sdk";
+
+let netWork = {
+  solonet: "http://52.82.24.155:3000/"
+};
+
+var bytom = new Bytom(netWork, chrome.runtime.getURL("wasm/main.wasm"));
+bytom.setNetType("solonet");
+
+export default bytom.sdk;
index 4c36cbb..9487bcc 100644 (file)
@@ -1,3 +1,66 @@
-import Bytom from "bytom-js-sdk";
+console.log("This is BACKGROUND page!");
 
-window.bytom = new Bytom("http://52.82.24.155:3000/", chrome.runtime.getURL("wasm/main.wasm"));
\ No newline at end of file
+import bytom from "./bytom";
+import account from "./account";
+import transaction from "./transaction";
+
+const ASSET_BTM =
+  "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
+
+var globalAccounts = [];
+
+function refreshBalances() {
+  globalAccounts.forEach(account => {
+    bytom.accounts.listAddressUseServer(account.guid).then(addresses => {
+      let balance = 0;
+      addresses.forEach(item => {
+        if (item.asset != null) {
+          item.asset.forEach(asset => {
+            if (asset.asset == ASSET_BTM) {
+              balance += asset.balance;
+            }
+          });
+        }
+      });
+
+      if (account.balance != balance) {
+        account.balance = balance / 100000000;
+      }
+    });
+  });
+}
+
+function refreshAccounts(success) {
+  bytom.accounts
+    .listAccountUseServer()
+    .then(accounts => {
+      console.log(accounts);
+      globalAccounts = accounts;
+      globalAccounts.forEach(account => {
+        if (account.balance == null) {
+          account.balance = 0;
+        }
+      });
+      success();
+    })
+    .catch(error => {
+      console.log(error);
+    });
+}
+refreshAccounts(refreshBalances);
+setInterval(refreshBalances, 10000);
+
+var bytomAccount = new account(bytom);
+var bytomTransaction = new transaction(bytom);
+bytomAccount.list = function() {
+  let retPromise = new Promise((resolve, reject) => {
+    refreshAccounts(() => {
+      refreshBalances();
+      resolve(globalAccounts);
+    });
+  });
+  return retPromise;
+};
+
+window.bytomAccount = bytomAccount;
+window.bytomTransaction = bytomTransaction;
diff --git a/src/background/transaction.js b/src/background/transaction.js
new file mode 100644 (file)
index 0000000..15d2f0d
--- /dev/null
@@ -0,0 +1,31 @@
+import bytom from "./bytom";
+
+function transaction(bytom) {
+  this.bytom = bytom;
+}
+
+transaction.prototype.list = function(guid, address) {
+  return this.bytom.transaction.list(guid, address);
+};
+
+transaction.prototype.transfer = function(guid, to, asset, amount, fee, password){
+    let retPromise = new Promise((resolve, reject) => {
+        this.bytom.transaction.buildPayment(guid, to, asset, Number(amount*100000000)).then(res => {
+            this.bytom.transaction.signTransaction(guid, JSON.stringify(res.data), password).then(ret => {
+                this.bytom.transaction.submitPayment(guid, ret.raw_transaction, ret.signatures).then(res3 => {
+                    resolve(res3);
+                }).catch(error => {
+                    reject(error);
+                });
+            }).catch(error => {
+                reject(error);
+            });
+        }).catch(error => {
+            reject(error);
+        });
+    })
+
+    return retPromise
+}
+
+export default transaction;
diff --git a/src/common/hotWords.js b/src/common/hotWords.js
deleted file mode 100644 (file)
index e463fd8..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-export default [
-    'bug',
-    '代码有毒',
-    '大佬',
-    'hentai',
-    '变态',
-    '40米',
-    '哈哈',
-    '嘿嘿',
-    '滑稽',
-    '原谅',
-    '喜欢',
-    '秋裤',
-    '盒子精',
-    '吃鸡',
-    '阿卡林',
-    '元旦快乐',
-    '新年快乐',
-    '康娜',
-    '赞',
-    '2b',
-    '正面上我',
-    'bilibili',
-    '胖次',
-    '飞机',
-    '哲学',
-    '鸡鸡',
-    '2233',
-    '233',
-    '蕾姆',
-    '拉姆',
-    'niconiconi',
-    '图样图森破',
-    '非战斗人员',
-    '天依',
-    '绅士',
-    '今天的风儿',
-    '战5渣',
-    '楼上',
-    '楼下',
-    '女装',
-    '吸猫',
-    '二次元',
-    '新吧唧',
-    'poi',
-    '提督',
-    '咸鱼',
-    '滴滴',
-    '老司机',
-    '香菜',
-    '金馆长',
-    '笑',
-    '机智',
-    '撩',
-    '套路',
-    '洪荒之力',
-    '傲娇',
-    '一言不合',
-    '百合',
-    '白学家',
-    '电学',
-    '白色相册',
-    '诚哥',
-    '本子',
-    '香蕉君',
-    '金坷垃',
-    '舰娘',
-    '圣杯',
-    '呆毛',
-    '咖喱棒',
-    '金闪闪',
-    '吃土',
-    '小目标',
-    'FFF团',
-    '友谊的小船',
-    '狗带',
-    '没想到你是这样的',
-    '懵逼',
-    '我好方',
-    '辣眼睛',
-    '猴赛雷',
-    '吓死宝宝了',
-    '宝宝',
-    '咋不上天',
-    '重要的事',
-    '城会玩',
-    'A4腰',
-    '城会玩',
-    '厉害了我的哥',
-    '感觉身体被掏空',
-    '互相伤害',
-    '北京瘫',
-    '葛优躺',
-    '一颗赛艇',
-    '因吹斯汀',
-    '醒醒',
-    '社会我',
-    '萝莉',
-    '御姐',
-    '正太',
-    'Loli',
-    '单身狗',
-    '逗比',
-    '坟头草',
-    '你开心',
-    '裤子都脱了',
-    '算我输',
-    '修仙',
-    '老哥稳',
-    '奶子',
-    '小姐姐',
-    '石乐志',
-    '皮皮虾我们走',
-    '我们走',
-    '小拳拳',
-    '把我的意大利'
-  ]
\ No newline at end of file
index e4ceac8..56cd2e0 100644 (file)
@@ -1,45 +1,45 @@
 module.exports = {
-  name: 'Vue Chrome Extension',
-  version: '1.0.0',
-  description: 'Vue.js Chrome Extension Template',
-  author: '',
+  name: "Bytom Wallet",
+  version: "1.0.0",
+  description: "Bytom Chrome Extension Wallet",
+  author: "yanbo,xuhongxing",
   manifest_version: 2,
   icons: {
-    '16': 'icons/main.png',
-    '48': 'icons/main.png',
-    '128': 'icons/main.png'
+    "16": "icons/logo.png",
+    "48": "icons/logo.png",
+    "128": "icons/logo.png"
   },
   permissions: [
-    '*://*/',
-    'storage',
-    'contextMenus',
-    'clipboardWrite',
-    'clipboardRead',
+    "*://*/",
+    "storage",
+    "contextMenus",
+    "clipboardWrite",
+    "clipboardRead",
     "background"
   ],
   browser_action: {
     default_icon: {
-      '19': 'icons/main.png',
-      '38': 'icons/main.png',
-      '128': 'icons/main.png'
+      "19": "icons/logo.png",
+      "38": "icons/logo.png",
+      "128": "icons/logo.png"
     },
-    default_title: "default title",
+    default_title: "Bytom Wallet",
     default_popup: "pages/popup.html"
   },
   background: {
-    persistent: false,
-    scripts: ['js/background.js']
+    persistent: true,
+    scripts: ["js/background.js"]
   },
   // devtools_page: 'pages/devtools.html',
-  options_page: 'pages/options.html',
+  options_page: "pages/options.html",
   content_scripts: [
     {
-      js: ['js/inject.js'],
-      run_at: 'document_end',
-      matches: ['<all_urls>'],
+      js: ["js/inject.js"],
+      run_at: "document_end",
+      matches: ["<all_urls>"],
       all_frames: false
     }
   ],
   content_security_policy: "script-src 'self' 'unsafe-eval'; object-src 'self'",
-  web_accessible_resources: ['js/content.js', 'wasm/main.wasm']
-}
+  web_accessible_resources: ["js/content.js", "wasm/main.wasm"]
+};
index be0030c..fb30cff 100644 (file)
@@ -1,8 +1,8 @@
 <template>
   <section id="app">
     <transition-group name="panels" tag="div" class="app-wrapper">
-      <Login class="view" key="login" v-show="view.login" @succ="currView='home'"></Login>
-      <Home class="view" key="home" v-show="view.home"></Home>
+      <Login class="view" key="login" v-show="view.login" @succ="loadAccounts"></Login>
+      <Home ref="Home" class="view" key="home" v-show="view.home"></Home>
     </transition-group>
   </section>
 </template>
@@ -10,8 +10,7 @@
 <script>
 import Home from "./framework/home";
 import Login from "./framework/login";
-
-import Bytom from "bytom-js-sdk";
+import bytom from "./script/bytom";
 
 export default {
   components: {
@@ -32,8 +31,15 @@ export default {
       };
     }
   },
-  methods: {},
+  methods: {
+    loadAccounts: function() {
+      bytom.Account.list().then(accounts => {
+        this.currView = accounts.length > 0 ? "home" : "login";
+      });
+    }
+  },
   mounted() {
+    this.loadAccounts();
   }
 };
 </script>
\ No newline at end of file
diff --git a/src/popup/components/spin/index.js b/src/popup/components/spin/index.js
new file mode 100644 (file)
index 0000000..ffba3c7
--- /dev/null
@@ -0,0 +1,33 @@
+import Spin from './spin.js';
+
+let spinInstance;
+
+function getSpinInstance (render = undefined) {
+    spinInstance = spinInstance || Spin.newInstance({
+        render: render
+    });
+
+    return spinInstance;
+}
+
+function loading (options) {
+    const render = ('render' in options) ? options.render : undefined;
+    let instance  = getSpinInstance(render);
+
+    instance.show(options);
+}
+
+Spin.show = function (props = {}) {
+    return loading(props);
+};
+Spin.hide = function () {
+    if (!spinInstance) return false;
+
+    const instance = getSpinInstance();
+
+    instance.remove(() => {
+        spinInstance = null;
+    });
+};
+
+export default Spin;
\ No newline at end of file
diff --git a/src/popup/components/spin/spin.js b/src/popup/components/spin/spin.js
new file mode 100644 (file)
index 0000000..940c865
--- /dev/null
@@ -0,0 +1,61 @@
+import Vue from 'vue';
+import Spin from './spin.vue';
+
+Spin.newInstance = properties => {
+    const _props = properties || {};
+
+    const Instance = new Vue({
+        data: Object.assign({}, _props, {
+
+        }),
+        render (h) {
+            let vnode = '';
+            if (this.render) {
+                vnode = h(Spin, {
+                    props: {
+                        fix: true,
+                        fullscreen: true
+                    }
+                }, [this.render(h)]);
+            } else {
+                vnode = h(Spin, {
+                    props: {
+                        size: 'large',
+                        fix: true,
+                        fullscreen: true
+                    }
+                });
+            }
+            return h('div', {
+                'class': 'ivu-spin-fullscreen ivu-spin-fullscreen-wrapper',
+                'style': {
+                    'z-index': 999999
+                }
+            }, [vnode]);
+        }
+    });
+
+    const component = Instance.$mount();
+    document.body.appendChild(component.$el);
+    const spin = Instance.$children[0];
+
+    return {
+        show () {
+            spin.visible = true;
+            // tIndex = handleGetIndex();
+        },
+        remove (cb) {
+            spin.visible = false;
+            setTimeout(function() {
+                spin.$parent.$destroy();
+                if (document.getElementsByClassName('ivu-spin-fullscreen')[0] !== undefined) {
+                    document.body.removeChild(document.getElementsByClassName('ivu-spin-fullscreen')[0]);
+                }
+                cb();
+            }, 500);
+        },
+        component: spin
+    };
+};
+
+export default Spin;
\ No newline at end of file
diff --git a/src/popup/components/spin/spin.vue b/src/popup/components/spin/spin.vue
new file mode 100644 (file)
index 0000000..10a69eb
--- /dev/null
@@ -0,0 +1,98 @@
+<style>
+.ivu-spin-fullscreen-wrapper {
+  position: fixed;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  background-color: rgba(255, 255, 255, 0.7);
+}
+</style>
+
+<template>
+    <transition name="fade">
+        <div :class="classes" v-if="fullscreenVisible">
+            <div :class="mainClasses">
+                <span :class="dotClasses"></span>
+                <div :class="textClasses"><slot></slot></div>
+            </div>
+        </div>
+    </transition>
+</template>
+<script>
+// import { oneOf } from '../../utils/assist';
+// import ScrollbarMixins from '../modal/mixins-scrollbar';
+const prefixCls = "ivu-spin";
+export default {
+  name: "Spin",
+  // mixins: [ ScrollbarMixins ],
+  props: {
+    size: {
+      //     validator (value) {
+      //         return oneOf(value, ['small', 'large', 'default']);
+      //     },
+      default() {
+        return !this.$IVIEW || this.$IVIEW.size === ""
+          ? "default"
+          : this.$IVIEW.size;
+      }
+    },
+    fix: {
+      type: Boolean,
+      default: false
+    },
+    fullscreen: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      showText: false,
+      // used for $Spin
+      visible: false
+    };
+  },
+  computed: {
+    classes() {
+      return [
+        `${prefixCls}`,
+        {
+          [`${prefixCls}-${this.size}`]: !!this.size,
+          [`${prefixCls}-fix`]: this.fix,
+          [`${prefixCls}-show-text`]: this.showText,
+          [`${prefixCls}-fullscreen`]: this.fullscreen
+        }
+      ];
+    },
+    mainClasses() {
+      return `${prefixCls}-main`;
+    },
+    dotClasses() {
+      return `${prefixCls}-dot`;
+    },
+    textClasses() {
+      return `${prefixCls}-text`;
+    },
+    fullscreenVisible() {
+      if (this.fullscreen) {
+        return this.visible;
+      } else {
+        return true;
+      }
+    }
+  },
+  watch: {
+    visible(val) {
+      // if (val) {
+      //     this.addScrollEffect();
+      // } else {
+      //     this.removeScrollEffect();
+      // }
+    }
+  },
+  mounted() {
+    this.showText = this.$slots.default !== undefined;
+  }
+};
+</script>
\ No newline at end of file
index c9b4801..d0e61ef 100644 (file)
@@ -3,7 +3,7 @@
 </style>
 
 <template>
-    <div class="warp">
+    <div class="warp bg-gray">
         <section class="login-header bg-green">
             <img src="../../../../assets/logo.png">
         </section>
             <h4>创建账户</h4>
             <div class="form">
                 <div class="form-item">
-                    <label for="">选择网络</label>
-                    <select name="" id="">
-                        <option value="BYTOM主网络">BYTOM主网络</option>
-                        <option value="BYTOM测试网络">BYTOM测试网络</option>
-                    </select>
+                    <label class="form-item-label">选择网络</label>
+                    <div class="form-item-content" style="margin-left: 60px;">
+                        <select name="" id="">
+                            <option value="BYTOM私有网络">BYTOM私有网络</option>
+                            <!-- <option value="BYTOM主网络">BYTOM主网络</option> -->
+                            <!-- <option value="BYTOM测试网络">BYTOM测试网络</option> -->
+                        </select>
+                    </div>
                 </div>
                 <div class="form-item">
-                    <label for="">账户别名</label>
-                    <input type="text">
+                    <label class="form-item-label">账户别名</label>
+                    <div class="form-item-content" style="margin-left: 60px;">
+                        <input type="text" v-model="formItem.accAlias" autofocus>
+                    </div>
                 </div>
                 <div class="form-item">
-                    <label for="">密钥别名</label>
-                    <input type="text">
+                    <label class="form-item-label">密钥别名</label>
+                    <div class="form-item-content" style="margin-left: 60px;">
+                        <input type="text" v-model="formItem.keyAlias">
+                    </div>
                 </div>
                 <div class="form-item">
-                    <label for="">密码</label>
-                    <input type="password">
+                    <label class="form-item-label">密钥密码</label>
+                    <div class="form-item-content" style="margin-left: 60px;">
+                        <input type="password" v-model="formItem.passwd1">
+                    </div>
                 </div>
                 <div class="form-item">
-                    <label for="">重复密码</label>
-                    <input type="password">
+                    <label class="form-item-label">重复密码</label>
+                    <div class="form-item-content" style="margin-left: 60px;">
+                        <input type="password" v-model="formItem.passwd2">
+                    </div>
                 </div>
                 <div class="btn-group">
                     <div class="btn bg-green" @click="create">创建账户</div>
 </template>
 
 <script>
+import bytom from "../../../script/bytom";
 export default {
   name: "",
   data() {
     return {
-      formData: {}
+      formItem: {}
     };
   },
   methods: {
     create: function() {
-      console.log(this.formData);
-      //todo call api
+      if (this.formItem.passwd1 != this.formItem.passwd2) {
+        this.tips = "两次密码不一致,请检查后再试。";
+        return;
+      }
 
-      //temp
-      this.$emit('success')
+      bytom.Account.create(
+        this.formItem.accAlias,
+        this.formItem.keyAlias,
+        this.formItem.passwd1
+      )
+        .then(res => {
+          console.log(111, res);
+
+        //   this.$emit("success");
+          window.location.reload();
+          this.formItem = {};
+        })
+        .catch(err => {
+          console.log(err);
+          alert(err);
+        });
     },
     recover: function() {
       this.$emit("next");
     }
+  },
+  mounted() {
+    console.log(21);
   }
 };
 </script>
\ No newline at end of file
index 7b991cb..8188a31 100644 (file)
@@ -2,7 +2,7 @@
 </style>
 
 <template>
-    <div class="warp">
+    <div class="warp bg-gray">
         <section class="login-header bg-green">
             <img src="../../../../assets/logo.png">
         </section>
             <h4>从种子导入</h4>
             <div class="form">
                 <div class="form-item">
-                    <label for="">选择网络</label>
-                    <select name="" id="">
-                        <option value="BYTOM主网络">BYTOM主网络</option>
-                        <option value="BYTOM测试网络">BYTOM测试网络</option>
-                    </select>
-                </div>
-                <div class="form-item">
-                    <input type="file">
+                    <label class="form-item-label">备份文件</label>
+                    <div class="form-item-content" style="margin-left: 60px;">
+                      <input type="file" @change="tirggerFile($event)">
+                    </div>
                 </div>
                 <div class="btn-group">
-                    <div class="btn bg-green" @click="recovery">从种子导入</div>
+                    <div class="btn bg-green" @click="recovery">导入</div>
                     <div class="btn bg-red" @click="back">返回</div>
                 </div>
             </div>
@@ -29,6 +25,7 @@
 </template>
 
 <script>
+import bytom from "../../../script/bytom";
 export default {
   name: "",
   data() {
@@ -37,9 +34,25 @@ export default {
     };
   },
   methods: {
+    tirggerFile: function(event) {
+      var reader = new FileReader();
+      reader.onload = e => {
+        this.fileTxt = e.target.result;
+      };
+
+      var file = event.target.files[0];
+      reader.readAsText(file);
+    },
     recovery: function() {
-      console.log(this.formData);
-      //todo call api
+      bytom.Account.restore(this.fileTxt)
+        .then(res => {
+          console.log(111, res);
+          // this.$emit("success");
+          window.location.reload();
+        })
+        .catch(error => {
+          alert(error);
+        });
     },
     back: function() {
       this.$emit("back");
index 63c04bd..4fea146 100644 (file)
@@ -8,7 +8,7 @@
 }
 </style>
 <template>
-    <div class="warp">
+    <div class="warp bg-gray">
         <section class="login-header bg-green">
             <img src="../../../../assets/logo.png">
         </section>
index 864e00f..d4984ba 100644 (file)
   right: 0;
   padding: 40px;
 }
-
+.account-list {
+  width: 100%;
+  height: 230px;
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+.account-list::-webkit-scrollbar {
+  display: none;
+}
 .account-list ul {
   margin-top: 30px;
 }
@@ -42,7 +50,7 @@ ul {
 }
 ul li {
   display: flex;
-  padding: 5px;
+  padding: 5px 0;
 }
 li i {
   margin: 0 8px;
@@ -54,6 +62,12 @@ li.active {
   border-radius: 8px;
   cursor: pointer;
 }
+.acc-alias {
+  width: 150px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
 </style>
 
 <template>
@@ -64,35 +78,26 @@ li.active {
     </section>
     <section class="account-list">
       <ul>
-        <li class="active">
-            <i class="iconfont icon-user"></i>
-            <div>
-                <p>账号1</p>
-                <p>1000 BTM</p>
-            </div>
-        </li>
-        <li>
-            <i class="iconfont icon-user"></i>
-            <div>
-                <p>账号2</p>
-                <p>200 BTM</p>
-            </div>
-        </li>
-        <li>
-            <i class="iconfont icon-user"></i>
-            <div>
-                <p>账号3</p>
-                <p>0 BTM</p>
-            </div>
-        </li>
+        <!--  class="active" -->
+        <div v-for="(account, index) in accounts">
+            <li :class="(currentAccount != undefined && account.address == currentAccount.address) ? 'active': ''" @click="accountSelected(account)">
+              <i class="iconfont icon-user"></i>
+              <div>
+                  <p v-if="account.alias" class="acc-alias">{{account.alias}}</p>
+                  <p v-else>账户{{index+1}}</p>
+                  <p>{{account.balance}} BTM</p>
+              </div>
+          </li>
+        </div>
+        
       </ul>
     </section>
     <hr>
     <section class="menu-list">
         <ul>
             <li @click="currView='creation'"><i class="iconfont icon-plusbox"></i>创建账户</li>
-            <li @click="currView='recovery'"><i class="iconfont icon-import"></i>导入账号</li>
-            <li @click="currView='backup'"><i class="iconfont icon-backup"></i>备份种子</li>
+            <!-- <li @click="currView='recovery'"><i class="iconfont icon-import"></i>导入账号</li> -->
+            <li @click="currView='backup'"><i class="iconfont icon-backup"></i>备份</li>
             <li @click="currView='help'"><i class="iconfont icon-help"></i>帮助</li>
             <li @click="currView='settings'"><i class="iconfont icon-settings"></i>设置</li>
         </ul>
@@ -115,6 +120,7 @@ import Recovery from "./page/recovery";
 import Bakcup from "./page/backup";
 import Help from "./page/help";
 import Settings from "./page/settings";
+import bytom from "../../../script/bytom";
 export default {
   name: "",
   components: {
@@ -126,7 +132,9 @@ export default {
   },
   data() {
     return {
-      currView: ""
+      currView: "",
+      accounts: [],
+      currentAccount: ""
     };
   },
   computed: {
@@ -141,10 +149,37 @@ export default {
       };
     }
   },
+  watch: {
+    currView: function() {
+      if (this.currView == "" || this.accounts.length == 0) {
+        this.refresh();
+      }
+    }
+  },
   methods: {
     close: function() {
       this.$emit("closed");
+    },
+    accountSelected: function(accountInfo) {
+      this.currentAccount = accountInfo;
+      this.$emit("account-change", this.currentAccount);
+      this.close();
+    },
+    refresh: function(accountInfo) {
+      bytom.Account.list().then(accounts => {
+        console.log(222, accounts);
+        if (accounts.length == 0) {
+          return;
+        }
+
+        this.accounts = accounts;
+        this.currentAccount = accounts[0];
+        this.$emit("account-change", this.currentAccount);
+      });
     }
+  },
+  mounted() {
+    this.refresh();
   }
 };
 </script>
\ No newline at end of file
index 28c5fc1..3cca294 100644 (file)
             <h3>备份种子</h3>
         </section>
         <section class="content">
-          <div class="btn bg-green">备份</div>
+          <div class="btn bg-green" @click="backup">备份</div>
         </section>
     </div>
 </template>
 
 <script>
+import bytom from "../../../../script/bytom";
+import FileSaver from "file-saver";
 export default {
   name: "",
   data() {
@@ -26,6 +28,14 @@ export default {
   methods: {
     close: function() {
       this.$emit("closed", "");
+    },
+    backup() {
+      bytom.Account.backup().then(txt => {
+        var blob = new Blob([txt], {
+          type: "text/plain;charset=utf-8"
+        });
+        FileSaver.saveAs(blob, "bytom_chrome_wallet_backup.txt");
+      });
     }
   }
 };
index 2b978c8..5f6200d 100644 (file)
@@ -1,8 +1,8 @@
 <style scoped>
-.form{
+.form {
   margin: 50px 0;
 }
-.form-item .btn{
+.form-item .btn {
   margin-top: 15px;
 }
 </style>
         </section>
         <section class="form">
           <div class="form-item">
-            <label for="">账户别名</label>
-            <input type="text">
+            <label class="form-item-label">账户别名</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <input type="text" v-model="formItem.accAlias">
+            </div>
           </div>
           <div class="form-item">
-            <label for="">密钥别名</label>
-            <input type="text">
+            <label class="form-item-label">密钥别名</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <input type="text" v-model="formItem.keyAlias">
+            </div>
           </div>
           <div class="form-item">
-            <label for="">密码</label>
-            <input type="password">
+            <label class="form-item-label">密钥密码</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <input type="password" v-model="formItem.passwd1">
+            </div>
           </div>
           <div class="form-item">
-            <label for="">重复密码</label>
-            <input type="password">
+            <label class="form-item-label">重复密码</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <input type="password" v-model="formItem.passwd2">
+            </div>
           </div>
+          <div class="tips">{{tips}}</div>
           <div class="form-item bg-gray">
             <div class="btn bg-green" @click="create">创建账户</div>
           </div>
 </template>
 
 <script>
+import bytom from "../../../../script/bytom";
 export default {
   name: "",
+  components: {},
   data() {
-    return {};
+    return {
+      formItem: {
+        accAlias: "",
+        keyAlias: "",
+        passwd1: "",
+        passwd2: ""
+      },
+      tips: ""
+    };
   },
   methods: {
     close: function() {
       this.$emit("closed", "");
     },
     create: function() {
-      
+      if (this.formItem.passwd1 != this.formItem.passwd2) {
+        this.tips = "两次密码不一致,请检查后再试";
+        return;
+      }
+
+      bytom.Account.create(
+        this.formItem.accAlias,
+        this.formItem.keyAlias,
+        this.formItem.passwd1
+      )
+        .then(res => {
+          this.close();
+          console.log(res);
+          this.formItem = {};
+        })
+        .catch(err => {
+          console.log(err);
+          alert(err)
+          // this.tips = err.message;
+        });
     }
-  }
+  },
+  mounted() {}
 };
 </script>
\ No newline at end of file
index 3a8217b..91248ad 100644 (file)
@@ -1,7 +1,10 @@
 <style scoped>
-.body{
+.body {
   padding: 20px 15px;
 }
+input {
+  width: 165px;
+}
 </style>
 
 <template>
@@ -12,7 +15,7 @@
         </section>
         <section class="body">
           <div class="form-item">
-              <input type="file">
+              <input type="file" ref="file" @change="tirggerFile($event)">
           </div>
           <div class="btn bg-green" @click="recovery">从种子导入</div>
         </section> 
 </template>
 
 <script>
+import bytom from "../../../../script/bytom";
 export default {
   name: "",
   data() {
-    return {};
+    return {
+      fileTxt: ""
+    };
   },
   methods: {
     close: function() {
-      this.$emit("closed", '');
+      this.$emit("closed", "");
+    },
+    tirggerFile: function(event) {
+      var reader = new FileReader();
+      reader.onload = e => {
+        this.fileTxt = e.target.result;
+      };
+
+      var file = event.target.files[0];
+      reader.readAsText(file);
     },
     recovery: function() {
-      
+      bytom
+        .restore(this.fileTxt)
+        .then(res => {
+          this.close();
+          console.log(res);
+        })
+        .catch(error => {
+          alert(error);
+        });
     }
   }
 };
index 20be790..63d00c6 100644 (file)
@@ -1,14 +1,14 @@
 <style scoped>
 .warp {
-  width: 200px;
-  margin: 175px auto;
+  width: 220px;
+  height: 200px;
+  margin: 128px auto;
   border-radius: 5px;
   text-align: center;
   padding: 30px;
 }
-img {
-  width: 150px;
-  height: 150px;
+#qrcode {
+  display: inline-block;
 }
 p {
   word-wrap: break-word;
@@ -20,28 +20,46 @@ p {
         enter-active-class="animated zoomIn faster" 
         leave-active-class="animated zoomOut faster">
         <div v-show="show" class="warp bg-gray">
-            <i class="iconfont btn-close" @click="show=false">&#xe605;</i>
-            <img src="">
-            <p>bm1qsgherfsdfdsadfsdfdsfasdfdsdfsafajkjwe2dz8uny</p>
+            <i class="iconfont btn-close" @click="close">&#xe605;</i>
+            <div id="qrcode"></div>
+            <p>{{addr}}</p>
         </div>
     </transition>
 </template>
 
 <script>
+import QRCode from "qrcodejs2";
 export default {
   name: "",
-  props: {
-    addr: "111"
-  },
+  props: {},
   data() {
     return {
-      show: false
+      show: false,
+      addr: "111",
+      qrcode: Object
     };
   },
   methods: {
-    open: function() {
+    open: function(address) {
       this.show = true;
+      this.addr = address;
+
+      // 使用 API
+      this.qrcode.clear();
+      this.qrcode.makeCode("new content");
+    },
+    close: function() {
+      this.show = false;
     }
+  },
+  mounted() {
+    this.qrcode = new QRCode("qrcode", {
+      width: 150,
+      height: 150,
+      colorDark: "#000000",
+      colorLight: "#ffffff",
+      correctLevel: QRCode.CorrectLevel.H
+    });
   }
 };
 </script>
\ No newline at end of file
index 2e6b95d..3ff1ea6 100644 (file)
@@ -12,9 +12,9 @@
 }
 .balance {
   display: flex;
-  width: 350px;
-  padding-left: 75px;
-  padding-top: 30px;
+  position: absolute;
+  right: 0px;
+  margin: 30px 50px;
 }
 .balance .token-icon {
   height: 30px;
@@ -28,6 +28,7 @@
 }
 .balance span {
   line-height: 42px;
+  margin-left: 3px;
 }
 .mask {
   z-index: 3 !important;
@@ -70,8 +71,8 @@
             <div class="balance">
               <img src="../../../../assets/logo.png" class="token-icon">
               <div style="display: flex">
-                <h1>3000000</h1>
-                <span>BTM</span>
+                <h1>{{balance}}</h1>
+                <span> BTM</span>
               </div>
             </div>
         </section>
         <section class="form">
           <div class="form-item-group">
             <div class="form-item">
-              <select placeholder="账户">
-                <option value="">账户1</option>
+              <!-- <label>账户</label> -->
+              <select v-model="transaction.guid">
+                <option v-for="account in accounts" :value="account.guid">{{account.alias != null ? account.alias : '账户1'}}</option>
               </select>
             </div>
             <div class="form-item" style="margin-left: 20px;">
-              <select placeholder="资产">
-                <option value="">BTM</option>
+              <!-- <label>资产</label> -->
+              <select v-model="transaction.asset">
+                <option value="ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff">BTM</option>
               </select>
             </div>
           </div>
           <div class="form-item">
-            <label for="">地址</label>
-            <input type="text">
+            <label class="form-item-label">地址</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <input type="text" v-model="transaction.to">
+            </div>
           </div>
           <div class="form-item">
-            <label for="">数量</label>
-            <input type="text">
-            <span>单位</span>
+            <label class="form-item-label">数量</label>
+            <div class="form-item-content" style="margin-left: 60px; display: flex;">
+              <input type="text" v-model="transaction.amount">
+              <span style="width: 30px;">{{unit}}</span>
+            </div>
           </div>
-          <div class="form-item">
+          <!-- <div class="form-item">
             <label for="">≈</label>
-            <input type="text">
+            <input type="text" disabled>
             <span>CNY</span>
-          </div>
+          </div> -->
           <div class="form-item">
-            <label for="">矿工费用</label>
-            <select>
-              <option value=""></option>
-            </select>
+            <label class="form-item-label">矿工费用</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <select v-model="transaction.fee">
+                <option value="">标准</option>
+              </select>
+            </div>
           </div>
           <br>
           <div class="form-item">
-            <label for="">交易密码</label>
-            <input type="password">
+            <label class="form-item-label">交易密码</label>
+            <div class="form-item-content" style="margin-left: 60px;">
+              <input type="password" v-model="transaction.passwd">
+            </div>
           </div>
           <div class="btn-group">
             <div class="btn bg-green" @click="confirmOpen">发送交易</div>
         leave-active-class="animated slideOutDown faster">
         <div v-show="confirmShow" class="confirm form bg-gray">
             <div class="form-item">
-              <label for="">密码确认</label>
-              <input type="password">
+              <label class="form-item-label">密码确认</label>
+              <div class="form-item-content" style="margin-left: 60px;">
+                <input type="password" v-model="confirmPasssword" autofocus>
+              </div>
             </div>
             <div class="btn-group btn-inline">
-              <div class="btn bg-green">确认发送</div>
+              <div class="btn bg-green" @click="confirmTransfer">确认发送</div>
               <div class="btn bg-red" @click="confirmClose">取消发送</div>
             </div>
         </div>
 </template>
 
 <script>
+import bytom from "../../../script/bytom";
 export default {
   name: "",
   data() {
+    const ASSET_BTM =
+      "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff";
     return {
       show: false,
       maskShow: false,
-      confirmShow: false
+      confirmShow: false,
+      balance: 0,
+      accounts: [],
+      unit: "单位",
+      confirmPasssword: "",
+      assets: {
+        ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff: "BTM"
+      },
+      transaction: {
+        guid: "",
+        to: "",
+        asset: ASSET_BTM,
+        amount: 0,
+        fee: "",
+        passwd: ""
+      }
     };
   },
   methods: {
-    open: function() {
+    open: function(accountInfo) {
       this.show = true;
+
+      bytom.Account.list().then(accounts => {
+        this.accounts = accounts;
+      });
+
+      this.balance = accountInfo.balance;
+      this.transaction.guid = accountInfo.guid;
+      this.unit = this.assets[this.transaction.asset];
+    },
+    close: function() {
+      this.show = false;
     },
     confirmOpen: function() {
       this.maskShow = true;
@@ -159,6 +201,35 @@ export default {
     confirmClose: function() {
       this.confirmShow = false;
       this.maskShow = false;
+    },
+    confirmTransfer: function() {
+      if (this.confirmPasssword != this.transaction.passwd) {
+        alert("密码不一致");
+        return;
+      }
+      // guid, to, asset, amount, fee, password
+      bytom.Transaction.transfer(
+        this.transaction.guid,
+        this.transaction.to,
+        this.transaction.asset,
+        this.transaction.amount,
+        this.transaction.fee,
+        this.transaction.passwd
+      )
+        .then(ret => {
+          console.log(ret);
+
+          this.close();
+          this.confirmClose();
+          this.$emit("on-success");
+          this.confirmPasssword = "";
+          this.transaction.passwd = "";
+        })
+        .catch(error => {
+          alert(error);
+          this.transaction.passwd = "";
+          this.confirmPasssword = "";
+        });
     }
   }
 };
index 71af5a7..9fd5df8 100644 (file)
 }
 .account .btn-toggle {
   float: right;
-  margin-top: 22px;
+  margin-top: 15px;
   margin-right: 20px;
   border: 2px solid #fff;
   border-radius: 18px;
   padding: 0 10px;
   font-size: 14px;
 }
+.account .alias {
+  height: 25px;
+}
 .account span {
   display: block;
   padding-top: 20px;
   color: #cacaca;
 }
 .transactions .list {
-  padding: 0 20px;
+  padding: 0 10px;
 }
 .list-item {
   display: flex;
+  padding: 5px 10px;
   border-bottom: 1px solid #5e5e5e;
 }
 
               <option value="">BYTOM测试网络</option>
             </select>
           </span>
-          <span>账户1aaadfddssdsd</span>
+          <span class="alias">{{accountInfo.alias}}</span>
       </div>
       <div class="row balance">
           <img src="../../assets/logo.png" class="token-icon">
           <div class="amount">
-              <div class="token-amount">100.123 BTM</div>
-              <p class="account-address">bm1qsgh.....2dz8uny<i class="iconfont qrcode" @click="showQrcode">&#xe7dd;</i></p>
+              <div class="token-amount">{{accountInfo.balance}} BTM</div>
+              <p class="account-address">{{accountInfo.address_short}}<i class="iconfont qrcode" @click="showQrcode">&#xe7dd;</i></p>
           </div>
           <a href="#" class="btn btn-primary btn-transfer" @click="transferOpen">转账</a>
       </div>
     <section class="transactions">
       <h3 class="color-gray">交易记录</h3>
       <ul class="list">
-        <li class="list-item">
-            <div>
-              <div class="time">2018-08-22</div>
-              <div class="addr">bm1qsg...8uny</div>
-            </div>
-            <div class="value">+2344 BTM</div>
-        </li>
-        <li class="list-item">
+        <li class="list-item" v-for="(transcation, index) in latestTranscations" v-if="index < 4">
             <div>
-              <div class="time">2018-08-22</div>
-              <div class="addr">bm1qsg...8uny</div>
+              <div class="time">{{transcation.timestamp | moment}}</div>
+              <div class="addr">{{transcation.address}}</div>
             </div>
-            <div class="value">-1234 BTM</div>
+            <div class="value">{{transcation.direct}} {{transcation.val}} BTM</div>
         </li>
+        <span v-else style="width: 22px; margin: 0px auto; font-weight: bold; font-size: 22px;">...</span>
       </ul>
     </section>
 
         enter-active-class="animated slideInLeft faster" 
         leave-active-class="animated slideOutLeft faster" 
         v-on:after-leave="afterLeave">
-        <Menu v-show="menuOpen" @closed="menuOpen=false"></Menu>
+        <Menu v-show="menuOpen" @closed="menuOpen=false" @account-change="selectedAccountChange"></Menu>
     </transition>
     
     <Qrcode ref="qrcode"></Qrcode>
-    <Transfer ref="transfer"></Transfer>
+    <Transfer ref="transfer" @on-success="refreshTransactions"></Transfer>
 
   </div>
 </template>
@@ -154,6 +152,7 @@ import Qrcode from "./components/trans/qrcode";
 import Transfer from "./components/trans/transfer";
 import TransList from "./components/trans/trans-list";
 import TransDetail from "./components/trans/trans-detail";
+import bytom from "../script/bytom";
 export default {
   name: "",
   components: {
@@ -165,67 +164,94 @@ export default {
   data() {
     return {
       menuOpen: false,
-      maskOpen: false
+      maskOpen: false,
+      accountInfo: {},
+      latestTranscations: []
     };
   },
   methods: {
     openMenu: function() {
       this.maskOpen = true;
       this.menuOpen = true;
+      this.$refs.qrcode.close();
+    },
+    shortAddress(address) {
+      return (
+        address.substr(0, 7) + "..." + address.substr(address.length - 7, 7)
+      );
+    },
+    selectedAccountChange: function(accountInfo) {
+      console.log(accountInfo);
+
+      this.accountInfo = accountInfo;
+      this.accountInfo.address_short = this.shortAddress(
+        this.accountInfo.address
+      );
+      this.refreshTransactions();
     },
     afterLeave: function() {
       this.maskOpen = false;
     },
     showQrcode: function() {
-      this.$refs.qrcode.open();
+      this.$refs.qrcode.open(this.accountInfo.address);
     },
     transferOpen: function() {
-      this.$refs.transfer.open();
+      this.$refs.transfer.open(this.accountInfo);
+    },
+    refreshTransactions: function() {
+      bytom.Transaction.list(
+        this.accountInfo.guid,
+        this.accountInfo.address
+      ).then(ret => {
+        let transactions = ret.data.transactions;
+        if (transactions == null) {
+          this.latestTranscations = [];
+          return;
+        }
+
+        transactions.forEach(transaction => {
+          let inputSum = 0;
+          let outoutSum = 0;
+          let inputAddresses = [],
+            outputAddresses = [];
+          transaction.inputs.forEach(input => {
+            if (input.address == this.accountInfo.address) {
+              inputSum += input.amount;
+              return;
+            }
+
+            inputAddresses.push(input.address);
+          });
+
+          transaction.outputs.forEach(output => {
+            if (output.address == this.accountInfo.address) {
+              outoutSum += output.amount;
+              return;
+            }
+
+            outputAddresses.push(output.address);
+          });
+          console.log(112, inputAddresses, outputAddresses);
+
+          let val = outoutSum - inputSum;
+          if (val > 0) {
+            transaction.direct = "+";
+            transaction.address = this.shortAddress(inputAddresses.pop());
+          } else {
+            val = inputSum - outoutSum;
+            transaction.direct = "-";
+            transaction.address = this.shortAddress(outputAddresses.pop());
+          }
+          transaction.val = Number(val / 100000000).toFixed(8);
+          // console.log(111, transaction, val);
+        });
+        console.log(transactions);
+        this.latestTranscations = transactions;
+      });
     }
   },
   mounted() {
-    // this.openMenu()
-    chrome.runtime.getBackgroundPage(function(bg){
-      let testxpub = "9eb5c5ccc86bd16661c2b32b60f5a43a1a955a73f1de5b441ef8dfe8263e6b806dac0d28bcbc2225fb7bba0a1722e2944b7d190d57a7913821c7fe6eb0b0ca36";
-      // let oldpass = "123456";
-      // let newpass = "123456";
-      // bg.bytom.sdk.keys.resetKeyPassword(testxpub, oldpass, newpass)
-      // .then(res => {
-      //   console.log(res);
-      // }).catch(error => {
-      //   console.log(error)
-      // })
-      // bg.bytom.sdk.keys.getKeyByXPub("6c1fed22cd2da6017bb417fb82ad8467a76db7b1f6ea11b4227e8673745d70a406cad6fbcd0b688e13724b2be675f1535a3c0efe042dd59b10001e9aa49cff73").then(res => {
-      //   console.log(res);
-      // }).catch(error => {
-      //   console.log(error);
-      // })
-      // bg.bytom.sdk.keys.create("test666", "123456").then((res)=>{
-      //   console.log(res)
-      // }).catch(error => {
-      //   console.log(error)
-      // });
-      // bg.bytom.sdk.accounts.createAccount("test6", 1, testxpub).then(res => {
-      //   console.log(res)
-      //   bg.bytom.sdk.accounts.createAccountReceiver(res).then(r => {
-      //     console.log(r);
-      //   }).catch(e => {
-      //     console.log(e);
-      //   })
-      // }).catch(error => {
-      //   console.log(error)
-      // });
-      // bg.bytom.sdk.accounts.createAccountUseServer(testxpub).then(res => {
-      //   console.log(res)
-      // }).catch(error => {
-      //   console.log(error)
-      // });
-      bg.bytom.sdk.accounts.createAccountReceiverUseServer("c69ce8ec-af7d-4e3d-9285-b1ee10288094").then(res => {
-        console.log(res)
-      }).catch(error => {
-        console.log(error)
-      });
-    });
+    this.refreshTransactions();
   }
 };
 </script>
\ No newline at end of file
index 958d2bf..324f4d1 100644 (file)
@@ -4,6 +4,7 @@
   top: 0;
   left: 0;
   right: 0;
+  height: 100%;
 }
 .login-header {
   height: 60px;
@@ -33,7 +34,7 @@
       <Welcome class="view" key="welcome" v-show="view.welcome" @next="currView='protocol'"></Welcome>
       <Protocol class="view" key="protocol" v-show="view.protocol" @next="currView='formAddon'"></Protocol>
       <FormAddon class="view" key="formAddon" v-show="view.formAddon" @next="currView='formRecover'" @success="loadHome"></FormAddon>
-      <FormRecover class="view" key="formRecover" v-show="view.formRecover" @back="currView='formAddon'"></FormRecover>
+      <FormRecover class="view" key="formRecover" v-show="view.formRecover" @back="currView='formAddon'" @success="loadHome"></FormRecover>
     </transition-group>
   </section>
 </template>
index 6fb62f8..159be35 100644 (file)
@@ -1,7 +1,15 @@
 import Vue from "vue";
+import Spin from "./components/spin";
 import App from "./App.vue";
+import moment from "moment";
 import "../assets/style.css";
 
+Vue.prototype.$Spin = Spin;
+Vue.filter("moment", function(value, formatString) {
+  formatString = formatString || "YYYY-MM-DD HH:mm:ss";
+  return moment(value * 1000).format(formatString);
+});
+
 new Vue({
   el: "#app",
   render: h => h(App)
diff --git a/src/popup/script/bytom.js b/src/popup/script/bytom.js
new file mode 100644 (file)
index 0000000..376b1ac
--- /dev/null
@@ -0,0 +1,8 @@
+let bytom = {};
+
+var bg = chrome.extension.getBackgroundPage();
+
+bytom.Account = bg.bytomAccount;
+bytom.Transaction = bg.bytomTransaction;
+
+export default bytom;
\ No newline at end of file
diff --git a/static/icons/logo.png b/static/icons/logo.png
new file mode 100755 (executable)
index 0000000..06a1ef0
Binary files /dev/null and b/static/icons/logo.png differ
diff --git a/static/main.wasm b/static/main.wasm
new file mode 100644 (file)
index 0000000..e2d141b
Binary files /dev/null and b/static/main.wasm differ
diff --git a/updates.xml b/updates.xml
new file mode 100644 (file)
index 0000000..59e7233
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
+  <app appid='khialfpkolfdbffkcapmfpbbamgilcnh'>
+    <updatecheck codebase='http://localhost:8000/chrome-ext.crx' version='1.0.0' />
+  </app>
+</gupdate>
\ No newline at end of file