From 4475d1551d46bee617b048876242cfa049f6617d Mon Sep 17 00:00:00 2001 From: Gabriel Garcia Date: Wed, 30 Dec 2020 05:36:21 -0300 Subject: [PATCH] Refactor API: ForwardingPath descriptions + App intent actions (#256) This PR includes most of the changes discussed in #132 We don't have an `Intent` object as it was an intermediary step that ends up adding more complexity to the code. Instead of giving an intent we calculate the path and then create a `ForwardingPath` object that provide extra functionality on top of the data: - Sign transactions with a signer - Describe the path using Radspec - Apply pre-transactions to the path On top of this PR there were a few changes to the app connectors for Agreements and Dandelion Voting --- examples/bundler-parcel/package.json | 4 +- .../bundler-webpack-ts-loader/package.json | 4 +- examples/connect-react-intro/package.json | 2 +- examples/forwarding-path/.gitignore | 2 + examples/forwarding-path/index.html | 136 + examples/forwarding-path/index.js | 417 ++ examples/forwarding-path/package.json | 25 + examples/list-balances-cli/package.json | 6 +- examples/list-votes-cli/package.json | 6 +- examples/list-votes-react/package.json | 6 +- examples/minimal-setup-web/package.json | 4 +- examples/nodejs/package.json | 10 +- examples/org-viewer-react/package.json | 4 +- examples/org-viewer-web/package.json | 4 +- package.json | 2 +- packages/connect-agreement/jest.config.js | 1 + packages/connect-agreement/package.json | 6 +- .../src/__test__/connector/agreement.test.ts | 8 +- .../src/__test__/connector/signers.test.ts | 29 +- .../src/__test__/connector/versions.test.ts | 22 +- .../src/__test__/models/agreement.test.ts | 319 +- packages/connect-agreement/src/connect.ts | 2 +- .../connect-agreement/src/helpers/numbers.ts | 9 +- .../connect-agreement/src/models/Action.ts | 2 - .../connect-agreement/src/models/Agreement.ts | 147 +- .../src/models/CollateralRequirement.ts | 2 + .../src/models/DisputableApp.ts | 8 +- .../connect-agreement/src/models/Staking.ts | 2 + .../src/models/StakingMovement.ts | 24 +- .../src/thegraph/connector.ts | 34 +- .../src/thegraph/parsers/actions.ts | 3 +- .../parsers/collateralRequirements.ts | 8 +- .../src/thegraph/parsers/disputableApps.ts | 2 +- .../src/thegraph/parsers/signers.ts | 4 +- .../src/thegraph/parsers/staking.ts | 12 +- .../src/thegraph/queries/index.ts | 36 +- packages/connect-agreement/src/types.ts | 20 +- .../subgraph/abis/Staking.json | 1820 ++++---- .../subgraph/abis/StakingFactory.json | 191 +- .../manifest/data/rinkeby-staging.json | 4 +- .../connect-agreement/subgraph/schema.graphql | 9 +- .../subgraph/src/Agreement.ts | 141 +- .../subgraph/src/DisputableAragonApp.ts | 19 - .../connect-agreement/subgraph/src/Staking.ts | 178 - .../subgraph/subgraph.template.yaml | 46 - packages/connect-core/package.json | 2 +- packages/connect-core/src/entities/App.ts | 106 +- .../src/entities/ForwardingPath.ts | 84 + .../connect-core/src/entities/Organization.ts | 67 +- .../connect-core/src/entities/Permission.ts | 17 +- packages/connect-core/src/entities/Repo.ts | 16 +- packages/connect-core/src/entities/Role.ts | 14 +- .../connect-core/src/entities/Transaction.ts | 24 + packages/connect-core/src/index.ts | 20 +- .../src/transactions/TransactionIntent.ts | 78 - .../src/transactions/TransactionPath.ts | 23 - .../src/transactions/TransactionRequest.ts | 31 - packages/connect-core/src/types.ts | 143 +- .../src/utils/__test__/callscript.test.ts | 60 + packages/connect-core/src/utils/abi.ts | 36 + packages/connect-core/src/utils/abis.ts | 20 + packages/connect-core/src/utils/app.ts | 156 +- packages/connect-core/src/utils/callScript.ts | 7 +- .../connect-core/src/utils/descriptions.ts | 76 - .../decodePath.ts => descriptor/decode.ts} | 26 +- .../src/utils/descriptor/describe.ts | 106 + .../src/utils/descriptor/index.ts | 45 + packages/connect-core/src/utils/index.ts | 5 +- packages/connect-core/src/utils/intent.ts | 84 + packages/connect-core/src/utils/kernel.ts | 44 + packages/connect-core/src/utils/metadata.ts | 3 +- .../src/utils/path/calculatePath.ts | 171 +- .../src/utils/path/getACLForwardingPath.ts | 95 + .../src/utils/path/getForwardingPath.ts | 46 + packages/connect-core/src/utils/path/index.ts | 3 + .../connect-core/src/utils/radspec/index.ts | 64 +- .../src/utils/radspec/postprocess.ts | 43 +- .../src/utils/radspec/radspec-gabi.d.ts | 1 - .../connect-core/src/utils/transactions.ts | 175 +- .../connect-disputable-voting/jest.config.js | 1 + .../connect-disputable-voting/package.json | 6 +- .../src/__test__/models/votes.test.ts | 138 +- .../src/__test__/models/voting.test.ts | 99 + .../thegraph/disputableVoting.test.ts | 19 +- .../src/__test__/thegraph/settings.test.ts | 11 +- .../src/__test__/thegraph/voters.test.ts | 13 +- .../src/__test__/thegraph/votes.test.ts | 19 +- .../src/__test__/utils.ts | 28 + .../connect-disputable-voting/src/connect.ts | 4 +- .../src/helpers/numbers.ts | 7 +- .../src/models/ArbitratorFee.ts | 2 + .../src/models/CollateralRequirement.ts | 8 +- .../src/models/DisputableVoting.ts | 83 +- .../src/models/ERC20.ts | 21 +- .../src/models/Vote.ts | 113 +- .../src/thegraph/connector.ts | 56 +- .../src/thegraph/parsers/arbitratorFees.ts | 1 + .../parsers/collateralRequirements.ts | 57 +- .../src/thegraph/parsers/disputableVoting.ts | 12 +- .../src/thegraph/parsers/erc20s.ts | 5 +- .../src/thegraph/parsers/index.ts | 2 +- .../src/thegraph/parsers/votes.ts | 21 +- .../src/thegraph/queries/index.ts | 75 +- .../connect-disputable-voting/src/types.ts | 23 +- .../manifest/data/rinkeby-staging.json | 4 +- .../subgraph/schema.graphql | 8 +- .../subgraph/src/Agreement.ts | 36 +- .../subgraph/src/DisputableVoting.ts | 19 +- .../subgraph/subgraph.template.yaml | 2 + packages/connect-ethereum/package.json | 4 +- packages/connect-finance/package.json | 6 +- packages/connect-react/package.json | 4 +- packages/connect-thegraph/package.json | 4 +- .../src/__test__/apps.test.ts | 10 +- .../connect-thegraph/src/parsers/repos.ts | 1 + packages/connect-tokens/package.json | 6 +- packages/connect-types/package.json | 2 +- packages/connect-voting/package.json | 6 +- .../manifest/data/mainnet-staging.json | 7 +- packages/connect/package.json | 8 +- yarn.lock | 3857 +++++++++++++++-- 121 files changed, 7652 insertions(+), 2787 deletions(-) create mode 100644 examples/forwarding-path/.gitignore create mode 100644 examples/forwarding-path/index.html create mode 100644 examples/forwarding-path/index.js create mode 100644 examples/forwarding-path/package.json delete mode 100644 packages/connect-agreement/subgraph/src/DisputableAragonApp.ts delete mode 100644 packages/connect-agreement/subgraph/src/Staking.ts create mode 100644 packages/connect-core/src/entities/ForwardingPath.ts create mode 100644 packages/connect-core/src/entities/Transaction.ts delete mode 100644 packages/connect-core/src/transactions/TransactionIntent.ts delete mode 100644 packages/connect-core/src/transactions/TransactionPath.ts delete mode 100644 packages/connect-core/src/transactions/TransactionRequest.ts create mode 100644 packages/connect-core/src/utils/__test__/callscript.test.ts create mode 100644 packages/connect-core/src/utils/abi.ts delete mode 100644 packages/connect-core/src/utils/descriptions.ts rename packages/connect-core/src/utils/{path/decodePath.ts => descriptor/decode.ts} (59%) create mode 100644 packages/connect-core/src/utils/descriptor/describe.ts create mode 100644 packages/connect-core/src/utils/descriptor/index.ts create mode 100644 packages/connect-core/src/utils/intent.ts create mode 100644 packages/connect-core/src/utils/path/getACLForwardingPath.ts create mode 100644 packages/connect-core/src/utils/path/getForwardingPath.ts create mode 100644 packages/connect-core/src/utils/path/index.ts delete mode 100644 packages/connect-core/src/utils/radspec/radspec-gabi.d.ts create mode 100644 packages/connect-disputable-voting/src/__test__/models/voting.test.ts create mode 100644 packages/connect-disputable-voting/src/__test__/utils.ts diff --git a/examples/bundler-parcel/package.json b/examples/bundler-parcel/package.json index fbdf236f..5a9d2656 100644 --- a/examples/bundler-parcel/package.json +++ b/examples/bundler-parcel/package.json @@ -1,7 +1,7 @@ { "name": "bundler-parcel", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "main": "index.js", "license": "MIT", "scripts": { @@ -9,7 +9,7 @@ "build": "parcel build src/index.html" }, "dependencies": { - "@aragon/connect-react": "^0.7.0", + "@aragon/connect-react": "^0.8.0-alpha.6", "react": "^16.13.1", "react-dom": "^16.13.1", "string.ify": "^1.0.64" diff --git a/examples/bundler-webpack-ts-loader/package.json b/examples/bundler-webpack-ts-loader/package.json index 0c444be0..09882e30 100644 --- a/examples/bundler-webpack-ts-loader/package.json +++ b/examples/bundler-webpack-ts-loader/package.json @@ -1,7 +1,7 @@ { "name": "bundler-webpack-ts-loader", "main": "dist/index.js", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "private": true, "sideEffects": false, "scripts": { @@ -10,7 +10,7 @@ "clean": "rm -rf ./dist ./tsconfig.tsbuildinfo" }, "dependencies": { - "@aragon/connect": "^0.7.0", + "@aragon/connect": "^0.8.0-alpha.6", "react": "^16.13.1", "react-dom": "^16.13.1" }, diff --git a/examples/connect-react-intro/package.json b/examples/connect-react-intro/package.json index f735c674..77dc6264 100644 --- a/examples/connect-react-intro/package.json +++ b/examples/connect-react-intro/package.json @@ -1,7 +1,7 @@ { "name": "connect-react-intro", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "scripts": { "start": "snowpack dev", "build": "snowpack build" diff --git a/examples/forwarding-path/.gitignore b/examples/forwarding-path/.gitignore new file mode 100644 index 00000000..68979180 --- /dev/null +++ b/examples/forwarding-path/.gitignore @@ -0,0 +1,2 @@ +dist/ +.cache/ diff --git a/examples/forwarding-path/index.html b/examples/forwarding-path/index.html new file mode 100644 index 00000000..004b9986 --- /dev/null +++ b/examples/forwarding-path/index.html @@ -0,0 +1,136 @@ + + + + + + Forwarding path demo + + + + +
+ + + diff --git a/examples/forwarding-path/index.js b/examples/forwarding-path/index.js new file mode 100644 index 00000000..e3dce398 --- /dev/null +++ b/examples/forwarding-path/index.js @@ -0,0 +1,417 @@ +import ReactDOM from 'react-dom' +import React, { useEffect, useRef, useState } from 'react' +import { + Connect, + createAppHook, + useApp, + useOrganization, +} from '@aragon/connect-react' +import connectVoting from '@aragon/connect-voting' +import connectTokens from '@aragon/connect-tokens' +import { useWallet, UseWalletProvider } from 'use-wallet' + +const useVoting = createAppHook(connectVoting) + +function voteId(vote) { + const id = parseInt(vote.id.match(/voteId:(.+)$/)?.[1], 16) + return String(id + 1) +} + +function Vote({ vote }) { + return ( + + Vote {voteId(vote)}:{' '} + {vote.metadata ? `“${vote.metadata}”` : (action)} + + ) +} + +function App() { + const wallet = useWallet() + const [org, orgStatus] = useOrganization() + const [voting, votingStatus] = useApp('voting') + const [tokens, tokensStatus] = useApp('token-manager') + const [votes = [], votesStatus] = useVoting(voting, (app) => app.onVotes()) + + const [showVotes, setShowVotes] = useState(false) + const [ + { + intent, + status: intentStatus, + description: intentDescription, + receipts: intentReceipts, + }, + setIntent, + ] = useState({ + status: 'none', + description: null, + intent: null, + receipts: null, + }) + + const cancelIntent = useRef(null) + + const initIntent = (cb) => { + cancelIntent.current?.() + cancelIntent.current = cb + setIntent({ + status: 'loading', + description: null, + intent: null, + receipts: null, + }) + } + + const resetIntent = () => { + cancelIntent.current?.() + setIntent({ + status: 'none', + description: null, + intent: null, + receipts: null, + }) + } + + const signIntent = async () => { + setIntent((intent) => ({ ...intent, status: 'signing' })) + + let receipts + + try { + receipts = await intent.sign((tx) => { + return wallet.ethereum.request({ + method: 'eth_sendTransaction', + params: [tx], + }) + }) + } catch (err) { + alert('Error! Check the console for details.') + console.error('Signing error:', err) + } + + setIntent((intent) => ({ + ...intent, + status: 'signed', + receipts, + })) + } + + const createVote = async () => { + let cancelled = false + initIntent(() => (cancelled = true)) + + const intent = await voting.intent( + 'newVote(bytes,string)', + ['0x00000001', 'A vote'], + { actAs: wallet.account } + ) + + const description = await intent.describe() + + if (!cancelled) { + setIntent({ status: 'loaded', intent, description, receipts: null }) + } + } + + const assignOneToken = async () => { + let cancelled = false + initIntent(() => (cancelled = true)) + + const intent = await tokens.intent( + 'mint(address,uint256)', + [wallet.account, '1'], + { actAs: wallet.account } + ) + + const description = await intent.describe() + + if (!cancelled) { + setIntent({ status: 'loaded', description, intent, receipts: null }) + } + } + + if (wallet.status !== 'connected') { + return + } + + return ( +
+
+

Forwarding path demo

+ +

Summary

+ + + + + + + + + + + + + + + + + + + +
Account{wallet.account}
Organization{org.address}
Tokens{tokens?.address || 'loading…'}
Voting{voting?.address || 'loading…'}
+
+ +
+

Actions

+

+ Tokens: + {tokens ? ( + + ) : ( + 'loading…' + )} +

+
+ +
+

+ Voting: + + {voting ? ( + <> + + + + ) : ( + 'loading…' + )} +

+
+ +
+

+ Intent + {intentStatus !== 'none' && ( + + )} + {['loaded', 'signing'].includes(intentStatus) && ( + + )} +

+ + {intentStatus === 'none' && ( +

Please use one of the actions to create an intent.

+ )} + + {intentStatus === 'loading' &&

Creating intent…

} + + {intentStatus !== 'none' && ( + <> + {intentStatus === 'signed' && ( + <> +

Transactions receipts

+ + + {intentReceipts.map((receipt) => ( + + + + ))} + +
{receipt}
+ + )} + + {intent?.destination && ( + <> +

Destination

+ + + + + + + + + + + +
Name:{intent.destination.name}
Address:{intent.destination.address}
+ + )} + + {intentDescription && ( + <> +

Steps

+ + + + + + + + + + {intentDescription.describedSteps.map( + ( + { annotatedDescription, data, description, from, to }, + index + ) => ( + + + + + + ) + )} + +
FromToDescription
+ {shortenAddress(from)} + + {shortenAddress(to)} + + {annotatedDescription.map( + ({ type, value }, index) => { + const prefix = index > 0 ? ' ' : '' + if (type === 'address') { + return ( + + {prefix + shortenAddress(value)} + + ) + } + return ( + + {prefix + String(value)} + + ) + } + )} + . +
+ + )} + + {intent?.transactions && ( + <> +

Transactions

+ + + + + + + + + + {intent.transactions.map(({ data, from, to }, index) => ( + + + + + + ))} + +
FromToData
+ {shortenAddress(from)} + + {shortenAddress(to)} + {data}
+ + )} + + )} +
+ + {showVotes && ( +
+

Votes

+ + {(!voting || votes.length === 0) &&

loading…

} + + {votes.length > 0 && ( +
    + {[...votes] + .sort((a, b) => { + console.log(a) + return 0 + }) + .map((vote) => ( +
  • + +
  • + ))} +
+ )} +
+ )} +
+ ) +} + +function ConnectOverlay() { + const wallet = useWallet() + const connect = () => wallet.connect('injected') + const disconnect = () => wallet.reset() + + return ( +
+ {wallet.status === 'disconnected' ? ( + + ) : ( + + )} +
+ ) +} + +export function shortenAddress(address, charsLength = 4) { + const prefixLength = 2 // "0x" + if (!address) { + return '' + } + if (address.length < charsLength * 2 + prefixLength) { + return address + } + return ( + address.slice(0, charsLength + prefixLength) + + '…' + + address.slice(-charsLength) + ) +} + +ReactDOM.render( + + + + + , + document.querySelector('#app') +) diff --git a/examples/forwarding-path/package.json b/examples/forwarding-path/package.json new file mode 100644 index 00000000..bad386a0 --- /dev/null +++ b/examples/forwarding-path/package.json @@ -0,0 +1,25 @@ +{ + "name": "forwarding-path", + "private": true, + "version": "0.8.0-alpha.1", + "main": "index.js", + "license": "MIT", + "scripts": { + "start": "parcel index.html", + "build": "parcel build index.html" + }, + "dependencies": { + "@aragon/connect-react": "^0.8.0-alpha.1", + "@aragon/connect-tokens": "^0.7.0", + "@aragon/connect-voting": "^0.7.0", + "react": "^16.12.0", + "react-dom": "^16.13.1", + "use-wallet": "^0.8.0" + }, + "devDependencies": { + "parcel": "^1.12.4" + }, + "browserslist": [ + ">2%" + ] +} diff --git a/examples/list-balances-cli/package.json b/examples/list-balances-cli/package.json index afdce8fc..3a4200d7 100644 --- a/examples/list-balances-cli/package.json +++ b/examples/list-balances-cli/package.json @@ -1,7 +1,7 @@ { "name": "list-balances-cli", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "main": "index.js", "license": "MIT", "scripts": { @@ -13,8 +13,8 @@ "typescript": "^3.9.6" }, "dependencies": { - "@aragon/connect": "^0.7.0", - "@aragon/connect-voting": "^0.7.0", + "@aragon/connect": "^0.8.0-alpha.6", + "@aragon/connect-voting": "^0.8.0-alpha.6", "token-amount": "^0.1.0" } } diff --git a/examples/list-votes-cli/package.json b/examples/list-votes-cli/package.json index 4d8dff5e..45d6869a 100644 --- a/examples/list-votes-cli/package.json +++ b/examples/list-votes-cli/package.json @@ -1,7 +1,7 @@ { "name": "list-votes-cli", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "main": "index.js", "license": "MIT", "scripts": { @@ -13,7 +13,7 @@ "typescript": "^3.9.6" }, "dependencies": { - "@aragon/connect": "^0.7.0", - "@aragon/connect-voting": "^0.7.0" + "@aragon/connect": "^0.8.0-alpha.6", + "@aragon/connect-voting": "^0.8.0-alpha.6" } } diff --git a/examples/list-votes-react/package.json b/examples/list-votes-react/package.json index 4d4b3706..deecec2b 100644 --- a/examples/list-votes-react/package.json +++ b/examples/list-votes-react/package.json @@ -1,14 +1,14 @@ { "name": "list-votes-react", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "scripts": { "start": "snowpack dev", "build": "snowpack build" }, "dependencies": { - "@aragon/connect-react": "^0.7.0", - "@aragon/connect-voting": "^0.7.0", + "@aragon/connect-react": "^0.8.0-alpha.6", + "@aragon/connect-voting": "^0.8.0-alpha.6", "@emotion/core": "^10.0.35", "ethers": "^5.0.16", "react": "^16.13.1", diff --git a/examples/minimal-setup-web/package.json b/examples/minimal-setup-web/package.json index 874e89b8..b0c8f9af 100644 --- a/examples/minimal-setup-web/package.json +++ b/examples/minimal-setup-web/package.json @@ -1,7 +1,7 @@ { "name": "minimal-setup-web", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "main": "index.js", "license": "MIT", "scripts": { @@ -9,7 +9,7 @@ "build": "parcel build index.html" }, "dependencies": { - "@aragon/connect-react": "^0.7.0", + "@aragon/connect-react": "^0.8.0-alpha.6", "react": "^16.13.1", "react-dom": "^16.13.1" }, diff --git a/examples/nodejs/package.json b/examples/nodejs/package.json index 0e3f28b5..7f0e7530 100644 --- a/examples/nodejs/package.json +++ b/examples/nodejs/package.json @@ -1,7 +1,7 @@ { "name": "nodejs", "main": "dist/index.js", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "private": true, "scripts": { "build": "yarn clean && yarn compile", @@ -22,10 +22,10 @@ "start-create-karma-template": "yarn build; node dist/src/create-karma-template.js" }, "dependencies": { - "@aragon/connect": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0", - "@aragon/connect-tokens": "^0.7.0", - "@aragon/connect-voting": "^0.7.0", + "@aragon/connect": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6", + "@aragon/connect-tokens": "^0.8.0-alpha.6", + "@aragon/connect-voting": "^0.8.0-alpha.6", "ethers": "^5.0.0", "graphql-tag": "^2.10.3" }, diff --git a/examples/org-viewer-react/package.json b/examples/org-viewer-react/package.json index 9d3f07b8..d94d17df 100644 --- a/examples/org-viewer-react/package.json +++ b/examples/org-viewer-react/package.json @@ -1,6 +1,6 @@ { "name": "org-viewer-react", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "private": true, "scripts": { "start": "yarn clean && webpack-dev-server", @@ -9,7 +9,7 @@ "clean": "rm -rf ./dist ./tsconfig.tsbuildinfo" }, "dependencies": { - "@aragon/connect-react": "^0.7.0", + "@aragon/connect-react": "^0.8.0-alpha.6", "@emotion/core": "^10.0.28", "react": "^16.13.1", "react-dom": "^16.13.1" diff --git a/examples/org-viewer-web/package.json b/examples/org-viewer-web/package.json index 9bc6e8a7..2094ba53 100644 --- a/examples/org-viewer-web/package.json +++ b/examples/org-viewer-web/package.json @@ -1,7 +1,7 @@ { "name": "org-viewer-web", "main": "dist/index.js", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "private": true, "sideEffects": false, "scripts": { @@ -12,7 +12,7 @@ "compile": "tsc" }, "dependencies": { - "@aragon/connect": "^0.7.0", + "@aragon/connect": "^0.8.0-alpha.6", "@emotion/core": "^10.0.28", "react": "^16.13.1", "react-dom": "^16.13.1" diff --git a/package.json b/package.json index 58280714..214c3c2d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "description": "Access and interact with Aragon Organizations and their apps.", "keywords": [ "ethereum", diff --git a/packages/connect-agreement/jest.config.js b/packages/connect-agreement/jest.config.js index f169f0dd..b41f5c9e 100644 --- a/packages/connect-agreement/jest.config.js +++ b/packages/connect-agreement/jest.config.js @@ -11,4 +11,5 @@ module.exports = { name: packageName, displayName: 'AGREEMENT', rootDir: '../..', + testTimeout: 10000 } diff --git a/packages/connect-agreement/package.json b/packages/connect-agreement/package.json index 3ab6d92d..801fe48a 100644 --- a/packages/connect-agreement/package.json +++ b/packages/connect-agreement/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-agreement", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "private": true, "license": "LGPL-3.0-or-later", "description": "Access and interact with Aragon Organizations and their apps.", @@ -36,8 +36,8 @@ "lint": "eslint --ext .ts ./src" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0", + "@aragon/connect-core": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6", "graphql-tag": "^2.10.3" }, "devDependencies": { diff --git a/packages/connect-agreement/src/__test__/connector/agreement.test.ts b/packages/connect-agreement/src/__test__/connector/agreement.test.ts index 77bf3def..9f12aea1 100644 --- a/packages/connect-agreement/src/__test__/connector/agreement.test.ts +++ b/packages/connect-agreement/src/__test__/connector/agreement.test.ts @@ -2,8 +2,8 @@ import { AgreementData } from '../../types' import { AgreementConnectorTheGraph } from '../../../src' const AGREEMENT_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/aragon/aragon-agreement-rinkeby-staging' -const AGREEMENT_APP_ADDRESS = '0x9c92dbd8a8e5903e2741202321073091109f26be' + 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-agreement-rinkeby-staging' +const AGREEMENT_APP_ADDRESS = '0xe4575381f0c96f58bd93be6978cc0d9638d874a2' describe('Agreement', () => { let connector: AgreementConnectorTheGraph @@ -27,9 +27,9 @@ describe('Agreement', () => { test('returns the agreement data', () => { expect(agreement.id).toBe(AGREEMENT_APP_ADDRESS) - expect(agreement.dao).toBe('0x51a41e43af0774565f0be5cebc50c693cc19e4ee') + expect(agreement.dao).toBe('0xe990dd6a81c0fdaad6b5cef44676b383350ad94e') expect(agreement.stakingFactory).toBe( - '0x07429001eea415e967c57b8d43484233d57f8b0b' + '0x6a30c2de7359db110b6322b41038674ae1d276fb' ) expect(agreement.currentVersionId).toBe( `${AGREEMENT_APP_ADDRESS}-version-1` diff --git a/packages/connect-agreement/src/__test__/connector/signers.test.ts b/packages/connect-agreement/src/__test__/connector/signers.test.ts index e4bb9813..14c7ba8b 100644 --- a/packages/connect-agreement/src/__test__/connector/signers.test.ts +++ b/packages/connect-agreement/src/__test__/connector/signers.test.ts @@ -1,11 +1,12 @@ import { AgreementConnectorTheGraph, Signer, Signature } from '../../../src' -const AGREEMENT_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/aragon/aragon-agreement-rinkeby-staging' -const AGREEMENT_APP_ADDRESS = '0x9c92dbd8a8e5903e2741202321073091109f26be' -const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' +const AGREEMENT_APP_ADDRESS = '0xe4575381f0c96f58bd93be6978cc0d9638d874a2' +const AGREEMENT_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-agreement-rinkeby-staging' describe('Agreement signers', () => { + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + const SIGNER_ID = `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}` + let connector: AgreementConnectorTheGraph beforeAll(() => { @@ -22,15 +23,11 @@ describe('Agreement signers', () => { let signer: Signer beforeAll(async () => { - signer = await connector.signer( - `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}` - ) + signer = (await connector.signer(SIGNER_ID))! }) test('allows fetching signer information', async () => { - expect(signer.id).toBe( - `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}` - ) + expect(signer.id).toBe(SIGNER_ID) expect(signer.address).toBe(SIGNER_ADDRESS) expect(signer.agreementId).toBe(AGREEMENT_APP_ADDRESS) }) @@ -40,22 +37,16 @@ describe('Agreement signers', () => { let signatures: Signature[] beforeAll(async () => { - signatures = await connector.signatures( - `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}`, - 1000, - 0 - ) + signatures = await connector.signatures(SIGNER_ID, 1000, 0) }) test('allows fetching signer information', async () => { expect(signatures.length).toBeGreaterThan(0) const lastSignature = signatures[signatures.length - 1] - expect(lastSignature.signerId).toBe( - `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}` - ) + expect(lastSignature.signerId).toBe(SIGNER_ID) expect(lastSignature.versionId).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) - expect(lastSignature.createdAt).toBe('1598479718') + expect(lastSignature.createdAt).toBe('1599861231') }) }) }) diff --git a/packages/connect-agreement/src/__test__/connector/versions.test.ts b/packages/connect-agreement/src/__test__/connector/versions.test.ts index 7adebe0a..aa1b5df8 100644 --- a/packages/connect-agreement/src/__test__/connector/versions.test.ts +++ b/packages/connect-agreement/src/__test__/connector/versions.test.ts @@ -1,8 +1,8 @@ import { AgreementConnectorTheGraph, Version } from '../../../src' const AGREEMENT_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/aragon/aragon-agreement-rinkeby-staging' -const AGREEMENT_APP_ADDRESS = '0x9c92dbd8a8e5903e2741202321073091109f26be' + 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-agreement-rinkeby-staging' +const AGREEMENT_APP_ADDRESS = '0xe4575381f0c96f58bd93be6978cc0d9638d874a2' describe('Agreement versions', () => { let connector: AgreementConnectorTheGraph @@ -27,9 +27,9 @@ describe('Agreement versions', () => { test('returns the current version information', () => { expect(version.id).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) expect(version.versionId).toBe('1') - expect(version.title).toBe('Aragon Network Cash Agreement') + expect(version.title).toBe('Aragon Network DAO Agreement') expect(version.content).toEqual( - '0x697066733a516d50766657554e743357725a37756142315a77456d6563335a723141424c39436e63534466517970576b6d6e70' + '0x697066733a516d646159544a6b36615632706d56527839456456386b64447844397947466b7464366846736b585372344b4445' ) expect(version.arbitrator).toBe( '0x52180af656a1923024d1accf1d827ab85ce48878' @@ -37,7 +37,7 @@ describe('Agreement versions', () => { expect(version.appFeesCashier).toBe( '0x0000000000000000000000000000000000000000' ) - expect(version.effectiveFrom).toBe('1598475758') + expect(version.effectiveFrom).toBe('1599860871') }) }) @@ -51,9 +51,9 @@ describe('Agreement versions', () => { test('returns the requested version information', () => { expect(version.id).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) expect(version.versionId).toBe('1') - expect(version.title).toBe('Aragon Network Cash Agreement') + expect(version.title).toBe('Aragon Network DAO Agreement') expect(version.content).toEqual( - '0x697066733a516d50766657554e743357725a37756142315a77456d6563335a723141424c39436e63534466517970576b6d6e70' + '0x697066733a516d646159544a6b36615632706d56527839456456386b64447844397947466b7464366846736b585372344b4445' ) expect(version.arbitrator).toBe( '0x52180af656a1923024d1accf1d827ab85ce48878' @@ -61,7 +61,7 @@ describe('Agreement versions', () => { expect(version.appFeesCashier).toBe( '0x0000000000000000000000000000000000000000' ) - expect(version.effectiveFrom).toBe('1598475758') + expect(version.effectiveFrom).toBe('1599860871') }) }) @@ -79,9 +79,9 @@ describe('Agreement versions', () => { test('allows fetching a single version', () => { const version = versions[0] - expect(version.title).toBe('Aragon Network Cash Agreement') + expect(version.title).toBe('Aragon Network DAO Agreement') expect(version.content).toEqual( - '0x697066733a516d50766657554e743357725a37756142315a77456d6563335a723141424c39436e63534466517970576b6d6e70' + '0x697066733a516d646159544a6b36615632706d56527839456456386b64447844397947466b7464366846736b585372344b4445' ) expect(version.arbitrator).toBe( '0x52180af656a1923024d1accf1d827ab85ce48878' @@ -89,7 +89,7 @@ describe('Agreement versions', () => { expect(version.appFeesCashier).toBe( '0x0000000000000000000000000000000000000000' ) - expect(version.effectiveFrom).toBe('1598475758') + expect(version.effectiveFrom).toBe('1599860871') }) }) }) diff --git a/packages/connect-agreement/src/__test__/models/agreement.test.ts b/packages/connect-agreement/src/__test__/models/agreement.test.ts index 2b4ca819..08179cb8 100644 --- a/packages/connect-agreement/src/__test__/models/agreement.test.ts +++ b/packages/connect-agreement/src/__test__/models/agreement.test.ts @@ -1,17 +1,23 @@ +import { ethers } from 'ethers' +import { connect } from '@aragon/connect' + +import { bn } from '../../helpers' import { Agreement, Signer, AgreementConnectorTheGraph } from '../../../src' -const AGREEMENT_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/aragon/aragon-agreement-rinkeby-staging' -const AGREEMENT_APP_ADDRESS = '0x9c92dbd8a8e5903e2741202321073091109f26be' +const RINKEBY_NETWORK = 4 +const ORGANIZATION_NAME = '0x6322eb0294c6aadb7e1b37d41fd605a34df661dc' +const AGREEMENT_APP_ADDRESS = '0xe4575381f0c96f58bd93be6978cc0d9638d874a2' +const AGREEMENT_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-agreement-rinkeby-staging' + describe('Agreement', () => { let agreement: Agreement - beforeAll(() => { - const connector = new AgreementConnectorTheGraph({ - subgraphUrl: AGREEMENT_SUBGRAPH_URL, - }) - agreement = new Agreement(connector, AGREEMENT_APP_ADDRESS) + beforeAll(async () => { + const organization = await connect(ORGANIZATION_NAME, 'thegraph', { network: RINKEBY_NETWORK }) + const connector = new AgreementConnectorTheGraph({ subgraphUrl: AGREEMENT_SUBGRAPH_URL }) + const app = await organization.connection.orgConnector.appByAddress(organization, AGREEMENT_APP_ADDRESS) + agreement = new Agreement(connector, app) }) afterAll(async () => { @@ -24,15 +30,11 @@ describe('Agreement', () => { }) test('has a staking factory', async () => { - expect(await agreement.stakingFactory()).toBe( - '0x07429001eea415e967c57b8d43484233d57f8b0b' - ) + expect(await agreement.stakingFactory()).toBe('0x6a30c2de7359db110b6322b41038674ae1d276fb') }) test('belongs to a DAO', async () => { - expect(await agreement.dao()).toBe( - '0x51a41e43af0774565f0be5cebc50c693cc19e4ee' - ) + expect(await agreement.dao()).toBe('0xe990dd6a81c0fdaad6b5cef44676b383350ad94e') }) }) @@ -42,17 +44,11 @@ describe('Agreement', () => { expect(version.id).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) expect(version.versionId).toBe('1') - expect(version.title).toBe('Aragon Network Cash Agreement') - expect(version.content).toEqual( - '0x697066733a516d50766657554e743357725a37756142315a77456d6563335a723141424c39436e63534466517970576b6d6e70' - ) - expect(version.arbitrator).toBe( - '0x52180af656a1923024d1accf1d827ab85ce48878' - ) - expect(version.appFeesCashier).toBe( - '0x0000000000000000000000000000000000000000' - ) - expect(version.effectiveFrom).toBe('1598475758') + expect(version.title).toBe('Aragon Network DAO Agreement') + expect(version.content).toEqual('0x697066733a516d646159544a6b36615632706d56527839456456386b64447844397947466b7464366846736b585372344b4445') + expect(version.arbitrator).toBe('0x52180af656a1923024d1accf1d827ab85ce48878') + expect(version.appFeesCashier).toBe('0x0000000000000000000000000000000000000000') + expect(version.effectiveFrom).toBe('1599860871') }) test('allows querying a particular version', async () => { @@ -60,17 +56,11 @@ describe('Agreement', () => { expect(version.id).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) expect(version.versionId).toBe('1') - expect(version.title).toBe('Aragon Network Cash Agreement') - expect(version.content).toEqual( - '0x697066733a516d50766657554e743357725a37756142315a77456d6563335a723141424c39436e63534466517970576b6d6e70' - ) - expect(version.arbitrator).toBe( - '0x52180af656a1923024d1accf1d827ab85ce48878' - ) - expect(version.appFeesCashier).toBe( - '0x0000000000000000000000000000000000000000' - ) - expect(version.effectiveFrom).toBe('1598475758') + expect(version.title).toBe('Aragon Network DAO Agreement') + expect(version.content).toEqual('0x697066733a516d646159544a6b36615632706d56527839456456386b64447844397947466b7464366846736b585372344b4445') + expect(version.arbitrator).toBe('0x52180af656a1923024d1accf1d827ab85ce48878') + expect(version.appFeesCashier).toBe('0x0000000000000000000000000000000000000000') + expect(version.effectiveFrom).toBe('1599860871') }) test('allows fetching a list of versions', async () => { @@ -78,17 +68,11 @@ describe('Agreement', () => { expect(versions.length).toBeGreaterThan(0) const version = versions[0] - expect(version.title).toBe('Aragon Network Cash Agreement') - expect(version.content).toEqual( - '0x697066733a516d50766657554e743357725a37756142315a77456d6563335a723141424c39436e63534466517970576b6d6e70' - ) - expect(version.arbitrator).toBe( - '0x52180af656a1923024d1accf1d827ab85ce48878' - ) - expect(version.appFeesCashier).toBe( - '0x0000000000000000000000000000000000000000' - ) - expect(version.effectiveFrom).toBe('1598475758') + expect(version.title).toBe('Aragon Network DAO Agreement') + expect(version.content).toEqual('0x697066733a516d646159544a6b36615632706d56527839456456386b64447844397947466b7464366846736b585372344b4445') + expect(version.arbitrator).toBe('0x52180af656a1923024d1accf1d827ab85ce48878') + expect(version.appFeesCashier).toBe('0x0000000000000000000000000000000000000000') + expect(version.effectiveFrom).toBe('1599860871') }) }) @@ -98,24 +82,18 @@ describe('Agreement', () => { expect(disputables.length).toBeGreaterThan(0) const disputable = disputables[0] - expect(disputable.id).toBe( - `${AGREEMENT_APP_ADDRESS}-disputable-${disputable.address}` - ) - expect(disputable.address).toBe( - '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' - ) + expect(disputable.id).toBe(`${AGREEMENT_APP_ADDRESS}-disputable-${disputable.address}`) + expect(disputable.address).toBe('0xfae0084f0171fbebf86476b9ac962680c4aa1564') expect(disputable.activated).toEqual(true) expect(disputable.agreementId).toBe(AGREEMENT_APP_ADDRESS) - expect(disputable.collateralRequirementId).toBe( - `${AGREEMENT_APP_ADDRESS}-disputable-${disputable.address}-collateral-requirement-1` - ) + expect(disputable.currentCollateralRequirementId).toBe(`${AGREEMENT_APP_ADDRESS}-disputable-${disputable.address}-collateral-requirement-1`) const collateralRequirement = await disputable.collateralRequirement() - expect(collateralRequirement.actionAmount).toEqual('0') - expect(collateralRequirement.formattedActionAmount).toEqual('0.00') - expect(collateralRequirement.challengeAmount).toBe('0') - expect(collateralRequirement.formattedChallengeAmount).toBe('0.00') - expect(collateralRequirement.challengeDuration).toBe('259200') + expect(collateralRequirement.actionAmount).toEqual('5000000000000000000') + expect(collateralRequirement.formattedActionAmount).toEqual('5.00') + expect(collateralRequirement.challengeAmount).toBe('10000000000000000000') + expect(collateralRequirement.formattedChallengeAmount).toBe('10.00') + expect(collateralRequirement.challengeDuration).toBe('300') const erc20 = await collateralRequirement.token() expect(erc20.decimals).toEqual(18) @@ -125,36 +103,43 @@ describe('Agreement', () => { }) describe('signers', () => { - let signer: Signer - const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + describe('when the signer has signed', () => { + let signer: Signer + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' - beforeAll(async () => { - signer = await agreement.signer(SIGNER_ADDRESS) - }) + beforeAll(async () => { + signer = (await agreement.signer(SIGNER_ADDRESS))! + }) - test('allows querying a particular signer', async () => { - expect(signer.id).toBe( - `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}` - ) - expect(signer.address).toBe(SIGNER_ADDRESS) - expect(signer.agreementId).toBe(AGREEMENT_APP_ADDRESS) - }) + test('allows querying a particular signer', async () => { + expect(signer.id).toBe(`${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}`) + expect(signer.address).toBe(SIGNER_ADDRESS) + expect(signer.agreementId).toBe(AGREEMENT_APP_ADDRESS) + }) + + test('allows telling if a signer signed a version', async () => { + expect(await signer.hasSigned('1')).toBe(true) + expect(await signer.hasSigned('1000')).toBe(false) + }) - test('allows telling if a signer signed a version', async () => { - expect(await signer.hasSigned('1')).toBe(true) - expect(await signer.hasSigned('1000')).toBe(false) + test('allows fetching the signatures of the signer', async () => { + const signatures = await signer.signatures() + expect(signatures.length).toBeGreaterThan(0) + + const lastSignature = signatures[signatures.length - 1] + expect(lastSignature.signerId).toBe(`${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}`) + expect(lastSignature.versionId).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) + expect(lastSignature.createdAt).toBe('1599861231') + }) }) - test('allows fetching the signatures of the signer', async () => { - const signatures = await signer.signatures() - expect(signatures.length).toBeGreaterThan(0) + describe('when the signer has not signed', () => { + const SIGNER_ADDRESS = '0x0000000000000000000000000000000000000000' - const lastSignature = signatures[signatures.length - 1] - expect(lastSignature.signerId).toBe( - `${AGREEMENT_APP_ADDRESS}-signer-${SIGNER_ADDRESS}` - ) - expect(lastSignature.versionId).toBe(`${AGREEMENT_APP_ADDRESS}-version-1`) - expect(lastSignature.createdAt).toBe('1598479718') + test('returns null', async () => { + const signer = await agreement.signer(SIGNER_ADDRESS) + expect(signer).toBeNull() + }) }) }) @@ -163,23 +148,23 @@ describe('Agreement', () => { const USER = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' test('allows fetching the staking information for a user and a token', async () => { - const staking = await agreement.staking(TOKEN, USER) + const staking = (await agreement.staking(TOKEN, USER))! - expect(staking.total).toBe('3000000000000000000') - expect(staking.formattedTotalAmount).toBe('3.00') + expect(staking.total).toBe('20000000000000000015') + expect(staking.formattedTotalAmount).toBe('20.00') - expect(staking.locked).toBe('3000000000000000000') - expect(staking.formattedLockedAmount).toBe('3.00') + expect(staking.locked).toBe('15000000000000000001') + expect(staking.formattedLockedAmount).toBe('15.00') - expect(staking.available).toBe('0') - expect(staking.formattedAvailableAmount).toBe('0.00') + expect(staking.available).toBe('5000000000000000014') + expect(staking.formattedAvailableAmount).toBe('5.00') expect(staking.challenged).toBe('0') expect(staking.formattedChallengedAmount).toBe('0.00') }) - it('allows accessing the token data', async () => { - const staking = await agreement.staking(TOKEN, USER) + test('allows accessing the token data', async () => { + const staking = (await agreement.staking(TOKEN, USER))! const token = await staking.token() expect(token.id).toBe(TOKEN) @@ -195,46 +180,140 @@ describe('Agreement', () => { test('allows fetching the list of staking movements for a user', async () => { const movements = await agreement.stakingMovements(TOKEN, USER) - expect(movements.length).toBeGreaterThan(5) + expect(movements.length).toBeGreaterThan(1) - expect(movements[0].formattedAmount).toBe('1.00') - expect(movements[0].actionState).toBe('NA') - expect(movements[0].collateralState).toBe('Available') + expect(movements[0].formattedAmount).toBe('5.00') + expect(movements[0].actionState).toBe('Scheduled') + expect(movements[0].collateralState).toBe('Locked') - expect(movements[1].formattedAmount).toBe('1.00') + expect(movements[1].formattedAmount).toBe('5.00') expect(movements[1].actionState).toBe('Scheduled') expect(movements[1].collateralState).toBe('Locked') }) - describe('when there is an action associated to it', () => { - const MOVEMENT_ID = 1 + test('has an agreement action', async () => { + const movements = await agreement.stakingMovements(TOKEN, USER) + const movement = movements[1] + + expect(movement.agreementId).toBe(AGREEMENT_APP_ADDRESS) + expect(movement.actionId).toBe(`${AGREEMENT_APP_ADDRESS}-action-2`) + expect(movement.disputableAddress).toBe('0xfae0084f0171fbebf86476b9ac962680c4aa1564') + expect(movement.disputableActionId).toBe('1') - it('has an agreement action', async () => { - const movements = await agreement.stakingMovements(TOKEN, USER) - const movement = movements[MOVEMENT_ID] + const action = (await movement.action())! + expect(action.context).toBe('0x736f6d652066756e6473') + }) + }) - expect(movement.agreementId).toBe(AGREEMENT_APP_ADDRESS) - expect(movement.actionId).toBe(`${AGREEMENT_APP_ADDRESS}-action-15`) + describe('sign', () => { + const VERSION_NUMBER = '1' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' - const action = (await movement.action())! - expect(action.script).toBe('0x00000001') - expect(action.context).toBe('0x436f6e7465787420666f7220616374696f6e2031') - }) + test('returns a sign intent', async () => { + const abi = new ethers.utils.Interface(['function sign(uint256)']) + const intent = await agreement.sign(SIGNER_ADDRESS, VERSION_NUMBER) + + expect(intent.transactions.length).toBe(1) + expect(intent.destination.address).toBe(AGREEMENT_APP_ADDRESS) + + const transaction = intent.transactions[0] + expect(transaction.to).toBe(AGREEMENT_APP_ADDRESS) + expect(transaction.from).toBe(SIGNER_ADDRESS) + expect(transaction.data).toBe(abi.encodeFunctionData('sign', [VERSION_NUMBER])) }) + }) - describe('when there is no action associated to it', () => { - const MOVEMENT_ID = 0 + describe('settle', () => { + const ACTION_NUMBER = '1' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' - it('has no agreement and no action', async () => { - const movements = await agreement.stakingMovements(TOKEN, USER) - const movement = await movements[MOVEMENT_ID] + test('returns a settle intent', async () => { + const abi = new ethers.utils.Interface(['function settleAction(uint256)']) + const intent = await agreement.settle(ACTION_NUMBER, SIGNER_ADDRESS) - expect(movement.actionId).toBe(null) - expect(movement.agreementId).toBe(null) + expect(intent.transactions.length).toBe(1) + expect(intent.destination.address).toBe(AGREEMENT_APP_ADDRESS) - const action = await movement.action() - expect(action).toBe(null) - }) + const transaction = intent.transactions[0] + expect(transaction.to).toBe(AGREEMENT_APP_ADDRESS) + expect(transaction.from).toBe(SIGNER_ADDRESS) + expect(transaction.data).toBe(abi.encodeFunctionData('settleAction', [ACTION_NUMBER])) + }) + }) + + describe('close', () => { + const ACTION_NUMBER = '1' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + test('returns a close intent', async () => { + const abi = new ethers.utils.Interface(['function closeAction(uint256)']) + const intent = await agreement.close(ACTION_NUMBER, SIGNER_ADDRESS) + + expect(intent.transactions.length).toBe(1) + expect(intent.destination.address).toBe(AGREEMENT_APP_ADDRESS) + + const transaction = intent.transactions[0] + expect(transaction.to).toBe(AGREEMENT_APP_ADDRESS) + expect(transaction.from).toBe(SIGNER_ADDRESS) + expect(transaction.data).toBe(abi.encodeFunctionData('closeAction', [ACTION_NUMBER])) + }) + }) + + describe('challenge', () => { + const ACTION_NUMBER = '1' + const SETTLEMENT_OFFER = '20' + const CONTEXT = 'challenger evidence' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + test('returns a challenge intent', async () => { + const erc20ABI = new ethers.utils.Interface(['function approve(address,uint256) public returns (bool)']) + const agreementABI = new ethers.utils.Interface(['function challengeAction(uint256,uint256,bool,bytes)']) + const intent = await agreement.challenge(ACTION_NUMBER, SETTLEMENT_OFFER, true, CONTEXT, SIGNER_ADDRESS) + + expect(intent.transactions.length).toBe(2) + expect(intent.destination.address).toBe(AGREEMENT_APP_ADDRESS) + + const action = (await agreement.action(ACTION_NUMBER))! + const disputeFees = await agreement.disputeFees(action.versionId) + const collateralRequirement = await action.collateralRequirement() + const expectedApprovalAmount = bn(collateralRequirement.challengeAmount).add(disputeFees.feeAmount) + + const firstTransaction = intent.transactions[0] + expect(firstTransaction.to.toLowerCase()).toBe(disputeFees.feeToken.toLowerCase()) + expect(firstTransaction.from.toLowerCase()).toBe(SIGNER_ADDRESS) + expect(firstTransaction.data).toBe(erc20ABI.encodeFunctionData('approve', [AGREEMENT_APP_ADDRESS, expectedApprovalAmount])) + + const secondTransaction = intent.transactions[1] + expect(secondTransaction.to.toLowerCase()).toBe(AGREEMENT_APP_ADDRESS) + expect(secondTransaction.from).toBe(SIGNER_ADDRESS) + expect(secondTransaction.data).toBe(agreementABI.encodeFunctionData('challengeAction', [ACTION_NUMBER, SETTLEMENT_OFFER, true, ethers.utils.toUtf8Bytes(CONTEXT)])) + }) + }) + + describe('dispute', () => { + const ACTION_NUMBER = '1' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + test('returns a dispute intent', async () => { + const erc20ABI = new ethers.utils.Interface(['function approve(address,uint256) public returns (bool)']) + const agreementABI = new ethers.utils.Interface(['function disputeAction(uint256,bool)']) + const intent = await agreement.dispute(ACTION_NUMBER, true, SIGNER_ADDRESS) + + expect(intent.transactions.length).toBe(2) + expect(intent.destination.address).toBe(AGREEMENT_APP_ADDRESS) + + const action = (await agreement.action(ACTION_NUMBER))! + const disputeFees = await agreement.disputeFees(action.versionId) + + const firstTransaction = intent.transactions[0] + expect(firstTransaction.to.toLowerCase()).toBe(disputeFees.feeToken.toLowerCase()) + expect(firstTransaction.from.toLowerCase()).toBe(SIGNER_ADDRESS) + expect(firstTransaction.data).toBe(erc20ABI.encodeFunctionData('approve', [AGREEMENT_APP_ADDRESS, disputeFees.feeAmount])) + + const secondTransaction = intent.transactions[1] + expect(secondTransaction.to.toLowerCase()).toBe(AGREEMENT_APP_ADDRESS) + expect(secondTransaction.from).toBe(SIGNER_ADDRESS) + expect(secondTransaction.data).toBe(agreementABI.encodeFunctionData('disputeAction', [ACTION_NUMBER, true])) }) }) }) diff --git a/packages/connect-agreement/src/connect.ts b/packages/connect-agreement/src/connect.ts index 19662876..a8a0baa0 100644 --- a/packages/connect-agreement/src/connect.ts +++ b/packages/connect-agreement/src/connect.ts @@ -32,6 +32,6 @@ export default createAppConnector( verbose, }) - return new Agreement(connectorTheGraph, app.address) + return new Agreement(connectorTheGraph, app) } ) diff --git a/packages/connect-agreement/src/helpers/numbers.ts b/packages/connect-agreement/src/helpers/numbers.ts index 8c450fe1..8cc726d6 100644 --- a/packages/connect-agreement/src/helpers/numbers.ts +++ b/packages/connect-agreement/src/helpers/numbers.ts @@ -4,7 +4,7 @@ export const PCT_DECIMALS = 16 // 100% = 10^18 export const PCT_BASE = BigNumber.from(`100${'0'.repeat(PCT_DECIMALS)}`) -export const bn = (x: string): BigNumber => BigNumber.from(x) +export const bn = (x: string | number): BigNumber => BigNumber.from(x.toString()) export const formatBn = ( number: string | BigNumber, @@ -29,5 +29,10 @@ export const formatBn = ( const roundedDecimals = Math.round( parseInt(decimals) / 10 ** (decimalsLength - formattedDecimals) ) - return `${integer}.${roundedDecimals}` + + const parsedRoundedDecimals = (roundedDecimals === 0) + ? '0'.repeat(formattedDecimals) + : roundedDecimals.toString() + + return `${integer}.${parsedRoundedDecimals}` } diff --git a/packages/connect-agreement/src/models/Action.ts b/packages/connect-agreement/src/models/Action.ts index bfa3d66a..d44bce7e 100644 --- a/packages/connect-agreement/src/models/Action.ts +++ b/packages/connect-agreement/src/models/Action.ts @@ -14,7 +14,6 @@ export default class Action { readonly disputableActionId: string readonly collateralRequirementId: string readonly versionId: string - readonly script: string readonly context: string readonly createdAt: string @@ -28,7 +27,6 @@ export default class Action { this.collateralRequirementId = data.collateralRequirementId this.versionId = data.versionId this.context = data.context - this.script = data.script this.createdAt = data.createdAt } diff --git a/packages/connect-agreement/src/models/Agreement.ts b/packages/connect-agreement/src/models/Agreement.ts index 004a46d5..82abb45f 100644 --- a/packages/connect-agreement/src/models/Agreement.ts +++ b/packages/connect-agreement/src/models/Agreement.ts @@ -1,10 +1,9 @@ -import { - Address, - SubscriptionCallback, - SubscriptionResult, -} from '@aragon/connect-types' -import { subscription } from '@aragon/connect-core' +import { Contract, utils } from 'ethers' +import { SubscriptionCallback, SubscriptionResult } from '@aragon/connect-types' +import { subscription, App, ForwardingPath, arbitratorAbi } from '@aragon/connect-core' +import { bn } from '../helpers' +import Action from './Action' import Signer from './Signer' import Version from './Version' import DisputableApp from './DisputableApp' @@ -13,12 +12,15 @@ import StakingMovement from './StakingMovement' import { IAgreementConnector } from '../types' export default class Agreement { - #address: Address + #app: App #connector: IAgreementConnector - constructor(connector: IAgreementConnector, address: Address) { + readonly address: string + + constructor(connector: IAgreementConnector, app: App) { this.#connector = connector - this.#address = address + this.#app = app + this.address = app.address } async disconnect() { @@ -26,34 +28,34 @@ export default class Agreement { } async id(): Promise { - const data = await this.#connector.agreement(this.#address) + const data = await this.#connector.agreement(this.address) return data.id } async dao(): Promise { - const data = await this.#connector.agreement(this.#address) + const data = await this.#connector.agreement(this.address) return data.dao } async stakingFactory(): Promise { - const data = await this.#connector.agreement(this.#address) + const data = await this.#connector.agreement(this.address) return data.stakingFactory } async currentVersion(): Promise { - return this.#connector.currentVersion(this.#address) + return this.#connector.currentVersion(this.address) } onCurrentVersion( callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onCurrentVersion(this.#address, callback) + this.#connector.onCurrentVersion(this.address, callback) ) } versionId(versionNumber: string): string { - return `${this.#address}-version-${versionNumber}` + return `${this.address}-version-${versionNumber}` } async version(versionNumber: string): Promise { @@ -69,8 +71,14 @@ export default class Agreement { ) } + async disputeFees(versionId: string): Promise { + const version = await this.#connector.version(versionId) + const arbitrator = new Contract(version.arbitrator, arbitratorAbi, this.#app.provider) + return arbitrator.getDisputeFees() + } + async versions({ first = 1000, skip = 0 } = {}): Promise { - return this.#connector.versions(this.#address, first, skip) + return this.#connector.versions(this.address, first, skip) } onVersions( @@ -78,14 +86,12 @@ export default class Agreement { callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onVersions(this.#address, first, skip, callback) + this.#connector.onVersions(this.address, first, skip, callback) ) } - async disputableApps({ first = 1000, skip = 0 } = {}): Promise< - DisputableApp[] - > { - return this.#connector.disputableApps(this.#address, first, skip) + async disputableApps({ first = 1000, skip = 0 } = {}): Promise { + return this.#connector.disputableApps(this.address, first, skip) } onDisputableApps( @@ -93,41 +99,41 @@ export default class Agreement { callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onDisputableApps(this.#address, first, skip, callback) + this.#connector.onDisputableApps(this.address, first, skip, callback) ) } signerId(signerAddress: string): string { - return `${this.#address}-signer-${signerAddress.toLowerCase()}` + return `${this.address}-signer-${signerAddress.toLowerCase()}` } - async signer(signerAddress: string): Promise { + async signer(signerAddress: string): Promise { return this.#connector.signer(this.signerId(signerAddress)) } onSigner( signerAddress: string, - callback?: SubscriptionCallback - ): SubscriptionResult { - return subscription(callback, (callback) => + callback?: SubscriptionCallback + ): SubscriptionResult { + return subscription(callback, (callback) => this.#connector.onSigner(this.signerId(signerAddress), callback) ) } stakingId(tokenAddress: string, userAddress: string): string { - return `${tokenAddress.toLowerCase()}-user-${userAddress.toLowerCase()}` + return `${tokenAddress.toLowerCase()}-staking-${userAddress.toLowerCase()}` } - async staking(tokenAddress: string, userAddress: string): Promise { + async staking(tokenAddress: string, userAddress: string): Promise { return this.#connector.staking(this.stakingId(tokenAddress, userAddress)) } onStaking( tokenAddress: string, userAddress: string, - callback?: SubscriptionCallback - ): SubscriptionResult { - return subscription(callback, (callback) => + callback?: SubscriptionCallback + ): SubscriptionResult { + return subscription(callback, (callback) => this.#connector.onStaking(this.stakingId(tokenAddress, userAddress), callback) ) } @@ -137,7 +143,7 @@ export default class Agreement { userAddress: string, { first = 1000, skip = 0 } = {}, ): Promise { - return this.#connector.stakingMovements(this.stakingId(tokenAddress, userAddress), this.#address, first, skip) + return this.#connector.stakingMovements(this.stakingId(tokenAddress, userAddress), this.address, first, skip) } onStakingMovements( @@ -147,7 +153,80 @@ export default class Agreement { callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onStakingMovements(this.stakingId(tokenAddress, userAddress), this.#address, first, skip, callback) + this.#connector.onStakingMovements(this.stakingId(tokenAddress, userAddress), this.address, first, skip, callback) + ) + } + + actionId(actionNumber: string): string { + return `${this.address.toLowerCase()}-action-${actionNumber}` + } + + async action(actionNumber: string): Promise { + const action = await this.tryAction(actionNumber) + if (!action) { + throw Error(`Could not find given action number ${actionNumber}`) + } + return action as Action + } + + async tryAction(actionNumber: string): Promise { + return this.#connector.action(this.actionId(actionNumber)) + } + + onAction(actionNumber: string, callback?: SubscriptionCallback): SubscriptionResult { + return subscription(callback, (callback) => + this.#connector.onAction(this.actionId(actionNumber), callback) ) } + + async sign(signerAddress: string, versionNumber?: string): Promise { + if (!versionNumber) { + versionNumber = (await this.currentVersion()).versionId + } + return this.#app.intent('sign', [versionNumber], { actAs: signerAddress }) + } + + async challenge(actionNumber: string, settlementOffer: string, finishedEvidence: boolean, context: string, signerAddress: string): Promise { + const intent = await this.#app.intent('challengeAction', [actionNumber, settlementOffer, finishedEvidence, utils.toUtf8Bytes(context)], { actAs: signerAddress }) + + const action = await this.action(actionNumber) + const { feeToken, feeAmount } = await this.disputeFees(action.versionId) + const { tokenId: collateralToken, challengeAmount } = await action.collateralRequirement() + const challengeCollateral = bn(challengeAmount) + + // approve challenge collateral and dispute fees + const preTransactions = [] + if (feeToken.toLowerCase() == collateralToken.toLowerCase()) { + const approvalAmount = challengeCollateral.add(feeAmount) + const approvePreTransactions = await intent.buildApprovePreTransactions({ address: feeToken, value: approvalAmount }) + preTransactions.push(...approvePreTransactions) + } else { + const feesPreTransactions = await intent.buildApprovePreTransactions({ address: feeToken, value: feeAmount }) + const collateralPreTransactions = await intent.buildApprovePreTransactions({ address: collateralToken, value: challengeCollateral }) + preTransactions.push(...feesPreTransactions, ...collateralPreTransactions) + } + + intent.applyPreTransactions(preTransactions) + return intent + } + + async dispute(actionNumber: string, finishedEvidence: boolean, signerAddress: string): Promise { + const intent = await this.#app.intent('disputeAction', [actionNumber, finishedEvidence], { actAs: signerAddress }) + + const action = await this.action(actionNumber) + const { feeToken, feeAmount } = await this.disputeFees(action.versionId) + + // approve dispute fees + const preTransactions = await intent.buildApprovePreTransactions({ address: feeToken, value: feeAmount }) + intent.applyPreTransactions(preTransactions) + return intent + } + + settle(actionNumber: string, signerAddress: string): Promise { + return this.#app.intent('settleAction', [actionNumber], { actAs: signerAddress }) + } + + close(actionNumber: string, signerAddress: string): Promise { + return this.#app.intent('closeAction', [actionNumber], { actAs: signerAddress }) + } } diff --git a/packages/connect-agreement/src/models/CollateralRequirement.ts b/packages/connect-agreement/src/models/CollateralRequirement.ts index 098d0488..b9428ea5 100644 --- a/packages/connect-agreement/src/models/CollateralRequirement.ts +++ b/packages/connect-agreement/src/models/CollateralRequirement.ts @@ -10,6 +10,7 @@ export default class CollateralRequirement { readonly id: string readonly disputableAppId: string readonly tokenId: string + readonly tokenSymbol: string readonly tokenDecimals: string readonly actionAmount: string readonly challengeAmount: string @@ -21,6 +22,7 @@ export default class CollateralRequirement { this.id = data.id this.disputableAppId = data.disputableAppId this.tokenId = data.tokenId + this.tokenSymbol = data.tokenSymbol this.tokenDecimals = data.tokenDecimals this.actionAmount = data.actionAmount this.challengeAmount = data.challengeAmount diff --git a/packages/connect-agreement/src/models/DisputableApp.ts b/packages/connect-agreement/src/models/DisputableApp.ts index 3d8bde35..6c44f634 100644 --- a/packages/connect-agreement/src/models/DisputableApp.ts +++ b/packages/connect-agreement/src/models/DisputableApp.ts @@ -9,7 +9,7 @@ export default class DisputableApp { readonly id: string readonly address: string readonly agreementId: string - readonly collateralRequirementId: string + readonly currentCollateralRequirementId: string readonly activated: boolean constructor(data: DisputableAppData, connector: IAgreementConnector) { @@ -18,19 +18,19 @@ export default class DisputableApp { this.id = data.id this.address = data.address this.agreementId = data.agreementId - this.collateralRequirementId = data.collateralRequirementId + this.currentCollateralRequirementId = data.currentCollateralRequirementId this.activated = data.activated } async collateralRequirement(): Promise { - return this.#connector.collateralRequirement(this.id) + return this.#connector.collateralRequirement(this.currentCollateralRequirementId) } onCollateralRequirement( callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onCollateralRequirement(this.id, callback) + this.#connector.onCollateralRequirement(this.currentCollateralRequirementId, callback) ) } } diff --git a/packages/connect-agreement/src/models/Staking.ts b/packages/connect-agreement/src/models/Staking.ts index d560e153..fc953254 100644 --- a/packages/connect-agreement/src/models/Staking.ts +++ b/packages/connect-agreement/src/models/Staking.ts @@ -11,6 +11,7 @@ export default class Staking { readonly id: string readonly user: string readonly tokenId: string + readonly tokenSymbol: string readonly tokenDecimals: string readonly available: string readonly locked: string @@ -23,6 +24,7 @@ export default class Staking { this.id = data.id this.user = data.user this.tokenId = data.tokenId + this.tokenSymbol = data.tokenSymbol this.tokenDecimals = data.tokenDecimals this.available = data.available this.locked = data.locked diff --git a/packages/connect-agreement/src/models/StakingMovement.ts b/packages/connect-agreement/src/models/StakingMovement.ts index bd65926c..24b8894f 100644 --- a/packages/connect-agreement/src/models/StakingMovement.ts +++ b/packages/connect-agreement/src/models/StakingMovement.ts @@ -15,9 +15,12 @@ export default class StakingMovement { readonly stakingId: string readonly agreementId: string readonly tokenId: string + readonly tokenSymbol: string readonly tokenDecimals: string readonly amount: string readonly actionId: string + readonly disputableAddress: string + readonly disputableActionId: string readonly actionState: string readonly collateralState: string readonly createdAt: string @@ -29,9 +32,12 @@ export default class StakingMovement { this.stakingId = data.stakingId this.agreementId = data.agreementId this.tokenId = data.tokenId + this.tokenSymbol = data.tokenSymbol this.tokenDecimals = data.tokenDecimals this.amount = data.amount this.actionId = data.actionId + this.disputableAddress = data.disputableAddress + this.disputableActionId = data.disputableActionId this.actionState = data.actionState this.collateralState = data.collateralState this.createdAt = data.createdAt @@ -55,18 +61,26 @@ export default class StakingMovement { ) } - async staking(): Promise { + async staking(): Promise { return this.#connector.staking(this.stakingId) } - onStaking(callback?: SubscriptionCallback): SubscriptionResult { - return subscription(callback, (callback) => + onStaking(callback?: SubscriptionCallback): SubscriptionResult { + return subscription(callback, (callback) => this.#connector.onStaking(this.stakingId, callback) ) } - async action(): Promise { - return this.#connector.action(this.actionId || '') + async action(): Promise { + const action = await this.tryAction() + if (!action) { + throw Error(`Could not find given action number ${this.actionId}`) + } + return action as Action + } + + async tryAction(): Promise { + return this.#connector.action(this.actionId) } onAction(callback?: SubscriptionCallback): SubscriptionResult { diff --git a/packages/connect-agreement/src/thegraph/connector.ts b/packages/connect-agreement/src/thegraph/connector.ts index 7515784f..7590cb3e 100644 --- a/packages/connect-agreement/src/thegraph/connector.ts +++ b/packages/connect-agreement/src/thegraph/connector.ts @@ -198,8 +198,8 @@ export default class AgreementConnectorTheGraph implements IAgreementConnector { ) } - async signer(signerId: string): Promise { - return this.#gql.performQueryWithParser( + async signer(signerId: string): Promise { + return this.#gql.performQueryWithParser( queries.GET_SIGNER('query'), { signerId }, (result: QueryResult) => parseSigner(result, this) @@ -208,9 +208,9 @@ export default class AgreementConnectorTheGraph implements IAgreementConnector { onSigner( signerId: string, - callback: SubscriptionCallback + callback: SubscriptionCallback ): SubscriptionHandler { - return this.#gql.subscribeToQueryWithParser( + return this.#gql.subscribeToQueryWithParser( queries.GET_SIGNER('query'), { signerId }, callback, @@ -245,28 +245,30 @@ export default class AgreementConnectorTheGraph implements IAgreementConnector { } async collateralRequirement( - disputableAppId: string + collateralRequirementId: string ): Promise { return this.#gql.performQueryWithParser( queries.GET_COLLATERAL_REQUIREMENT('query'), - { disputableAppId }, + { collateralRequirementId }, (result: QueryResult) => parseCollateralRequirement(result, this) ) } onCollateralRequirement( - disputableAppId: string, + collateralRequirementId: string, callback: SubscriptionCallback ): SubscriptionHandler { return this.#gql.subscribeToQueryWithParser( queries.GET_COLLATERAL_REQUIREMENT('subscription'), - { disputableAppId }, + { collateralRequirementId }, callback, (result: QueryResult) => parseCollateralRequirement(result, this) ) } - async staking(stakingId: string): Promise { + async staking( + stakingId: string + ): Promise { return this.#gql.performQueryWithParser( queries.GET_STAKING('query'), { stakingId }, @@ -276,9 +278,9 @@ export default class AgreementConnectorTheGraph implements IAgreementConnector { onStaking( stakingId: string, - callback: SubscriptionCallback + callback: SubscriptionCallback ): SubscriptionHandler { - return this.#gql.subscribeToQueryWithParser( + return this.#gql.subscribeToQueryWithParser( queries.GET_STAKING('query'), { stakingId }, callback, @@ -288,29 +290,27 @@ export default class AgreementConnectorTheGraph implements IAgreementConnector { async stakingMovements( stakingId: string, - agreement: string, + agreementId: string, first: number, skip: number ): Promise { - const agreements = [agreement, '0x0000000000000000000000000000000000000000'] return this.#gql.performQueryWithParser( queries.GET_STAKING_MOVEMENTS('query'), - { stakingId, agreements, first, skip }, + { stakingId, agreementId, first, skip }, (result: QueryResult) => parseStakingMovements(result, this) ) } onStakingMovements( stakingId: string, - agreement: string, + agreementId: string, first: number, skip: number, callback: SubscriptionCallback ): SubscriptionHandler { - const agreements = [agreement, '0x0000000000000000000000000000000000000000'] return this.#gql.subscribeToQueryWithParser( queries.GET_STAKING_MOVEMENTS('query'), - { stakingId, agreements, first, skip }, + { stakingId, agreementId, first, skip }, callback, (result: QueryResult) => parseStakingMovements(result, this) ) diff --git a/packages/connect-agreement/src/thegraph/parsers/actions.ts b/packages/connect-agreement/src/thegraph/parsers/actions.ts index cc21d404..b4762b7c 100644 --- a/packages/connect-agreement/src/thegraph/parsers/actions.ts +++ b/packages/connect-agreement/src/thegraph/parsers/actions.ts @@ -9,7 +9,7 @@ export function parseAction(result: QueryResult, connector: any): Action | null return null } - const { id, agreement, collateralRequirement, disputable, version, disputableActionId, script, context, createdAt } = action + const { id, agreement, collateralRequirement, disputable, version, disputableActionId, context, createdAt } = action return new Action( { @@ -19,7 +19,6 @@ export function parseAction(result: QueryResult, connector: any): Action | null disputableId: disputable.id, collateralRequirementId: collateralRequirement.id, disputableActionId, - script, context, createdAt }, diff --git a/packages/connect-agreement/src/thegraph/parsers/collateralRequirements.ts b/packages/connect-agreement/src/thegraph/parsers/collateralRequirements.ts index e6b77dc1..d074061d 100644 --- a/packages/connect-agreement/src/thegraph/parsers/collateralRequirements.ts +++ b/packages/connect-agreement/src/thegraph/parsers/collateralRequirements.ts @@ -20,6 +20,7 @@ function buildCollateralRequirement( id, disputableAppId: disputable.id, tokenId: token.id, + tokenSymbol: token.symbol, tokenDecimals: token.decimals, actionAmount, challengeAmount, @@ -33,12 +34,11 @@ export function parseCollateralRequirement( result: QueryResult, connector: any ): CollateralRequirement { - const disputable = result.data.disputable + const collateralRequirement = result.data.collateralRequirement - if (!disputable || !disputable.currentCollateralRequirement) { + if (!collateralRequirement) { throw new Error('Unable to parse collateral requirement.') } - const { currentCollateralRequirement } = disputable - return buildCollateralRequirement(currentCollateralRequirement, connector) + return buildCollateralRequirement(collateralRequirement, connector) } diff --git a/packages/connect-agreement/src/thegraph/parsers/disputableApps.ts b/packages/connect-agreement/src/thegraph/parsers/disputableApps.ts index a7589bfb..2f591677 100644 --- a/packages/connect-agreement/src/thegraph/parsers/disputableApps.ts +++ b/packages/connect-agreement/src/thegraph/parsers/disputableApps.ts @@ -17,7 +17,7 @@ function buildDisputableApp(disputableApp: any, connector: any): DisputableApp { address, activated, agreementId: agreement.id, - collateralRequirementId: currentCollateralRequirement.id, + currentCollateralRequirementId: currentCollateralRequirement.id, } return new DisputableApp(disputableAppData, connector) diff --git a/packages/connect-agreement/src/thegraph/parsers/signers.ts b/packages/connect-agreement/src/thegraph/parsers/signers.ts index 2294b924..5d013e6f 100644 --- a/packages/connect-agreement/src/thegraph/parsers/signers.ts +++ b/packages/connect-agreement/src/thegraph/parsers/signers.ts @@ -3,11 +3,11 @@ import { QueryResult } from '@aragon/connect-thegraph' import Signer from '../../models/Signer' import Signature from '../../models/Signature' -export function parseSigner(result: QueryResult, connector: any): Signer { +export function parseSigner(result: QueryResult, connector: any): Signer | null { const signer = result.data.signer if (!signer) { - throw new Error('Unable to parse signer.') + return null } return new Signer( diff --git a/packages/connect-agreement/src/thegraph/parsers/staking.ts b/packages/connect-agreement/src/thegraph/parsers/staking.ts index 8ae643e3..d87bcc40 100644 --- a/packages/connect-agreement/src/thegraph/parsers/staking.ts +++ b/packages/connect-agreement/src/thegraph/parsers/staking.ts @@ -3,11 +3,11 @@ import { QueryResult } from '@aragon/connect-thegraph' import Staking from '../../models/Staking' import StakingMovement from '../../models/StakingMovement' -export function parseStaking(result: QueryResult, connector: any): Staking { +export function parseStaking(result: QueryResult, connector: any): Staking | null { const staking = result.data.staking if (!staking) { - throw new Error('Unable to parse staking.') + return null } const { id, token, user, total, available, locked, challenged } = staking @@ -21,6 +21,7 @@ export function parseStaking(result: QueryResult, connector: any): Staking { locked, challenged, tokenId: token.id, + tokenSymbol: token.symbol, tokenDecimals: token.decimals, }, connector @@ -49,9 +50,12 @@ export function parseStakingMovements( createdAt, stakingId: staking.id, tokenId: staking.token.id, + tokenSymbol: staking.token.symbol, tokenDecimals: staking.token.decimals, - actionId: (action ? action.id : null), - agreementId: (agreement ? agreement.id : null), + actionId: action.id, + disputableAddress: action.disputable.address, + disputableActionId: action.disputableActionId, + agreementId: agreement.id }, connector ) diff --git a/packages/connect-agreement/src/thegraph/queries/index.ts b/packages/connect-agreement/src/thegraph/queries/index.ts index ef33da7d..a3af595a 100644 --- a/packages/connect-agreement/src/thegraph/queries/index.ts +++ b/packages/connect-agreement/src/thegraph/queries/index.ts @@ -101,20 +101,19 @@ export const GET_SIGNATURES = (type: string) => gql` ` export const GET_COLLATERAL_REQUIREMENT = (type: string) => gql` - ${type} CollateralRequirement($disputableAppId: String!) { - disputable(id: $disputableAppId) { - currentCollateralRequirement { + ${type} CollateralRequirement($collateralRequirementId: String!) { + collateralRequirement(id: $collateralRequirementId) { + id + actionAmount + challengeAmount + challengeDuration + disputable { id - actionAmount - challengeAmount - challengeDuration - disputable { - id - } - token { - id - decimals - } + } + token { + id + symbol + decimals } } } @@ -127,6 +126,7 @@ export const GET_STAKING = (type: string) => gql` user token { id + symbol decimals } available @@ -138,16 +138,17 @@ export const GET_STAKING = (type: string) => gql` ` export const GET_STAKING_MOVEMENTS = (type: string) => gql` - ${type} StakingMovements($stakingId: String!, $agreements: [String]!, $first: Int!, $skip: Int!) { + ${type} StakingMovements($stakingId: String!, $agreementId: String!, $first: Int!, $skip: Int!) { stakingMovements(where: { staking: $stakingId, - agreementId_in: $agreements, + agreement: $agreementId, }, orderBy: createdAt, orderDirection: asc, first: $first, skip: $skip) { id staking { id token { id + symbol decimals } } @@ -156,6 +157,10 @@ export const GET_STAKING_MOVEMENTS = (type: string) => gql` } action { id + disputableActionId + disputable { + address + } } amount actionState @@ -182,7 +187,6 @@ export const GET_ACTION = (type: string) => gql` id } disputableActionId - script context createdAt } diff --git a/packages/connect-agreement/src/types.ts b/packages/connect-agreement/src/types.ts index 60643653..824f0686 100644 --- a/packages/connect-agreement/src/types.ts +++ b/packages/connect-agreement/src/types.ts @@ -35,13 +35,14 @@ export interface DisputableAppData { address: string agreementId: string activated: boolean - collateralRequirementId: string + currentCollateralRequirementId: string } export interface CollateralRequirementData { id: string disputableAppId: string tokenId: string + tokenSymbol: string tokenDecimals: string actionAmount: string challengeAmount: string @@ -76,7 +77,6 @@ export interface ActionData { collateralRequirementId: string versionId: string context: string - script: string createdAt: string } @@ -84,6 +84,7 @@ export interface StakingData { id: string user: string tokenId: string + tokenSymbol: string tokenDecimals: string available: string locked: string @@ -94,11 +95,14 @@ export interface StakingData { export interface StakingMovementData { id: string tokenId: string + tokenSymbol: string tokenDecimals: string stakingId: string agreementId: string amount: string actionId: string + disputableAddress: string + disputableActionId: string actionState: string collateralState: string createdAt: string @@ -139,10 +143,10 @@ export interface IAgreementConnector { skip: number, callback: SubscriptionCallback ): SubscriptionHandler - signer(signerId: string): Promise + signer(signerId: string): Promise onSigner( signerId: string, - callback: SubscriptionCallback + callback: SubscriptionCallback ): SubscriptionHandler signatures( signerId: string, @@ -155,9 +159,9 @@ export interface IAgreementConnector { skip: number, callback: SubscriptionCallback ): SubscriptionHandler - collateralRequirement(disputableAppId: string): Promise + collateralRequirement(collateralRequirementId: string): Promise onCollateralRequirement( - disputableAppId: string, + collateralRequirementId: string, callback: SubscriptionCallback ): SubscriptionHandler action(actionId: string): Promise @@ -165,10 +169,10 @@ export interface IAgreementConnector { actionId: string, callback: SubscriptionCallback ): SubscriptionHandler - staking(stakingId: string): Promise + staking(stakingId: string): Promise onStaking( stakingId: string, - callback: SubscriptionCallback + callback: SubscriptionCallback ): SubscriptionHandler stakingMovements( stakingId: string, diff --git a/packages/connect-agreement/subgraph/abis/Staking.json b/packages/connect-agreement/subgraph/abis/Staking.json index 1bcb510f..997f407c 100644 --- a/packages/connect-agreement/subgraph/abis/Staking.json +++ b/packages/connect-agreement/subgraph/abis/Staking.json @@ -1,979 +1,841 @@ -[ - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "lockManager", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "allowance", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "increase", - "type": "bool" - } - ], - "name": "LockAllowanceChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "lockManager", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bool", - "name": "increase", - "type": "bool" - } - ], - "name": "LockAmountChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "lockManager", - "type": "address" - } - ], - "name": "LockManagerRemoved", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "oldLockManager", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "newLockManager", - "type": "address" - } - ], - "name": "LockManagerTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "lockManager", - "type": "address" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "NewLockManager", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "from", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "to", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "StakeTransferred", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "total", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "Staked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "lockManager", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "Unlocked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "user", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "total", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "name": "Unstaked", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "getInitializationBlock", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "hasInitialized", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "isPetrified", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "contract ERC20", - "name": "_stakingToken", - "type": "address" - } - ], - "name": "initialize", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "stake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "stakeFor", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "unstake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_allowance", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "allowManager", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_allowance", - "type": "uint256" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "allowManagerAndLock", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "transfer", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "transferAndUnstake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "slash", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "slashAndUnstake", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "address", - "name": "_to", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_unlockAmount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_slashAmount", - "type": "uint256" - } - ], - "name": "slashAndUnlock", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_allowance", - "type": "uint256" - } - ], - "name": "increaseLockAllowance", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_allowance", - "type": "uint256" - } - ], - "name": "decreaseLockAllowance", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "lock", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "unlock", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - } - ], - "name": "unlockAndRemoveManager", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_newLockManager", - "type": "address" - } - ], - "name": "setLockManager", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "address", - "name": "_from", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "address", - "name": "_token", - "type": "address" - }, - { - "internalType": "bytes", - "name": "_data", - "type": "bytes" - } - ], - "name": "receiveApproval", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "supportsHistory", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "pure", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "token", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "lastStakedFor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "lockedBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - } - ], - "name": "getLock", - "outputs": [ - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_allowance", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "getBalancesOf", - "outputs": [ - { - "internalType": "uint256", - "name": "staked", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "locked", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "totalStakedFor", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [], - "name": "totalStaked", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_blockNumber", - "type": "uint256" - } - ], - "name": "totalStakedForAt", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "uint256", - "name": "_blockNumber", - "type": "uint256" - } - ], - "name": "totalStakedAt", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_user", - "type": "address" - } - ], - "name": "unlockedBalanceOf", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "address", - "name": "_sender", - "type": "address" - }, - { - "internalType": "address", - "name": "_user", - "type": "address" - }, - { - "internalType": "address", - "name": "_lockManager", - "type": "address" - }, - { - "internalType": "uint256", - "name": "_amount", - "type": "uint256" - } - ], - "name": "canUnlock", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - } -] +{ + "abi": [ + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_token", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "lockManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + } + ], + "name": "LockAllowanceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "lockManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "LockAmountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "lockManager", + "type": "address" + } + ], + "name": "LockManagerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "oldLockManager", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newLockManager", + "type": "address" + } + ], + "name": "LockManagerTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "lockManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "NewLockManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "StakeTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "total", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "Staked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "total", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "Unstaked", + "type": "event" + }, + { + "constant": true, + "inputs": [], + "name": "token", + "outputs": [ + { + "internalType": "contract IERC20", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "stake", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "stakeFor", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "unstake", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_allowance", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "allowManager", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_allowance", + "type": "uint256" + } + ], + "name": "increaseLockAllowance", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_allowance", + "type": "uint256" + } + ], + "name": "decreaseLockAllowance", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "lock", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "unlock", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + } + ], + "name": "unlockAndRemoveManager", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "slash", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "slashAndUnstake", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_unlockAmount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_slashAmount", + "type": "uint256" + } + ], + "name": "slashAndUnlock", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "transferAndUnstake", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "address", + "name": "_from", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + }, + { + "internalType": "address", + "name": "_token", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "name": "receiveApproval", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "supportsHistory", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "lastStakedFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "lockedBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + } + ], + "name": "getLock", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "allowance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "getBalancesOf", + "outputs": [ + { + "internalType": "uint256", + "name": "staked", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "locked", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "totalStakedFor", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalStaked", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_blockNumber", + "type": "uint256" + } + ], + "name": "totalStakedForAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "uint256", + "name": "_blockNumber", + "type": "uint256" + } + ], + "name": "totalStakedAt", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_user", + "type": "address" + } + ], + "name": "unlockedBalanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "address", + "name": "_sender", + "type": "address" + }, + { + "internalType": "address", + "name": "_user", + "type": "address" + }, + { + "internalType": "address", + "name": "_lockManager", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "canUnlock", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/packages/connect-agreement/subgraph/abis/StakingFactory.json b/packages/connect-agreement/subgraph/abis/StakingFactory.json index 906f1ce0..b4ba4dc8 100644 --- a/packages/connect-agreement/subgraph/abis/StakingFactory.json +++ b/packages/connect-agreement/subgraph/abis/StakingFactory.json @@ -1,105 +1,86 @@ -[ - { - "inputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "instance", - "type": "address" - }, - { - "indexed": false, - "internalType": "address", - "name": "token", - "type": "address" - } - ], - "name": "NewStaking", - "type": "event" - }, - { - "constant": true, - "inputs": [], - "name": "baseImplementation", - "outputs": [ - { - "internalType": "contract Staking", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "contract ERC20", - "name": "token", - "type": "address" - } - ], - "name": "existsInstance", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": true, - "inputs": [ - { - "internalType": "contract ERC20", - "name": "token", - "type": "address" - } - ], - "name": "getInstance", - "outputs": [ - { - "internalType": "contract Staking", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "view", - "type": "function" - }, - { - "constant": false, - "inputs": [ - { - "internalType": "contract ERC20", - "name": "token", - "type": "address" - } - ], - "name": "getOrCreateInstance", - "outputs": [ - { - "internalType": "contract Staking", - "name": "", - "type": "address" - } - ], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - } -] +{ + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "instance", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + } + ], + "name": "NewStaking", + "type": "event" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_token", + "type": "address" + } + ], + "name": "existsInstance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_token", + "type": "address" + } + ], + "name": "getOrCreateInstance", + "outputs": [ + { + "internalType": "contract Staking", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_token", + "type": "address" + } + ], + "name": "getInstance", + "outputs": [ + { + "internalType": "contract Staking", + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } + ] +} \ No newline at end of file diff --git a/packages/connect-agreement/subgraph/manifest/data/rinkeby-staging.json b/packages/connect-agreement/subgraph/manifest/data/rinkeby-staging.json index 9664744d..135814d1 100644 --- a/packages/connect-agreement/subgraph/manifest/data/rinkeby-staging.json +++ b/packages/connect-agreement/subgraph/manifest/data/rinkeby-staging.json @@ -4,8 +4,8 @@ "Organizations": [ { "name": "Agreement", - "address": "0x51A41E43af0774565f0be5cEbC50C693CC19E4eE", - "startBlock": "6921112" + "address": "0xfa5bae0029f0c2acffcc71ada4249bd0eaafd1f4", + "startBlock": "7200827" } ], "OrganizationFactories": [], diff --git a/packages/connect-agreement/subgraph/schema.graphql b/packages/connect-agreement/subgraph/schema.graphql index 1907c029..7f3541c0 100644 --- a/packages/connect-agreement/subgraph/schema.graphql +++ b/packages/connect-agreement/subgraph/schema.graphql @@ -39,7 +39,6 @@ type Action @entity { disputable: Disputable! actionId: BigInt! disputableActionId: BigInt! - script: Bytes context: Bytes! closed: Boolean! submitter: Signer! @@ -130,9 +129,8 @@ type StakingMovement @entity { id: ID! staking: Staking! amount: BigInt! - agreementId: Bytes! - agreement: Agreement - action: Action + agreement: Agreement! + action: Action! actionState: StakingActionState! collateralState: StakingCollateralState! createdAt: BigInt! @@ -142,8 +140,7 @@ enum StakingCollateralState { Available, Locked, Challenged, - Slashed, - Withdrawn + Slashed } enum StakingActionState { diff --git a/packages/connect-agreement/subgraph/src/Agreement.ts b/packages/connect-agreement/subgraph/src/Agreement.ts index 8e45eeee..da5da4b2 100644 --- a/packages/connect-agreement/subgraph/src/Agreement.ts +++ b/packages/connect-agreement/subgraph/src/Agreement.ts @@ -1,13 +1,10 @@ -import { ethereum, BigInt, Address, log } from '@graphprotocol/graph-ts' +import { ethereum, BigInt, Address } from '@graphprotocol/graph-ts' import { ERC20 } from '../generated/schema' import { ERC20 as ERC20Contract } from '../generated/templates/Agreement/ERC20' -import { createAgreementStakingMovement } from './Staking' -import { Staking as StakingTemplate } from '../generated/templates' +import { Staking as StakingContract } from '../generated/templates/Agreement/Staking' import { StakingFactory as StakingFactoryContract } from '../generated/templates/Agreement/StakingFactory' -import { DisputableVoting as DisputableVotingTemplate } from '../generated/templates' -import { DisputableAragonApp as DisputableAragonAppContract } from '../generated/templates/DisputableVoting/DisputableAragonApp' -import { Agreement, Action, Signature, Version, Disputable, Challenge, Dispute, Evidence, Signer, CollateralRequirement, ArbitratorFee } from '../generated/schema' +import { Agreement, Action, Signature, Version, Disputable, Challenge, Dispute, Evidence, Signer, CollateralRequirement, ArbitratorFee, StakingMovement, Staking } from '../generated/schema' import { Agreement as AgreementContract, ActionSubmitted, @@ -28,10 +25,6 @@ import { /* eslint-disable @typescript-eslint/no-use-before-define */ -const DISPUTABLE_VOTING_OPEN = '0x705b5084c67966bb8e4640b28bab7a1e51e03d209d84e3a04d2a4f7415f93b34' -const DISPUTABLE_VOTING_PRECEDENCE_CAMPAIGN = '0x39aa9e500efe56efda203714d12c78959ecbf71223162614ab5b56eaba014145' - - export function handleSettingChanged(event: SettingChanged): void { const agreementApp = AgreementContract.bind(event.address) const settingData = agreementApp.getSetting(event.params.settingId) @@ -102,7 +95,7 @@ export function handleActionSubmitted(event: ActionSubmitted): void { action.createdAt = event.block.timestamp action.save() - createAgreementStakingMovement(event.address, event.params.actionId, 'new', event) + createStakingMovement(event.address, event.params.actionId, 'new', event) } export function handleActionClosed(event: ActionClosed): void { @@ -110,7 +103,7 @@ export function handleActionClosed(event: ActionClosed): void { action.closed = true action.save() - createAgreementStakingMovement(event.address, event.params.actionId, 'closed', event) + createStakingMovement(event.address, event.params.actionId, 'closed', event) } export function handleActionChallenged(event: ActionChallenged): void { @@ -139,12 +132,12 @@ export function handleActionChallenged(event: ActionChallenged): void { challenge.challengerArbitratorFee = challengerArbitratorFeeId challenge.save() - createAgreementStakingMovement(event.address, event.params.actionId, 'challenged', event) + createStakingMovement(event.address, event.params.actionId, 'challenged', event) } export function handleActionSettled(event: ActionSettled): void { updateChallengeState(event.address, event.params.challengeId) - createAgreementStakingMovement(event.address, event.params.actionId, 'settled', event) + createStakingMovement(event.address, event.params.actionId, 'settled', event) } export function handleActionDisputed(event: ActionDisputed): void { @@ -177,7 +170,7 @@ export function handleActionVoided(event: ActionVoided): void { export function handleActionRejected(event: ActionRejected): void { updateChallengeState(event.address, event.params.challengeId) updateDisputeState(event.address, event.params.challengeId, event) - createAgreementStakingMovement(event.address, event.params.actionId, 'rejected', event) + createStakingMovement(event.address, event.params.actionId, 'rejected', event) } export function handleEvidenceSubmitted(event: EvidenceSubmitted): void { @@ -220,27 +213,10 @@ function loadOrCreateDisputable(agreement: Address, disputableAddress: Address): disputable = new Disputable(disputableId) disputable.agreement = agreement.toHexString() disputable.address = disputableAddress - createDisputableTemplate(disputableAddress) } return disputable! } -function createDisputableTemplate(disputable: Address): void { - const disputableApp = DisputableAragonAppContract.bind(disputable) - const optionalAppId = disputableApp.try_appId() - - if (!optionalAppId.reverted) { - const appId = optionalAppId.value.toHexString() - if (appId == DISPUTABLE_VOTING_OPEN || appId == DISPUTABLE_VOTING_PRECEDENCE_CAMPAIGN) { - DisputableVotingTemplate.create(disputable) - } else { - log.warning('Received unknown disputable app with app ID {}', [appId]) - } - } else { - log.warning('Received disputable app without app ID', []) - } -} - function loadOrCreateDispute(agreement: Address, challengeId: BigInt, event: ethereum.Event): Dispute { const agreementApp = AgreementContract.bind(agreement) const challengeData = agreementApp.getChallenge(challengeId) @@ -294,6 +270,91 @@ function updateCollateralRequirement(agreement: Address, disputable: Address, co requirement.save() } +function createStakingMovement(agreement: Address, actionId: BigInt, type: string, event: ethereum.Event): void { + const agreementApp = AgreementContract.bind(agreement) + const actionData = agreementApp.getAction(actionId) + const collateralData = agreementApp.getCollateralRequirement(actionData.value0, actionData.value2) + + const user = actionData.value4 + const token = collateralData.value0 + const collateralAmount = collateralData.value2 + + if (collateralAmount.equals(BigInt.fromI32(0))) { + return + } + + const factory = StakingFactoryContract.bind(agreementApp.stakingFactory()) + const stakingAddress = factory.getInstance(token) + const staking = updateStaking(stakingAddress, token, user) + + const id = buildStakingMovementId(token, user, buildId(event)) + const movement = new StakingMovement(id) + movement.staking = staking.id + movement.agreement = agreement.toHexString() + movement.action = buildActionId(agreement, actionId) + movement.createdAt = event.block.timestamp + + if (type == 'new') { + movement.amount = collateralAmount + movement.actionState = 'Scheduled' + movement.collateralState = 'Locked' + } else if (type == 'challenged') { + movement.amount = collateralAmount + movement.actionState = 'Challenged' + movement.collateralState = 'Challenged' + staking.challenged = staking.challenged.plus(collateralAmount) + } else if (type == 'settled') { + const challengeData = agreementApp.getChallenge(actionData.value7) + movement.amount = challengeData.value4 + movement.actionState = 'Settled' + movement.collateralState = 'Slashed' + staking.challenged = staking.challenged.minus(collateralAmount) + } else if (type == 'rejected') { + movement.amount = collateralAmount + movement.actionState = 'Cancelled' + movement.collateralState = 'Slashed' + staking.challenged = staking.challenged.minus(collateralAmount) + } else { // closed + movement.amount = collateralAmount + movement.actionState = 'Completed' + movement.collateralState = 'Available' + staking.challenged = staking.challenged.minus(collateralAmount) + } + + staking.save() + movement.save() +} + +function updateStaking(stakingAddress: Address, token: Address, user: Address): Staking { + const stakingApp = StakingContract.bind(stakingAddress) + const balance = stakingApp.getBalancesOf(user) + + const staking = loadOrCreateStaking(token, user) + staking.total = balance.value0 + staking.locked = balance.value1 + staking.available = staking.total.minus(staking.locked) + staking.save() + + return staking +} + +function loadOrCreateStaking(token: Address, user: Address): Staking { + const id = buildStakingId(token, user) + let staking = Staking.load(id) + + if (staking === null) { + staking = new Staking(id) + staking.user = user + staking.token = token.toHexString() + staking.total = BigInt.fromI32(0) + staking.locked = BigInt.fromI32(0) + staking.available = BigInt.fromI32(0) + staking.challenged = BigInt.fromI32(0) + } + + return staking! +} + function createArbitratorFee(agreement: Address, id: string, feeToken: Address, feeAmount: BigInt): void { const arbitratorFee = new ArbitratorFee(id) arbitratorFee.amount = feeAmount @@ -312,14 +373,6 @@ export function buildERC20(agreement: Address, address: Address): string { token.symbol = tokenContract.symbol() token.decimals = tokenContract.decimals() token.save() - - const agreementApp = AgreementContract.bind(agreement) - const stakingFactoryAddress = agreementApp.stakingFactory() - const stakingFactory = StakingFactoryContract.bind(stakingFactoryAddress) - const stakingAddress = stakingFactory.getInstance(Address.fromString(id)) - if (stakingAddress.toHexString() != '0x0000000000000000000000000000000000000000') { - StakingTemplate.create(stakingAddress) - } } return token.id @@ -353,6 +406,14 @@ function buildCollateralRequirementId(agreement: Address, disputable: Address, c return buildDisputableId(agreement, disputable) + "-collateral-requirement-" + collateralRequirementId.toString() } +function buildStakingId(token: Address, user: Address): string { + return token.toHexString() + "-staking-" + user.toHexString() +} + +function buildStakingMovementId(token: Address, user: Address, id: string): string { + return buildStakingId(token, user) + "-movement-" + id +} + function buildId(event: ethereum.Event): string { return event.transaction.hash.toHexString() + event.logIndex.toString() } diff --git a/packages/connect-agreement/subgraph/src/DisputableAragonApp.ts b/packages/connect-agreement/subgraph/src/DisputableAragonApp.ts deleted file mode 100644 index 245c5643..00000000 --- a/packages/connect-agreement/subgraph/src/DisputableAragonApp.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { Action } from '../generated/schema' -import { buildActionId } from './Agreement' - -import { - StartVote as StartVoteEvent, - DisputableVoting as DisputableVotingContract -} from '../generated/templates/DisputableVoting/DisputableVoting' - - -export function handleStartVote(event: StartVoteEvent): void { - const votingApp = DisputableVotingContract.bind(event.address) - const agreement = votingApp.getAgreement() - const voteData = votingApp.getVote(event.params.voteId) - - const actionId = buildActionId(agreement, voteData.value7) - const action = Action.load(actionId)! - action.script = event.params.executionScript - action.save() -} diff --git a/packages/connect-agreement/subgraph/src/Staking.ts b/packages/connect-agreement/subgraph/src/Staking.ts deleted file mode 100644 index 1849aae6..00000000 --- a/packages/connect-agreement/subgraph/src/Staking.ts +++ /dev/null @@ -1,178 +0,0 @@ -import { ethereum, Bytes, BigInt, Address } from '@graphprotocol/graph-ts' - -import { buildActionId } from './Agreement' -import { Staking, StakingMovement } from '../generated/schema' -import { Agreement as AgreementContract } from '../generated/templates/Agreement/Agreement' -import { - Staked as StakedEvent, - Unstaked as UnstakedEvent, - StakeTransferred as StakeTransferredEvent, - Staking as StakingContract -} from '../generated/templates/Staking/Staking' - -/* eslint-disable @typescript-eslint/no-use-before-define */ - - -export function handleStaked(event: StakedEvent): void { - const stakingApp = StakingContract.bind(event.address) - const token = stakingApp.token() - const staking = updateStaking(event.address, token, event.params.user) - - const id = buildStakingMovementId(token, event.params.user, buildId(event)) - const movement = new StakingMovement(id) - movement.amount = event.params.amount - movement.staking = staking.id - movement.actionState = 'NA' - movement.collateralState = 'Available' - movement.createdAt = event.block.timestamp - movement.agreementId = Bytes.fromHexString('0x0000000000000000000000000000000000000000') as Bytes - movement.save() -} - -export function handleUnstaked(event: UnstakedEvent): void { - const stakingApp = StakingContract.bind(event.address) - const token = stakingApp.token() - const staking = updateStaking(event.address, token, event.params.user) - - const id = buildStakingMovementId(token, event.params.user, buildId(event)) - const movement = new StakingMovement(id) - movement.amount = event.params.amount - movement.staking = staking.id - movement.actionState = 'NA' - movement.collateralState = 'Withdrawn' - movement.createdAt = event.block.timestamp - movement.agreementId = Bytes.fromHexString('0x0000000000000000000000000000000000000000') as Bytes - movement.save() -} - -export function handleStakeTransferred(event: StakeTransferredEvent): void { - const stakingApp = StakingContract.bind(event.address) - const token = stakingApp.token() - - const fromStaking = updateStaking(event.address, token, event.params.from) - const withdrawId = buildStakingMovementId(token, event.params.from, buildId(event)) - const withdraw = new StakingMovement(withdrawId) - withdraw.amount = event.params.amount - withdraw.staking = fromStaking.id - withdraw.actionState = 'NA' - withdraw.collateralState = 'Withdrawn' - withdraw.createdAt = event.block.timestamp - withdraw.agreementId = Bytes.fromHexString('0x0000000000000000000000000000000000000000') as Bytes - withdraw.save() - - const toStaking = updateStaking(event.address, token, event.params.to) - const despositId = buildStakingMovementId(token, event.params.to, buildId(event)) - const deposit = new StakingMovement(despositId) - deposit.amount = event.params.amount - deposit.staking = toStaking.id - deposit.actionState = 'NA' - deposit.collateralState = 'Available' - deposit.createdAt = event.block.timestamp - deposit.agreementId = Bytes.fromHexString('0x0000000000000000000000000000000000000000') as Bytes - deposit.save() -} - -export function createAgreementStakingMovement(agreement: Address, actionId: BigInt, type: string, event: ethereum.Event): void { - const agreementApp = AgreementContract.bind(agreement) - const actionData = agreementApp.getAction(actionId) - const collateralData = agreementApp.getCollateralRequirement(actionData.value0, actionData.value2) - - const user = actionData.value4 - const token = collateralData.value0 - const collateralAmount = collateralData.value2 - - if (collateralAmount.equals(BigInt.fromI32(0))) { - return - } - - const staking = loadOrCreateStaking(token, user) - - const id = buildStakingMovementId(token, user, buildId(event)) - const movement = new StakingMovement(id) - movement.staking = staking.id - movement.agreement = agreement.toHexString() - movement.agreementId = agreement - movement.action = buildActionId(agreement, actionId) - movement.createdAt = event.block.timestamp - - if (type == 'new') { - movement.amount = collateralAmount - movement.actionState = 'Scheduled' - movement.collateralState = 'Locked' - staking.available = staking.available.minus(collateralAmount) - staking.locked = staking.locked.plus(collateralAmount) - } else if (type == 'challenged') { - movement.amount = collateralAmount - movement.actionState = 'Challenged' - movement.collateralState = 'Challenged' - staking.challenged = staking.challenged.plus(collateralAmount) - } else if (type == 'settled') { - const challengeData = agreementApp.getChallenge(actionData.value7) - const settlementOffer = challengeData.value4 - const unlockedBalance = collateralAmount.minus(settlementOffer) - movement.amount = settlementOffer - movement.actionState = 'Settled' - movement.collateralState = 'Slashed' - staking.available = staking.available.plus(unlockedBalance) - staking.locked = staking.locked.minus(collateralAmount) - staking.challenged = staking.challenged.minus(collateralAmount) - } else if (type == 'rejected') { - movement.amount = collateralAmount - movement.actionState = 'Cancelled' - movement.collateralState = 'Slashed' - staking.locked = staking.locked.minus(collateralAmount) - staking.challenged = staking.challenged.minus(collateralAmount) - } else { // closed - movement.amount = collateralAmount - movement.actionState = 'Completed' - movement.collateralState = 'Available' - staking.available = staking.available.plus(collateralAmount) - staking.locked = staking.locked.minus(collateralAmount) - staking.challenged = staking.challenged.minus(collateralAmount) - } - - staking.save() - movement.save() -} - -function updateStaking(stakingAddress: Address, token: Address, user: Address): Staking { - const stakingApp = StakingContract.bind(stakingAddress) - const balance = stakingApp.getBalancesOf(user) - - const staking = loadOrCreateStaking(token, user) - staking.total = balance.value0 - staking.locked = balance.value1 - staking.available = staking.total.minus(staking.locked) - staking.save() - - return staking -} - -function loadOrCreateStaking(token: Address, user: Address): Staking { - const id = buildStakingId(token, user) - let staking = Staking.load(id) - - if (staking === null) { - staking = new Staking(id) - staking.user = user - staking.token = token.toHexString() - staking.total = BigInt.fromI32(0) - staking.locked = BigInt.fromI32(0) - staking.available = BigInt.fromI32(0) - staking.challenged = BigInt.fromI32(0) - } - - return staking! -} - -function buildStakingId(token: Address, user: Address): string { - return token.toHexString() + "-user-" + user.toHexString() -} - -function buildStakingMovementId(token: Address, user: Address, id: string): string { - return buildStakingId(token, user) + "-movement-" + id -} - -function buildId(event: ethereum.Event): string { - return event.transaction.hash.toHexString() + event.logIndex.toString() -} diff --git a/packages/connect-agreement/subgraph/subgraph.template.yaml b/packages/connect-agreement/subgraph/subgraph.template.yaml index b13a1d94..fb414ffb 100644 --- a/packages/connect-agreement/subgraph/subgraph.template.yaml +++ b/packages/connect-agreement/subgraph/subgraph.template.yaml @@ -68,49 +68,3 @@ templates: - event: Signed(indexed address,uint256) handler: handleSigned file: ./src/Agreement.ts - - kind: ethereum/contract - name: DisputableVoting - network: {{network}} - source: - abi: DisputableVoting - mapping: - kind: ethereum/events - apiVersion: 0.0.3 - language: wasm/assemblyscript - entities: - - Agreement - - Disputable - abis: - - name: DisputableVoting - file: ./abis/DisputableVoting.json - - name: DisputableAragonApp - file: ./abis/DisputableAragonApp.json - eventHandlers: - - event: StartVote(indexed uint256,indexed address,bytes,bytes) - handler: handleStartVote - file: ./src/DisputableAragonApp.ts - - kind: ethereum/contract - name: Staking - network: {{network}} - source: - abi: Staking - mapping: - kind: ethereum/events - apiVersion: 0.0.3 - language: wasm/assemblyscript - entities: - - Staking - - ERC20 - abis: - - name: Staking - file: ./abis/Staking.json - - name: ERC20 - file: ./abis/MiniMeToken.json - eventHandlers: - - event: Staked(indexed address,uint256,uint256,bytes) - handler: handleStaked - - event: Unstaked(indexed address,uint256,uint256,bytes) - handler: handleUnstaked - - event: StakeTransferred(indexed address,address,uint256) - handler: handleStakeTransferred - file: ./src/Staking.ts diff --git a/packages/connect-core/package.json b/packages/connect-core/package.json index b247363f..b962aa02 100644 --- a/packages/connect-core/package.json +++ b/packages/connect-core/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-core", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", diff --git a/packages/connect-core/src/entities/App.ts b/packages/connect-core/src/entities/App.ts index 12a2af3c..1cc1cd0b 100644 --- a/packages/connect-core/src/entities/App.ts +++ b/packages/connect-core/src/entities/App.ts @@ -1,37 +1,28 @@ -import Organization from './Organization' -import Repo from './Repo' -import Role from './Role' +import { + Contract, + providers as ethersProvider, + utils as ethersUtils, +} from 'ethers' + +import { appIntent } from '../utils/intent' import { Abi, - AppIntent, AragonArtifact, AragonManifest, - ConnectionContext, Metadata, + AppData, + PathOptions, } from '../types' +import ForwardingPath from './ForwardingPath' +import Organization from './Organization' +import Repo from './Repo' +import Role from './Role' import { resolveArtifact, resolveManifest } from '../utils/metadata' import IOrganizationConnector from '../connections/IOrganizationConnector' // TODO: // [ ] (ipfs) contentUrl String The HTTP URL of the app content. Uses the IPFS HTTP provider. E.g. http://gateway.ipfs.io/ipfs/QmdLEDDfi…/ (ContentUri passing through the resolver) -export interface AppData { - address: string - appId: string - artifact?: string - codeAddress: string - contentUri?: string - isForwarder?: boolean - isUpgradeable?: boolean - kernelAddress: string - manifest?: string - name?: string - registry?: string - registryAddress: string - repoAddress?: string - version?: string -} - export default class App { #metadata: Metadata readonly address: string @@ -75,12 +66,8 @@ export default class App { return this.organization.connection.orgConnector } - async repo(): Promise { - return this.orgConnector().repoForApp(this.organization, this.address) - } - - async roles(): Promise { - return this.orgConnector().rolesForAddress(this.organization, this.address) + get provider(): ethersProvider.Provider { + return this.organization.connection.ethersProvider } get artifact(): AragonArtifact { @@ -95,16 +82,12 @@ export default class App { return this.artifact.abi } - get intents(): AppIntent[] { - return this.artifact.functions - } - - get deprecatedIntents(): { [version: string]: AppIntent[] } { - return this.artifact.deprecatedFunctions + async repo(): Promise { + return this.orgConnector().repoForApp(this.organization, this.address) } - get appName(): string { - return this.artifact.appName + async roles(): Promise { + return this.orgConnector().rolesForAddress(this.organization, this.address) } toJSON() { @@ -115,4 +98,55 @@ export default class App { organization: null, } } + + ethersContract(): Contract { + if (!this.abi) { + throw new Error( + `No ABI specified in app for ${this.address}. Make sure the metada for the app is available` + ) + } + return new Contract(this.address, this.abi, this.provider) + } + + ethersInterface(): ethersUtils.Interface { + if (!this.abi) { + throw new Error( + `No ABI specified in app for ${this.address}. Make sure the metada for the app is available` + ) + } + return new ethersUtils.Interface(this.abi) + } + + /** + * Calculate the forwarding path for an app action + * that invokes `methodSignature` with `params`. + * + * @param {string} methodSignature + * @param {Array<*>} params + * @param {Object} options + * @return {Promise} An object that represents the forwarding path corresponding to an action. + */ + async intent( + methodSignature: string, + params: any[], + options: PathOptions = {} + ): Promise { + const sender = options.actAs || this.organization.connection.actAs + if (!sender) { + throw new Error( + `No sender address specified. Use 'actAs' option or set one as default on your organization connection.` + ) + } + + const installedApps = await this.organization.apps() + + return appIntent( + sender, + this, + methodSignature, + params, + installedApps, + this.provider + ) + } } diff --git a/packages/connect-core/src/entities/ForwardingPath.ts b/packages/connect-core/src/entities/ForwardingPath.ts new file mode 100644 index 00000000..93caf02c --- /dev/null +++ b/packages/connect-core/src/entities/ForwardingPath.ts @@ -0,0 +1,84 @@ +import { providers as ethersProviders } from 'ethers' + +import { buildApprovePreTransactions } from '../utils/transactions' +import { + ForwardingPathData, + StepDescribed, + TokenData, + TransactionData, +} from '../types' +import ForwardingPathDescription, { + describePath, +} from '../utils/descriptor/index' +import App from './App' +import Transaction from './Transaction' + +const normalizePreTransactions = (preTransactions: (Transaction | TransactionData)[]): Transaction[] => { + return preTransactions.map((preTransaction: Transaction | TransactionData) => + (preTransaction instanceof Transaction) ? preTransaction : new Transaction(preTransaction) + ) +} + +export default class ForwardingPath { + #installedApps: App[] + #provider: ethersProviders.Provider + readonly destination: App + readonly path: Transaction[] + readonly transactions: Transaction[] + + constructor( + data: ForwardingPathData, + installedApps: App[], + provider: ethersProviders.Provider + ) { + this.#installedApps = installedApps + this.#provider = provider + this.destination = data.destination + this.path = data.path + this.transactions = data.transactions + } + + // Lets consumers pass a callback to sign any number of transactions. + // This is similar to calling transactions() and using a loop, but shorter. + // It returns the value returned by the library, usually a transaction receipt. + async sign( + callback: (tx: Transaction) => Promise + ): Promise { + return Promise.all(this.transactions.map(async (tx) => await callback(tx))) + } + + // Return a description of the forwarding path, to be rendered. + async describe(): Promise { + let description: StepDescribed[] = [] + if (this.path.length > 0) { + try { + description = await describePath( + this.path, + this.#installedApps, + this.#provider + ) + } catch (_) {} + } + + return new ForwardingPathDescription(description, this.#installedApps) + } + + // Build a token allowance pre-transaction + async buildApprovePreTransactions( + tokenData: TokenData + ): Promise { + return buildApprovePreTransactions( + this.transactions[0], + tokenData, + this.#provider + ) + } + + // Apply a pretransaction to the path + applyPreTransactions(preTransactions: (Transaction | TransactionData)[]): void { + normalizePreTransactions(preTransactions) + .reverse() + .filter(preTransaction => !!preTransaction) + .forEach(preTransaction => this.transactions.unshift(preTransaction)) + } +} diff --git a/packages/connect-core/src/entities/Organization.ts b/packages/connect-core/src/entities/Organization.ts index 32c0ebf3..9ed73530 100644 --- a/packages/connect-core/src/entities/Organization.ts +++ b/packages/connect-core/src/entities/Organization.ts @@ -5,17 +5,20 @@ import { SubscriptionCallback, SubscriptionResult, } from '@aragon/connect-types' -import { ConnectionContext } from '../types' + +import ForwardingPathDescription, { + decodeForwardingPath, + describePath, + describeTransaction, +} from '../utils/descriptor/index' +import { ConnectionContext, PostProcessDescription } from '../types' import { ErrorInvalidLocation } from '../errors' -import { - isAddress, - normalizeFiltersAndCallback, - subscription, - toArrayEntry, -} from '../utils' -import TransactionIntent from '../transactions/TransactionIntent' +import { isAddress } from '../utils/address' +import { normalizeFiltersAndCallback, toArrayEntry } from '../utils/misc' +import { subscription } from '../utils/subscriptions' import App from './App' import Permission from './Permission' +import Transaction from './Transaction' // TODO // Organization#addApp(repoName, options) @@ -77,6 +80,14 @@ export default class Organization { return this.connection } + //////// ACCOUNT ///////// + + actAss(sender: Address): void { + this.connection.actAs = sender + } + + ///////// APPS /////////// + async app(filters?: AppFiltersParam): Promise { return this.connection.orgConnector.appForOrg( this, @@ -127,6 +138,16 @@ export default class Organization { ) } + async acl(): Promise { + return this.app('acl') + } + + async kernel(): Promise { + return this.app('kernel') + } + + ///////// PERMISSIONS /////////// + async permissions(): Promise { return this.connection.orgConnector.permissionsForOrg(this) } @@ -139,14 +160,28 @@ export default class Organization { ) } - appIntent( - appAddress: Address, - functionName: string, - functionArgs: any[] - ): TransactionIntent { - return new TransactionIntent( - { contractAddress: appAddress, functionName, functionArgs }, - this, + //////// DESCRIPTIONS ///////// + + // Return a description of the forwarding path encoded on the evm script + async describeScript(script: string): Promise { + const installedApps = await this.apps() + + const describedSteps = await describePath( + decodeForwardingPath(script), + installedApps, + this.connection.ethersProvider + ) + + return new ForwardingPathDescription(describedSteps, installedApps) + } + + // Try to describe a single transaction using Radspec on the context of the organization + async describeTransaction( + transaction: Transaction + ): Promise { + return describeTransaction( + transaction, + await this.apps(), this.connection.ethersProvider ) } diff --git a/packages/connect-core/src/entities/Permission.ts b/packages/connect-core/src/entities/Permission.ts index 7e6a73e7..258fb8c5 100644 --- a/packages/connect-core/src/entities/Permission.ts +++ b/packages/connect-core/src/entities/Permission.ts @@ -1,21 +1,8 @@ -import IOrganizationConnector from '../connections/IOrganizationConnector' +import { PermissionData, ParamData } from '../types' import App from './App' import Organization from './Organization' import Role from './Role' - -export interface ParamData { - argumentId: number - operationType: number - argumentValue: BigInt -} - -export interface PermissionData { - allowed: boolean - appAddress: string - granteeAddress: string - params: ParamData[] - roleHash: string -} +import IOrganizationConnector from '../connections/IOrganizationConnector' export default class Permission implements PermissionData { #organization: Organization diff --git a/packages/connect-core/src/entities/Repo.ts b/packages/connect-core/src/entities/Repo.ts index 41e2c9c3..60467e92 100644 --- a/packages/connect-core/src/entities/Repo.ts +++ b/packages/connect-core/src/entities/Repo.ts @@ -2,26 +2,17 @@ import { AragonArtifact, AragonArtifactRole, AragonManifest, - ConnectionContext, Metadata, + RepoData, } from '../types' -import { resolveArtifact, resolveManifest } from '../utils/metadata' import Organization from './Organization' - -export interface RepoData { - address: string - artifact?: string - contentUri?: string - manifest?: string - name: string - registry?: string - registryAddress?: string -} +import { resolveArtifact, resolveManifest } from '../utils/metadata' export default class Repo { #metadata!: Metadata readonly address: string readonly contentUri?: string + readonly lastVersion?: string readonly name: string readonly registry?: string readonly registryAddress?: string @@ -30,6 +21,7 @@ export default class Repo { this.#metadata = metadata this.address = data.address this.contentUri = data.contentUri + this.lastVersion = data.lastVersion this.name = data.name this.registry = data.registry this.registryAddress = data.registryAddress diff --git a/packages/connect-core/src/entities/Role.ts b/packages/connect-core/src/entities/Role.ts index e3dc4aea..95d4eed1 100644 --- a/packages/connect-core/src/entities/Role.ts +++ b/packages/connect-core/src/entities/Role.ts @@ -1,17 +1,7 @@ -import { AragonArtifact, ConnectionContext, Metadata } from '../types' import { resolveArtifact } from '../utils/metadata' +import { AragonArtifact, Metadata, RoleData } from '../types' import Organization from './Organization' -import Permission, { PermissionData } from './Permission' - -export interface RoleData { - appAddress: string - appId: string - artifact?: string - contentUri?: string - hash: string - manager?: string - grantees?: PermissionData[] | null -} +import Permission from './Permission' export default class Role { readonly appAddress!: string diff --git a/packages/connect-core/src/entities/Transaction.ts b/packages/connect-core/src/entities/Transaction.ts new file mode 100644 index 00000000..00397357 --- /dev/null +++ b/packages/connect-core/src/entities/Transaction.ts @@ -0,0 +1,24 @@ +import { Address } from '@aragon/connect-types' + +import { TransactionData } from '../types' + +export default class Transaction { + readonly data: string + readonly from: Address + readonly to: Address + + constructor(data: TransactionData) { + if (!data.to) { + throw new Error(`Could not cosntruct trasanction: missing 'to'`) + } + if (!data.from) { + throw new Error(`Could not cosntruct trasanction: missing 'from'`) + } + if (!data.data) { + throw new Error(`Could not cosntruct trasanction: missing 'data'`) + } + this.data = data.data + this.from = data.from + this.to = data.to + } +} diff --git a/packages/connect-core/src/index.ts b/packages/connect-core/src/index.ts index 74b10912..13b330f0 100644 --- a/packages/connect-core/src/index.ts +++ b/packages/connect-core/src/index.ts @@ -6,16 +6,26 @@ export type { Networkish, SubscriptionHandler, } from '@aragon/connect-types' + export { default as IOrganizationConnector } from './connections/IOrganizationConnector' export { default as ConnectorJson, ConnectorJsonConfig, } from './connections/ConnectorJson' -export { default as App, AppData } from './entities/App' +export { default as App } from './entities/App' +export { default as ForwardingPath } from './entities/ForwardingPath' export { default as Organization } from './entities/Organization' -export { default as Permission, PermissionData } from './entities/Permission' -export { default as Repo, RepoData } from './entities/Repo' -export { default as Role, RoleData } from './entities/Role' -export { ConnectionContext, IpfsResolver } from './types' +export { default as Permission } from './entities/Permission' +export { default as Repo } from './entities/Repo' +export { default as Role } from './entities/Role' +export { + ConnectionContext, + IpfsResolver, + AppData, + ForwardingPathData, + PermissionData, + RepoData, + RoleData, +} from './types' export * from './utils' export * from './errors' diff --git a/packages/connect-core/src/transactions/TransactionIntent.ts b/packages/connect-core/src/transactions/TransactionIntent.ts deleted file mode 100644 index 19700cb5..00000000 --- a/packages/connect-core/src/transactions/TransactionIntent.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { providers as ethersProviders } from 'ethers' -import TransactionPath from './TransactionPath' -import TransactionRequest from './TransactionRequest' -import Organization from '../entities/Organization' -import { calculateTransactionPath } from '../utils/path/calculatePath' -import { describeTransactionPath } from '../utils/descriptions' - -export interface TransactionIntentData { - contractAddress: string - functionName: string - functionArgs: any[] -} - -export default class TransactionIntent { - readonly contractAddress!: string - readonly functionName!: string - readonly functionArgs!: any[] - - #org: Organization - #provider: ethersProviders.Provider - - constructor( - data: TransactionIntentData, - org: Organization, - provider: ethersProviders.Provider - ) { - this.#org = org - this.#provider = provider - - this.contractAddress = data.contractAddress - this.functionArgs = data.functionArgs - this.functionName = data.functionName - } - - async paths( - account: string, - // eslint-disable-next-line @typescript-eslint/no-unused-vars - options?: { as?: string; path?: string[] } - ): Promise { - const apps = await this.#org.apps() - - const { - forwardingFeePretransaction, - path, - } = await calculateTransactionPath( - account, - this.contractAddress, - this.functionName, - this.functionArgs, - apps, - this.#provider - ) - - const describedPath = await describeTransactionPath( - path, - apps, - this.#provider - ) - - return new TransactionPath({ - apps: apps.filter((app) => - path - .map((transaction) => transaction.to) - .some((address) => address === app.address) - ), - destination: apps.find((app) => app.address == this.contractAddress)!, - forwardingFeePretransaction, - transactions: describedPath, - }) - } - - async transactions( - account: string, - options?: { as: string; path?: string[] } - ): Promise { - return (await this.paths(account, options)).transactions - } -} diff --git a/packages/connect-core/src/transactions/TransactionPath.ts b/packages/connect-core/src/transactions/TransactionPath.ts deleted file mode 100644 index 911277b9..00000000 --- a/packages/connect-core/src/transactions/TransactionPath.ts +++ /dev/null @@ -1,23 +0,0 @@ -import TransactionRequest from './TransactionRequest' -import App from '../entities/App' - -export interface TransactionPathData { - apps: App[] - destination: App - forwardingFeePretransaction?: TransactionRequest - transactions: TransactionRequest[] -} - -export default class TransactionPath { - readonly apps!: App[] - readonly destination!: App - readonly forwardingFeePretransaction?: TransactionRequest - readonly transactions!: TransactionRequest[] - - constructor(data: TransactionPathData) { - this.apps = data.apps - this.destination = data.destination - this.forwardingFeePretransaction = data.forwardingFeePretransaction - this.transactions = data.transactions - } -} diff --git a/packages/connect-core/src/transactions/TransactionRequest.ts b/packages/connect-core/src/transactions/TransactionRequest.ts deleted file mode 100644 index 01d7d1fc..00000000 --- a/packages/connect-core/src/transactions/TransactionRequest.ts +++ /dev/null @@ -1,31 +0,0 @@ -export interface TransactionRequestData { - children?: TransactionRequest[] - description?: string - descriptionAnnotated?: Annotation[] - data: string - from?: string - to: string -} - -export interface Annotation { - type: string - value: any -} - -export default class TransactionRequest { - readonly children?: TransactionRequest[] - readonly description?: string - readonly descriptionAnnotated?: Annotation[] - readonly data!: string - readonly from?: string - readonly to!: string - - constructor(data: TransactionRequestData) { - this.children = data.children - this.description = data.description - this.descriptionAnnotated = data.descriptionAnnotated - this.data = data.data - this.from = data.from - this.to = data.to - } -} diff --git a/packages/connect-core/src/types.ts b/packages/connect-core/src/types.ts index 01b1ba75..30c36730 100644 --- a/packages/connect-core/src/types.ts +++ b/packages/connect-core/src/types.ts @@ -1,15 +1,140 @@ -import { providers as ethersProviders, utils as ethersUtils } from 'ethers' +import { + BigNumber, + providers as ethersProviders, + utils as ethersUtils, +} from 'ethers' import { Address, Network } from '@aragon/connect-types' + import IOrganizationConnector from './connections/IOrganizationConnector' +import App from './entities/App' +import Transaction from './entities/Transaction' -export type Metadata = (AragonArtifact | AragonManifest)[] +export type Abi = (ethersUtils.EventFragment | ethersUtils.FunctionFragment)[] -// Type definition: https://github.com/ethers-io/ethers.js/blob/ethers-v5-beta/packages/abi/lib/fragments.d.ts#L68 -export type FunctionFragment = ethersUtils.FunctionFragment +export type AppOrAddress = App | Address -export type Abi = (ethersUtils.EventFragment | ethersUtils.FunctionFragment)[] +export type ForwardingPathDeclaration = AppOrAddress[] + +export type PathOptions = { + // The account to sign the transactions with. It is optional + // when `actAs` has been set with the connection. If not, + // the address has to be passed. + actAs?: Address + + // Optionally declare a forwarding path. When not specified, + // the shortest path is used instead. + path?: ForwardingPathDeclaration +} + +export interface CallScriptAction { + to: string + data: string +} + +export interface DescriptionAnnotation { + type: string + value: any +} + +export interface PostProcessDescription { + description: string + annotatedDescription?: DescriptionAnnotation[] +} + +export interface StepDecoded { + to: string + data: string + from?: string + children?: StepDecoded[] +} + +export interface StepDescribed extends StepDecoded { + description: string + annotatedDescription?: DescriptionAnnotation[] +} + +export interface TransactionPath { + path: Transaction[] + transactions: Transaction[] +} + +////// ENTITES ///// + +export interface AppData { + address: string + appId: string + artifact?: string | null + codeAddress: string + contentUri?: string + isForwarder?: boolean + isUpgradeable?: boolean + kernelAddress: string + manifest?: string | null + name?: string + registry?: string + registryAddress: string + repoAddress?: string + version?: string +} + +export interface ForwardingPathData { + destination: App + path: Transaction[] + transactions: Transaction[] +} + +export interface ParamData { + argumentId: number + operationType: number + argumentValue: BigInt +} + +export interface PermissionData { + allowed: boolean + appAddress: string + granteeAddress: string + params: ParamData[] + roleHash: string +} + +export interface RepoData { + address: string + artifact?: string | null + contentUri?: string + lastVersion?: string + manifest?: string | null + name: string + registry?: string + registryAddress?: string +} + +export interface RoleData { + appAddress: string + appId: string + artifact?: string | null + contentUri?: string + hash: string + manager?: string + grantees?: PermissionData[] | null +} + +export interface TransactionData { + data: string + from: Address + to: Address +} + +export interface TokenData { + address: Address + value: string | BigNumber + spender?: Address +} + +////// METADATA ////// + +export type Metadata = (AragonArtifact | AragonManifest)[] -export interface AppIntent { +export interface AppMethod { roles: string[] sig: string /** @@ -22,7 +147,7 @@ export interface AppIntent { * The function's ABI element is included for convenience of the client * null if ABI is not found for this signature */ - abi: FunctionFragment | null + abi: ethersUtils.FunctionFragment | null } // The aragon manifest requires the use of camelcase for some names @@ -60,12 +185,12 @@ export interface AragonArtifact extends AragonAppJson { * Includes metadata needed for radspec and transaction pathing * initialize() function should also be included for completeness */ - functions: AppIntent[] + functions: AppMethod[] /** * Functions that are no longer available at `version` */ deprecatedFunctions: { - [version: string]: AppIntent[] + [version: string]: AppMethod[] } /** * The flaten source code of the contracts must be included in diff --git a/packages/connect-core/src/utils/__test__/callscript.test.ts b/packages/connect-core/src/utils/__test__/callscript.test.ts new file mode 100644 index 00000000..e6e9c512 --- /dev/null +++ b/packages/connect-core/src/utils/__test__/callscript.test.ts @@ -0,0 +1,60 @@ +import * as script from '../callScript' + +describe('encodeCallScript', () => { + const callScript = script.encodeCallScript([ + { + to: '0xcafe1a77e84698c83ca8931f54a755176ef75f2c', + data: '0xcafe', + }, + { + to: '0xbeefbeef03c7e5a1c29e0aa675f8e16aee0a5fad', + data: '0xbeef', + }, + { + to: '0xbaaabaaa03c7e5a1c29e0aa675f8e16aee0a5fad', + data: '0x', + }, + ]) + + test('callscript should start with script ID 1', () => { + expect(callScript.slice(0, 10)).toBe(script.CALLSCRIPT_ID) + }) + + test('first part of callscript should be address for tx 1', () => { + expect(callScript.slice(10, 50)).toBe( + 'cafe1a77e84698c83ca8931f54a755176ef75f2c' + ) + }) + + test('second part of callscript should be data length for tx 1', () => { + expect(callScript.slice(50, 58)).toBe('00000002') + }) + + test('third part of callscript should be data for tx 1', () => { + expect(callScript.slice(58, 62)).toBe('cafe') + }) + + test('fourth part of callscript should be address for tx 2', () => { + expect(callScript.slice(62, 102)).toBe( + 'beefbeef03c7e5a1c29e0aa675f8e16aee0a5fad' + ) + }) + + test('fifth part of callscript should be data length for tx 2', () => { + expect(callScript.slice(102, 110)).toBe('00000002') + }) + + test('sixth part of callscript should be data for tx 2', () => { + expect(callScript.slice(110, 114)).toBe('beef') + }) + + test('seventh part of callscript should be address for tx 3', () => { + expect(callScript.slice(114, 154)).toBe( + 'baaabaaa03c7e5a1c29e0aa675f8e16aee0a5fad' + ) + }) + + test('eigth part of callscript should be data length for tx 3', () => { + expect(callScript.slice(154, 162)).toBe('00000000') + }) +}) diff --git a/packages/connect-core/src/utils/abi.ts b/packages/connect-core/src/utils/abi.ts new file mode 100644 index 00000000..33cbfd1f --- /dev/null +++ b/packages/connect-core/src/utils/abi.ts @@ -0,0 +1,36 @@ +import { utils as ethersUtils } from 'ethers' + +import { Abi } from '../types' + +export function findMethodAbiFragment( + abi: Abi, + methodSignature: string +): ethersUtils.Fragment | undefined { + if (methodSignature === 'fallback') { + // Note that fallback functions in the ABI do not contain a `name` or `inputs` key + return abi.find((method) => method.type === 'fallback') + } + + // Is the given method a full signature, e.g. 'foo(arg1,arg2,...)' + const fullMethodSignature = + Boolean(methodSignature) && + methodSignature.includes('(') && + methodSignature.includes(')') + + const methodAbiFragment = abi + .filter((method) => method.type === 'function') + .find((method) => { + // If the full signature isn't given, just find the first overload declared + if (!fullMethodSignature) { + return method.name === methodSignature + } + + const currentParameterTypes = method.inputs.map(({ type }) => type) + const currentMethodSignature = `${ + method.name + }(${currentParameterTypes.join(',')})` + return currentMethodSignature === methodSignature + }) + + return methodAbiFragment +} diff --git a/packages/connect-core/src/utils/abis.ts b/packages/connect-core/src/utils/abis.ts index d0c0ce01..18b540f2 100644 --- a/packages/connect-core/src/utils/abis.ts +++ b/packages/connect-core/src/utils/abis.ts @@ -13,3 +13,23 @@ export const forwarderAbi = [ export const forwarderFeeAbi = [ 'function forwardFee() external view returns (address, uint256)', ] + +export const miniMeAbi = [ + 'function balanceOf(address _owner) external view returns (uint256)', + 'function balanceOfAt(address _owner, uint256 _blockNumber) external view returns (uint256)', +] + +export const arbitratorAbi = [ + { + "inputs": [], + "name": "getDisputeFees", + "outputs": [ + { "name": "recipient", "type": "address" }, + { "name": "feeToken", "type": "address" }, + { "name": "feeAmount", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, +] diff --git a/packages/connect-core/src/utils/app.ts b/packages/connect-core/src/utils/app.ts index cb79a80b..79e1b2ea 100644 --- a/packages/connect-core/src/utils/app.ts +++ b/packages/connect-core/src/utils/app.ts @@ -1,44 +1,63 @@ import { utils as ethersUtils } from 'ethers' -import { AppIntent } from '../types' + +import { Abi, AppMethod } from '../types' import { ErrorInvalid } from '../errors' import App from '../entities/App' -import { TransactionRequestData } from '../transactions/TransactionRequest' export const apmAppId = (appName: string): string => ethersUtils.namehash(`${appName}.aragonpm.eth`) -// Is the given method a full signature, e.g. 'foo(arg1,arg2,...)' -export const isFullMethodSignature = (methodSignature: string): boolean => { - return ( - Boolean(methodSignature) && - methodSignature.includes('(') && - methodSignature.includes(')') - ) +function signatureFromAbi(signature: string, abi: Abi): string { + const matches = signature.match(/(.*)\((.*)\)/m) + + if (!matches) { + throw new ErrorInvalid(`Abi has no method with signature: ${signature}`) + } + + const name = matches[1] + const params = matches[2].split(',') + + // If a single ABI node is found with function name and same number of parameters, + // generate the signature from ABI. Otherwise, use the one from artifact. + const functionAbis = abi + .filter((node) => node.name === name) + .filter((node) => node.inputs.length === params.length) + + if (functionAbis.length === 1) { + return `${functionAbis[0].name}(${functionAbis[0].inputs + .map((input) => input.type) + .join(',')})` + } + + return signature } -export function validateMethod( - destination: string, - methodSignature: string, - destinationApp: App -): AppIntent { - const methods = destinationApp.intents - if (!methods) { - throw new ErrorInvalid( - `No functions specified in artifact for ${destination}` - ) +function findAppMethod( + app: App, + methodTestFn: any, + { allowDeprecated = true } = {} +): AppMethod | undefined { + const { deprecatedFunctions, functions } = app.artifact || {} + + let method + // First try to find the method in the current functions + if (Array.isArray(functions)) { + method = functions + .map((f) => { + return { ...f, sig: signatureFromAbi(f.sig, app.abi) } + }) + .find(methodTestFn) } - // Find the relevant method information - const method = methods.find((method) => - isFullMethodSignature(methodSignature) - ? method.sig === methodSignature - : // If the full signature isn't given, just select the first overload declared - method.sig.split('(')[0] === methodSignature - ) - if (!method) { - throw new ErrorInvalid( - `No method named ${methodSignature} on ${destination}` + if (!method && allowDeprecated) { + // The current functions didn't have it; try with each deprecated version's functions + const deprecatedFunctionsFromVersions = Object.values( + deprecatedFunctions || {} ) + if (deprecatedFunctionsFromVersions.every(Array.isArray)) { + // Flatten all the deprecated functions and find the method + method = deprecatedFunctionsFromVersions.flat().find(methodTestFn) + } } return method @@ -50,43 +69,56 @@ export function validateMethod( * * @param {Object} app App artifact * @param {Object} data Data component of a transaction to app + * @param {Object} options Options + * @param {boolean} [options.allowDeprecated] Allow deprecated functions to be returned. Defaults to true. * @return {Object|void} Method with radspec notice and function signature, or undefined if none was found */ -export function findAppMethodFromIntent( +export function findAppMethodFromData( app: App, - transaction: TransactionRequestData -): AppIntent | undefined { - const methodId = transaction.data.substring(0, 10) - - const checkMethodSignature = (siganture: string): boolean => { - // Hash signature with Ethereum Identity and silce bytes - const sigHash = ethersUtils.hexDataSlice(ethersUtils.id(siganture), 0, 4) - return sigHash === methodId - } - - const { deprecatedIntents, intents } = app || {} + data: string, + { allowDeprecated = true } = {} +): AppMethod | undefined { + const methodId = data.substring(0, 10) + return findAppMethod( + app, + (method: AppMethod) => + ethersUtils.id(method.sig).substring(0, 10) === methodId, + { allowDeprecated } + ) +} - let method - // First try to find the method in the current functions - if (Array.isArray(intents)) { - method = intents.find((method) => checkMethodSignature(method.sig)) - } +/** + * Find the method descriptor corresponding to an app's method signature. + * + * @param {Object} app App + * @param {string} methodSignature Method signature to be called + * @param {Object} options Options + * @param {boolean} [options.allowDeprecated] Allow deprecated functions to be returned. Defaults to true. + * @return {Object|void} Method with radspec notice and function signature, or undefined if none was found + */ +export function findAppMethodFromSignature( + app: App, + methodSignature: string, + { allowDeprecated = true } = {} +): AppMethod | undefined { + // Is the given method a full signature, e.g. 'foo(arg1,arg2,...)' + const fullMethodSignature = + Boolean(methodSignature) && + methodSignature.includes('(') && + methodSignature.includes(')') - if (!method) { - // The current functions didn't have it; try with each deprecated version's functions - const deprecatedFunctionsFromVersions = Object.values( - deprecatedIntents || {} - ) - if (deprecatedFunctionsFromVersions.every(Array.isArray)) { - // Flatten all the deprecated functions - const allDeprecatedFunctions = ([] as AppIntent[]).concat( - ...deprecatedFunctionsFromVersions - ) - method = allDeprecatedFunctions.find((method) => - checkMethodSignature(method.sig) - ) - } - } + return findAppMethod( + app, + (method: AppMethod) => { + // Note that fallback functions have the signature 'fallback' in an app's artifact.json + if (fullMethodSignature) { + return method.sig === methodSignature + } - return method + // If full signature isn't given, just match against the method names + const methodName = method.sig.split('(')[0] + return methodName === methodSignature + }, + { allowDeprecated } + ) } diff --git a/packages/connect-core/src/utils/callScript.ts b/packages/connect-core/src/utils/callScript.ts index 9b396e2e..10ad51e0 100644 --- a/packages/connect-core/src/utils/callScript.ts +++ b/packages/connect-core/src/utils/callScript.ts @@ -1,12 +1,9 @@ import { utils as ethersUtils } from 'ethers' import { ErrorInvalid } from '../errors' -export const CALLSCRIPT_ID = '0x00000001' +import { CallScriptAction } from '../types' -interface CallScriptAction { - to: string - data: string -} +export const CALLSCRIPT_ID = '0x00000001' interface Segment { segment: CallScriptAction diff --git a/packages/connect-core/src/utils/descriptions.ts b/packages/connect-core/src/utils/descriptions.ts deleted file mode 100644 index f20ed7ae..00000000 --- a/packages/connect-core/src/utils/descriptions.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { providers as ethersProviders } from 'ethers' -import App from '../entities/App' -import TransactionRequest from '../transactions/TransactionRequest' -import { ErrorException, ErrorInvalid } from '../errors' -import { - decodeTransactionPath, - TransactionWithChildren, -} from './path/decodePath' -import { - tryEvaluatingRadspec, - postprocessRadspecDescription, -} from './radspec/index' - -export async function describeTransaction( - transaction: TransactionWithChildren, - apps: App[], - provider?: ethersProviders.Provider -): Promise { - if (!transaction.to) { - throw new ErrorInvalid(`Could not describe transaction: missing 'to'`) - } - if (!transaction.data) { - throw new ErrorInvalid(`Could not describe transaction: missing 'data'`) - } - let description, descriptionAnnotated - try { - description = await tryEvaluatingRadspec(transaction, apps, provider) - - if (description) { - const processed = await postprocessRadspecDescription(description, apps) - descriptionAnnotated = processed.annotatedDescription - description = processed.description - } - - if (transaction.children) { - // eslint-disable-next-line @typescript-eslint/no-use-before-define - transaction.children = await describeTransactionPath( - transaction.children, - apps, - provider - ) - } - } catch (err) { - throw new ErrorException(`Could not describe transaction: ${err}`) - } - - return new TransactionRequest({ - ...transaction, - description, - descriptionAnnotated, - }) -} - -/** - * Use radspec to create a human-readable description for each transaction in the given `path` - * - */ -export async function describeTransactionPath( - path: TransactionWithChildren[], - apps: App[], - provider?: ethersProviders.Provider -): Promise { - return Promise.all( - path.map((step) => describeTransaction(step, apps, provider)) - ) -} - -export async function describeScript( - script: string, - apps: App[], - provider?: ethersProviders.Provider -): Promise { - const path = decodeTransactionPath(script) - - return describeTransactionPath(path, apps, provider) -} diff --git a/packages/connect-core/src/utils/path/decodePath.ts b/packages/connect-core/src/utils/descriptor/decode.ts similarity index 59% rename from packages/connect-core/src/utils/path/decodePath.ts rename to packages/connect-core/src/utils/descriptor/decode.ts index ca63b1af..7ad816ff 100644 --- a/packages/connect-core/src/utils/path/decodePath.ts +++ b/packages/connect-core/src/utils/descriptor/decode.ts @@ -1,20 +1,14 @@ import { ErrorInvalid } from '../../errors' +import { StepDecoded } from '../../types' import { isCallScript, decodeCallScript } from '../callScript' import { isValidForwardCall, parseForwardCall } from '../forwarding' -import { Transaction } from '../transactions' - -export interface TransactionWithChildren extends Transaction { - children?: TransactionWithChildren[] -} /** * Decodes an EVM callscript and returns the transaction path it describes. * * @return An array of Ethereum transactions that describe each step in the path */ -export function decodeTransactionPath( - script: string -): TransactionWithChildren[] { +export function decodeForwardingPath(script: string): StepDecoded[] { // In the future we may support more EVMScripts, but for now let's just assume we're only // dealing with call scripts if (!isCallScript(script)) { @@ -23,19 +17,23 @@ export function decodeTransactionPath( const path = decodeCallScript(script) - return path.reduce((decodeSegments, segment) => { - const { data } = segment + const decodedPath = path.map((step) => { + const { data } = step let children if (isValidForwardCall(data)) { const forwardedEvmScript = parseForwardCall(data) try { - children = decodeTransactionPath(forwardedEvmScript) - // eslint-disable-next-line no-empty + children = decodeForwardingPath(forwardedEvmScript) } catch (err) {} } - return decodeSegments.concat({ ...segment, children }) - }, [] as TransactionWithChildren[]) + return { + ...step, + children, + } + }) + + return decodedPath } diff --git a/packages/connect-core/src/utils/descriptor/describe.ts b/packages/connect-core/src/utils/descriptor/describe.ts new file mode 100644 index 00000000..f5cd6559 --- /dev/null +++ b/packages/connect-core/src/utils/descriptor/describe.ts @@ -0,0 +1,106 @@ +import { providers as ethersProviders } from 'ethers' + +import { + tryEvaluatingRadspec, + tryDescribingUpdateAppIntent, + postprocessRadspecDescription, +} from '../radspec/index' +import { StepDecoded, StepDescribed, PostProcessDescription } from '../../types' +import App from '../../entities/App' +import Transaction from '../../entities/Transaction' + +export async function describeStep( + step: StepDecoded, + installedApps: App[], + provider: ethersProviders.Provider +): Promise { + let decoratedStep + // TODO: Add intent Basket support + + // Single transaction step + // First see if the step can be handled with a specialized descriptor + try { + decoratedStep = await tryDescribingUpdateAppIntent(step, installedApps) + } catch (err) {} + + // Finally, if the step wasn't handled yet, evaluate via radspec normally + if (!decoratedStep) { + try { + decoratedStep = await tryEvaluatingRadspec(step, installedApps, provider) + } catch (err) {} + } + + // Annotate the description, if one was found + if (decoratedStep?.description) { + try { + const { + description, + annotatedDescription, + } = await postprocessRadspecDescription( + decoratedStep.description, + installedApps + ) + decoratedStep.description = description + decoratedStep.annotatedDescription = annotatedDescription ?? [] + } catch (err) {} + } + + if (decoratedStep?.children) { + decoratedStep.children = await describePath( + decoratedStep.children, + installedApps, + provider + ) + } + + return decoratedStep || { ...step, description: '' } +} + +/** + * Use radspec to create a human-readable description for each step in the given `path` + * + */ +export async function describePath( + path: StepDecoded[], + installedApps: App[], + provider: ethersProviders.Provider +): Promise { + return Promise.all( + path.map(async (step) => describeStep(step, installedApps, provider)) + ) +} + +export async function describeTransaction( + transaction: Transaction, + installedApps: App[], + provider: ethersProviders.Provider +): Promise { + if (!transaction.to) { + throw new Error(`Could not describe transaction: missing 'to'`) + } + if (!transaction.data) { + throw new Error(`Could not describe transaction: missing 'data'`) + } + + let description + try { + description = await tryEvaluatingRadspec( + transaction, + installedApps, + provider + ) + + if (description) { + return postprocessRadspecDescription( + description.description, + installedApps + ) + } + } catch (err) { + throw new Error(`Could not describe transaction: ${err}`) + } + + return { + description, + } +} diff --git a/packages/connect-core/src/utils/descriptor/index.ts b/packages/connect-core/src/utils/descriptor/index.ts new file mode 100644 index 00000000..621237e3 --- /dev/null +++ b/packages/connect-core/src/utils/descriptor/index.ts @@ -0,0 +1,45 @@ +import { AppOrAddress, StepDescribed } from '../../types' +import App from '../../entities/App' + +type ForwardingPathDescriptionTreeEntry = + | AppOrAddress + | [AppOrAddress, ForwardingPathDescriptionTreeEntry[]] + +type ForwardingPathDescriptionTree = ForwardingPathDescriptionTreeEntry[] + +export default class ForwardingPathDescription { + #installedApps: App[] + readonly describedSteps: StepDescribed[] + + constructor(describedSteps: StepDescribed[], installedApps: App[]) { + this.#installedApps = installedApps + this.describedSteps = describedSteps + } + + // Return a tree that can get used to render the path. + tree(): ForwardingPathDescriptionTree { + const docoratedStep = this.describedSteps.map(async (step) => { + const app = this.#installedApps.find((app) => app.address === step.to) + + if (app) { + return { + ...step, + app, + } + } + }) + return [] + } + + // Renders the forwarding path description as text + toString(): string { + return this.tree().toString() + } + + // TBD: a utility that makes it easy to render the tree, + // e.g. as a nested list in HTML or React. + reduce(callback: Function): any {} +} + +export { describePath, describeTransaction } from './describe' +export { decodeForwardingPath } from './decode' diff --git a/packages/connect-core/src/utils/index.ts b/packages/connect-core/src/utils/index.ts index 87b55ee2..9e99dde4 100644 --- a/packages/connect-core/src/utils/index.ts +++ b/packages/connect-core/src/utils/index.ts @@ -1,11 +1,12 @@ export * from './address' export * from './app-connectors' +export * from './descriptor/index' export * from './cache-store' -export * from './descriptions' export * from './ipfs' export * from './misc' export * from './network' export * from './subscriptions' export { decodeCallScript, encodeCallScript } from './callScript' export { fetchMetadata } from './metadata' -export { findAppMethodFromIntent } from './app' +export * from './app' +export * from './abis' diff --git a/packages/connect-core/src/utils/intent.ts b/packages/connect-core/src/utils/intent.ts new file mode 100644 index 00000000..c68a8c97 --- /dev/null +++ b/packages/connect-core/src/utils/intent.ts @@ -0,0 +1,84 @@ +import { Address } from '@aragon/connect-types' +import { utils as ethersUtils, providers as ethersProvider } from 'ethers' + +import { addressesEqual } from './address' +import { + decodeKernelSetAppParameters, + isKernelAppCodeNamespace, + isKernelSetAppIntent, +} from './kernel' +import { getForwardingPath, getACLForwardingPath } from './path/index' +import { StepDecoded } from '../types' +import App from '../entities/App' +import ForwardingPath from '../entities/ForwardingPath' + +export async function appIntent( + sender: Address, + destinationApp: App, + methodSignature: string, + params: any[], + installedApps: App[], + provider: ethersProvider.Provider +): Promise { + const acl = installedApps.find((app) => app.name === 'acl') + + if (acl && addressesEqual(destinationApp.address, acl.address)) { + try { + return getACLForwardingPath( + sender, + acl, + methodSignature, + params, + installedApps, + provider + ) + } catch (_) { + // emtpy path + return new ForwardingPath( + { + destination: destinationApp, + path: [], + transactions: [], + }, + installedApps, + provider + ) + } + } + + return getForwardingPath( + sender, + destinationApp, + methodSignature, + params, + installedApps, + provider + ) +} + +export function filterAndDecodeAppUpgradeIntents( + intents: StepDecoded[], + installedApps: App[] +): ethersUtils.Result[] { + const kernel = installedApps.find((app) => app.name === 'kernel') + + if (!kernel) { + throw new Error(`Organization not found.`) + } + + return ( + intents + // Filter for setApp() calls to the kernel + .filter((intent) => isKernelSetAppIntent(kernel, intent)) + // Try to decode setApp() params + .map((intent) => { + try { + return decodeKernelSetAppParameters(intent.data) + } catch (_) {} + + return [] + }) + // Filter for changes to APP_BASES_NAMESPACE + .filter((result) => isKernelAppCodeNamespace(result['namesapce'])) + ) +} diff --git a/packages/connect-core/src/utils/kernel.ts b/packages/connect-core/src/utils/kernel.ts index 2007f2a6..d8153bdd 100644 --- a/packages/connect-core/src/utils/kernel.ts +++ b/packages/connect-core/src/utils/kernel.ts @@ -1,5 +1,10 @@ import { utils as ethersUtils } from 'ethers' +import { addressesEqual } from './address' +import { findAppMethodFromData } from './app' +import { StepDecoded } from '../types' +import App from '../entities/App' + const CORE_NAMESPACE = ethersUtils.solidityKeccak256(['string'], ['core']) const APP_ADDR_NAMESPACE = ethersUtils.solidityKeccak256(['string'], ['app']) const APP_BASES_NAMESPACE = ethersUtils.solidityKeccak256(['string'], ['base']) @@ -10,6 +15,12 @@ const KERNEL_NAMESPACES_NAMES = new Map([ [APP_BASES_NAMESPACE, 'App code'], ]) +const SET_APP_ABI = [ + { name: 'namespace', type: 'bytes32' }, + { name: 'appId', type: 'bytes32' }, + { name: 'appAddress', type: 'address' }, +].map((param) => ethersUtils.ParamType.from(param)) + interface KernelNamespace { name: string hash: string @@ -20,3 +31,36 @@ export function getKernelNamespace(hash: string): KernelNamespace | null { ? { name: KERNEL_NAMESPACES_NAMES.get(hash) as string, hash } : null } + +/** + * Decode `Kernel.setApp()` parameters based on transaction data. + * + * @param {Object} data Transaction data + * @return {Object} Decoded parameters for `setApp()` (namespace, appId, appAddress) + */ +export function decodeKernelSetAppParameters(data: string): ethersUtils.Result { + // Strip 0x prefix + bytes4 sig to get parameter data + const paramData = data.substring(10) + return ethersUtils.defaultAbiCoder.decode(SET_APP_ABI, paramData) +} + +export function isKernelAppCodeNamespace(namespaceHash: string): boolean { + return namespaceHash === APP_BASES_NAMESPACE +} + +/** + * Is the transaction intent for `Kernel.setApp()`? + * + * @param {Object} kernelApp App artifact for Kernel + * @param {Object} intent Transaction intent + * @return {Boolean} Whether the intent is `Kernel.setApp()` + */ +export function isKernelSetAppIntent( + kernelApp: App, + intent: StepDecoded +): boolean { + if (!addressesEqual(kernelApp.address, intent.to)) return false + + const method = findAppMethodFromData(kernelApp, intent.data) + return !!method && method.sig === 'setApp(bytes32,bytes32,address)' +} diff --git a/packages/connect-core/src/utils/metadata.ts b/packages/connect-core/src/utils/metadata.ts index 3d964fdd..38b3da61 100644 --- a/packages/connect-core/src/utils/metadata.ts +++ b/packages/connect-core/src/utils/metadata.ts @@ -1,6 +1,5 @@ -import fetch from 'isomorphic-unfetch' import { AragonArtifact, AragonManifest, IpfsResolver } from '../types' -import { ErrorConnection, ErrorInvalid, ErrorUnexpectedResult } from '../errors' +import { ErrorInvalid } from '../errors' import { getApmInternalAppInfo, getAragonOsInternalAppInfo, diff --git a/packages/connect-core/src/utils/path/calculatePath.ts b/packages/connect-core/src/utils/path/calculatePath.ts index 25d4b0a5..37872d11 100644 --- a/packages/connect-core/src/utils/path/calculatePath.ts +++ b/packages/connect-core/src/utils/path/calculatePath.ts @@ -1,56 +1,19 @@ -import { providers as ethersProviders } from 'ethers' -import { AppIntent } from '../../types' +import { providers as ethersProviders, utils as ethersUtils } from 'ethers' + import { ErrorInvalid } from '../../errors' +import { TransactionPath } from '../../types' import App from '../../entities/App' -import { - ANY_ENTITY, - addressesEqual, - includesAddress, - isAddress, -} from '../address' -import { isFullMethodSignature } from '../app' +import Transaction from '../../entities/Transaction' +import { ANY_ENTITY, addressesEqual, includesAddress } from '../address' +import { findAppMethodFromSignature } from '../app' import { encodeCallScript } from '../callScript' import { canForward } from '../forwarding' import { - Transaction, createDirectTransactionForApp, createForwarderTransactionBuilder, - buildForwardingFeePretransaction, + buildForwardingFeePreTransactions, } from '../transactions' -interface PathData { - forwardingFeePretransaction?: Transaction - path: Transaction[] -} - -function validateMethod( - destination: string, - methodSignature: string, - destinationApp: App -): AppIntent { - const methods = destinationApp.intents - if (!methods) { - throw new ErrorInvalid( - `No functions specified in artifact for ${destination}` - ) - } - - // Find the relevant method information - const method = methods.find((method) => - isFullMethodSignature(methodSignature) - ? method.sig === methodSignature - : // If the full signature isn't given, just select the first overload declared - method.sig.split('(')[0] === methodSignature - ) - if (!method) { - throw new ErrorInvalid( - `No method named ${methodSignature} on ${destination}` - ) - } - - return method -} - /** * Calculate the forwarding path for a transaction to `destination` * that invokes `directTransaction`. @@ -62,10 +25,10 @@ async function calculateForwardingPath( forwardersWithPermission: string[], forwarders: string[], provider: ethersProviders.Provider -): Promise { +): Promise { // No forwarders can perform the requested action if (forwardersWithPermission.length === 0) { - return { path: [] } + return { path: [], transactions: [] } } const createForwarderTransaction = createForwarderTransactionBuilder( @@ -73,26 +36,43 @@ async function calculateForwardingPath( directTransaction ) + const buildForwardingPath = async ( + forwarder: string, + script: string, + path: Transaction[], + provider: ethersProviders.Provider + ): Promise => { + const transaction = createForwarderTransaction(forwarder, script) + + // Only apply pretransactions to the first transaction in the path + // as it's the only one that will be executed by the user + try { + const forwardingFeePreTransactions = await buildForwardingFeePreTransactions( + transaction, + provider + ) + // If that happens, we give up as we should've been able to perform the action with this + // forwarding path + return { + transactions: [...forwardingFeePreTransactions, transaction], + path: [transaction, ...path], + } + } catch (err) { + return { path: [], transactions: [] } + } + } + // Check if one of the forwarders that has permission to perform an action // with `sig` on `address` can forward for us directly for (const forwarder of forwardersWithPermission) { const script = encodeCallScript([directTransaction]) if (await canForward(forwarder, sender, script, provider)) { - const transaction = createForwarderTransaction(forwarder, script) - try { - const forwardingFeePretransaction = await buildForwardingFeePretransaction( - transaction, - provider - ) - // If that happens, we give up as we should've been able to perform the action with this - // forwarder - return { - forwardingFeePretransaction, - path: [transaction, directTransaction], - } - } catch (err) { - return { path: [] } - } + return buildForwardingPath( + forwarder, + script, + [directTransaction], + provider + ) } } @@ -143,24 +123,7 @@ async function calculateForwardingPath( if (await canForward(forwarder, sender, script, provider)) { // The previous forwarder can forward a transaction for this forwarder, // and this forwarder can forward for our address, so we have found a path - const transaction = createForwarderTransaction(forwarder, script) - - // Only apply pretransactions to the first transaction in the path - // as it's the only one that will be executed by the user - try { - const forwardingFeePretransaction = await buildForwardingFeePretransaction( - transaction, - provider - ) - // If that happens, we give up as we should've been able to perform the action with this - // forwarding path - return { - forwardingFeePretransaction, - path: [transaction, ...path], - } - } catch (err) { - return { path: [] } - } + return buildForwardingPath(forwarder, script, path, provider) } else { // The previous forwarder can forward a transaction for this forwarder, // but this forwarder can not forward for our address, so we add it as a @@ -180,7 +143,7 @@ async function calculateForwardingPath( queue.push([path, nextQueue]) } while (queue.length) - return { path: [] } + return { path: [], transactions: [] } } /** @@ -190,47 +153,44 @@ async function calculateForwardingPath( */ export async function calculateTransactionPath( sender: string, - destination: string, + destinationApp: App, methodSignature: string, params: any[], apps: App[], provider: ethersProviders.Provider, finalForwarder?: string //Address of the final forwarder that can perfom the action. Needed for actions that aren't in the ACL but whose execution depends on other factors -): Promise { - // Get the destination app - const destinationApp = apps.find((app) => app.address == destination) - if (!destinationApp) { - throw new ErrorInvalid( - `Transaction path destination (${destination}) is not an installed app` - ) - } - - // Make sure the method signature is correct - const method = validateMethod(destination, methodSignature, destinationApp) - - const finalForwarderProvided = finalForwarder - ? isAddress(finalForwarder) - : false +): Promise { + // The direct transaction we eventually want to perform const directTransaction = await createDirectTransactionForApp( sender, destinationApp, - method.sig, + methodSignature, params ) + const finalForwarderProvided = finalForwarder + ? ethersUtils.isAddress(finalForwarder) + : false + + const method = findAppMethodFromSignature(destinationApp, methodSignature) + if (!method) { + throw new ErrorInvalid( + `No method named ${methodSignature} on ${destinationApp.address}` + ) + } // We can already assume the user is able to directly invoke the action if: // - The method has no ACL requirements and no final forwarder was given, or // - The final forwarder matches the sender if ( - (method.roles.length === 0 && !finalForwarderProvided) || + (method?.roles.length === 0 && !finalForwarderProvided) || (finalForwarder && addressesEqual(finalForwarder, sender)) ) { try { - return { path: [directTransaction] } + return { path: [directTransaction], transactions: [directTransaction] } } catch (_) { // If the direct transaction fails, we give up as we should have been able to // perform the action directly - return { path: [] } + return { path: [], transactions: [] } } } @@ -245,7 +205,7 @@ export async function calculateTransactionPath( if (!includesAddress(forwarders, finalForwarder)) { // Final forwarder was given, but did not match any available forwarders, so no path // could be found - return { path: [] } + return { path: [], transactions: [] } } // Only attempt to find path with declared final forwarder; assume the final forwarder @@ -257,12 +217,15 @@ export async function calculateTransactionPath( const role = (await destinationApp.roles()).find( (role) => role.name === method.roles[0] ) + const allowedEntities = - role?.permissions?.map((permission) => permission.granteeAddress) || [] + role?.permissions + ?.filter((permission) => permission.allowed) + .map((permission) => permission.granteeAddress) || [] // No one has access, so of course we don't as well if (allowedEntities.length === 0) { - return { path: [] } + return { path: [], transactions: [] } } // User may have permission; attempt direct transaction @@ -271,7 +234,7 @@ export async function calculateTransactionPath( includesAddress(allowedEntities, ANY_ENTITY) ) { try { - return { path: [directTransaction] } + return { path: [directTransaction], transactions: [directTransaction] } } catch (_) { // Don't immediately fail as the permission could have parameters applied that // disallows the user from the current action and forces us to use the full diff --git a/packages/connect-core/src/utils/path/getACLForwardingPath.ts b/packages/connect-core/src/utils/path/getACLForwardingPath.ts new file mode 100644 index 00000000..8d183a09 --- /dev/null +++ b/packages/connect-core/src/utils/path/getACLForwardingPath.ts @@ -0,0 +1,95 @@ +import { Address } from '@aragon/connect-types' +import { providers as ethersProviders } from 'ethers' + +import { getForwardingPath } from './getForwardingPath' +import { findMethodAbiFragment } from '../abi' +import { findAppMethodFromSignature } from '../app' +import App from '../../entities/App' +import ForwardingPath from '../../entities/ForwardingPath' + +/** + * Get the permission manager for an `app`'s and `role`. + * + * @param {string} appAddress + * @param {string} roleHash + * @return {Promise} The permission manager + */ +async function getPermissionManager( + appAddress: Address, + roleHash: string, + installedApps: App[] +) { + const app = installedApps.find((app) => app.address === appAddress) + const roles = await app?.roles() + + return roles?.find((role) => role.hash === roleHash)?.manager +} + +/** + * Calculates transaction path for performing a method on the ACL + * + * @param {string} methodSignature + * @param {Array<*>} params + * @return {Promise>} An array of Ethereum transactions that describe each step in the path + */ +export async function getACLForwardingPath( + sender: Address, + acl: App, + methodSignature: string, + params: any[], + installedApps: App[], + provider: ethersProviders.Provider +): Promise { + const method = findAppMethodFromSignature(acl, methodSignature, { + allowDeprecated: false, + }) + if (!method) { + throw new Error(`No method named ${methodSignature} on ACL`) + } + + if (method.roles && method.roles.length !== 0) { + // This action can be done with regular transaction pathing (it's protected by an ACL role) + return getForwardingPath( + sender, + acl, + methodSignature, + params, + installedApps, + provider + ) + } else { + // Some ACL functions don't have a role and are instead protected by a manager + // Inspect the matched method's ABI to find the position of the 'app' and 'role' parameters + // needed to get the permission manager + const methodAbiFragment = findMethodAbiFragment(acl.abi, methodSignature) + if (!methodAbiFragment) { + throw new Error(`Method ${method} not found on ACL ABI`) + } + + const inputNames = methodAbiFragment.inputs.map((input) => input.name) + const appIndex = inputNames.indexOf('_app') + const roleIndex = inputNames.indexOf('_role') + + if (appIndex === -1 || roleIndex === -1) { + throw new Error( + `Method ${methodSignature} doesn't take _app and _role as input. Permission manager cannot be found.` + ) + } + + const manager = await getPermissionManager( + params[appIndex], + params[roleIndex], + installedApps + ) + + return getForwardingPath( + sender, + acl, + methodSignature, + params, + installedApps, + provider, + manager + ) + } +} diff --git a/packages/connect-core/src/utils/path/getForwardingPath.ts b/packages/connect-core/src/utils/path/getForwardingPath.ts new file mode 100644 index 00000000..9d8b7edf --- /dev/null +++ b/packages/connect-core/src/utils/path/getForwardingPath.ts @@ -0,0 +1,46 @@ +import { Address } from '@aragon/connect-types' +import { providers as ethersProviders } from 'ethers' + +import { calculateTransactionPath } from './calculatePath' +import App from '../../entities/App' +import ForwardingPath from '../../entities/ForwardingPath' + +/** + * Calculate the transaction path for a transaction to `destination` + * that invokes `methodSignature` with `params`. + * + * @param {string} destination + * @param {string} methodSignature + * @param {Array<*>} params + * @param {string} [finalForwarder] Address of the final forwarder that can perfom the action + * @return {Promise>} An array of Ethereum transactions that describe each step in the path + */ +export async function getForwardingPath( + sender: Address, + destinationApp: App, + methodSignature: string, + params: any[], + installedApps: App[], + provider: ethersProviders.Provider, + finalForwarder?: Address +): Promise { + const { path, transactions } = await calculateTransactionPath( + sender, + destinationApp, + methodSignature, + params, + installedApps, + provider, + finalForwarder + ) + + return new ForwardingPath( + { + destination: destinationApp, + path, + transactions, + }, + installedApps, + provider + ) +} diff --git a/packages/connect-core/src/utils/path/index.ts b/packages/connect-core/src/utils/path/index.ts new file mode 100644 index 00000000..8da671b9 --- /dev/null +++ b/packages/connect-core/src/utils/path/index.ts @@ -0,0 +1,3 @@ +export { calculateTransactionPath } from './calculatePath' +export { getForwardingPath } from './getForwardingPath' +export { getACLForwardingPath } from './getACLForwardingPath' diff --git a/packages/connect-core/src/utils/radspec/index.ts b/packages/connect-core/src/utils/radspec/index.ts index f98323e5..7b4fef46 100644 --- a/packages/connect-core/src/utils/radspec/index.ts +++ b/packages/connect-core/src/utils/radspec/index.ts @@ -1,13 +1,14 @@ -import { providers as ethersProviders } from 'ethers' import * as radspec from 'radspec' +import { providers as ethersProviders } from 'ethers' + import { addressesEqual } from '../address' -import { findAppMethodFromIntent } from '../app' +import { findAppMethodFromData } from '../app' +import { filterAndDecodeAppUpgradeIntents } from '../intent' +import { Abi, AppMethod, StepDecoded, StepDescribed } from '../../types' import App from '../../entities/App' -import { TransactionRequestData } from '../../transactions/TransactionRequest' -import { Abi, AppIntent } from '../../types' interface FoundMethod { - method?: AppIntent + method?: AppMethod abi?: Abi } @@ -15,22 +16,24 @@ interface FoundMethod { * Attempt to describe intent via radspec. */ export async function tryEvaluatingRadspec( - intent: TransactionRequestData, - apps: App[], - provider?: ethersProviders.Provider // Decorated intent with description, if one could be made -): Promise { - const app = apps.find((app) => addressesEqual(app.address, intent.to)) + intent: StepDecoded, + installedApps: App[], + provider: ethersProviders.Provider // Decorated intent with description, if one could be made +): Promise { + const app = installedApps.find((app) => + addressesEqual(app.address, intent.to) + ) // If the intent matches an installed app, use only that app to search for a // method match, otherwise fallback to searching all installed apps - const appsToSearch = app ? [app] : apps + const appsToSearch = app ? [app] : installedApps const foundMethod = appsToSearch.reduce( (found, app) => { if (found) { return found } - const method = findAppMethodFromIntent(app, intent) + const method = findAppMethodFromData(app, intent.data) if (method) { return { method, @@ -65,10 +68,37 @@ export async function tryEvaluatingRadspec( } } - return evaluatedNotice + return { ...intent, description: evaluatedNotice } +} + +/** + * Attempt to describe a setApp() intent. Only describes the APP_BASE namespace. + * + * @param {Object} intent transaction intent + * @param {Object} wrapper + * @return {Promise} Decorated intent with description, if one could be made + */ +export async function tryDescribingUpdateAppIntent( + intent: StepDecoded, + installedApps: App[] +): Promise { + const upgradeIntentParams = filterAndDecodeAppUpgradeIntents( + [intent], + installedApps + )[0] + if (Array.isArray(upgradeIntentParams) && upgradeIntentParams.length === 0) + return undefined + + const { appId, appAddress } = upgradeIntentParams + + const app = installedApps.find((app) => app.address === appAddress) + + const repo = await app?.repo() + + return { + ...intent, + description: `Upgrade ${appId} app instances to v${repo?.lastVersion}`, + } } -export { - postprocessRadspecDescription, - PostProcessDescription, -} from './postprocess' +export { postprocessRadspecDescription } from './postprocess' diff --git a/packages/connect-core/src/utils/radspec/postprocess.ts b/packages/connect-core/src/utils/radspec/postprocess.ts index df376585..ba9e6a0b 100644 --- a/packages/connect-core/src/utils/radspec/postprocess.ts +++ b/packages/connect-core/src/utils/radspec/postprocess.ts @@ -1,20 +1,18 @@ import { addressesEqual, ANY_ENTITY } from '../address' import { getKernelNamespace } from '../kernel' +import { + DescriptionAnnotation, + PostProcessDescription, + AragonArtifactRole, +} from '../../types' import App from '../../entities/App' -import Role from '../../entities/Role' -import { Annotation } from '../../transactions/TransactionRequest' - -export interface PostProcessDescription { - description: string - annotatedDescription?: Annotation[] -} interface CompiledTokens { description: string[] - annotatedDescription: Annotation[] + annotatedDescription: DescriptionAnnotation[] } -type ProcessToken = [string, string, Annotation] +type ProcessToken = [string, string, DescriptionAnnotation] /** * Look for known addresses and roles in a radspec description and substitute them with a human string @@ -24,7 +22,7 @@ type ProcessToken = [string, string, Annotation] */ export async function postprocessRadspecDescription( description: string, - apps: App[] + installedApps: App[] ): Promise { const addressRegexStr = '0x[a-fA-F0-9]{40}' const addressRegex = new RegExp(`^${addressRegexStr}$`) @@ -43,11 +41,10 @@ export async function postprocessRadspecDescription( return { description } } - const roles: Role[] = [] - for (const app of apps) { - const appRoles = await app.roles() - roles.concat(appRoles) - } + const roles = installedApps.reduce( + (roles, app) => roles.concat(app.artifact.roles), + [] as AragonArtifactRole[] + ) const annotateAddress = (input: string): ProcessToken => { if (addressesEqual(input, ANY_ENTITY)) { @@ -58,7 +55,9 @@ export async function postprocessRadspecDescription( ] } - const app = apps.find(({ address }) => addressesEqual(address, input)) + const app = installedApps.find(({ address }) => + addressesEqual(address, input) + ) if (app) { const replacement = `${app.name}${app.appId ? ` (${app.appId})` : ''}` return [input, `“${replacement}”`, { type: 'app', value: app }] @@ -68,17 +67,21 @@ export async function postprocessRadspecDescription( } const annotateBytes32 = (input: string): ProcessToken => { - const role = roles.find(({ hash }) => hash === input) + const role = roles.find(({ bytes }) => bytes === input) if (role && role.name) { return [input, `“${role.name}”`, { type: 'role', value: role }] } - const app = apps.find(({ appId }) => appId === input) + const app = installedApps.find(({ appId }) => appId === input) if (app) { // return the entire app as it contains APM package details - return [input, `“${app.appName}”`, { type: 'apmPackage', value: app }] + return [ + input, + `“${app.artifact.appName}”`, + { type: 'apmPackage', value: app }, + ] } const namespace = getKernelNamespace(input) @@ -115,7 +118,7 @@ export async function postprocessRadspecDescription( return acc }, { - annotatedDescription: [] as Annotation[], + annotatedDescription: [] as DescriptionAnnotation[], description: [] as string[], } ) diff --git a/packages/connect-core/src/utils/radspec/radspec-gabi.d.ts b/packages/connect-core/src/utils/radspec/radspec-gabi.d.ts deleted file mode 100644 index cb28fc42..00000000 --- a/packages/connect-core/src/utils/radspec/radspec-gabi.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module 'radspec-gabi' diff --git a/packages/connect-core/src/utils/transactions.ts b/packages/connect-core/src/utils/transactions.ts index 11624005..a1357be0 100644 --- a/packages/connect-core/src/utils/transactions.ts +++ b/packages/connect-core/src/utils/transactions.ts @@ -1,3 +1,4 @@ +import { Address } from '@aragon/connect-types' import { Contract, providers as ethersProviders, @@ -5,57 +6,36 @@ import { } from 'ethers' import { ErrorInvalid, ErrorUnsufficientBalance } from '../errors' import { erc20ABI, forwarderAbi, forwarderFeeAbi } from './abis' -import { isFullMethodSignature } from './app' -import { FunctionFragment } from '../types' +import { findMethodAbiFragment } from './abi' +import { TokenData } from '../types' import App from '../entities/App' - -export interface Transaction { - data: string - from?: string - to: string -} - -export interface TransactionWithTokenData extends Transaction { - token: { - address: string - value: string - spender: string - } -} +import Transaction from '../entities/Transaction' export async function createDirectTransaction( - sender: string, - destination: string, - methodAbiFragment: FunctionFragment, + sender: Address, + destination: Address, + methodAbiFragment: ethersUtils.Fragment, params: any[] ): Promise { - let transactionOptions = {} - - // If an extra parameter has been provided, it is the transaction options if it is an object - if ( - methodAbiFragment.inputs.length + 1 === params.length && - typeof params[params.length - 1] === 'object' - ) { - const options = params.pop() - transactionOptions = { ...transactionOptions, ...options } + if (methodAbiFragment.type === 'fallback' && params.length > 1) { + throw new Error( + `Could not create transaction to fallback function due to too many parameters: ${params}` + ) } - const ethersInterface = new ethersUtils.Interface([methodAbiFragment]) - // The direct transaction we eventually want to perform - return { - ...transactionOptions, // Options are overwriten by the values below + return new Transaction({ from: sender, to: destination, - data: ethersInterface.encodeFunctionData( + data: new ethersUtils.Interface([methodAbiFragment]).encodeFunctionData( ethersUtils.FunctionFragment.from(methodAbiFragment), params ), - } + }) } export async function createDirectTransactionForApp( - sender: string, + sender: Address, app: App, methodSignature: string, params: any[] @@ -72,67 +52,44 @@ export async function createDirectTransactionForApp( throw new ErrorInvalid(`No ABI specified in artifact for ${destination}`) } - const methodAbiFragment = app.abi.find((method) => { - // If the full signature isn't given, just find the first overload declared - if (!isFullMethodSignature(methodSignature)) { - return method.name === methodSignature - } - - // Fallback functions don't have inputs in the ABI - const currentParameterTypes = Array.isArray(method.inputs) - ? method.inputs.map(({ type }) => type) - : [] - const currentMethodSignature = `${method.name}(${currentParameterTypes.join( - ',' - )})` - return currentMethodSignature === methodSignature - }) + const fragment = findMethodAbiFragment(app.abi, methodSignature) - if (!methodAbiFragment) { + if (!fragment) { throw new ErrorInvalid( `${methodSignature} not found on ABI for ${destination}` ) } - return createDirectTransaction( - sender, - destination, - methodAbiFragment as FunctionFragment, - params - ) + return createDirectTransaction(sender, app.address, fragment, params) } export function createForwarderTransactionBuilder( - sender: string, + sender: Address, directTransaction: Transaction ): Function { const forwarder = new ethersUtils.Interface(forwarderAbi) - return (forwarderAddress: string, script: string): Transaction => ({ - ...directTransaction, // Options are overwriten by the values below - from: sender, - to: forwarderAddress, - data: forwarder.encodeFunctionData('forward', [script]), - }) + return (forwarderAddress: string, script: string): Transaction => + new Transaction({ + ...directTransaction, // Options are overwriten by the values below + from: sender, + to: forwarderAddress, + data: forwarder.encodeFunctionData('forward', [script]), + }) } -export async function buildPretransaction( - transaction: TransactionWithTokenData, +export async function buildApprovePreTransactions( + transaction: Transaction, + tokenData: TokenData, provider: ethersProviders.Provider -): Promise { - // Token allowance pretransactionn - const { - from, - to, - token: { address: tokenAddress, value: tokenValue, spender }, - } = transaction - - // Approve the transaction destination unless an spender is passed to approve a different contract - const approveSpender = spender || to +): Promise { + // Token allowance pre-transaction + const { from, to } = transaction + const { address: tokenAddress, value: tokenValue, spender } = tokenData const tokenContract = new Contract(tokenAddress, erc20ABI, provider) const balance = await tokenContract.balanceOf(from) - const tokenValueBN = BigInt(tokenValue) + const tokenValueBN = BigInt(tokenValue.toString()) if (BigInt(balance) < tokenValueBN) { throw new ErrorUnsufficientBalance( @@ -140,33 +97,46 @@ export async function buildPretransaction( ) } + // Approve the transaction destination unless an spender is passed to approve a different contract + const approveSpender = spender ?? to const allowance = await tokenContract.allowance(from, approveSpender) - const allowanceBN = BigInt(allowance) + // If allowance is already greater than or equal to amount, there is no need to do an approve transaction - if (allowanceBN < tokenValueBN) { - if (allowanceBN > BigInt(0)) { - // TODO: Actually handle existing approvals (some tokens fail when the current allowance is not 0) - console.warn( - `${from} already approved ${approveSpender}. In some tokens, approval will fail unless the allowance is reset to 0 before re-approving again.` - ) - } + const allowanceBN = BigInt(allowance) + if (allowanceBN >= tokenValueBN) { + return [] + } - const erc20 = new ethersUtils.Interface(erc20ABI) + const transactions: Transaction[] = [] + const erc20 = new ethersUtils.Interface(erc20ABI) - return { + // If the current allowance is greater than zero, we send a first pre-transaction to set it to zero + if (allowanceBN > BigInt(0)) { + console.warn( + `${from} already approved ${approveSpender} some amount, adding one extra pre-transaction to set it to zero to avoid a failing approval.` + ) + const zeroApprovalPreTransaction = new Transaction({ from, to: tokenAddress, - data: erc20.encodeFunctionData('approve', [approveSpender, tokenValue]), - } + data: erc20.encodeFunctionData('approve', [approveSpender, '0']), + }) + transactions.push(zeroApprovalPreTransaction) } - return undefined + const requestedApprovalPreTransaction = new Transaction({ + from, + to: tokenAddress, + data: erc20.encodeFunctionData('approve', [approveSpender, tokenValue]), + }) + + transactions.push(requestedApprovalPreTransaction) + return transactions } -export async function buildForwardingFeePretransaction( +export async function buildForwardingFeePreTransactions( forwardingTransaction: Transaction, provider: ethersProviders.Provider -): Promise { +): Promise { const { to: forwarderAddress, from } = forwardingTransaction const forwarderFee = new Contract(forwarderAddress, forwarderFeeAbi, provider) @@ -185,17 +155,18 @@ export async function buildForwardingFeePretransaction( } if (feeDetails.tokenAddress && feeDetails.amount > BigInt(0)) { - // Needs a token approval pretransaction - const forwardingTxWithTokenData: TransactionWithTokenData = { - ...forwardingTransaction, - token: { - address: feeDetails.tokenAddress, - spender: forwarderAddress, // since it's a forwarding transaction, always show the real spender - value: feeDetails.amount.toString(), - }, + // Needs a token approval pre-transaction + const tokenData: TokenData = { + address: feeDetails.tokenAddress, + spender: forwarderAddress, // since it's a forwarding transaction, always show the real spender + value: feeDetails.amount.toString(), } - return buildPretransaction(forwardingTxWithTokenData, provider) + return buildApprovePreTransactions( + forwardingTransaction, + tokenData, + provider + ) } - return undefined + return [] } diff --git a/packages/connect-disputable-voting/jest.config.js b/packages/connect-disputable-voting/jest.config.js index 97b477eb..64c3870d 100644 --- a/packages/connect-disputable-voting/jest.config.js +++ b/packages/connect-disputable-voting/jest.config.js @@ -11,4 +11,5 @@ module.exports = { name: packageName, displayName: 'DISPUTABLE-VOTING', rootDir: '../..', + testTimeout: 20000 } diff --git a/packages/connect-disputable-voting/package.json b/packages/connect-disputable-voting/package.json index 2074da35..5080e9f6 100644 --- a/packages/connect-disputable-voting/package.json +++ b/packages/connect-disputable-voting/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-disputable-voting", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "private": true, "license": "LGPL-3.0-or-later", "description": "Access and interact with Aragon Organizations and their apps.", @@ -36,8 +36,8 @@ "lint": "eslint --ext .ts ./src" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0", + "@aragon/connect-core": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6", "graphql-tag": "^2.10.3" }, "devDependencies": { diff --git a/packages/connect-disputable-voting/src/__test__/models/votes.test.ts b/packages/connect-disputable-voting/src/__test__/models/votes.test.ts index 1980cb80..ce54edc5 100644 --- a/packages/connect-disputable-voting/src/__test__/models/votes.test.ts +++ b/packages/connect-disputable-voting/src/__test__/models/votes.test.ts @@ -1,25 +1,12 @@ -import { - ERC20, - Vote, - CastVote, - ArbitratorFee, - DisputableVoting, - CollateralRequirement, - DisputableVotingConnectorTheGraph, -} from '../../../src' - -const VOTING_APP_ADDRESS = '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' -const VOTING_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-dvoting-rinkeby-staging' +import { bn } from '../../helpers' +import { buildDisputableVoting, VOTING_APP_ADDRESS } from '../utils' +import { ERC20, Vote, CastVote, DisputableVoting, CollateralRequirement } from '../../../src' describe('DisputableVoting', () => { let voting: DisputableVoting - beforeAll(() => { - const connector = new DisputableVotingConnectorTheGraph({ - subgraphUrl: VOTING_SUBGRAPH_URL, - }) - voting = new DisputableVoting(connector, VOTING_APP_ADDRESS) + beforeAll(async () => { + voting = await buildDisputableVoting() }) afterAll(async () => { @@ -41,6 +28,7 @@ describe('DisputableVoting', () => { parseInt(scheduledVote.duration) expect(scheduledVote.endDate).toBe(expectedScheduledVoteEndDate.toString()) + expect(scheduledVote.currentQuietEndingExtensionDuration).toBe('0') const expectedSettledVoteEndDate = parseInt(settledVote.startDate) + @@ -48,6 +36,7 @@ describe('DisputableVoting', () => { parseInt(settledVote.pauseDuration) expect(settledVote.endDate).toBe(expectedSettledVoteEndDate.toString()) + expect(settledVote.currentQuietEndingExtensionDuration).toBe('0') }) }) @@ -64,6 +53,7 @@ describe('DisputableVoting', () => { parseInt(scheduledVote.quietEndingExtension) expect(scheduledVote.endDate).toBe(expectedScheduledVoteEndDate.toString()) + expect(scheduledVote.currentQuietEndingExtensionDuration).toBe(scheduledVote.quietEndingExtension) const expectedSettledVoteEndDate = parseInt(settledVote.startDate) + @@ -72,30 +62,62 @@ describe('DisputableVoting', () => { parseInt(settledVote.quietEndingExtension) expect(settledVote.endDate).toBe(expectedSettledVoteEndDate.toString()) + expect(settledVote.currentQuietEndingExtensionDuration).toBe(settledVote.quietEndingExtension) }) }) }) describe('results', () => { - test('computes the current outcome properly', async () => { - const vote = await voting.vote(`${VOTING_APP_ADDRESS}-vote-2`) + describe('when the vote is challenged', () => { + test('computes the current outcome properly', async () => { + const vote = await voting.vote(`${VOTING_APP_ADDRESS}-vote-1`) + + expect(vote.hasEnded).toBe(true) + expect(vote.isAccepted).toBe(false) + expect(vote.status).toBe('Settled') + + expect(vote.totalPower).toBe('3000000000000000000') + expect(vote.formattedTotalPower).toBe('3.00') + + expect(vote.yeas).toBe('0') + expect(vote.yeasPct).toBe('0') + expect(vote.formattedYeas).toBe('0.00') + expect(vote.formattedYeasPct).toBe('0.00') + + expect(vote.nays).toBe('0') + expect(vote.naysPct).toBe('0') + expect(vote.formattedNays).toBe('0.00') + expect(vote.formattedNaysPct).toBe('0.00') + + expect(await vote.canExecute()).toBe(false) + expect(await vote.canVote('0x03acbcb547d03c8e7746ef5988012b59604aa083')).toBe(false) + }) + }) + + describe('when the vote is settled', () => { + test('computes the current outcome properly', async () => { + const vote = await voting.vote(`${VOTING_APP_ADDRESS}-vote-2`) - expect(vote.hasEnded).toBe(true) - expect(vote.isAccepted).toBe(false) - expect(vote.status).toBe('Settled') + expect(vote.hasEnded).toBe(true) + expect(vote.isAccepted).toBe(false) + expect(vote.status).toBe('Settled') - expect(vote.totalPower).toBe('3000000000000000000') - expect(vote.formattedTotalPower).toBe('3.00') + expect(vote.totalPower).toBe('3000000000000000000') + expect(vote.formattedTotalPower).toBe('3.00') - expect(vote.yeas).toBe('0') - expect(vote.yeasPct).toBe('0') - expect(vote.formattedYeas).toBe('0.00') - expect(vote.formattedYeasPct).toBe('0.00') + expect(vote.yeas).toBe('0') + expect(vote.yeasPct).toBe('0') + expect(vote.formattedYeas).toBe('0.00') + expect(vote.formattedYeasPct).toBe('0.00') - expect(vote.nays).toBe('0') - expect(vote.naysPct).toBe('0') - expect(vote.formattedNays).toBe('0.00') - expect(vote.formattedNaysPct).toBe('0.00') + expect(vote.nays).toBe('0') + expect(vote.naysPct).toBe('0') + expect(vote.formattedNays).toBe('0.00') + expect(vote.formattedNaysPct).toBe('0.00') + + expect(await vote.canExecute()).toBe(false) + expect(await vote.canVote('0x03acbcb547d03c8e7746ef5988012b59604aa083')).toBe(false) + }) }) }) @@ -134,6 +156,7 @@ describe('DisputableVoting', () => { it('returns a null value', async () => { expect(castVote).toBeNull() + expect(await vote.hasVoted(VOTER_ADDRESS)).toBe(false) }) }) @@ -151,6 +174,8 @@ describe('DisputableVoting', () => { expect(castVote.stake).toBe('1000000000000000000') expect(castVote.createdAt).toBe('1598530298') expect(castVote.caster).toBe(VOTER_ADDRESS) + + expect(await vote.hasVoted(VOTER_ADDRESS)).toBe(true) }) test('allows telling the voter', async () => { @@ -164,21 +189,22 @@ describe('DisputableVoting', () => { describe('collateralRequirement', () => { const voteId = `${VOTING_APP_ADDRESS}-vote-2` + let vote: Vote let collateralRequirement: CollateralRequirement beforeAll(async () => { - const vote = await voting.vote(voteId) + vote = await voting.vote(voteId) collateralRequirement = await vote.collateralRequirement() }) test('has a collateral requirement associated', async () => { - expect(collateralRequirement.id).toBe(voteId) - expect(collateralRequirement.tokenId).toBe( - '0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42' - ) + expect(collateralRequirement.id).toBe(`${VOTING_APP_ADDRESS}-collateral-${collateralRequirement.collateralRequirementId}`) + expect(collateralRequirement.tokenId).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') expect(collateralRequirement.actionAmount).toBe('0') expect(collateralRequirement.challengeAmount).toBe('0') expect(collateralRequirement.challengeDuration).toBe('259200') + + expect(await vote.formattedSettlementOffer()).toBe('0.00') }) test('can requests the related token info', async () => { @@ -200,19 +226,39 @@ describe('DisputableVoting', () => { }) test('can requests the submitter arbitrator fees', async () => { - const artbiratorFee = (await vote.submitterArbitratorFee())! + const arbitratorFee = (await vote.submitterArbitratorFee())! - expect(artbiratorFee.id).toBe(`${voteId}-submitter`) - expect(artbiratorFee.tokenId).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') - expect(artbiratorFee.formattedAmount).toBe('150.00') + expect(arbitratorFee.id).toBe(`${voteId}-submitter`) + expect(arbitratorFee.tokenId).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') + expect(arbitratorFee.formattedAmount).toBe('150.00') }) test('can requests the submitter arbitrator fees', async () => { - const artbiratorFee = (await vote.challengerArbitratorFee())! + const arbitratorFee = (await vote.challengerArbitratorFee())! + + expect(arbitratorFee.id).toBe(`${voteId}-challenger`) + expect(arbitratorFee.tokenId).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') + expect(arbitratorFee.formattedAmount).toBe('150.00') + }) + }) + + describe('balances', () => { + let vote: Vote + const VOTE_ID = `${VOTING_APP_ADDRESS}-vote-0` + const VOTER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + beforeAll(async () => { + vote = await voting.vote(VOTE_ID) + }) + + test('tells the balance at the moment of the vote', async () => { + expect(await vote.formattedVotingPower(VOTER_ADDRESS)).toBe('1.00') + }) + + test('tells the current balance of a voter', async () => { + const token = await vote.token() - expect(artbiratorFee.id).toBe(`${voteId}-challenger`) - expect(artbiratorFee.tokenId).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') - expect(artbiratorFee.formattedAmount).toBe('150.00') + expect((await token.balance(VOTER_ADDRESS)).gte(bn(0))).toBe(true) }) }) }) diff --git a/packages/connect-disputable-voting/src/__test__/models/voting.test.ts b/packages/connect-disputable-voting/src/__test__/models/voting.test.ts new file mode 100644 index 00000000..4396cc44 --- /dev/null +++ b/packages/connect-disputable-voting/src/__test__/models/voting.test.ts @@ -0,0 +1,99 @@ +import { ethers } from 'ethers' +import { buildDisputableVoting, VOTING_APP_ADDRESS } from '../utils' +import { ERC20, DisputableVoting, CollateralRequirement } from '../../../src' + +describe('DisputableVoting', () => { + let voting: DisputableVoting + + beforeAll(async () => { + voting = await buildDisputableVoting() + }) + + afterAll(async () => { + await voting.disconnect() + }) + + describe('current collateral requirement', () => { + let collateralRequirement: CollateralRequirement + + beforeEach(async () => { + collateralRequirement = await voting.currentCollateralRequirement() + }) + + test('has a collateral requirement associated', async () => { + expect(collateralRequirement.id).toBe(`${VOTING_APP_ADDRESS}-collateral-${collateralRequirement.collateralRequirementId}`) + expect(collateralRequirement.tokenId).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') + expect(collateralRequirement.actionAmount).toBe('1000000000000000000') + expect(collateralRequirement.formattedActionAmount).toBe('1.00') + expect(collateralRequirement.challengeAmount).toBe('2000000000000000000') + expect(collateralRequirement.formattedChallengeAmount).toBe('2.00') + expect(collateralRequirement.challengeDuration).toBe('259200') + }) + + test('can requests the related token info', async () => { + const token: ERC20 = await collateralRequirement.token() + + expect(token.id).toBe('0x3af6b2f907f0c55f279e0ed65751984e6cdc4a42') + expect(token.name).toBe('DAI Token') + expect(token.symbol).toBe('DAI') + expect(token.decimals).toBe(18) + }) + }) + + describe('new vote', () => { + const SCRIPT = '0x00000001' + const CONTEXT = 'challenger evidence' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + it('returns a new vote intent', async () => { + const votingABI = new ethers.utils.Interface(['function newVote(bytes,bytes)']) + const intent = await voting.newVote(SCRIPT, CONTEXT, SIGNER_ADDRESS) + + expect(intent.transactions.length).toBe(2) + expect(intent.destination.address).toBe(VOTING_APP_ADDRESS) + + const transaction = intent.transactions[1] + expect(transaction.to.toLowerCase()).toBe(VOTING_APP_ADDRESS) + expect(transaction.from).toBe(SIGNER_ADDRESS) + expect(transaction.data).toBe(votingABI.encodeFunctionData('newVote', [SCRIPT, ethers.utils.toUtf8Bytes(CONTEXT)])) + }) + }) + + describe('castVote', () => { + const VOTE_NUMBER = '12' + const SUPPORT = true + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + it('returns a vote intent', async () => { + const votingABI = new ethers.utils.Interface(['function vote(uint256,bool)']) + const intent = await voting.castVote(VOTE_NUMBER, SUPPORT, SIGNER_ADDRESS) + + expect(intent.transactions.length).toBe(1) + expect(intent.destination.address).toBe(VOTING_APP_ADDRESS) + + const transaction = intent.transactions[0] + expect(transaction.to.toLowerCase()).toBe(VOTING_APP_ADDRESS) + expect(transaction.from).toBe(SIGNER_ADDRESS) + expect(transaction.data).toBe(votingABI.encodeFunctionData('vote', [VOTE_NUMBER, SUPPORT])) + }) + }) + + describe('executeVote', () => { + const VOTE_NUMBER = '12' + const SCRIPT = '0xabcdef' + const SIGNER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' + + it('returns an execute vote intent', async () => { + const votingABI = new ethers.utils.Interface(['function executeVote(uint256,bytes)']) + const intent = await voting.executeVote(VOTE_NUMBER, SCRIPT, SIGNER_ADDRESS) + + expect(intent.transactions.length).toBe(1) + expect(intent.destination.address).toBe(VOTING_APP_ADDRESS) + + const transaction = intent.transactions[0] + expect(transaction.to.toLowerCase()).toBe(VOTING_APP_ADDRESS) + expect(transaction.from).toBe(SIGNER_ADDRESS) + expect(transaction.data).toBe(votingABI.encodeFunctionData('executeVote', [VOTE_NUMBER, SCRIPT])) + }) + }) +}) diff --git a/packages/connect-disputable-voting/src/__test__/thegraph/disputableVoting.test.ts b/packages/connect-disputable-voting/src/__test__/thegraph/disputableVoting.test.ts index 7ebb8b3c..d6b4912b 100644 --- a/packages/connect-disputable-voting/src/__test__/thegraph/disputableVoting.test.ts +++ b/packages/connect-disputable-voting/src/__test__/thegraph/disputableVoting.test.ts @@ -1,17 +1,12 @@ import { DisputableVotingData } from '../../types' import { DisputableVotingConnectorTheGraph } from '../../../src' - -const VOTING_APP_ADDRESS = '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' -const VOTING_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-dvoting-rinkeby-staging' +import { buildConnector, VOTING_APP_ADDRESS } from '../utils' describe('DisputableVoting', () => { let connector: DisputableVotingConnectorTheGraph - beforeAll(() => { - connector = new DisputableVotingConnectorTheGraph({ - subgraphUrl: VOTING_SUBGRAPH_URL, - }) + beforeAll(async () => { + connector = await buildConnector() }) afterAll(async () => { @@ -27,12 +22,8 @@ describe('DisputableVoting', () => { test('returns the disputable voting data', () => { expect(disputableVoting.id).toBe(VOTING_APP_ADDRESS) - expect(disputableVoting.dao).toBe( - '0x51a41e43af0774565f0be5cebc50c693cc19e4ee' - ) - expect(disputableVoting.token).toBe( - '0x9a8eab8a356b8af4fa6ea5be983539ce97a258fb' - ) + expect(disputableVoting.dao).toBe('0x51a41e43af0774565f0be5cebc50c693cc19e4ee') + expect(disputableVoting.token).toBe('0x9a8eab8a356b8af4fa6ea5be983539ce97a258fb') }) }) }) diff --git a/packages/connect-disputable-voting/src/__test__/thegraph/settings.test.ts b/packages/connect-disputable-voting/src/__test__/thegraph/settings.test.ts index f82915c1..d670c33c 100644 --- a/packages/connect-disputable-voting/src/__test__/thegraph/settings.test.ts +++ b/packages/connect-disputable-voting/src/__test__/thegraph/settings.test.ts @@ -1,16 +1,11 @@ +import { buildConnector, VOTING_APP_ADDRESS } from '../utils' import { DisputableVotingConnectorTheGraph, Setting } from '../../../src' -const VOTING_APP_ADDRESS = '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' -const VOTING_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-dvoting-rinkeby-staging' - describe('DisputableVoting settings', () => { let connector: DisputableVotingConnectorTheGraph - beforeAll(() => { - connector = new DisputableVotingConnectorTheGraph({ - subgraphUrl: VOTING_SUBGRAPH_URL, - }) + beforeAll(async () => { + connector = await buildConnector() }) afterAll(async () => { diff --git a/packages/connect-disputable-voting/src/__test__/thegraph/voters.test.ts b/packages/connect-disputable-voting/src/__test__/thegraph/voters.test.ts index ed455cfb..78c10916 100644 --- a/packages/connect-disputable-voting/src/__test__/thegraph/voters.test.ts +++ b/packages/connect-disputable-voting/src/__test__/thegraph/voters.test.ts @@ -1,17 +1,11 @@ +import { buildConnector, VOTING_APP_ADDRESS } from '../utils' import { DisputableVotingConnectorTheGraph, Voter } from '../../../src' -const VOTER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' -const VOTING_APP_ADDRESS = '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' -const VOTING_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-dvoting-rinkeby-staging' - describe('DisputableVoting voters', () => { let connector: DisputableVotingConnectorTheGraph - beforeAll(() => { - connector = new DisputableVotingConnectorTheGraph({ - subgraphUrl: VOTING_SUBGRAPH_URL, - }) + beforeAll(async () => { + connector = await buildConnector() }) afterAll(async () => { @@ -20,6 +14,7 @@ describe('DisputableVoting voters', () => { describe('voter', () => { let voter: Voter + const VOTER_ADDRESS = '0x0090aed150056316e37fe6dfa10dc63e79d173b6' beforeAll(async () => { voter = await connector.voter( diff --git a/packages/connect-disputable-voting/src/__test__/thegraph/votes.test.ts b/packages/connect-disputable-voting/src/__test__/thegraph/votes.test.ts index 210eb2e0..2d46deb7 100644 --- a/packages/connect-disputable-voting/src/__test__/thegraph/votes.test.ts +++ b/packages/connect-disputable-voting/src/__test__/thegraph/votes.test.ts @@ -1,16 +1,11 @@ +import { buildConnector, VOTING_APP_ADDRESS } from '../utils' import { DisputableVotingConnectorTheGraph, Vote, CastVote } from '../../../src' -const VOTING_APP_ADDRESS = '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' -const VOTING_SUBGRAPH_URL = - 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-dvoting-rinkeby-staging' - describe('DisputableVoting votes', () => { let connector: DisputableVotingConnectorTheGraph - beforeAll(() => { - connector = new DisputableVotingConnectorTheGraph({ - subgraphUrl: VOTING_SUBGRAPH_URL, - }) + beforeAll(async () => { + connector = await buildConnector() }) afterAll(async () => { @@ -48,12 +43,8 @@ describe('DisputableVoting votes', () => { expect(castVotes.length).toBeGreaterThan(0) const firstCastVote = castVotes[0] - expect(firstCastVote.id).toBe( - `${VOTING_APP_ADDRESS}-vote-0-cast-0x0090aed150056316e37fe6dfa10dc63e79d173b6` - ) - expect(firstCastVote.caster).toBe( - '0x0090aed150056316e37fe6dfa10dc63e79d173b6' - ) + expect(firstCastVote.id).toBe(`${VOTING_APP_ADDRESS}-vote-0-cast-0x0090aed150056316e37fe6dfa10dc63e79d173b6`) + expect(firstCastVote.caster).toBe('0x0090aed150056316e37fe6dfa10dc63e79d173b6') expect(firstCastVote.createdAt).toEqual('1598530298') expect(firstCastVote.stake).toBe('1000000000000000000') expect(firstCastVote.supports).toBe(true) diff --git a/packages/connect-disputable-voting/src/__test__/utils.ts b/packages/connect-disputable-voting/src/__test__/utils.ts new file mode 100644 index 00000000..75ae48c2 --- /dev/null +++ b/packages/connect-disputable-voting/src/__test__/utils.ts @@ -0,0 +1,28 @@ +import { connect } from '@aragon/connect' +import { DisputableVoting, DisputableVotingConnectorTheGraph } from '../../src' + +export const RINKEBY_NETWORK = 4 +export const ORGANIZATION_NAME = 'ancashdao.aragonid.eth' +export const VOTING_APP_ADDRESS = '0x0e835020497b2cd716369f8fc713fb7bd0a22dbf' +export const VOTING_SUBGRAPH_URL = 'https://api.thegraph.com/subgraphs/name/facuspagnuolo/aragon-dvoting-rinkeby-staging' + +export async function buildConnector( + organizationNameOrAddress: string = ORGANIZATION_NAME, + network: number = RINKEBY_NETWORK, + subgraphUrl: string = VOTING_SUBGRAPH_URL, +): Promise { + const organization = await connect(organizationNameOrAddress, 'thegraph', { network }) + return new DisputableVotingConnectorTheGraph({ subgraphUrl }, organization.connection.ethersProvider) +} + +export async function buildDisputableVoting( + organizationNameOrAddress: string = ORGANIZATION_NAME, + network: number = RINKEBY_NETWORK, + subgraphUrl: string = VOTING_SUBGRAPH_URL, + votingAppAddress: string = VOTING_APP_ADDRESS +): Promise { + const organization = await connect(organizationNameOrAddress, 'thegraph', { network }) + const connector = new DisputableVotingConnectorTheGraph({ subgraphUrl }, organization.connection.ethersProvider) + const app = await organization.connection.orgConnector.appByAddress(organization, votingAppAddress) + return new DisputableVoting(connector, app) +} diff --git a/packages/connect-disputable-voting/src/connect.ts b/packages/connect-disputable-voting/src/connect.ts index ee51e033..1c8f209d 100644 --- a/packages/connect-disputable-voting/src/connect.ts +++ b/packages/connect-disputable-voting/src/connect.ts @@ -30,8 +30,8 @@ export default createAppConnector( pollInterval, subgraphUrl, verbose, - }) + }, app.provider) - return new DisputableVoting(connectorTheGraph, app.address) + return new DisputableVoting(connectorTheGraph, app) } ) diff --git a/packages/connect-disputable-voting/src/helpers/numbers.ts b/packages/connect-disputable-voting/src/helpers/numbers.ts index 271df076..8cc726d6 100644 --- a/packages/connect-disputable-voting/src/helpers/numbers.ts +++ b/packages/connect-disputable-voting/src/helpers/numbers.ts @@ -29,5 +29,10 @@ export const formatBn = ( const roundedDecimals = Math.round( parseInt(decimals) / 10 ** (decimalsLength - formattedDecimals) ) - return `${integer}.${roundedDecimals}` + + const parsedRoundedDecimals = (roundedDecimals === 0) + ? '0'.repeat(formattedDecimals) + : roundedDecimals.toString() + + return `${integer}.${parsedRoundedDecimals}` } diff --git a/packages/connect-disputable-voting/src/models/ArbitratorFee.ts b/packages/connect-disputable-voting/src/models/ArbitratorFee.ts index 4169f9ce..bca5c599 100644 --- a/packages/connect-disputable-voting/src/models/ArbitratorFee.ts +++ b/packages/connect-disputable-voting/src/models/ArbitratorFee.ts @@ -11,6 +11,7 @@ export default class ArbitratorFee { readonly id: string readonly voteId: string readonly tokenId: string + readonly tokenSymbol: string readonly tokenDecimals: string readonly amount: string @@ -23,6 +24,7 @@ export default class ArbitratorFee { this.id = data.id this.voteId = data.voteId this.tokenId = data.tokenId + this.tokenSymbol = data.tokenSymbol this.tokenDecimals = data.tokenDecimals this.amount = data.amount } diff --git a/packages/connect-disputable-voting/src/models/CollateralRequirement.ts b/packages/connect-disputable-voting/src/models/CollateralRequirement.ts index 3ffab11d..5b474263 100644 --- a/packages/connect-disputable-voting/src/models/CollateralRequirement.ts +++ b/packages/connect-disputable-voting/src/models/CollateralRequirement.ts @@ -9,12 +9,14 @@ export default class CollateralRequirement { #connector: IDisputableVotingConnector readonly id: string - readonly voteId: string + readonly votingId: string readonly tokenId: string + readonly tokenSymbol: string readonly tokenDecimals: string readonly actionAmount: string readonly challengeAmount: string readonly challengeDuration: string + readonly collateralRequirementId: string constructor( data: CollateralRequirementData, @@ -23,12 +25,14 @@ export default class CollateralRequirement { this.#connector = connector this.id = data.id - this.voteId = data.voteId + this.votingId = data.votingId this.tokenId = data.tokenId + this.tokenSymbol = data.tokenSymbol this.tokenDecimals = data.tokenDecimals this.actionAmount = data.actionAmount this.challengeAmount = data.challengeAmount this.challengeDuration = data.challengeDuration + this.collateralRequirementId = data.collateralRequirementId } get formattedActionAmount(): string { diff --git a/packages/connect-disputable-voting/src/models/DisputableVoting.ts b/packages/connect-disputable-voting/src/models/DisputableVoting.ts index a2b9cbcb..ca1ae300 100644 --- a/packages/connect-disputable-voting/src/models/DisputableVoting.ts +++ b/packages/connect-disputable-voting/src/models/DisputableVoting.ts @@ -1,19 +1,25 @@ -import { subscription } from '@aragon/connect-core' +import { utils } from 'ethers' +import { subscription, App, ForwardingPath } from '@aragon/connect-core' import { Address, SubscriptionCallback, SubscriptionResult } from '@aragon/connect-types' import ERC20 from './ERC20' import Vote from './Vote' import Voter from './Voter' import Setting from './Setting' +import CollateralRequirement from './CollateralRequirement' import { IDisputableVotingConnector } from '../types' export default class DisputableVoting { - #address: Address + #app: App #connector: IDisputableVotingConnector - constructor(connector: IDisputableVotingConnector, address: Address) { + readonly address: string + + constructor(connector: IDisputableVotingConnector, app: App) { this.#connector = connector - this.#address = address + this.#app = app + + this.address = app.address } async disconnect() { @@ -21,33 +27,48 @@ export default class DisputableVoting { } async id(): Promise { - const data = await this.#connector.disputableVoting(this.#address) + const data = await this.#connector.disputableVoting(this.address) return data.id } async dao(): Promise { - const data = await this.#connector.disputableVoting(this.#address) + const data = await this.#connector.disputableVoting(this.address) return data.dao } + async agreement(): Promise { + const data = await this.#connector.disputableVoting(this.address) + return data.agreement + } + async token(): Promise { - const data = await this.#connector.disputableVoting(this.#address) + const data = await this.#connector.disputableVoting(this.address) return this.#connector.ERC20(data.token) } + async currentSettingId(): Promise { + const data = await this.#connector.disputableVoting(this.address) + return data.currentSettingId + } + + async currentCollateralRequirementId(): Promise { + const data = await this.#connector.disputableVoting(this.address) + return data.currentCollateralRequirementId + } + settingId(settingNumber: string): string { - return `${this.#address}-setting-${settingNumber}` + return `${this.address}-setting-${settingNumber}` } async currentSetting(): Promise { - return this.#connector.currentSetting(this.#address) + return this.#connector.currentSetting(this.address) } onCurrentSetting( callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onCurrentSetting(this.#address, callback) + this.#connector.onCurrentSetting(this.address, callback) ) } @@ -65,7 +86,7 @@ export default class DisputableVoting { } async settings({ first = 1000, skip = 0 } = {}): Promise { - return this.#connector.settings(this.#address, first, skip) + return this.#connector.settings(this.address, first, skip) } onSettings( @@ -73,7 +94,19 @@ export default class DisputableVoting { callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onSettings(this.#address, first, skip, callback) + this.#connector.onSettings(this.address, first, skip, callback) + ) + } + + async currentCollateralRequirement(): Promise { + return this.#connector.currentCollateralRequirement(this.address) + } + + onCurrentCollateralRequirement( + callback?: SubscriptionCallback + ): SubscriptionResult { + return subscription(callback, (callback) => + this.#connector.onCurrentCollateralRequirement(this.address, callback) ) } @@ -91,7 +124,7 @@ export default class DisputableVoting { } async votes({ first = 1000, skip = 0 } = {}): Promise { - return this.#connector.votes(this.#address, first, skip) + return this.#connector.votes(this.address, first, skip) } onVotes( @@ -99,12 +132,12 @@ export default class DisputableVoting { callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onVotes(this.#address, first, skip, callback) + this.#connector.onVotes(this.address, first, skip, callback) ) } voterId(voterAddress: Address): string { - return `${this.#address}-voterId-${voterAddress.toLowerCase()}` + return `${this.address}-voterId-${voterAddress.toLowerCase()}` } async voter(voterAddress: Address): Promise { @@ -119,4 +152,24 @@ export default class DisputableVoting { this.#connector.onVoter(this.voterId(voterAddress), callback) ) } + + async newVote(script: string, context: string, signerAddress: string): Promise { + const intent = await this.#app.intent('newVote', [script, utils.toUtf8Bytes(context)], { actAs: signerAddress }) + + // approve action collateral + const agreement = await this.agreement() + const { tokenId: collateralToken, actionAmount } = await this.currentCollateralRequirement() + const preTransactions = await intent.buildApprovePreTransactions({ address: collateralToken, value: actionAmount, spender: agreement }) + + intent.applyPreTransactions(preTransactions) + return intent + } + + async castVote(voteNumber: string, supports: boolean, signerAddress: string): Promise { + return this.#app.intent('vote', [voteNumber, supports], { actAs: signerAddress }) + } + + async executeVote(voteNumber: string, script: string, signerAddress: string): Promise { + return this.#app.intent('executeVote', [voteNumber, script], { actAs: signerAddress }) + } } diff --git a/packages/connect-disputable-voting/src/models/ERC20.ts b/packages/connect-disputable-voting/src/models/ERC20.ts index 15f30099..8a6cc159 100644 --- a/packages/connect-disputable-voting/src/models/ERC20.ts +++ b/packages/connect-disputable-voting/src/models/ERC20.ts @@ -1,15 +1,34 @@ +import { miniMeAbi } from '@aragon/connect-core' +import { BigNumber, Contract, providers as ethersProviders } from 'ethers' + import { ERC20Data } from '../types' export default class ERC20 { + #ethersProvider: ethersProviders.Provider + readonly id: string readonly name: string readonly symbol: string readonly decimals: string - constructor(data: ERC20Data) { + constructor(data: ERC20Data, ethersProvider: ethersProviders.Provider) { + this.#ethersProvider = ethersProvider + this.id = data.id this.name = data.name this.symbol = data.symbol this.decimals = data.decimals } + + async balance(address: string): Promise { + return this._contract().balanceOf(address) + } + + async balanceAt(address: string, block: string): Promise { + return this._contract().balanceOfAt(address, block) + } + + _contract(): Contract { + return new Contract(this.id, miniMeAbi, this.#ethersProvider) + } } diff --git a/packages/connect-disputable-voting/src/models/Vote.ts b/packages/connect-disputable-voting/src/models/Vote.ts index 2df32a0e..4e3a2243 100644 --- a/packages/connect-disputable-voting/src/models/Vote.ts +++ b/packages/connect-disputable-voting/src/models/Vote.ts @@ -1,10 +1,11 @@ import { subscription } from '@aragon/connect-core' +import { BigNumber, providers as ethersProviders } from 'ethers' import { Address, SubscriptionCallback, SubscriptionResult } from '@aragon/connect-types' +import ERC20 from './ERC20' import Setting from './Setting' import CastVote from './CastVote' import ArbitratorFee from './ArbitratorFee' -import DisputableVoting from './DisputableVoting' import CollateralRequirement from './CollateralRequirement' import { IDisputableVotingConnector, VoteData } from '../types' import { @@ -12,11 +13,11 @@ import { formatBn, PCT_BASE, PCT_DECIMALS, - toMilliseconds, currentTimestampEvm, } from '../helpers' export default class Vote { + #ethersProvider: ethersProviders.Provider #connector: IDisputableVotingConnector readonly id: string @@ -47,11 +48,19 @@ export default class Vote { readonly disputedAt: string readonly executedAt: string readonly isAccepted: boolean + readonly tokenId: string + readonly tokenSymbol: string readonly tokenDecimals: string + readonly settlementOffer: string | null + readonly collateralRequirementId: string + readonly collateralTokenId: string + readonly collateralTokenSymbol: string + readonly collateralTokenDecimals: string readonly submitterArbitratorFeeId: string readonly challengerArbitratorFeeId: string - constructor(data: VoteData, connector: IDisputableVotingConnector) { + constructor(data: VoteData, connector: IDisputableVotingConnector, ethersProvider: ethersProviders.Provider) { + this.#ethersProvider = ethersProvider this.#connector = connector this.id = data.id @@ -82,17 +91,23 @@ export default class Vote { this.disputedAt = data.disputedAt this.executedAt = data.executedAt this.isAccepted = data.isAccepted + this.tokenId = data.tokenId + this.tokenSymbol = data.tokenSymbol this.tokenDecimals = data.tokenDecimals + this.settlementOffer = data.settlementOffer + this.collateralRequirementId = data.collateralRequirementId + this.collateralTokenId = data.collateralTokenId + this.collateralTokenSymbol = data.collateralTokenSymbol + this.collateralTokenDecimals = data.collateralTokenDecimals this.submitterArbitratorFeeId = data.submitterArbitratorFeeId this.challengerArbitratorFeeId = data.challengerArbitratorFeeId } get hasEnded(): boolean { - return this.voteStatus === 'Cancelled' || this.voteStatus === 'Settled' || ( - this.voteStatus !== 'Challenged' && - this.voteStatus !== 'Disputed' && - Date.now() >= toMilliseconds(this.endDate) - ) + const currentTimestamp = currentTimestampEvm() + return this.voteStatus === 'Cancelled' || this.voteStatus === 'Settled' || + (this.voteStatus === 'Challenged' && currentTimestamp.gte(this.challengeEndDate)) || + (this.voteStatus !== 'Challenged' && this.voteStatus !== 'Disputed' && currentTimestamp.gte(this.endDate)) } get endDate(): string { @@ -110,6 +125,16 @@ export default class Vote { return lastComputedEndDate.add(bn(this.quietEndingExtension)).toString() } + get currentQuietEndingExtensionDuration(): string { + const actualEndDate = bn(this.endDate) + const baseVoteEndDate = bn(this.startDate).add(bn(this.duration)) + const endDateAfterPause = baseVoteEndDate.add(bn(this.pauseDuration)) + + // To know exactly how many extensions due to quiet ending we had, we subtract + // the base vote and pause durations to the actual vote end date + return actualEndDate.sub(endDateAfterPause).toString() + } + get yeasPct(): string { return this._votingPowerPct(this.yeas) } @@ -139,8 +164,12 @@ export default class Vote { } get status(): string { - if (this.hasEnded && this.voteStatus === 'Scheduled') { - return this.isAccepted ? 'Accepted' : 'Rejected' + if (this.hasEnded) { + if (this.voteStatus === 'Scheduled') { + return this.isAccepted ? 'Accepted' : 'Rejected' + } else if (this.voteStatus === 'Challenged') { + return 'Settled' + } } return this.voteStatus } @@ -158,6 +187,58 @@ export default class Vote { return wasAcceptedBeforeLastFlip != this.isAccepted } + async hasEndedExecutionDelay(): Promise { + const setting = await this.setting() + const currentTimestamp = currentTimestampEvm() + const executionDelayEndDate = bn(this.endDate).add(setting.executionDelay) + return currentTimestamp.gte(executionDelayEndDate) + } + + async canVote(voterAddress: Address): Promise { + return !this.hasEnded && + this.voteStatus === 'Scheduled' && + !(await this.hasVoted(voterAddress)) && + (await this.votingPower(voterAddress)).gt(bn(0)) + } + + async canExecute(): Promise { + return this.isAccepted && + this.voteStatus === 'Scheduled' && + (await this.hasEndedExecutionDelay()) + } + + async votingPower(voterAddress: Address): Promise { + const token = await this.token() + return token.balanceAt(voterAddress, this.snapshotBlock) + } + + async formattedVotingPower(voterAddress: Address): Promise { + const token = await this.token() + const balance = await token.balanceAt(voterAddress, this.snapshotBlock) + return formatBn(balance, token.decimals) + } + + async token(): Promise { + return this.#connector.ERC20(this.tokenId) + } + + async hasVoted(voterAddress: Address): Promise { + const castVote = await this.castVote(voterAddress) + return castVote !== null + } + + onHasVoted( + voterAddress: Address, + callback?: SubscriptionCallback + ): SubscriptionResult { + return subscription( + (error: Error | null, castVote: any) => { + callback?.(error, error ? undefined : (castVote !== null) as boolean) + }, + (callback) => this.#connector.onCastVote(this.castVoteId(voterAddress), callback) + ) + } + castVoteId(voterAddress: Address): string { return `${this.id}-cast-${voterAddress.toLowerCase()}` } @@ -189,14 +270,14 @@ export default class Vote { } async collateralRequirement(): Promise { - return this.#connector.collateralRequirement(this.id) + return this.#connector.collateralRequirement(this.collateralRequirementId) } onCollateralRequirement( callback?: SubscriptionCallback ): SubscriptionResult { return subscription(callback, (callback) => - this.#connector.onCollateralRequirement(this.id, callback) + this.#connector.onCollateralRequirement(this.collateralRequirementId, callback) ) } @@ -236,8 +317,12 @@ export default class Vote { ) } - _disputableVoting(): DisputableVoting { - return new DisputableVoting(this.#connector, this.votingId) + async formattedSettlementOffer(): Promise { + if (!this.settlementOffer) { + return null + } + + return formatBn(this.settlementOffer, this.collateralTokenDecimals) } _votingPowerPct(num: string): string { diff --git a/packages/connect-disputable-voting/src/thegraph/connector.ts b/packages/connect-disputable-voting/src/thegraph/connector.ts index cde40873..0a4ca37c 100644 --- a/packages/connect-disputable-voting/src/thegraph/connector.ts +++ b/packages/connect-disputable-voting/src/thegraph/connector.ts @@ -1,8 +1,6 @@ -import { - SubscriptionCallback, - SubscriptionHandler, -} from '@aragon/connect-types' +import { providers as ethersProviders } from 'ethers' import { GraphQLWrapper, QueryResult } from '@aragon/connect-thegraph' +import { SubscriptionCallback, SubscriptionHandler } from '@aragon/connect-types' import { DisputableVotingData, IDisputableVotingConnector } from '../types' import Vote from '../models/Vote' @@ -26,6 +24,7 @@ import { parseCastVotes, parseArbitratorFee, parseCollateralRequirement, + parseCurrentCollateralRequirement, } from './parsers' export function subgraphUrlFromChainId(chainId: number) { @@ -47,20 +46,23 @@ type DisputableVotingConnectorTheGraphConfig = { verbose?: boolean } -export default class DisputableVotingConnectorTheGraph - implements IDisputableVotingConnector { +export default class DisputableVotingConnectorTheGraph implements IDisputableVotingConnector { #gql: GraphQLWrapper + #ethersProvider: ethersProviders.Provider - constructor(config: DisputableVotingConnectorTheGraphConfig) { + constructor(config: DisputableVotingConnectorTheGraphConfig, provider: ethersProviders.Provider) { if (!config.subgraphUrl) { throw new Error( 'DisputableVotingConnectorTheGraph requires subgraphUrl to be passed.' ) } + this.#gql = new GraphQLWrapper(config.subgraphUrl, { pollInterval: config.pollInterval, verbose: config.verbose, }) + + this.#ethersProvider = provider } async disconnect() { @@ -155,11 +157,31 @@ export default class DisputableVotingConnectorTheGraph ) } + async currentCollateralRequirement(disputableVoting: string): Promise { + return this.#gql.performQueryWithParser( + queries.GET_CURRENT_COLLATERAL_REQUIREMENT('query'), + { disputableVoting }, + (result: QueryResult) => parseCurrentCollateralRequirement(result, this) + ) + } + + onCurrentCollateralRequirement( + disputableVoting: string, + callback: SubscriptionCallback + ): SubscriptionHandler { + return this.#gql.subscribeToQueryWithParser( + queries.GET_CURRENT_COLLATERAL_REQUIREMENT('subscription'), + { disputableVoting }, + callback, + (result: QueryResult) => parseCurrentCollateralRequirement(result, this) + ) + } + async vote(voteId: string): Promise { return this.#gql.performQueryWithParser( queries.GET_VOTE('query'), { voteId }, - (result: QueryResult) => parseVote(result, this) + (result: QueryResult) => parseVote(result, this, this.#ethersProvider) ) } @@ -171,7 +193,7 @@ export default class DisputableVotingConnectorTheGraph queries.GET_VOTE('subscription'), { voteId }, callback, - (result: QueryResult) => parseVote(result, this) + (result: QueryResult) => parseVote(result, this, this.#ethersProvider) ) } @@ -183,7 +205,7 @@ export default class DisputableVotingConnectorTheGraph return this.#gql.performQueryWithParser( queries.ALL_VOTES('query'), { disputableVoting, first, skip }, - (result: QueryResult) => parseVotes(result, this) + (result: QueryResult) => parseVotes(result, this, this.#ethersProvider) ) } @@ -197,7 +219,7 @@ export default class DisputableVotingConnectorTheGraph queries.ALL_VOTES('subscription'), { disputableVoting, first, skip }, callback, - (result: QueryResult) => parseVotes(result, this) + (result: QueryResult) => parseVotes(result, this, this.#ethersProvider) ) } @@ -267,21 +289,21 @@ export default class DisputableVotingConnectorTheGraph ) } - async collateralRequirement(voteId: string): Promise { + async collateralRequirement(collateralRequirementId: string): Promise { return this.#gql.performQueryWithParser( queries.GET_COLLATERAL_REQUIREMENT('query'), - { voteId }, + { collateralRequirementId }, (result: QueryResult) => parseCollateralRequirement(result, this) ) } onCollateralRequirement( - voteId: string, + collateralRequirementId: string, callback: SubscriptionCallback ): SubscriptionHandler { return this.#gql.subscribeToQueryWithParser( queries.GET_COLLATERAL_REQUIREMENT('subscription'), - { voteId }, + { collateralRequirementId }, callback, (result: QueryResult) => parseCollateralRequirement(result, this) ) @@ -311,7 +333,7 @@ export default class DisputableVotingConnectorTheGraph return this.#gql.performQueryWithParser( queries.GET_ERC20('query'), { tokenAddress }, - (result: QueryResult) => parseERC20(result) + (result: QueryResult) => parseERC20(result, this.#ethersProvider) ) } @@ -323,7 +345,7 @@ export default class DisputableVotingConnectorTheGraph queries.GET_ERC20('subscription'), { tokenAddress }, callback, - (result: QueryResult) => parseERC20(result) + (result: QueryResult) => parseERC20(result, this.#ethersProvider) ) } } diff --git a/packages/connect-disputable-voting/src/thegraph/parsers/arbitratorFees.ts b/packages/connect-disputable-voting/src/thegraph/parsers/arbitratorFees.ts index b240c3b8..ba1fde17 100644 --- a/packages/connect-disputable-voting/src/thegraph/parsers/arbitratorFees.ts +++ b/packages/connect-disputable-voting/src/thegraph/parsers/arbitratorFees.ts @@ -17,6 +17,7 @@ export function parseArbitratorFee( id: arbitratorFee.id, voteId: arbitratorFee.vote.id, tokenId: arbitratorFee.token.id, + tokenSymbol: arbitratorFee.token.symbol, tokenDecimals: arbitratorFee.token.decimals, amount: arbitratorFee.amount }, diff --git a/packages/connect-disputable-voting/src/thegraph/parsers/collateralRequirements.ts b/packages/connect-disputable-voting/src/thegraph/parsers/collateralRequirements.ts index 49a8c340..49ee1a8a 100644 --- a/packages/connect-disputable-voting/src/thegraph/parsers/collateralRequirements.ts +++ b/packages/connect-disputable-voting/src/thegraph/parsers/collateralRequirements.ts @@ -2,27 +2,54 @@ import { QueryResult } from '@aragon/connect-thegraph' import CollateralRequirement from '../../models/CollateralRequirement' +function buildCollateralRequirement(collateralRequirement: any, connector: any): CollateralRequirement { + const { + id, + voting, + token, + actionAmount, + challengeAmount, + challengeDuration, + collateralRequirementId + } = collateralRequirement + + const collateralRequirementData = { + id, + actionAmount, + challengeAmount, + challengeDuration, + collateralRequirementId, + votingId: voting.id, + tokenId: token.id, + tokenSymbol: token.symbol, + tokenDecimals: token.decimals, + } + + return new CollateralRequirement(collateralRequirementData, connector) +} + export function parseCollateralRequirement( result: QueryResult, connector: any ): CollateralRequirement { - const vote = result.data.vote + const collateralRequirement = result.data.collateralRequirement - if (!vote || !vote.collateralRequirement) { + if (!collateralRequirement) { throw new Error('Unable to parse collateral requirement.') } - const { collateralRequirement } = vote - return new CollateralRequirement( - { - id: collateralRequirement.id, - voteId: collateralRequirement.vote.id, - tokenId: collateralRequirement.token.id, - tokenDecimals: collateralRequirement.token.decimals, - actionAmount: collateralRequirement.actionAmount, - challengeAmount: collateralRequirement.challengeAmount, - challengeDuration: collateralRequirement.challengeDuration, - }, - connector - ) + return buildCollateralRequirement(collateralRequirement, connector) +} + +export function parseCurrentCollateralRequirement( + result: QueryResult, + connector: any +): CollateralRequirement { + const disputableVoting = result.data.disputableVoting + + if (!disputableVoting || !disputableVoting.collateralRequirement) { + throw new Error('Unable to parse current collateral requirement.') + } + + return buildCollateralRequirement(disputableVoting.collateralRequirement, connector) } diff --git a/packages/connect-disputable-voting/src/thegraph/parsers/disputableVoting.ts b/packages/connect-disputable-voting/src/thegraph/parsers/disputableVoting.ts index 15f28eb8..cfdf5eec 100644 --- a/packages/connect-disputable-voting/src/thegraph/parsers/disputableVoting.ts +++ b/packages/connect-disputable-voting/src/thegraph/parsers/disputableVoting.ts @@ -11,10 +11,14 @@ export function parseDisputableVoting( throw new Error('Unable to parse disputable voting.') } + const { id, dao, agreement, token, setting, collateralRequirement } = disputableVoting + return { - id: disputableVoting.id, - dao: disputableVoting.dao, - token: disputableVoting.token.id, - currentSettingId: disputableVoting.setting.id, + id, + dao, + agreement, + token: token.id, + currentSettingId: setting.id, + currentCollateralRequirementId: collateralRequirement.id, } } diff --git a/packages/connect-disputable-voting/src/thegraph/parsers/erc20s.ts b/packages/connect-disputable-voting/src/thegraph/parsers/erc20s.ts index 6ebb8334..f3f4f5f2 100644 --- a/packages/connect-disputable-voting/src/thegraph/parsers/erc20s.ts +++ b/packages/connect-disputable-voting/src/thegraph/parsers/erc20s.ts @@ -1,13 +1,14 @@ import { QueryResult } from '@aragon/connect-thegraph' +import { providers as ethersProviders } from 'ethers' import ERC20 from '../../models/ERC20' -export function parseERC20(result: QueryResult): ERC20 { +export function parseERC20(result: QueryResult, provider: ethersProviders.Provider): ERC20 { const erc20 = result.data.erc20 if (!erc20) { throw new Error('Unable to parse ERC20.') } - return new ERC20(erc20) + return new ERC20(erc20, provider) } diff --git a/packages/connect-disputable-voting/src/thegraph/parsers/index.ts b/packages/connect-disputable-voting/src/thegraph/parsers/index.ts index b6fb9ad7..a514dd66 100644 --- a/packages/connect-disputable-voting/src/thegraph/parsers/index.ts +++ b/packages/connect-disputable-voting/src/thegraph/parsers/index.ts @@ -3,6 +3,6 @@ export { parseERC20 } from './erc20s' export { parseVote, parseVotes } from './votes' export { parseArbitratorFee } from './arbitratorFees' export { parseDisputableVoting } from './disputableVoting' -export { parseCollateralRequirement } from './collateralRequirements' export { parseCastVote, parseCastVotes } from './castVotes' export { parseCurrentSetting, parseSetting, parseSettings } from './settings' +export { parseCollateralRequirement, parseCurrentCollateralRequirement } from './collateralRequirements' diff --git a/packages/connect-disputable-voting/src/thegraph/parsers/votes.ts b/packages/connect-disputable-voting/src/thegraph/parsers/votes.ts index a8be05e8..7554b5ce 100644 --- a/packages/connect-disputable-voting/src/thegraph/parsers/votes.ts +++ b/packages/connect-disputable-voting/src/thegraph/parsers/votes.ts @@ -3,7 +3,7 @@ import { QueryResult } from '@aragon/connect-thegraph' import Vote from '../../models/Vote' import { VoteData } from '../../types' -function buildVote(vote: any, connector: any): Vote { +function buildVote(vote: any, connector: any, provider: any): Vote { const { id, voting, @@ -31,6 +31,8 @@ function buildVote(vote: any, connector: any): Vote { disputedAt, executedAt, isAccepted, + settlementOffer, + collateralRequirement, submitterArbitratorFee, challengerArbitratorFee, } = vote @@ -64,30 +66,37 @@ function buildVote(vote: any, connector: any): Vote { disputedAt, executedAt, isAccepted, + tokenId: voting.token.id, + tokenSymbol: voting.token.symbol, tokenDecimals: voting.token.decimals, + settlementOffer, + collateralRequirementId: collateralRequirement.id, + collateralTokenId: collateralRequirement.token.id, + collateralTokenSymbol: collateralRequirement.token.symbol, + collateralTokenDecimals: collateralRequirement.token.decimals, submitterArbitratorFeeId: submitterArbitratorFee ? submitterArbitratorFee.id : null, challengerArbitratorFeeId: challengerArbitratorFee ? challengerArbitratorFee.id : null } - return new Vote(voteData, connector) + return new Vote(voteData, connector, provider) } -export function parseVote(result: QueryResult, connector: any): Vote { +export function parseVote(result: QueryResult, connector: any, provider: any): Vote { const vote = result.data.vote if (!vote) { throw new Error('Unable to parse vote.') } - return buildVote(vote, connector) + return buildVote(vote, connector, provider) } -export function parseVotes(result: QueryResult, connector: any): Vote[] { +export function parseVotes(result: QueryResult, connector: any, provider: any): Vote[] { const votes = result.data.votes if (!votes) { throw new Error('Unable to parse votes.') } - return votes.map((vote: any) => buildVote(vote, connector)) + return votes.map((vote: any) => buildVote(vote, connector, provider)) } diff --git a/packages/connect-disputable-voting/src/thegraph/queries/index.ts b/packages/connect-disputable-voting/src/thegraph/queries/index.ts index 44ea8588..255fdc2e 100644 --- a/packages/connect-disputable-voting/src/thegraph/queries/index.ts +++ b/packages/connect-disputable-voting/src/thegraph/queries/index.ts @@ -5,12 +5,16 @@ export const GET_DISPUTABLE_VOTING = (type: string) => gql` disputableVoting(id: $disputableVoting) { id dao + agreement token { id } setting { id } + collateralRequirement { + id + } } } ` @@ -37,6 +41,28 @@ export const GET_CURRENT_SETTING = (type: string) => gql` } ` +export const GET_CURRENT_COLLATERAL_REQUIREMENT = (type: string) => gql` + ${type} DisputableVoting($disputableVoting: String!) { + disputableVoting(id: $disputableVoting) { + collateralRequirement { + id + voting { + id + } + token { + id + symbol + decimals + } + actionAmount + challengeAmount + challengeDuration + collateralRequirementId + } + } + } +` + export const GET_SETTING = (type: string) => gql` ${type} Setting($settingId: String!) { setting(id: $settingId) { @@ -86,6 +112,8 @@ export const GET_VOTE = (type: string) => gql` voting { id token { + id + symbol decimals } } @@ -117,6 +145,15 @@ export const GET_VOTE = (type: string) => gql` disputedAt executedAt isAccepted + settlementOffer + collateralRequirement { + id + token { + id + symbol + decimals + } + } submitterArbitratorFee { id } @@ -136,6 +173,8 @@ export const ALL_VOTES = (type: string) => gql` voting { id token { + id + symbol decimals } } @@ -167,6 +206,15 @@ export const ALL_VOTES = (type: string) => gql` disputedAt executedAt isAccepted + settlementOffer + collateralRequirement { + id + token { + id + symbol + decimals + } + } submitterArbitratorFee { id } @@ -229,21 +277,21 @@ export const GET_VOTER = (type: string) => gql` ` export const GET_COLLATERAL_REQUIREMENT = (type: string) => gql` - ${type} CollateralRequirement($voteId: String!) { - vote(id: $voteId) { - collateralRequirement { + ${type} CollateralRequirement($collateralRequirementId: String!) { + collateralRequirement(id: $collateralRequirementId) { + id + voting { id - actionAmount - challengeAmount - challengeDuration - vote { - id - } - token { - id - decimals - } } + token { + id + symbol + decimals + } + actionAmount + challengeAmount + challengeDuration + collateralRequirementId } } ` @@ -258,6 +306,7 @@ export const GET_ARBITRATOR_FEE = (type: string) => gql` } token { id + symbol decimals } } diff --git a/packages/connect-disputable-voting/src/types.ts b/packages/connect-disputable-voting/src/types.ts index 0d658e84..dd340562 100644 --- a/packages/connect-disputable-voting/src/types.ts +++ b/packages/connect-disputable-voting/src/types.ts @@ -15,7 +15,9 @@ export interface DisputableVotingData { id: string dao: string token: string + agreement: string currentSettingId: string + currentCollateralRequirementId: string } export interface VoteData { @@ -46,8 +48,15 @@ export interface VoteData { settledAt: string disputedAt: string executedAt: string + tokenId: string + tokenSymbol: string tokenDecimals: string isAccepted: boolean + settlementOffer: string | null + collateralRequirementId: string + collateralTokenId: string + collateralTokenSymbol: string + collateralTokenDecimals: string submitterArbitratorFeeId: string challengerArbitratorFeeId: string } @@ -85,18 +94,21 @@ export interface SettingData { export interface CollateralRequirementData { id: string - voteId: string + votingId: string tokenId: string + tokenSymbol: string tokenDecimals: string actionAmount: string challengeAmount: string challengeDuration: string + collateralRequirementId: string } export interface ArbitratorFeeData { id: string voteId: string tokenId: string + tokenSymbol: string tokenDecimals: string amount: string } @@ -136,6 +148,11 @@ export interface IDisputableVotingConnector { skip: number, callback: SubscriptionCallback ): SubscriptionHandler + currentCollateralRequirement(disputableVoting: string): Promise + onCurrentCollateralRequirement( + disputableVoting: string, + callback: SubscriptionCallback + ): SubscriptionHandler vote(voteId: string): Promise onVote( voteId: string, @@ -165,9 +182,9 @@ export interface IDisputableVotingConnector { voterId: string, callback: SubscriptionCallback ): SubscriptionHandler - collateralRequirement(voteId: string): Promise + collateralRequirement(collateralRequirementId: string): Promise onCollateralRequirement( - voteId: string, + collateralRequirementId: string, callback: SubscriptionCallback ): SubscriptionHandler arbitratorFee(arbitratorFeeId: string): Promise diff --git a/packages/connect-disputable-voting/subgraph/manifest/data/rinkeby-staging.json b/packages/connect-disputable-voting/subgraph/manifest/data/rinkeby-staging.json index 141d96d3..94cc4dc5 100644 --- a/packages/connect-disputable-voting/subgraph/manifest/data/rinkeby-staging.json +++ b/packages/connect-disputable-voting/subgraph/manifest/data/rinkeby-staging.json @@ -4,8 +4,8 @@ "Organizations": [ { "name": "DisputableVoting", - "address": "0x51A41E43af0774565f0be5cEbC50C693CC19E4eE", - "startBlock": "7087818" + "address": "0xfa5bae0029f0c2acffcc71ada4249bd0eaafd1f4", + "startBlock": "7200827" } ], "OrganizationFactories": [], diff --git a/packages/connect-disputable-voting/subgraph/schema.graphql b/packages/connect-disputable-voting/subgraph/schema.graphql index 237dad3c..449906e3 100644 --- a/packages/connect-disputable-voting/subgraph/schema.graphql +++ b/packages/connect-disputable-voting/subgraph/schema.graphql @@ -17,7 +17,9 @@ type DisputableVoting @entity { id: ID! dao: Bytes! token: ERC20 + agreement: Bytes setting: Setting + collateralRequirement: CollateralRequirement votes: [Vote!] @derivedFrom(field: "voting") voters: [Voter!] @derivedFrom(field: "voting") } @@ -51,8 +53,9 @@ type Vote @entity { isAccepted: Boolean! submitterArbitratorFee: ArbitratorFee challengerArbitratorFee: ArbitratorFee + collateralRequirement: CollateralRequirement! + settlementOffer: BigInt castVotes: [CastVote!] @derivedFrom(field: "vote") - collateralRequirement: CollateralRequirement! @derivedFrom(field: "vote") } type CastVote @entity { @@ -89,7 +92,8 @@ type Setting @entity { type CollateralRequirement @entity { id: ID! - vote: Vote! + voting: DisputableVoting! + collateralRequirementId: BigInt! token: ERC20! actionAmount: BigInt! challengeAmount: BigInt! diff --git a/packages/connect-disputable-voting/subgraph/src/Agreement.ts b/packages/connect-disputable-voting/subgraph/src/Agreement.ts index 50dbfc8c..09bcc404 100644 --- a/packages/connect-disputable-voting/subgraph/src/Agreement.ts +++ b/packages/connect-disputable-voting/subgraph/src/Agreement.ts @@ -1,16 +1,40 @@ import { BigInt, Address } from '@graphprotocol/graph-ts' -import { buildVoteId, buildERC20, updateVoteState } from './DisputableVoting' -import { Vote as VoteEntity, ArbitratorFee as ArbitratorFeeEntity } from '../generated/schema' +import { buildVoteId, buildERC20, updateVoteState, loadOrCreateVoting } from './DisputableVoting' +import { + Vote as VoteEntity, + ArbitratorFee as ArbitratorFeeEntity, + CollateralRequirement as CollateralRequirementEntity +} from '../generated/schema' import { Agreement as AgreementContract, ActionClosed as ActionClosedEvent, ActionDisputed as ActionDisputedEvent, ActionSettled as ActionSettledEvent, - ActionChallenged as ActionChallengedEvent + ActionChallenged as ActionChallengedEvent, + CollateralRequirementChanged as CollateralRequirementChangedEvent } from '../generated/templates/Agreement/Agreement' /* eslint-disable @typescript-eslint/no-use-before-define */ +export function handleCollateralRequirementChanged(event: CollateralRequirementChangedEvent): void { + const voting = loadOrCreateVoting(event.params.disputable) + const agreementApp = AgreementContract.bind(event.address) + const requirementId = buildCollateralRequirementId(event.params.disputable, event.params.collateralRequirementId) + + const requirement = new CollateralRequirementEntity(requirementId) + const requirementData = agreementApp.getCollateralRequirement(event.params.disputable, event.params.collateralRequirementId) + requirement.token = buildERC20(requirementData.value0) + requirement.voting = event.params.disputable.toHexString() + requirement.challengeDuration = requirementData.value1 + requirement.actionAmount = requirementData.value2 + requirement.challengeAmount = requirementData.value3 + requirement.collateralRequirementId = event.params.collateralRequirementId + requirement.save() + + voting.collateralRequirement = requirementId + voting.save() +} + export function handleActionDisputed(event: ActionDisputedEvent): void { const agreementApp = AgreementContract.bind(event.address) const actionData = agreementApp.getAction(event.params.actionId) @@ -50,6 +74,7 @@ export function handleActionClosed(event: ActionClosedEvent): void { export function handleActionChallenged(event: ActionChallengedEvent): void { const agreementApp = AgreementContract.bind(event.address) const actionData = agreementApp.getAction(event.params.actionId) + const challengeData = agreementApp.getChallenge(event.params.challengeId) const voteId = buildVoteId(actionData.value0, actionData.value1) const challengerArbitratorFeeId = voteId + '-challenger' @@ -58,6 +83,7 @@ export function handleActionChallenged(event: ActionChallengedEvent): void { const vote = VoteEntity.load(voteId)! vote.challengerArbitratorFee = challengerArbitratorFeeId + vote.settlementOffer = challengeData.value4 vote.save() } @@ -68,3 +94,7 @@ function createArbitratorFee(voteId: string, id: string, feeToken: Address, feeA arbitratorFee.token = buildERC20(feeToken) arbitratorFee.save() } + +function buildCollateralRequirementId(disputable: Address, collateralRequirementId: BigInt): string { + return disputable.toHexString() + "-collateral-" + collateralRequirementId.toString() +} diff --git a/packages/connect-disputable-voting/subgraph/src/DisputableVoting.ts b/packages/connect-disputable-voting/subgraph/src/DisputableVoting.ts index fbf50250..7aa317ca 100644 --- a/packages/connect-disputable-voting/subgraph/src/DisputableVoting.ts +++ b/packages/connect-disputable-voting/subgraph/src/DisputableVoting.ts @@ -7,8 +7,7 @@ import { Vote as VoteEntity, CastVote as CastVoteEntity, Voter as VoterEntity, - ERC20 as ERC20Entity, - CollateralRequirement as CollateralRequirementEntity + ERC20 as ERC20Entity } from '../generated/schema' import { DisputableVoting as VotingContract, @@ -50,6 +49,7 @@ export function handleNewSetting(event: NewSettingEvent): void { export function handleStartVote(event: StartVoteEvent): void { const voteId = buildVoteId(event.address, event.params.voteId) + const voting = loadOrCreateVoting(event.address) const votingApp = VotingContract.bind(event.address) const vote = new VoteEntity(voteId) @@ -78,18 +78,8 @@ export function handleStartVote(event: StartVoteEvent): void { vote.disputedAt = BigInt.fromI32(0) vote.executedAt = BigInt.fromI32(0) vote.isAccepted = isAccepted(vote.yeas, vote.nays, vote.totalPower, vote.setting, votingApp.PCT_BASE()) + vote.collateralRequirement = voting.collateralRequirement vote.save() - - const agreementApp = AgreementContract.bind(votingApp.getAgreement()) - const actionData = agreementApp.getAction(vote.actionId) - const collateralRequirementData = agreementApp.getCollateralRequirement(event.address, actionData.value2) - const collateralRequirement = new CollateralRequirementEntity(voteId) - collateralRequirement.vote = voteId - collateralRequirement.token = buildERC20(collateralRequirementData.value0) - collateralRequirement.challengeDuration = collateralRequirementData.value1 - collateralRequirement.actionAmount = collateralRequirementData.value2 - collateralRequirement.challengeAmount = collateralRequirementData.value3 - collateralRequirement.save() } export function handleCastVote(event: CastVoteEvent): void { @@ -161,12 +151,13 @@ function hasReachedValuePct(value: BigInt, total: BigInt, pct: BigInt, pctBase: return total.notEqual(BigInt.fromI32(0)) && (value.times(pctBase).div(total)).gt(pct) } -function loadOrCreateVoting(votingAddress: Address): DisputableVotingEntity { +export function loadOrCreateVoting(votingAddress: Address): DisputableVotingEntity { let voting = DisputableVotingEntity.load(votingAddress.toHexString()) if (voting === null) { const votingApp = VotingContract.bind(votingAddress) voting = new DisputableVotingEntity(votingAddress.toHexString()) voting.dao = votingApp.kernel() + voting.agreement = votingApp.getAgreement() voting.token = buildERC20(votingApp.token()) } return voting! diff --git a/packages/connect-disputable-voting/subgraph/subgraph.template.yaml b/packages/connect-disputable-voting/subgraph/subgraph.template.yaml index ee89e95a..405e495f 100644 --- a/packages/connect-disputable-voting/subgraph/subgraph.template.yaml +++ b/packages/connect-disputable-voting/subgraph/subgraph.template.yaml @@ -84,4 +84,6 @@ templates: handler: handleActionChallenged - event: ActionClosed(indexed uint256) handler: handleActionClosed + - event: CollateralRequirementChanged(indexed address,uint256) + handler: handleCollateralRequirementChanged file: ./src/Agreement.ts diff --git a/packages/connect-ethereum/package.json b/packages/connect-ethereum/package.json index 2b7dda2d..98f6afc3 100644 --- a/packages/connect-ethereum/package.json +++ b/packages/connect-ethereum/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-ethereum", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -34,7 +34,7 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect-core": "^0.7.0" + "@aragon/connect-core": "^0.8.0-alpha.6" }, "description": "Access and interact with Aragon Organizations and their apps.", "keywords": [ diff --git a/packages/connect-finance/package.json b/packages/connect-finance/package.json index c91875e3..4846b874 100644 --- a/packages/connect-finance/package.json +++ b/packages/connect-finance/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-finance", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -34,8 +34,8 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0", + "@aragon/connect-core": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6", "graphql-tag": "^2.10.3" }, "description": "Access and interact with Aragon Organizations and their apps.", diff --git a/packages/connect-react/package.json b/packages/connect-react/package.json index d88e59ae..656aa03f 100644 --- a/packages/connect-react/package.json +++ b/packages/connect-react/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-react", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -35,7 +35,7 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect": "^0.7.0" + "@aragon/connect": "^0.8.0-alpha.6" }, "peerDependencies": { "react": "^16.13.1" diff --git a/packages/connect-thegraph/package.json b/packages/connect-thegraph/package.json index 642fc8df..4fdd8645 100644 --- a/packages/connect-thegraph/package.json +++ b/packages/connect-thegraph/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-thegraph", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -35,7 +35,7 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", + "@aragon/connect-core": "^0.8.0-alpha.6", "@urql/core": "^1.11.7", "graphql": "^15.0.0", "graphql-tag": "^2.10.3", diff --git a/packages/connect-thegraph/src/__test__/apps.test.ts b/packages/connect-thegraph/src/__test__/apps.test.ts index a70f6874..bb87a2e9 100644 --- a/packages/connect-thegraph/src/__test__/apps.test.ts +++ b/packages/connect-thegraph/src/__test__/apps.test.ts @@ -33,8 +33,8 @@ describe('when connecting to the mainnet subgraph', () => { }) test('should have a valid appName', () => { - expect(app.appName).toBeDefined() - expect(app.appName!.length).toBeGreaterThan(0) + expect(app.artifact.appName).toBeDefined() + expect(app.artifact.appName!.length).toBeGreaterThan(0) }) test('should have a valid artifact', () => { @@ -50,9 +50,9 @@ describe('when connecting to the mainnet subgraph', () => { expect(app.contentUri!.length).toBeGreaterThan(0) }) - test('should have valid intents', () => { - expect(app.intents).toBeDefined() - expect(app.intents!.length).toBeGreaterThan(0) + test('should have valid methods', () => { + expect(app.artifact.functions).toBeDefined() + expect(app.artifact.functions!.length).toBeGreaterThan(0) }) test('should have valid isForwarder', () => { expect(app.isForwarder).toBeDefined() diff --git a/packages/connect-thegraph/src/parsers/repos.ts b/packages/connect-thegraph/src/parsers/repos.ts index 258e54e6..68a12e49 100644 --- a/packages/connect-thegraph/src/parsers/repos.ts +++ b/packages/connect-thegraph/src/parsers/repos.ts @@ -25,6 +25,7 @@ export async function parseRepo( address: repo?.address, artifact: repo?.lastVersion?.artifact, contentUri: repo?.lastVersion?.contentUri, + lastVersion: repo?.lastVersion?.semanticVersion?.replace(/,/g, '.'), manifest: repo?.lastVersion?.manifest, name: repo?.name, registry: repo?.registry?.name, diff --git a/packages/connect-tokens/package.json b/packages/connect-tokens/package.json index d33b3a3b..2afa53ab 100644 --- a/packages/connect-tokens/package.json +++ b/packages/connect-tokens/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-tokens", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -34,8 +34,8 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0", + "@aragon/connect-core": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6", "graphql-tag": "^2.10.3" }, "description": "Access and interact with Aragon Organizations and their apps.", diff --git a/packages/connect-types/package.json b/packages/connect-types/package.json index 8783a089..1c024a38 100644 --- a/packages/connect-types/package.json +++ b/packages/connect-types/package.json @@ -1,7 +1,7 @@ { "name": "@aragon/connect-types", "private": true, - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", diff --git a/packages/connect-voting/package.json b/packages/connect-voting/package.json index 47ddc5e1..cc18fee1 100644 --- a/packages/connect-voting/package.json +++ b/packages/connect-voting/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect-voting", - "version": "0.7.1", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -34,8 +34,8 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0", + "@aragon/connect-core": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6", "graphql-tag": "^2.10.3" }, "description": "Access and interact with Aragon Organizations and their apps.", diff --git a/packages/connect-voting/subgraph/manifest/data/mainnet-staging.json b/packages/connect-voting/subgraph/manifest/data/mainnet-staging.json index 499c1f08..ae4371a5 100644 --- a/packages/connect-voting/subgraph/manifest/data/mainnet-staging.json +++ b/packages/connect-voting/subgraph/manifest/data/mainnet-staging.json @@ -3,9 +3,9 @@ "dataSources": { "Organizations": [ { - "name": "PieDAO", - "address": "0x0c188B183FF758500D1D18B432313d10e9F6b8a4", - "startBlock": "9593674" + "name": "decentraland", + "address": "0xf47917b108ca4b820ccea2587546fbb9f7564b56", + "startBlock": "9351139" } ], "OrganizationFactories": [], @@ -15,4 +15,3 @@ "Tokens": [] } } - diff --git a/packages/connect/package.json b/packages/connect/package.json index c027b751..cc9e2552 100644 --- a/packages/connect/package.json +++ b/packages/connect/package.json @@ -1,6 +1,6 @@ { "name": "@aragon/connect", - "version": "0.7.0", + "version": "0.8.0-alpha.6", "license": "LGPL-3.0-or-later", "main": "dist/cjs/index.js", "module": "dist/esm/index.js", @@ -34,9 +34,9 @@ "typescript": "^3.8.3" }, "dependencies": { - "@aragon/connect-core": "^0.7.0", - "@aragon/connect-ethereum": "^0.7.0", - "@aragon/connect-thegraph": "^0.7.0" + "@aragon/connect-core": "^0.8.0-alpha.6", + "@aragon/connect-ethereum": "^0.8.0-alpha.6", + "@aragon/connect-thegraph": "^0.8.0-alpha.6" }, "description": "Access and interact with Aragon Organizations and their apps.", "keywords": [ diff --git a/yarn.lock b/yarn.lock index b259879a..4a0004d2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,54 @@ # yarn lockfile v1 +"@aragon/connect-core@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@aragon/connect-core/-/connect-core-0.7.0.tgz#2464a1ce136fb1166d0de32fcada5a8c5da6e2dc" + integrity sha512-Edt42nVzuuQ1weVIVILIZts8k8//40AYzmikROH9WtWxGQyR41PPf3rLTkVtFnuekfVk/3qr1NSeRXuEJBXzXQ== + dependencies: + ethers "^5.0.7" + radspec "^2.0.0-rc.2" + +"@aragon/connect-thegraph@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@aragon/connect-thegraph/-/connect-thegraph-0.7.0.tgz#f4331d19ab78f33047b852adbd970efd6cd547b1" + integrity sha512-2s7uqMdoMEqr3M4r6tAoNAlOo3+yQRoRwxRy0i8r3mBhmo5kjU/jkfnLQO1SpS3HRHZrMZcc9Tkrj0zlijurDw== + dependencies: + "@aragon/connect-core" "^0.7.0" + "@urql/core" "^1.11.7" + graphql "^15.0.0" + graphql-tag "^2.10.3" + isomorphic-unfetch "^3.0.0" + isomorphic-ws "^4.0.1" + subscriptions-transport-ws "^0.9.16" + +"@aragon/connect-tokens@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@aragon/connect-tokens/-/connect-tokens-0.7.0.tgz#958832e4e396fc8dce5ec2f8117ad002003e39ea" + integrity sha512-UjyEEUyfgYLCrxGTbdRXSfBca5CflM4n7rULU+Dgi+qMoZKn1RbibRa0ZqtS23ccOJ6hT0I/mcRMzlX+wFAwqQ== + dependencies: + "@aragon/connect-core" "^0.7.0" + "@aragon/connect-thegraph" "^0.7.0" + graphql-tag "^2.10.3" + +"@aragon/connect-voting@^0.7.0": + version "0.7.0" + resolved "https://registry.yarnpkg.com/@aragon/connect-voting/-/connect-voting-0.7.0.tgz#3997716bffcadccea55227cfb4e400960e72f09a" + integrity sha512-TIPJJP4ZojIU0EEOFwHGwGbBgLXIL7BZU0AYRb93qbgsKknspzC5F3O35CCwwWqeoe2gnfBW8gf7zQX+7A2UYQ== + dependencies: + "@aragon/connect-core" "^0.7.0" + "@aragon/connect-thegraph" "^0.7.0" + graphql-tag "^2.10.3" + +"@aragon/provided-connector@^6.0.7": + version "6.0.8" + resolved "https://registry.yarnpkg.com/@aragon/provided-connector/-/provided-connector-6.0.8.tgz#5d22ccb2a0ff599fbe6c23fdf96cb06d59ff2716" + integrity sha512-O7dPXPPwOulkF5Nc04nTEBQPtDmySRPtZW0SYQlX0CwjSAntfdyLjFr6T3bNFFqLCBKfDoW6Hc02fN+rClQGIg== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-warning "^1.0.3" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.4.tgz#168da1a36e90da68ae8d49c0f1b48c7c6249213a" @@ -893,6 +941,16 @@ resolve "^1.8.1" semver "^5.5.1" +"@babel/plugin-transform-runtime@^7.5.5": + version "7.11.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.11.5.tgz#f108bc8e0cf33c37da031c097d1df470b3a293fc" + integrity sha512-9aIoee+EhjySZ6vY5hnLjigHzunBlscx9ANKutkeWTJTx6m5Rbq6Ic01tLvO54lSusR+BxV7u4UDdCmXv5aagg== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@babel/helper-plugin-utils" "^7.10.4" + resolve "^1.8.1" + semver "^5.5.1" + "@babel/plugin-transform-shorthand-properties@^7.10.4", "@babel/plugin-transform-shorthand-properties@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz#9fd25ec5cdd555bb7f473e5e6ee1c971eede4dd6" @@ -1147,6 +1205,13 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-transform-typescript" "^7.10.4" +"@babel/runtime@7.3.4": + version "7.3.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.3.4.tgz#73d12ba819e365fcf7fd152aed56d6df97d21c83" + integrity sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g== + dependencies: + regenerator-runtime "^0.12.0" + "@babel/runtime@7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.0.tgz#337eda67401f5b066a6f205a3113d4ac18ba495b" @@ -1223,6 +1288,11 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@chaitanyapotti/random-id@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@chaitanyapotti/random-id/-/random-id-1.0.3.tgz#f52f647cfe9f79fc7723ea2b01b0ad3889204002" + integrity sha512-xiVWA2vTL3jQeuZ+yebXAtwIeEbh/13RAFxvRq0YxeUc02RBOGyC9eyDKXjwlN0uxPtnEwWxsELkSwnaH5kxjg== + "@cnakazawa/watch@^1.0.3": version "1.0.4" resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a" @@ -1320,10 +1390,25 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== -"@ethersproject/abi@5.0.7", "@ethersproject/abi@^5.0.5": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.7.tgz#79e52452bd3ca2956d0e1c964207a58ad1a0ee7b" - integrity sha512-Cqktk+hSIckwP/W8O47Eef60VwmoSC/L3lY0+dIBhQPCNn9E4V7rwmm2aFrNRRDJfFlGuZ1khkQUOc3oBX+niw== +"@ethersproject/abi@5.0.0-beta.153": + version "5.0.0-beta.153" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.153.tgz#43a37172b33794e4562999f6e2d555b7599a8eee" + integrity sha512-aXweZ1Z7vMNzJdLpR1CZUAIgnwjrZeUSvN9syCwlBaEBUFJmFY+HHnfuTI5vIhVs/mRkfJVrbEyl51JZQqyjAg== + dependencies: + "@ethersproject/address" ">=5.0.0-beta.128" + "@ethersproject/bignumber" ">=5.0.0-beta.130" + "@ethersproject/bytes" ">=5.0.0-beta.129" + "@ethersproject/constants" ">=5.0.0-beta.128" + "@ethersproject/hash" ">=5.0.0-beta.128" + "@ethersproject/keccak256" ">=5.0.0-beta.127" + "@ethersproject/logger" ">=5.0.0-beta.129" + "@ethersproject/properties" ">=5.0.0-beta.131" + "@ethersproject/strings" ">=5.0.0-beta.130" + +"@ethersproject/abi@5.0.9", "@ethersproject/abi@^5.0.5": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.9.tgz#738c1c557e56d8f395a5a27caef9b0449bc85a10" + integrity sha512-ily2OufA2DTrxkiHQw5GqbkMSnNKuwZBqKsajtT0ERhZy1r9w2CpW1bmtRMIGzaqQxCdn/GEoFogexk72cBBZQ== dependencies: "@ethersproject/address" "^5.0.4" "@ethersproject/bignumber" "^5.0.7" @@ -1350,10 +1435,10 @@ "@ethersproject/properties" "^5.0.0" "@ethersproject/strings" "^5.0.0" -"@ethersproject/abstract-provider@5.0.5", "@ethersproject/abstract-provider@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz#797a32a8707830af1ad8f833e9c228994d5572b9" - integrity sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ== +"@ethersproject/abstract-provider@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.7.tgz#04ee3bfe43323384e7fecf6c774975b8dec4bdc9" + integrity sha512-NF16JGn6M0zZP5ZS8KtDL2Rh7yHxZbUjBIHLNHMm/0X0BephhjUWy8jqs/Zks6kDJRzNthgmPVy41Ec0RYWPYA== dependencies: "@ethersproject/bignumber" "^5.0.7" "@ethersproject/bytes" "^5.0.4" @@ -1376,10 +1461,23 @@ "@ethersproject/transactions" "^5.0.0" "@ethersproject/web" "^5.0.0" -"@ethersproject/abstract-signer@5.0.6", "@ethersproject/abstract-signer@^5.0.4": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.6.tgz#c01211665ab9c9e93988c4783b789712fd93a388" - integrity sha512-h8TZBX3pL2Xx9tmsRxfWcaaI+FcJFHWvZ/vNvFjLp8zJ0kPD501LKTt2jo44LZ20N3EW68JMoyEmRQ6bpsn+iA== +"@ethersproject/abstract-provider@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.0.5.tgz#797a32a8707830af1ad8f833e9c228994d5572b9" + integrity sha512-i/CjElAkzV7vQBAeoz+IpjGfcFYEP9eD7j3fzZ0fzTq03DO7PPnR+xkEZ1IoDXGwDS+55aLM1xvLDwB/Lx6IOQ== + dependencies: + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/networks" "^5.0.3" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/transactions" "^5.0.5" + "@ethersproject/web" "^5.0.6" + +"@ethersproject/abstract-signer@5.0.9", "@ethersproject/abstract-signer@^5.0.6": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.9.tgz#238ddc06031aeb9dfceee2add965292d7dd1acbf" + integrity sha512-CM5UNmXQaA03MyYARFDDRjHWBxujO41tVle7glf5kHcQsDDULgqSVpkliLJMtPzZjOKFeCVZBHybTZDEZg5zzg== dependencies: "@ethersproject/abstract-provider" "^5.0.4" "@ethersproject/bignumber" "^5.0.7" @@ -1398,10 +1496,32 @@ "@ethersproject/logger" "^5.0.0" "@ethersproject/properties" "^5.0.0" -"@ethersproject/address@5.0.5", "@ethersproject/address@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.5.tgz#2caa65f6b7125015395b1b54c985ee0b27059cc7" - integrity sha512-DpkQ6rwk9jTefrRsJzEm6nhRiJd9pvhn1xN0rw5N/jswXG5r7BLk/GVA0mMAVWAsYfvi2xSc5L41FMox43RYEA== +"@ethersproject/abstract-signer@^5.0.4": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.0.6.tgz#c01211665ab9c9e93988c4783b789712fd93a388" + integrity sha512-h8TZBX3pL2Xx9tmsRxfWcaaI+FcJFHWvZ/vNvFjLp8zJ0kPD501LKTt2jo44LZ20N3EW68JMoyEmRQ6bpsn+iA== + dependencies: + "@ethersproject/abstract-provider" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + +"@ethersproject/address@5.0.8", "@ethersproject/address@^5.0.5": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.8.tgz#0c551659144a5a7643c6bea337149d410825298f" + integrity sha512-V87DHiZMZR6hmFYmoGaHex0D53UEbZpW75uj8AqPbjYUmi65RB4N2LPRcJXuWuN2R0Y2CxkvW6ArijWychr5FA== + dependencies: + "@ethersproject/bignumber" "^5.0.10" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/rlp" "^5.0.3" + +"@ethersproject/address@>=5.0.0-beta.128", "@ethersproject/address@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.0.4.tgz#8669bcbd02f4b64f4cede0a10e84df6d964ec9d3" + integrity sha512-CIjAeG6zNehbpJTi0sgwUvaH2ZICiAV9XkCBaFy5tjuEVFpQNeqd6f+B7RowcNO7Eut+QbhcQ5CVLkmP5zhL9A== dependencies: "@ethersproject/bignumber" "^5.0.7" "@ethersproject/bytes" "^5.0.4" @@ -1422,10 +1542,10 @@ "@ethersproject/rlp" "^5.0.0" bn.js "^4.4.0" -"@ethersproject/base64@5.0.4", "@ethersproject/base64@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.4.tgz#b0d8fdbf3dda977cf546dcd35725a7b1d5256caa" - integrity sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA== +"@ethersproject/base64@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.6.tgz#26311ebf29ea3d0b9c300ccf3e1fdc44b7481516" + integrity sha512-HwrGn8YMiUf7bcdVvB4NJ+eWT0BtEFpDtrYxVXEbR7p/XBSJjwiR7DEggIiRvxbualMKg+EZijQWJ3az2li0uw== dependencies: "@ethersproject/bytes" "^5.0.4" @@ -1436,10 +1556,17 @@ dependencies: "@ethersproject/bytes" "^5.0.0" -"@ethersproject/basex@5.0.4", "@ethersproject/basex@^5.0.3": +"@ethersproject/base64@^5.0.3": version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.4.tgz#93e1cd11f9a47281da2389de24f88e13e9d90847" - integrity sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew== + resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.0.4.tgz#b0d8fdbf3dda977cf546dcd35725a7b1d5256caa" + integrity sha512-4KRykQ7BQMeOXfvio1YITwHjxwBzh92UoXIdzxDE1p53CK28bbHPdsPNYo0wl0El7lJAMpT2SOdL0hhbWRnyIA== + dependencies: + "@ethersproject/bytes" "^5.0.4" + +"@ethersproject/basex@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.6.tgz#ab95c32e48288a3d868726463506641cb1e9fb6b" + integrity sha512-Y/8dowRxBF3bsKkqEp7XN4kcFFQ0o5xxP1YyopfqkXejaOEGiD7ToQdQ0pIZpAJ5GreW56oFOTDDSO6ZcUCNYg== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/properties" "^5.0.3" @@ -1452,10 +1579,27 @@ "@ethersproject/bytes" "^5.0.0" "@ethersproject/properties" "^5.0.0" -"@ethersproject/bignumber@5.0.8", "@ethersproject/bignumber@^5.0.7": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.8.tgz#cee33bd8eb0266176def0d371b45274b1d2c4ec0" - integrity sha512-KXFVAFKS1jdTXYN8BE5Oj+ZfPMh28iRdFeNGBVT6cUFdtiPVqeXqc0ggvBqA3A1VoFFGgM7oAeaagA393aORHA== +"@ethersproject/basex@^5.0.3": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.0.4.tgz#93e1cd11f9a47281da2389de24f88e13e9d90847" + integrity sha512-ixIr/kKiAoSzOnSc777AGIOAhKai5Ivqr4HO/Gz+YG+xkfv6kqD6AW4ga9vM20Wwb0QBhh3LoRWTu4V1K+x9Ew== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/properties" "^5.0.3" + +"@ethersproject/bignumber@5.0.12", "@ethersproject/bignumber@^5.0.10", "@ethersproject/bignumber@^5.0.8": + version "5.0.12" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.12.tgz#fe4a78667d7cb01790f75131147e82d6ea7e7cba" + integrity sha512-mbFZjwthx6vFlHG9owXP/C5QkNvsA+xHpDCkPPPdG2n1dS9AmZAL5DI0InNLid60rQWL3MXpEl19tFmtL7Q9jw== + dependencies: + "@ethersproject/bytes" "^5.0.8" + "@ethersproject/logger" "^5.0.5" + bn.js "^4.4.0" + +"@ethersproject/bignumber@>=5.0.0-beta.130", "@ethersproject/bignumber@^5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.0.7.tgz#720b3e3df3e125a99669ee869478106d0afe7b76" + integrity sha512-wwKgDJ+KA7IpgJwc8Fc0AjKIRuDskKA2cque29/+SgII9/1K/38JpqVNPKIovkLwTC2DDofIyzHcxeaKpMFouQ== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" @@ -1470,10 +1614,17 @@ "@ethersproject/logger" "^5.0.0" bn.js "^4.4.0" -"@ethersproject/bytes@5.0.5", "@ethersproject/bytes@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.5.tgz#688b70000e550de0c97a151a21f15b87d7f97d7c" - integrity sha512-IEj9HpZB+ACS6cZ+QQMTqmu/cnUK2fYNE6ms/PVxjoBjoxc6HCraLpam1KuRvreMy0i523PLmjN8OYeikRdcUQ== +"@ethersproject/bytes@5.0.8", "@ethersproject/bytes@^5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.8.tgz#cf1246a6a386086e590063a4602b1ffb6cc43db1" + integrity sha512-O+sJNVGzzuy51g+EMK8BegomqNIg+C2RO6vOt0XP6ac4o4saiq69FnjlsrNslaiMFVO7qcEHBsWJ9hx1tj1lMw== + dependencies: + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/bytes@>=5.0.0-beta.129", "@ethersproject/bytes@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.0.4.tgz#328d9d929a3e970964ecf5d62e12568a187189f1" + integrity sha512-9R6A6l9JN8x1U4s1dJCR+9h3MZTT3xQofr/Xx8wbDvj6NnY4CbBB0o8ZgHXvR74yV90pY2EzCekpkMBJnRzkSw== dependencies: "@ethersproject/logger" "^5.0.5" @@ -1484,10 +1635,17 @@ dependencies: "@ethersproject/logger" "^5.0.0" -"@ethersproject/constants@5.0.5", "@ethersproject/constants@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.5.tgz#0ed19b002e8404bdf6d135234dc86a7d9bcf9b71" - integrity sha512-foaQVmxp2+ik9FrLUCtVrLZCj4M3Ibgkqvh+Xw/vFRSerkjVSYePApaVE5essxhoSlF1U9oXfWY09QI2AXtgKA== +"@ethersproject/constants@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.7.tgz#44ff979e5781b17c8c6901266896c3ee745f4e7e" + integrity sha512-cbQK1UpE4hamB52Eg6DLhJoXeQ1plSzekh5Ujir1xdREdwdsZPPXKczkrWqBBR0KyywJZHN/o/hj0w8j7scSGg== + dependencies: + "@ethersproject/bignumber" "^5.0.7" + +"@ethersproject/constants@>=5.0.0-beta.128", "@ethersproject/constants@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.0.4.tgz#9ddaa5f3c738a94e5adc4b3f71b36206fa5cdf88" + integrity sha512-Df32lcXDHPgZRPgp1dgmByNbNe4Ki1QoXR+wU61on5nggQGTqWR1Bb7pp9VtI5Go9kyE/JflFc4Te6o9MvYt8A== dependencies: "@ethersproject/bignumber" "^5.0.7" @@ -1498,10 +1656,10 @@ dependencies: "@ethersproject/bignumber" "^5.0.0" -"@ethersproject/contracts@5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.5.tgz#64831a341ec8ca225e83ff3e9437c26b970fd5d7" - integrity sha512-tFI255lFbmbqMkgnuyhDWHl3yWqttPlReplYuVvDCT/SuvBjLR4ad2uipBlh1fh5X1ipK9ettAoV4S0HKim4Kw== +"@ethersproject/contracts@5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.0.8.tgz#71d3ba16853a1555be2e161a6741df186f81c73b" + integrity sha512-PecBL4vnsrpuks2lzzkRsOts8csJy338HNDKDIivbFmx92BVzh3ohOOv3XsoYPSXIHQvobF959W+aSk3RCZL/g== dependencies: "@ethersproject/abi" "^5.0.5" "@ethersproject/abstract-provider" "^5.0.4" @@ -1528,10 +1686,24 @@ "@ethersproject/logger" "^5.0.0" "@ethersproject/properties" "^5.0.0" -"@ethersproject/hash@5.0.5", "@ethersproject/hash@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.5.tgz#e383ba2c7941834266fa6e2cf543d2b0c50a9d59" - integrity sha512-GpI80/h2HDpfNKpCZoxQJCjOQloGnlD5hM1G+tZe8FQDJhEvFjJoPDuWv+NaYjJfOciKS2Axqc4Q4WamdLoUgg== +"@ethersproject/hash@5.0.9", "@ethersproject/hash@^5.0.4": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.9.tgz#81252a848185b584aa600db4a1a68cad9229a4d4" + integrity sha512-e8/i2ZDeGSgCxXT0vocL54+pMbw5oX5fNjb2E3bAIvdkh5kH29M7zz1jHu1QDZnptIuvCZepIbhUH8lxKE2/SQ== + dependencies: + "@ethersproject/abstract-signer" "^5.0.6" + "@ethersproject/address" "^5.0.5" + "@ethersproject/bignumber" "^5.0.8" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.4" + "@ethersproject/strings" "^5.0.4" + +"@ethersproject/hash@>=5.0.0-beta.128": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.0.4.tgz#385642786405d236f3d2f1acdfaf250ab519cdac" + integrity sha512-VCs/bFBU8AQFhHcT1cQH6x7a4zjulR6fJmAOcPxUgrN7bxOQ7QkpBKF+YCDJhFtkLdaljIsr/r831TuWU4Ysfg== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/keccak256" "^5.0.3" @@ -1548,10 +1720,10 @@ "@ethersproject/logger" "^5.0.0" "@ethersproject/strings" "^5.0.0" -"@ethersproject/hdnode@5.0.5", "@ethersproject/hdnode@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.5.tgz#1f89aad0a5ba9dfae3a85a36e0669f8bc7a74781" - integrity sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ== +"@ethersproject/hdnode@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.7.tgz#c7bce94a337ea65e37c46bab09a83e1c1a555d99" + integrity sha512-89tphqlji4y/LNE1cSaMQ3hrBtJ4lO1qWGi2hn54LiHym85DTw+zAKbA8QgmdSdJDLGR/kc9VHaIPQ+vZQ2LkQ== dependencies: "@ethersproject/abstract-signer" "^5.0.4" "@ethersproject/basex" "^5.0.3" @@ -1584,10 +1756,28 @@ "@ethersproject/transactions" "^5.0.0" "@ethersproject/wordlists" "^5.0.0" -"@ethersproject/json-wallets@5.0.7", "@ethersproject/json-wallets@^5.0.6": - version "5.0.7" - resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz#4c48753b38ce7bce23a55f25c23f24617cf560e5" - integrity sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ== +"@ethersproject/hdnode@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.0.5.tgz#1f89aad0a5ba9dfae3a85a36e0669f8bc7a74781" + integrity sha512-Ho4HZaK+KijE5adayvjAGusWMnT0mgwGa5hGMBofBOgX9nqiKf6Wxx68SXBGI1/L3rmKo6mlAjxUd8gefs0teQ== + dependencies: + "@ethersproject/abstract-signer" "^5.0.4" + "@ethersproject/basex" "^5.0.3" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/pbkdf2" "^5.0.3" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/sha2" "^5.0.3" + "@ethersproject/signing-key" "^5.0.4" + "@ethersproject/strings" "^5.0.4" + "@ethersproject/transactions" "^5.0.5" + "@ethersproject/wordlists" "^5.0.4" + +"@ethersproject/json-wallets@5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.9.tgz#2e1708c2854c4ab764e35920bd1f44c948b95434" + integrity sha512-EWuFvJd8nu90dkmJwmJddxOYCvFvMkKBsZi8rxTme2XEZsHKOFnybVkoL23u7ZtApuEfTKmVcR2PTwgZwqDsKw== dependencies: "@ethersproject/abstract-signer" "^5.0.4" "@ethersproject/address" "^5.0.4" @@ -1622,10 +1812,37 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/keccak256@5.0.4", "@ethersproject/keccak256@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.4.tgz#36ca0a7d1ae2a272da5654cb886776d0c680ef3a" - integrity sha512-GNpiOUm9PGUxFNqOxYKDQBM0u68bG9XC9iOulEQ8I0tOx/4qUpgVzvgXL6ugxr0RY554Gz/NQsVqknqPzUcxpQ== +"@ethersproject/json-wallets@^5.0.6": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.0.7.tgz#4c48753b38ce7bce23a55f25c23f24617cf560e5" + integrity sha512-dgOn9JtGgjT28mDXs4LYY2rT4CzS6bG/rxoYuPq3TLHIf6nmvBcr33Fee6RrM/y8UAx4gyIkf6wb2cXsOctvQQ== + dependencies: + "@ethersproject/abstract-signer" "^5.0.4" + "@ethersproject/address" "^5.0.4" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/hdnode" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/pbkdf2" "^5.0.3" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/random" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + "@ethersproject/transactions" "^5.0.5" + aes-js "3.0.0" + scrypt-js "3.0.1" + +"@ethersproject/keccak256@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.6.tgz#5b5ba715ef1be86efde5c271f896fa0daf0e1efe" + integrity sha512-eJ4Id/i2rwrf5JXEA7a12bG1phuxjj47mPZgDUbttuNBodhSuZF2nEO5QdpaRjmlphQ8Kt9PNqY/z7lhtJptZg== + dependencies: + "@ethersproject/bytes" "^5.0.4" + js-sha3 "0.5.7" + +"@ethersproject/keccak256@>=5.0.0-beta.127", "@ethersproject/keccak256@^5.0.0-beta.130", "@ethersproject/keccak256@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.0.3.tgz#f094a8fca3bb913c044593c4f382be424292e588" + integrity sha512-VhW3mgZMBZlETV6AyOmjNeNG+Pg68igiKkPpat8/FZl0CKnfgQ+KZQZ/ee1vT+X0IUM8/djqnei6btmtbA27Ug== dependencies: "@ethersproject/bytes" "^5.0.4" js-sha3 "0.5.7" @@ -1638,20 +1855,25 @@ "@ethersproject/bytes" "^5.0.0" js-sha3 "0.5.7" -"@ethersproject/logger@5.0.6", "@ethersproject/logger@^5.0.5": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.6.tgz#faa484203e86e08be9e07fef826afeef7183fe88" - integrity sha512-FrX0Vnb3JZ1md/7GIZfmJ06XOAA8r3q9Uqt9O5orr4ZiksnbpXKlyDzQtlZ5Yv18RS8CAUbiKH9vwidJg1BPmQ== +"@ethersproject/logger@5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.8.tgz#135c1903d35c878265f3cbf2b287042c4c20d5d4" + integrity sha512-SkJCTaVTnaZ3/ieLF5pVftxGEFX56pTH+f2Slrpv7cU0TNpUZNib84QQdukd++sWUp/S7j5t5NW+WegbXd4U/A== + +"@ethersproject/logger@>=5.0.0-beta.129", "@ethersproject/logger@^5.0.5": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.5.tgz#e3ba3d0bcf9f5be4da5f043b1e328eb98b80002f" + integrity sha512-gJj72WGzQhUtCk6kfvI8elTaPOQyMvrMghp/nbz0ivTo39fZ7IjypFh/ySDeUSdBNplAwhzWKKejQhdpyefg/w== "@ethersproject/logger@^5.0.0": version "5.0.4" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.0.4.tgz#09fa4765b5691233e3afb6617cb38a700f9dd2e4" integrity sha512-alA2LiAy1LdQ/L1SA9ajUC7MvGAEQLsICEfKK4erX5qhkXE1LwLSPIzobtOWFsMHf2yrXGKBLnnpuVHprI3sAw== -"@ethersproject/networks@5.0.4", "@ethersproject/networks@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.4.tgz#6d320a5e15a0cda804f5da88be0ba846156f6eec" - integrity sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw== +"@ethersproject/networks@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.6.tgz#4d6586bbebfde1c027504ebf6dfb783b29c3803a" + integrity sha512-2Cg1N5109zzFOBfkyuPj+FfF7ioqAsRffmybJ2lrsiB5skphIAE72XNSCs4fqktlf+rwSh/5o/UXRjXxvSktZw== dependencies: "@ethersproject/logger" "^5.0.5" @@ -1662,10 +1884,17 @@ dependencies: "@ethersproject/logger" "^5.0.0" -"@ethersproject/pbkdf2@5.0.4", "@ethersproject/pbkdf2@^5.0.3": +"@ethersproject/networks@^5.0.3": version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz#a0841d53f5ce9a2b52a65a349d2dc15910b0a767" - integrity sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg== + resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.0.4.tgz#6d320a5e15a0cda804f5da88be0ba846156f6eec" + integrity sha512-/wHDTRms5mpJ09BoDrbNdFWINzONe05wZRgohCXvEv39rrH/Gd/yAnct8wC0RsW3tmFOgjgQxuBvypIxuUynTw== + dependencies: + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/pbkdf2@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.6.tgz#105dbfb08cd5fcf33869b42bfdc35a3ebd978cbd" + integrity sha512-CUYciSxR/AaCoKMJk3WUW+BDhR41G3C+O9lOeZ4bR1wDhLKL2Z8p0ciF5XDEiVbmI4CToW6boVKybeVMdngRrg== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/sha2" "^5.0.3" @@ -1678,10 +1907,25 @@ "@ethersproject/bytes" "^5.0.0" "@ethersproject/sha2" "^5.0.0" -"@ethersproject/properties@5.0.4", "@ethersproject/properties@^5.0.3": +"@ethersproject/pbkdf2@^5.0.3": version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.4.tgz#a67a1f5a52c30850b5062c861631e73d131f666e" - integrity sha512-UdyX3GqBxFt15B0uSESdDNmhvEbK3ACdDXl2soshoPcneXuTswHDeA0LoPlnaZzhbgk4p6jqb4GMms5C26Qu6A== + resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.0.4.tgz#a0841d53f5ce9a2b52a65a349d2dc15910b0a767" + integrity sha512-9jVBjHXQKfr9+3bkCg01a8Cd1H9e+7Kw3ZMIvAxD0lZtuzrXsJxm1hVwY9KA+PRUvgS/9tTP4viXQYwLAax7zg== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/sha2" "^5.0.3" + +"@ethersproject/properties@5.0.6", "@ethersproject/properties@^5.0.4": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.6.tgz#44d82aaa294816fd63333e7def42426cf0e87b3b" + integrity sha512-a9DUMizYhJ0TbtuDkO9iYlb2CDlpSKqGPDr+amvlZhRspQ6jbl5Eq8jfu4SCcGlcfaTbguJmqGnyOGn1EFt6xA== + dependencies: + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/properties@>=5.0.0-beta.131", "@ethersproject/properties@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.0.3.tgz#991aef39a5f87d4645cee76cec4df868bfb08be6" + integrity sha512-wLCSrbywkQgTO6tIF9ZdKsH9AIxPEqAJF/z5xcPkz1DK4mMAZgAXRNw1MrKYhyb+7CqNHbj3vxenNKFavGY/IA== dependencies: "@ethersproject/logger" "^5.0.5" @@ -1692,10 +1936,10 @@ dependencies: "@ethersproject/logger" "^5.0.0" -"@ethersproject/providers@5.0.11": - version "5.0.11" - resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.11.tgz#55488881452624a59b38436f81d74948d93783f9" - integrity sha512-SD82AMgUpDgqvSPJxjVgSqMBde9LsIAfroS3YcK2dE/VUuVeJQFWtjFbkFRF4pjTd2u+qYXh0eo1gq7LU7B1YQ== +"@ethersproject/providers@5.0.17": + version "5.0.17" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.0.17.tgz#f380e7831149e24e7a1c6c9b5fb1d6dfc729d024" + integrity sha512-bJnvs5X7ttU5x2ekGJYG7R3Z+spZawLFfR0IDsbaMDLiCwZOyrgk+VTBU7amSFLT0WUhWFv8WwSUB+AryCQG1Q== dependencies: "@ethersproject/abstract-provider" "^5.0.4" "@ethersproject/abstract-signer" "^5.0.4" @@ -1739,10 +1983,10 @@ "@ethersproject/web" "^5.0.0" ws "7.2.3" -"@ethersproject/random@5.0.4", "@ethersproject/random@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.4.tgz#98f7cf65b0e588cec39ef24843e391ed5004556f" - integrity sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ== +"@ethersproject/random@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.6.tgz#9be80a1065f2b8e6f321dccb3ebeb4886cac9ea4" + integrity sha512-8nsVNaZvZ9OD5NXfzE4mmz8IH/1DYJbAR95xpRxZkIuNmfn6QlMp49ccJYZWGhs6m0Zj2+FXjx3pzXfYlo9/dA== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" @@ -1755,10 +1999,18 @@ "@ethersproject/bytes" "^5.0.0" "@ethersproject/logger" "^5.0.0" -"@ethersproject/rlp@5.0.4", "@ethersproject/rlp@^5.0.3": +"@ethersproject/random@^5.0.3": version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.4.tgz#0090a0271e84ea803016a112a79f5cfd80271a77" - integrity sha512-5qrrZad7VTjofxSsm7Zg/7Dr4ZOln4S2CqiDdOuTv6MBKnXj0CiBojXyuDy52M8O3wxH0CyE924hXWTDV1PQWQ== + resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.0.4.tgz#98f7cf65b0e588cec39ef24843e391ed5004556f" + integrity sha512-AIZJhqs6Ba4/+U3lOjt3QZbP6b/kuuGLJUYFUonAgWmkTHwqsCwYnFvnHKQSUuHbXHvErp7WFXFlztx+yMn3kQ== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/rlp@5.0.6": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.6.tgz#29f9097348a3c330811997433b7df89ab51cd644" + integrity sha512-M223MTaydfmQSsvqAl0FJZDYFlSqt6cgbhnssLDwqCKYegAHE16vrFyo+eiOapYlt32XAIJm0BXlqSunULzZuQ== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" @@ -1771,10 +2023,18 @@ "@ethersproject/bytes" "^5.0.0" "@ethersproject/logger" "^5.0.0" -"@ethersproject/sha2@5.0.4", "@ethersproject/sha2@^5.0.3": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.4.tgz#40f639721a27dbe034b3dee021ba20b054586fec" - integrity sha512-0yFhf1mspxAfWdXXoPtK94adUeu1R7/FzAa+DfEiZTc76sz/vHXf0LSIazoR3znYKFny6haBxME+usbvvEcF3A== +"@ethersproject/rlp@^5.0.3": + version "5.0.3" + resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.0.3.tgz#841a5edfdf725f92155fe74424f5510c9043c13a" + integrity sha512-Hz4yyA/ilGafASAqtTlLWkA/YqwhQmhbDAq2LSIp1AJNx+wtbKWFAKSckpeZ+WG/xZmT+fw5OFKK7a5IZ4DR5g== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/sha2@5.0.6", "@ethersproject/sha2@^5.0.3": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.0.6.tgz#175116dc10b866a0a381f6316d094bcc510bee3c" + integrity sha512-30gypDLkfkP5gE3llqi0jEuRV8m4/nvzeqmqMxiihZ7veFQHqDaGpyFeHzFim+qGeH9fq0lgYjavLvwW69+Fkw== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" @@ -1789,10 +2049,10 @@ "@ethersproject/logger" "^5.0.0" hash.js "1.1.3" -"@ethersproject/signing-key@5.0.5", "@ethersproject/signing-key@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.5.tgz#acfd06fc05a14180df7e027688bbd23fc4baf782" - integrity sha512-Z1wY7JC1HVO4CvQWY2TyTTuAr8xK3bJijZw1a9G92JEmKdv1j255R/0YLBBcFTl2J65LUjtXynNJ2GbArPGi5g== +"@ethersproject/signing-key@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.7.tgz#d03bfc5f565efb962bafebf8e6965e70d1c46d31" + integrity sha512-JYndnhFPKH0daPcIjyhi+GMcw3srIHkQ40hGRe6DA0CdGrpMfgyfSYDQ2D8HL2lgR+Xm4SHfEB0qba6+sCyrvg== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/logger" "^5.0.5" @@ -1809,10 +2069,20 @@ "@ethersproject/properties" "^5.0.0" elliptic "6.5.3" -"@ethersproject/solidity@5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.5.tgz#97a7d8a67f2d944f208c948fed0d565512bcc2be" - integrity sha512-DMFQ0ouXmNVoKWbGEUFGi8Urli4SJip9jXafQyFHWPRr5oJUqDVkNfwcyC37k+mhBG93k7qrYXCH2xJnGEOxHg== +"@ethersproject/signing-key@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.0.4.tgz#a5334ce8a52d4e9736dc8fb6ecc384704ecf8783" + integrity sha512-I6pJoga1IvhtjYK5yXzCjs4ZpxrVbt9ZRAlpEw0SW9UuV020YfJH5EIVEGR2evdRceS3nAQIggqbsXSkP8Y1Dg== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + elliptic "6.5.3" + +"@ethersproject/solidity@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.0.7.tgz#72a3455f47a454db2dcf363992d42e9045dc7fce" + integrity sha512-dUevKUZ06p/VMLP/+cz4QUV+lA17NixucDJfm0ioWF0B3R0Lf+6wqwPchcqiAXlxkNFGIax7WNLgGMh4CkQ8iw== dependencies: "@ethersproject/bignumber" "^5.0.7" "@ethersproject/bytes" "^5.0.4" @@ -1831,10 +2101,19 @@ "@ethersproject/sha2" "^5.0.0" "@ethersproject/strings" "^5.0.0" -"@ethersproject/strings@5.0.5", "@ethersproject/strings@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.5.tgz#ed7e99a282a02f40757691b04a24cd83f3752195" - integrity sha512-JED6WaIV00xM/gvj8vSnd+0VWtDYdidTmavFRCTQakqfz+4tDo6Jz5LHgG+dd45h7ah7ykCHW0C7ZXWEDROCXQ== +"@ethersproject/strings@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.7.tgz#8dc68f794c9e2901f3b75e53b2afbcb6b6c15037" + integrity sha512-a+6T80LvmXGMOOWQTZHtGGQEg1z4v8rm8oX70KNs55YtPXI/5J3LBbVf5pyqCKSlmiBw5IaepPvs5XGalRUSZQ== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + +"@ethersproject/strings@>=5.0.0-beta.130", "@ethersproject/strings@^5.0.4": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.0.4.tgz#67cda604eee3ffcc004cb9f3bd03516e1c7b09a0" + integrity sha512-azXFHaNkDXzefhr4LVVzzDMFwj3kH9EOKlATu51HjxabQafuUyVLPFgmxRFmCynnAi0Bmmp7nr+qK1pVDgRDLQ== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/constants" "^5.0.4" @@ -1849,10 +2128,10 @@ "@ethersproject/constants" "^5.0.0" "@ethersproject/logger" "^5.0.0" -"@ethersproject/transactions@5.0.6", "@ethersproject/transactions@^5.0.5": - version "5.0.6" - resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c" - integrity sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA== +"@ethersproject/transactions@5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.8.tgz#3b4d7041e13b957a9c4f131e0aea9dae7b6f5a23" + integrity sha512-i7NtOXVzUe+YSU6QufzlRrI2WzHaTmULAKHJv4duIZMLqzehCBXGA9lTpFgFdqGYcQJ7vOtNFC2BB2mSjmuXqg== dependencies: "@ethersproject/address" "^5.0.4" "@ethersproject/bignumber" "^5.0.7" @@ -1879,10 +2158,40 @@ "@ethersproject/rlp" "^5.0.0" "@ethersproject/signing-key" "^5.0.0" -"@ethersproject/units@5.0.5": +"@ethersproject/transactions@^5.0.0-beta.135": version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.5.tgz#6e088900cf1f982ff60c9c35ce0a0f797ca7d78c" - integrity sha512-XHZZIA+o4Sfne9ycWWdoCpMQSpTAF1V1fxNIfgFAVYBp0JKZp4YypDdHCDleAP4rPuFgSNeJqZyb3kAe1VJMkg== + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.5.tgz#9a966f9ef4817b1752265d4efee0f1e9fd6aeaad" + integrity sha512-1Ga/QmbcB74DItggP8/DK1tggu4ErEvwTkIwIlUXUcvIAuRNXXE7kgQhlp+w1xA/SAQFhv56SqCoyqPiiLCvVA== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/rlp" "^5.0.3" + "@ethersproject/signing-key" "^5.0.4" + +"@ethersproject/transactions@^5.0.5": + version "5.0.6" + resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.0.6.tgz#b8b27938be6e9ed671dbdd35fe98af8b14d0df7c" + integrity sha512-htsFhOD+NMBxx676A8ehSuwVV49iqpSB+CkjPZ02tpNew0K6p8g0CZ46Z1ZP946gIHAU80xQ0NACHYrjIUaCFA== + dependencies: + "@ethersproject/address" "^5.0.4" + "@ethersproject/bignumber" "^5.0.7" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/constants" "^5.0.4" + "@ethersproject/keccak256" "^5.0.3" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/rlp" "^5.0.3" + "@ethersproject/signing-key" "^5.0.4" + +"@ethersproject/units@5.0.8": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.0.8.tgz#563325b20fe1eceff7b61857711d5e2b3f38fd09" + integrity sha512-3O4MaNHFs05vC5v2ZGqVFVWtO1WyqFejO78M7Qh16njo282aoMlENtVI6cn2B36zOLFXRvYt2pYx6xCG53qKzg== dependencies: "@ethersproject/bignumber" "^5.0.7" "@ethersproject/constants" "^5.0.4" @@ -1897,10 +2206,10 @@ "@ethersproject/constants" "^5.0.0" "@ethersproject/logger" "^5.0.0" -"@ethersproject/wallet@5.0.5": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.5.tgz#93973d919e75bbc5422f11d1c3f39695f1a27e71" - integrity sha512-NbrKmsW3w+5dVOEyVCN5VAAIp3y8ckutW6AV7Lo0Hn8RO9mLT8ZFzLGp4lzgJoxkm+EV8BE+x1N6NdiOgUzRng== +"@ethersproject/wallet@5.0.9": + version "5.0.9" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.0.9.tgz#976c7d950489c40308d676869d24e59ab7b82ad1" + integrity sha512-GfpQF56PO/945SJq7Wdg5F5U6wkxaDgkAzcgGbCW6Joz8oW8MzKItkvYCzMh+j/8gJMzFncsuqX4zg2gq3J6nQ== dependencies: "@ethersproject/abstract-provider" "^5.0.4" "@ethersproject/abstract-signer" "^5.0.4" @@ -1939,10 +2248,10 @@ "@ethersproject/transactions" "^5.0.0" "@ethersproject/wordlists" "^5.0.0" -"@ethersproject/web@5.0.8", "@ethersproject/web@^5.0.6": - version "5.0.8" - resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.8.tgz#afd2363df0b440025b7b4a95527ea0dbfdb65e2e" - integrity sha512-5An1sar40zXUYmBLH+P1m0F3mTi8lNBV/usLKP3AYBdSxPQyQWymLAEPyX7x5/eBpQAwCInLtF7LPMm9HPI28g== +"@ethersproject/web@5.0.11": + version "5.0.11" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.11.tgz#d47da612b958b4439e415782a53c8f8461522d68" + integrity sha512-x03ihbPoN1S8Gsh9WSwxkYxUIumLi02ZEKJku1C43sxBfe+mdprWyvujzYlpuoRNfWRgNhdRDKMP8JbG6MwNGA== dependencies: "@ethersproject/base64" "^5.0.3" "@ethersproject/bytes" "^5.0.4" @@ -1961,10 +2270,21 @@ "@ethersproject/properties" "^5.0.0" "@ethersproject/strings" "^5.0.0" -"@ethersproject/wordlists@5.0.5", "@ethersproject/wordlists@^5.0.4": - version "5.0.5" - resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.5.tgz#a935b7fdb86c96b44ea8391fed94b3fa2f33c606" - integrity sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA== +"@ethersproject/web@^5.0.6": + version "5.0.8" + resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.0.8.tgz#afd2363df0b440025b7b4a95527ea0dbfdb65e2e" + integrity sha512-5An1sar40zXUYmBLH+P1m0F3mTi8lNBV/usLKP3AYBdSxPQyQWymLAEPyX7x5/eBpQAwCInLtF7LPMm9HPI28g== + dependencies: + "@ethersproject/base64" "^5.0.3" + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + +"@ethersproject/wordlists@5.0.7": + version "5.0.7" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.7.tgz#4e5ad38cfbef746b196a3290c0d41696eb7ab468" + integrity sha512-ZjQtYxm41FmHfYgpkdQG++EDcBPQWv9O6FfP6NndYRVaXaQZh6eq3sy7HQP8zCZ8dznKgy6ZyKECS8qdvnGHwA== dependencies: "@ethersproject/bytes" "^5.0.4" "@ethersproject/hash" "^5.0.4" @@ -1983,6 +2303,17 @@ "@ethersproject/properties" "^5.0.0" "@ethersproject/strings" "^5.0.0" +"@ethersproject/wordlists@^5.0.4": + version "5.0.5" + resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.0.5.tgz#a935b7fdb86c96b44ea8391fed94b3fa2f33c606" + integrity sha512-XA3ycFltVrCTQt04w5nHu3Xq5Z6HjqWsXaAYQHFdqtugyUsIumaO9S5MOwFFuUYTNkZUoT3jCRa/OBS+K4tLfA== + dependencies: + "@ethersproject/bytes" "^5.0.4" + "@ethersproject/hash" "^5.0.4" + "@ethersproject/logger" "^5.0.5" + "@ethersproject/properties" "^5.0.3" + "@ethersproject/strings" "^5.0.4" + "@iarna/toml@^2.2.0": version "2.2.5" resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" @@ -2246,6 +2577,44 @@ "@parcel/utils" "^1.11.0" physical-cpu-count "^2.0.0" +"@portis/web3-provider-engine@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@portis/web3-provider-engine/-/web3-provider-engine-1.1.2.tgz#97f383156ea6b70fba69ae93a945fdd94159b1ba" + integrity sha512-NiiF0UPfngf4ulo32ybEDAMaad4i7h44HJaN8ea8HHt/vaFiUcPtINjC2o21jhWaLANerW4ZbOrNs1iCLH4p6A== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.2.0" + eth-json-rpc-filters "^4.0.2" + eth-json-rpc-infura "^3.1.0" + eth-json-rpc-middleware "^5.0.2" + eth-sig-util "2.5.3" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +"@portis/web3@^2.0.0-beta.54": + version "2.0.0-beta.59" + resolved "https://registry.yarnpkg.com/@portis/web3/-/web3-2.0.0-beta.59.tgz#2e5292d8e1daf6070aa3b4a8cb33c1a9e0315011" + integrity sha512-QdIdrI3uK+TyT+dxRK5bEYOi2PBlUDJ7vszR2uu0bT49wy7O52B9td6fL/5gsfk0VpCsmrYov3x3gEQYwGUyvQ== + dependencies: + "@portis/web3-provider-engine" "1.1.2" + ethereumjs-util "5.2.0" + penpal "3.0.7" + pocket-js-core "0.0.3" + "@rollup/plugin-alias@^3.0.1": version "3.1.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-3.1.1.tgz#bb96cf37fefeb0a953a6566c284855c7d1cd290c" @@ -2473,6 +2842,72 @@ dependencies: defer-to-connect "^2.0.0" +"@toruslabs/eccrypto@^1.1.4": + version "1.1.5" + resolved "https://registry.yarnpkg.com/@toruslabs/eccrypto/-/eccrypto-1.1.5.tgz#c4b9319e02e913fecd90f3f2b98ae2699e7d498e" + integrity sha512-7sSAQ9M6b9wzxpIE98yi8zPh3wgdYiVBxvMvCOCb4c65UDOT6lpZyH30qP2fX30PaI+I2Ra+FwjfCCUuJegxfQ== + dependencies: + acorn "^7.4.0" + elliptic "^6.5.3" + es6-promise "^4.2.8" + nan "^2.14.1" + optionalDependencies: + secp256k1 "^3.8.0" + +"@toruslabs/fetch-node-details@^2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@toruslabs/fetch-node-details/-/fetch-node-details-2.3.0.tgz#55ca927814812a029bb29816ace3d60d27fcd0b1" + integrity sha512-QWfYxBel+XUnUgkyPnjTLZpWiYJVl3Nz6I5MwSRJ/t3GteJvvGuq93zbsIzRmyhxK5C+e+FufnEUsKFwiXtPmA== + dependencies: + web3-eth-contract "^1.2.9" + web3-utils "^1.2.9" + +"@toruslabs/http-helpers@^1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@toruslabs/http-helpers/-/http-helpers-1.3.4.tgz#8811cff562fb792267f79ca5cb5c1bf1bc517e34" + integrity sha512-2Hm34F3GOwg41jEaZs1rVF4b+SGwC2mPeR7WhkkkM1cQNlXyCtcgLNLqlCVrww9e6pfBCZ2h3aEQVw+p4cT4fw== + dependencies: + deepmerge "^4.2.2" + loglevel "^1.6.8" + +"@toruslabs/torus-embed@^1.8.0": + version "1.8.5" + resolved "https://registry.yarnpkg.com/@toruslabs/torus-embed/-/torus-embed-1.8.5.tgz#44e68dfb2fb0fcc111a1e5a010daa413b8ea11fc" + integrity sha512-NaA5F1xIunoazcDf5eeLapjCe14S2EFAcEk+t3oAzHHax290r661xQUJFW0s9xxSKUu7KaCHfPMn7ZALXE3tCA== + dependencies: + "@chaitanyapotti/random-id" "^1.0.3" + "@toruslabs/fetch-node-details" "^2.3.0" + "@toruslabs/http-helpers" "^1.3.4" + "@toruslabs/torus.js" "^2.2.5" + create-hash "^1.2.0" + deepmerge "^4.2.2" + eth-json-rpc-errors "^2.0.2" + fast-deep-equal "^3.1.3" + is-stream "^2.0.0" + json-rpc-engine "^5.1.8" + json-rpc-middleware-stream "^2.1.1" + loglevel "^1.6.8" + obj-multiplex "^1.0.0" + obs-store "^4.0.3" + post-message-stream "^3.0.0" + pump "^3.0.0" + safe-event-emitter "^1.0.1" + web3 "^0.20.7" + +"@toruslabs/torus.js@^2.2.5": + version "2.2.5" + resolved "https://registry.yarnpkg.com/@toruslabs/torus.js/-/torus.js-2.2.5.tgz#8994ae7727d980e2c0600b1154d547260ea52ec4" + integrity sha512-fxrIQmtNo4p3uEy5KdiIrZiB32KGPtaV70PoPg/vQB4IL/gjrQSYSIcC0VyP04yBfjHLccJe/HKOhlofpKcjAg== + dependencies: + "@toruslabs/eccrypto" "^1.1.4" + "@toruslabs/http-helpers" "^1.3.4" + bn.js "^5.1.2" + elliptic "^6.5.3" + json-stable-stringify "^1.0.1" + loglevel "^1.6.8" + memory-cache "^0.2.0" + web3-utils "^1.2.11" + "@types/anymatch@*": version "1.3.1" resolved "https://registry.yarnpkg.com/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a" @@ -2511,6 +2946,13 @@ dependencies: "@babel/types" "^7.3.0" +"@types/bn.js@^4.11.3", "@types/bn.js@^4.11.5": + version "4.11.6" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" + integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== + dependencies: + "@types/node" "*" + "@types/cacheable-request@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976" @@ -2623,6 +3065,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.27.tgz#a151873af5a5e851b51b3b065c9e63390a9e0eb1" integrity sha512-kVrqXhbclHNHGu9ztnAwSncIgJv/FaxmzXJvGXNdcCpV1b8u1/Mi6z6m0vwy0LzKeXFTPLH0NzwmoJ3fNCIq0g== +"@types/node@^12.12.6": + version "12.12.62" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.62.tgz#733923d73669188d35950253dd18a21570085d2b" + integrity sha512-qAfo81CsD7yQIM9mVyh6B/U47li5g7cfpVQEDMfQeF8pSZVwzbhwU3crc0qG4DmpsebpJPR49AKOExQyJ05Cpg== + "@types/normalize-package-data@^2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" @@ -2633,6 +3080,13 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== +"@types/pbkdf2@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/pbkdf2/-/pbkdf2-3.1.0.tgz#039a0e9b67da0cdc4ee5dab865caa6b267bb66b1" + integrity sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ== + dependencies: + "@types/node" "*" + "@types/prettier@^2.0.0": version "2.0.2" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.0.2.tgz#5bb52ee68d0f8efa9cc0099920e56be6cc4e37f3" @@ -2685,6 +3139,13 @@ dependencies: "@types/node" "*" +"@types/secp256k1@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/secp256k1/-/secp256k1-4.0.1.tgz#fb3aa61a1848ad97d7425ff9dcba784549fca5a4" + integrity sha512-+ZjSA8ELlOp8SlKi0YLB2tz9d5iPNEmOBd+8Rz21wTMdaXQIa9b6TEnD6l5qKOCypE7FSyPyck12qZJxSDNoog== + dependencies: + "@types/node" "*" + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9" @@ -2850,6 +3311,203 @@ dependencies: wonka "^4.0.14" +"@walletconnect/client@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/client/-/client-1.2.2.tgz#bbebf8fbaeaf6d54e8b65cdaa67cacb978765eeb" + integrity sha512-olU/9O56ygvKlEsQoQceExiiYLffyy5ZphTK8xkGkJUHOm9wciXWgIgS6v3g9YKxeH+a6j+R6t/E/zYLMwbdFg== + dependencies: + "@walletconnect/core" "^1.2.2" + "@walletconnect/iso-crypto" "^1.2.2" + "@walletconnect/types" "^1.2.2" + "@walletconnect/utils" "^1.2.2" + +"@walletconnect/core@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/core/-/core-1.2.2.tgz#cd686a4ae187db602b7ca818de8d020efaaa76f8" + integrity sha512-X0g5swwj1PA5HNLV46/MVyRIYIJjyRoRS3Ae0L7cHF7IQnxvSZqpUURLE2dQEbuWd2E+FKS84L3mq4UXk/29UQ== + dependencies: + "@walletconnect/socket-transport" "^1.2.2" + "@walletconnect/types" "^1.2.2" + "@walletconnect/utils" "^1.2.2" + +"@walletconnect/http-connection@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/http-connection/-/http-connection-1.2.2.tgz#07b5671267329c193fdd6148722f391f339a9351" + integrity sha512-D9Eb9RYlmDifq0yN/IH0L8GGpAwankXVKAmp8jtW/nKtbWA9a8DAd0MOJ+ybx2uIJ/fWeDsFcOnMFf22+02xOQ== + dependencies: + "@walletconnect/types" "^1.2.2" + "@walletconnect/utils" "^1.2.2" + xhr2-cookies "1.1.0" + +"@walletconnect/iso-crypto@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/iso-crypto/-/iso-crypto-1.2.2.tgz#7592b55a90e11256f6b765d9a14e493fca4c533a" + integrity sha512-Ry/6xCbfAqytLTgEw1xfcYeUSUVd/ONpCJKISmiUorurUcZbBdPutpJgiII9GO+5c213JrfIeJWBIj31Dka6sA== + dependencies: + "@walletconnect/types" "^1.2.2" + "@walletconnect/utils" "^1.2.2" + eccrypto-js "5.2.0" + +"@walletconnect/mobile-registry@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/mobile-registry/-/mobile-registry-1.2.2.tgz#f0a01ec9d682d2097f45d941b9e8594903217074" + integrity sha512-ZkxF9yq+5ygXGf4Z0vI3EkixU9B66UC0FVu33UxVN2YgUgzgPzakhANbsL1+5reVMDJRebyX/7qZX8uEXL+0Ow== + +"@walletconnect/qrcode-modal@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/qrcode-modal/-/qrcode-modal-1.2.2.tgz#99e5325f5ea858964436bb3602720a4a8f01b1b9" + integrity sha512-ZuQgT2UsGUARmLp1nUuBoA62qY1y7cO/8j3EkjtVgJN8eeYSxtVDNGc94um42VKIAWnRAT26Uk8/XvN/Mmus+A== + dependencies: + "@walletconnect/mobile-registry" "^1.2.2" + "@walletconnect/types" "^1.2.2" + "@walletconnect/utils" "^1.2.2" + preact "10.4.1" + qrcode "1.4.4" + +"@walletconnect/socket-transport@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/socket-transport/-/socket-transport-1.2.2.tgz#c5ec0032a83ea8cf3d98f970bb3ddeb0f7678435" + integrity sha512-ZAfNjcXwdacM4lISATqNFEXsLuecKuDioQJmZxbnR4V54PL9h2QYmpw4Y9fPCnISXf2eMQgBt0/5mRqOwtlqHw== + dependencies: + "@walletconnect/types" "^1.2.2" + ws "7.3.0" + +"@walletconnect/types@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/types/-/types-1.2.2.tgz#24f2aa9f21c34b97ffeb2757533d26d3bf09b5a6" + integrity sha512-kaG5HwlymtQENcO8TbkfT5ORNgAn2GYuhtiKUNWSq7bmJ05PcoaGmtHf/rXaYLiEf+QLp/5JAClT+iHc3eMgsA== + +"@walletconnect/utils@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/utils/-/utils-1.2.2.tgz#9c0d7bc9a3b3f4a1b5a5b2773fb1edebf1c50f3a" + integrity sha512-FqCxZVijQnJfGapXsYC6D8D5MyX5gp+1AIpBfCmFh6PEIlAH4JDwPZ7RXsWDuSqnXVo5gzsz+VLP5Nac2YoPDQ== + dependencies: + "@walletconnect/types" "^1.2.2" + detect-browser "5.1.0" + enc-utils "2.1.0" + js-sha3 "0.8.0" + +"@walletconnect/web3-provider@^1.2.0-alpha.0": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@walletconnect/web3-provider/-/web3-provider-1.2.2.tgz#1f4a9965c354a6222589ea9495159fdc21206692" + integrity sha512-cLyNjMb2WzU36q18s2Q8/rM0CAKQLw3T7McQuq7yo52Kau3MmIL1CFn1hSRcCdvDac0OJw2c5Nj1+JzC7mI0pQ== + dependencies: + "@walletconnect/client" "^1.2.2" + "@walletconnect/http-connection" "^1.2.2" + "@walletconnect/qrcode-modal" "^1.2.2" + "@walletconnect/types" "^1.2.2" + "@walletconnect/utils" "^1.2.2" + web3-provider-engine "15.0.12" + +"@web3-react/abstract-connector@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/abstract-connector/-/abstract-connector-6.0.7.tgz#401b3c045f1e0fab04256311be49d5144e9badc6" + integrity sha512-RhQasA4Ox8CxUC0OENc1AJJm8UTybu/oOCM61Zjg6y0iF7Z0sqv1Ai1VdhC33hrQpA8qSBgoXN9PaP8jKmtdqg== + dependencies: + "@web3-react/types" "^6.0.7" + +"@web3-react/authereum-connector@^6.1.1": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/authereum-connector/-/authereum-connector-6.1.6.tgz#2aefc653578d880238719418e0b1818347f4a18e" + integrity sha512-SeU7PSSkN5MHEnYiveVwctuniXSbBKqm4dl0HUSUK/L+Kzs5lAcSYE0Iyu9Ke7RpSQJ6qe1SxbcAMguyQVOeKQ== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + authereum "^0.0.4-beta.157" + +"@web3-react/core@^6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@web3-react/core/-/core-6.1.1.tgz#06c853890723f600b387b738a4b71ef41d5cccb7" + integrity sha512-HKXOgPNCmFvrVsed+aW/HlVhwzs8t3b+nzg3BoxgJQo/5yLiJXSumHRBdUrPxhBQiHkHRZiVPAvzf/8JMnm74Q== + dependencies: + "@ethersproject/keccak256" "^5.0.0-beta.130" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + tiny-warning "^1.0.3" + +"@web3-react/fortmatic-connector@^6.0.9": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/fortmatic-connector/-/fortmatic-connector-6.1.6.tgz#99836c4ff4428432e34ed859b55c5842b02726a5" + integrity sha512-AKiEVvKlZPpRj5pADXyucl2FBt3ymf7PSsRhraHeI8hJCfCEACQ2+bq7okvJq9sNqaeUKukzwUYJmgBYn0qkYQ== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + fortmatic "^1.0.0" + tiny-invariant "^1.0.6" + +"@web3-react/frame-connector@^6.0.9": + version "6.0.9" + resolved "https://registry.yarnpkg.com/@web3-react/frame-connector/-/frame-connector-6.0.9.tgz#9e7659480a554944e0ecf08f00fe0c946a565d35" + integrity sha512-SyEveo8XckEw+aIhT7A58OFtUgAVWM85PmJegoIaTAWBVTVlvXClTAnOUrDzH2Nu6nCoj2swNKHS2dePnux9Pw== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + eth-provider "^0.2.5" + tiny-invariant "^1.0.6" + +"@web3-react/injected-connector@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/injected-connector/-/injected-connector-6.0.7.tgz#1e0be23f51fa07fe6547fe986768a46b74c3a426" + integrity sha512-Y7aJSz6pg+MWKtvdyuqyy6LWuH+4Tqtph1LWfiyVms9II9ar/9B/de4R8wh4wjg91wmHkU+D75yP09E/Soh2RA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-warning "^1.0.3" + +"@web3-react/portis-connector@^6.1.1": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/portis-connector/-/portis-connector-6.1.6.tgz#e98847864c05a35e06e593e3aea0358749aae162" + integrity sha512-c9qyPoGVG+wLKcIJGzVTDP6oZ/Wn+EbE2cVjeCDTR2opzOO6kJoG7SOZMLXIX1F9v/N6bB8NI6XWlDjROK8zMw== + dependencies: + "@portis/web3" "^2.0.0-beta.54" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + +"@web3-react/squarelink-connector@^6.1.1": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/squarelink-connector/-/squarelink-connector-6.1.6.tgz#26d496a0c4551220115f36e5c29a5b38c80675fa" + integrity sha512-OD/WhpgbuQvEy8WhSmniw1VQUUcqobS/kv/eDDEX2rN7w+o8Ip78lPX52eEux9HRQXUslkP/y1DCKRz+USWhGA== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + squarelink "^1.1.4" + tiny-invariant "^1.0.6" + +"@web3-react/torus-connector@^6.1.1": + version "6.1.7" + resolved "https://registry.yarnpkg.com/@web3-react/torus-connector/-/torus-connector-6.1.7.tgz#5ce7829a5669efdaa2e39abe2989a490b87dad1a" + integrity sha512-zuirHlkcUuwkAyhCz1zBHbxiQ3627Zvw/MJyXGFVX5BSr9ywulFzEi2f+DOyDMMBZAxtSPs3VHB4xMTetUCkOg== + dependencies: + "@toruslabs/torus-embed" "^1.8.0" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + +"@web3-react/types@^6.0.7": + version "6.0.7" + resolved "https://registry.yarnpkg.com/@web3-react/types/-/types-6.0.7.tgz#34a6204224467eedc6123abaf55fbb6baeb2809f" + integrity sha512-ofGmfDhxmNT1/P/MgVa8IKSkCStFiyvXe+U5tyZurKdrtTDFU+wJ/LxClPDtFerWpczNFPUSrKcuhfPX1sI6+A== + +"@web3-react/walletconnect-connector@^6.1.4": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/walletconnect-connector/-/walletconnect-connector-6.1.6.tgz#8c216b2e38db94c60afac8453be31d31019205b7" + integrity sha512-subMnG0/SmP7bg5ZGxX6z32GjlSFspc7AO+A2pUrifP5My/837sp900uhBxLl5ex2SMe/rDgor+7jUstAkmH8g== + dependencies: + "@walletconnect/web3-provider" "^1.2.0-alpha.0" + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + tiny-invariant "^1.0.6" + +"@web3-react/walletlink-connector@^6.1.1": + version "6.1.6" + resolved "https://registry.yarnpkg.com/@web3-react/walletlink-connector/-/walletlink-connector-6.1.6.tgz#1db2672ac1d19917c6f8755fcc1050a9d8292f52" + integrity sha512-uWpz9ARqAKYw0ss2CYoQDrlvj5Koo4RoeTLns+ZoZPeMqCIcgDZvlkpWCkPNSs9eSP2PtbqWEzhm0vag7hCCBw== + dependencies: + "@web3-react/abstract-connector" "^6.0.7" + "@web3-react/types" "^6.0.7" + walletlink "^2.0.2" + "@webassemblyjs/ast@1.9.0": version "1.9.0" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz#bd850604b4042459a5a41cd7d338cbed695ed964" @@ -3010,6 +3668,20 @@ abab@^2.0.0, abab@^2.0.3: resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.4.tgz#6dfa57b417ca06d21b2478f0e638302f99c2405c" integrity sha512-Eu9ELJWCz/c1e9gTiCY+FceWxcqzjYEbqMgtndnuSqZSUCOL73TWNK2mHfIj4Cw2E/ongOp+JISVNCmovt2KYQ== +abstract-leveldown@~2.6.0: + version "2.6.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + integrity sha512-2++wDf/DYqkPR3o5tbfdhF96EfMApo1GpPfzOsR/ZYXdkSmELlvOOEAl9iKkRsktMPHdGjO4rtkBpf2I7TiTeA== + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~2.7.1: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + integrity sha512-+OVvxH2rHVEhWLdbudP6p0+dNMXu8JA1CbhP19T8paTYAcX7oJ4OVjT+ZUVpv7mITxXHqDMej+GdqXBmXkw09w== + dependencies: + xtend "~4.0.0" + accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.7: version "1.3.7" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" @@ -3054,7 +3726,7 @@ acorn@^6.0.1, acorn@^6.0.4, acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== -acorn@^7.1.1, acorn@^7.3.1: +acorn@^7.1.1, acorn@^7.3.1, acorn@^7.4.0: version "7.4.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.0.tgz#e1ad486e6c54501634c6c397c5c121daa383607c" integrity sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w== @@ -3069,6 +3741,11 @@ aes-js@3.0.0: resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= +aes-js@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.1.2.tgz#db9aabde85d5caabbfc0d4f2a4446960f627146a" + integrity sha512-e5pEa2kBnBOgR4Y/p20pskXI74UEz7de8ZGVo58asOtvSVG5YAbJeELPZxOmt+Bnz3rX753YKhfIn4X4l1PPRQ== + aggregate-error@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz#db2fe7246e536f40d9b5442a39e117d7dd6a24e0" @@ -3229,6 +3906,11 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E= + array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -3256,6 +3938,11 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + asap@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -3306,6 +3993,13 @@ async-each@^1.0.1: resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ== +async-eventemitter@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/async-eventemitter/-/async-eventemitter-0.2.4.tgz#f5e7c8ca7d3e46aab9ec40a292baf686a0bafaca" + integrity sha512-pd20BwL7Yt1zwDFy+8MX8F1+WCT8aQeKj0kQnTrH9WaeRETlRamVhD0JtRPmrV4GfOJ2F9CvdQkZeZhnh2TuHw== + dependencies: + async "^2.4.0" + async-kit@^2.2.3: version "2.2.4" resolved "https://registry.yarnpkg.com/async-kit/-/async-kit-2.2.4.tgz#53249064fc5c894c46210cbd1c1a9ff5bd44bf9f" @@ -3314,12 +4008,22 @@ async-kit@^2.2.3: nextgen-events "^0.14.5" tree-kit "^0.5.27" -async-limiter@~1.0.0: +async-limiter@^1.0.0, async-limiter@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== -async@^2.6.2: +async@3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" + integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== + +async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + +async@^2.0.1, async@^2.1.2, async@^2.4.0, async@^2.5.0, async@^2.6.2: version "2.6.3" resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg== @@ -3341,6 +4045,31 @@ atomic-sleep@^1.0.0: resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b" integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== +authereum@^0.0.4-beta.157: + version "0.0.4-beta.200" + resolved "https://registry.yarnpkg.com/authereum/-/authereum-0.0.4-beta.200.tgz#6e4da5b83dd3d9290589f9c21fc0b89af1a5682e" + integrity sha512-/W35hztlrnl63NnzLQ60a0pA8/4TKSVHNk/Vjrd8wOY6UU79C6s+3nSI8NjFzaanRNOCO5VuzINGWH/3zwJJHw== + dependencies: + async "3.2.0" + bn.js "5.1.2" + ethereum-private-key-to-address "0.0.3" + ethers "4.0.47" + eventemitter3 "4.0.0" + is-buffer "2.0.4" + penpal "4.1.1" + pify "4.0.1" + querystring "0.2.0" + store "2.0.12" + to-hex "0.0.11" + uuidv4 "6.0.6" + web3-provider-engine "15.0.4" + web3-utils "1.2.1" + +await-semaphore@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/await-semaphore/-/await-semaphore-0.1.3.tgz#2b88018cc8c28e06167ae1cdff02504f1f9688d3" + integrity sha512-d1W2aNSYcz/sxYO4pMGX9vq65qOTu0P800epMud+6cYYX0QcT7zyqcxec3VWzpgvdXo57UWmVbZpLMjX2m1I7Q== + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -3351,6 +4080,175 @@ aws4@^1.8.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.10.1.tgz#e1e82e4f3e999e2cfd61b161280d16a111f86428" integrity sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA== +axios@^0.18.0: + version "0.18.1" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.18.1.tgz#ff3f0de2e7b5d180e757ad98000f1081b87bcea3" + integrity sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g== + dependencies: + follow-redirects "1.5.10" + is-buffer "^2.0.2" + +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.0.14, babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-jest@^26.2.2, babel-jest@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.3.0.tgz#10d0ca4b529ca3e7d1417855ef7d7bd6fc0c3463" @@ -3365,6 +4263,20 @@ babel-jest@^26.2.2, babel-jest@^26.3.0: graceful-fs "^4.2.4" slash "^3.0.0" +babel-messages@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= + dependencies: + babel-runtime "^6.22.0" + babel-plugin-dynamic-import-node@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" @@ -3418,16 +4330,254 @@ babel-plugin-macros@2.8.0, babel-plugin-macros@^2.0.0: cosmiconfig "^6.0.0" resolve "^1.12.0" +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= + babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" integrity sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY= +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-react-remove-prop-types@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-preset-current-node-syntax@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-0.1.3.tgz#b4b547acddbf963cba555ba9f9cbbb70bfd044da" @@ -3445,6 +4595,42 @@ babel-preset-current-node-syntax@^0.1.3: "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" "@babel/plugin-syntax-optional-chaining" "^7.8.3" +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-preset-jest@^26.3.0: version "26.3.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.3.0.tgz#ed6344506225c065fd8a0b53e191986f74890776" @@ -3474,7 +4660,20 @@ babel-preset-react-app@^9.1.2: babel-plugin-macros "2.8.0" babel-plugin-transform-react-remove-prop-types "0.4.24" -babel-runtime@^6.11.6, babel-runtime@^6.26.0: +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.11.6, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -3482,7 +4681,33 @@ babel-runtime@^6.11.6, babel-runtime@^6.26.0: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-types@^6.15.0: +babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.15.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -3492,6 +4717,14 @@ babel-types@^6.15.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babelify@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/babelify/-/babelify-7.3.0.tgz#aa56aede7067fd7bd549666ee16dc285087e88e5" + integrity sha1-qlau3nBn/XvVSWZu4W3ChQh+iOU= + dependencies: + babel-core "^6.0.14" + object-assign "^4.0.0" + babylon-walk@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/babylon-walk/-/babylon-walk-1.0.2.tgz#3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce" @@ -3501,16 +4734,35 @@ babylon-walk@^1.0.2: babel-types "^6.15.0" lodash.clone "^4.5.0" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== + backo2@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + dependencies: + precond "0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= +base-x@^3.0.2: + version "3.0.8" + resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.8.tgz#1e1106c2537f0162e8b52474a557ebb09000018d" + integrity sha512-Rl/1AWP4J/zRrk54hhlxH4drNxPJXYUaKffODVI53/dAsV4t9fBxyxYKAVPU1XBHxYwOWP9h9H0hM2MVw4YfJA== + dependencies: + safe-buffer "^5.0.1" + base64-js@^1.0.2: version "1.3.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1" @@ -3561,6 +4813,15 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bignumber.js@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075" + integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A== + +"bignumber.js@git+https://github.com/frozeman/bignumber.js-nolookahead.git": + version "2.0.7" + resolved "git+https://github.com/frozeman/bignumber.js-nolookahead.git#57692b3ecfc98bbdd6b3a516cb2353652ea49934" + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -3571,24 +4832,56 @@ binary-extensions@^2.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9" integrity sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ== -bindings@^1.5.0: +bind-decorator@^1.0.11: + version "1.0.11" + resolved "https://registry.yarnpkg.com/bind-decorator/-/bind-decorator-1.0.11.tgz#e41bc06a1f65dd9cec476c91c5daf3978488252f" + integrity sha1-5BvAah9l3ZzsR2yRxdrzl4SIJS8= + +bindings@^1.2.1, bindings@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== dependencies: file-uri-to-path "1.0.0" +bip66@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/bip66/-/bip66-1.1.5.tgz#01fa8748785ca70955d5011217d1b3139969ca22" + integrity sha1-AfqHSHhcpwlV1QESF9GzE5lpyiI= + dependencies: + safe-buffer "^5.0.1" + +blakejs@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/blakejs/-/blakejs-1.1.0.tgz#69df92ef953aa88ca51a32df6ab1c54a155fc7a5" + integrity sha1-ad+S75U6qIylGjLfarHFShVfx6U= + bluebird@^3.5.5: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: +bn.js@4.11.6: + version "4.11.6" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.6.tgz#53344adb14617a13f6e8dd2ce28905d1c0ba3215" + integrity sha1-UzRK2xRhehP26N0s4okF0cC6MhU= + +bn.js@4.11.8: + version "4.11.8" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" + integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== + +bn.js@5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz#c9686902d3c9a27729f43ab10f9d79c2004da7b0" + integrity sha512-40rZaf3bUNKTVYu9sIeeEGOg7g14Yvnj9kH7b50EiwX0Q7A6umbvfI5tvHaOERH0XigqKkfLkFQxzb4e6CIXnA== + +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.10.0, bn.js@^4.11.0, bn.js@^4.11.1, bn.js@^4.11.6, bn.js@^4.11.8, bn.js@^4.11.9, bn.js@^4.4.0, bn.js@^4.8.0: version "4.11.9" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz#26d556829458f9d1e81fc48952493d0ba3507828" integrity sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw== -bn.js@^5.1.1: +bn.js@^5.1.1, bn.js@^5.1.2: version "5.1.3" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.3.tgz#beca005408f642ebebea80b042b4d18d2ac0ee6b" integrity sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ== @@ -3677,7 +4970,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserify-aes@^1.0.0, browserify-aes@^1.0.4: +browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6, browserify-aes@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48" integrity sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA== @@ -3738,6 +5031,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + browserslist@^4.0.0, browserslist@^4.1.0, browserslist@^4.12.0, browserslist@^4.8.5, browserslist@^4.9.1: version "4.14.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.14.0.tgz#2908951abfe4ec98737b72f34c3bcedc8d43b000" @@ -3755,6 +5056,22 @@ bs-logger@0.x: dependencies: fast-json-stable-stringify "2.x" +bs58@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" + integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= + dependencies: + base-x "^3.0.2" + +bs58check@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-2.1.2.tgz#53b018291228d82a5aa08e7d796fdafda54aebfc" + integrity sha512-0TS1jicxdU09dwJMNZtVAfzPi6Q6QeN0pM1Fkzrjn+XYHvzMKPU3pHVpva+769iNVSfIYWf7LJ6WR+BuuMf8cA== + dependencies: + bs58 "^4.0.0" + create-hash "^1.1.0" + safe-buffer "^5.1.2" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -3762,12 +5079,35 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +btoa@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/btoa/-/btoa-1.2.1.tgz#01a9909f8b2c93f6bf680ba26131eb30f7fa3d73" + integrity sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g== + +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== + +buffer-alloc@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" integrity sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs= -buffer-from@1.x, buffer-from@^1.0.0: +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= + +buffer-from@1.x, buffer-from@^1.0.0, buffer-from@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A== @@ -3777,6 +5117,11 @@ buffer-indexof@^1.0.0: resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" integrity sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g== +buffer-to-arraybuffer@^0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/buffer-to-arraybuffer/-/buffer-to-arraybuffer-0.0.5.tgz#6064a40fa76eb43c723aba9ef8f6e1216d10511a" + integrity sha1-YGSkD6dutDxyOrqe+PbhIW0QURo= + buffer-xor@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz#26e61ed1422fb70dd42e6e36729ed51d855fe8d9" @@ -3791,6 +5136,21 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.2.1, buffer@^5.4.3: + version "5.6.0" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786" + integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + +bufferutil@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.1.tgz#3a177e8e5819a1243fe16b63a199951a7ad8d4a7" + integrity sha512-xowrxvpxojqkagPcWRQVXZl0YXhRhAtBEIq3VoER1NH5Mw1n1o0ojdspp+GS2J//2gCVyrzQDApQ4unGF+QOoA== + dependencies: + node-gyp-build "~3.7.0" + builtin-modules@^3.0.0, builtin-modules@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-3.1.0.tgz#aad97c15131eb76b65b50ef208e7584cd76a7484" @@ -3935,6 +5295,20 @@ camel-case@^4.1.1: pascal-case "^3.1.1" tslib "^1.10.0" +camelcase-keys@^4.0.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-4.2.0.tgz#a2aa5fb1af688758259c32c141426d78923b9b77" + integrity sha1-oqpfsa9oh1glnDLBQUJteJI7m3c= + dependencies: + camelcase "^4.1.0" + map-obj "^2.0.0" + quick-lru "^1.0.0" + +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -3960,6 +5334,11 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001111: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001114.tgz#2e88119afb332ead5eaa330e332e951b1c4bfea9" integrity sha512-ml/zTsfNBM+T1+mjglWRPgVsu2L76GAaADKX5f4t0pbhttEp0WMawJsHDYlFkVZkoA+89uvBRrVrEE4oqenzXQ== +caniuse-lite@^1.0.30000844: + version "1.0.30001137" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001137.tgz#6f0127b1d3788742561a25af3607a17fc778b803" + integrity sha512-54xKQZTqZrKVHmVz0+UvdZR6kQc7pJDgfhsMYDG19ID1BWoNnDMFm5Q3uSBSU401pBvKYMsHAt9qhEDcxmk8aw== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -4023,6 +5402,13 @@ check-types@^8.0.3: resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552" integrity sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ== +checkpoint-store@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/checkpoint-store/-/checkpoint-store-1.1.0.tgz#04e4cb516b91433893581e6d4601a78e9552ea06" + integrity sha1-BOTLUWuRQziTWB5tRgGnjpVS6gY= + dependencies: + functional-red-black-tree "^1.0.1" + chokidar@^2.1.5, chokidar@^2.1.8: version "2.1.8" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" @@ -4173,11 +5559,16 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= -clone@^2.1.1: +clone@^2.0.0, clone@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +clsx@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/clsx/-/clsx-1.1.1.tgz#98b3134f9abbdf23b2663491ace13c5c03a73188" + integrity sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA== + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -4317,7 +5708,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@~1.6.0: +concat-stream@^1.5.0, concat-stream@^1.5.1, concat-stream@~1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -4371,6 +5762,11 @@ cookie@0.4.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" integrity sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg== +cookiejar@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== + copy-concurrently@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" @@ -4396,7 +5792,7 @@ core-js-compat@^3.6.2: browserslist "^4.8.5" semver "7.0.0" -core-js@^2.4.0, core-js@^2.6.5: +core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: version "2.6.11" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c" integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== @@ -4474,6 +5870,14 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-fetch@^2.1.0, cross-fetch@^2.1.1: + version "2.2.3" + resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-2.2.3.tgz#e8a0b3c54598136e037f8650f8e823ccdfac198e" + integrity sha512-PrWWNH3yL2NYIb/7WF/5vFG3DCQiXDOVf8k3ijatbrtnwNuhMWLC7YF7uqf53tbTFDzHIUD8oITw4Bxt8ST3Nw== + dependencies: + node-fetch "2.1.2" + whatwg-fetch "2.0.4" + cross-spawn@^5.0.1: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -4520,6 +5924,11 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +crypto-js@^3.1.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/crypto-js/-/crypto-js-3.3.0.tgz#846dd1cce2f68aacfa156c8578f926a609b7976b" + integrity sha512-DIT51nX0dCfKltpRiXV+/TVZq+Qq2NgF4644+K7Ttnla7zEzqc+kjJyiB96BHNyUTBxyjzRcZYpUdZa+QAqi6Q== + css-color-names@0.0.4, css-color-names@^0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0" @@ -4718,11 +6127,26 @@ csstype@^3.0.2: resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.0.2.tgz#ee5ff8f208c8cd613b389f7b222c9801ca62b3f7" integrity sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw== +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + integrity sha1-mI3zP+qxke95mmE2nddsF635V+o= + dependencies: + array-find-index "^1.0.1" + cyclist@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz#596e9698fd0c80e12038c2b82d6eb1b35b6224d9" integrity sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk= +d@1, d@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA== + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" @@ -4761,13 +6185,20 @@ deasync@^0.1.14: bindings "^1.5.0" node-addon-api "^1.7.1" -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.0, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" +debug@=3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== + dependencies: + ms "2.0.0" + debug@^3.1.1, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -4782,7 +6213,15 @@ debug@^4.0.1, debug@^4.1.0, debug@^4.1.1: dependencies: ms "^2.1.1" -decamelize@^1.2.0: +decamelize-keys@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" + integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -4797,6 +6236,13 @@ decode-uri-component@^0.2.0: resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M= + dependencies: + mimic-response "^1.0.0" + decompress-response@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" @@ -4804,7 +6250,7 @@ decompress-response@^6.0.0: dependencies: mimic-response "^3.1.0" -deep-equal@^1.0.1: +deep-equal@^1.0.1, deep-equal@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a" integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g== @@ -4851,6 +6297,13 @@ defer-to-connect@^2.0.0: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1" integrity sha512-bYL2d05vOSf1JEZNx5vSAtPuBMkX8K9EUutg7zlKvTqKXHt7RhWJFbmd7qakVuf13i+IkGmp6FwSsONOf6VYIg== +deferred-leveldown@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + integrity sha512-uukrWD2bguRtXilKt6cAWKyoXrTSMo5m7crUdLfWQmu8kIm88w3QZoUL+6nhpfKVmhHANER6Re3sKoNoZ3IKMA== + dependencies: + abstract-leveldown "~2.6.0" + define-properties@^1.1.2, define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -4880,6 +6333,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defined@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" + integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM= + del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -4916,11 +6374,23 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= +detect-browser@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.1.0.tgz#0c51c66b747ad8f98a6832bf3026a5a23a7850ff" + integrity sha512-WKa9p+/MNwmTiS+V2AS6eGxic+807qvnV3hC+4z2GTY+F42h1n8AynVTMMc4EJBC32qMs6yjOTpeDEQQt/AVqQ== + detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -4968,6 +6438,11 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dijkstrajs@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/dijkstrajs/-/dijkstrajs-1.0.1.tgz#d3cd81221e3ea40742cfcde556d4e99e98ddc71b" + integrity sha1-082BIh4+pAdCz83lVtTpnpjdxxs= + dns-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" @@ -5010,6 +6485,11 @@ dom-serializer@0: domelementtype "^2.0.1" entities "^2.0.0" +dom-walk@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" + integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -5092,6 +6572,22 @@ dotenv@^8.2.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a" integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw== +dotignore@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/dotignore/-/dotignore-0.1.2.tgz#f942f2200d28c3a76fbdd6f0ee9f3257c8a2e905" + integrity sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw== + dependencies: + minimatch "^3.0.4" + +drbg.js@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/drbg.js/-/drbg.js-1.0.1.tgz#3e36b6c42b37043823cdbc332d58f31e2445480b" + integrity sha1-Pja2xCs3BDgjzbwzLVjzHiRFSAs= + dependencies: + browserify-aes "^1.0.6" + create-hash "^1.1.2" + create-hmac "^1.1.4" + duplexer2@~0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1" @@ -5122,6 +6618,18 @@ ecc-jsbn@~0.1.1: jsbn "~0.1.0" safer-buffer "^2.1.0" +eccrypto-js@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/eccrypto-js/-/eccrypto-js-5.2.0.tgz#eb3b36e9978d316fedf50be46492bb0d3e240cf5" + integrity sha512-pPb6CMapJ1LIzjLWxMqlrnfaEFap7qkk9wcO/b4AVSdxBQYlpOqvlPpq5SpUI4FdmfdhVD34AjN47fM8fryC4A== + dependencies: + aes-js "3.1.2" + enc-utils "2.1.0" + hash.js "1.1.7" + js-sha3 "0.8.0" + randombytes "2.1.0" + secp256k1 "3.8.0" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -5132,12 +6640,30 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== +electron-to-chromium@^1.3.47: + version "1.3.572" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.572.tgz#62d87dfe32ca1f6b9a0f76917d24f66e94e19c01" + integrity sha512-TKqdEukCCl7JC20SwEoWTbtnGt4YjfHWAv4tcNky0a9qGo0WdM+Lrd60tps+nkaJCmktKBJjr99fLtEBU1ipWQ== + electron-to-chromium@^1.3.523: version "1.3.533" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.533.tgz#d7e5ca4d57e9bc99af87efbe13e7be5dde729b0f" integrity sha512-YqAL+NXOzjBnpY+dcOKDlZybJDCOzgsq4koW3fvyty/ldTmsb4QazZpOWmVvZ2m0t5jbBf7L0lIGU3BUipwG+A== -elliptic@6.5.3, elliptic@^6.5.3: +elliptic@6.5.2: + version "6.5.2" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" + integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== + dependencies: + bn.js "^4.4.0" + brorand "^1.0.1" + hash.js "^1.0.0" + hmac-drbg "^1.0.0" + inherits "^2.0.1" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.0" + +elliptic@6.5.3, elliptic@^6.4.0, elliptic@^6.5.2, elliptic@^6.5.3: version "6.5.3" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.3.tgz#cb59eb2efdaf73a0bd78ccd7015a62ad6e0f93d6" integrity sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw== @@ -5170,12 +6696,28 @@ emojis-list@^3.0.0: resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== +enc-utils@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/enc-utils/-/enc-utils-2.1.0.tgz#f6c28c3d4bb38fb409a93185848cf361f4fde142" + integrity sha512-VD0eunGDyzhojePzkORWDnW88gi6tIeGb5Z6QVHugux6mMAPiXyw94fb/7WdDQEWhKMSoYRyzFFUebCqeH20PA== + dependencies: + bn.js "4.11.8" + is-typedarray "1.0.0" + typedarray-to-buffer "3.1.5" + encodeurl@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= -end-of-stream@^1.0.0, end-of-stream@^1.1.0: +encoding@^0.1.11: + version "0.1.13" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" + integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== + dependencies: + iconv-lite "^0.6.2" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.0: version "1.4.4" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== @@ -5213,7 +6755,7 @@ envinfo@^7.3.1: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.2.tgz#098f97a0e902f8141f9150553c92dbb282c4cabe" integrity sha512-k3Eh5bKuQnZjm49/L7H4cHzs2FlL5QjbTB3JrPxoTI8aJG7hVMe4uKyJxSYH4ahseby2waUwk5OaKX/nAsaYgg== -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" integrity sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg== @@ -5244,6 +6786,24 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: string.prototype.trimend "^1.0.1" string.prototype.trimstart "^1.0.1" +es-abstract@^1.18.0-next.0: + version "1.18.0-next.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.0.tgz#b302834927e624d8e5837ed48224291f2c66e6fc" + integrity sha512-elZXTZXKn51hUBdJjSZGYRujuzilgXo8vSPQzjGYXLvSlGiCo8VO8ZGV3kjo9a0WNJJ57hENagwbtlRuHuzkcQ== + dependencies: + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + is-callable "^1.2.0" + is-negative-zero "^2.0.0" + is-regex "^1.1.1" + object-inspect "^1.8.0" + object-keys "^1.1.1" + object.assign "^4.1.0" + string.prototype.trimend "^1.0.1" + string.prototype.trimstart "^1.0.1" + es-module-lexer@^0.3.17: version "0.3.24" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.3.24.tgz#e6b2900758e9e210d23aec2092efc13ca235adea" @@ -5263,6 +6823,37 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.35, es5-ext@^0.10.50: + version "0.10.53" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q== + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + +es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-promise@^4.2.8: + version "4.2.8" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" + integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== + +es6-symbol@^3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA== + dependencies: + d "^1.0.1" + ext "^1.1.2" + esbuild@^0.6.11: version "0.6.25" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.6.25.tgz#060f95ed171dba4e6e86e6920f2aff328f96e99e" @@ -5493,47 +7084,488 @@ esquery@^1.0.1, esquery@^1.2.0: dependencies: estraverse "^5.1.0" -esrecurse@^4.1.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" - integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== + dependencies: + estraverse "^4.1.0" + +estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== + +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@^1.8.1, etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + +eth-block-tracker@^4.2.0, eth-block-tracker@^4.4.1, eth-block-tracker@^4.4.2: + version "4.4.3" + resolved "https://registry.yarnpkg.com/eth-block-tracker/-/eth-block-tracker-4.4.3.tgz#766a0a0eb4a52c867a28328e9ae21353812cf626" + integrity sha512-A8tG4Z4iNg4mw5tP1Vung9N9IjgMNqpiMoJ/FouSFwNCGHv2X0mmOYwtQOJzki6XN7r7Tyo01S29p7b224I4jw== + dependencies: + "@babel/plugin-transform-runtime" "^7.5.5" + "@babel/runtime" "^7.5.5" + eth-query "^2.1.0" + json-rpc-random-id "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-errors@^1.0.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-1.1.1.tgz#148377ef55155585981c21ff574a8937f9d6991f" + integrity sha512-WT5shJ5KfNqHi9jOZD+ID8I1kuYWNrigtZat7GOQkvwo99f8SzAVaEcWhJUv656WiZOAg3P1RiJQANtUmDmbIg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-json-rpc-errors@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/eth-json-rpc-errors/-/eth-json-rpc-errors-2.0.2.tgz#c1965de0301fe941c058e928bebaba2e1285e3c4" + integrity sha512-uBCRM2w2ewusRHGxN8JhcuOb2RN3ueAOYH/0BhqdFmQkZx5lj5+fLKTz0mIVOzd4FG5/kUksCzCD7eTEim6gaA== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-json-rpc-filters@^4.0.2, eth-json-rpc-filters@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-filters/-/eth-json-rpc-filters-4.2.1.tgz#82204a13c99927dbf42cbb3962846650c6281f33" + integrity sha512-tPfohezq8mSmwa47xvq6PGzBDLZ0njWJMB1J+OPuv+n+1WkWDlf3l3tqJXpq96RxhrzK2q7wiweRS5aGIzpq4Q== + dependencies: + await-semaphore "^0.1.3" + eth-json-rpc-middleware "^6.0.0" + eth-query "^2.1.2" + json-rpc-engine "^5.3.0" + lodash.flatmap "^4.5.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-infura@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-3.2.1.tgz#26702a821067862b72d979c016fd611502c6057f" + integrity sha512-W7zR4DZvyTn23Bxc0EWsq4XGDdD63+XPUCEhV2zQvQGavDVC4ZpFDK4k99qN7bd7/fjj37+rxmuBOBeIqCA5Mw== + dependencies: + cross-fetch "^2.1.1" + eth-json-rpc-middleware "^1.5.0" + json-rpc-engine "^3.4.0" + json-rpc-error "^2.0.0" + +eth-json-rpc-infura@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-infura/-/eth-json-rpc-infura-4.1.0.tgz#623478375ba65e4304dea529ed69e8bd7938270d" + integrity sha512-DFYitKovzVlCdUulEccdm4g6k/vnvyByuw7rd5OoWDBSIiaeinI8Z/SntLjSIs2c+YvE20DGwk/GLwZGCWDN1Q== + dependencies: + eth-json-rpc-middleware "^4.4.0" + eth-rpc-errors "^3.0.0" + json-rpc-engine "^5.1.3" + node-fetch "^2.6.0" + +eth-json-rpc-middleware@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-1.6.0.tgz#5c9d4c28f745ccb01630f0300ba945f4bef9593f" + integrity sha512-tDVCTlrUvdqHKqivYMjtFZsdD7TtpNLBCfKAcOpaVs7orBMS/A8HWro6dIzNtTZIR05FAbJ3bioFOnZpuCew9Q== + dependencies: + async "^2.5.0" + eth-query "^2.1.2" + eth-tx-summary "^3.1.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.3" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.1.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^3.6.0" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + tape "^4.6.3" + +eth-json-rpc-middleware@^4.1.1, eth-json-rpc-middleware@^4.1.5, eth-json-rpc-middleware@^4.4.0: + version "4.4.1" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-4.4.1.tgz#07d3dd0724c24a8d31e4a172ee96271da71b4228" + integrity sha512-yoSuRgEYYGFdVeZg3poWOwAlRI+MoBIltmOB86MtpoZjvLbou9EB/qWMOWSmH2ryCWLW97VYY6NWsmWm3OAA7A== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-json-rpc-errors "^1.0.1" + eth-query "^2.1.2" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.7" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.6.0" + fetch-ponyfill "^4.0.0" + json-rpc-engine "^5.1.3" + json-stable-stringify "^1.0.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-middleware@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-5.1.0.tgz#affc63ddb31205e4b2f2c451571902031dad70fc" + integrity sha512-0uq8nWgHWLKA0sMhVqViue3vSEBVuQXyk2yzjhe8GSo/dGpJUtmYN1DvDF1LQtEhHI4N/G6MKPbiR/aWSRkPmg== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.6.0" + ethereumjs-tx "^1.3.7" + ethereumjs-util "^5.1.2" + ethereumjs-vm "^2.6.0" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-json-rpc-middleware@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/eth-json-rpc-middleware/-/eth-json-rpc-middleware-6.0.0.tgz#4fe16928b34231a2537856f08a5ebbc3d0c31175" + integrity sha512-qqBfLU2Uq1Ou15Wox1s+NX05S9OcAEL4JZ04VZox2NS0U+RtCMjSxzXhLFWekdShUPZ+P8ax3zCO2xcPrp6XJQ== + dependencies: + btoa "^1.2.1" + clone "^2.1.1" + eth-query "^2.1.2" + eth-rpc-errors "^3.0.0" + eth-sig-util "^1.4.2" + ethereumjs-util "^5.1.2" + json-rpc-engine "^5.3.0" + json-stable-stringify "^1.0.1" + node-fetch "^2.6.1" + pify "^3.0.0" + safe-event-emitter "^1.0.1" + +eth-lib@0.2.7: + version "0.2.7" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.7.tgz#2f93f17b1e23aec3759cd4a3fe20c1286a3fc1ca" + integrity sha1-L5Pxex4jrsN1nNSj/iDBKGo/wco= + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-lib@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/eth-lib/-/eth-lib-0.2.8.tgz#b194058bef4b220ad12ea497431d6cb6aa0623c8" + integrity sha512-ArJ7x1WcWOlSpzdoTBX8vkwlkSQ85CjjifSZtV4co64vWxSV8geWfPI9x4SVYu3DSxnX4yWFVTtGL+j9DUFLNw== + dependencies: + bn.js "^4.11.6" + elliptic "^6.4.0" + xhr-request-promise "^0.1.2" + +eth-provider@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/eth-provider/-/eth-provider-0.2.5.tgz#2c06b8c190bb76c83f0f5002773a7d516a9aac68" + integrity sha512-brZFNAYY5Js8yBeyk/ukOJQpClvOXrWFI2A+4HJrBu7rPuUIGHiQ7zmbyhYaRg5Xvkkyi9vw5Fvlt/8I6xvHDQ== + dependencies: + ethereum-provider "0.0.6" + oboe "2.1.4" + uuid "3.3.2" + ws "7.1.2" + xhr2-cookies "1.1.0" + +eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e" + integrity sha1-1nQdkAAQa1FRDHLbktY2VFam2l4= + dependencies: + json-rpc-random-id "^1.0.0" + xtend "^4.0.1" + +eth-rpc-errors@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/eth-rpc-errors/-/eth-rpc-errors-3.0.0.tgz#d7b22653c70dbf9defd4ef490fd08fe70608ca10" + integrity sha512-iPPNHPrLwUlR9xCSYm7HHQjWBasor3+KZfRvwEWxMz3ca0yqnlBeJrnyphkGIXZ4J7AMAaOLmwy4AWhnxOiLxg== + dependencies: + fast-safe-stringify "^2.0.6" + +eth-sig-util@2.5.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-2.5.3.tgz#6938308b38226e0b3085435474900b03036abcbe" + integrity sha512-KpXbCKmmBUNUTGh9MRKmNkIPietfhzBqqYqysDavLseIiMUGl95k6UcPEkALAZlj41e9E6yioYXc1PC333RKqw== + dependencies: + buffer "^5.2.1" + elliptic "^6.4.0" + ethereumjs-abi "0.6.5" + ethereumjs-util "^5.1.1" + tweetnacl "^1.0.0" + tweetnacl-util "^0.15.0" + +eth-sig-util@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/eth-sig-util/-/eth-sig-util-1.4.2.tgz#8d958202c7edbaae839707fba6f09ff327606210" + integrity sha1-jZWCAsftuq6Dlwf7pvCf8ydgYhA= + dependencies: + ethereumjs-abi "git+https://github.com/ethereumjs/ethereumjs-abi.git" + ethereumjs-util "^5.1.1" + +eth-tx-summary@^3.1.2: + version "3.2.4" + resolved "https://registry.yarnpkg.com/eth-tx-summary/-/eth-tx-summary-3.2.4.tgz#e10eb95eb57cdfe549bf29f97f1e4f1db679035c" + integrity sha512-NtlDnaVZah146Rm8HMRUNMgIwG/ED4jiqk0TME9zFheMl1jOp6jL1m0NKGjJwehXQ6ZKCPr16MTr+qspKpEXNg== + dependencies: + async "^2.1.2" + clone "^2.0.0" + concat-stream "^1.5.1" + end-of-stream "^1.1.0" + eth-query "^2.0.2" + ethereumjs-block "^1.4.1" + ethereumjs-tx "^1.1.1" + ethereumjs-util "^5.0.1" + ethereumjs-vm "^2.6.0" + through2 "^2.0.3" + +ethereum-bloom-filters@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/ethereum-bloom-filters/-/ethereum-bloom-filters-1.0.7.tgz#b7b80735e385dbb7f944ce6b4533e24511306060" + integrity sha512-cDcJJSJ9GMAcURiAWO3DxIEhTL/uWqlQnvgKpuYQzYPrt/izuGU+1ntQmHt0IRq6ADoSYHFnB+aCEFIldjhkMQ== + dependencies: + js-sha3 "^0.8.0" + +ethereum-checksum-address@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ethereum-checksum-address/-/ethereum-checksum-address-0.0.2.tgz#46fcb2d962dacd1ed49d7b464408ec26fd183209" + integrity sha512-GAb7mPvGgcfi1j+Bsnwm9af9Z7dLUKp+5cFm88+kMrKACfh9gLatGLVVK5pSGEG2pOGfrmqCRcuh3RtMjIg8GQ== + dependencies: + keccak256 "^1.0.0" + meow "^5.0.0" + +ethereum-common@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.2.0.tgz#13bf966131cce1eeade62a1b434249bb4cb120ca" + integrity sha512-XOnAR/3rntJgbCdGhqdaLIxDLWKLmsZOGhHdBKadEr6gEnJLH52k93Ou+TUdFaPN3hJc3isBZBal3U/XZ15abA== + +ethereum-common@^0.0.18: + version "0.0.18" + resolved "https://registry.yarnpkg.com/ethereum-common/-/ethereum-common-0.0.18.tgz#2fdc3576f232903358976eb39da783213ff9523f" + integrity sha1-L9w1dvIykDNYl26znaeDIT/5Uj8= + +ethereum-cryptography@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ethereum-cryptography/-/ethereum-cryptography-0.1.3.tgz#8d6143cfc3d74bf79bbd8edecdf29e4ae20dd191" + integrity sha512-w8/4x1SGGzc+tO97TASLja6SLd3fRIK2tLVcV2Gx4IB21hE19atll5Cq9o3d0ZmAYC/8aw0ipieTSiekAea4SQ== + dependencies: + "@types/pbkdf2" "^3.0.0" + "@types/secp256k1" "^4.0.1" + blakejs "^1.1.0" + browserify-aes "^1.2.0" + bs58check "^2.1.2" + create-hash "^1.2.0" + create-hmac "^1.1.7" + hash.js "^1.1.7" + keccak "^3.0.0" + pbkdf2 "^3.0.17" + randombytes "^2.1.0" + safe-buffer "^5.1.2" + scrypt-js "^3.0.0" + secp256k1 "^4.0.1" + setimmediate "^1.0.5" + +ethereum-private-key-to-address@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/ethereum-private-key-to-address/-/ethereum-private-key-to-address-0.0.3.tgz#1f1dccaefd1198c2dcde55501f331a846bd0aad0" + integrity sha512-P+z9eFlgOezxogEpY1sQR155U4xFmQUWVxKzIJa5BL05Gs7zL0sYuyQuSAme8LBYGQ6p6AwconiMDauf4LbqyA== + dependencies: + ethereum-private-key-to-public-key "0.0.2" + ethereum-public-key-to-address "0.0.1" + meow "^5.0.0" + +ethereum-private-key-to-public-key@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/ethereum-private-key-to-public-key/-/ethereum-private-key-to-public-key-0.0.2.tgz#bb5803aad43df2692e0d7b4c9eaa224eec2a39cb" + integrity sha512-WKwFspLS5IdpV1rBUmWSG2xtIDV7YMpAG/uSjtV9kDzBU6hpSzoqg6R/e1iEfHkOr/eae+NtDTpwzXRtSMDvhw== + dependencies: + meow "^5.0.0" + secp256k1 "^3.7.1" + +ethereum-provider@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/ethereum-provider/-/ethereum-provider-0.0.6.tgz#6f5a0427c34872339667d9904a8692e8992e6bf5" + integrity sha512-DqtdXNHGi/QtOjEovNOegVVQTd8/NnH9rP27R5SU3j2LKECZbcLGIZ3Z9Ln1SDaeUC5YJGJFYQCUUjfIi7NNyQ== + +ethereum-public-key-to-address@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/ethereum-public-key-to-address/-/ethereum-public-key-to-address-0.0.1.tgz#3f0237687d9c2217234dc5683f3eb580abf3f6ce" + integrity sha512-X78x/VBluHUdrYpZunoXJ48luXTaUiUK4ImPjTjI+XiS24+jUR5WFCpm9wCNbLYP6/ZCJ+lwuYormXSjt8rrbw== + dependencies: + ethereum-checksum-address "0.0.2" + keccak256 "^1.0.0" + meow "^5.0.0" + secp256k1 "^3.7.1" + +ethereumjs-abi@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/ethereumjs-abi/-/ethereumjs-abi-0.6.5.tgz#5a637ef16ab43473fa72a29ad90871405b3f5241" + integrity sha1-WmN+8Wq0NHP6cqKa2QhxQFs/UkE= + dependencies: + bn.js "^4.10.0" + ethereumjs-util "^4.3.0" + +"ethereumjs-abi@git+https://github.com/ethereumjs/ethereumjs-abi.git": + version "0.6.8" + resolved "git+https://github.com/ethereumjs/ethereumjs-abi.git#1ce6a1d64235fabe2aaf827fd606def55693508f" + dependencies: + bn.js "^4.11.8" + ethereumjs-util "^6.0.0" + +ethereumjs-account@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/ethereumjs-account/-/ethereumjs-account-2.0.5.tgz#eeafc62de544cb07b0ee44b10f572c9c49e00a84" + integrity sha512-bgDojnXGjhMwo6eXQC0bY6UK2liSFUSMwwylOmQvZbSl/D7NXQ3+vrGO46ZeOgjGfxXmgIeVNDIiHw7fNZM4VA== + dependencies: + ethereumjs-util "^5.0.0" + rlp "^2.0.0" + safe-buffer "^5.1.1" + +ethereumjs-block@^1.2.2, ethereumjs-block@^1.4.1, ethereumjs-block@^1.6.0: + version "1.7.1" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-1.7.1.tgz#78b88e6cc56de29a6b4884ee75379b6860333c3f" + integrity sha512-B+sSdtqm78fmKkBq78/QLKJbu/4Ts4P2KFISdgcuZUPDm9x+N7qgBPIIFUGbaakQh8bzuquiRVbdmvPKqbILRg== + dependencies: + async "^2.0.1" + ethereum-common "0.2.0" + ethereumjs-tx "^1.2.2" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-block@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/ethereumjs-block/-/ethereumjs-block-2.2.2.tgz#c7654be7e22df489fda206139ecd63e2e9c04965" + integrity sha512-2p49ifhek3h2zeg/+da6XpdFR3GlqY3BIEiqxGF8j9aSRIgkb7M1Ky+yULBKJOu8PAZxfhsYA+HxUk2aCQp3vg== + dependencies: + async "^2.0.1" + ethereumjs-common "^1.5.0" + ethereumjs-tx "^2.1.1" + ethereumjs-util "^5.0.0" + merkle-patricia-tree "^2.1.2" + +ethereumjs-common@^1.1.0, ethereumjs-common@^1.5.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ethereumjs-common/-/ethereumjs-common-1.5.2.tgz#2065dbe9214e850f2e955a80e650cb6999066979" + integrity sha512-hTfZjwGX52GS2jcVO6E2sx4YuFnf0Fhp5ylo4pEPhEffNln7vS59Hr5sLnp3/QCazFLluuBZ+FZ6J5HTp0EqCA== + +ethereumjs-tx@^1.1.1, ethereumjs-tx@^1.2.0, ethereumjs-tx@^1.2.2, ethereumjs-tx@^1.3.3, ethereumjs-tx@^1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-1.3.7.tgz#88323a2d875b10549b8347e09f4862b546f3d89a" + integrity sha512-wvLMxzt1RPhAQ9Yi3/HKZTn0FZYpnsmQdbKYfUUpi4j1SEIcbkd9tndVjcPrufY3V7j2IebOpC00Zp2P/Ay2kA== dependencies: - estraverse "^4.1.0" + ethereum-common "^0.0.18" + ethereumjs-util "^5.0.0" -estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== +ethereumjs-tx@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ethereumjs-tx/-/ethereumjs-tx-2.1.2.tgz#5dfe7688bf177b45c9a23f86cf9104d47ea35fed" + integrity sha512-zZEK1onCeiORb0wyCXUvg94Ve5It/K6GD1K+26KfFKodiBiS6d9lfCXlUKGBBdQ+bv7Day+JK0tj1K+BeNFRAw== + dependencies: + ethereumjs-common "^1.5.0" + ethereumjs-util "^6.0.0" -estraverse@^5.1.0: +ethereumjs-util@5.2.0: version "5.2.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ== - -estree-walker@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" - integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz#3e0c0d1741471acf1036052d048623dee54ad642" + integrity sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + ethjs-util "^0.1.3" + keccak "^1.0.2" + rlp "^2.0.0" + safe-buffer "^5.1.1" + secp256k1 "^3.0.1" -estree-walker@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-1.0.1.tgz#31bc5d612c96b704106b477e6dd5d8aa138cb700" - integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== +ethereumjs-util@^4.3.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-4.5.1.tgz#f4bf9b3b515a484e3cc8781d61d9d980f7c83bd0" + integrity sha512-WrckOZ7uBnei4+AKimpuF1B3Fv25OmoRgmYCpGsP7u8PFxXAmAgiJSYT2kRWnt6fVIlKaQlZvuwXp7PIrmn3/w== + dependencies: + bn.js "^4.8.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + rlp "^2.0.0" -estree-walker@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.1.tgz#f8e030fb21cefa183b44b7ad516b747434e7a3e0" - integrity sha512-tF0hv+Yi2Ot1cwj9eYHtxC0jB9bmjacjQs6ZBTj82H8JwUywFuc+7E83NWfNMwHXZc11mjfFcVXPe9gEP4B8dg== +ethereumjs-util@^5.0.0, ethereumjs-util@^5.0.1, ethereumjs-util@^5.1.1, ethereumjs-util@^5.1.2, ethereumjs-util@^5.1.5: + version "5.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-5.2.1.tgz#a833f0e5fca7e5b361384dc76301a721f537bf65" + integrity sha512-v3kT+7zdyCm1HIqWlLNrHGqHGLpGYIhjeHxQjnDXjLT2FyGJDsd3LWMYUo7pAFRrk86CR3nUJfhC81CCoJNNGQ== + dependencies: + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "^0.1.3" + rlp "^2.0.0" + safe-buffer "^5.1.1" -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +ethereumjs-util@^6.0.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-6.2.1.tgz#fcb4e4dd5ceacb9d2305426ab1a5cd93e3163b69" + integrity sha512-W2Ktez4L01Vexijrm5EB6w7dg4n/TgpoYU4avuT5T3Vmnw/eCRtiBrJfQYS/DCSvDIOLn2k57GcHdeBcgVxAqw== + dependencies: + "@types/bn.js" "^4.11.3" + bn.js "^4.11.0" + create-hash "^1.1.2" + elliptic "^6.5.2" + ethereum-cryptography "^0.1.3" + ethjs-util "0.1.6" + rlp "^2.2.3" + +ethereumjs-vm@^2.1.0, ethereumjs-vm@^2.3.4, ethereumjs-vm@^2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-2.6.0.tgz#76243ed8de031b408793ac33907fb3407fe400c6" + integrity sha512-r/XIUik/ynGbxS3y+mvGnbOKnuLo40V5Mj1J25+HEO63aWYREIqvWeRO/hnROlMBE5WoniQmPmhiaN0ctiHaXw== + dependencies: + async "^2.1.2" + async-eventemitter "^0.2.2" + ethereumjs-account "^2.0.3" + ethereumjs-block "~2.2.0" + ethereumjs-common "^1.1.0" + ethereumjs-util "^6.0.0" + fake-merkle-patricia-tree "^1.0.1" + functional-red-black-tree "^1.0.1" + merkle-patricia-tree "^2.3.2" + rustbn.js "~0.2.0" + safe-buffer "^5.1.1" -etag@^1.8.1, etag@~1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= +ethers@4.0.47: + version "4.0.47" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.47.tgz#91b9cd80473b1136dd547095ff9171bd1fc68c85" + integrity sha512-hssRYhngV4hiDNeZmVU/k5/E8xmLG8UpcNUzg6mb7lqhgpFPH/t7nuv20RjRrEf0gblzvi2XwR5Te+V3ZFc9pQ== + dependencies: + aes-js "3.0.0" + bn.js "^4.4.0" + elliptic "6.5.2" + hash.js "1.1.3" + js-sha3 "0.5.7" + scrypt-js "2.0.4" + setimmediate "1.0.4" + uuid "2.0.1" + xmlhttprequest "1.8.0" ethers@^5.0.0, ethers@^5.0.7: version "5.0.8" @@ -5572,51 +7604,72 @@ ethers@^5.0.0, ethers@^5.0.7: "@ethersproject/wordlists" "^5.0.0" ethers@^5.0.16: - version "5.0.16" - resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.16.tgz#2d261ce844f37f0cff5a4db4a11bf03a058788dd" - integrity sha512-MsE/N07DRAq6LtvtXUougAPouGoLMWMoJ7iD4OoYXtyZpXG9UsWYPfvCrIEYeUhGBWOeaHBamrT5X9dQQ2NYqQ== - dependencies: - "@ethersproject/abi" "5.0.7" - "@ethersproject/abstract-provider" "5.0.5" - "@ethersproject/abstract-signer" "5.0.6" - "@ethersproject/address" "5.0.5" - "@ethersproject/base64" "5.0.4" - "@ethersproject/basex" "5.0.4" - "@ethersproject/bignumber" "5.0.8" - "@ethersproject/bytes" "5.0.5" - "@ethersproject/constants" "5.0.5" - "@ethersproject/contracts" "5.0.5" - "@ethersproject/hash" "5.0.5" - "@ethersproject/hdnode" "5.0.5" - "@ethersproject/json-wallets" "5.0.7" - "@ethersproject/keccak256" "5.0.4" - "@ethersproject/logger" "5.0.6" - "@ethersproject/networks" "5.0.4" - "@ethersproject/pbkdf2" "5.0.4" - "@ethersproject/properties" "5.0.4" - "@ethersproject/providers" "5.0.11" - "@ethersproject/random" "5.0.4" - "@ethersproject/rlp" "5.0.4" - "@ethersproject/sha2" "5.0.4" - "@ethersproject/signing-key" "5.0.5" - "@ethersproject/solidity" "5.0.5" - "@ethersproject/strings" "5.0.5" - "@ethersproject/transactions" "5.0.6" - "@ethersproject/units" "5.0.5" - "@ethersproject/wallet" "5.0.5" - "@ethersproject/web" "5.0.8" - "@ethersproject/wordlists" "5.0.5" + version "5.0.24" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.0.24.tgz#fbb8e4d35070d134f2eb846c07500b8c0eaef6d3" + integrity sha512-77CEtVC88fJGEhxGXRvQqAEH6e2A+ZFiv2FBT6ikXndlty5sw6vMatAhg1v+w3CaaGZOf1CP81jl4Mc8Zrj08A== + dependencies: + "@ethersproject/abi" "5.0.9" + "@ethersproject/abstract-provider" "5.0.7" + "@ethersproject/abstract-signer" "5.0.9" + "@ethersproject/address" "5.0.8" + "@ethersproject/base64" "5.0.6" + "@ethersproject/basex" "5.0.6" + "@ethersproject/bignumber" "5.0.12" + "@ethersproject/bytes" "5.0.8" + "@ethersproject/constants" "5.0.7" + "@ethersproject/contracts" "5.0.8" + "@ethersproject/hash" "5.0.9" + "@ethersproject/hdnode" "5.0.7" + "@ethersproject/json-wallets" "5.0.9" + "@ethersproject/keccak256" "5.0.6" + "@ethersproject/logger" "5.0.8" + "@ethersproject/networks" "5.0.6" + "@ethersproject/pbkdf2" "5.0.6" + "@ethersproject/properties" "5.0.6" + "@ethersproject/providers" "5.0.17" + "@ethersproject/random" "5.0.6" + "@ethersproject/rlp" "5.0.6" + "@ethersproject/sha2" "5.0.6" + "@ethersproject/signing-key" "5.0.7" + "@ethersproject/solidity" "5.0.7" + "@ethersproject/strings" "5.0.7" + "@ethersproject/transactions" "5.0.8" + "@ethersproject/units" "5.0.8" + "@ethersproject/wallet" "5.0.9" + "@ethersproject/web" "5.0.11" + "@ethersproject/wordlists" "5.0.7" + +ethjs-unit@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699" + integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk= + dependencies: + bn.js "4.11.6" + number-to-bn "1.7.0" -eventemitter3@^3.1.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" - integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== +ethjs-util@0.1.6, ethjs-util@^0.1.3: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ethjs-util/-/ethjs-util-0.1.6.tgz#f308b62f185f9fe6237132fb2a9818866a5cd536" + integrity sha512-CUnVOQq7gSpDHZVVrQW8ExxUETWrnrvXYvYz55wOU8Uj4VCgw56XC2B/fVqQN+f7gmrnRHSLVnFAwsCuNwji8w== + dependencies: + is-hex-prefixed "1.0.0" + strip-hex-prefix "1.0.0" + +eventemitter3@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" + integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== -eventemitter3@^4.0.0, eventemitter3@^4.0.4: +eventemitter3@4.0.4, eventemitter3@^4.0.0, eventemitter3@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== +eventemitter3@^3.1.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7" + integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== + events@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/events/-/events-3.2.0.tgz#93b87c18f8efcd4202a461aec4dfc0556b639379" @@ -5769,6 +7822,13 @@ express@^4.16.3, express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" +ext@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A== + dependencies: + type "^2.0.0" + extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" @@ -5822,6 +7882,13 @@ extsprintf@^1.2.0: resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= +fake-merkle-patricia-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fake-merkle-patricia-tree/-/fake-merkle-patricia-tree-1.0.1.tgz#4b8c3acfb520afadf9860b1f14cd8ce3402cddd3" + integrity sha1-S4w6z7Ugr635hgsfFM2M40As3dM= + dependencies: + checkpoint-store "^1.1.0" + falafel@^2.1.0: version "2.2.4" resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.2.4.tgz#b5d86c060c2412a43166243cb1bce44d1abd2819" @@ -5832,7 +7899,7 @@ falafel@^2.1.0: isarray "^2.0.1" object-keys "^1.0.6" -fast-deep-equal@^3.1.1: +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== @@ -5864,7 +7931,7 @@ fast-redact@^2.0.0: resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-2.0.0.tgz#17bb8f5e1f56ecf4a38c8455985e5eab4c478431" integrity sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA== -fast-safe-stringify@^2.0.7: +fast-safe-stringify@^2.0.6, fast-safe-stringify@^2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== @@ -5895,6 +7962,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fetch-ponyfill@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/fetch-ponyfill/-/fetch-ponyfill-4.1.0.tgz#ae3ce5f732c645eab87e4ae8793414709b239893" + integrity sha1-rjzl9zLGReq4fkroeTQUcJsjmJM= + dependencies: + node-fetch "~1.7.1" + figgy-pudding@^3.5.1: version "3.5.2" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz#b4eee8148abb01dcf1d1ac34367d59e12fa61d6e" @@ -5984,7 +8058,7 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@^2.1.0: +find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= @@ -6050,11 +8124,25 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" +follow-redirects@1.5.10: + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== + dependencies: + debug "=3.1.0" + follow-redirects@^1.0.0: version "1.13.0" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.13.0.tgz#b42e8d93a2a7eea5ed88633676d6597bc8e384db" integrity sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA== +for-each@~0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -6079,6 +8167,13 @@ form-data@~2.3.2: combined-stream "^1.0.6" mime-types "^2.1.12" +fortmatic@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fortmatic/-/fortmatic-1.1.3.tgz#eaeb8b65677aaa245a67ff5f1b8b7f79380a9b23" + integrity sha512-70gPiTuwfqEQNg4fFK5MVf3gRAW+mo2tHdiMSEt2OLKcoHWrAn63e/r245dPJAw4Qvz7PhkYF/bTx6ga50zWog== + dependencies: + "@babel/runtime" "7.3.4" + forwarded@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" @@ -6139,7 +8234,7 @@ fsevents@^2.1.2, fsevents@~2.1.2: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== -function-bind@^1.1.1: +function-bind@^1.1.1, function-bind@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== @@ -6220,7 +8315,7 @@ glob-to-regexp@^0.3.0: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs= -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.1.6: version "7.1.6" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== @@ -6268,6 +8363,14 @@ global-prefix@^3.0.0: kind-of "^6.0.2" which "^1.3.1" +global@~4.3.0: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8= + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -6280,6 +8383,11 @@ globals@^12.1.0: dependencies: type-fest "^0.8.1" +globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ== + globby@6.1.0, globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" @@ -6420,7 +8528,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.0, has@^1.0.1, has@^1.0.3: +has@^1.0.0, has@^1.0.1, has@^1.0.3, has@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -6444,7 +8552,7 @@ hash.js@1.1.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hash.js@^1.0.0, hash.js@^1.0.3: +hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3, hash.js@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== @@ -6471,6 +8579,14 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + homedir-polyfill@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" @@ -6638,6 +8754,11 @@ http-errors@~1.7.2: statuses ">= 1.5.0 < 2" toidentifier "1.0.0" +http-https@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/http-https/-/http-https-1.0.0.tgz#2f908dd5f1db4068c058cd6e6d4ce392c913389b" + integrity sha1-L5CN1fHbQGjAWM1ubUzjkskTOJs= + http-parser-js@>=0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz#da2e31d237b393aae72ace43882dd7e270a8ff77" @@ -6717,6 +8838,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" +iconv-lite@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.2.tgz#ce13d1875b0c3a674bd6a04b7f76b01b1b6ded01" + integrity sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + icss-replace-symbols@1.1.0, icss-replace-symbols@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" @@ -6742,6 +8870,11 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== +immediate@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266" + integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q== + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -6779,6 +8912,11 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= +indent-string@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + indent-string@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" @@ -6802,7 +8940,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -6948,6 +9086,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-buffer@2.0.4, is-buffer@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.4.tgz#3e572f23c8411a5cfd9557c849e3665e0b290623" + integrity sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A== + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -6960,6 +9103,11 @@ is-builtin-module@^3.0.0: dependencies: builtin-modules "^3.0.0" +is-callable@^1.1.3: + version "1.2.2" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" + integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== + is-callable@^1.1.4, is-callable@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz#83336560b54a38e35e3a2df7afd0454d691468bb" @@ -7056,6 +9204,16 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= +is-finite@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w== + +is-fn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fn/-/is-fn-1.0.0.tgz#9543d5de7bcf5b08a22ec8a20bae6e286d510d8c" + integrity sha1-lUPV3nvPWwiiLsiiC65uKG1RDYw= + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -7066,6 +9224,11 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== +is-function@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== + is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" @@ -7085,6 +9248,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-hex-prefixed@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-hex-prefixed/-/is-hex-prefixed-1.0.0.tgz#7d8d37e6ad77e5d127148913c573e082d777f554" + integrity sha1-fY035q135dEnFIkTxXPggtd39VQ= + is-html@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-html/-/is-html-1.1.0.tgz#e04f1c18d39485111396f9a0273eab51af218464" @@ -7097,6 +9265,11 @@ is-module@^1.0.0: resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" integrity sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE= +is-negative-zero@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461" + integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE= + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -7133,6 +9306,11 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= + is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -7152,19 +9330,26 @@ is-reference@^1.1.2, is-reference@^1.2.1: dependencies: "@types/estree" "*" -is-regex@^1.0.4, is-regex@^1.1.0: +is-regex@^1.0.4, is-regex@^1.1.0, is-regex@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== dependencies: has-symbols "^1.0.1" +is-regex@~1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" + integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== + dependencies: + has "^1.0.3" + is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-stream@^1.1.0: +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -7188,7 +9373,7 @@ is-symbol@^1.0.2: dependencies: has-symbols "^1.0.1" -is-typedarray@^1.0.0, is-typedarray@~1.0.0: +is-typedarray@1.0.0, is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= @@ -7215,6 +9400,11 @@ is-wsl@^2.1.1, is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -7701,11 +9891,21 @@ js-sha3@0.5.7: resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= +js-sha3@0.8.0, js-sha3@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" + integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + js-yaml@^3.10.0, js-yaml@^3.13.1: version "3.14.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482" @@ -7788,6 +9988,11 @@ jsdom@^16.2.2: ws "^7.2.3" xml-name-validator "^3.0.0" +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + jsesc@^2.5.1: version "2.5.2" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4" @@ -7808,6 +10013,46 @@ json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== +json-rpc-engine@^3.4.0, json-rpc-engine@^3.6.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-3.8.0.tgz#9d4ff447241792e1d0a232f6ef927302bb0c62a9" + integrity sha512-6QNcvm2gFuuK4TKU1uwfH0Qd/cOSb9c1lls0gbnIhciktIUQJwz6NQNAW4B1KiGPenv7IKu97V222Yo1bNhGuA== + dependencies: + async "^2.0.1" + babel-preset-env "^1.7.0" + babelify "^7.3.0" + json-rpc-error "^2.0.0" + promise-to-callback "^1.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-engine@^5.1.3, json-rpc-engine@^5.1.8, json-rpc-engine@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/json-rpc-engine/-/json-rpc-engine-5.3.0.tgz#7dc7291766b28766ebda33eb6d3f4c6301c44ff4" + integrity sha512-+diJ9s8rxB+fbJhT7ZEf8r8spaLRignLd8jTgQ/h5JSGppAHGtNMZtCoabipCaleR1B3GTGxbXBOqhaJSGmPGQ== + dependencies: + eth-rpc-errors "^3.0.0" + safe-event-emitter "^1.0.1" + +json-rpc-error@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/json-rpc-error/-/json-rpc-error-2.0.0.tgz#a7af9c202838b5e905c7250e547f1aff77258a02" + integrity sha1-p6+cICg4tekFxyUOVH8a/3cligI= + dependencies: + inherits "^2.0.1" + +json-rpc-middleware-stream@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/json-rpc-middleware-stream/-/json-rpc-middleware-stream-2.1.1.tgz#06e5409e201e7ddeae47bef29f7059eafd4d5325" + integrity sha512-WZheufPN+/RKkjXQP3lK5tFYblqG0n+oYv5qpammwwY2vsJRB7mM4Txhr4ajzvYEZi1UkENnplrmaYiqaqafaA== + dependencies: + readable-stream "^2.3.3" + safe-event-emitter "^1.0.1" + +json-rpc-random-id@^1.0.0, json-rpc-random-id@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-rpc-random-id/-/json-rpc-random-id-1.0.1.tgz#ba49d96aded1444dbb8da3d203748acbbcdec8c8" + integrity sha1-uknZat7RRE27jaPSA3SKy7zeyMg= + json-schema-traverse@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" @@ -7823,6 +10068,13 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= +json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" @@ -7840,6 +10092,11 @@ json5@2.x, json5@^2.1.2: dependencies: minimist "^1.2.5" +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= + json5@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" @@ -7847,6 +10104,11 @@ json5@^1.0.1: dependencies: minimist "^1.2.0" +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + jsonschema@^1.2.5: version "1.2.6" resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.2.6.tgz#52b0a8e9dc06bbae7295249d03e4b9faee8a0c0b" @@ -7867,6 +10129,32 @@ kebab-case@1.0.0: resolved "https://registry.yarnpkg.com/kebab-case/-/kebab-case-1.0.0.tgz#3f9e4990adcad0c686c0e701f7645868f75f91eb" integrity sha1-P55JkK3K0MaGwOcB92RYaPdfkes= +keccak256@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/keccak256/-/keccak256-1.0.0.tgz#1ba55ce78ed3d63fb7091d045469007da984171d" + integrity sha512-8qv2vJdQk+Aa2tFXo8zYodm+6DgXqUOqvNJhj1p1V2pxQJT1oNKxNF+zWfhtKXNLZdLvyxjB/dvd9GwcvTHSQQ== + dependencies: + bn.js "^4.11.8" + keccak "^1.4.0" + +keccak@^1.0.2, keccak@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-1.4.0.tgz#572f8a6dbee8e7b3aa421550f9e6408ca2186f80" + integrity sha512-eZVaCpblK5formjPjeTBik7TAg+pqnDrMHIffSvi9Lh7PQgM1+hSzakUeZFCk9DVVG0dacZJuaz2ntwlzZUIBw== + dependencies: + bindings "^1.2.1" + inherits "^2.0.3" + nan "^2.2.1" + safe-buffer "^5.1.0" + +keccak@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/keccak/-/keccak-3.0.1.tgz#ae30a0e94dbe43414f741375cff6d64c8bea0bff" + integrity sha512-epq90L9jlFWCW7+pQa6JOnKn2Xgl2mtI664seYR6MHskvI9agt7AnDqmAlp9TqU4/caMYbA08Hi5DMZAl5zdkA== + dependencies: + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + keyv@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.1.tgz#9fe703cb4a94d6d11729d320af033307efd02ee6" @@ -7918,6 +10206,56 @@ kleur@^4.1.1: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.3.tgz#8d262a56d79a137ee1b706e967c0b08a7fef4f4c" integrity sha512-H1tr8QP2PxFTNwAFM74Mui2b6ovcY9FoxJefgrwxY+OCJcq01k5nvhf4M/KnizzrJvLRap5STUy7dgDV35iUBw== +level-codec@~7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + integrity sha512-Ua/R9B9r3RasXdRmOtd+t9TCOEIIlts+TN/7XTT2unhDaL6sJn83S3rUyljbr6lVtw49N3/yA0HHjpV6Kzb2aQ== + +level-errors@^1.0.3: + version "1.1.2" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + integrity sha512-Sw/IJwWbPKF5Ai4Wz60B52yj0zYeqzObLh8k1Tk88jVmD51cJSKWSYpRyhVIvFzZdvsPqlH5wfhp/yxdsaQH4w== + dependencies: + errno "~0.1.1" + +level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + integrity sha512-/cLUpQduF6bNrWuAC4pwtUKA5t669pCsCi2XbmojG2tFeOr9j6ShtdDCtFFQO1DRt+EVZhx9gPzP9G2bUaG4ig== + dependencies: + errno "~0.1.1" + +level-iterator-stream@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + integrity sha1-5Dt4sagUPm+pek9IXrjqUwNS8u0= + dependencies: + inherits "^2.0.1" + level-errors "^1.0.3" + readable-stream "^1.0.33" + xtend "^4.0.0" + +level-ws@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/level-ws/-/level-ws-0.0.0.tgz#372e512177924a00424b0b43aef2bb42496d228b" + integrity sha1-Ny5RIXeSSgBCSwtDrvK7QkltIos= + dependencies: + readable-stream "~1.0.15" + xtend "~2.1.1" + +levelup@^1.2.1: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + integrity sha512-VVGHfKIlmw8w1XqpGOAGwq6sZm2WwWLmlDcULkKWQXEA5EopA8OBNJ2Ck2v6bdk8HeEZSbCSEgzXadyQFm76sQ== + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + leven@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2" @@ -7951,6 +10289,16 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz#ed47066bfe534d7e84c4c7b9998c2a75607d9357" @@ -7993,6 +10341,11 @@ lodash.clone@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= +lodash.flatmap@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.flatmap/-/lodash.flatmap-4.5.0.tgz#ef8cbf408f6e48268663345305c6acc0b778702e" + integrity sha1-74y/QI9uSCaGYzRTBcaswLd4cC4= + lodash.memoize@4.x, lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -8032,6 +10385,14 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lower-case@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.1.tgz#39eeb36e396115cc05e29422eaea9e692c9408c7" @@ -8066,6 +10427,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +ltgt@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU= + magic-string@^0.22.4: version "0.22.5" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.5.tgz#8e9cf5afddf44385c1da5bc2a6a0dbd10b03657e" @@ -8112,6 +10478,16 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= + +map-obj@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" + integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= + map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -8143,6 +10519,23 @@ media-typer@0.3.0: resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= +memdown@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/memdown/-/memdown-1.4.1.tgz#b4e4e192174664ffbae41361aa500f3119efe215" + integrity sha1-tOThkhdGZP+65BNhqlAPMRnv4hU= + dependencies: + abstract-leveldown "~2.7.1" + functional-red-black-tree "^1.0.1" + immediate "^3.2.3" + inherits "~2.0.1" + ltgt "~2.2.0" + safe-buffer "~5.1.1" + +memory-cache@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/memory-cache/-/memory-cache-0.2.0.tgz#7890b01d52c00c8ebc9d533e1f8eb17e3034871a" + integrity sha1-eJCwHVLADI68nVM+H46xfjA0hxo= + memory-fs@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz#3a9a20b8462523e447cfbc7e8bb80ed667bfc552" @@ -8159,6 +10552,21 @@ memory-fs@^0.5.0: errno "^0.1.3" readable-stream "^2.0.1" +meow@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" + integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== + dependencies: + camelcase-keys "^4.0.0" + decamelize-keys "^1.0.0" + loud-rejection "^1.0.0" + minimist-options "^3.0.1" + normalize-package-data "^2.3.4" + read-pkg-up "^3.0.0" + redent "^2.0.0" + trim-newlines "^2.0.0" + yargs-parser "^10.0.0" + merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -8181,6 +10589,20 @@ merge2@^1.2.3: resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== +merkle-patricia-tree@^2.1.2, merkle-patricia-tree@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/merkle-patricia-tree/-/merkle-patricia-tree-2.3.2.tgz#982ca1b5a0fde00eed2f6aeed1f9152860b8208a" + integrity sha512-81PW5m8oz/pz3GvsAwbauj7Y00rqm81Tzad77tHBwU7pIAtN+TJnMSOJhxBKflSVYhptMMb9RskhqHqrSm1V+g== + dependencies: + async "^1.4.2" + ethereumjs-util "^5.0.0" + level-ws "0.0.0" + levelup "^1.2.1" + memdown "^1.0.0" + readable-stream "^2.0.0" + rlp "^2.0.0" + semaphore ">=1.0.1" + methods@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" @@ -8263,6 +10685,13 @@ mimic-response@^3.1.0: resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU= + dependencies: + dom-walk "^0.1.0" + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -8280,7 +10709,15 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" -minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: +minimist-options@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" + integrity sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + +minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@~1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== @@ -8412,7 +10849,7 @@ mute-stream@0.0.8: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== -nan@^2.12.1: +nan@^2.12.1, nan@^2.14.0, nan@^2.14.1, nan@^2.2.1: version "2.14.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== @@ -8449,6 +10886,11 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +next-tick@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + nextgen-events@^0.14.5: version "0.14.6" resolved "https://registry.yarnpkg.com/nextgen-events/-/nextgen-events-0.14.6.tgz#945b3fc75951fe8c945f8455c35bf644a3a2c8b1" @@ -8477,11 +10919,29 @@ node-addon-api@^1.7.1: resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d" integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg== -node-fetch@^2.2.0: +node-addon-api@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" + integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== + +node-fetch@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.1.2.tgz#ab884e8e7e57e38a944753cec706f788d1768bb5" + integrity sha1-q4hOjn5X44qUR1POxwb3iNF2i7U= + +node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== +node-fetch@~1.7.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + integrity sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ== + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-forge@0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz#d624050edbb44874adca12bb9a52ec63cb782579" @@ -8492,6 +10952,16 @@ node-forge@^0.7.1: resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac" integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw== +node-gyp-build@^4.2.0: + version "4.2.3" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.2.3.tgz#ce6277f853835f718829efb47db20f3e4d9c4739" + integrity sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg== + +node-gyp-build@~3.7.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-3.7.0.tgz#daa77a4f547b9aed3e2aac779eaf151afd60ec8d" + integrity sha512-L/Eg02Epx6Si2NXmedx+Okg+4UHqmaf3TNcxd50SF9NQGcJaON3AtU++kax69XV7YWz4tUspqZSAsVofhFKG2w== + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -8548,12 +11018,19 @@ node-releases@^1.1.60: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.60.tgz#6948bdfce8286f0b5d0e5a88e8384e954dfe7084" integrity sha512-gsO4vjEdQaTusZAEebUWp2a5d7dF5DYoIpDG7WySnk7BuZDW+GPpHXoXXuYawRBr/9t5q54tirPz79kFIWg4dA== +normalize-hex@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/normalize-hex/-/normalize-hex-0.0.2.tgz#5491c43759db2f06b7168d8419f4925c271ab27e" + integrity sha512-E2dx7XJQnjsm6SkS4G6GGvIXRHaLeWAZE2D2N3aia+OpIif2UT8y4S0KCjrX3WmFDSeFnlNOp0FSHFjLeJ4SJw== + dependencies: + bn.js "^4.11.8" + normalize-html-whitespace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz#5e3c8e192f1b06c3b9eee4b7e7f28854c7601e34" integrity sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA== -normalize-package-data@^2.5.0: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== @@ -8606,6 +11083,14 @@ nth-check@^1.0.2, nth-check@~1.0.1: dependencies: boolbase "~1.0.0" +number-to-bn@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/number-to-bn/-/number-to-bn-1.7.0.tgz#bb3623592f7e5f9e0030b1977bd41a0c53fe1ea0" + integrity sha1-uzYjWS9+X54AMLGXe9QaDFP+HqA= + dependencies: + bn.js "4.11.6" + strip-hex-prefix "1.0.0" + nwsapi@^2.1.3, nwsapi@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7" @@ -8636,7 +11121,16 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4.0.1, object-assign@^4.1.1: +obj-multiplex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/obj-multiplex/-/obj-multiplex-1.0.0.tgz#2f2ae6bfd4ae11befe742ea9ea5b36636eabffc1" + integrity sha1-Lyrmv9SuEb7+dC6p6ls2Y26r/8E= + dependencies: + end-of-stream "^1.4.0" + once "^1.4.0" + readable-stream "^2.3.3" + +object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -8650,7 +11144,7 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.7.0: +object-inspect@^1.7.0, object-inspect@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0" integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA== @@ -8660,6 +11154,11 @@ object-inspect@~1.4.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.4.1.tgz#37ffb10e71adaf3748d05f713b4c9452f402cbc4" integrity sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw== +object-inspect@~1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" + integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== + object-is@^1.0.1: version "1.1.2" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" @@ -8673,6 +11172,11 @@ object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1 resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + integrity sha1-KKaq50KN0sOpLz2V8hM13SBOAzY= + object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" @@ -8715,6 +11219,30 @@ object.values@^1.1.0: function-bind "^1.1.1" has "^1.0.3" +oboe@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.4.tgz#20c88cdb0c15371bb04119257d4fdd34b0aa49f6" + integrity sha1-IMiM2wwVNxuwQRklfU/dNLCqSfY= + dependencies: + http-https "^1.0.0" + +oboe@2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/oboe/-/oboe-2.1.5.tgz#5554284c543a2266d7a38f17e073821fbde393cd" + integrity sha1-VVQoTFQ6ImbXo48X4HOCH73jk80= + dependencies: + http-https "^1.0.0" + +obs-store@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/obs-store/-/obs-store-4.0.3.tgz#b632ec7814baa604fae084a4c97e87c0b7a6d14c" + integrity sha512-+mm13kCRDv6IcvUDKTw0LIy5+dQhIktYaR/RwwZUFzOTi/fjMaNBnk42Adb94qZqJ00qWkjhQSZH7MXlKnTi8A== + dependencies: + readable-stream "^2.2.2" + safe-event-emitter "^1.0.1" + through2 "^2.0.3" + xtend "^4.0.1" + obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" @@ -8836,7 +11364,12 @@ os-browserify@^0.3.0: resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" integrity sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc= -os-tmpdir@~1.0.2: +os-homedir@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + +os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -9045,6 +11578,11 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5: pbkdf2 "^3.0.3" safe-buffer "^5.1.1" +parse-headers@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.3.tgz#5e8e7512383d140ba02f0c7aa9f49b4399c92515" + integrity sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA== + parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" @@ -9116,7 +11654,7 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== -path-is-absolute@^1.0.0: +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -9146,12 +11684,19 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pbkdf2@^3.0.3: +pbkdf2@^3.0.17, pbkdf2@^3.0.3: version "3.1.1" resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz#cb8724b0fada984596856d1a6ebafd3584654b94" integrity sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg== @@ -9162,6 +11707,16 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" +penpal@3.0.7: + version "3.0.7" + resolved "https://registry.yarnpkg.com/penpal/-/penpal-3.0.7.tgz#d252711ed93b30f1d867eb82342785b3a95f5f75" + integrity sha512-WSXiq5HnEvzvY05SHhaXcsviUmCvh4Ze8AiIZzvmdzaaYAAx4rx8c6Xq6+MaVDG/Nfve3VmGD8HyRP3CkPvPbQ== + +penpal@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/penpal/-/penpal-4.1.1.tgz#c96ccfdac441682acf617f6dcbc177a614e8302b" + integrity sha512-6d1f8khVLyBz3DnhLztbfjJ7+ANxdXRM2l6awpnCdEtbrmse4AGTsELOvGuNY0SU7xZw7heGbP6IikVvaVTOWw== + performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -9177,15 +11732,20 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1, picomatch@^2.2.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +pify@4.0.1, pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= -pify@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" - integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= pinkie-promise@^2.0.0: version "2.0.1" @@ -9254,6 +11814,18 @@ pn@^1.1.0: resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" integrity sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA== +pngjs@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" + integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== + +pocket-js-core@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/pocket-js-core/-/pocket-js-core-0.0.3.tgz#1ab278b9a6a5775e2bdc3c2c2e218057774061e4" + integrity sha512-OUTEvEVutdjLT6YyldvAlSebpBueUUWg2XKxGNt5u3QqrmLpBOOBmdDnGMNJ+lEwXtko+JqgwFq+HTi4g1QDVg== + dependencies: + axios "^0.18.0" + portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -9268,6 +11840,13 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +post-message-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/post-message-stream/-/post-message-stream-3.0.0.tgz#90d9f54bd209e6b6f5d74795b87588205b547048" + integrity sha1-kNn1S9IJ5rb110eVuHWIIFtUcEg= + dependencies: + readable-stream "^2.1.4" + postcss-calc@^7.0.1: version "7.0.3" resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.3.tgz#d65cca92a3c52bf27ad37a5f732e0587b74f1623" @@ -9629,6 +12208,16 @@ posthtml@^0.13.1: posthtml-parser "^0.4.2" posthtml-render "^1.2.3" +preact@10.4.1: + version "10.4.1" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.4.1.tgz#9b3ba020547673a231c6cf16f0fbaef0e8863431" + integrity sha512-WKrRpCSwL2t3tpOOGhf2WfTpcmbpxaWtDbdJdKdjd0aEiTkvOmS4NBkG6kzlaAHI9AkQ3iVqbFWM3Ei7mZ4o1Q== + +preact@^10.3.3: + version "10.5.2" + resolved "https://registry.yarnpkg.com/preact/-/preact-10.5.2.tgz#4c07c27f4239666840e0d637ec7c110cfcae181d" + integrity sha512-4y2Q6kMiJtMONMJR7z+o8P5tGkMzVItyy77AXGrUdusv+dk4jwoS3KrpCBkFloY2xsScRJYwZQZrx89tTjDkOw== + precise-commits@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/precise-commits/-/precise-commits-1.0.2.tgz#4659be01a9c3310f50ce51ddf913fead1d7cc940" @@ -9642,6 +12231,11 @@ precise-commits@^1.0.2: mri "^1.1.0" ora "^1.3.0" +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -9690,6 +12284,11 @@ printable-characters@^1.0.26, printable-characters@^1.0.42: resolved "https://registry.yarnpkg.com/printable-characters/-/printable-characters-1.0.42.tgz#3f18e977a9bd8eb37fcc4ff5659d7be90868b3d8" integrity sha1-Pxjpd6m9jrN/zE/1ZZ176Qhos9g= +private@^0.1.6, private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -9700,6 +12299,11 @@ process@^0.11.10: resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI= +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8= + progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -9710,6 +12314,14 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-to-callback@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7" + integrity sha1-XSp0kBC/tn2WNZj805YHRqaP7vc= + dependencies: + is-fn "^1.0.0" + set-immediate-shim "^1.0.1" + promise@^8.0.3: version "8.1.0" resolved "https://registry.yarnpkg.com/promise/-/promise-8.1.0.tgz#697c25c3dfe7435dd79fcd58c38a135888eaf05e" @@ -9824,6 +12436,19 @@ q@^1.1.2: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc= +qrcode@1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.4.4.tgz#f0c43568a7e7510a55efc3b88d9602f71963ea83" + integrity sha512-oLzEC5+NKFou9P0bMj5+v6Z40evexeE29Z9cummZXZ9QXyMr3lphkURzxjXgPJC5azpxcshoDWV1xE46z+/c3Q== + dependencies: + buffer "^5.4.3" + buffer-alloc "^1.2.0" + buffer-from "^1.1.1" + dijkstrajs "^1.0.1" + isarray "^2.0.1" + pngjs "^3.3.0" + yargs "^13.2.4" + qs@6.7.0: version "6.7.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" @@ -9834,6 +12459,15 @@ qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +query-string@^5.0.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/query-string/-/query-string-5.1.1.tgz#a78c012b71c17e05f2e3fa2319dd330682efb3cb" + integrity sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw== + dependencies: + decode-uri-component "^0.2.0" + object-assign "^4.1.0" + strict-uri-encode "^1.0.0" + querystring-es3@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -9854,6 +12488,11 @@ quick-format-unescaped@^4.0.1: resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz#437a5ea1a0b61deb7605f8ab6a8fd3858dbeb701" integrity sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A== +quick-lru@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" + integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= + quick-lru@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932" @@ -9884,7 +12523,7 @@ raf@^3.4.1: dependencies: performance-now "^2.1.0" -randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: +randombytes@2.1.0, randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5, randombytes@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== @@ -9899,6 +12538,11 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" +randomhex@0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/randomhex/-/randomhex-0.1.5.tgz#baceef982329091400f2a2912c6cd02f1094f585" + integrity sha1-us7vmCMpCRQA8qKRLGzQLxCU9YU= + range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" @@ -9946,7 +12590,7 @@ react-refresh@^0.8.3: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.3.tgz#721d4657672d400c5e3c75d063c4a85fb2d5d68f" integrity sha512-X8jZHc7nCMjaCqoU+V2I0cOhNW+QMBwSUkeXnTi8IPe6zaRWfn60ZzvFDZqWPfmSJfjub7dDW1SP0jaHWLu/hg== -react@^16.13.0, react@^16.13.1: +react@^16.12.0, react@^16.13.0, react@^16.13.1: version "16.13.1" resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e" integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w== @@ -9955,6 +12599,14 @@ react@^16.13.0, react@^16.13.1: object-assign "^4.1.1" prop-types "^15.6.2" +read-pkg-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" + integrity sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc= + dependencies: + find-up "^2.0.0" + read-pkg "^3.0.0" + read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" @@ -9964,6 +12616,15 @@ read-pkg-up@^7.0.1: read-pkg "^5.2.0" type-fest "^0.8.1" +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + read-pkg@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" @@ -9974,7 +12635,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.3, readable-stream@~2.3.6: version "2.3.7" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== @@ -9987,6 +12648,16 @@ read-pkg@^5.2.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" @@ -9996,6 +12667,16 @@ readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@~1.0.15: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" @@ -10019,6 +12700,14 @@ rechoir@^0.6.2: dependencies: resolve "^1.1.6" +redent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-2.0.0.tgz#c1b2007b42d57eb1389079b3c8333639d5e1ccaa" + integrity sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo= + dependencies: + indent-string "^3.0.0" + strip-indent "^2.0.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -10026,7 +12715,7 @@ regenerate-unicode-properties@^8.2.0: dependencies: regenerate "^1.4.0" -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.1" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz#cad92ad8e6b591773485fbe05a485caf4f457e6f" integrity sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A== @@ -10036,11 +12725,25 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== +regenerator-runtime@^0.12.0: + version "0.12.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz#fa1a71544764c036f8c49b13a08b2594c9f8a0de" + integrity sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg== + regenerator-runtime@^0.13.3, regenerator-runtime@^0.13.4: version "0.13.7" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz#cac2dacc8a1ea675feaabaeb8ae833898ae46f55" integrity sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew== +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regenerator-transform@^0.14.2: version "0.14.5" resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.5.tgz#c98da154683671c9c4dcb16ece736517e1b7feb4" @@ -10074,6 +12777,15 @@ regexpp@^3.0.0, regexpp@^3.1.0: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz#206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2" integrity sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q== +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz#fcbf458c50431b0bb7b45d6967b8192d91f3d938" @@ -10086,11 +12798,23 @@ regexpu-core@^4.7.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.2.0" +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + regjsgen@^0.5.1: version "0.5.2" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz#92ff295fb1deecbf6ecdab2543d207e91aa33733" integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + regjsparser@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" @@ -10129,6 +12853,13 @@ repeat-string@^1.6.1: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + request-promise-core@1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f" @@ -10145,7 +12876,7 @@ request-promise-native@^1.0.5, request-promise-native@^1.0.8: stealthy-require "^1.1.1" tough-cookie "^2.3.3" -request@^2.88.0, request@^2.88.2: +request@^2.85.0, request@^2.88.0, request@^2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== @@ -10233,7 +12964,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.1.5, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1: +resolve@^1.1.5, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.17.0, resolve@^1.3.2, resolve@^1.4.0, resolve@^1.8.1, resolve@~1.17.0: version "1.17.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== @@ -10263,6 +12994,13 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + integrity sha1-8ej0YeQGS6Oegq883CqMiT0HZ1k= + dependencies: + through "~2.3.4" + ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -10312,6 +13050,13 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rlp@^2.0.0, rlp@^2.2.3: + version "2.2.6" + resolved "https://registry.yarnpkg.com/rlp/-/rlp-2.2.6.tgz#c80ba6266ac7a483ef1e69e8e2f056656de2fb2c" + integrity sha512-HAfAmL6SDYNWPUOJNrM500x4Thn4PZsEy5pijPh40U9WfNk0z15hUYzO9xVIMAdIHdFtD8CBDHd75Td1g36Mjg== + dependencies: + bn.js "^4.11.1" + rollup-plugin-inject@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz#e4233855bfba6c0c12a312fd6649dff9a13ee9f4" @@ -10359,6 +13104,11 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" +rustbn.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/rustbn.js/-/rustbn.js-0.2.0.tgz#8082cb886e707155fd1cb6f23bd591ab8d55d0ca" + integrity sha512-4VlvkRUuCJvr2J6Y0ImW7NvTCriMi7ErOAqWk1y69vAdoNIzCF3yPmgeNzx+RQTLEDFq5sHfscn1MwHxP9hNfA== + rxjs@^6.4.0, rxjs@^6.6.0: version "6.6.2" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2" @@ -10366,6 +13116,13 @@ rxjs@^6.4.0, rxjs@^6.6.0: dependencies: tslib "^1.9.0" +rxjs@^6.5.4: + version "6.6.3" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552" + integrity sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -10376,6 +13133,13 @@ safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== +safe-event-emitter@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-event-emitter/-/safe-event-emitter-1.0.1.tgz#5b692ef22329ed8f69fdce607e50ca734f6f20af" + integrity sha512-e1wFe99A91XYYxoQbcq2ZJUWurxEyP8vfz7A7vuUe1s95q8r5ebraVaA1BukYJcpM6V16ugWoD9vngi8Ccu5fg== + dependencies: + events "^3.0.0" + safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" @@ -10383,7 +13147,7 @@ safe-regex@^1.1.0: dependencies: ret "~0.1.10" -"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10439,11 +13203,39 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -scrypt-js@3.0.1: +scrypt-js@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16" + integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw== + +scrypt-js@3.0.1, scrypt-js@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== +secp256k1@3.8.0, secp256k1@^3.0.1, secp256k1@^3.7.1, secp256k1@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-3.8.0.tgz#28f59f4b01dbee9575f56a47034b7d2e3b3b352d" + integrity sha512-k5ke5avRZbtl9Tqx/SA7CbY3NF6Ro+Sj9cZxezFzuBlLDmyqPiL8hJJ+EmzD8Ig4LUDByHJ3/iPOVoRixs/hmw== + dependencies: + bindings "^1.5.0" + bip66 "^1.1.5" + bn.js "^4.11.8" + create-hash "^1.2.0" + drbg.js "^1.0.1" + elliptic "^6.5.2" + nan "^2.14.0" + safe-buffer "^5.1.2" + +secp256k1@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" + integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== + dependencies: + elliptic "^6.5.2" + node-addon-api "^2.0.0" + node-gyp-build "^4.2.0" + select-hose@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" @@ -10456,6 +13248,11 @@ selfsigned@^1.10.7: dependencies: node-forge "0.9.0" +semaphore@>=1.0.1, semaphore@^1.0.3: + version "1.1.0" + resolved "https://registry.yarnpkg.com/semaphore/-/semaphore-1.1.0.tgz#aaad8b86b20fe8e9b32b16dc2ee682a8cd26a8aa" + integrity sha512-O4OZEaNtkMd/K0i6js9SL+gqy0ZCBMgUvlSqHKi4IBdjhe7wB8pwztUk1BbZ1fmrvpwFrPbHzqd2w5pTcJH6LA== + semver-compare@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc" @@ -10491,6 +13288,11 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@~5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + integrity sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -10550,6 +13352,11 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + integrity sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E= + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -10560,7 +13367,12 @@ set-value@^2.0.0, set-value@^2.0.1: is-plain-object "^2.0.3" split-string "^3.0.1" -setimmediate@^1.0.4: +setimmediate@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.4.tgz#20e81de622d4a02588ce0c8da8973cbcf1d3138f" + integrity sha1-IOgd5iLUoCWIzgyNqJc8vPHTE48= + +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" integrity sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU= @@ -10631,6 +13443,20 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== +simple-concat@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== + +simple-get@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + integrity sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw== + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + simple-swizzle@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" @@ -10643,6 +13469,11 @@ sisteransi@^1.0.4: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -10825,6 +13656,13 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== + dependencies: + source-map "^0.5.6" + source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" @@ -10926,6 +13764,42 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= +squarelink-provider-engine@^15.0.5: + version "15.0.5" + resolved "https://registry.yarnpkg.com/squarelink-provider-engine/-/squarelink-provider-engine-15.0.5.tgz#93a440c5daec517b1b494424d1c279f195cd781c" + integrity sha512-rl9586BLpN/ldujibbMsCfq+lEyY/YMkmWqYcbmKs6VUvB56fsIG23HvVFl1mPRUu7XIq4dOt+V+4G6+GcKTtQ== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.1" + eth-json-rpc-filters "^4.0.2" + eth-json-rpc-infura "^3.1.0" + eth-json-rpc-middleware "^4.1.1" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-rpc-error "^2.0.0" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +squarelink@^1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/squarelink/-/squarelink-1.1.4.tgz#5303abf1f4a2765accf0b0de7d8b45ba19c270f8" + integrity sha512-VOLwNWhz/QgrGg5INvd7y/TddKDdS6/6FfjqtMys6nLVJA8h+h05WW5/YJLidHCSD0A+2VnPuL8m/lkP1bUk2g== + dependencies: + bignumber.js "^9.0.0" + squarelink-provider-engine "^15.0.5" + sshpk@^1.7.0: version "1.16.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" @@ -11012,6 +13886,11 @@ stealthy-require@^1.1.1: resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= +store@2.0.12: + version "2.0.12" + resolved "https://registry.yarnpkg.com/store/-/store-2.0.12.tgz#8c534e2a0b831f72b75fc5f1119857c44ef5d593" + integrity sha1-jFNOKguDH3K3X8XxEZhXxE711ZM= + storyboard-core@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/storyboard-core/-/storyboard-core-3.2.0.tgz#6765e2c71bdc5b8ed1db52faf896df43461bca7c" @@ -11078,6 +13957,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== +strict-uri-encode@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" + integrity sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM= + string-kit@^0.5.12: version "0.5.27" resolved "https://registry.yarnpkg.com/string-kit/-/string-kit-0.5.27.tgz#5bd58b7172d7efd7a2981a398967b8dbc78fabe1" @@ -11135,6 +14019,14 @@ string.ify@^1.0.64: printable-characters "^1.0.42" string.bullet "^1.0.12" +string.prototype.trim@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.2.tgz#f538d0bacd98fc4297f0bef645226d5aaebf59f3" + integrity sha512-b5yrbl3BXIjHau9Prk7U0RRYcUYdN4wGSVaqoBQS50CCE3KBuYU0TYRNPFCP7aVoNMX87HKThdMRVIP3giclKg== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.18.0-next.0" + string.prototype.trimend@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" @@ -11158,6 +14050,11 @@ string_decoder@^1.0.0, string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -11193,6 +14090,11 @@ strip-ansi@^6.0.0: dependencies: ansi-regex "^5.0.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + strip-bom@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" @@ -11213,6 +14115,18 @@ strip-final-newline@^2.0.0: resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== +strip-hex-prefix@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-hex-prefix/-/strip-hex-prefix-1.0.0.tgz#0c5f155fef1151373377de9dbb588da05500e36f" + integrity sha1-DF8VX+8RUTczd96du1iNoFUA428= + dependencies: + is-hex-prefixed "1.0.0" + +strip-indent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" + integrity sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g= + strip-json-comments@^3.0.1, strip-json-comments@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -11323,6 +14237,27 @@ tapable@^1.0.0, tapable@^1.1.3: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== +tape@^4.6.3: + version "4.13.3" + resolved "https://registry.yarnpkg.com/tape/-/tape-4.13.3.tgz#51b3d91c83668c7a45b1a594b607dee0a0b46278" + integrity sha512-0/Y20PwRIUkQcTCSi4AASs+OANZZwqPKaipGCEwp10dQMipVvSZwUUCi01Y/OklIGyHKFhIcjock+DKnBfLAFw== + dependencies: + deep-equal "~1.1.1" + defined "~1.0.0" + dotignore "~0.1.2" + for-each "~0.3.3" + function-bind "~1.1.1" + glob "~7.1.6" + has "~1.0.3" + inherits "~2.0.4" + is-regex "~1.0.5" + minimist "~1.2.5" + object-inspect "~1.7.0" + resolve "~1.17.0" + resumer "~0.0.0" + string.prototype.trim "~1.2.1" + through "~2.3.8" + tar@^6.0.1, tar@^6.0.2: version "6.0.5" resolved "https://registry.yarnpkg.com/tar/-/tar-6.0.5.tgz#bde815086e10b39f1dcd298e89d596e1535e200f" @@ -11405,7 +14340,7 @@ throat@^5.0.0: resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b" integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA== -through2@^2.0.0, through2@~2.0.3: +through2@^2.0.0, through2@^2.0.3, through2@~2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== @@ -11413,7 +14348,7 @@ through2@^2.0.0, through2@~2.0.3: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@^2.3.6: +through@2, through@^2.3.6, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -11423,6 +14358,11 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +timed-out@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + timers-browserify@^2.0.4: version "2.0.11" resolved "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz#800b1f3eee272e5bc53ee465a04d0e804c31211f" @@ -11445,6 +14385,16 @@ tiny-inflate@^1.0.0: resolved "https://registry.yarnpkg.com/tiny-inflate/-/tiny-inflate-1.0.3.tgz#122715494913a1805166aaf7c93467933eea26c4" integrity sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw== +tiny-invariant@^1.0.6: + version "1.1.0" + resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" + integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== + +tiny-warning@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -11472,6 +14422,13 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= +to-hex@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/to-hex/-/to-hex-0.0.11.tgz#22355e09e5b56f5ae2b32502c493320f021171ac" + integrity sha512-3FSU8sfjrVc9fWowwP9xrdhxbp5Wco8uVZLhMhfsNuCFo9Fu8ecD2MgJV/2iAw+755W3AcGSQYVZGOpBmJtNcA== + dependencies: + normalize-hex "0.0.2" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -11552,6 +14509,16 @@ tree-kit@^0.5.24, tree-kit@^0.5.26, tree-kit@^0.5.27: resolved "https://registry.yarnpkg.com/tree-kit/-/tree-kit-0.5.27.tgz#d055a7ae6a087dda918cd92ac8c8c2abf5cfaea3" integrity sha512-0AtAzYDYaKSzeEPK3SI72lg/io5jrBxnT1gIRxEQasJycpQf5iXGh6YAl1kkh9wHmLlNRhDx0oj+GZEQHVe+cw== +trim-newlines@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" + integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + tryer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8" @@ -11620,11 +14587,21 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +tweetnacl-util@^0.15.0: + version "0.15.1" + resolved "https://registry.yarnpkg.com/tweetnacl-util/-/tweetnacl-util-0.15.1.tgz#b80fcdb5c97bcc508be18c44a4be50f022eea00b" + integrity sha512-RKJBIj8lySrShN4w6i/BonWp2Z/uxwC3h4y7xsRrpP59ZboCd0GpEVsOnMDYLMmKBpYhb5TgHzZXy7wTfYFBRw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= +tweetnacl@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" + integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== + type-check@^0.4.0, type-check@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" @@ -11667,7 +14644,17 @@ type-is@~1.6.17, type-is@~1.6.18: media-typer "0.3.0" mime-types "~2.1.24" -typedarray-to-buffer@^3.1.5: +type@^1.0.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg== + +type@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/type/-/type-2.1.0.tgz#9bdc22c648cf8cf86dd23d32336a41cfb6475e3f" + integrity sha512-G9absDWvhAWCV2gmF1zKud3OyC61nZDwWvBL2DApaVFogI07CprggiQAOOjvp2NRjYWFzPyu7vwtDrQFq8jeSA== + +typedarray-to-buffer@3.1.5, typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== @@ -11704,6 +14691,11 @@ uncss@^0.17.3: postcss-selector-parser "6.0.2" request "^2.88.0" +underscore@1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.9.1.tgz#06dce34a0e68a7babc29b365b8e74b8925203961" + integrity sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg== + unfetch@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/unfetch/-/unfetch-4.1.0.tgz#6ec2dd0de887e58a4dee83a050ded80ffc4137db" @@ -11817,6 +14809,11 @@ url-parse@^1.4.3: querystringify "^2.1.1" requires-port "^1.0.0" +url-set-query@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-set-query/-/url-set-query-1.0.0.tgz#016e8cfd7c20ee05cafe7795e892bd0702faa339" + integrity sha1-AW6M/Xwg7gXK/neV6JK9BwL6ozk= + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -11825,11 +14822,46 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-wallet@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/use-wallet/-/use-wallet-0.8.0.tgz#fc6277d2257af930a3235c40f551e737b187416a" + integrity sha512-+IWWSiOG4rj3zKOtb/7A9W2ys8ZdA+X8gUHNVc4/+qxEXwTo72M+qGplFCZLB6/+lH+oyQ6wL9fGNfyTLDt6AQ== + dependencies: + "@aragon/provided-connector" "^6.0.7" + "@web3-react/authereum-connector" "^6.1.1" + "@web3-react/core" "^6.1.1" + "@web3-react/fortmatic-connector" "^6.0.9" + "@web3-react/frame-connector" "^6.0.9" + "@web3-react/injected-connector" "^6.0.7" + "@web3-react/portis-connector" "^6.1.1" + "@web3-react/squarelink-connector" "^6.1.1" + "@web3-react/torus-connector" "^6.1.1" + "@web3-react/walletconnect-connector" "^6.1.4" + "@web3-react/walletlink-connector" "^6.1.1" + jsbi "^3.1.1" + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== +utf-8-validate@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.2.tgz#63cfbccd85dc1f2b66cf7a1d0eebc08ed056bfb3" + integrity sha512-SwV++i2gTD5qh2XqaPzBnNX88N6HdyhQrNNRykvcS0QKvItV9u3vPEJr+X5Hhfb1JC0r0e1alL0iB09rY8+nmw== + dependencies: + node-gyp-build "~3.7.0" + +utf8@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1" + integrity sha512-E8VjFIQ/TyQgp+TZfS6l8yp/xWppSAHzidGiRrqe4bK4XP9pTRyKFgGJpO3SN7zdX4DeomTrwaseCHovfpFcqQ== + +utf8@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.2.tgz#1fa0d9270e9be850d9b05027f63519bf46457d96" + integrity sha1-H6DZJw6b6FDZsFAn9jUZv0ZFfZY= + util-deprecate@^1.0.1, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -11877,6 +14909,21 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= +uuid@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.1.tgz#c2a30dedb3e535d72ccf82e343941a50ba8533ac" + integrity sha1-wqMN7bPlNdcsz4LjQ5QaULqFM6w= + +uuid@3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA== + +uuid@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.2.tgz#7ff5c203467e91f5e0d85cfcbaaf7d2ebbca9be6" + integrity sha512-vy9V/+pKG+5ZTYKf+VcphF5Oc6EFiu3W8Nv3P3zIh0EqVI80ZxOzuPfe9EHjkFNvf8+xuTHVeei4Drydlx4zjw== + uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" @@ -11887,6 +14934,13 @@ uuid@^8.2.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.0.tgz#ab738085ca22dc9a8c92725e459b1d507df5d6ea" integrity sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ== +uuidv4@6.0.6: + version "6.0.6" + resolved "https://registry.yarnpkg.com/uuidv4/-/uuidv4-6.0.6.tgz#6966e8dd15760528a0f954843d24fdfdfda5a329" + integrity sha512-10YcruyGJtsG5SJnPG+8atr8toJa7xAOrcO7B7plYYiwpH1mQ8UZHjNSa2MrwGi6KWuyVrXGHr+Rce22F9UAiw== + dependencies: + uuid "7.0.2" + v8-compile-cache@^2.0.0, v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz#54bc3cdd43317bca91e35dcaf305b1a7237de745" @@ -11975,6 +15029,17 @@ walker@^1.0.7, walker@~1.0.5: dependencies: makeerror "1.0.x" +walletlink@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/walletlink/-/walletlink-2.0.2.tgz#8640e42d3df49b4661019287ab9789e94b72db98" + integrity sha512-4MIctCHAjcPHSQUHpHuU9leUAvYqRF+/4kCq7x9AngZQ2Jd74dbpC8dfZ55uOwW8TXc7z9XYeSyzRrGHbv5ZXg== + dependencies: + bind-decorator "^1.0.11" + bn.js "^5.1.1" + clsx "^1.1.0" + preact "^10.3.3" + rxjs "^6.5.4" + watchpack-chokidar2@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" @@ -12007,6 +15072,220 @@ wcwidth@^1.0.1: dependencies: defaults "^1.0.3" +web3-core-helpers@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.3.0.tgz#697cc3246a7eaaaac64ea506828d861c981c3f31" + integrity sha512-+MFb1kZCrRctf7UYE7NCG4rGhSXaQJ/KF07di9GVK1pxy1K0+rFi61ZobuV1ky9uQp+uhhSPts4Zp55kRDB5sw== + dependencies: + underscore "1.9.1" + web3-eth-iban "1.3.0" + web3-utils "1.3.0" + +web3-core-method@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.3.0.tgz#a71387af842aec7dbad5dbbd1130c14cc6c8beb3" + integrity sha512-h0yFDrYVzy5WkLxC/C3q+hiMnzxdWm9p1T1rslnuHgOp6nYfqzu/6mUIXrsS4h/OWiGJt+BZ0xVZmtC31HDWtg== + dependencies: + "@ethersproject/transactions" "^5.0.0-beta.135" + underscore "1.9.1" + web3-core-helpers "1.3.0" + web3-core-promievent "1.3.0" + web3-core-subscriptions "1.3.0" + web3-utils "1.3.0" + +web3-core-promievent@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.3.0.tgz#e0442dd0a8989b6bdce09293976cee6d9237a484" + integrity sha512-blv69wrXw447TP3iPvYJpllkhW6B18nfuEbrfcr3n2Y0v1Jx8VJacNZFDFsFIcgXcgUIVCtOpimU7w9v4+rtaw== + dependencies: + eventemitter3 "4.0.4" + +web3-core-requestmanager@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.3.0.tgz#c5b9a0304504c0e6cce6c90bc1a3bff82732aa1f" + integrity sha512-3yMbuGcomtzlmvTVqNRydxsx7oPlw3ioRL6ReF9PeNYDkUsZaUib+6Dp5eBt7UXh5X+SIn/xa1smhDHz5/HpAw== + dependencies: + underscore "1.9.1" + web3-core-helpers "1.3.0" + web3-providers-http "1.3.0" + web3-providers-ipc "1.3.0" + web3-providers-ws "1.3.0" + +web3-core-subscriptions@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.3.0.tgz#c2622ccd2b84f4687475398ff966b579dba0847e" + integrity sha512-MUUQUAhJDb+Nz3S97ExVWveH4utoUnsbPWP+q1HJH437hEGb4vunIb9KvN3hFHLB+aHJfPeStM/4yYTz5PeuyQ== + dependencies: + eventemitter3 "4.0.4" + underscore "1.9.1" + web3-core-helpers "1.3.0" + +web3-core@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.3.0.tgz#b818903738461c1cca0163339e1d6d3fa51242cf" + integrity sha512-BwWvAaKJf4KFG9QsKRi3MNoNgzjI6szyUlgme1qNPxUdCkaS3Rdpa0VKYNHP7M/YTk82/59kNE66mH5vmoaXjA== + dependencies: + "@types/bn.js" "^4.11.5" + "@types/node" "^12.12.6" + bignumber.js "^9.0.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-core-requestmanager "1.3.0" + web3-utils "1.3.0" + +web3-eth-abi@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.3.0.tgz#387b7ea9b38be69ad8856bc7b4e9a6a69bb4d22b" + integrity sha512-1OrZ9+KGrBeBRd3lO8upkpNua9+7cBsQAgor9wbA25UrcUYSyL8teV66JNRu9gFxaTbkpdrGqM7J/LXpraXWrg== + dependencies: + "@ethersproject/abi" "5.0.0-beta.153" + underscore "1.9.1" + web3-utils "1.3.0" + +web3-eth-contract@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.3.0.tgz#c758340ac800788e29fa29edc8b0c0ac957b741c" + integrity sha512-3SCge4SRNCnzLxf0R+sXk6vyTOl05g80Z5+9/B5pERwtPpPWaQGw8w01vqYqsYBKC7zH+dxhMaUgVzU2Dgf7bQ== + dependencies: + "@types/bn.js" "^4.11.5" + underscore "1.9.1" + web3-core "1.3.0" + web3-core-helpers "1.3.0" + web3-core-method "1.3.0" + web3-core-promievent "1.3.0" + web3-core-subscriptions "1.3.0" + web3-eth-abi "1.3.0" + web3-utils "1.3.0" + +web3-eth-iban@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.3.0.tgz#15b782dfaf273ebc4e3f389f1367f4e88ddce4a5" + integrity sha512-v9mZWhR4fPF17/KhHLiWir4YHWLe09O3B/NTdhWqw3fdAMJNztzMHGzgHxA/4fU+rhrs/FhDzc4yt32zMEXBZw== + dependencies: + bn.js "^4.11.9" + web3-utils "1.3.0" + +web3-provider-engine@15.0.12: + version "15.0.12" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.12.tgz#24d7f2f6fb6de856824c7306291018c4fc543ac3" + integrity sha512-/OfhQalKPND1iB5ggvGuYF0+SIb2Qj5OFTrT2VrZWP79UhMTdP7T+L2FtblmRdCeOetoAzZHdBaIwLOZsmIX+w== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-errors "^2.0.2" + eth-json-rpc-filters "^4.1.1" + eth-json-rpc-infura "^4.0.1" + eth-json-rpc-middleware "^4.1.5" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +web3-provider-engine@15.0.4: + version "15.0.4" + resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-15.0.4.tgz#5c336bcad2274dff5218bc8db003fa4e9e464c24" + integrity sha512-Ob9oK0TUZfVC7NXkB7CQSWAiCdCD/Xnlh2zTnV8NdJR8LCrMAy2i6JedU70JHaxw59y7mM4GnsYOTTGkquFnNQ== + dependencies: + async "^2.5.0" + backoff "^2.5.0" + clone "^2.0.0" + cross-fetch "^2.1.0" + eth-block-tracker "^4.4.2" + eth-json-rpc-errors "^1.0.1" + eth-json-rpc-filters "^4.1.1" + eth-json-rpc-infura "^4.0.1" + eth-json-rpc-middleware "^4.1.5" + eth-sig-util "^1.4.2" + ethereumjs-block "^1.2.2" + ethereumjs-tx "^1.2.0" + ethereumjs-util "^5.1.5" + ethereumjs-vm "^2.3.4" + json-stable-stringify "^1.0.1" + promise-to-callback "^1.0.0" + readable-stream "^2.2.9" + request "^2.85.0" + semaphore "^1.0.3" + ws "^5.1.1" + xhr "^2.2.0" + xtend "^4.0.1" + +web3-providers-http@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.3.0.tgz#88227f64c88b32abed4359383c2663616e0dc531" + integrity sha512-cMKhUI6PqlY/EC+ZDacAxajySBu8AzW8jOjt1Pe/mbRQgS0rcZyvLePGTTuoyaA8C21F8UW+EE5jj7YsNgOuqA== + dependencies: + web3-core-helpers "1.3.0" + xhr2-cookies "1.1.0" + +web3-providers-ipc@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.3.0.tgz#d7c2b203733b46f7b4e7b15633d891648cf9a293" + integrity sha512-0CrLuRofR+1J38nEj4WsId/oolwQEM6Yl1sOt41S/6bNI7htdkwgVhSloFIMJMDFHtRw229QIJ6wIaKQz0X1Og== + dependencies: + oboe "2.1.5" + underscore "1.9.1" + web3-core-helpers "1.3.0" + +web3-providers-ws@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.3.0.tgz#84adeff65acd4624d7f5bb43c5b2b22d8f0f63a4" + integrity sha512-Im5MthhJnJst8nSoq0TgbyOdaiFQFa5r6sHPOVllhgIgViDqzbnlAFW9sNzQ0Q8VXPNfPIQKi9cOrHlSRNPjRw== + dependencies: + eventemitter3 "4.0.4" + underscore "1.9.1" + web3-core-helpers "1.3.0" + websocket "^1.0.32" + +web3-utils@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.1.tgz#21466e38291551de0ab34558de21512ac4274534" + integrity sha512-Mrcn3l58L+yCKz3zBryM6JZpNruWuT0OCbag8w+reeNROSGVlXzUQkU+gtAwc9JCZ7tKUyg67+2YUGqUjVcyBA== + dependencies: + bn.js "4.11.8" + eth-lib "0.2.7" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randomhex "0.1.5" + underscore "1.9.1" + utf8 "3.0.0" + +web3-utils@1.3.0, web3-utils@^1.2.11, web3-utils@^1.2.9: + version "1.3.0" + resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.3.0.tgz#5bac16e5e0ec9fe7bdcfadb621655e8aa3cf14e1" + integrity sha512-2mS5axFCbkhicmoDRuJeuo0TVGQDgC2sPi/5dblfVC+PMtX0efrb8Xlttv/eGkq7X4E83Pds34FH98TP2WOUZA== + dependencies: + bn.js "^4.11.9" + eth-lib "0.2.8" + ethereum-bloom-filters "^1.0.6" + ethjs-unit "0.1.6" + number-to-bn "1.7.0" + randombytes "^2.1.0" + underscore "1.9.1" + utf8 "3.0.0" + +web3@^0.20.7: + version "0.20.7" + resolved "https://registry.yarnpkg.com/web3/-/web3-0.20.7.tgz#1605e6d81399ed6f85a471a4f3da0c8be57df2f7" + integrity sha512-VU6/DSUX93d1fCzBz7WP/SGCQizO1rKZi4Px9j/3yRyfssHyFcZamMw2/sj4E8TlfMXONvZLoforR8B4bRoyTQ== + dependencies: + bignumber.js "git+https://github.com/frozeman/bignumber.js-nolookahead.git" + crypto-js "^3.1.4" + utf8 "^2.1.1" + xhr2-cookies "^1.1.0" + xmlhttprequest "*" + webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -12174,6 +15453,18 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz#7f8473bc839dfd87608adb95d7eb075211578a42" integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== +websocket@^1.0.32: + version "1.0.32" + resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.32.tgz#1f16ddab3a21a2d929dec1687ab21cfdc6d3dbb1" + integrity sha512-i4yhcllSP4wrpoPMU2N0TQ/q0O94LRG/eUQjEAamRltjQ1oT1PFFKOG4i877OlJgCG8rw6LrrowJp+TYCEWF7Q== + dependencies: + bufferutil "^4.0.1" + debug "^2.2.0" + es5-ext "^0.10.50" + typedarray-to-buffer "^3.1.5" + utf-8-validate "^5.0.2" + yaeti "^0.0.6" + whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0" @@ -12181,6 +15472,11 @@ whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.5: dependencies: iconv-lite "0.4.24" +whatwg-fetch@2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz#dde6a5df315f9d39991aa17621853d720b85566f" + integrity sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng== + whatwg-fetch@^3.0.0: version "3.4.0" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.4.0.tgz#e11de14f4878f773fbebcde8871b2c0699af8b30" @@ -12295,11 +15591,23 @@ write@1.0.3: dependencies: mkdirp "^0.5.1" +ws@7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.1.2.tgz#c672d1629de8bb27a9699eb599be47aeeedd8f73" + integrity sha512-gftXq3XI81cJCgkUiAVixA0raD9IVmXqsylCrjRygw4+UOOGzPoxnQ6r/CnVL9i+mDncJo94tSkyrtuuQVBmrg== + dependencies: + async-limiter "^1.0.0" + ws@7.2.3: version "7.2.3" resolved "https://registry.yarnpkg.com/ws/-/ws-7.2.3.tgz#a5411e1fb04d5ed0efee76d26d5c46d830c39b46" integrity sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ== +ws@7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.0.tgz#4b2f7f219b3d3737bc1a2fbf145d825b94d38ffd" + integrity sha512-iFtXzngZVXPGgpTlP1rBqsUK82p9tKqsWRPg5L56egiljujJT3vGAYnHANvFxBieXrTFavhzhxW52jnaWV+w2w== + ws@^5.1.1, ws@^5.2.0: version "5.2.2" resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f" @@ -12319,6 +15627,43 @@ ws@^7.2.3, ws@^7.3.0: resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8" integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA== +xhr-request-promise@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/xhr-request-promise/-/xhr-request-promise-0.1.3.tgz#2d5f4b16d8c6c893be97f1a62b0ed4cf3ca5f96c" + integrity sha512-YUBytBsuwgitWtdRzXDDkWAXzhdGB8bYm0sSzMPZT7Z2MBjMSTHFsyCT1yCRATY+XC69DUrQraRAEgcoCRaIPg== + dependencies: + xhr-request "^1.1.0" + +xhr-request@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr-request/-/xhr-request-1.1.0.tgz#f4a7c1868b9f198723444d82dcae317643f2e2ed" + integrity sha512-Y7qzEaR3FDtL3fP30k9wO/e+FBnBByZeybKOhASsGP30NIkRAAkKD/sCnLvgEfAIEC1rcmK7YG8f4oEnIrrWzA== + dependencies: + buffer-to-arraybuffer "^0.0.5" + object-assign "^4.1.1" + query-string "^5.0.1" + simple-get "^2.7.0" + timed-out "^4.0.1" + url-set-query "^1.0.0" + xhr "^2.0.4" + +xhr2-cookies@1.1.0, xhr2-cookies@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/xhr2-cookies/-/xhr2-cookies-1.1.0.tgz#7d77449d0999197f155cb73b23df72505ed89d48" + integrity sha1-fXdEnQmZGX8VXLc7I99yUF7YnUg= + dependencies: + cookiejar "^2.1.1" + +xhr@^2.0.4, xhr@^2.2.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.5.0.tgz#bed8d1676d5ca36108667692b74b316c496e49dd" + integrity sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ== + dependencies: + global "~4.3.0" + is-function "^1.0.1" + parse-headers "^2.0.0" + xtend "^4.0.0" + xml-name-validator@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a" @@ -12329,21 +15674,38 @@ xmlchars@^2.1.1, xmlchars@^2.2.0: resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb" integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== +xmlhttprequest@*, xmlhttprequest@1.8.0: + version "1.8.0" + resolved "https://registry.yarnpkg.com/xmlhttprequest/-/xmlhttprequest-1.8.0.tgz#67fe075c5c24fef39f9d65f5f7b7fe75171968fc" + integrity sha1-Z/4HXFwk/vOfnWX197f+dRcZaPw= + xregexp@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-3.2.0.tgz#cb3601987bfe2695b584000c18f1c4a8c322878e" integrity sha1-yzYBmHv+JpW1hAAMGPHEqMMih44= -xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + integrity sha1-bv7MKk2tjmlixJAbM3znuoe10os= + dependencies: + object-keys "~0.4.0" + y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== +yaeti@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/yaeti/-/yaeti-0.0.6.tgz#f26f484d72684cf42bedfb76970aa1608fbf9577" + integrity sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc= + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" @@ -12372,6 +15734,13 @@ yargs-parser@18.x, yargs-parser@^18.1.2, yargs-parser@^18.1.3: camelcase "^5.0.0" decamelize "^1.2.0" +yargs-parser@^10.0.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" + integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== + dependencies: + camelcase "^4.1.0" + yargs-parser@^13.1.2: version "13.1.2" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz#130f09702ebaeef2650d54ce6e3e5706f7a4fb38" @@ -12380,7 +15749,7 @@ yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@^13.3.2: +yargs@^13.2.4, yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==