From 620769929943b0660a9255a8117c99e652419997 Mon Sep 17 00:00:00 2001 From: Aaron Barnard Date: Wed, 6 Nov 2019 10:14:51 +1100 Subject: [PATCH 1/4] Fix build error --- tsconfig.json | 5 ++-- yarn.lock | 71 +++++++++++++++++++++++++-------------------------- 2 files changed, 38 insertions(+), 38 deletions(-) diff --git a/tsconfig.json b/tsconfig.json index f9c389bd2..ce2df4cc3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,9 +1,10 @@ { + "include": ["src/**/*"], "exclude": ["node_modules/*"], "compilerOptions": { /* Basic Options */ - "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, - "module": "es2015" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, + "target": "ESNEXT" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, + "module": "ESNEXT" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, // "lib": [], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ diff --git a/yarn.lock b/yarn.lock index 7ccce1703..09bc0c0a1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,11 +10,11 @@ "@babel/highlight" "^7.0.0" "@babel/helper-module-imports@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" - integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" + integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw== dependencies: - "@babel/types" "^7.0.0" + "@babel/types" "^7.7.0" "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" @@ -48,16 +48,16 @@ regenerator-runtime "^0.12.0" "@babel/runtime@^7.5.5": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" - integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== + version "7.7.1" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.7.1.tgz#b223497bbfbcbbb38116673904debc71470ca528" + integrity sha512-SQ0sS7KUJDvgCI2cpZG0nJygO6002oTbhgSuw4WcocsnbxLwL5Q8I3fqbJdyBAc3uFrWZiR2JomseuxSuci3SQ== dependencies: regenerator-runtime "^0.13.2" -"@babel/types@^7.0.0": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" - integrity sha512-CqbcpTxMcpuQTMhjI37ZHVgjBkysg5icREQIEZ0eG1yCNwg3oy+5AaLiOKmjsCj6nqOsa6Hf0ObjRVwokb7srA== +"@babel/types@^7.7.0": + version "7.7.1" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.1.tgz#8b08ea368f2baff236613512cf67109e76285827" + integrity sha512-kN/XdANDab9x1z5gcjDc9ePpxexkt+1EQ2MQUiM4XnMvQfvp87/+6kY4Ko2maLXH+tei/DgJ/ybFITeqqRwDiA== dependencies: esutils "^2.0.2" lodash "^4.17.13" @@ -203,14 +203,14 @@ integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== "@types/node@*", "@types/node@^12.12.3": - version "12.12.3" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.3.tgz#ebfe83507ac506bc3486314a8aa395be66af8d23" - integrity sha512-opgSsy+cEF9N8MgaVPnWVtdJ3o4mV2aMHvDq7thkQUFt0EuOHJon4rQpJfhjmNHB+ikl0Cd6WhWIErOyQ+f7tw== + version "12.12.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.6.tgz#a47240c10d86a9a57bb0c633f0b2e0aea9ce9253" + integrity sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA== "@types/node@^10.3.2": - version "10.17.2" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.2.tgz#41b5afbcde1a5a805302a4da3cf399499f1bbf64" - integrity sha512-sAh60KDol+MpwOr1RTK0+HgBEYejKsxdpmrOS1Wts5bI03dLzq8F7T0sRXDKeaEK8iWDlGfdzxrzg6vx/c5pNA== + version "10.17.4" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.17.4.tgz#8993a4fe3c4022fda66bf4ea660d615fc5659c6f" + integrity sha512-F2pgg+LcIr/elguz+x+fdBX5KeZXGUOp7TV8M0TVIrDezYLFRNt8oMTyps0VQ1kj5WGGoR18RdxnRDHXrIFHMQ== "@types/resolve@0.0.8": version "0.0.8" @@ -1047,9 +1047,9 @@ bn.js@4.11.8, bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.11.0, bn.js@^4. integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== bnc-notify@^0.2.1: - version "0.2.2" - resolved "https://registry.yarnpkg.com/bnc-notify/-/bnc-notify-0.2.2.tgz#b4d9ffa0b037fa3952a8c79407738e02d5a6d43e" - integrity sha512-2RpLnqkG57zNI9LNNUviERU4l26NmELLZxpcoMyTGegMmmy/5MMe9N7WT6eWxa+2i9wtuIIYRoM26rK4E0Iu3Q== + version "0.2.5" + resolved "https://registry.yarnpkg.com/bnc-notify/-/bnc-notify-0.2.5.tgz#f6035cfff4782b775ce50393bf654fc1b41c225e" + integrity sha512-Yg1Pja41NchaAILDWq/gO3EGqY5wp2DIpMRBvZlOH8R5n0K6f6l24+PWulZdjMe57gUNCxV5gycRc1p/f3J4BQ== dependencies: bignumber.js "^9.0.0" bnc-sdk "0.2.3" @@ -1211,9 +1211,9 @@ cache-base@^1.0.1: unset-value "^1.0.0" caniuse-lite@^1.0.30000844: - version "1.0.30001006" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001006.tgz#5b6e8288792cfa275f007b2819a00ccad7112655" - integrity sha512-MXnUVX27aGs/QINz+QG1sWSLDr3P1A3Hq5EUWoIt0T7K24DuvMxZEnh3Y5aHlJW6Bz2aApJdSewdYLd8zQnUuw== + version "1.0.30001008" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001008.tgz#b8841b1df78a9f5ed9702537ef592f1f8772c0d9" + integrity sha512-b8DJyb+VVXZGRgJUa30cbk8gKHZ3LOZTBLaUEEVr2P4xpmFigOCc62CO4uzquW641Ouq1Rm9N+rWLWdSYDaDIw== caseless@~0.12.0: version "0.12.0" @@ -1549,9 +1549,9 @@ ecc-jsbn@~0.1.1: safer-buffer "^2.1.0" electron-to-chromium@^1.3.47: - version "1.3.296" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz#a1d4322d742317945285d3ba88966561b67f3ac8" - integrity sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ== + version "1.3.304" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.304.tgz#49b47d961f8143116174c2f70fbfee3aabf43015" + integrity sha512-a5mqa13jCdBc+Crgk3Gyr7vpXCiFWfFq23YDCEmrPYeiDOQKZDVE6EX/Q4Xdv97n3XkcjiSBDOY0IS19yP2yeA== elliptic@6.3.3: version "6.3.3" @@ -3653,12 +3653,11 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: inherits "^2.0.1" rlp@^2.0.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.3.tgz#7f94aef86cec412df87d5ea1d8cb116a47d45f0e" - integrity sha512-l6YVrI7+d2vpW6D6rS05x2Xrmq8oW7v3pieZOJKBEdjuTF4Kz/iwk55Zyh1Zaz+KOB2kC8+2jZlp2u9L4tTzCQ== + version "2.2.4" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.4.tgz#d6b0e1659e9285fc509a5d169a9bd06f704951c1" + integrity sha512-fdq2yYCWpAQBhwkZv+Z8o/Z4sPmYm1CUq6P7n6lVTOdb949CnqA0sndXal5C1NleSVSZm6q5F3iEbauyVln/iw== dependencies: bn.js "^4.11.1" - safe-buffer "^5.1.1" rollup-plugin-commonjs@^10.0.0, rollup-plugin-commonjs@^10.1.0: version "10.1.0" @@ -3753,9 +3752,9 @@ rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.3.1, rollup-pluginutils@^2.3.3, estree-walker "^0.6.1" rollup@^1.12.0: - version "1.26.0" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.26.0.tgz#cf40fd5e1edc4d7f3d4235a0a43f1c2be1cf294b" - integrity sha512-5HljNYn9icFvXX+Oe97qY5TWvnWhKqgGT0HGeWWqFPx7w7+Anzg7dfHMtUif7YYy6QxAgynDSwK6uxbgcrVUxw== + version "1.26.3" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.26.3.tgz#3e71b8120a4ccc745a856e926cab0efbe0eead90" + integrity sha512-8MhY/M8gnv3Q/pQQSWYWzbeJ5J1C5anCNY5BK1kV8Yzw9RFS0FF4lbLt+uyPO3wLKWXSXrhAL5pWL85TZAh+Sw== dependencies: "@types/estree" "*" "@types/node" "*" @@ -4276,9 +4275,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.6.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.6.4.tgz#b18752bb3792bc1a0281335f7f6ebf1bbfc5b91d" - integrity sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg== + version "3.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" + integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== underscore@1.9.1: version "1.9.1" From 1e6097ce2da416d9f4a11a4d3551978cea528f18 Mon Sep 17 00:00:00 2001 From: Aaron Barnard Date: Wed, 6 Nov 2019 10:17:00 +1100 Subject: [PATCH 2/4] Set initial state to null and don't call subscription callback unless not null --- src/@types/libraries.d.ts | 2 +- src/onboard.ts | 8 ++++++-- src/stores.ts | 14 +++++++------- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/@types/libraries.d.ts b/src/@types/libraries.d.ts index 6e1ee8d71..3ce5f1d6c 100644 --- a/src/@types/libraries.d.ts +++ b/src/@types/libraries.d.ts @@ -1,7 +1,7 @@ declare module "promise-cancelable" { export default class Cancelable extends Promise { constructor(executor: any) - cancel(): any + cancel(func: () => void): any isFulfilled(): any isResolved(): any isRejected(): any diff --git a/src/onboard.ts b/src/onboard.ts index 214f3cec1..5c9053993 100644 --- a/src/onboard.ts +++ b/src/onboard.ts @@ -56,7 +56,9 @@ function init(initialization: Initialization): API { if (subscriptions) { if (subscriptions.address) { address.subscribe((address: string | null) => { - address && subscriptions.address(address) + if (address !== null) { + subscriptions.address(address) + } }) } @@ -68,7 +70,9 @@ function init(initialization: Initialization): API { if (subscriptions.balance) { balance.subscribe((balance: string) => { - balance && subscriptions.balance(balance) + if (balance !== null) { + subscriptions.balance(balance) + } }) } diff --git a/src/stores.ts b/src/stores.ts index cfa787879..2e3ac6f73 100644 --- a/src/stores.ts +++ b/src/stores.ts @@ -41,7 +41,7 @@ export const network: WalletStateSliceStore = createWalletStateSliceStore({ parameter: "network", initialState: null }) -export const balance: BalanceStore = createBalanceStore("") +export const balance: BalanceStore = createBalanceStore(null) export const wallet: WritableStore = writable({ name: null, provider: null, @@ -106,14 +106,14 @@ function createWalletInterfaceStore( function createWalletStateSliceStore(options: { parameter: string - initialState: string | number | null + initialState: string | number | null | undefined }): WalletStateSliceStore { const { parameter, initialState } = options const { subscribe, set } = writable(initialState) return { subscribe, - reset: () => set(initialState), + reset: () => set(undefined), setStateSyncer: (stateSyncer: StateSyncer) => { validateType({ name: "stateSyncer", value: stateSyncer, type: "object" }) @@ -155,7 +155,7 @@ function createWalletStateSliceStore(options: { } } -function createBalanceStore(initialState: string): BalanceStore { +function createBalanceStore(initialState: string | null): BalanceStore { let stateSyncer: StateSyncer let emitter @@ -181,7 +181,7 @@ function createBalanceStore(initialState: string): BalanceStore { emitter.on("all", () => false) } else { // no address, so set balance back to null - set && set(initialState) + set && set(undefined) } } }) @@ -234,7 +234,7 @@ function syncStateWithTimeout(options: { "There was a problem getting the balance of this wallet" }) } - ) + ).catch(() => {}) ) balanceSyncStatus.syncing = prom @@ -251,7 +251,7 @@ function syncStateWithTimeout(options: { timedOut.then(() => { if (!prom.isFulfilled()) { - prom.cancel() + prom.cancel(() => {}) } }) } From 4a7af86cde8e624caa8dfdac54857cf5faac0dd6 Mon Sep 17 00:00:00 2001 From: Aaron Barnard Date: Wed, 6 Nov 2019 10:18:16 +1100 Subject: [PATCH 3/4] Make create provider interface functions more robust --- src/interfaces.ts | 5 +- src/modules/select/wallets/dapper.ts | 38 +------- src/utilities.ts | 136 ++++++++++++++++----------- src/views/WalletSelect.svelte | 10 +- 4 files changed, 96 insertions(+), 93 deletions(-) diff --git a/src/interfaces.ts b/src/interfaces.ts index 1536da6cf..f6cc8ba7f 100644 --- a/src/interfaces.ts +++ b/src/interfaces.ts @@ -95,6 +95,9 @@ export interface Helpers { createLegacyProviderInterface: (provider: any) => WalletInterface createModernProviderInterface: (provider: any) => WalletInterface BigNumber: any + getAddress: (provider: any) => Promise + getNetwork: (provider: any) => Promise + getBalance: (provider: any) => Promise } export interface WalletInterface { @@ -216,7 +219,7 @@ export interface QuerablePromise extends CancelablePromise { } export interface CancelablePromise extends Promise { - cancel: () => void + cancel: (func: () => void) => void isFulfilled: () => boolean isResolved: () => boolean isRejected: () => boolean diff --git a/src/modules/select/wallets/dapper.ts b/src/modules/select/wallets/dapper.ts index 50fa6ad00..ab04f0927 100644 --- a/src/modules/select/wallets/dapper.ts +++ b/src/modules/select/wallets/dapper.ts @@ -10,48 +10,14 @@ function dapper(): WalletModule { iconSrc: dapperIcon, iconSrcSet: dapperIcon2x, wallet: (helpers: Helpers) => { - const { getProviderName, BigNumber } = helpers + const { createModernProviderInterface, getProviderName } = helpers const provider = (window as any).ethereum return { provider, interface: provider && getProviderName(provider) === "Dapper" - ? { - name: "Dapper", - connect: provider.enable, - address: { - get: () => - Promise.resolve(provider.cachedResults.eth_coinbase.result) - }, - network: { - get: () => - Promise.resolve(provider.cachedResults.net_version.result) - }, - balance: { - get: () => - new Promise(resolve => { - if (!provider.cachedResults.eth_coinbase.result) { - resolve(null) - return - } - - provider.sendAsync( - { - method: "eth_getBalance", - params: [ - provider.cachedResults.eth_coinbase.result, - "latest" - ], - id: 1 - }, - (e: any, res: any) => { - resolve(BigNumber(res.result).toString(10)) - } - ) - }) - } - } + ? createModernProviderInterface(provider) : null } }, diff --git a/src/utilities.ts b/src/utilities.ts index 2ec1d6ab7..4f98e5022 100644 --- a/src/utilities.ts +++ b/src/utilities.ts @@ -7,52 +7,91 @@ import { CancelablePromise } from "./interfaces" +export function getNetwork(provider: any): Promise { + return new Promise((resolve, reject) => { + provider.sendAsync( + { + method: "net_version", + params: [], + id: 42 + }, + (e: any, res: any) => { + e && reject(e) + resolve(Number(res && res.result)) + } + ) + }) +} + +export function getAddress(provider: any): Promise { + return new Promise((resolve, reject) => { + provider.sendAsync( + { + method: "eth_accounts", + params: [], + id: 42 + }, + (e: any, res: any) => { + e && reject(e) + resolve(res && res.result && res.result[0]) + } + ) + }) +} + +export function getBalance(provider: any): Promise { + return new Promise(async (resolve, reject) => { + const currentAddress = await getAddress(provider) + + if (!currentAddress) { + resolve(null) + return + } + + provider.sendAsync( + { + method: "eth_getBalance", + params: [currentAddress, "latest"], + id: 42 + }, + (e: any, res: any) => { + e && reject(e) + resolve(res && res.result && new BigNumber(res.result).toString(10)) + } + ) + }) +} + export function createModernProviderInterface(provider: any): WalletInterface { provider.autoRefreshOnNetworkChange = false - return { - address: { - get: () => { - return Promise.resolve(provider.selectedAddress || null) - } + const onFuncExists = typeof provider.on === "function" - // METAMASK BUG NEEDS TO BE FIXED FOR CHROME: https://github.com/MetaMask/metamask-extension/issues/7101 - // onChange: func => { - // // give the initial value if it exists - // if (provider.selectedAddress) { - // func(provider.selectedAddress) - // } - // provider.on("accountsChanged", accounts => func(accounts[0])) - // } - }, - network: { - onChange: (func: (val: string | number) => void) => { - // give the initial value if it exists - if (provider.networkVersion) { - func(provider.networkVersion) + return { + address: onFuncExists + ? { + onChange: func => { + // get the initial value + getAddress(provider).then(func) + provider.on("accountsChanged", (accounts: string[]) => + func(accounts[0]) + ) + } } - provider.on("networkChanged", func) - } - }, - balance: { - get: () => - new Promise((resolve: (val: any) => void) => { - if (!provider.selectedAddress) { - resolve(null) - return + : { + get: () => getAddress(provider) + }, + network: onFuncExists + ? { + onChange: (func: (val: string | number) => void) => { + // get initial value + getNetwork(provider).then(func) + provider.on("networkChanged", func) } - - provider.sendAsync( - { - method: "eth_getBalance", - params: [provider.selectedAddress, "latest"], - id: 1 - }, - (e: any, res: any) => { - resolve(new BigNumber(res.result).toString(10)) - } - ) - }) + } + : { get: () => getNetwork(provider) }, + balance: { + get: () => getBalance(provider) }, connect: () => new Promise( @@ -74,24 +113,13 @@ export function createModernProviderInterface(provider: any): WalletInterface { export function createLegacyProviderInterface(provider: any): WalletInterface { return { address: { - get: () => Promise.resolve(provider._address || provider.address) + get: () => getAddress(provider) }, network: { - get: () => Promise.resolve(provider._chainId || provider.chainId) + get: () => getNetwork(provider) }, balance: { - get: () => - new Promise((resolve: (val: string | number | null) => void) => { - provider.sendAsync( - { - method: "eth_getBalance", - params: [provider._address, "latest"] - }, - (e: any, res: any) => { - resolve(new BigNumber(res.result).toString(10)) - } - ) - }) + get: () => getBalance(provider) }, name: getProviderName(provider) || "unknown" } diff --git a/src/views/WalletSelect.svelte b/src/views/WalletSelect.svelte index 343b19cc7..3d0def92d 100644 --- a/src/views/WalletSelect.svelte +++ b/src/views/WalletSelect.svelte @@ -17,7 +17,10 @@ import { getProviderName, createLegacyProviderInterface, - createModernProviderInterface + createModernProviderInterface, + getAddress, + getBalance, + getNetwork } from "../utilities"; import { @@ -102,7 +105,10 @@ getProviderName, createLegacyProviderInterface, createModernProviderInterface, - BigNumber + BigNumber, + getNetwork, + getAddress, + getBalance }); // if no interface then the user does not have the wallet they selected installed or available From 4e46a412ab6ab91d40767aea3a20c89d16abb276 Mon Sep 17 00:00:00 2001 From: Aaron Barnard Date: Wed, 6 Nov 2019 10:25:03 +1100 Subject: [PATCH 4/4] Change version to 0.2.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d9a3a9bad..103096419 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "bnc-onboard", - "version": "0.2.5", + "version": "0.2.6", "description": "Onboard users to web3 by allowing them to select a wallet, get that wallet ready to transact and have access to synced wallet state.", "keywords": [ "ethereum",