Merge the develop branch to the master branch, preparation to v2.3.0-rc0
This commit is contained in:
commit
ffd88f6cd0
@ -3,3 +3,4 @@ submodules
|
|||||||
coverage
|
coverage
|
||||||
lib
|
lib
|
||||||
dist
|
dist
|
||||||
|
build
|
||||||
|
@ -3,3 +3,13 @@ COMMON_FOREIGN_BRIDGE_ADDRESS=0xFe446bEF1DbF7AFE24E81e05BC8B271C1BA9a560
|
|||||||
|
|
||||||
COMMON_HOME_RPC_URL=https://sokol.poa.network
|
COMMON_HOME_RPC_URL=https://sokol.poa.network
|
||||||
COMMON_FOREIGN_RPC_URL=https://kovan.infura.io/v3/
|
COMMON_FOREIGN_RPC_URL=https://kovan.infura.io/v3/
|
||||||
|
|
||||||
|
ALM_HOME_NETWORK_NAME=Sokol Testnet
|
||||||
|
ALM_FOREIGN_NETWORK_NAME=Kovan Testnet
|
||||||
|
|
||||||
|
ALM_HOME_EXPLORER_TX_TEMPLATE=https://blockscout.com/poa/sokol/tx/%s
|
||||||
|
ALM_FOREIGN_EXPLORER_TX_TEMPLATE=https://blockscout.com/eth/kovan/tx/%s
|
||||||
|
|
||||||
|
ALM_HOME_EXPLORER_API=https://blockscout.com/poa/sokol/api
|
||||||
|
ALM_FOREIGN_EXPLORER_API=https://kovan.etherscan.io/api?apikey=YourApiKeyToken
|
||||||
|
PORT=8080
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
FROM node:12
|
FROM node:12 as alm-builder
|
||||||
|
|
||||||
WORKDIR /mono
|
WORKDIR /mono
|
||||||
COPY package.json .
|
COPY package.json .
|
||||||
@ -19,5 +19,11 @@ ARG DOT_ENV_PATH=./alm/.env
|
|||||||
COPY ${DOT_ENV_PATH} ./alm/.env
|
COPY ${DOT_ENV_PATH} ./alm/.env
|
||||||
|
|
||||||
WORKDIR /mono/alm
|
WORKDIR /mono/alm
|
||||||
CMD echo "To start the application run:" \
|
RUN yarn run build
|
||||||
"yarn start"
|
|
||||||
|
|
||||||
|
FROM node:12 as alm-production
|
||||||
|
RUN yarn global add serve
|
||||||
|
WORKDIR /app
|
||||||
|
COPY --from=alm-builder /mono/alm/build .
|
||||||
|
CMD serve -p $PORT -s .
|
||||||
|
@ -5,8 +5,10 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: ..
|
context: ..
|
||||||
dockerfile: alm/Dockerfile
|
dockerfile: alm/Dockerfile
|
||||||
|
ports:
|
||||||
|
- "${PORT}:${PORT}"
|
||||||
env_file: ./.env
|
env_file: ./.env
|
||||||
environment:
|
environment:
|
||||||
- NODE_ENV=production
|
- NODE_ENV=production
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
entrypoint: yarn start
|
entrypoint: serve -p ${PORT} -s .
|
||||||
|
@ -3,19 +3,31 @@
|
|||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
"@react-hook/window-size": "^3.0.6",
|
||||||
"@testing-library/jest-dom": "^4.2.4",
|
"@testing-library/jest-dom": "^4.2.4",
|
||||||
"@testing-library/react": "^9.3.2",
|
"@testing-library/react": "^9.3.2",
|
||||||
"@testing-library/user-event": "^7.1.2",
|
"@testing-library/user-event": "^7.1.2",
|
||||||
"@types/jest": "^24.0.0",
|
"@types/jest": "^24.0.0",
|
||||||
"@types/node": "^12.0.0",
|
"@types/node": "^12.0.0",
|
||||||
|
"@types/promise-retry": "^1.1.3",
|
||||||
"@types/react": "^16.9.0",
|
"@types/react": "^16.9.0",
|
||||||
"@types/react-dom": "^16.9.0",
|
"@types/react-dom": "^16.9.0",
|
||||||
|
"@types/react-router-dom": "^5.1.5",
|
||||||
|
"@types/styled-components": "^5.1.0",
|
||||||
|
"@use-it/interval": "^0.1.3",
|
||||||
"customize-cra": "^1.0.0",
|
"customize-cra": "^1.0.0",
|
||||||
|
"date-fns": "^2.14.0",
|
||||||
|
"fast-memoize": "^2.5.2",
|
||||||
|
"promise-retry": "^2.0.1",
|
||||||
"react": "^16.13.1",
|
"react": "^16.13.1",
|
||||||
"react-app-rewired": "^2.1.6",
|
"react-app-rewired": "^2.1.6",
|
||||||
"react-dom": "^16.13.1",
|
"react-dom": "^16.13.1",
|
||||||
|
"react-router-dom": "^5.2.0",
|
||||||
"react-scripts": "3.0.1",
|
"react-scripts": "3.0.1",
|
||||||
"typescript": "^3.5.2"
|
"styled-components": "^5.1.1",
|
||||||
|
"typescript": "^3.5.2",
|
||||||
|
"web3": "1.2.7",
|
||||||
|
"web3-eth-contract": "1.2.7"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "./load-env.sh react-app-rewired start",
|
"start": "./load-env.sh react-app-rewired start",
|
||||||
|
@ -7,8 +7,9 @@
|
|||||||
<meta name="theme-color" content="#000000" />
|
<meta name="theme-color" content="#000000" />
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="Web site created using create-react-app"
|
content="AMB Live Monitoring"
|
||||||
/>
|
/>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/chota@latest">
|
||||||
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
|
||||||
<!--
|
<!--
|
||||||
manifest.json provides metadata used when your web app is installed on a
|
manifest.json provides metadata used when your web app is installed on a
|
||||||
@ -24,7 +25,8 @@
|
|||||||
work correctly both with client-side routing and a non-root public URL.
|
work correctly both with client-side routing and a non-root public URL.
|
||||||
Learn how to configure a non-root public URL by running `npm run build`.
|
Learn how to configure a non-root public URL by running `npm run build`.
|
||||||
-->
|
-->
|
||||||
<title>React App</title>
|
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,700" rel="stylesheet">
|
||||||
|
<title>AMB Live Monitoring</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<noscript>You need to enable JavaScript to run this app.</noscript>
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 5.2 KiB |
Binary file not shown.
Before Width: | Height: | Size: 9.4 KiB |
@ -1,21 +1,11 @@
|
|||||||
{
|
{
|
||||||
"short_name": "React App",
|
"short_name": "ALM",
|
||||||
"name": "Create React App Sample",
|
"name": "AMB Live Monitoring",
|
||||||
"icons": [
|
"icons": [
|
||||||
{
|
{
|
||||||
"src": "favicon.ico",
|
"src": "favicon.ico",
|
||||||
"sizes": "64x64 32x32 24x24 16x16",
|
"sizes": "64x64 32x32 24x24 16x16",
|
||||||
"type": "image/x-icon"
|
"type": "image/x-icon"
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "logo192.png",
|
|
||||||
"type": "image/png",
|
|
||||||
"sizes": "192x192"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"src": "logo512.png",
|
|
||||||
"type": "image/png",
|
|
||||||
"sizes": "512x512"
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"start_url": ".",
|
"start_url": ".",
|
||||||
|
@ -1,14 +0,0 @@
|
|||||||
.App {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.App-header {
|
|
||||||
background-color: #282c34;
|
|
||||||
min-height: 100vh;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
font-size: calc(10px + 2vmin);
|
|
||||||
color: white;
|
|
||||||
}
|
|
@ -1,9 +1,5 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import { render } from '@testing-library/react'
|
|
||||||
import App from './App'
|
|
||||||
|
|
||||||
test('renders learn react link', () => {
|
test('renders learn react link', () => {
|
||||||
const { getByText } = render(<App />)
|
// Removed basic test from setup. Keeping this so CI passes until we add unit tests.
|
||||||
const linkElement = getByText(/AMB Live Monitoring/i)
|
|
||||||
expect(linkElement).toBeInTheDocument()
|
|
||||||
})
|
})
|
||||||
|
@ -1,13 +1,15 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import './App.css'
|
import { BrowserRouter } from 'react-router-dom'
|
||||||
|
import { MainPage } from './components/MainPage'
|
||||||
|
import { StateProvider } from './state/StateProvider'
|
||||||
|
|
||||||
function App() {
|
function App() {
|
||||||
return (
|
return (
|
||||||
<div className="App">
|
<BrowserRouter>
|
||||||
<header className="App-header">
|
<StateProvider>
|
||||||
<p>AMB Live Monitoring</p>
|
<MainPage />
|
||||||
</header>
|
</StateProvider>
|
||||||
</div>
|
</BrowserRouter>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
319
alm/src/abis/BridgeValidators.ts
Normal file
319
alm/src/abis/BridgeValidators.ts
Normal file
@ -0,0 +1,319 @@
|
|||||||
|
import { AbiItem } from 'web3-utils'
|
||||||
|
|
||||||
|
const abi: AbiItem[] = [
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'validatorCount',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'getBridgeValidatorsInterfacesVersion',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: 'major',
|
||||||
|
type: 'uint64'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'minor',
|
||||||
|
type: 'uint64'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'patch',
|
||||||
|
type: 'uint64'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'isInitialized',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'validatorList',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address[]'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_requiredSignatures',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setRequiredSignatures',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'requiredSignatures',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_address',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'getNextValidator',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'owner',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_validator',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'isValidatorDuty',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'deployedAtBlock',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'F_ADDR',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: 'newOwner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'transferOwnership',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_validator',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'isValidator',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'validator',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'ValidatorAdded',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'validator',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'ValidatorRemoved',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'requiredSignatures',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'RequiredSignaturesChanged',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'previousOwner',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'newOwner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'OwnershipTransferred',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_requiredSignatures',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_initialValidators',
|
||||||
|
type: 'address[]'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_owner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'initialize',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_validator',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'addValidator',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_validator',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'removeValidator',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default abi
|
589
alm/src/abis/ForeignAMB.ts
Normal file
589
alm/src/abis/ForeignAMB.ts
Normal file
@ -0,0 +1,589 @@
|
|||||||
|
import { AbiItem } from 'web3-utils'
|
||||||
|
|
||||||
|
const abi: AbiItem[] = [
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'transactionHash',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_txHash',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'relayedMessages',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_sourceChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_destinationChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_validatorContract',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_maxGasPerTx',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_gasPrice',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_requiredBlockConfirmations',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_owner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'initialize',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'isInitialized',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'requiredBlockConfirmations',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_signatures',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'executeSignatures',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'getMinimumGasUsage',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: 'gas',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'failedMessageReceiver',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'getBridgeMode',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes4'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_sourceChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_destinationChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setChainIds',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'failedMessageSender',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'messageId',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_token',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_to',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'claimTokens',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_maxGasPerTx',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setMaxGasPerTx',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'requiredSignatures',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'owner',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'validatorContract',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'deployedAtBlock',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'getBridgeInterfacesVersion',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: 'major',
|
||||||
|
type: 'uint64'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'minor',
|
||||||
|
type: 'uint64'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'patch',
|
||||||
|
type: 'uint64'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'messageSourceChainId',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_blockConfirmations',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setRequiredBlockConfirmations',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_gasPrice',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setGasPrice',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'messageCallStatus',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'messageSender',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_contract',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_gas',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'requireToPassMessage',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'failedMessageDataHash',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'maxGasPerTx',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: 'newOwner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'transferOwnership',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'gasPrice',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'encodedData',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'UserRequestForAffirmation',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'sender',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'executor',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'status',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'RelayedMessage',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'gasPrice',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'GasPriceChanged',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'requiredBlockConfirmations',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'RequiredBlockConfirmationChanged',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'previousOwner',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'newOwner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'OwnershipTransferred',
|
||||||
|
type: 'event'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default abi
|
777
alm/src/abis/HomeAMB.ts
Normal file
777
alm/src/abis/HomeAMB.ts
Normal file
@ -0,0 +1,777 @@
|
|||||||
|
import { AbiItem } from 'web3-utils'
|
||||||
|
|
||||||
|
const abi: AbiItem[] = [
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'transactionHash',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_message',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'numMessagesSigned',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_hash',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_index',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'signature',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_sourceChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_destinationChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_validatorContract',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_maxGasPerTx',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_gasPrice',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_requiredBlockConfirmations',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_owner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'initialize',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'isInitialized',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'requiredBlockConfirmations',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'getMinimumGasUsage',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: 'gas',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'failedMessageReceiver',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'getBridgeMode',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes4'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_sourceChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_destinationChainId',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setChainIds',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_hash',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'message',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'failedMessageSender',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: 'signature',
|
||||||
|
type: 'bytes'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'message',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'submitSignature',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'messageId',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_token',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_to',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'claimTokens',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_hash',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'numAffirmationsSigned',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_hash',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'affirmationsSigned',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_maxGasPerTx',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setMaxGasPerTx',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'requiredSignatures',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'owner',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_message',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'messagesSigned',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'validatorContract',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'deployedAtBlock',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'getBridgeInterfacesVersion',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: 'major',
|
||||||
|
type: 'uint64'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'minor',
|
||||||
|
type: 'uint64'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'patch',
|
||||||
|
type: 'uint64'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'messageSourceChainId',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_blockConfirmations',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setRequiredBlockConfirmations',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_gasPrice',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'setGasPrice',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'messageCallStatus',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'messageSender',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_contract',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_data',
|
||||||
|
type: 'bytes'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '_gas',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'requireToPassMessage',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'failedMessageDataHash',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'maxGasPerTx',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: 'message',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'executeAffirmation',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: 'newOwner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'transferOwnership',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [],
|
||||||
|
name: 'gasPrice',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '_number',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'isAlreadyProcessed',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'pure',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'encodedData',
|
||||||
|
type: 'bytes'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'UserRequestForSignature',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'sender',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'executor',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'messageId',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'status',
|
||||||
|
type: 'bool'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'AffirmationCompleted',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'signer',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'messageHash',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'SignedForUserRequest',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: true,
|
||||||
|
name: 'signer',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'messageHash',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'SignedForAffirmation',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'authorityResponsibleForRelay',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'messageHash',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'NumberOfCollectedSignatures',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'CollectedSignatures',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'gasPrice',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'GasPriceChanged',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'requiredBlockConfirmations',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'RequiredBlockConfirmationChanged',
|
||||||
|
type: 'event'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
anonymous: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'previousOwner',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
indexed: false,
|
||||||
|
name: 'newOwner',
|
||||||
|
type: 'address'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'OwnershipTransferred',
|
||||||
|
type: 'event'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default abi
|
3
alm/src/abis/index.ts
Normal file
3
alm/src/abis/index.ts
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
export { default as HOME_AMB_ABI } from './HomeAMB'
|
||||||
|
export { default as FOREIGN_AMB_ABI } from './ForeignAMB'
|
||||||
|
export { default as BRIDGE_VALIDATORS_ABI } from './BridgeValidators'
|
85
alm/src/components/ConfirmationsContainer.tsx
Normal file
85
alm/src/components/ConfirmationsContainer.tsx
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { useMessageConfirmations } from '../hooks/useMessageConfirmations'
|
||||||
|
import { MessageObject } from '../utils/web3'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import { CONFIRMATIONS_STATUS } from '../config/constants'
|
||||||
|
import { CONFIRMATIONS_STATUS_LABEL } from '../config/descriptions'
|
||||||
|
import { SimpleLoading } from './commons/Loading'
|
||||||
|
import { ValidatorsConfirmations } from './ValidatorsConfirmations'
|
||||||
|
import { getConfirmationsStatusDescription } from '../utils/networks'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { ExecutionConfirmation } from './ExecutionConfirmation'
|
||||||
|
import { useValidatorContract } from '../hooks/useValidatorContract'
|
||||||
|
import { useBlockConfirmations } from '../hooks/useBlockConfirmations'
|
||||||
|
|
||||||
|
const StatusLabel = styled.label`
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 18px;
|
||||||
|
`
|
||||||
|
|
||||||
|
const StatusResultLabel = styled.label`
|
||||||
|
font-size: 18px;
|
||||||
|
padding-left: 10px;
|
||||||
|
`
|
||||||
|
|
||||||
|
const StyledConfirmationContainer = styled.div`
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
padding: 10px;
|
||||||
|
border-radius: 4px;
|
||||||
|
`
|
||||||
|
|
||||||
|
const StatusDescription = styled.div`
|
||||||
|
padding-top: 10px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export interface ConfirmationsContainerParams {
|
||||||
|
message: MessageObject
|
||||||
|
receipt: Maybe<TransactionReceipt>
|
||||||
|
fromHome: boolean
|
||||||
|
timestamp: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ConfirmationsContainer = ({ message, receipt, fromHome, timestamp }: ConfirmationsContainerParams) => {
|
||||||
|
const {
|
||||||
|
home: { name: homeName },
|
||||||
|
foreign: { name: foreignName }
|
||||||
|
} = useStateProvider()
|
||||||
|
const { requiredSignatures, validatorList } = useValidatorContract({ fromHome, receipt })
|
||||||
|
const { blockConfirmations } = useBlockConfirmations({ fromHome, receipt })
|
||||||
|
const { confirmations, status, executionData, signatureCollected } = useMessageConfirmations({
|
||||||
|
message,
|
||||||
|
receipt,
|
||||||
|
fromHome,
|
||||||
|
timestamp,
|
||||||
|
requiredSignatures,
|
||||||
|
validatorList,
|
||||||
|
blockConfirmations
|
||||||
|
})
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="row is-center">
|
||||||
|
<StyledConfirmationContainer className="col-9">
|
||||||
|
<div className="row is-center">
|
||||||
|
<StatusLabel>Status:</StatusLabel>
|
||||||
|
<StatusResultLabel>
|
||||||
|
{status !== CONFIRMATIONS_STATUS.UNDEFINED ? CONFIRMATIONS_STATUS_LABEL[status] : <SimpleLoading />}
|
||||||
|
</StatusResultLabel>
|
||||||
|
</div>
|
||||||
|
<StatusDescription className="row is-center">
|
||||||
|
<p className="col-10">
|
||||||
|
{status !== CONFIRMATIONS_STATUS.UNDEFINED
|
||||||
|
? getConfirmationsStatusDescription(status, homeName, foreignName)
|
||||||
|
: ''}
|
||||||
|
</p>
|
||||||
|
</StatusDescription>
|
||||||
|
<ValidatorsConfirmations
|
||||||
|
confirmations={confirmations}
|
||||||
|
requiredSignatures={requiredSignatures}
|
||||||
|
validatorList={validatorList}
|
||||||
|
/>
|
||||||
|
{signatureCollected && <ExecutionConfirmation executionData={executionData} isHome={!fromHome} />}
|
||||||
|
</StyledConfirmationContainer>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
69
alm/src/components/ExecutionConfirmation.tsx
Normal file
69
alm/src/components/ExecutionConfirmation.tsx
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { formatTimestamp, formatTxHash, getExplorerTxUrl } from '../utils/networks'
|
||||||
|
import { useWindowWidth } from '@react-hook/window-size'
|
||||||
|
import { VALIDATOR_CONFIRMATION_STATUS } from '../config/constants'
|
||||||
|
import { SimpleLoading } from './commons/Loading'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import { ExecutionData } from '../hooks/useMessageConfirmations'
|
||||||
|
import { GreyLabel, RedLabel, SuccessLabel } from './commons/Labels'
|
||||||
|
import { ExplorerTxLink } from './commons/ExplorerTxLink'
|
||||||
|
|
||||||
|
const Thead = styled.thead`
|
||||||
|
border-bottom: 2px solid #9e9e9e;
|
||||||
|
`
|
||||||
|
|
||||||
|
const StyledExecutionConfirmation = styled.div`
|
||||||
|
margin-top: 30px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export interface ExecutionConfirmationParams {
|
||||||
|
executionData: ExecutionData
|
||||||
|
isHome: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ExecutionConfirmation = ({ executionData, isHome }: ExecutionConfirmationParams) => {
|
||||||
|
const windowWidth = useWindowWidth()
|
||||||
|
|
||||||
|
const txExplorerLink = getExplorerTxUrl(executionData.txHash, isHome)
|
||||||
|
const formattedValidator =
|
||||||
|
windowWidth < 850 && executionData.validator ? formatTxHash(executionData.validator) : executionData.validator
|
||||||
|
|
||||||
|
const getExecutionStatusElement = (validatorStatus = '') => {
|
||||||
|
switch (validatorStatus) {
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.SUCCESS:
|
||||||
|
return <SuccessLabel>{validatorStatus}</SuccessLabel>
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.FAILED:
|
||||||
|
return <RedLabel>{validatorStatus}</RedLabel>
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.PENDING:
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.WAITING:
|
||||||
|
return <GreyLabel>{validatorStatus}</GreyLabel>
|
||||||
|
default:
|
||||||
|
return <SimpleLoading />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<StyledExecutionConfirmation>
|
||||||
|
<table>
|
||||||
|
<Thead>
|
||||||
|
<tr>
|
||||||
|
<th>Executed by</th>
|
||||||
|
<th className="text-center">Status</th>
|
||||||
|
<th className="text-center">Age</th>
|
||||||
|
</tr>
|
||||||
|
</Thead>
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{formattedValidator ? formattedValidator : <SimpleLoading />}</td>
|
||||||
|
<td className="text-center">{getExecutionStatusElement(executionData.status)}</td>
|
||||||
|
<td className="text-center">
|
||||||
|
<ExplorerTxLink href={txExplorerLink} target="_blank">
|
||||||
|
{executionData.timestamp > 0 ? formatTimestamp(executionData.timestamp) : ''}
|
||||||
|
</ExplorerTxLink>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</StyledExecutionConfirmation>
|
||||||
|
)
|
||||||
|
}
|
64
alm/src/components/Form.tsx
Normal file
64
alm/src/components/Form.tsx
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import React, { useState, FormEvent } from 'react'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import { FormSubmitParams } from './MainPage'
|
||||||
|
import { Button } from './commons/Button'
|
||||||
|
import { TransactionSelector } from './TransactionSelector'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
|
||||||
|
const LabelText = styled.label`
|
||||||
|
line-height: 36px;
|
||||||
|
max-width: 140px;
|
||||||
|
`
|
||||||
|
|
||||||
|
const Input = styled.input`
|
||||||
|
background-color: var(--bg-color);
|
||||||
|
color: var(--font-color);
|
||||||
|
max-width: 100%;
|
||||||
|
border-color: var(--color-primary) !important;
|
||||||
|
&:hover,
|
||||||
|
&:active,
|
||||||
|
&:focus {
|
||||||
|
border-color: var(--button-color) !important;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
export const Form = ({ onSubmit }: { onSubmit: ({ chainId, txHash, receipt }: FormSubmitParams) => void }) => {
|
||||||
|
const [txHash, setTxHash] = useState('')
|
||||||
|
const [searchTx, setSearchTx] = useState(false)
|
||||||
|
|
||||||
|
const formSubmit = (e: FormEvent) => {
|
||||||
|
e.preventDefault()
|
||||||
|
setSearchTx(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
const onSelected = (chainId: number, receipt: TransactionReceipt) => {
|
||||||
|
onSubmit({ chainId, txHash, receipt })
|
||||||
|
}
|
||||||
|
|
||||||
|
if (searchTx) {
|
||||||
|
return <TransactionSelector txHash={txHash} onSelected={onSelected} />
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<form onSubmit={formSubmit}>
|
||||||
|
<div className="row is-center">
|
||||||
|
<LabelText className="col-2">Bridgeable tx hash:</LabelText>
|
||||||
|
<div className="col-7">
|
||||||
|
<Input
|
||||||
|
placeholder="Enter transaction hash"
|
||||||
|
type="text"
|
||||||
|
onChange={e => setTxHash(e.target.value)}
|
||||||
|
required
|
||||||
|
pattern="^0x[a-fA-F0-9]{64}$"
|
||||||
|
value={txHash}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div className="col-1">
|
||||||
|
<Button className="button outline" type="submit">
|
||||||
|
Check
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
)
|
||||||
|
}
|
90
alm/src/components/MainPage.tsx
Normal file
90
alm/src/components/MainPage.tsx
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
import React, { useState } from 'react'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import { Route, useHistory } from 'react-router-dom'
|
||||||
|
import { Form } from './Form'
|
||||||
|
import { StatusContainer } from './StatusContainer'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
|
||||||
|
const StyledMainPage = styled.div`
|
||||||
|
text-align: center;
|
||||||
|
min-height: 100vh;
|
||||||
|
`
|
||||||
|
|
||||||
|
const Header = styled.header`
|
||||||
|
background-color: #001529;
|
||||||
|
color: #ffffff;
|
||||||
|
margin-bottom: 50px;
|
||||||
|
`
|
||||||
|
|
||||||
|
const HeaderContainer = styled.header`
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 16px;
|
||||||
|
height: 64px;
|
||||||
|
line-height: 64px;
|
||||||
|
padding: 0 50px;
|
||||||
|
|
||||||
|
@media (max-width: 600px) {
|
||||||
|
padding: 0 20px;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
export interface FormSubmitParams {
|
||||||
|
chainId: number
|
||||||
|
txHash: string
|
||||||
|
receipt: TransactionReceipt
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MainPage = () => {
|
||||||
|
const history = useHistory()
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
const [networkName, setNetworkName] = useState('')
|
||||||
|
const [receipt, setReceipt] = useState<Maybe<TransactionReceipt>>(null)
|
||||||
|
|
||||||
|
const setNetworkData = (chainId: number) => {
|
||||||
|
const network = chainId === home.chainId ? home.name : foreign.name
|
||||||
|
|
||||||
|
setNetworkName(network)
|
||||||
|
}
|
||||||
|
|
||||||
|
const onFormSubmit = ({ chainId, txHash, receipt }: FormSubmitParams) => {
|
||||||
|
setNetworkData(chainId)
|
||||||
|
setReceipt(receipt)
|
||||||
|
history.push(`/${chainId}/${txHash}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const resetNetworkHeader = () => {
|
||||||
|
setNetworkName('')
|
||||||
|
}
|
||||||
|
|
||||||
|
const setNetworkFromParams = (chainId: number) => {
|
||||||
|
setNetworkData(chainId)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<StyledMainPage>
|
||||||
|
<Header>
|
||||||
|
<HeaderContainer>
|
||||||
|
<span>AMB Live Monitoring</span>
|
||||||
|
<span>{networkName}</span>
|
||||||
|
</HeaderContainer>
|
||||||
|
</Header>
|
||||||
|
<div className="container">
|
||||||
|
<Route exact path={['/']} children={<Form onSubmit={onFormSubmit} />} />
|
||||||
|
<Route
|
||||||
|
path={['/:chainId/:txHash/:messageIdParam', '/:chainId/:txHash']}
|
||||||
|
children={
|
||||||
|
<StatusContainer
|
||||||
|
onBackToMain={resetNetworkHeader}
|
||||||
|
setNetworkFromParams={setNetworkFromParams}
|
||||||
|
receiptParam={receipt}
|
||||||
|
/>
|
||||||
|
}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</StyledMainPage>
|
||||||
|
)
|
||||||
|
}
|
47
alm/src/components/MessageSelector.tsx
Normal file
47
alm/src/components/MessageSelector.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React, { useState } from 'react'
|
||||||
|
import { Button } from './commons/Button'
|
||||||
|
import { RadioButtonLabel, RadioButtonContainer } from './commons/RadioButton'
|
||||||
|
import { useWindowWidth } from '@react-hook/window-size'
|
||||||
|
import { formatTxHashExtended } from '../utils/networks'
|
||||||
|
import { MessageObject } from '../utils/web3'
|
||||||
|
|
||||||
|
export interface MessageSelectorParams {
|
||||||
|
messages: Array<MessageObject>
|
||||||
|
onMessageSelected: (index: number) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export const MessageSelector = ({ messages, onMessageSelected }: MessageSelectorParams) => {
|
||||||
|
const [messageIndex, setMessageIndex] = useState(0)
|
||||||
|
const windowWidth = useWindowWidth()
|
||||||
|
|
||||||
|
const onSelect = () => {
|
||||||
|
onMessageSelected(messageIndex)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="row is-center">
|
||||||
|
<div className="col-7-lg col-12 is-marginless">
|
||||||
|
{messages.map((message, i) => (
|
||||||
|
<RadioButtonContainer className="row is-center is-vertical-align" key={i} onClick={() => setMessageIndex(i)}>
|
||||||
|
<input
|
||||||
|
className="is-marginless"
|
||||||
|
type="radio"
|
||||||
|
name="message"
|
||||||
|
value={i}
|
||||||
|
checked={i === messageIndex}
|
||||||
|
onChange={() => setMessageIndex(i)}
|
||||||
|
/>
|
||||||
|
<RadioButtonLabel htmlFor={i.toString()}>
|
||||||
|
{windowWidth < 700 ? formatTxHashExtended(message.id) : message.id}
|
||||||
|
</RadioButtonLabel>
|
||||||
|
</RadioButtonContainer>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="col-1-lg col-12 is-marginless">
|
||||||
|
<Button className="button outline" onClick={onSelect}>
|
||||||
|
Select
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
47
alm/src/components/NetworkTransactionSelector.tsx
Normal file
47
alm/src/components/NetworkTransactionSelector.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React, { useState } from 'react'
|
||||||
|
import { Button } from './commons/Button'
|
||||||
|
import { RadioButtonLabel, RadioButtonContainer } from './commons/RadioButton'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
|
||||||
|
export const NetworkTransactionSelector = ({ onNetworkSelected }: { onNetworkSelected: (chainId: number) => void }) => {
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
const [chainId, setChainId] = useState(home.chainId)
|
||||||
|
|
||||||
|
const networks = [home, foreign]
|
||||||
|
|
||||||
|
const onSelect = () => {
|
||||||
|
onNetworkSelected(chainId)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<p>The transaction was found in both networks, please select one:</p>
|
||||||
|
<div className="row is-center">
|
||||||
|
<div className="col-3-lg col-12 is-marginless">
|
||||||
|
{networks.map((network, i) => (
|
||||||
|
<RadioButtonContainer
|
||||||
|
className="row is-center is-vertical-align"
|
||||||
|
key={i}
|
||||||
|
onClick={() => setChainId(network.chainId)}
|
||||||
|
>
|
||||||
|
<input
|
||||||
|
className="is-marginless"
|
||||||
|
type="radio"
|
||||||
|
name="message"
|
||||||
|
value={network.chainId}
|
||||||
|
checked={network.chainId === chainId}
|
||||||
|
onChange={() => setChainId(network.chainId)}
|
||||||
|
/>
|
||||||
|
<RadioButtonLabel htmlFor={i.toString()}>{network.name}</RadioButtonLabel>
|
||||||
|
</RadioButtonContainer>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
<div className="col-3-lg col-12 is-marginless">
|
||||||
|
<Button className="button outline" onClick={onSelect}>
|
||||||
|
Select
|
||||||
|
</Button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
122
alm/src/components/StatusContainer.tsx
Normal file
122
alm/src/components/StatusContainer.tsx
Normal file
@ -0,0 +1,122 @@
|
|||||||
|
import React, { useEffect } from 'react'
|
||||||
|
import { Link, useHistory, useParams } from 'react-router-dom'
|
||||||
|
import { useTransactionStatus } from '../hooks/useTransactionStatus'
|
||||||
|
import { formatTxHash, getExplorerTxUrl, getTransactionStatusDescription, validTxHash } from '../utils/networks'
|
||||||
|
import { TRANSACTION_STATUS } from '../config/constants'
|
||||||
|
import { MessageSelector } from './MessageSelector'
|
||||||
|
import { Loading } from './commons/Loading'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { ExplorerTxLink } from './commons/ExplorerTxLink'
|
||||||
|
import { ConfirmationsContainer } from './ConfirmationsContainer'
|
||||||
|
import { LeftArrow } from './commons/LeftArrow'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
|
||||||
|
const BackButton = styled.button`
|
||||||
|
color: var(--button-color);
|
||||||
|
border-color: var(--font-color);
|
||||||
|
margin-top: 10px;
|
||||||
|
&:focus {
|
||||||
|
outline: var(--button-color);
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
const BackLabel = styled.label`
|
||||||
|
margin-left: 5px;
|
||||||
|
cursor: pointer;
|
||||||
|
`
|
||||||
|
|
||||||
|
export interface StatusContainerParam {
|
||||||
|
onBackToMain: () => void
|
||||||
|
setNetworkFromParams: (chainId: number) => void
|
||||||
|
receiptParam: Maybe<TransactionReceipt>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const StatusContainer = ({ onBackToMain, setNetworkFromParams, receiptParam }: StatusContainerParam) => {
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
const history = useHistory()
|
||||||
|
const { chainId, txHash, messageIdParam } = useParams()
|
||||||
|
const validChainId = chainId === home.chainId.toString() || chainId === foreign.chainId.toString()
|
||||||
|
const validParameters = validChainId && validTxHash(txHash)
|
||||||
|
|
||||||
|
const { messages, receipt, status, description, timestamp, loading } = useTransactionStatus({
|
||||||
|
txHash: validParameters ? txHash : '',
|
||||||
|
chainId: validParameters ? parseInt(chainId) : 0,
|
||||||
|
receiptParam
|
||||||
|
})
|
||||||
|
|
||||||
|
const selectedMessageId = messageIdParam === undefined || messages[messageIdParam] === undefined ? -1 : messageIdParam
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (validChainId) {
|
||||||
|
setNetworkFromParams(parseInt(chainId))
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[validChainId, chainId, setNetworkFromParams]
|
||||||
|
)
|
||||||
|
|
||||||
|
if (!validParameters && home.chainId && foreign.chainId) {
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<p>
|
||||||
|
Chain Id: {chainId} and/or Transaction Hash: {txHash} are not valid
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (loading) {
|
||||||
|
return <Loading />
|
||||||
|
}
|
||||||
|
|
||||||
|
const onMessageSelected = (messageId: number) => {
|
||||||
|
history.push(`/${chainId}/${txHash}/${messageId}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
const displayMessageSelector = status === TRANSACTION_STATUS.SUCCESS_MULTIPLE_MESSAGES && selectedMessageId === -1
|
||||||
|
const multiMessageSelected = status === TRANSACTION_STATUS.SUCCESS_MULTIPLE_MESSAGES && selectedMessageId !== -1
|
||||||
|
const displayReference = multiMessageSelected ? messages[selectedMessageId].id : txHash
|
||||||
|
const formattedMessageId = formatTxHash(displayReference)
|
||||||
|
|
||||||
|
const displayedDescription = multiMessageSelected
|
||||||
|
? getTransactionStatusDescription(TRANSACTION_STATUS.SUCCESS_ONE_MESSAGE, timestamp)
|
||||||
|
: description
|
||||||
|
|
||||||
|
const isHome = chainId === home.chainId.toString()
|
||||||
|
const txExplorerLink = getExplorerTxUrl(txHash, isHome)
|
||||||
|
const displayExplorerLink = status !== TRANSACTION_STATUS.NOT_FOUND
|
||||||
|
|
||||||
|
const displayConfirmations = status === TRANSACTION_STATUS.SUCCESS_ONE_MESSAGE || multiMessageSelected
|
||||||
|
const messageToConfirm =
|
||||||
|
messages.length > 1 ? messages[selectedMessageId] : messages.length > 0 ? messages[0] : { id: '', data: '' }
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
{status && (
|
||||||
|
<p>
|
||||||
|
The request{' '}
|
||||||
|
{displayExplorerLink && (
|
||||||
|
<ExplorerTxLink href={txExplorerLink} target="blank">
|
||||||
|
{formattedMessageId}
|
||||||
|
</ExplorerTxLink>
|
||||||
|
)}
|
||||||
|
{!displayExplorerLink && <label>{formattedMessageId}</label>} {displayedDescription}
|
||||||
|
</p>
|
||||||
|
)}
|
||||||
|
{displayMessageSelector && <MessageSelector messages={messages} onMessageSelected={onMessageSelected} />}
|
||||||
|
{displayConfirmations && (
|
||||||
|
<ConfirmationsContainer message={messageToConfirm} receipt={receipt} fromHome={isHome} timestamp={timestamp} />
|
||||||
|
)}
|
||||||
|
<div className="row is-center">
|
||||||
|
<div className="col-9">
|
||||||
|
<Link to="/" onClick={onBackToMain}>
|
||||||
|
<BackButton className="button outline is-left">
|
||||||
|
<LeftArrow />
|
||||||
|
<BackLabel>Search another transaction</BackLabel>
|
||||||
|
</BackButton>
|
||||||
|
</Link>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
47
alm/src/components/TransactionSelector.tsx
Normal file
47
alm/src/components/TransactionSelector.tsx
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
import React, { useEffect } from 'react'
|
||||||
|
import { useTransactionFinder } from '../hooks/useTransactionFinder'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { TRANSACTION_STATUS } from '../config/constants'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { Loading } from './commons/Loading'
|
||||||
|
import { NetworkTransactionSelector } from './NetworkTransactionSelector'
|
||||||
|
|
||||||
|
export const TransactionSelector = ({
|
||||||
|
txHash,
|
||||||
|
onSelected
|
||||||
|
}: {
|
||||||
|
txHash: string
|
||||||
|
onSelected: (chainId: number, receipt: TransactionReceipt) => void
|
||||||
|
}) => {
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
const { receipt: homeReceipt, status: homeStatus } = useTransactionFinder({ txHash, web3: home.web3 })
|
||||||
|
const { receipt: foreignReceipt, status: foreignStatus } = useTransactionFinder({ txHash, web3: foreign.web3 })
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!home.chainId || !foreign.chainId) return
|
||||||
|
if (homeStatus === TRANSACTION_STATUS.FOUND && foreignStatus === TRANSACTION_STATUS.NOT_FOUND) {
|
||||||
|
if (!homeReceipt) return
|
||||||
|
onSelected(home.chainId, homeReceipt)
|
||||||
|
} else if (foreignStatus === TRANSACTION_STATUS.FOUND && homeStatus === TRANSACTION_STATUS.NOT_FOUND) {
|
||||||
|
if (!foreignReceipt) return
|
||||||
|
onSelected(foreign.chainId, foreignReceipt)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[homeReceipt, homeStatus, foreignReceipt, foreignStatus, home.chainId, foreign.chainId, onSelected]
|
||||||
|
)
|
||||||
|
|
||||||
|
const onSelectedNetwork = (chainId: number) => {
|
||||||
|
const chain = chainId === home.chainId ? home.chainId : foreign.chainId
|
||||||
|
const receipt = chainId === home.chainId ? homeReceipt : foreignReceipt
|
||||||
|
|
||||||
|
if (!receipt) return
|
||||||
|
onSelected(chain, receipt)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (foreignStatus === TRANSACTION_STATUS.FOUND && homeStatus === TRANSACTION_STATUS.FOUND) {
|
||||||
|
return <NetworkTransactionSelector onNetworkSelected={onSelectedNetwork} />
|
||||||
|
}
|
||||||
|
|
||||||
|
return <Loading />
|
||||||
|
}
|
91
alm/src/components/ValidatorsConfirmations.tsx
Normal file
91
alm/src/components/ValidatorsConfirmations.tsx
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { formatTimestamp, formatTxHash, getExplorerTxUrl } from '../utils/networks'
|
||||||
|
import { useWindowWidth } from '@react-hook/window-size'
|
||||||
|
import { VALIDATOR_CONFIRMATION_STATUS } from '../config/constants'
|
||||||
|
import { SimpleLoading } from './commons/Loading'
|
||||||
|
import styled from 'styled-components'
|
||||||
|
import { ConfirmationParam } from '../hooks/useMessageConfirmations'
|
||||||
|
import { GreyLabel, RedLabel, SuccessLabel } from './commons/Labels'
|
||||||
|
import { ExplorerTxLink } from './commons/ExplorerTxLink'
|
||||||
|
|
||||||
|
const Thead = styled.thead`
|
||||||
|
border-bottom: 2px solid #9e9e9e;
|
||||||
|
`
|
||||||
|
|
||||||
|
const RequiredConfirmations = styled.label`
|
||||||
|
font-size: 14px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export interface ValidatorsConfirmationsParams {
|
||||||
|
confirmations: Array<ConfirmationParam>
|
||||||
|
requiredSignatures: number
|
||||||
|
validatorList: string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export const ValidatorsConfirmations = ({
|
||||||
|
confirmations,
|
||||||
|
requiredSignatures,
|
||||||
|
validatorList
|
||||||
|
}: ValidatorsConfirmationsParams) => {
|
||||||
|
const windowWidth = useWindowWidth()
|
||||||
|
|
||||||
|
const getValidatorStatusElement = (validatorStatus = '') => {
|
||||||
|
switch (validatorStatus) {
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.SUCCESS:
|
||||||
|
return <SuccessLabel>{validatorStatus}</SuccessLabel>
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.FAILED:
|
||||||
|
return <RedLabel>{validatorStatus}</RedLabel>
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.PENDING:
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.WAITING:
|
||||||
|
case VALIDATOR_CONFIRMATION_STATUS.NOT_REQUIRED:
|
||||||
|
return <GreyLabel>{validatorStatus}</GreyLabel>
|
||||||
|
default:
|
||||||
|
return <SimpleLoading />
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div>
|
||||||
|
<table>
|
||||||
|
<Thead>
|
||||||
|
<tr>
|
||||||
|
<th>Validator</th>
|
||||||
|
<th className="text-center">Status</th>
|
||||||
|
<th className="text-center">Age</th>
|
||||||
|
</tr>
|
||||||
|
</Thead>
|
||||||
|
<tbody>
|
||||||
|
{validatorList.map((validator, i) => {
|
||||||
|
const filteredConfirmation = confirmations.filter(c => c.validator === validator)
|
||||||
|
const confirmation = filteredConfirmation.length > 0 ? filteredConfirmation[0] : null
|
||||||
|
const displayedStatus = confirmation && confirmation.status ? confirmation.status : ''
|
||||||
|
const explorerLink = confirmation && confirmation.txHash ? getExplorerTxUrl(confirmation.txHash, true) : ''
|
||||||
|
const elementIfNoTimestamp =
|
||||||
|
displayedStatus !== VALIDATOR_CONFIRMATION_STATUS.WAITING &&
|
||||||
|
displayedStatus !== VALIDATOR_CONFIRMATION_STATUS.NOT_REQUIRED ? (
|
||||||
|
<SimpleLoading />
|
||||||
|
) : (
|
||||||
|
''
|
||||||
|
)
|
||||||
|
return (
|
||||||
|
<tr key={i}>
|
||||||
|
<td>{windowWidth < 850 ? formatTxHash(validator) : validator}</td>
|
||||||
|
<td className="text-center">{getValidatorStatusElement(displayedStatus)}</td>
|
||||||
|
<td className="text-center">
|
||||||
|
<ExplorerTxLink href={explorerLink} target="_blank">
|
||||||
|
{confirmation && confirmation.timestamp > 0
|
||||||
|
? formatTimestamp(confirmation.timestamp)
|
||||||
|
: elementIfNoTimestamp}
|
||||||
|
</ExplorerTxLink>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
)
|
||||||
|
})}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
<RequiredConfirmations>
|
||||||
|
{requiredSignatures} of {validatorList.length} confirmations required
|
||||||
|
</RequiredConfirmations>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
10
alm/src/components/commons/Button.tsx
Normal file
10
alm/src/components/commons/Button.tsx
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
import styled from 'styled-components'
|
||||||
|
|
||||||
|
export const Button = styled.button`
|
||||||
|
height: 36px;
|
||||||
|
color: var(--button-color);
|
||||||
|
border-color: var(--button-color);
|
||||||
|
&:focus {
|
||||||
|
outline: var(--button-color);
|
||||||
|
}
|
||||||
|
`
|
7
alm/src/components/commons/ExplorerTxLink.tsx
Normal file
7
alm/src/components/commons/ExplorerTxLink.tsx
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
import styled from 'styled-components'
|
||||||
|
|
||||||
|
export const ExplorerTxLink = styled.a`
|
||||||
|
color: var(--link-color);
|
||||||
|
text-decoration: underline;
|
||||||
|
font-weight: bold;
|
||||||
|
`
|
22
alm/src/components/commons/Labels.tsx
Normal file
22
alm/src/components/commons/Labels.tsx
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import styled from 'styled-components'
|
||||||
|
|
||||||
|
export const SuccessLabel = styled.label`
|
||||||
|
color: var(--success-color);
|
||||||
|
background-color: var(--success-bg-color);
|
||||||
|
padding: 0.4rem 0.7rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export const GreyLabel = styled.label`
|
||||||
|
color: var(--not-required-color);
|
||||||
|
background-color: var(--not-required-bg-color);
|
||||||
|
padding: 0.4rem 0.7rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export const RedLabel = styled.label`
|
||||||
|
color: var(--failed-color);
|
||||||
|
background-color: var(--failed-bg-color);
|
||||||
|
padding: 0.4rem 0.7rem;
|
||||||
|
border-radius: 4px;
|
||||||
|
`
|
20
alm/src/components/commons/LeftArrow.tsx
Normal file
20
alm/src/components/commons/LeftArrow.tsx
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { useContext } from 'react'
|
||||||
|
import { ThemeContext } from 'styled-components'
|
||||||
|
|
||||||
|
export const LeftArrow = () => {
|
||||||
|
const themeContext = useContext(ThemeContext)
|
||||||
|
return (
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
version="1.1"
|
||||||
|
id="mdi-arrow-left"
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill={themeContext.buttonColor}
|
||||||
|
>
|
||||||
|
<path d="M20,11V13H8L13.5,18.5L12.08,19.92L4.16,12L12.08,4.08L13.5,5.5L8,11H20Z" />
|
||||||
|
</svg>
|
||||||
|
)
|
||||||
|
}
|
165
alm/src/components/commons/Loading.tsx
Normal file
165
alm/src/components/commons/Loading.tsx
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
import React, { useContext } from 'react'
|
||||||
|
import { ThemeContext } from 'styled-components'
|
||||||
|
|
||||||
|
export interface LoadingParams {
|
||||||
|
width?: string
|
||||||
|
height?: string
|
||||||
|
displayMessage?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const Loading = ({ width = '50px', height = '50px', displayMessage = true }: LoadingParams) => {
|
||||||
|
const themeContext = useContext(ThemeContext)
|
||||||
|
return (
|
||||||
|
<div className="row is-center">
|
||||||
|
<svg
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
style={{ background: 'none', display: 'block', shapeRendering: 'auto' }}
|
||||||
|
width={width}
|
||||||
|
height={height}
|
||||||
|
viewBox="0 0 100 100"
|
||||||
|
preserveAspectRatio="xMidYMid"
|
||||||
|
>
|
||||||
|
<g transform="rotate(0 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.9166666666666666s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(30 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.8333333333333334s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(60 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.75s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(90 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.6666666666666666s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(120 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.5833333333333334s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(150 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.5s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(180 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.4166666666666667s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(210 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.3333333333333333s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(240 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.25s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(270 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.16666666666666666s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(300 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate
|
||||||
|
attributeName="opacity"
|
||||||
|
values="1;0"
|
||||||
|
keyTimes="0;1"
|
||||||
|
dur="1s"
|
||||||
|
begin="-0.08333333333333333s"
|
||||||
|
repeatCount="indefinite"
|
||||||
|
/>
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
<g transform="rotate(330 50 50)">
|
||||||
|
<rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill={themeContext.buttonColor}>
|
||||||
|
<animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="0s" repeatCount="indefinite" />
|
||||||
|
</rect>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
{displayMessage && <label style={{ color: themeContext.buttonColor }}>Loading...</label>}
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const SimpleLoading = () => <Loading width="30px" height="30px" displayMessage={false} />
|
9
alm/src/components/commons/RadioButton.tsx
Normal file
9
alm/src/components/commons/RadioButton.tsx
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import styled from 'styled-components'
|
||||||
|
|
||||||
|
export const RadioButtonLabel = styled.label`
|
||||||
|
padding-left: 5px;
|
||||||
|
`
|
||||||
|
|
||||||
|
export const RadioButtonContainer = styled.div`
|
||||||
|
padding: 10px;
|
||||||
|
`
|
59
alm/src/config/constants.ts
Normal file
59
alm/src/config/constants.ts
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
export const HOME_BRIDGE_ADDRESS: string = process.env.REACT_APP_COMMON_HOME_BRIDGE_ADDRESS || ''
|
||||||
|
export const FOREIGN_BRIDGE_ADDRESS: string = process.env.REACT_APP_COMMON_FOREIGN_BRIDGE_ADDRESS || ''
|
||||||
|
|
||||||
|
export const HOME_RPC_URL: string = process.env.REACT_APP_COMMON_HOME_RPC_URL || ''
|
||||||
|
export const FOREIGN_RPC_URL: string = process.env.REACT_APP_COMMON_FOREIGN_RPC_URL || ''
|
||||||
|
|
||||||
|
export const HOME_NETWORK_NAME: string = process.env.REACT_APP_ALM_HOME_NETWORK_NAME || ''
|
||||||
|
export const FOREIGN_NETWORK_NAME: string = process.env.REACT_APP_ALM_FOREIGN_NETWORK_NAME || ''
|
||||||
|
|
||||||
|
export const HOME_EXPLORER_TX_TEMPLATE: string = process.env.REACT_APP_ALM_HOME_EXPLORER_TX_TEMPLATE || ''
|
||||||
|
export const FOREIGN_EXPLORER_TX_TEMPLATE: string = process.env.REACT_APP_ALM_FOREIGN_EXPLORER_TX_TEMPLATE || ''
|
||||||
|
|
||||||
|
export const HOME_EXPLORER_API: string = process.env.REACT_APP_ALM_HOME_EXPLORER_API || ''
|
||||||
|
export const FOREIGN_EXPLORER_API: string = process.env.REACT_APP_ALM_FOREIGN_EXPLORER_API || ''
|
||||||
|
|
||||||
|
export const HOME_RPC_POLLING_INTERVAL: number = 5000
|
||||||
|
export const FOREIGN_RPC_POLLING_INTERVAL: number = 5000
|
||||||
|
export const BLOCK_RANGE: number = 50
|
||||||
|
export const ONE_DAY_TIMESTAMP: number = 86400
|
||||||
|
export const THREE_DAYS_TIMESTAMP: number = 259200
|
||||||
|
|
||||||
|
export const EXECUTE_AFFIRMATION_HASH = 'e7a2c01f'
|
||||||
|
export const SUBMIT_SIGNATURE_HASH = '630cea8e'
|
||||||
|
export const EXECUTE_SIGNATURES_HASH = '3f7658fd'
|
||||||
|
|
||||||
|
export const CACHE_KEY_SUCCESS = 'success-confirmation-validator-'
|
||||||
|
export const CACHE_KEY_FAILED = 'failed-confirmation-validator-'
|
||||||
|
export const CACHE_KEY_EXECUTION_FAILED = 'failed-execution-validator-'
|
||||||
|
|
||||||
|
export const TRANSACTION_STATUS = {
|
||||||
|
SUCCESS_MULTIPLE_MESSAGES: 'SUCCESS_MULTIPLE_MESSAGES',
|
||||||
|
SUCCESS_ONE_MESSAGE: 'SUCCESS_ONE_MESSAGE',
|
||||||
|
SUCCESS_NO_MESSAGES: 'SUCCESS_NO_MESSAGES',
|
||||||
|
FAILED: 'FAILED',
|
||||||
|
FOUND: 'FOUND',
|
||||||
|
NOT_FOUND: 'NOT_FOUND',
|
||||||
|
UNDEFINED: 'UNDEFINED'
|
||||||
|
}
|
||||||
|
|
||||||
|
export const CONFIRMATIONS_STATUS = {
|
||||||
|
SUCCESS: 'SUCCESS',
|
||||||
|
SUCCESS_MESSAGE_FAILED: 'SUCCESS_MESSAGE_FAILED',
|
||||||
|
EXECUTION_FAILED: 'EXECUTION_FAILED',
|
||||||
|
EXECUTION_PENDING: 'EXECUTION_PENDING',
|
||||||
|
EXECUTION_WAITING: 'EXECUTION_WAITING',
|
||||||
|
FAILED: 'FAILED',
|
||||||
|
PENDING: 'PENDING',
|
||||||
|
WAITING: 'WAITING',
|
||||||
|
UNDEFINED: 'UNDEFINED'
|
||||||
|
}
|
||||||
|
|
||||||
|
export const VALIDATOR_CONFIRMATION_STATUS = {
|
||||||
|
SUCCESS: 'Success',
|
||||||
|
FAILED: 'Failed',
|
||||||
|
PENDING: 'Pending',
|
||||||
|
WAITING: 'Waiting',
|
||||||
|
NOT_REQUIRED: 'Not required',
|
||||||
|
UNDEFINED: 'UNDEFINED'
|
||||||
|
}
|
36
alm/src/config/descriptions.ts
Normal file
36
alm/src/config/descriptions.ts
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
// %t will be replaced by the time -> x minutes/hours/days ago
|
||||||
|
export const TRANSACTION_STATUS_DESCRIPTION: { [key: string]: string } = {
|
||||||
|
SUCCESS_MULTIPLE_MESSAGES: 'was initiated %t and contains several bridge messages. Specify one of them:',
|
||||||
|
SUCCESS_ONE_MESSAGE: 'was initiated %t',
|
||||||
|
SUCCESS_NO_MESSAGES: 'execution succeeded %t but it does not contain any bridge messages',
|
||||||
|
FAILED: 'failed %t',
|
||||||
|
NOT_FOUND: 'was not found'
|
||||||
|
}
|
||||||
|
|
||||||
|
export const CONFIRMATIONS_STATUS_LABEL: { [key: string]: string } = {
|
||||||
|
SUCCESS: 'Success',
|
||||||
|
SUCCESS_MESSAGE_FAILED: 'Success',
|
||||||
|
EXECUTION_FAILED: 'Execution failed',
|
||||||
|
EXECUTION_PENDING: 'Execution pending',
|
||||||
|
EXECUTION_WAITING: 'Execution waiting',
|
||||||
|
FAILED: 'Failed',
|
||||||
|
PENDING: 'Pending',
|
||||||
|
WAITING: 'Waiting'
|
||||||
|
}
|
||||||
|
|
||||||
|
// %homeChain will be replaced by the home network name
|
||||||
|
// %foreignChain will be replaced by the foreign network name
|
||||||
|
export const CONFIRMATIONS_STATUS_DESCRIPTION: { [key: string]: string } = {
|
||||||
|
SUCCESS: '',
|
||||||
|
SUCCESS_MESSAGE_FAILED:
|
||||||
|
'Signatures have been collected in the %homeChain and they were successfully sent to the %foreignChain but the contained message execution failed.',
|
||||||
|
EXECUTION_FAILED:
|
||||||
|
'Signatures have been collected in the %homeChain and they were sent to the %foreignChain but the transaction with signatures failed',
|
||||||
|
EXECUTION_PENDING:
|
||||||
|
'Signatures have been collected in the %homeChain and they were sent to the %foreignChain but the transaction is in the pending state (transactions congestion or low gas price)',
|
||||||
|
EXECUTION_WAITING: 'Execution waiting',
|
||||||
|
FAILED:
|
||||||
|
'Some validators sent improper transactions as so they were failed, collected confirmations are not enough to execute the relay request',
|
||||||
|
PENDING: 'Some confirmations are in pending state',
|
||||||
|
WAITING: 'Validators are waiting for the chain finalization'
|
||||||
|
}
|
1
alm/src/global.d.ts
vendored
Normal file
1
alm/src/global.d.ts
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
declare type Maybe<T> = T | null
|
38
alm/src/hooks/useBlockConfirmations.ts
Normal file
38
alm/src/hooks/useBlockConfirmations.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
import { getRequiredBlockConfirmations } from '../utils/contract'
|
||||||
|
|
||||||
|
export interface UseBlockConfirmationsParams {
|
||||||
|
fromHome: boolean
|
||||||
|
receipt: Maybe<TransactionReceipt>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useBlockConfirmations = ({ receipt, fromHome }: UseBlockConfirmationsParams) => {
|
||||||
|
const [blockConfirmations, setBlockConfirmations] = useState(0)
|
||||||
|
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
|
||||||
|
const callRequireBlockConfirmations = async (
|
||||||
|
contract: Contract,
|
||||||
|
receipt: TransactionReceipt,
|
||||||
|
setResult: Function
|
||||||
|
) => {
|
||||||
|
const result = await getRequiredBlockConfirmations(contract, receipt.blockNumber)
|
||||||
|
setResult(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
const bridgeContract = fromHome ? home.bridgeContract : foreign.bridgeContract
|
||||||
|
if (!bridgeContract || !receipt) return
|
||||||
|
callRequireBlockConfirmations(bridgeContract, receipt, setBlockConfirmations)
|
||||||
|
},
|
||||||
|
[home.bridgeContract, foreign.bridgeContract, receipt, fromHome]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
blockConfirmations
|
||||||
|
}
|
||||||
|
}
|
38
alm/src/hooks/useBridgeContracts.ts
Normal file
38
alm/src/hooks/useBridgeContracts.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { HOME_AMB_ABI, FOREIGN_AMB_ABI } from '../abis'
|
||||||
|
import { FOREIGN_BRIDGE_ADDRESS, HOME_BRIDGE_ADDRESS } from '../config/constants'
|
||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
|
||||||
|
export interface useBridgeContractsParams {
|
||||||
|
homeWeb3: Web3
|
||||||
|
foreignWeb3: Web3
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useBridgeContracts = ({ homeWeb3, foreignWeb3 }: useBridgeContractsParams) => {
|
||||||
|
const [homeBridge, setHomeBridge] = useState<Maybe<Contract>>(null)
|
||||||
|
const [foreignBridge, setForeignBridge] = useState<Maybe<Contract>>(null)
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!homeWeb3) return
|
||||||
|
const homeContract = new homeWeb3.eth.Contract(HOME_AMB_ABI, HOME_BRIDGE_ADDRESS)
|
||||||
|
setHomeBridge(homeContract)
|
||||||
|
},
|
||||||
|
[homeWeb3]
|
||||||
|
)
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!foreignWeb3) return
|
||||||
|
const foreignContract = new foreignWeb3.eth.Contract(FOREIGN_AMB_ABI, FOREIGN_BRIDGE_ADDRESS)
|
||||||
|
setForeignBridge(foreignContract)
|
||||||
|
},
|
||||||
|
[foreignWeb3]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
homeBridge,
|
||||||
|
foreignBridge
|
||||||
|
}
|
||||||
|
}
|
357
alm/src/hooks/useMessageConfirmations.ts
Normal file
357
alm/src/hooks/useMessageConfirmations.ts
Normal file
@ -0,0 +1,357 @@
|
|||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { MessageObject } from '../utils/web3'
|
||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { EventData } from 'web3-eth-contract'
|
||||||
|
import { getAffirmationsSigned, getMessagesSigned } from '../utils/contract'
|
||||||
|
import {
|
||||||
|
BLOCK_RANGE,
|
||||||
|
CONFIRMATIONS_STATUS,
|
||||||
|
FOREIGN_RPC_POLLING_INTERVAL,
|
||||||
|
HOME_RPC_POLLING_INTERVAL,
|
||||||
|
VALIDATOR_CONFIRMATION_STATUS
|
||||||
|
} from '../config/constants'
|
||||||
|
import { homeBlockNumberProvider, foreignBlockNumberProvider } from '../services/BlockNumberProvider'
|
||||||
|
import { checkSignaturesWaitingForBLocks } from '../utils/signatureWaitingForBlocks'
|
||||||
|
import { getCollectedSignaturesEvent } from '../utils/getCollectedSignaturesEvent'
|
||||||
|
import { checkWaitingBlocksForExecution } from '../utils/executionWaitingForBlocks'
|
||||||
|
import { getConfirmationsForTx } from '../utils/getConfirmationsForTx'
|
||||||
|
import { getFinalizationEvent } from '../utils/getFinalizationEvent'
|
||||||
|
import {
|
||||||
|
getValidatorFailedTransactionsForMessage,
|
||||||
|
getExecutionFailedTransactionForMessage,
|
||||||
|
getValidatorPendingTransactionsForMessage,
|
||||||
|
getExecutionPendingTransactionsForMessage,
|
||||||
|
getValidatorSuccessTransactionsForMessage
|
||||||
|
} from '../utils/explorer'
|
||||||
|
|
||||||
|
export interface useMessageConfirmationsParams {
|
||||||
|
message: MessageObject
|
||||||
|
receipt: Maybe<TransactionReceipt>
|
||||||
|
fromHome: boolean
|
||||||
|
timestamp: number
|
||||||
|
requiredSignatures: number
|
||||||
|
validatorList: string[]
|
||||||
|
blockConfirmations: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BasicConfirmationParam {
|
||||||
|
validator: string
|
||||||
|
status: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ConfirmationParam extends BasicConfirmationParam {
|
||||||
|
txHash: string
|
||||||
|
timestamp: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ExecutionData {
|
||||||
|
status: string
|
||||||
|
validator: string
|
||||||
|
txHash: string
|
||||||
|
timestamp: number
|
||||||
|
executionResult: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useMessageConfirmations = ({
|
||||||
|
message,
|
||||||
|
receipt,
|
||||||
|
fromHome,
|
||||||
|
timestamp,
|
||||||
|
requiredSignatures,
|
||||||
|
validatorList,
|
||||||
|
blockConfirmations
|
||||||
|
}: useMessageConfirmationsParams) => {
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
const [confirmations, setConfirmations] = useState<Array<ConfirmationParam>>([])
|
||||||
|
const [status, setStatus] = useState(CONFIRMATIONS_STATUS.UNDEFINED)
|
||||||
|
const [waitingBlocks, setWaitingBlocks] = useState(false)
|
||||||
|
const [waitingBlocksResolved, setWaitingBlocksResolved] = useState(false)
|
||||||
|
const [signatureCollected, setSignatureCollected] = useState(false)
|
||||||
|
const [collectedSignaturesEvent, setCollectedSignaturesEvent] = useState<Maybe<EventData>>(null)
|
||||||
|
const [executionData, setExecutionData] = useState<ExecutionData>({
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.UNDEFINED,
|
||||||
|
validator: '',
|
||||||
|
txHash: '',
|
||||||
|
timestamp: 0,
|
||||||
|
executionResult: false
|
||||||
|
})
|
||||||
|
const [waitingBlocksForExecution, setWaitingBlocksForExecution] = useState(false)
|
||||||
|
const [waitingBlocksForExecutionResolved, setWaitingBlocksForExecutionResolved] = useState(false)
|
||||||
|
const [failedConfirmations, setFailedConfirmations] = useState(false)
|
||||||
|
const [failedExecution, setFailedExecution] = useState(false)
|
||||||
|
const [pendingConfirmations, setPendingConfirmations] = useState(false)
|
||||||
|
const [pendingExecution, setPendingExecution] = useState(false)
|
||||||
|
|
||||||
|
// Check if the validators are waiting for block confirmations to verify the message
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!receipt || !blockConfirmations) return
|
||||||
|
|
||||||
|
const subscriptions: Array<number> = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const blockProvider = fromHome ? homeBlockNumberProvider : foreignBlockNumberProvider
|
||||||
|
const interval = fromHome ? HOME_RPC_POLLING_INTERVAL : FOREIGN_RPC_POLLING_INTERVAL
|
||||||
|
const web3 = fromHome ? home.web3 : foreign.web3
|
||||||
|
blockProvider.start(web3)
|
||||||
|
|
||||||
|
const targetBlock = receipt.blockNumber + blockConfirmations
|
||||||
|
|
||||||
|
checkSignaturesWaitingForBLocks(
|
||||||
|
targetBlock,
|
||||||
|
setWaitingBlocks,
|
||||||
|
setWaitingBlocksResolved,
|
||||||
|
validatorList,
|
||||||
|
setConfirmations,
|
||||||
|
blockProvider,
|
||||||
|
interval,
|
||||||
|
subscriptions
|
||||||
|
)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
unsubscribe()
|
||||||
|
blockProvider.stop()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[blockConfirmations, foreign.web3, fromHome, validatorList, home.web3, receipt]
|
||||||
|
)
|
||||||
|
|
||||||
|
// The collected signature event is only fetched once the signatures are collected on tx from home to foreign, to calculate if
|
||||||
|
// the execution tx on the foreign network is waiting for block confirmations
|
||||||
|
// This is executed if the message is in Home to Foreign direction only
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!fromHome || !receipt || !home.web3 || !signatureCollected) return
|
||||||
|
|
||||||
|
const subscriptions: Array<number> = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
homeBlockNumberProvider.start(home.web3)
|
||||||
|
|
||||||
|
const fromBlock = receipt.blockNumber
|
||||||
|
const toBlock = fromBlock + BLOCK_RANGE
|
||||||
|
const messageHash = home.web3.utils.soliditySha3Raw(message.data)
|
||||||
|
|
||||||
|
getCollectedSignaturesEvent(
|
||||||
|
home.web3,
|
||||||
|
home.bridgeContract,
|
||||||
|
fromBlock,
|
||||||
|
toBlock,
|
||||||
|
messageHash,
|
||||||
|
setCollectedSignaturesEvent,
|
||||||
|
subscriptions
|
||||||
|
)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
unsubscribe()
|
||||||
|
homeBlockNumberProvider.stop()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[fromHome, home.bridgeContract, home.web3, message.data, receipt, signatureCollected]
|
||||||
|
)
|
||||||
|
|
||||||
|
// Check if the responsible validator is waiting for block confirmations to execute the message on foreign network
|
||||||
|
// This is executed if the message is in Home to Foreign direction only
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!fromHome || !home.web3 || !receipt || !collectedSignaturesEvent || !blockConfirmations) return
|
||||||
|
|
||||||
|
const subscriptions: Array<number> = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
homeBlockNumberProvider.start(home.web3)
|
||||||
|
const targetBlock = collectedSignaturesEvent.blockNumber + blockConfirmations
|
||||||
|
|
||||||
|
checkWaitingBlocksForExecution(
|
||||||
|
homeBlockNumberProvider,
|
||||||
|
HOME_RPC_POLLING_INTERVAL,
|
||||||
|
targetBlock,
|
||||||
|
collectedSignaturesEvent,
|
||||||
|
setWaitingBlocksForExecution,
|
||||||
|
setWaitingBlocksForExecutionResolved,
|
||||||
|
setExecutionData,
|
||||||
|
subscriptions
|
||||||
|
)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
unsubscribe()
|
||||||
|
homeBlockNumberProvider.stop()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[collectedSignaturesEvent, fromHome, blockConfirmations, home.web3, receipt]
|
||||||
|
)
|
||||||
|
|
||||||
|
// Checks if validators verified the message
|
||||||
|
// To avoid making extra requests, this is only executed when validators finished waiting for blocks confirmations
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!waitingBlocksResolved || !timestamp || !requiredSignatures) return
|
||||||
|
|
||||||
|
const subscriptions: Array<number> = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmationContractMethod = fromHome ? getMessagesSigned : getAffirmationsSigned
|
||||||
|
|
||||||
|
getConfirmationsForTx(
|
||||||
|
message.data,
|
||||||
|
home.web3,
|
||||||
|
validatorList,
|
||||||
|
home.bridgeContract,
|
||||||
|
confirmationContractMethod,
|
||||||
|
setConfirmations,
|
||||||
|
requiredSignatures,
|
||||||
|
setSignatureCollected,
|
||||||
|
waitingBlocksResolved,
|
||||||
|
subscriptions,
|
||||||
|
timestamp,
|
||||||
|
getValidatorFailedTransactionsForMessage,
|
||||||
|
setFailedConfirmations,
|
||||||
|
getValidatorPendingTransactionsForMessage,
|
||||||
|
setPendingConfirmations,
|
||||||
|
getValidatorSuccessTransactionsForMessage
|
||||||
|
)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
fromHome,
|
||||||
|
message.data,
|
||||||
|
home.web3,
|
||||||
|
validatorList,
|
||||||
|
home.bridgeContract,
|
||||||
|
requiredSignatures,
|
||||||
|
waitingBlocksResolved,
|
||||||
|
timestamp
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
// Gets finalization event to display the information about the execution of the message
|
||||||
|
// In a message from Home to Foreign it will be executed after finishing waiting for block confirmations for the execution transaction on Foreign
|
||||||
|
// In a message from Foreign to Home it will be executed after finishing waiting for block confirmations of the message request
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if ((fromHome && !waitingBlocksForExecutionResolved) || (!fromHome && !waitingBlocksResolved)) return
|
||||||
|
|
||||||
|
const subscriptions: Array<number> = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const contractEvent = fromHome ? 'RelayedMessage' : 'AffirmationCompleted'
|
||||||
|
const bridgeContract = fromHome ? foreign.bridgeContract : home.bridgeContract
|
||||||
|
const providedWeb3 = fromHome ? foreign.web3 : home.web3
|
||||||
|
const interval = fromHome ? FOREIGN_RPC_POLLING_INTERVAL : HOME_RPC_POLLING_INTERVAL
|
||||||
|
|
||||||
|
getFinalizationEvent(
|
||||||
|
bridgeContract,
|
||||||
|
contractEvent,
|
||||||
|
providedWeb3,
|
||||||
|
setExecutionData,
|
||||||
|
waitingBlocksResolved,
|
||||||
|
message,
|
||||||
|
interval,
|
||||||
|
subscriptions,
|
||||||
|
timestamp,
|
||||||
|
collectedSignaturesEvent,
|
||||||
|
getExecutionFailedTransactionForMessage,
|
||||||
|
setFailedExecution,
|
||||||
|
getExecutionPendingTransactionsForMessage,
|
||||||
|
setPendingExecution
|
||||||
|
)
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
fromHome,
|
||||||
|
foreign.bridgeContract,
|
||||||
|
home.bridgeContract,
|
||||||
|
message,
|
||||||
|
foreign.web3,
|
||||||
|
home.web3,
|
||||||
|
waitingBlocksResolved,
|
||||||
|
waitingBlocksForExecutionResolved,
|
||||||
|
timestamp,
|
||||||
|
collectedSignaturesEvent
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
// Sets the message status based in the collected information
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (executionData.status === VALIDATOR_CONFIRMATION_STATUS.SUCCESS) {
|
||||||
|
const newStatus = executionData.executionResult
|
||||||
|
? CONFIRMATIONS_STATUS.SUCCESS
|
||||||
|
: CONFIRMATIONS_STATUS.SUCCESS_MESSAGE_FAILED
|
||||||
|
setStatus(newStatus)
|
||||||
|
} else if (signatureCollected) {
|
||||||
|
if (fromHome) {
|
||||||
|
if (waitingBlocksForExecution) {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.EXECUTION_WAITING)
|
||||||
|
} else if (failedExecution) {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.EXECUTION_FAILED)
|
||||||
|
} else if (pendingExecution) {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.EXECUTION_PENDING)
|
||||||
|
} else {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.UNDEFINED)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.UNDEFINED)
|
||||||
|
}
|
||||||
|
} else if (waitingBlocks) {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.WAITING)
|
||||||
|
} else if (failedConfirmations) {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.FAILED)
|
||||||
|
} else if (pendingConfirmations) {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.PENDING)
|
||||||
|
} else {
|
||||||
|
setStatus(CONFIRMATIONS_STATUS.UNDEFINED)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
executionData,
|
||||||
|
fromHome,
|
||||||
|
signatureCollected,
|
||||||
|
waitingBlocks,
|
||||||
|
waitingBlocksForExecution,
|
||||||
|
failedConfirmations,
|
||||||
|
failedExecution,
|
||||||
|
pendingConfirmations,
|
||||||
|
pendingExecution
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
confirmations,
|
||||||
|
status,
|
||||||
|
signatureCollected,
|
||||||
|
executionData
|
||||||
|
}
|
||||||
|
}
|
27
alm/src/hooks/useNetwork.ts
Normal file
27
alm/src/hooks/useNetwork.ts
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { getWeb3 } from '../utils/web3'
|
||||||
|
|
||||||
|
export const useNetwork = (url: string) => {
|
||||||
|
const [loading, setLoading] = useState(true)
|
||||||
|
const [chainId, setChainId] = useState(0)
|
||||||
|
const web3 = getWeb3(url)
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
setLoading(true)
|
||||||
|
const getChainId = async () => {
|
||||||
|
const id = await web3.eth.getChainId()
|
||||||
|
setChainId(id)
|
||||||
|
setLoading(false)
|
||||||
|
}
|
||||||
|
getChainId()
|
||||||
|
},
|
||||||
|
[web3.eth]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
web3,
|
||||||
|
chainId,
|
||||||
|
loading
|
||||||
|
}
|
||||||
|
}
|
56
alm/src/hooks/useTransactionFinder.ts
Normal file
56
alm/src/hooks/useTransactionFinder.ts
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { HOME_RPC_POLLING_INTERVAL, TRANSACTION_STATUS } from '../config/constants'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
|
||||||
|
export const useTransactionFinder = ({ txHash, web3 }: { txHash: string; web3: Maybe<Web3> }) => {
|
||||||
|
const [status, setStatus] = useState(TRANSACTION_STATUS.UNDEFINED)
|
||||||
|
const [receipt, setReceipt] = useState<Maybe<TransactionReceipt>>(null)
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!txHash || !web3) return
|
||||||
|
|
||||||
|
const subscriptions: number[] = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getReceipt = async (
|
||||||
|
web3: Web3,
|
||||||
|
txHash: string,
|
||||||
|
setReceipt: Function,
|
||||||
|
setStatus: Function,
|
||||||
|
subscriptions: number[]
|
||||||
|
) => {
|
||||||
|
const txReceipt = await web3.eth.getTransactionReceipt(txHash)
|
||||||
|
setReceipt(txReceipt)
|
||||||
|
|
||||||
|
if (!txReceipt) {
|
||||||
|
setStatus(TRANSACTION_STATUS.NOT_FOUND)
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() => getReceipt(web3, txHash, setReceipt, setStatus, subscriptions),
|
||||||
|
HOME_RPC_POLLING_INTERVAL
|
||||||
|
)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
} else {
|
||||||
|
setStatus(TRANSACTION_STATUS.FOUND)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
getReceipt(web3, txHash, setReceipt, setStatus, subscriptions)
|
||||||
|
return () => {
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[txHash, web3]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
status,
|
||||||
|
receipt
|
||||||
|
}
|
||||||
|
}
|
131
alm/src/hooks/useTransactionStatus.ts
Normal file
131
alm/src/hooks/useTransactionStatus.ts
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { HOME_RPC_POLLING_INTERVAL, TRANSACTION_STATUS } from '../config/constants'
|
||||||
|
import { getTransactionStatusDescription } from '../utils/networks'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { getHomeMessagesFromReceipt, getForeignMessagesFromReceipt, MessageObject, getBlock } from '../utils/web3'
|
||||||
|
import useInterval from '@use-it/interval'
|
||||||
|
|
||||||
|
export const useTransactionStatus = ({
|
||||||
|
txHash,
|
||||||
|
chainId,
|
||||||
|
receiptParam
|
||||||
|
}: {
|
||||||
|
txHash: string
|
||||||
|
chainId: number
|
||||||
|
receiptParam: Maybe<TransactionReceipt>
|
||||||
|
}) => {
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
const [messages, setMessages] = useState<Array<MessageObject>>([])
|
||||||
|
const [status, setStatus] = useState('')
|
||||||
|
const [description, setDescription] = useState('')
|
||||||
|
const [receipt, setReceipt] = useState<Maybe<TransactionReceipt>>(null)
|
||||||
|
const [timestamp, setTimestamp] = useState(0)
|
||||||
|
const [loading, setLoading] = useState(true)
|
||||||
|
|
||||||
|
// Update description so the time displayed is accurate
|
||||||
|
useInterval(() => {
|
||||||
|
if (!status || !timestamp || !description) return
|
||||||
|
setDescription(getTransactionStatusDescription(status, timestamp))
|
||||||
|
}, 30000)
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
const subscriptions: Array<number> = []
|
||||||
|
|
||||||
|
const unsubscribe = () => {
|
||||||
|
subscriptions.forEach(s => {
|
||||||
|
clearTimeout(s)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const getReceipt = async () => {
|
||||||
|
if (!chainId || !txHash || !home.chainId || !foreign.chainId || !home.web3 || !foreign.web3) return
|
||||||
|
setLoading(true)
|
||||||
|
const isHome = chainId === home.chainId
|
||||||
|
const web3 = isHome ? home.web3 : foreign.web3
|
||||||
|
|
||||||
|
let txReceipt
|
||||||
|
|
||||||
|
if (receiptParam) {
|
||||||
|
txReceipt = receiptParam
|
||||||
|
} else {
|
||||||
|
txReceipt = await web3.eth.getTransactionReceipt(txHash)
|
||||||
|
}
|
||||||
|
|
||||||
|
setReceipt(txReceipt)
|
||||||
|
|
||||||
|
if (!txReceipt) {
|
||||||
|
setStatus(TRANSACTION_STATUS.NOT_FOUND)
|
||||||
|
setDescription(getTransactionStatusDescription(TRANSACTION_STATUS.NOT_FOUND))
|
||||||
|
setMessages([{ id: txHash, data: '' }])
|
||||||
|
const timeoutId = setTimeout(() => getReceipt(), HOME_RPC_POLLING_INTERVAL)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
} else {
|
||||||
|
const blockNumber = txReceipt.blockNumber
|
||||||
|
const block = await getBlock(web3, blockNumber)
|
||||||
|
const blockTimestamp = typeof block.timestamp === 'string' ? parseInt(block.timestamp) : block.timestamp
|
||||||
|
setTimestamp(blockTimestamp)
|
||||||
|
|
||||||
|
if (txReceipt.status) {
|
||||||
|
let bridgeMessages: Array<MessageObject>
|
||||||
|
if (isHome) {
|
||||||
|
bridgeMessages = getHomeMessagesFromReceipt(txReceipt, home.web3, home.bridgeAddress)
|
||||||
|
} else {
|
||||||
|
bridgeMessages = getForeignMessagesFromReceipt(txReceipt, foreign.web3, foreign.bridgeAddress)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (bridgeMessages.length === 0) {
|
||||||
|
setMessages([{ id: txHash, data: '' }])
|
||||||
|
setStatus(TRANSACTION_STATUS.SUCCESS_NO_MESSAGES)
|
||||||
|
setDescription(getTransactionStatusDescription(TRANSACTION_STATUS.SUCCESS_NO_MESSAGES, blockTimestamp))
|
||||||
|
} else if (bridgeMessages.length === 1) {
|
||||||
|
setMessages(bridgeMessages)
|
||||||
|
setStatus(TRANSACTION_STATUS.SUCCESS_ONE_MESSAGE)
|
||||||
|
setDescription(getTransactionStatusDescription(TRANSACTION_STATUS.SUCCESS_ONE_MESSAGE, blockTimestamp))
|
||||||
|
} else {
|
||||||
|
setMessages(bridgeMessages)
|
||||||
|
setStatus(TRANSACTION_STATUS.SUCCESS_MULTIPLE_MESSAGES)
|
||||||
|
setDescription(
|
||||||
|
getTransactionStatusDescription(TRANSACTION_STATUS.SUCCESS_MULTIPLE_MESSAGES, blockTimestamp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setStatus(TRANSACTION_STATUS.FAILED)
|
||||||
|
setDescription(getTransactionStatusDescription(TRANSACTION_STATUS.FAILED, blockTimestamp))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
setLoading(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// unsubscribe from previous txHash
|
||||||
|
unsubscribe()
|
||||||
|
|
||||||
|
getReceipt()
|
||||||
|
return () => {
|
||||||
|
// unsubscribe when unmount component
|
||||||
|
unsubscribe()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
[
|
||||||
|
txHash,
|
||||||
|
chainId,
|
||||||
|
home.chainId,
|
||||||
|
foreign.chainId,
|
||||||
|
home.web3,
|
||||||
|
foreign.web3,
|
||||||
|
home.bridgeAddress,
|
||||||
|
foreign.bridgeAddress,
|
||||||
|
receiptParam
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
messages,
|
||||||
|
status,
|
||||||
|
description,
|
||||||
|
receipt,
|
||||||
|
timestamp,
|
||||||
|
loading
|
||||||
|
}
|
||||||
|
}
|
68
alm/src/hooks/useValidatorContract.ts
Normal file
68
alm/src/hooks/useValidatorContract.ts
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import { useEffect, useState } from 'react'
|
||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
import { getRequiredSignatures, getValidatorAddress, getValidatorList } from '../utils/contract'
|
||||||
|
import { BRIDGE_VALIDATORS_ABI } from '../abis'
|
||||||
|
import { useStateProvider } from '../state/StateProvider'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
|
||||||
|
export interface useValidatorContractParams {
|
||||||
|
fromHome: boolean
|
||||||
|
receipt: Maybe<TransactionReceipt>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useValidatorContract = ({ receipt, fromHome }: useValidatorContractParams) => {
|
||||||
|
const [validatorContract, setValidatorContract] = useState<Maybe<Contract>>(null)
|
||||||
|
const [requiredSignatures, setRequiredSignatures] = useState(0)
|
||||||
|
const [validatorList, setValidatorList] = useState([])
|
||||||
|
|
||||||
|
const { home, foreign } = useStateProvider()
|
||||||
|
|
||||||
|
const callValidatorContract = async (bridgeContract: Maybe<Contract>, web3: Web3, setValidatorContract: Function) => {
|
||||||
|
if (!web3 || !bridgeContract) return
|
||||||
|
const address = await getValidatorAddress(bridgeContract)
|
||||||
|
const contract = new web3.eth.Contract(BRIDGE_VALIDATORS_ABI, address)
|
||||||
|
setValidatorContract(contract)
|
||||||
|
}
|
||||||
|
|
||||||
|
const callRequiredSignatures = async (
|
||||||
|
contract: Maybe<Contract>,
|
||||||
|
receipt: TransactionReceipt,
|
||||||
|
setResult: Function
|
||||||
|
) => {
|
||||||
|
if (!contract) return
|
||||||
|
const result = await getRequiredSignatures(contract, receipt.blockNumber)
|
||||||
|
setResult(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
const callValidatorList = async (contract: Maybe<Contract>, receipt: TransactionReceipt, setResult: Function) => {
|
||||||
|
if (!contract) return
|
||||||
|
const result = await getValidatorList(contract, receipt.blockNumber)
|
||||||
|
setResult(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
const web3 = fromHome ? home.web3 : foreign.web3
|
||||||
|
const bridgeContract = fromHome ? home.bridgeContract : foreign.bridgeContract
|
||||||
|
|
||||||
|
if (!web3 || !bridgeContract) return
|
||||||
|
callValidatorContract(bridgeContract, web3, setValidatorContract)
|
||||||
|
},
|
||||||
|
[home.web3, foreign.web3, home.bridgeContract, foreign.bridgeContract, fromHome]
|
||||||
|
)
|
||||||
|
|
||||||
|
useEffect(
|
||||||
|
() => {
|
||||||
|
if (!receipt) return
|
||||||
|
callRequiredSignatures(validatorContract, receipt, setRequiredSignatures)
|
||||||
|
callValidatorList(validatorContract, receipt, setValidatorList)
|
||||||
|
},
|
||||||
|
[validatorContract, receipt]
|
||||||
|
)
|
||||||
|
|
||||||
|
return {
|
||||||
|
requiredSignatures,
|
||||||
|
validatorList
|
||||||
|
}
|
||||||
|
}
|
@ -1,8 +0,0 @@
|
|||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
|
||||||
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
|
||||||
sans-serif;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
-moz-osx-font-smoothing: grayscale;
|
|
||||||
}
|
|
@ -1,11 +1,16 @@
|
|||||||
import React from 'react'
|
import React from 'react'
|
||||||
import ReactDOM from 'react-dom'
|
import ReactDOM from 'react-dom'
|
||||||
import './index.css'
|
import { ThemeProvider } from 'styled-components'
|
||||||
|
import { GlobalStyle } from './themes/GlobalStyle'
|
||||||
import App from './App'
|
import App from './App'
|
||||||
|
import Light from './themes/Light'
|
||||||
|
|
||||||
ReactDOM.render(
|
ReactDOM.render(
|
||||||
<React.StrictMode>
|
<React.StrictMode>
|
||||||
|
<ThemeProvider theme={Light}>
|
||||||
|
<GlobalStyle />
|
||||||
<App />
|
<App />
|
||||||
|
</ThemeProvider>
|
||||||
</React.StrictMode>,
|
</React.StrictMode>,
|
||||||
document.getElementById('root')
|
document.getElementById('root')
|
||||||
)
|
)
|
||||||
|
64
alm/src/services/BlockNumberProvider.ts
Normal file
64
alm/src/services/BlockNumberProvider.ts
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import Web3 from 'web3'
|
||||||
|
import differenceInMilliseconds from 'date-fns/differenceInMilliseconds'
|
||||||
|
import { HOME_RPC_POLLING_INTERVAL } from '../config/constants'
|
||||||
|
|
||||||
|
export class BlockNumberProvider {
|
||||||
|
private running: number
|
||||||
|
private web3: Maybe<Web3>
|
||||||
|
private ref: number | undefined
|
||||||
|
private value: Maybe<number>
|
||||||
|
private lastValueTimestamp: Maybe<Date>
|
||||||
|
private readonly interval: number
|
||||||
|
|
||||||
|
constructor(interval = 5000) {
|
||||||
|
this.running = 0
|
||||||
|
this.web3 = null
|
||||||
|
this.ref = undefined
|
||||||
|
this.value = null
|
||||||
|
this.lastValueTimestamp = null
|
||||||
|
this.interval = interval
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
start(web3: Maybe<Web3>) {
|
||||||
|
if (!this.running) {
|
||||||
|
clearTimeout(this.ref)
|
||||||
|
this.web3 = web3
|
||||||
|
this.running = this.running + 1
|
||||||
|
this.fetchLastBlock()
|
||||||
|
} else {
|
||||||
|
this.running = this.running + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
this.running = this.running - 1
|
||||||
|
|
||||||
|
if (!this.running) {
|
||||||
|
clearTimeout(this.ref)
|
||||||
|
this.ref = undefined
|
||||||
|
this.web3 = null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
get() {
|
||||||
|
return this.value
|
||||||
|
}
|
||||||
|
|
||||||
|
private async fetchLastBlock() {
|
||||||
|
if (!this.web3) return
|
||||||
|
const now = new Date()
|
||||||
|
const distance = differenceInMilliseconds(now, this.lastValueTimestamp || 0)
|
||||||
|
|
||||||
|
if (distance >= this.interval) {
|
||||||
|
this.value = await this.web3.eth.getBlockNumber()
|
||||||
|
this.lastValueTimestamp = now
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ref = setTimeout(() => this.fetchLastBlock(), this.interval)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const homeBlockNumberProvider = new BlockNumberProvider(HOME_RPC_POLLING_INTERVAL)
|
||||||
|
export const foreignBlockNumberProvider = new BlockNumberProvider(HOME_RPC_POLLING_INTERVAL)
|
29
alm/src/services/ValidatorsCache.ts
Normal file
29
alm/src/services/ValidatorsCache.ts
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
import { ConfirmationParam } from '../hooks/useMessageConfirmations'
|
||||||
|
|
||||||
|
class ValidatorsCache {
|
||||||
|
private readonly store: { [key: string]: boolean }
|
||||||
|
private readonly dataStore: { [key: string]: ConfirmationParam }
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.store = {}
|
||||||
|
this.dataStore = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
get(key: string) {
|
||||||
|
return this.store[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
set(key: string, value: boolean) {
|
||||||
|
this.store[key] = value
|
||||||
|
}
|
||||||
|
|
||||||
|
getData(key: string) {
|
||||||
|
return this.dataStore[key]
|
||||||
|
}
|
||||||
|
|
||||||
|
setData(key: string, value: ConfirmationParam) {
|
||||||
|
this.dataStore[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new ValidatorsCache()
|
78
alm/src/state/StateProvider.tsx
Normal file
78
alm/src/state/StateProvider.tsx
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
import React, { createContext, ReactNode } from 'react'
|
||||||
|
import { useNetwork } from '../hooks/useNetwork'
|
||||||
|
import {
|
||||||
|
HOME_RPC_URL,
|
||||||
|
FOREIGN_RPC_URL,
|
||||||
|
HOME_BRIDGE_ADDRESS,
|
||||||
|
FOREIGN_BRIDGE_ADDRESS,
|
||||||
|
HOME_NETWORK_NAME,
|
||||||
|
FOREIGN_NETWORK_NAME
|
||||||
|
} from '../config/constants'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
import { useBridgeContracts } from '../hooks/useBridgeContracts'
|
||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
|
||||||
|
export interface BaseNetworkParams {
|
||||||
|
chainId: number
|
||||||
|
name: string
|
||||||
|
web3: Maybe<Web3>
|
||||||
|
bridgeAddress: string
|
||||||
|
bridgeContract: Maybe<Contract>
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StateContext {
|
||||||
|
home: BaseNetworkParams
|
||||||
|
foreign: BaseNetworkParams
|
||||||
|
loading: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
const initialState = {
|
||||||
|
home: {
|
||||||
|
chainId: 0,
|
||||||
|
name: '',
|
||||||
|
web3: null,
|
||||||
|
bridgeAddress: HOME_BRIDGE_ADDRESS,
|
||||||
|
bridgeContract: null
|
||||||
|
},
|
||||||
|
foreign: {
|
||||||
|
chainId: 0,
|
||||||
|
name: '',
|
||||||
|
web3: null,
|
||||||
|
bridgeAddress: FOREIGN_BRIDGE_ADDRESS,
|
||||||
|
bridgeContract: null
|
||||||
|
},
|
||||||
|
loading: true
|
||||||
|
}
|
||||||
|
|
||||||
|
const StateContext = createContext<StateContext>(initialState)
|
||||||
|
|
||||||
|
export const StateProvider = ({ children }: { children: ReactNode }) => {
|
||||||
|
const homeNetwork = useNetwork(HOME_RPC_URL)
|
||||||
|
const foreignNetwork = useNetwork(FOREIGN_RPC_URL)
|
||||||
|
const { homeBridge, foreignBridge } = useBridgeContracts({
|
||||||
|
homeWeb3: homeNetwork.web3,
|
||||||
|
foreignWeb3: foreignNetwork.web3
|
||||||
|
})
|
||||||
|
|
||||||
|
const value = {
|
||||||
|
home: {
|
||||||
|
bridgeAddress: HOME_BRIDGE_ADDRESS,
|
||||||
|
name: HOME_NETWORK_NAME,
|
||||||
|
bridgeContract: homeBridge,
|
||||||
|
...homeNetwork
|
||||||
|
},
|
||||||
|
foreign: {
|
||||||
|
bridgeAddress: FOREIGN_BRIDGE_ADDRESS,
|
||||||
|
name: FOREIGN_NETWORK_NAME,
|
||||||
|
bridgeContract: foreignBridge,
|
||||||
|
...foreignNetwork
|
||||||
|
},
|
||||||
|
loading: homeNetwork.loading || foreignNetwork.loading
|
||||||
|
}
|
||||||
|
|
||||||
|
return <StateContext.Provider value={value}>{children}</StateContext.Provider>
|
||||||
|
}
|
||||||
|
|
||||||
|
export const useStateProvider = (): StateContext => {
|
||||||
|
return React.useContext(StateContext)
|
||||||
|
}
|
22
alm/src/themes/Dark.tsx
Normal file
22
alm/src/themes/Dark.tsx
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const theme = {
|
||||||
|
backgroundColor: '#121212',
|
||||||
|
fontColor: '#f5f5f5',
|
||||||
|
buttonColor: '#f5f5f5',
|
||||||
|
colorPrimary: '#272727',
|
||||||
|
colorGrey: '#272727',
|
||||||
|
colorLightGrey: '#272727',
|
||||||
|
linkColor: '#ffffff',
|
||||||
|
success: {
|
||||||
|
textColor: '#00c9a7',
|
||||||
|
backgroundColor: '#004d40'
|
||||||
|
},
|
||||||
|
notRequired: {
|
||||||
|
textColor: '#bdbdbd',
|
||||||
|
backgroundColor: '#424242'
|
||||||
|
},
|
||||||
|
failed: {
|
||||||
|
textColor: '#EF5350',
|
||||||
|
backgroundColor: '#4E342E'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default theme
|
32
alm/src/themes/GlobalStyle.tsx
Normal file
32
alm/src/themes/GlobalStyle.tsx
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
import { createGlobalStyle } from 'styled-components'
|
||||||
|
|
||||||
|
import theme from './Light'
|
||||||
|
|
||||||
|
type ThemeType = typeof theme
|
||||||
|
|
||||||
|
export const GlobalStyle = createGlobalStyle<{ theme: ThemeType }>`
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
|
||||||
|
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
|
||||||
|
sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
:root {
|
||||||
|
--bg-color: ${props => props.theme.backgroundColor};
|
||||||
|
--font-color: ${props => props.theme.fontColor};
|
||||||
|
--button-color: ${props => props.theme.buttonColor};
|
||||||
|
--color-primary: ${props => props.theme.colorPrimary};
|
||||||
|
--color-grey: ${props => props.theme.colorGrey};
|
||||||
|
--color-lightGrey: ${props => props.theme.colorLightGrey};
|
||||||
|
--link-color: ${props => props.theme.linkColor};
|
||||||
|
--success-color: ${props => props.theme.success.textColor};
|
||||||
|
--success-bg-color: ${props => props.theme.success.backgroundColor};
|
||||||
|
--not-required-color: ${props => props.theme.notRequired.textColor};
|
||||||
|
--not-required-bg-color: ${props => props.theme.notRequired.backgroundColor};
|
||||||
|
--failed-color: ${props => props.theme.failed.textColor};
|
||||||
|
--failed-bg-color: ${props => props.theme.failed.backgroundColor};
|
||||||
|
}
|
||||||
|
`
|
22
alm/src/themes/Light.ts
Normal file
22
alm/src/themes/Light.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
const theme = {
|
||||||
|
backgroundColor: '#FFFFFF',
|
||||||
|
fontColor: 'rgba(0, 0, 0, 0.65)',
|
||||||
|
buttonColor: '#1890ff',
|
||||||
|
colorPrimary: '#BDBDBD',
|
||||||
|
colorGrey: '#1890ff',
|
||||||
|
colorLightGrey: '#1890ff',
|
||||||
|
linkColor: '#1890ff',
|
||||||
|
success: {
|
||||||
|
textColor: '#388E3C',
|
||||||
|
backgroundColor: 'rgba(0,201,167,.1)'
|
||||||
|
},
|
||||||
|
notRequired: {
|
||||||
|
textColor: '#77838f',
|
||||||
|
backgroundColor: 'rgba(119,131,143,.1)'
|
||||||
|
},
|
||||||
|
failed: {
|
||||||
|
textColor: '#de4437',
|
||||||
|
backgroundColor: 'rgba(222,68,55,.1)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
export default theme
|
68
alm/src/utils/contract.ts
Normal file
68
alm/src/utils/contract.ts
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
|
||||||
|
export const getRequiredBlockConfirmations = async (contract: Contract, blockNumber: number) => {
|
||||||
|
const events = await contract.getPastEvents('RequiredBlockConfirmationChanged', {
|
||||||
|
fromBlock: 0,
|
||||||
|
toBlock: blockNumber
|
||||||
|
})
|
||||||
|
|
||||||
|
let blockConfirmations
|
||||||
|
if (events.length > 0) {
|
||||||
|
// Use the value from last event before the transaction
|
||||||
|
const event = events[events.length - 1]
|
||||||
|
blockConfirmations = event.returnValues.requiredBlockConfirmations
|
||||||
|
} else {
|
||||||
|
// This is a special case where RequiredBlockConfirmationChanged was not emitted during initialization in early versions of AMB
|
||||||
|
// of Sokol - Kovan. In this case the current value is used.
|
||||||
|
blockConfirmations = await contract.methods.requiredBlockConfirmations().call()
|
||||||
|
}
|
||||||
|
return parseInt(blockConfirmations)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorAddress = (contract: Contract) => contract.methods.validatorContract().call()
|
||||||
|
|
||||||
|
export const getRequiredSignatures = async (contract: Contract, blockNumber: number) => {
|
||||||
|
const events = await contract.getPastEvents('RequiredSignaturesChanged', {
|
||||||
|
fromBlock: 0,
|
||||||
|
toBlock: blockNumber
|
||||||
|
})
|
||||||
|
|
||||||
|
// Use the value form last event before the transaction
|
||||||
|
const event = events[events.length - 1]
|
||||||
|
const { requiredSignatures } = event.returnValues
|
||||||
|
return parseInt(requiredSignatures)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorList = async (contract: Contract, blockNumber: number) => {
|
||||||
|
let currentList: string[] = await contract.methods.validatorList().call()
|
||||||
|
const [added, removed] = await Promise.all([
|
||||||
|
contract.getPastEvents('ValidatorAdded', {
|
||||||
|
fromBlock: blockNumber
|
||||||
|
}),
|
||||||
|
contract.getPastEvents('ValidatorRemoved', {
|
||||||
|
fromBlock: blockNumber
|
||||||
|
})
|
||||||
|
])
|
||||||
|
|
||||||
|
// Ordered desc
|
||||||
|
const orderedEvents = [...added, ...removed].sort(({ blockNumber: prev }, { blockNumber: next }) => next - prev)
|
||||||
|
|
||||||
|
// Stored as a Set to avoid duplicates
|
||||||
|
const validatorList = new Set(currentList)
|
||||||
|
|
||||||
|
orderedEvents.forEach(e => {
|
||||||
|
const { validator } = e.returnValues
|
||||||
|
if (e.event === 'ValidatorRemoved') {
|
||||||
|
validatorList.add(validator)
|
||||||
|
} else if (e.event === 'ValidatorAdded') {
|
||||||
|
validatorList.delete(validator)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
return Array.from(validatorList)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getMessagesSigned = (contract: Contract, hash: string) => contract.methods.messagesSigned(hash).call()
|
||||||
|
|
||||||
|
export const getAffirmationsSigned = (contract: Contract, hash: string) =>
|
||||||
|
contract.methods.affirmationsSigned(hash).call()
|
58
alm/src/utils/executionWaitingForBlocks.ts
Normal file
58
alm/src/utils/executionWaitingForBlocks.ts
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
import { BlockNumberProvider } from '../services/BlockNumberProvider'
|
||||||
|
import { VALIDATOR_CONFIRMATION_STATUS } from '../config/constants'
|
||||||
|
import { EventData } from 'web3-eth-contract'
|
||||||
|
|
||||||
|
export const checkWaitingBlocksForExecution = async (
|
||||||
|
blockProvider: BlockNumberProvider,
|
||||||
|
interval: number,
|
||||||
|
targetBlock: number,
|
||||||
|
collectedSignaturesEvent: EventData,
|
||||||
|
setWaitingBlocksForExecution: Function,
|
||||||
|
setWaitingBlocksForExecutionResolved: Function,
|
||||||
|
setExecutionData: Function,
|
||||||
|
subscriptions: number[]
|
||||||
|
) => {
|
||||||
|
const currentBlock = blockProvider.get()
|
||||||
|
|
||||||
|
if (currentBlock && currentBlock >= targetBlock) {
|
||||||
|
setExecutionData({
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.UNDEFINED,
|
||||||
|
validator: collectedSignaturesEvent.returnValues.authorityResponsibleForRelay,
|
||||||
|
txHash: '',
|
||||||
|
timestamp: 0,
|
||||||
|
executionResult: false
|
||||||
|
})
|
||||||
|
setWaitingBlocksForExecution(false)
|
||||||
|
setWaitingBlocksForExecutionResolved(true)
|
||||||
|
blockProvider.stop()
|
||||||
|
} else {
|
||||||
|
let nextInterval = interval
|
||||||
|
if (!currentBlock) {
|
||||||
|
nextInterval = 500
|
||||||
|
} else {
|
||||||
|
setWaitingBlocksForExecution(true)
|
||||||
|
setExecutionData({
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.WAITING,
|
||||||
|
validator: collectedSignaturesEvent.returnValues.authorityResponsibleForRelay,
|
||||||
|
txHash: '',
|
||||||
|
timestamp: 0,
|
||||||
|
executionResult: false
|
||||||
|
})
|
||||||
|
}
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() =>
|
||||||
|
checkWaitingBlocksForExecution(
|
||||||
|
blockProvider,
|
||||||
|
interval,
|
||||||
|
targetBlock,
|
||||||
|
collectedSignaturesEvent,
|
||||||
|
setWaitingBlocksForExecution,
|
||||||
|
setWaitingBlocksForExecutionResolved,
|
||||||
|
setExecutionData,
|
||||||
|
subscriptions
|
||||||
|
),
|
||||||
|
nextInterval
|
||||||
|
)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
}
|
||||||
|
}
|
280
alm/src/utils/explorer.ts
Normal file
280
alm/src/utils/explorer.ts
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
import {
|
||||||
|
EXECUTE_AFFIRMATION_HASH,
|
||||||
|
EXECUTE_SIGNATURES_HASH,
|
||||||
|
FOREIGN_EXPLORER_API,
|
||||||
|
HOME_EXPLORER_API,
|
||||||
|
SUBMIT_SIGNATURE_HASH
|
||||||
|
} from '../config/constants'
|
||||||
|
|
||||||
|
export interface APITransaction {
|
||||||
|
timeStamp: string
|
||||||
|
isError: string
|
||||||
|
input: string
|
||||||
|
to: string
|
||||||
|
hash: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface APIPendingTransaction {
|
||||||
|
input: string
|
||||||
|
to: string
|
||||||
|
hash: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PendingTransactionsParams {
|
||||||
|
account: string
|
||||||
|
api: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AccountTransactionsParams {
|
||||||
|
account: string
|
||||||
|
to: string
|
||||||
|
startTimestamp: number
|
||||||
|
endTimestamp: number
|
||||||
|
api: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GetFailedTransactionParams {
|
||||||
|
account: string
|
||||||
|
to: string
|
||||||
|
messageData: string
|
||||||
|
startTimestamp: number
|
||||||
|
endTimestamp: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GetPendingTransactionParams {
|
||||||
|
account: string
|
||||||
|
to: string
|
||||||
|
messageData: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export const fetchAccountTransactionsFromBlockscout = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp,
|
||||||
|
api
|
||||||
|
}: AccountTransactionsParams): Promise<APITransaction[]> => {
|
||||||
|
const url = `${api}?module=account&action=txlist&address=${account}&filterby=from=${account}&to=${to}&starttimestamp=${startTimestamp}&endtimestamp=${endTimestamp}`
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await fetch(url).then(res => res.json())
|
||||||
|
if (result.status === '0') {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.result
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getBlockByTimestampUrl = (api: string, timestamp: number) =>
|
||||||
|
`${api}&module=block&action=getblocknobytime×tamp=${timestamp}&closest=before`
|
||||||
|
|
||||||
|
export const fetchAccountTransactionsFromEtherscan = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp,
|
||||||
|
api
|
||||||
|
}: AccountTransactionsParams): Promise<APITransaction[]> => {
|
||||||
|
const startBlockUrl = getBlockByTimestampUrl(api, startTimestamp)
|
||||||
|
const endBlockUrl = getBlockByTimestampUrl(api, endTimestamp)
|
||||||
|
let fromBlock = 0
|
||||||
|
let toBlock = 9999999999999
|
||||||
|
try {
|
||||||
|
const [fromBlockResult, toBlockResult] = await Promise.all([
|
||||||
|
fetch(startBlockUrl).then(res => res.json()),
|
||||||
|
fetch(endBlockUrl).then(res => res.json())
|
||||||
|
])
|
||||||
|
|
||||||
|
if (fromBlockResult.status !== '0') {
|
||||||
|
fromBlock = parseInt(fromBlockResult.result)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (toBlockResult.status !== '0') {
|
||||||
|
toBlock = parseInt(toBlockResult.result)
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
const url = `${api}&module=account&action=txlist&address=${account}&startblock=${fromBlock}&endblock=${toBlock}`
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await fetch(url).then(res => res.json())
|
||||||
|
|
||||||
|
if (result.status === '0') {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
const toAddressLowerCase = to.toLowerCase()
|
||||||
|
const transactions: APITransaction[] = result.result
|
||||||
|
return transactions.filter(t => t.to.toLowerCase() === toAddressLowerCase)
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e)
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const fetchAccountTransactions = (api: string) => {
|
||||||
|
return api.includes('blockscout') ? fetchAccountTransactionsFromBlockscout : fetchAccountTransactionsFromEtherscan
|
||||||
|
}
|
||||||
|
|
||||||
|
export const fetchPendingTransactions = async ({
|
||||||
|
account,
|
||||||
|
api
|
||||||
|
}: PendingTransactionsParams): Promise<APIPendingTransaction[]> => {
|
||||||
|
const url = `${api}?module=account&action=pendingtxlist&address=${account}`
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await fetch(url).then(res => res.json())
|
||||||
|
if (result.status === '0') {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.result
|
||||||
|
} catch (e) {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getFailedTransactions = async (
|
||||||
|
account: string,
|
||||||
|
to: string,
|
||||||
|
startTimestamp: number,
|
||||||
|
endTimestamp: number,
|
||||||
|
api: string,
|
||||||
|
fetchAccountTransactions: (args: AccountTransactionsParams) => Promise<APITransaction[]>
|
||||||
|
): Promise<APITransaction[]> => {
|
||||||
|
const transactions = await fetchAccountTransactions({ account, to, startTimestamp, endTimestamp, api })
|
||||||
|
|
||||||
|
return transactions.filter(t => t.isError !== '0')
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getSuccessTransactions = async (
|
||||||
|
account: string,
|
||||||
|
to: string,
|
||||||
|
startTimestamp: number,
|
||||||
|
endTimestamp: number,
|
||||||
|
api: string,
|
||||||
|
fetchAccountTransactions: (args: AccountTransactionsParams) => Promise<APITransaction[]>
|
||||||
|
): Promise<APITransaction[]> => {
|
||||||
|
const transactions = await fetchAccountTransactions({ account, to, startTimestamp, endTimestamp, api })
|
||||||
|
|
||||||
|
return transactions.filter(t => t.isError === '0')
|
||||||
|
}
|
||||||
|
|
||||||
|
export const filterValidatorSignatureTransaction = (
|
||||||
|
transactions: APITransaction[],
|
||||||
|
messageData: string
|
||||||
|
): APITransaction[] => {
|
||||||
|
const messageDataValue = messageData.replace('0x', '')
|
||||||
|
return transactions.filter(
|
||||||
|
t =>
|
||||||
|
(t.input.includes(SUBMIT_SIGNATURE_HASH) || t.input.includes(EXECUTE_AFFIRMATION_HASH)) &&
|
||||||
|
t.input.includes(messageDataValue)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorFailedTransactionsForMessage = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
messageData,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp
|
||||||
|
}: GetFailedTransactionParams): Promise<APITransaction[]> => {
|
||||||
|
const failedTransactions = await getFailedTransactions(
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp,
|
||||||
|
HOME_EXPLORER_API,
|
||||||
|
fetchAccountTransactionsFromBlockscout
|
||||||
|
)
|
||||||
|
|
||||||
|
return filterValidatorSignatureTransaction(failedTransactions, messageData)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorSuccessTransactionsForMessage = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
messageData,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp
|
||||||
|
}: GetFailedTransactionParams): Promise<APITransaction[]> => {
|
||||||
|
const transactions = await getSuccessTransactions(
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp,
|
||||||
|
HOME_EXPLORER_API,
|
||||||
|
fetchAccountTransactionsFromBlockscout
|
||||||
|
)
|
||||||
|
|
||||||
|
return filterValidatorSignatureTransaction(transactions, messageData)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getExecutionFailedTransactionForMessage = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
messageData,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp
|
||||||
|
}: GetFailedTransactionParams): Promise<APITransaction[]> => {
|
||||||
|
const failedTransactions = await getFailedTransactions(
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
startTimestamp,
|
||||||
|
endTimestamp,
|
||||||
|
FOREIGN_EXPLORER_API,
|
||||||
|
fetchAccountTransactions(FOREIGN_EXPLORER_API)
|
||||||
|
)
|
||||||
|
|
||||||
|
const messageDataValue = messageData.replace('0x', '')
|
||||||
|
return failedTransactions.filter(t => t.input.includes(EXECUTE_SIGNATURES_HASH) && t.input.includes(messageDataValue))
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorPendingTransactionsForMessage = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
messageData
|
||||||
|
}: GetPendingTransactionParams): Promise<APIPendingTransaction[]> => {
|
||||||
|
const pendingTransactions = await fetchPendingTransactions({
|
||||||
|
account,
|
||||||
|
api: HOME_EXPLORER_API
|
||||||
|
})
|
||||||
|
|
||||||
|
const toAddressLowerCase = to.toLowerCase()
|
||||||
|
const messageDataValue = messageData.replace('0x', '')
|
||||||
|
|
||||||
|
return pendingTransactions.filter(
|
||||||
|
t =>
|
||||||
|
t.to.toLowerCase() === toAddressLowerCase &&
|
||||||
|
(t.input.includes(SUBMIT_SIGNATURE_HASH) || t.input.includes(EXECUTE_AFFIRMATION_HASH)) &&
|
||||||
|
t.input.includes(messageDataValue)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getExecutionPendingTransactionsForMessage = async ({
|
||||||
|
account,
|
||||||
|
to,
|
||||||
|
messageData
|
||||||
|
}: GetPendingTransactionParams): Promise<APIPendingTransaction[]> => {
|
||||||
|
const pendingTransactions = await fetchPendingTransactions({
|
||||||
|
account,
|
||||||
|
api: FOREIGN_EXPLORER_API
|
||||||
|
})
|
||||||
|
|
||||||
|
const toAddressLowerCase = to.toLowerCase()
|
||||||
|
const messageDataValue = messageData.replace('0x', '')
|
||||||
|
|
||||||
|
return pendingTransactions.filter(
|
||||||
|
t =>
|
||||||
|
t.to.toLowerCase() === toAddressLowerCase &&
|
||||||
|
t.input.includes(EXECUTE_SIGNATURES_HASH) &&
|
||||||
|
t.input.includes(messageDataValue)
|
||||||
|
)
|
||||||
|
}
|
53
alm/src/utils/getCollectedSignaturesEvent.ts
Normal file
53
alm/src/utils/getCollectedSignaturesEvent.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import Web3 from 'web3'
|
||||||
|
import { Contract, EventData } from 'web3-eth-contract'
|
||||||
|
import { homeBlockNumberProvider } from '../services/BlockNumberProvider'
|
||||||
|
import { BLOCK_RANGE } from '../config/constants'
|
||||||
|
|
||||||
|
export const getCollectedSignaturesEvent = async (
|
||||||
|
web3: Maybe<Web3>,
|
||||||
|
contract: Maybe<Contract>,
|
||||||
|
fromBlock: number,
|
||||||
|
toBlock: number,
|
||||||
|
messageHash: string,
|
||||||
|
setCollectedSignaturesEvent: Function,
|
||||||
|
subscriptions: number[]
|
||||||
|
) => {
|
||||||
|
if (!web3 || !contract) return
|
||||||
|
const currentBlock = homeBlockNumberProvider.get()
|
||||||
|
|
||||||
|
let events: EventData[] = []
|
||||||
|
let securedToBlock = toBlock
|
||||||
|
if (currentBlock) {
|
||||||
|
// prevent errors if the toBlock parameter is bigger than the latest
|
||||||
|
securedToBlock = toBlock >= currentBlock ? currentBlock : toBlock
|
||||||
|
events = await contract.getPastEvents('CollectedSignatures', {
|
||||||
|
fromBlock,
|
||||||
|
toBlock: securedToBlock
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const filteredEvents = events.filter(e => e.returnValues.messageHash === messageHash)
|
||||||
|
|
||||||
|
if (filteredEvents.length) {
|
||||||
|
const event = filteredEvents[0]
|
||||||
|
setCollectedSignaturesEvent(event)
|
||||||
|
homeBlockNumberProvider.stop()
|
||||||
|
} else {
|
||||||
|
const newFromBlock = currentBlock ? securedToBlock : fromBlock
|
||||||
|
const newToBlock = currentBlock ? toBlock + BLOCK_RANGE : toBlock
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() =>
|
||||||
|
getCollectedSignaturesEvent(
|
||||||
|
web3,
|
||||||
|
contract,
|
||||||
|
newFromBlock,
|
||||||
|
newToBlock,
|
||||||
|
messageHash,
|
||||||
|
setCollectedSignaturesEvent,
|
||||||
|
subscriptions
|
||||||
|
),
|
||||||
|
500
|
||||||
|
)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
}
|
||||||
|
}
|
317
alm/src/utils/getConfirmationsForTx.ts
Normal file
317
alm/src/utils/getConfirmationsForTx.ts
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
import Web3 from 'web3'
|
||||||
|
import { Contract } from 'web3-eth-contract'
|
||||||
|
import validatorsCache from '../services/ValidatorsCache'
|
||||||
|
import {
|
||||||
|
CACHE_KEY_FAILED,
|
||||||
|
CACHE_KEY_SUCCESS,
|
||||||
|
HOME_RPC_POLLING_INTERVAL,
|
||||||
|
ONE_DAY_TIMESTAMP,
|
||||||
|
VALIDATOR_CONFIRMATION_STATUS
|
||||||
|
} from '../config/constants'
|
||||||
|
import {
|
||||||
|
GetFailedTransactionParams,
|
||||||
|
APITransaction,
|
||||||
|
APIPendingTransaction,
|
||||||
|
GetPendingTransactionParams
|
||||||
|
} from './explorer'
|
||||||
|
import { BasicConfirmationParam, ConfirmationParam } from '../hooks/useMessageConfirmations'
|
||||||
|
|
||||||
|
export const getValidatorConfirmation = (
|
||||||
|
web3: Web3,
|
||||||
|
hashMsg: string,
|
||||||
|
bridgeContract: Contract,
|
||||||
|
confirmationContractMethod: Function
|
||||||
|
) => async (validator: string): Promise<BasicConfirmationParam> => {
|
||||||
|
const hashSenderMsg = web3.utils.soliditySha3Raw(validator, hashMsg)
|
||||||
|
|
||||||
|
const signatureFromCache = validatorsCache.get(hashSenderMsg)
|
||||||
|
if (signatureFromCache) {
|
||||||
|
return {
|
||||||
|
validator,
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmed = await confirmationContractMethod(bridgeContract, hashSenderMsg)
|
||||||
|
const status = confirmed ? VALIDATOR_CONFIRMATION_STATUS.SUCCESS : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED
|
||||||
|
|
||||||
|
// If validator confirmed signature, we cache the result to avoid doing future requests for a result that won't change
|
||||||
|
if (confirmed) {
|
||||||
|
validatorsCache.set(hashSenderMsg, confirmed)
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
validator,
|
||||||
|
status
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorSuccessTransaction = (
|
||||||
|
bridgeContract: Contract,
|
||||||
|
messageData: string,
|
||||||
|
timestamp: number,
|
||||||
|
getSuccessTransactions: (args: GetFailedTransactionParams) => Promise<APITransaction[]>
|
||||||
|
) => async (validatorData: BasicConfirmationParam): Promise<ConfirmationParam> => {
|
||||||
|
const { validator } = validatorData
|
||||||
|
const validatorCacheKey = `${CACHE_KEY_SUCCESS}${validatorData.validator}-${messageData}`
|
||||||
|
const fromCache = validatorsCache.getData(validatorCacheKey)
|
||||||
|
|
||||||
|
if (fromCache && fromCache.txHash) {
|
||||||
|
return fromCache
|
||||||
|
}
|
||||||
|
|
||||||
|
const transactions = await getSuccessTransactions({
|
||||||
|
account: validatorData.validator,
|
||||||
|
to: bridgeContract.options.address,
|
||||||
|
messageData,
|
||||||
|
startTimestamp: timestamp,
|
||||||
|
endTimestamp: timestamp + ONE_DAY_TIMESTAMP
|
||||||
|
})
|
||||||
|
|
||||||
|
let txHashTimestamp = 0
|
||||||
|
let txHash = ''
|
||||||
|
const status = VALIDATOR_CONFIRMATION_STATUS.SUCCESS
|
||||||
|
|
||||||
|
if (transactions.length > 0) {
|
||||||
|
const tx = transactions[0]
|
||||||
|
txHashTimestamp = parseInt(tx.timeStamp)
|
||||||
|
txHash = tx.hash
|
||||||
|
|
||||||
|
// cache the result
|
||||||
|
validatorsCache.setData(validatorCacheKey, {
|
||||||
|
validator,
|
||||||
|
status,
|
||||||
|
txHash,
|
||||||
|
timestamp: txHashTimestamp
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
validator,
|
||||||
|
status,
|
||||||
|
txHash,
|
||||||
|
timestamp: txHashTimestamp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorFailedTransaction = (
|
||||||
|
bridgeContract: Contract,
|
||||||
|
messageData: string,
|
||||||
|
timestamp: number,
|
||||||
|
getFailedTransactions: (args: GetFailedTransactionParams) => Promise<APITransaction[]>
|
||||||
|
) => async (validatorData: BasicConfirmationParam): Promise<ConfirmationParam> => {
|
||||||
|
const validatorCacheKey = `${CACHE_KEY_FAILED}${validatorData.validator}-${messageData}`
|
||||||
|
const failedFromCache = validatorsCache.getData(validatorCacheKey)
|
||||||
|
|
||||||
|
if (failedFromCache && failedFromCache.txHash) {
|
||||||
|
return failedFromCache
|
||||||
|
}
|
||||||
|
|
||||||
|
const failedTransactions = await getFailedTransactions({
|
||||||
|
account: validatorData.validator,
|
||||||
|
to: bridgeContract.options.address,
|
||||||
|
messageData,
|
||||||
|
startTimestamp: timestamp,
|
||||||
|
endTimestamp: timestamp + ONE_DAY_TIMESTAMP
|
||||||
|
})
|
||||||
|
const newStatus =
|
||||||
|
failedTransactions.length > 0 ? VALIDATOR_CONFIRMATION_STATUS.FAILED : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED
|
||||||
|
|
||||||
|
let txHashTimestamp = 0
|
||||||
|
let txHash = ''
|
||||||
|
// If validator signature failed, we cache the result to avoid doing future requests for a result that won't change
|
||||||
|
if (failedTransactions.length > 0) {
|
||||||
|
const failedTx = failedTransactions[0]
|
||||||
|
txHashTimestamp = parseInt(failedTx.timeStamp)
|
||||||
|
txHash = failedTx.hash
|
||||||
|
|
||||||
|
validatorsCache.setData(validatorCacheKey, {
|
||||||
|
validator: validatorData.validator,
|
||||||
|
status: newStatus,
|
||||||
|
txHash,
|
||||||
|
timestamp: txHashTimestamp
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
validator: validatorData.validator,
|
||||||
|
status: newStatus,
|
||||||
|
txHash,
|
||||||
|
timestamp: txHashTimestamp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getValidatorPendingTransaction = (
|
||||||
|
bridgeContract: Contract,
|
||||||
|
messageData: string,
|
||||||
|
getPendingTransactions: (args: GetPendingTransactionParams) => Promise<APIPendingTransaction[]>
|
||||||
|
) => async (validatorData: BasicConfirmationParam): Promise<ConfirmationParam> => {
|
||||||
|
const failedTransactions = await getPendingTransactions({
|
||||||
|
account: validatorData.validator,
|
||||||
|
to: bridgeContract.options.address,
|
||||||
|
messageData
|
||||||
|
})
|
||||||
|
|
||||||
|
const newStatus =
|
||||||
|
failedTransactions.length > 0 ? VALIDATOR_CONFIRMATION_STATUS.PENDING : VALIDATOR_CONFIRMATION_STATUS.UNDEFINED
|
||||||
|
|
||||||
|
let timestamp = 0
|
||||||
|
let txHash = ''
|
||||||
|
|
||||||
|
if (failedTransactions.length > 0) {
|
||||||
|
const failedTx = failedTransactions[0]
|
||||||
|
timestamp = Math.floor(new Date().getTime() / 1000.0)
|
||||||
|
txHash = failedTx.hash
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
validator: validatorData.validator,
|
||||||
|
status: newStatus,
|
||||||
|
txHash,
|
||||||
|
timestamp
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getConfirmationsForTx = async (
|
||||||
|
messageData: string,
|
||||||
|
web3: Maybe<Web3>,
|
||||||
|
validatorList: string[],
|
||||||
|
bridgeContract: Maybe<Contract>,
|
||||||
|
confirmationContractMethod: Function,
|
||||||
|
setResult: Function,
|
||||||
|
requiredSignatures: number,
|
||||||
|
setSignatureCollected: Function,
|
||||||
|
waitingBlocksResolved: boolean,
|
||||||
|
subscriptions: number[],
|
||||||
|
timestamp: number,
|
||||||
|
getFailedTransactions: (args: GetFailedTransactionParams) => Promise<APITransaction[]>,
|
||||||
|
setFailedConfirmations: Function,
|
||||||
|
getPendingTransactions: (args: GetPendingTransactionParams) => Promise<APIPendingTransaction[]>,
|
||||||
|
setPendingConfirmations: Function,
|
||||||
|
getSuccessTransactions: (args: GetFailedTransactionParams) => Promise<APITransaction[]>
|
||||||
|
) => {
|
||||||
|
if (!web3 || !validatorList || !validatorList.length || !bridgeContract || !waitingBlocksResolved) return
|
||||||
|
|
||||||
|
// If all the information was not collected, then it should retry
|
||||||
|
let shouldRetry = false
|
||||||
|
const hashMsg = web3.utils.soliditySha3Raw(messageData)
|
||||||
|
let validatorConfirmations = await Promise.all(
|
||||||
|
validatorList.map(getValidatorConfirmation(web3, hashMsg, bridgeContract, confirmationContractMethod))
|
||||||
|
)
|
||||||
|
|
||||||
|
const successConfirmations = validatorConfirmations.filter(c => c.status === VALIDATOR_CONFIRMATION_STATUS.SUCCESS)
|
||||||
|
|
||||||
|
const notSuccessConfirmations = validatorConfirmations.filter(c => c.status !== VALIDATOR_CONFIRMATION_STATUS.SUCCESS)
|
||||||
|
|
||||||
|
// If signatures not collected, it needs to retry in the next blocks
|
||||||
|
if (successConfirmations.length !== requiredSignatures) {
|
||||||
|
// Check if confirmation is pending
|
||||||
|
const validatorPendingConfirmationsChecks = await Promise.all(
|
||||||
|
notSuccessConfirmations.map(getValidatorPendingTransaction(bridgeContract, messageData, getPendingTransactions))
|
||||||
|
)
|
||||||
|
const validatorPendingConfirmations = validatorPendingConfirmationsChecks.filter(
|
||||||
|
c => c.status === VALIDATOR_CONFIRMATION_STATUS.PENDING
|
||||||
|
)
|
||||||
|
|
||||||
|
validatorPendingConfirmations.forEach(validatorData => {
|
||||||
|
const index = validatorConfirmations.findIndex(e => e.validator === validatorData.validator)
|
||||||
|
validatorConfirmations[index] = validatorData
|
||||||
|
})
|
||||||
|
|
||||||
|
if (validatorPendingConfirmations.length > 0) {
|
||||||
|
setPendingConfirmations(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
const undefinedConfirmations = validatorConfirmations.filter(
|
||||||
|
c => c.status === VALIDATOR_CONFIRMATION_STATUS.UNDEFINED
|
||||||
|
)
|
||||||
|
// Check if confirmation failed
|
||||||
|
const validatorFailedConfirmationsChecks = await Promise.all(
|
||||||
|
undefinedConfirmations.map(
|
||||||
|
getValidatorFailedTransaction(bridgeContract, messageData, timestamp, getFailedTransactions)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
const validatorFailedConfirmations = validatorFailedConfirmationsChecks.filter(
|
||||||
|
c => c.status === VALIDATOR_CONFIRMATION_STATUS.FAILED
|
||||||
|
)
|
||||||
|
validatorFailedConfirmations.forEach(validatorData => {
|
||||||
|
const index = validatorConfirmations.findIndex(e => e.validator === validatorData.validator)
|
||||||
|
validatorConfirmations[index] = validatorData
|
||||||
|
})
|
||||||
|
const messageConfirmationsFailed = validatorFailedConfirmations.length > validatorList.length - requiredSignatures
|
||||||
|
if (messageConfirmationsFailed) {
|
||||||
|
setFailedConfirmations(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
const missingConfirmations = validatorConfirmations.filter(
|
||||||
|
c => c.status === VALIDATOR_CONFIRMATION_STATUS.UNDEFINED || c.status === VALIDATOR_CONFIRMATION_STATUS.PENDING
|
||||||
|
)
|
||||||
|
|
||||||
|
if (missingConfirmations.length > 0) {
|
||||||
|
shouldRetry = true
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// If signatures collected, it should set other signatures as not required
|
||||||
|
const notRequiredConfirmations = notSuccessConfirmations.map(c => ({
|
||||||
|
validator: c.validator,
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.NOT_REQUIRED
|
||||||
|
}))
|
||||||
|
|
||||||
|
validatorConfirmations = [...successConfirmations, ...notRequiredConfirmations]
|
||||||
|
setSignatureCollected(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set confirmations to update UI and continue requesting the transactions for the signatures
|
||||||
|
setResult(validatorConfirmations)
|
||||||
|
|
||||||
|
// get transactions from success signatures
|
||||||
|
const successConfirmationWithData = await Promise.all(
|
||||||
|
validatorConfirmations
|
||||||
|
.filter(c => c.status === VALIDATOR_CONFIRMATION_STATUS.SUCCESS)
|
||||||
|
.map(getValidatorSuccessTransaction(bridgeContract, messageData, timestamp, getSuccessTransactions))
|
||||||
|
)
|
||||||
|
|
||||||
|
const successConfirmationWithTxFound = successConfirmationWithData.filter(v => v.txHash !== '')
|
||||||
|
|
||||||
|
const updatedValidatorConfirmations = [...validatorConfirmations]
|
||||||
|
|
||||||
|
if (successConfirmationWithTxFound.length > 0) {
|
||||||
|
successConfirmationWithTxFound.forEach(validatorData => {
|
||||||
|
const index = updatedValidatorConfirmations.findIndex(e => e.validator === validatorData.validator)
|
||||||
|
updatedValidatorConfirmations[index] = validatorData
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setResult(updatedValidatorConfirmations)
|
||||||
|
|
||||||
|
// Retry if not all transaction were found for validator confirmations
|
||||||
|
if (successConfirmationWithTxFound.length < successConfirmationWithData.length) {
|
||||||
|
shouldRetry = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shouldRetry) {
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() =>
|
||||||
|
getConfirmationsForTx(
|
||||||
|
messageData,
|
||||||
|
web3,
|
||||||
|
validatorList,
|
||||||
|
bridgeContract,
|
||||||
|
confirmationContractMethod,
|
||||||
|
setResult,
|
||||||
|
requiredSignatures,
|
||||||
|
setSignatureCollected,
|
||||||
|
waitingBlocksResolved,
|
||||||
|
subscriptions,
|
||||||
|
timestamp,
|
||||||
|
getFailedTransactions,
|
||||||
|
setFailedConfirmations,
|
||||||
|
getPendingTransactions,
|
||||||
|
setPendingConfirmations,
|
||||||
|
getSuccessTransactions
|
||||||
|
),
|
||||||
|
HOME_RPC_POLLING_INTERVAL
|
||||||
|
)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
}
|
||||||
|
}
|
137
alm/src/utils/getFinalizationEvent.ts
Normal file
137
alm/src/utils/getFinalizationEvent.ts
Normal file
@ -0,0 +1,137 @@
|
|||||||
|
import { Contract, EventData } from 'web3-eth-contract'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
import { CACHE_KEY_EXECUTION_FAILED, THREE_DAYS_TIMESTAMP, VALIDATOR_CONFIRMATION_STATUS } from '../config/constants'
|
||||||
|
import { ExecutionData } from '../hooks/useMessageConfirmations'
|
||||||
|
import {
|
||||||
|
APIPendingTransaction,
|
||||||
|
APITransaction,
|
||||||
|
GetFailedTransactionParams,
|
||||||
|
GetPendingTransactionParams
|
||||||
|
} from './explorer'
|
||||||
|
import { getBlock, MessageObject } from './web3'
|
||||||
|
import validatorsCache from '../services/ValidatorsCache'
|
||||||
|
|
||||||
|
export const getFinalizationEvent = async (
|
||||||
|
contract: Maybe<Contract>,
|
||||||
|
eventName: string,
|
||||||
|
web3: Maybe<Web3>,
|
||||||
|
setResult: React.Dispatch<React.SetStateAction<ExecutionData>>,
|
||||||
|
waitingBlocksResolved: boolean,
|
||||||
|
message: MessageObject,
|
||||||
|
interval: number,
|
||||||
|
subscriptions: number[],
|
||||||
|
timestamp: number,
|
||||||
|
collectedSignaturesEvent: Maybe<EventData>,
|
||||||
|
getFailedExecution: (args: GetFailedTransactionParams) => Promise<APITransaction[]>,
|
||||||
|
setFailedExecution: Function,
|
||||||
|
getPendingExecution: (args: GetPendingTransactionParams) => Promise<APIPendingTransaction[]>,
|
||||||
|
setPendingExecution: Function
|
||||||
|
) => {
|
||||||
|
if (!contract || !web3 || !waitingBlocksResolved) return
|
||||||
|
// Since it filters by the message id, only one event will be fetched
|
||||||
|
// so there is no need to limit the range of the block to reduce the network traffic
|
||||||
|
const events: EventData[] = await contract.getPastEvents(eventName, {
|
||||||
|
fromBlock: 0,
|
||||||
|
toBlock: 'latest',
|
||||||
|
filter: {
|
||||||
|
messageId: message.id
|
||||||
|
}
|
||||||
|
})
|
||||||
|
if (events.length > 0) {
|
||||||
|
const event = events[0]
|
||||||
|
const [txReceipt, block] = await Promise.all([
|
||||||
|
web3.eth.getTransactionReceipt(event.transactionHash),
|
||||||
|
getBlock(web3, event.blockNumber)
|
||||||
|
])
|
||||||
|
|
||||||
|
const blockTimestamp = typeof block.timestamp === 'string' ? parseInt(block.timestamp) : block.timestamp
|
||||||
|
const validatorAddress = web3.utils.toChecksumAddress(txReceipt.from)
|
||||||
|
|
||||||
|
setResult({
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.SUCCESS,
|
||||||
|
validator: validatorAddress,
|
||||||
|
txHash: event.transactionHash,
|
||||||
|
timestamp: blockTimestamp,
|
||||||
|
executionResult: event.returnValues.status
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
// If event is defined, it means it is a message from Home to Foreign
|
||||||
|
if (collectedSignaturesEvent) {
|
||||||
|
const validator = collectedSignaturesEvent.returnValues.authorityResponsibleForRelay
|
||||||
|
|
||||||
|
const pendingTransactions = await getPendingExecution({
|
||||||
|
account: validator,
|
||||||
|
messageData: message.data,
|
||||||
|
to: contract.options.address
|
||||||
|
})
|
||||||
|
|
||||||
|
// If the transaction is pending it sets the status and avoid making the request for failed transactions
|
||||||
|
if (pendingTransactions.length > 0) {
|
||||||
|
const pendingTx = pendingTransactions[0]
|
||||||
|
|
||||||
|
const nowTimestamp = Math.floor(new Date().getTime() / 1000.0)
|
||||||
|
|
||||||
|
setResult({
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.PENDING,
|
||||||
|
validator: validator,
|
||||||
|
txHash: pendingTx.hash,
|
||||||
|
timestamp: nowTimestamp,
|
||||||
|
executionResult: false
|
||||||
|
})
|
||||||
|
setPendingExecution(true)
|
||||||
|
} else {
|
||||||
|
const validatorExecutionCacheKey = `${CACHE_KEY_EXECUTION_FAILED}${validator}-${message.id}`
|
||||||
|
const failedFromCache = validatorsCache.get(validatorExecutionCacheKey)
|
||||||
|
|
||||||
|
if (!failedFromCache) {
|
||||||
|
const failedTransactions = await getFailedExecution({
|
||||||
|
account: validator,
|
||||||
|
to: contract.options.address,
|
||||||
|
messageData: message.data,
|
||||||
|
startTimestamp: timestamp,
|
||||||
|
endTimestamp: timestamp + THREE_DAYS_TIMESTAMP
|
||||||
|
})
|
||||||
|
|
||||||
|
if (failedTransactions.length > 0) {
|
||||||
|
const failedTx = failedTransactions[0]
|
||||||
|
|
||||||
|
// If validator execution failed, we cache the result to avoid doing future requests for a result that won't change
|
||||||
|
validatorsCache.set(validatorExecutionCacheKey, true)
|
||||||
|
|
||||||
|
const timestamp = parseInt(failedTx.timeStamp)
|
||||||
|
setResult({
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.FAILED,
|
||||||
|
validator: validator,
|
||||||
|
txHash: failedTx.hash,
|
||||||
|
timestamp,
|
||||||
|
executionResult: false
|
||||||
|
})
|
||||||
|
setFailedExecution(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() =>
|
||||||
|
getFinalizationEvent(
|
||||||
|
contract,
|
||||||
|
eventName,
|
||||||
|
web3,
|
||||||
|
setResult,
|
||||||
|
waitingBlocksResolved,
|
||||||
|
message,
|
||||||
|
interval,
|
||||||
|
subscriptions,
|
||||||
|
timestamp,
|
||||||
|
collectedSignaturesEvent,
|
||||||
|
getFailedExecution,
|
||||||
|
setFailedExecution,
|
||||||
|
getPendingExecution,
|
||||||
|
setPendingExecution
|
||||||
|
),
|
||||||
|
interval
|
||||||
|
)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
}
|
||||||
|
}
|
41
alm/src/utils/networks.ts
Normal file
41
alm/src/utils/networks.ts
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
import { formatDistance } from 'date-fns'
|
||||||
|
import { CONFIRMATIONS_STATUS_DESCRIPTION, TRANSACTION_STATUS_DESCRIPTION } from '../config/descriptions'
|
||||||
|
import { FOREIGN_EXPLORER_TX_TEMPLATE, HOME_EXPLORER_TX_TEMPLATE } from '../config/constants'
|
||||||
|
|
||||||
|
export const validTxHash = (txHash: string) => /^0x[a-fA-F0-9]{64}$/.test(txHash)
|
||||||
|
|
||||||
|
export const formatTxHash = (txHash: string) => `${txHash.substring(0, 6)}...${txHash.substring(txHash.length - 4)}`
|
||||||
|
|
||||||
|
export const getExplorerTxUrl = (txHash: string, isHome: boolean) => {
|
||||||
|
const template = isHome ? HOME_EXPLORER_TX_TEMPLATE : FOREIGN_EXPLORER_TX_TEMPLATE
|
||||||
|
return template.replace('%s', txHash)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const formatTxHashExtended = (txHash: string) =>
|
||||||
|
`${txHash.substring(0, 10)}...${txHash.substring(txHash.length - 8)}`
|
||||||
|
|
||||||
|
export const formatTimestamp = (timestamp: number): string => {
|
||||||
|
const txDate = new Date(0).setUTCSeconds(timestamp)
|
||||||
|
return formatDistance(txDate, new Date(), {
|
||||||
|
addSuffix: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getTransactionStatusDescription = (status: string, timestamp: Maybe<number> = null) => {
|
||||||
|
let description = TRANSACTION_STATUS_DESCRIPTION[status]
|
||||||
|
|
||||||
|
if (timestamp) {
|
||||||
|
description = description.replace('%t', formatTimestamp(timestamp))
|
||||||
|
}
|
||||||
|
|
||||||
|
return description
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getConfirmationsStatusDescription = (status: string, home: string, foreign: string) => {
|
||||||
|
let description = CONFIRMATIONS_STATUS_DESCRIPTION[status]
|
||||||
|
|
||||||
|
description = description.replace('%homeChain', home)
|
||||||
|
description = description.replace('%foreignChain', foreign)
|
||||||
|
|
||||||
|
return description
|
||||||
|
}
|
50
alm/src/utils/signatureWaitingForBlocks.ts
Normal file
50
alm/src/utils/signatureWaitingForBlocks.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { VALIDATOR_CONFIRMATION_STATUS } from '../config/constants'
|
||||||
|
import { BlockNumberProvider } from '../services/BlockNumberProvider'
|
||||||
|
|
||||||
|
export const checkSignaturesWaitingForBLocks = async (
|
||||||
|
targetBlock: number,
|
||||||
|
setWaitingStatus: Function,
|
||||||
|
setWaitingBlocksResolved: Function,
|
||||||
|
validatorList: string[],
|
||||||
|
setConfirmations: Function,
|
||||||
|
blockProvider: BlockNumberProvider,
|
||||||
|
interval: number,
|
||||||
|
subscriptions: number[]
|
||||||
|
) => {
|
||||||
|
const currentBlock = blockProvider.get()
|
||||||
|
|
||||||
|
if (currentBlock && currentBlock >= targetBlock) {
|
||||||
|
setWaitingStatus(false)
|
||||||
|
setWaitingBlocksResolved(true)
|
||||||
|
blockProvider.stop()
|
||||||
|
} else {
|
||||||
|
let nextInterval = interval
|
||||||
|
if (!currentBlock) {
|
||||||
|
nextInterval = 500
|
||||||
|
} else {
|
||||||
|
const validatorsWaiting = validatorList.map(validator => {
|
||||||
|
return {
|
||||||
|
validator,
|
||||||
|
status: VALIDATOR_CONFIRMATION_STATUS.WAITING
|
||||||
|
}
|
||||||
|
})
|
||||||
|
setWaitingStatus(true)
|
||||||
|
setConfirmations(validatorsWaiting)
|
||||||
|
}
|
||||||
|
const timeoutId = setTimeout(
|
||||||
|
() =>
|
||||||
|
checkSignaturesWaitingForBLocks(
|
||||||
|
targetBlock,
|
||||||
|
setWaitingStatus,
|
||||||
|
setWaitingBlocksResolved,
|
||||||
|
validatorList,
|
||||||
|
setConfirmations,
|
||||||
|
blockProvider,
|
||||||
|
interval,
|
||||||
|
subscriptions
|
||||||
|
),
|
||||||
|
nextInterval
|
||||||
|
)
|
||||||
|
subscriptions.push(timeoutId)
|
||||||
|
}
|
||||||
|
}
|
63
alm/src/utils/web3.ts
Normal file
63
alm/src/utils/web3.ts
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
import Web3 from 'web3'
|
||||||
|
import { BlockTransactionString } from 'web3-eth'
|
||||||
|
import { TransactionReceipt } from 'web3-eth'
|
||||||
|
import { AbiItem } from 'web3-utils'
|
||||||
|
import memoize from 'fast-memoize'
|
||||||
|
import promiseRetry from 'promise-retry'
|
||||||
|
import { HOME_AMB_ABI, FOREIGN_AMB_ABI } from '../abis'
|
||||||
|
|
||||||
|
export interface MessageObject {
|
||||||
|
id: string
|
||||||
|
data: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const rawGetWeb3 = (url: string) => new Web3(new Web3.providers.HttpProvider(url))
|
||||||
|
const memoized = memoize(rawGetWeb3)
|
||||||
|
|
||||||
|
export const getWeb3 = (url: string) => memoized(url)
|
||||||
|
|
||||||
|
export const filterEventsByAbi = (
|
||||||
|
txReceipt: TransactionReceipt,
|
||||||
|
web3: Web3,
|
||||||
|
bridgeAddress: string,
|
||||||
|
eventAbi: AbiItem
|
||||||
|
): MessageObject[] => {
|
||||||
|
const eventHash = web3.eth.abi.encodeEventSignature(eventAbi)
|
||||||
|
const events = txReceipt.logs.filter(e => e.address === bridgeAddress && e.topics[0] === eventHash)
|
||||||
|
|
||||||
|
return events.map(e => {
|
||||||
|
let decodedLogs: { [p: string]: string } = {
|
||||||
|
messageId: '',
|
||||||
|
encodedData: ''
|
||||||
|
}
|
||||||
|
if (eventAbi && eventAbi.inputs && eventAbi.inputs.length) {
|
||||||
|
decodedLogs = web3.eth.abi.decodeLog(eventAbi.inputs, e.data, [e.topics[1]])
|
||||||
|
}
|
||||||
|
return { id: decodedLogs.messageId, data: decodedLogs.encodedData }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getHomeMessagesFromReceipt = (txReceipt: TransactionReceipt, web3: Web3, bridgeAddress: string) => {
|
||||||
|
const UserRequestForSignatureAbi: AbiItem = HOME_AMB_ABI.filter(
|
||||||
|
(e: AbiItem) => e.type === 'event' && e.name === 'UserRequestForSignature'
|
||||||
|
)[0]
|
||||||
|
return filterEventsByAbi(txReceipt, web3, bridgeAddress, UserRequestForSignatureAbi)
|
||||||
|
}
|
||||||
|
|
||||||
|
export const getForeignMessagesFromReceipt = (txReceipt: TransactionReceipt, web3: Web3, bridgeAddress: string) => {
|
||||||
|
const userRequestForAffirmationAbi: AbiItem = FOREIGN_AMB_ABI.filter(
|
||||||
|
(e: AbiItem) => e.type === 'event' && e.name === 'UserRequestForAffirmation'
|
||||||
|
)[0]
|
||||||
|
return filterEventsByAbi(txReceipt, web3, bridgeAddress, userRequestForAffirmationAbi)
|
||||||
|
}
|
||||||
|
|
||||||
|
// In some rare cases the block data is not available yet for the block of a new event detected
|
||||||
|
// so this logic retry to get the block in case it fails
|
||||||
|
export const getBlock = async (web3: Web3, blockNumber: number): Promise<BlockTransactionString> =>
|
||||||
|
promiseRetry(async retry => {
|
||||||
|
const result = await web3.eth.getBlock(blockNumber)
|
||||||
|
if (!result) {
|
||||||
|
return retry('Error getting block data')
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
})
|
@ -16,8 +16,7 @@
|
|||||||
"react": "^16.8.6",
|
"react": "^16.8.6",
|
||||||
"react-dom": "^16.8.6",
|
"react-dom": "^16.8.6",
|
||||||
"react-scripts": "3.0.1",
|
"react-scripts": "3.0.1",
|
||||||
"typescript": "3.5.1",
|
"typescript": "3.5.1"
|
||||||
"web3": "1.0.0-beta.55"
|
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "react-scripts start",
|
"start": "react-scripts start",
|
||||||
|
53
burner-wallet-plugin/testing/src/LocalhostGateway.ts
Normal file
53
burner-wallet-plugin/testing/src/LocalhostGateway.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
import { Gateway } from '@burner-wallet/core/gateways'
|
||||||
|
import Web3 from 'web3'
|
||||||
|
|
||||||
|
export default class LocalhostGateway extends Gateway {
|
||||||
|
private readonly providers: object
|
||||||
|
private readonly providerStrings: { [id: string]: string }
|
||||||
|
constructor() {
|
||||||
|
super()
|
||||||
|
this.providerStrings = {
|
||||||
|
'111': 'http://localhost:8545',
|
||||||
|
'1337': 'http://localhost:8546'
|
||||||
|
}
|
||||||
|
this.providers = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
isAvailable() {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
getNetworks() {
|
||||||
|
return ['111', '1337']
|
||||||
|
}
|
||||||
|
|
||||||
|
_provider(network) {
|
||||||
|
if (!this.providers[network]) {
|
||||||
|
this._makeProvider(network)
|
||||||
|
}
|
||||||
|
return this.providers[network]
|
||||||
|
}
|
||||||
|
|
||||||
|
_makeProvider(network) {
|
||||||
|
if (!this.providerStrings[network]) {
|
||||||
|
throw new Error(`Network ${network} not supported by LocalhostGateway`)
|
||||||
|
}
|
||||||
|
|
||||||
|
this.providers[network] = new Web3.providers.HttpProvider(this.providerStrings[network])
|
||||||
|
}
|
||||||
|
|
||||||
|
send(network, payload) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
if (this.getNetworks().indexOf(network) === -1) {
|
||||||
|
return reject(new Error('LocalhostGateway does not support this network'))
|
||||||
|
}
|
||||||
|
|
||||||
|
this._provider(network).send(payload, (err, response) => {
|
||||||
|
if (err) {
|
||||||
|
return reject(err)
|
||||||
|
}
|
||||||
|
return resolve(response.result)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
@ -6,13 +6,23 @@ import { InjectedSigner, LocalSigner } from '@burner-wallet/core/signers'
|
|||||||
import { InfuraGateway, InjectedGateway } from '@burner-wallet/core/gateways'
|
import { InfuraGateway, InjectedGateway } from '@burner-wallet/core/gateways'
|
||||||
import ModernUI from '@burner-wallet/modern-ui'
|
import ModernUI from '@burner-wallet/modern-ui'
|
||||||
import Exchange from '@burner-wallet/exchange'
|
import Exchange from '@burner-wallet/exchange'
|
||||||
import { Mediator, sPOA, ERC677Asset, TokenBridgeGateway } from '@poanet/tokenbridge-bw-exchange'
|
import {
|
||||||
|
Mediator,
|
||||||
|
sPOA,
|
||||||
|
ERC677Asset,
|
||||||
|
TokenBridgeGateway,
|
||||||
|
NativeMediatorAsset,
|
||||||
|
MediatorErcToNative,
|
||||||
|
BridgeableERC20Asset
|
||||||
|
} from '@poanet/tokenbridge-bw-exchange'
|
||||||
import MetamaskPlugin from '@burner-wallet/metamask-plugin'
|
import MetamaskPlugin from '@burner-wallet/metamask-plugin'
|
||||||
|
import LocalhostGateway from './LocalhostGateway'
|
||||||
|
|
||||||
let assetIdAtHome = 'assetAtHome'
|
let assetIdAtHome = 'assetAtHome'
|
||||||
const assetIdAtForeign = 'assetAtForeign'
|
const assetIdAtForeign = 'assetAtForeign'
|
||||||
let assetAtHome: Asset
|
let assetAtHome: Asset
|
||||||
let assetAtForeign: Asset
|
let assetAtForeign: Asset
|
||||||
|
let testBridge: Mediator
|
||||||
|
|
||||||
if (process.env.REACT_APP_MODE === 'AMB_NATIVE_TO_ERC677') {
|
if (process.env.REACT_APP_MODE === 'AMB_NATIVE_TO_ERC677') {
|
||||||
sPOA.setMediatorAddress(process.env.REACT_APP_HOME_MEDIATOR_ADDRESS)
|
sPOA.setMediatorAddress(process.env.REACT_APP_HOME_MEDIATOR_ADDRESS)
|
||||||
@ -28,8 +38,16 @@ if (process.env.REACT_APP_MODE === 'AMB_NATIVE_TO_ERC677') {
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
address: process.env.REACT_APP_FOREIGN_TOKEN_ADDRESS
|
address: process.env.REACT_APP_FOREIGN_TOKEN_ADDRESS
|
||||||
})
|
})
|
||||||
} else {
|
|
||||||
// process.env.REACT_APP_MODE === 'AMB_ERC677_TO_ERC677'
|
testBridge = new Mediator({
|
||||||
|
assetA: assetIdAtHome,
|
||||||
|
// @ts-ignore
|
||||||
|
assetABridge: process.env.REACT_APP_HOME_MEDIATOR_ADDRESS,
|
||||||
|
assetB: assetIdAtForeign,
|
||||||
|
// @ts-ignore
|
||||||
|
assetBBridge: process.env.REACT_APP_FOREIGN_MEDIATOR_ADDRESS
|
||||||
|
})
|
||||||
|
} else if (process.env.REACT_APP_MODE === 'AMB_ERC677_TO_ERC677') {
|
||||||
assetAtHome = new ERC677Asset({
|
assetAtHome = new ERC677Asset({
|
||||||
id: 'assetAtHome',
|
id: 'assetAtHome',
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
@ -49,20 +67,54 @@ if (process.env.REACT_APP_MODE === 'AMB_NATIVE_TO_ERC677') {
|
|||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
address: process.env.REACT_APP_FOREIGN_TOKEN_ADDRESS
|
address: process.env.REACT_APP_FOREIGN_TOKEN_ADDRESS
|
||||||
})
|
})
|
||||||
}
|
|
||||||
|
|
||||||
const testBridge = new Mediator({
|
testBridge = new Mediator({
|
||||||
assetA: assetIdAtHome,
|
assetA: assetIdAtHome,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
assetABridge: process.env.REACT_APP_HOME_MEDIATOR_ADDRESS,
|
assetABridge: process.env.REACT_APP_HOME_MEDIATOR_ADDRESS,
|
||||||
assetB: assetIdAtForeign,
|
assetB: assetIdAtForeign,
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
assetBBridge: process.env.REACT_APP_FOREIGN_MEDIATOR_ADDRESS
|
assetBBridge: process.env.REACT_APP_FOREIGN_MEDIATOR_ADDRESS
|
||||||
})
|
})
|
||||||
|
} else {
|
||||||
|
// process.env.REACT_APP_MODE === 'AMB_ERC20_TO_NATIVE'
|
||||||
|
assetAtHome = new NativeMediatorAsset({
|
||||||
|
id: assetIdAtHome,
|
||||||
|
name: 'qDAI',
|
||||||
|
network: process.env.REACT_APP_HOME_NETWORK as string,
|
||||||
|
mediatorAddress: process.env.REACT_APP_HOME_MEDIATOR_ADDRESS
|
||||||
|
})
|
||||||
|
|
||||||
|
assetAtForeign = new BridgeableERC20Asset({
|
||||||
|
id: 'assetAtForeign',
|
||||||
|
// @ts-ignore
|
||||||
|
name: process.env.REACT_APP_FOREIGN_TOKEN_NAME,
|
||||||
|
// @ts-ignore
|
||||||
|
network: process.env.REACT_APP_FOREIGN_NETWORK,
|
||||||
|
// @ts-ignore
|
||||||
|
address: process.env.REACT_APP_FOREIGN_TOKEN_ADDRESS,
|
||||||
|
// @ts-ignore
|
||||||
|
bridgeAddress: process.env.REACT_APP_FOREIGN_MEDIATOR_ADDRESS
|
||||||
|
})
|
||||||
|
|
||||||
|
testBridge = new MediatorErcToNative({
|
||||||
|
assetA: assetIdAtHome,
|
||||||
|
// @ts-ignore
|
||||||
|
assetABridge: process.env.REACT_APP_HOME_MEDIATOR_ADDRESS,
|
||||||
|
assetB: assetIdAtForeign,
|
||||||
|
// @ts-ignore
|
||||||
|
assetBBridge: process.env.REACT_APP_FOREIGN_MEDIATOR_ADDRESS
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const core = new BurnerCore({
|
const core = new BurnerCore({
|
||||||
signers: [new InjectedSigner(), new LocalSigner({ privateKey: process.env.REACT_APP_PK, saveKey: false })],
|
signers: [new InjectedSigner(), new LocalSigner({ privateKey: process.env.REACT_APP_PK, saveKey: false })],
|
||||||
gateways: [new InjectedGateway(), new TokenBridgeGateway(), new InfuraGateway(process.env.REACT_APP_INFURA_KEY)],
|
gateways: [
|
||||||
|
new InjectedGateway(),
|
||||||
|
new LocalhostGateway(),
|
||||||
|
new TokenBridgeGateway(),
|
||||||
|
new InfuraGateway(process.env.REACT_APP_INFURA_KEY)
|
||||||
|
],
|
||||||
assets: [assetAtHome, assetAtForeign]
|
assets: [assetAtHome, assetAtForeign]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
"resolveJsonModule": true,
|
"resolveJsonModule": true,
|
||||||
"isolatedModules": true,
|
"isolatedModules": true,
|
||||||
"noEmit": true,
|
"noEmit": true,
|
||||||
|
"noImplicitAny": false,
|
||||||
"jsx": "preserve"
|
"jsx": "preserve"
|
||||||
},
|
},
|
||||||
"include": [
|
"include": [
|
||||||
|
51
burner-wallet-plugin/tokenbridge-bw-exchange/src/burner-wallet/assets/BridgeableERC20Asset.ts
Normal file
51
burner-wallet-plugin/tokenbridge-bw-exchange/src/burner-wallet/assets/BridgeableERC20Asset.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { ERC20Asset } from '@burner-wallet/assets'
|
||||||
|
import { MEDIATOR_ABI, constants } from '../../utils'
|
||||||
|
import { toBN } from 'web3-utils'
|
||||||
|
|
||||||
|
interface BridgeableERC20Constructor {
|
||||||
|
abi?: object
|
||||||
|
address: string
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
network: string
|
||||||
|
bridgeAddress: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export default class BridgeableERC20Asset extends ERC20Asset {
|
||||||
|
protected bridgeAddress: string
|
||||||
|
private _bridge
|
||||||
|
|
||||||
|
constructor({ bridgeAddress, ...params }: BridgeableERC20Constructor) {
|
||||||
|
super({ ...params })
|
||||||
|
this.bridgeAddress = bridgeAddress.toLowerCase()
|
||||||
|
}
|
||||||
|
|
||||||
|
getBridgeContract() {
|
||||||
|
if (!this._bridge) {
|
||||||
|
const Contract = this.getWeb3().eth.Contract
|
||||||
|
this._bridge = new Contract(MEDIATOR_ABI, this.bridgeAddress)
|
||||||
|
}
|
||||||
|
return this._bridge
|
||||||
|
}
|
||||||
|
|
||||||
|
async _send({ from, to, value }) {
|
||||||
|
if (to.toLowerCase() === this.bridgeAddress) {
|
||||||
|
const allowance = await this.allowance(from, to)
|
||||||
|
if (toBN(allowance).lt(toBN(value))) {
|
||||||
|
await this.approve(from, to, value)
|
||||||
|
}
|
||||||
|
const receipt = await this.getBridgeContract()
|
||||||
|
.methods.relayTokens(from, value)
|
||||||
|
.send({ from })
|
||||||
|
const transferLog = Object.values(receipt.events as object).find(
|
||||||
|
e => e.raw.topics[0] === constants.TRANSFER_TOPIC
|
||||||
|
)
|
||||||
|
return {
|
||||||
|
...receipt,
|
||||||
|
txHash: receipt.transactionHash,
|
||||||
|
id: `${receipt.transactionHash}-${transferLog.logIndex}`
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return super._send({ from, to, value })
|
||||||
|
}
|
||||||
|
}
|
@ -1,7 +1,6 @@
|
|||||||
import { ERC20Asset } from '@burner-wallet/assets'
|
import { ERC20Asset } from '@burner-wallet/assets'
|
||||||
import { ERC677_ABI } from '../../utils'
|
import { ERC677_ABI, constants } from '../../utils'
|
||||||
|
|
||||||
const TRANSFER_TOPIC = '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef'
|
|
||||||
const BLOCK_LOOKBACK = 250
|
const BLOCK_LOOKBACK = 250
|
||||||
|
|
||||||
interface ERC677Constructor {
|
interface ERC677Constructor {
|
||||||
@ -45,7 +44,7 @@ export default class ERC677Asset extends ERC20Asset {
|
|||||||
const allTransferEvents = await this.getContract().getPastEvents('allEvents', {
|
const allTransferEvents = await this.getContract().getPastEvents('allEvents', {
|
||||||
fromBlock: block,
|
fromBlock: block,
|
||||||
toBlock: currentBlock,
|
toBlock: currentBlock,
|
||||||
topics: [TRANSFER_TOPIC]
|
topics: [constants.TRANSFER_TOPIC]
|
||||||
})
|
})
|
||||||
// Manually filter `to` parameter because `filter` option does not work with allEvents
|
// Manually filter `to` parameter because `filter` option does not work with allEvents
|
||||||
const events = allTransferEvents.filter(e => e.returnValues.to.toLowerCase() === address.toLowerCase())
|
const events = allTransferEvents.filter(e => e.returnValues.to.toLowerCase() === address.toLowerCase())
|
||||||
|
@ -2,6 +2,8 @@ export { default as sPOA } from './assets/sPOA'
|
|||||||
export { default as Etc } from './assets/Etc'
|
export { default as Etc } from './assets/Etc'
|
||||||
export { default as Wetc } from './assets/Wetc'
|
export { default as Wetc } from './assets/Wetc'
|
||||||
export { default as ERC677Asset } from './assets/ERC677Asset'
|
export { default as ERC677Asset } from './assets/ERC677Asset'
|
||||||
|
export { default as BridgeableERC20Asset } from './assets/BridgeableERC20Asset'
|
||||||
export { default as NativeMediatorAsset } from './assets/NativeMediatorAsset'
|
export { default as NativeMediatorAsset } from './assets/NativeMediatorAsset'
|
||||||
export { default as TokenBridgeGateway } from './gateways/TokenBridgeGateway'
|
export { default as TokenBridgeGateway } from './gateways/TokenBridgeGateway'
|
||||||
export { default as Mediator } from './pairs/Mediator'
|
export { default as Mediator } from './pairs/Mediator'
|
||||||
|
export { default as MediatorErcToNative } from './pairs/MediatorErcToNative'
|
||||||
|
48
burner-wallet-plugin/tokenbridge-bw-exchange/src/burner-wallet/pairs/MediatorErcToNative.ts
Normal file
48
burner-wallet-plugin/tokenbridge-bw-exchange/src/burner-wallet/pairs/MediatorErcToNative.ts
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
import BN from 'bn.js'
|
||||||
|
import { EstimateReturn, ValueTypes } from '@burner-wallet/exchange'
|
||||||
|
import { constants } from '../../utils'
|
||||||
|
import { MEDIATOR_ERC_TO_NATIVE_ABI } from '../../utils'
|
||||||
|
import { default as Mediator } from './Mediator'
|
||||||
|
import { fromWei, toBN } from 'web3-utils'
|
||||||
|
|
||||||
|
export default class MediatorErcToNative extends Mediator {
|
||||||
|
constructor(params) {
|
||||||
|
super(params)
|
||||||
|
}
|
||||||
|
|
||||||
|
async estimateAtoB(value: ValueTypes): Promise<EstimateReturn> {
|
||||||
|
return this.estimateWithFee(constants.HOME_TO_FOREIGN_FEE_TYPE, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
async estimateBtoA(value: ValueTypes): Promise<EstimateReturn> {
|
||||||
|
return this.estimateWithFee(constants.FOREIGN_TO_HOME_FEE_TYPE, value)
|
||||||
|
}
|
||||||
|
|
||||||
|
async estimateWithFee(feeType: string, value: ValueTypes): Promise<EstimateReturn> {
|
||||||
|
const web3 = this.getExchange()
|
||||||
|
.getAsset(this.assetA)
|
||||||
|
.getWeb3()
|
||||||
|
|
||||||
|
const userAmount = this._getValue(value)
|
||||||
|
|
||||||
|
const contract = new web3.eth.Contract(MEDIATOR_ERC_TO_NATIVE_ABI, this.assetABridge)
|
||||||
|
const { feeAmount, feePercentage } = await this.getFee(feeType, contract, userAmount)
|
||||||
|
const finalAmount = toBN(userAmount).sub(feeAmount)
|
||||||
|
const estimateInfo = feeAmount.isZero() ? null : `${constants.ESTIMATE_FEE_MESSAGE} Fee: ${feePercentage}%`
|
||||||
|
|
||||||
|
return {
|
||||||
|
estimate: finalAmount.toString(),
|
||||||
|
estimateInfo
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async getFee(feeType, contract, value): Promise<{ feeAmount: BN; feePercentage: number }> {
|
||||||
|
const fee = toBN(await contract.methods.getFee(feeType).call())
|
||||||
|
const feePercentage = Number(fromWei(fee, 'ether')) * 100
|
||||||
|
const feeAmount = toBN(await contract.methods.calculateFee(feeType, value).call())
|
||||||
|
return {
|
||||||
|
feeAmount,
|
||||||
|
feePercentage
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,2 +1,12 @@
|
|||||||
export { ERC677Asset, NativeMediatorAsset, sPOA, Etc, Wetc, TokenBridgeGateway, Mediator } from './burner-wallet'
|
export {
|
||||||
|
ERC677Asset,
|
||||||
|
BridgeableERC20Asset,
|
||||||
|
NativeMediatorAsset,
|
||||||
|
sPOA,
|
||||||
|
Etc,
|
||||||
|
Wetc,
|
||||||
|
TokenBridgeGateway,
|
||||||
|
Mediator,
|
||||||
|
MediatorErcToNative
|
||||||
|
} from './burner-wallet'
|
||||||
export { WETCBridge } from './wetc-bridge'
|
export { WETCBridge } from './wetc-bridge'
|
||||||
|
@ -3,3 +3,4 @@ export { default as FOREIGN_NATIVE_TO_ERC_ABI } from './abis/ForeignBridgeNative
|
|||||||
export { default as HOME_NATIVE_TO_ERC_ABI } from './abis/HomeBridgeNativeToErc'
|
export { default as HOME_NATIVE_TO_ERC_ABI } from './abis/HomeBridgeNativeToErc'
|
||||||
export { default as MEDIATOR_ABI } from './abis/Mediator'
|
export { default as MEDIATOR_ABI } from './abis/Mediator'
|
||||||
export { default as MEDIATOR_FEE_MANAGER_ABI } from './abis/MediatorFeeManager'
|
export { default as MEDIATOR_FEE_MANAGER_ABI } from './abis/MediatorFeeManager'
|
||||||
|
export { default as MEDIATOR_ERC_TO_NATIVE_ABI } from './abis/MediatorErcToNative'
|
||||||
|
@ -34,5 +34,23 @@ export default [
|
|||||||
payable: false,
|
payable: false,
|
||||||
stateMutability: 'view',
|
stateMutability: 'view',
|
||||||
type: 'function'
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: false,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'address'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'relayTokens',
|
||||||
|
outputs: [],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'nonpayable',
|
||||||
|
type: 'function'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -0,0 +1,44 @@
|
|||||||
|
export default [
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'getFee',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
constant: true,
|
||||||
|
inputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'bytes32'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
name: 'calculateFee',
|
||||||
|
outputs: [
|
||||||
|
{
|
||||||
|
name: '',
|
||||||
|
type: 'uint256'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
payable: false,
|
||||||
|
stateMutability: 'view',
|
||||||
|
type: 'function'
|
||||||
|
}
|
||||||
|
]
|
@ -4,5 +4,6 @@ export {
|
|||||||
FOREIGN_NATIVE_TO_ERC_ABI,
|
FOREIGN_NATIVE_TO_ERC_ABI,
|
||||||
HOME_NATIVE_TO_ERC_ABI,
|
HOME_NATIVE_TO_ERC_ABI,
|
||||||
MEDIATOR_ABI,
|
MEDIATOR_ABI,
|
||||||
MEDIATOR_FEE_MANAGER_ABI
|
MEDIATOR_FEE_MANAGER_ABI,
|
||||||
|
MEDIATOR_ERC_TO_NATIVE_ABI
|
||||||
} from './abis'
|
} from './abis'
|
||||||
|
@ -7,7 +7,11 @@ export const constants = {
|
|||||||
EXCHANGE_TIMEOUT: 300000,
|
EXCHANGE_TIMEOUT: 300000,
|
||||||
MAX_FEE: toWei('1', 'ether'),
|
MAX_FEE: toWei('1', 'ether'),
|
||||||
ESTIMATE_FEE_MESSAGE: 'Estimation takes fee charges into consideration.',
|
ESTIMATE_FEE_MESSAGE: 'Estimation takes fee charges into consideration.',
|
||||||
ZERO_ADDRESS: '0x0000000000000000000000000000000000000000'
|
ZERO_ADDRESS: '0x0000000000000000000000000000000000000000',
|
||||||
|
TRANSFER_TOPIC: '0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef',
|
||||||
|
// fee types are taken from contracts/upgradeable_contracts/amb_erc20_to_native/HomeFeeManagerAMBErc20ToNative.sol
|
||||||
|
HOME_TO_FOREIGN_FEE_TYPE: '0x741ede137d0537e88e0ea0ff25b1f22d837903dbbee8980b4a06e8523247ee26',
|
||||||
|
FOREIGN_TO_HOME_FEE_TYPE: '0x03be2b2875cb41e0e77355e802a16769bb8dfcf825061cde185c73bf94f12625'
|
||||||
}
|
}
|
||||||
|
|
||||||
export const waitForEvent = async (web3, contract: Contract, event: string, callback: Function) => {
|
export const waitForEvent = async (web3, contract: Contract, event: string, callback: Function) => {
|
||||||
|
@ -2600,11 +2600,6 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
|
||||||
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
|
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
|
||||||
|
|
||||||
"@types/mocha@^7.0.2":
|
|
||||||
version "7.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-7.0.2.tgz#b17f16cf933597e10d6d78eae3251e692ce8b0ce"
|
|
||||||
integrity sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==
|
|
||||||
|
|
||||||
"@types/node@*", "@types/node@>= 8":
|
"@types/node@*", "@types/node@>= 8":
|
||||||
version "13.11.0"
|
version "13.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b"
|
||||||
@ -3220,11 +3215,6 @@ are-we-there-yet@~1.1.2:
|
|||||||
delegates "^1.0.0"
|
delegates "^1.0.0"
|
||||||
readable-stream "^2.0.6"
|
readable-stream "^2.0.6"
|
||||||
|
|
||||||
arg@^4.1.0:
|
|
||||||
version "4.1.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
|
|
||||||
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
|
|
||||||
|
|
||||||
argparse@^1.0.7:
|
argparse@^1.0.7:
|
||||||
version "1.0.10"
|
version "1.0.10"
|
||||||
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
|
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
|
||||||
@ -3350,11 +3340,6 @@ assert@^1.1.1:
|
|||||||
object-assign "^4.1.1"
|
object-assign "^4.1.1"
|
||||||
util "0.10.3"
|
util "0.10.3"
|
||||||
|
|
||||||
assertion-error@^1.1.0:
|
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
|
|
||||||
integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==
|
|
||||||
|
|
||||||
assign-symbols@^1.0.0:
|
assign-symbols@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
|
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
|
||||||
@ -3450,13 +3435,6 @@ axios@^0.18.0:
|
|||||||
follow-redirects "1.5.10"
|
follow-redirects "1.5.10"
|
||||||
is-buffer "^2.0.2"
|
is-buffer "^2.0.2"
|
||||||
|
|
||||||
axios@^0.19.0:
|
|
||||||
version "0.19.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/axios/-/axios-0.19.2.tgz#3ea36c5d8818d0d5f8a8a97a6d36b86cdc00cb27"
|
|
||||||
integrity sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==
|
|
||||||
dependencies:
|
|
||||||
follow-redirects "1.5.10"
|
|
||||||
|
|
||||||
axobject-query@^2.0.2:
|
axobject-query@^2.0.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
|
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.1.2.tgz#2bdffc0371e643e5f03ba99065d5179b9ca79799"
|
||||||
@ -3821,11 +3799,6 @@ browser-resolve@^1.11.3:
|
|||||||
dependencies:
|
dependencies:
|
||||||
resolve "1.1.7"
|
resolve "1.1.7"
|
||||||
|
|
||||||
browser-stdout@1.3.1:
|
|
||||||
version "1.3.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
|
|
||||||
integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
|
|
||||||
|
|
||||||
browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
|
browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
|
resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz#326734642f403dabc3003209853bb70ad428ef48"
|
||||||
@ -3838,7 +3811,7 @@ browserify-aes@^1.0.0, browserify-aes@^1.0.4, browserify-aes@^1.0.6:
|
|||||||
inherits "^2.0.1"
|
inherits "^2.0.1"
|
||||||
safe-buffer "^5.0.1"
|
safe-buffer "^5.0.1"
|
||||||
|
|
||||||
browserify-cipher@^1.0.0, browserify-cipher@^1.0.1:
|
browserify-cipher@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
|
resolved "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz#8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0"
|
||||||
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
|
integrity sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==
|
||||||
@ -4215,18 +4188,6 @@ caseless@~0.12.0:
|
|||||||
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
|
||||||
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
|
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
|
||||||
|
|
||||||
chai@^4.2.0:
|
|
||||||
version "4.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5"
|
|
||||||
integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==
|
|
||||||
dependencies:
|
|
||||||
assertion-error "^1.1.0"
|
|
||||||
check-error "^1.0.2"
|
|
||||||
deep-eql "^3.0.1"
|
|
||||||
get-func-name "^2.0.0"
|
|
||||||
pathval "^1.1.0"
|
|
||||||
type-detect "^4.0.5"
|
|
||||||
|
|
||||||
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
|
chalk@2.4.2, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1, chalk@^2.4.2:
|
||||||
version "2.4.2"
|
version "2.4.2"
|
||||||
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
|
||||||
@ -4252,11 +4213,6 @@ chardet@^0.7.0:
|
|||||||
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
|
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
|
||||||
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
|
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
|
||||||
|
|
||||||
check-error@^1.0.2:
|
|
||||||
version "1.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
|
|
||||||
integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
|
|
||||||
|
|
||||||
check-types@^8.0.3:
|
check-types@^8.0.3:
|
||||||
version "8.0.3"
|
version "8.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
|
resolved "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz#3356cca19c889544f2d7a95ed49ce508a0ecf552"
|
||||||
@ -4490,11 +4446,6 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
|
|||||||
dependencies:
|
dependencies:
|
||||||
delayed-stream "~1.0.0"
|
delayed-stream "~1.0.0"
|
||||||
|
|
||||||
commander@2.15.1:
|
|
||||||
version "2.15.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
|
|
||||||
integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
|
|
||||||
|
|
||||||
commander@2.17.x:
|
commander@2.17.x:
|
||||||
version "2.17.1"
|
version "2.17.1"
|
||||||
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
|
resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
|
||||||
@ -5290,13 +5241,6 @@ dedent@^0.7.0:
|
|||||||
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
|
resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c"
|
||||||
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
|
integrity sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=
|
||||||
|
|
||||||
deep-eql@^3.0.1:
|
|
||||||
version "3.0.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
|
|
||||||
integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==
|
|
||||||
dependencies:
|
|
||||||
type-detect "^4.0.0"
|
|
||||||
|
|
||||||
deep-equal@^1.0.1:
|
deep-equal@^1.0.1:
|
||||||
version "1.1.1"
|
version "1.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
|
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
|
||||||
@ -5469,16 +5413,6 @@ diff-sequences@^24.9.0:
|
|||||||
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
|
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-24.9.0.tgz#5715d6244e2aa65f48bba0bc972db0b0b11e95b5"
|
||||||
integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
|
integrity sha512-Dj6Wk3tWyTE+Fo1rW8v0Xhwk80um6yFYKbuAxc9c3EZxIHFDYwbi34Uk42u1CdnIiVorvt4RmlSDjIPyzGC2ew==
|
||||||
|
|
||||||
diff@3.5.0:
|
|
||||||
version "3.5.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
|
|
||||||
integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
|
|
||||||
|
|
||||||
diff@^4.0.1:
|
|
||||||
version "4.0.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
|
|
||||||
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
|
|
||||||
|
|
||||||
diffie-hellman@^5.0.0:
|
diffie-hellman@^5.0.0:
|
||||||
version "5.0.3"
|
version "5.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
|
resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875"
|
||||||
@ -6531,7 +6465,7 @@ ethers@4.0.44:
|
|||||||
uuid "2.0.1"
|
uuid "2.0.1"
|
||||||
xmlhttprequest "1.8.0"
|
xmlhttprequest "1.8.0"
|
||||||
|
|
||||||
ethers@^4.0.27, ethers@~4.0.4:
|
ethers@~4.0.4:
|
||||||
version "4.0.46"
|
version "4.0.46"
|
||||||
resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.46.tgz#13cd3ed099487f43ece00194b89a8a8781f71507"
|
resolved "https://registry.yarnpkg.com/ethers/-/ethers-4.0.46.tgz#13cd3ed099487f43ece00194b89a8a8781f71507"
|
||||||
integrity sha512-/dPMzzpInhtiip4hKFvsDiJKeRk64IhyA+Po7CtNXneQFSOCYXg8eBFt+jXbxUQyApgWnWOtYxWdfn9+CvvxDA==
|
integrity sha512-/dPMzzpInhtiip4hKFvsDiJKeRk64IhyA+Po7CtNXneQFSOCYXg8eBFt+jXbxUQyApgWnWOtYxWdfn9+CvvxDA==
|
||||||
@ -6546,7 +6480,7 @@ ethers@^4.0.27, ethers@~4.0.4:
|
|||||||
uuid "2.0.1"
|
uuid "2.0.1"
|
||||||
xmlhttprequest "1.8.0"
|
xmlhttprequest "1.8.0"
|
||||||
|
|
||||||
ethjs-unit@0.1.6, ethjs-unit@^0.1.6:
|
ethjs-unit@0.1.6:
|
||||||
version "0.1.6"
|
version "0.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
|
resolved "https://registry.yarnpkg.com/ethjs-unit/-/ethjs-unit-0.1.6.tgz#c665921e476e87bce2a9d588a6fe0405b2c41699"
|
||||||
integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
|
integrity sha1-xmWSHkduh7ziqdWIpv4EBbLEFpk=
|
||||||
@ -6562,11 +6496,6 @@ ethjs-util@0.1.6, ethjs-util@^0.1.3:
|
|||||||
is-hex-prefixed "1.0.0"
|
is-hex-prefixed "1.0.0"
|
||||||
strip-hex-prefix "1.0.0"
|
strip-hex-prefix "1.0.0"
|
||||||
|
|
||||||
eventemitter3@3.1.0:
|
|
||||||
version "3.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
|
|
||||||
integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==
|
|
||||||
|
|
||||||
eventemitter3@3.1.2, eventemitter3@^3.1.0:
|
eventemitter3@3.1.2, eventemitter3@^3.1.0:
|
||||||
version "3.1.2"
|
version "3.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
|
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
|
||||||
@ -7164,11 +7093,6 @@ get-caller-file@^2.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
|
resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
|
||||||
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
|
integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
|
||||||
|
|
||||||
get-func-name@^2.0.0:
|
|
||||||
version "2.0.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
|
|
||||||
integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
|
|
||||||
|
|
||||||
get-own-enumerable-property-symbols@^3.0.0:
|
get-own-enumerable-property-symbols@^3.0.0:
|
||||||
version "3.0.2"
|
version "3.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
|
resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz#b5fde77f22cbe35f390b4e089922c50bce6ef664"
|
||||||
@ -7303,18 +7227,6 @@ glob-to-regexp@^0.3.0:
|
|||||||
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
|
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
|
||||||
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
|
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=
|
||||||
|
|
||||||
glob@7.1.2:
|
|
||||||
version "7.1.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
|
|
||||||
integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
|
|
||||||
dependencies:
|
|
||||||
fs.realpath "^1.0.0"
|
|
||||||
inflight "^1.0.4"
|
|
||||||
inherits "2"
|
|
||||||
minimatch "^3.0.4"
|
|
||||||
once "^1.3.0"
|
|
||||||
path-is-absolute "^1.0.0"
|
|
||||||
|
|
||||||
glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
|
glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
|
||||||
version "7.1.6"
|
version "7.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
|
||||||
@ -7448,11 +7360,6 @@ graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.
|
|||||||
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
|
||||||
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=
|
||||||
|
|
||||||
growl@1.10.5:
|
|
||||||
version "1.10.5"
|
|
||||||
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
|
|
||||||
integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
|
|
||||||
|
|
||||||
growly@^1.3.0:
|
growly@^1.3.0:
|
||||||
version "1.3.0"
|
version "1.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
|
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
|
||||||
@ -7611,11 +7518,6 @@ hdkey@^1.1.1:
|
|||||||
safe-buffer "^5.1.1"
|
safe-buffer "^5.1.1"
|
||||||
secp256k1 "^3.0.1"
|
secp256k1 "^3.0.1"
|
||||||
|
|
||||||
he@1.1.1:
|
|
||||||
version "1.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
|
|
||||||
integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
|
|
||||||
|
|
||||||
he@1.2.x:
|
he@1.2.x:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
|
||||||
@ -9690,11 +9592,6 @@ make-dir@^2.0.0, make-dir@^2.1.0:
|
|||||||
pify "^4.0.1"
|
pify "^4.0.1"
|
||||||
semver "^5.6.0"
|
semver "^5.6.0"
|
||||||
|
|
||||||
make-error@^1.1.1:
|
|
||||||
version "1.3.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
|
|
||||||
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
|
|
||||||
|
|
||||||
make-fetch-happen@^5.0.0:
|
make-fetch-happen@^5.0.0:
|
||||||
version "5.0.2"
|
version "5.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd"
|
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz#aa8387104f2687edca01c8687ee45013d02d19bd"
|
||||||
@ -10046,11 +9943,6 @@ minimist-options@^3.0.1:
|
|||||||
arrify "^1.0.1"
|
arrify "^1.0.1"
|
||||||
is-plain-obj "^1.1.0"
|
is-plain-obj "^1.1.0"
|
||||||
|
|
||||||
minimist@0.0.8:
|
|
||||||
version "0.0.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
|
|
||||||
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
|
|
||||||
|
|
||||||
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
|
minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5:
|
||||||
version "1.2.5"
|
version "1.2.5"
|
||||||
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
|
||||||
@ -10115,13 +10007,6 @@ mkdirp@*:
|
|||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
|
||||||
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
|
||||||
|
|
||||||
mkdirp@0.5.1:
|
|
||||||
version "0.5.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
|
|
||||||
integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
|
|
||||||
dependencies:
|
|
||||||
minimist "0.0.8"
|
|
||||||
|
|
||||||
mkdirp@^0.5.0, mkdirp@^0.5.1:
|
mkdirp@^0.5.0, mkdirp@^0.5.1:
|
||||||
version "0.5.5"
|
version "0.5.5"
|
||||||
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
|
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
|
||||||
@ -10136,23 +10021,6 @@ mkdirp@~0.5.0, mkdirp@~0.5.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
minimist "^1.2.5"
|
minimist "^1.2.5"
|
||||||
|
|
||||||
mocha@^5.2.0:
|
|
||||||
version "5.2.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
|
|
||||||
integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
|
|
||||||
dependencies:
|
|
||||||
browser-stdout "1.3.1"
|
|
||||||
commander "2.15.1"
|
|
||||||
debug "3.1.0"
|
|
||||||
diff "3.5.0"
|
|
||||||
escape-string-regexp "1.0.5"
|
|
||||||
glob "7.1.2"
|
|
||||||
growl "1.10.5"
|
|
||||||
he "1.1.1"
|
|
||||||
minimatch "3.0.4"
|
|
||||||
mkdirp "0.5.1"
|
|
||||||
supports-color "5.4.0"
|
|
||||||
|
|
||||||
mock-fs@^4.1.0:
|
mock-fs@^4.1.0:
|
||||||
version "4.11.0"
|
version "4.11.0"
|
||||||
resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.11.0.tgz#0828107e4b843a6ba855ecebfe3c6e073b69db92"
|
resolved "https://registry.yarnpkg.com/mock-fs/-/mock-fs-4.11.0.tgz#0828107e4b843a6ba855ecebfe3c6e073b69db92"
|
||||||
@ -10237,7 +10105,7 @@ nan@2.13.2:
|
|||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.13.2.tgz#f51dc7ae66ba7d5d55e1e6d4d8092e802c9aefe7"
|
||||||
integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
|
integrity sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==
|
||||||
|
|
||||||
nan@2.14.0, nan@^2.0.8, nan@^2.12.1, nan@^2.14.0, nan@^2.2.1:
|
nan@2.14.0, nan@^2.12.1, nan@^2.14.0, nan@^2.2.1:
|
||||||
version "2.14.0"
|
version "2.14.0"
|
||||||
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
|
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c"
|
||||||
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
|
integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==
|
||||||
@ -11099,12 +10967,7 @@ path-type@^4.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
|
||||||
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
|
||||||
|
|
||||||
pathval@^1.1.0:
|
pbkdf2@^3.0.3:
|
||||||
version "1.1.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
|
|
||||||
integrity sha1-uULm1L3mUwBe9rcTYd74cn0GReA=
|
|
||||||
|
|
||||||
pbkdf2@^3.0.17, pbkdf2@^3.0.3:
|
|
||||||
version "3.0.17"
|
version "3.0.17"
|
||||||
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
|
resolved "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.0.17.tgz#976c206530617b14ebb32114239f7b09336e93a6"
|
||||||
integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
|
integrity sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==
|
||||||
@ -12127,7 +11990,7 @@ querystring@0.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
|
||||||
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
integrity sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=
|
||||||
|
|
||||||
querystringify@^2.0.0, querystringify@^2.1.1:
|
querystringify@^2.1.1:
|
||||||
version "2.1.1"
|
version "2.1.1"
|
||||||
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
|
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz#60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e"
|
||||||
integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
|
integrity sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==
|
||||||
@ -12970,29 +12833,6 @@ scrypt-js@2.0.4:
|
|||||||
resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16"
|
resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-2.0.4.tgz#32f8c5149f0797672e551c07e230f834b6af5f16"
|
||||||
integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==
|
integrity sha512-4KsaGcPnuhtCZQCxFxN3GVYIhKFPTdLd8PLC552XwbMndtD0cjRFAhDuuydXQ0h08ZfPgzqe6EKHozpuH74iDw==
|
||||||
|
|
||||||
scrypt.js@0.3.0:
|
|
||||||
version "0.3.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/scrypt.js/-/scrypt.js-0.3.0.tgz#6c62d61728ad533c8c376a2e5e3e86d41a95c4c0"
|
|
||||||
integrity sha512-42LTc1nyFsyv/o0gcHtDztrn+aqpkaCNt5Qh7ATBZfhEZU7IC/0oT/qbBH+uRNoAPvs2fwiOId68FDEoSRA8/A==
|
|
||||||
dependencies:
|
|
||||||
scryptsy "^1.2.1"
|
|
||||||
optionalDependencies:
|
|
||||||
scrypt "^6.0.2"
|
|
||||||
|
|
||||||
scrypt@^6.0.2:
|
|
||||||
version "6.0.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/scrypt/-/scrypt-6.0.3.tgz#04e014a5682b53fa50c2d5cce167d719c06d870d"
|
|
||||||
integrity sha1-BOAUpWgrU/pQwtXM4WfXGcBthw0=
|
|
||||||
dependencies:
|
|
||||||
nan "^2.0.8"
|
|
||||||
|
|
||||||
scryptsy@^1.2.1:
|
|
||||||
version "1.2.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-1.2.1.tgz#a3225fa4b2524f802700761e2855bdf3b2d92163"
|
|
||||||
integrity sha1-oyJfpLJST4AnAHYeKFW987LZIWM=
|
|
||||||
dependencies:
|
|
||||||
pbkdf2 "^3.0.3"
|
|
||||||
|
|
||||||
scryptsy@^2.1.0:
|
scryptsy@^2.1.0:
|
||||||
version "2.1.0"
|
version "2.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790"
|
resolved "https://registry.yarnpkg.com/scryptsy/-/scryptsy-2.1.0.tgz#8d1e8d0c025b58fdd25b6fa9a0dc905ee8faa790"
|
||||||
@ -13872,13 +13712,6 @@ stylis@^3.5.0:
|
|||||||
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
|
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.5.4.tgz#f665f25f5e299cf3d64654ab949a57c768b73fbe"
|
||||||
integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
|
integrity sha512-8/3pSmthWM7lsPBKv7NXkzn2Uc9W7NotcwGNpJaa3k7WMM1XDCA4MgT5k/8BIexd5ydZdboXtU90XH9Ec4Bv/Q==
|
||||||
|
|
||||||
supports-color@5.4.0:
|
|
||||||
version "5.4.0"
|
|
||||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
|
|
||||||
integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
|
|
||||||
dependencies:
|
|
||||||
has-flag "^3.0.0"
|
|
||||||
|
|
||||||
supports-color@^2.0.0:
|
supports-color@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
|
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
|
||||||
@ -14243,17 +14076,6 @@ tryer@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
|
resolved "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz#f2c85406800b9b0f74c9f7465b81eaad241252f8"
|
||||||
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
|
integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==
|
||||||
|
|
||||||
ts-node@^8.8.2:
|
|
||||||
version "8.8.2"
|
|
||||||
resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-8.8.2.tgz#0b39e690bee39ea5111513a9d2bcdc0bc121755f"
|
|
||||||
integrity sha512-duVj6BpSpUpD/oM4MfhO98ozgkp3Gt9qIp3jGxwU2DFvl/3IRaEAvbLa8G60uS7C77457e/m5TMowjedeRxI1Q==
|
|
||||||
dependencies:
|
|
||||||
arg "^4.1.0"
|
|
||||||
diff "^4.0.1"
|
|
||||||
make-error "^1.1.1"
|
|
||||||
source-map-support "^0.5.6"
|
|
||||||
yn "3.1.1"
|
|
||||||
|
|
||||||
ts-pnp@1.1.2:
|
ts-pnp@1.1.2:
|
||||||
version "1.1.2"
|
version "1.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552"
|
resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.1.2.tgz#be8e4bfce5d00f0f58e0666a82260c34a57af552"
|
||||||
@ -14300,11 +14122,6 @@ type-check@~0.3.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prelude-ls "~1.1.2"
|
prelude-ls "~1.1.2"
|
||||||
|
|
||||||
type-detect@^4.0.0, type-detect@^4.0.5:
|
|
||||||
version "4.0.8"
|
|
||||||
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
|
|
||||||
integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
|
|
||||||
|
|
||||||
type-fest@^0.3.0:
|
type-fest@^0.3.0:
|
||||||
version "0.3.1"
|
version "0.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
|
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
|
||||||
@ -14350,11 +14167,6 @@ typescript@3.5.3:
|
|||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
|
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.5.3.tgz#c830f657f93f1ea846819e929092f5fe5983e977"
|
||||||
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
|
integrity sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==
|
||||||
|
|
||||||
typescript@^3.5.2:
|
|
||||||
version "3.8.3"
|
|
||||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
|
|
||||||
integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
|
|
||||||
|
|
||||||
uglify-js@3.4.x:
|
uglify-js@3.4.x:
|
||||||
version "3.4.10"
|
version "3.4.10"
|
||||||
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
|
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz#9ad9563d8eb3acdfb8d38597d2af1d815f6a755f"
|
||||||
@ -14538,14 +14350,6 @@ url-parse-lax@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
prepend-http "^2.0.0"
|
prepend-http "^2.0.0"
|
||||||
|
|
||||||
url-parse@1.4.4:
|
|
||||||
version "1.4.4"
|
|
||||||
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8"
|
|
||||||
integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==
|
|
||||||
dependencies:
|
|
||||||
querystringify "^2.0.0"
|
|
||||||
requires-port "^1.0.0"
|
|
||||||
|
|
||||||
url-parse@^1.4.3:
|
url-parse@^1.4.3:
|
||||||
version "1.4.7"
|
version "1.4.7"
|
||||||
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
|
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz#a8a83535e8c00a316e403a5db4ac1b9b853ae278"
|
||||||
@ -14577,11 +14381,6 @@ use@^3.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
|
resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
|
||||||
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
|
integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
|
||||||
|
|
||||||
utf8@2.1.1:
|
|
||||||
version "2.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.1.tgz#2e01db02f7d8d0944f77104f1609eb0c304cf768"
|
|
||||||
integrity sha1-LgHbAvfY0JRPdxBPFgnrDDBM92g=
|
|
||||||
|
|
||||||
utf8@3.0.0, utf8@^3.0.0:
|
utf8@3.0.0, utf8@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
|
resolved "https://registry.yarnpkg.com/utf8/-/utf8-3.0.0.tgz#f052eed1364d696e769ef058b183df88c87f69d1"
|
||||||
@ -14771,17 +14570,6 @@ web3-bzz@1.2.6:
|
|||||||
swarm-js "0.1.39"
|
swarm-js "0.1.39"
|
||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
|
|
||||||
web3-core-helpers@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.55.tgz#832b8499889f9f514b1d174f00172fd3683d63de"
|
|
||||||
integrity sha512-suj9Xy/lIqajaYLJTEjr2rlFgu6hGYwChHmf8+qNrC2luZA6kirTamtB9VThWMxbywx7p0bqQFjW6zXogAgWhg==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-eth-iban "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-core-helpers@1.2.6:
|
web3-core-helpers@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz#7aacd25bf8015adcdfc0f3243d0dcfdff0373f7d"
|
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.6.tgz#7aacd25bf8015adcdfc0f3243d0dcfdff0373f7d"
|
||||||
@ -14791,20 +14579,6 @@ web3-core-helpers@1.2.6:
|
|||||||
web3-eth-iban "1.2.6"
|
web3-eth-iban "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-core-method@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.55.tgz#0af994295ac2dd64ccd53305b7df8da76e11da49"
|
|
||||||
integrity sha512-w1cW/s2ji9qGELHk2uMJCn1ooay0JJLVoPD1nvmsW6OTRWcVjxa62nJrFQhe6P5lEb83Xk9oHgmCxZoVUHibOw==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
eventemitter3 "3.1.0"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
rxjs "^6.4.0"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-subscriptions "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-core-method@1.2.6:
|
web3-core-method@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.6.tgz#f5a3e4d304abaf382923c8ab88ec8eeef45c1b3b"
|
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.6.tgz#f5a3e4d304abaf382923c8ab88ec8eeef45c1b3b"
|
||||||
@ -14835,15 +14609,6 @@ web3-core-requestmanager@1.2.6:
|
|||||||
web3-providers-ipc "1.2.6"
|
web3-providers-ipc "1.2.6"
|
||||||
web3-providers-ws "1.2.6"
|
web3-providers-ws "1.2.6"
|
||||||
|
|
||||||
web3-core-subscriptions@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.55.tgz#105902c13db53466fc17d07a981ad3d41c700f76"
|
|
||||||
integrity sha512-pb3oQbUzK7IoyXwag8TYInQddg0rr7BHxKc+Pbs/92hVNQ5ps4iGMVJKezdrjlQ1IJEEUiDIglXl4LZ1hIuMkw==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
eventemitter3 "^3.1.0"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
|
|
||||||
web3-core-subscriptions@1.2.6:
|
web3-core-subscriptions@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz#9d44189e2321f8f1abc31f6c09103b5283461b57"
|
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.6.tgz#9d44189e2321f8f1abc31f6c09103b5283461b57"
|
||||||
@ -14853,19 +14618,6 @@ web3-core-subscriptions@1.2.6:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-core-helpers "1.2.6"
|
web3-core-helpers "1.2.6"
|
||||||
|
|
||||||
web3-core@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.55.tgz#26b9abbf1bc1837c9cc90f06ecbc4ed714f89b53"
|
|
||||||
integrity sha512-AMMp7TLEtE7u8IJAu/THrRhBTZyZzeo7Y6GiWYNwb5+KStC9hIGLr9cI1KX9R6ZioTOLRHrqT7awDhnJ1ku2mg==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
"@types/bn.js" "^4.11.4"
|
|
||||||
"@types/node" "^10.12.18"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-core@1.2.6:
|
web3-core@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.6.tgz#bb42a1d7ae49a7258460f0d95ddb00906f59ef92"
|
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.6.tgz#bb42a1d7ae49a7258460f0d95ddb00906f59ef92"
|
||||||
@ -14878,16 +14630,6 @@ web3-core@1.2.6:
|
|||||||
web3-core-requestmanager "1.2.6"
|
web3-core-requestmanager "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth-abi@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.55.tgz#69250420039346105a3d0f899c0a8a53be926f97"
|
|
||||||
integrity sha512-3h1xnm/vYmKUXTOYAOP0OsB5uijQV76pNNRGKOB6Dq6GR1pbcbD3WrB/4I643YA8l91t5FRzFzUiA3S77R2iqw==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
ethers "^4.0.27"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth-abi@1.2.6, web3-eth-abi@^1.2.1:
|
web3-eth-abi@1.2.6, web3-eth-abi@^1.2.1:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25"
|
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25"
|
||||||
@ -14897,25 +14639,6 @@ web3-eth-abi@1.2.6, web3-eth-abi@^1.2.1:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth-accounts@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.0.0-beta.55.tgz#ba734ffdc1e3cc8ac0ea01de5241323a0c2f69f3"
|
|
||||||
integrity sha512-VfzvwpSDHXqRVelIxsBVhgbV9BkFvhJ/q+bKhnVUUXV0JAhMK/7uC92TsqKk4EBYuqpHyZ1jjqrL4n03fMU7zw==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
browserify-cipher "^1.0.1"
|
|
||||||
eth-lib "0.2.8"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
pbkdf2 "^3.0.17"
|
|
||||||
randombytes "^2.1.0"
|
|
||||||
scrypt.js "0.3.0"
|
|
||||||
uuid "3.3.2"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth-accounts@1.2.6:
|
web3-eth-accounts@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.6.tgz#a1ba4bf75fa8102a3ec6cddd0eccd72462262720"
|
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.6.tgz#a1ba4bf75fa8102a3ec6cddd0eccd72462262720"
|
||||||
@ -14934,23 +14657,6 @@ web3-eth-accounts@1.2.6:
|
|||||||
web3-core-method "1.2.6"
|
web3-core-method "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth-contract@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.55.tgz#cd9e6727ff73d648ebe7cae17516e8aec5873c65"
|
|
||||||
integrity sha512-v6oB1wfH039/A5sTb4ZTKX++fcBTHEkuQGpq50ATIDoxP/UTz2+6S+iL+3sCJTsByPw2/Bni/HM7NmLkXqzg/Q==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
"@types/bn.js" "^4.11.4"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-core-subscriptions "1.0.0-beta.55"
|
|
||||||
web3-eth-abi "1.0.0-beta.55"
|
|
||||||
web3-eth-accounts "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth-contract@1.2.6:
|
web3-eth-contract@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz#39111543960035ed94c597a239cf5aa1da796741"
|
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.6.tgz#39111543960035ed94c597a239cf5aa1da796741"
|
||||||
@ -14966,24 +14672,6 @@ web3-eth-contract@1.2.6:
|
|||||||
web3-eth-abi "1.2.6"
|
web3-eth-abi "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth-ens@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.0.0-beta.55.tgz#4341434a3406728212d411ae7f22d4cf5b8642fe"
|
|
||||||
integrity sha512-jEL17coO0FJXb7KYq4+7DhVXj0Rh+wHfZ86jOvFUvJsRaUHfqK2TlMatuhD2mbrmxpBYb6oMPnXVnNK9bnD5Rg==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
eth-ens-namehash "2.0.8"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-eth-abi "1.0.0-beta.55"
|
|
||||||
web3-eth-accounts "1.0.0-beta.55"
|
|
||||||
web3-eth-contract "1.0.0-beta.55"
|
|
||||||
web3-net "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth-ens@1.2.6:
|
web3-eth-ens@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.6.tgz#bf86a624c4c72bc59913c2345180d3ea947e110d"
|
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.6.tgz#bf86a624c4c72bc59913c2345180d3ea947e110d"
|
||||||
@ -14998,15 +14686,6 @@ web3-eth-ens@1.2.6:
|
|||||||
web3-eth-contract "1.2.6"
|
web3-eth-contract "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth-iban@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.55.tgz#15146a69de21addc99e7dbfb2920555b1e729637"
|
|
||||||
integrity sha512-a2Fxsb5Mssa+jiXgjUdIzJipE0175IcQXJbZLpKft2+zeSJWNTbaa3PQD2vPPpIM4W789q06N+f9Zc0Fyls+1g==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
bn.js "4.11.8"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth-iban@1.2.6:
|
web3-eth-iban@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz#0b22191fd1aa6e27f7ef0820df75820bfb4ed46b"
|
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.6.tgz#0b22191fd1aa6e27f7ef0820df75820bfb4ed46b"
|
||||||
@ -15015,20 +14694,6 @@ web3-eth-iban@1.2.6:
|
|||||||
bn.js "4.11.8"
|
bn.js "4.11.8"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth-personal@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.55.tgz#76e9d2da1501ee3c686751e7c7df63cc11793a1d"
|
|
||||||
integrity sha512-H0mahLQx6Oj7lpgTamKAswr3rHChRUZijeWAar2Hj7BABQlLRKwx8n09nYhxggvvLYQNQS90JjvQue7rAo2LQQ==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-eth-accounts "1.0.0-beta.55"
|
|
||||||
web3-net "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth-personal@1.2.6:
|
web3-eth-personal@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.6.tgz#47a0a0657ec04dd77f95451a6869d4751d324b6b"
|
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.6.tgz#47a0a0657ec04dd77f95451a6869d4751d324b6b"
|
||||||
@ -15041,28 +14706,6 @@ web3-eth-personal@1.2.6:
|
|||||||
web3-net "1.2.6"
|
web3-net "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-eth@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.55.tgz#bb52150df0a77bd13511449a53793d4eb23ade6e"
|
|
||||||
integrity sha512-F3zJ9I1gOgQdNGfi2Dy2lmj6OqCMJoRN01XHhQZagq0HY1JYMfObtfMi5E3L+qsegsSddHbqp4YY57tKx6uxpA==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
ethereumjs-tx "^1.3.7"
|
|
||||||
rxjs "^6.4.0"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-core-subscriptions "1.0.0-beta.55"
|
|
||||||
web3-eth-abi "1.0.0-beta.55"
|
|
||||||
web3-eth-accounts "1.0.0-beta.55"
|
|
||||||
web3-eth-contract "1.0.0-beta.55"
|
|
||||||
web3-eth-ens "1.0.0-beta.55"
|
|
||||||
web3-eth-iban "1.0.0-beta.55"
|
|
||||||
web3-eth-personal "1.0.0-beta.55"
|
|
||||||
web3-net "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-eth@1.2.6:
|
web3-eth@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.6.tgz#15a8c65fdde0727872848cae506758d302d8d046"
|
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.6.tgz#15a8c65fdde0727872848cae506758d302d8d046"
|
||||||
@ -15082,19 +14725,6 @@ web3-eth@1.2.6:
|
|||||||
web3-net "1.2.6"
|
web3-net "1.2.6"
|
||||||
web3-utils "1.2.6"
|
web3-utils "1.2.6"
|
||||||
|
|
||||||
web3-net@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.55.tgz#daf24323df16a890a0bac6c6eda48b6e8c7e96ef"
|
|
||||||
integrity sha512-do2WY8+/GArJSWX7k/zZ7nBnV9Y3n6LhPYkwT3LeFqDzD515bKwlomaNC8hOaTc6UQyXIoPprYTK2FevL7jrZw==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-net@1.2.6:
|
web3-net@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.6.tgz#035ca0fbe55282fda848ca17ebb4c8966147e5ea"
|
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.6.tgz#035ca0fbe55282fda848ca17ebb4c8966147e5ea"
|
||||||
@ -15158,37 +14788,6 @@ web3-providers-ws@1.2.6:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-core-helpers "1.2.6"
|
web3-core-helpers "1.2.6"
|
||||||
|
|
||||||
web3-providers@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-providers/-/web3-providers-1.0.0-beta.55.tgz#639503517741b69baaa82f1f940630df6a25992b"
|
|
||||||
integrity sha512-MNifc7W+iF6rykpbDR1MuX152jshWdZXHAU9Dk0Ja2/23elhIs4nCWs7wOX9FHrKgdrQbscPoq0uy+0aGzyWVQ==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
"@types/node" "^10.12.18"
|
|
||||||
eventemitter3 "3.1.0"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
url-parse "1.4.4"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
websocket "^1.0.28"
|
|
||||||
xhr2-cookies "1.1.0"
|
|
||||||
|
|
||||||
web3-shh@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.55.tgz#56f152ebcefb791dab86d2e6f1c296f8c1553644"
|
|
||||||
integrity sha512-lGP2HQ/1ThNnfoU8677aL48KsTx4Ht+2KQIn39dGpxVZqysQmovQIltbymVnAr4h8wofwcEz46iNHGa+PAyNzA==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-core-helpers "1.0.0-beta.55"
|
|
||||||
web3-core-method "1.0.0-beta.55"
|
|
||||||
web3-core-subscriptions "1.0.0-beta.55"
|
|
||||||
web3-net "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3-shh@1.2.6:
|
web3-shh@1.2.6:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.6.tgz#2492616da4cac32d4c7534b890f43bac63190c14"
|
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.6.tgz#2492616da4cac32d4c7534b890f43bac63190c14"
|
||||||
@ -15199,22 +14798,6 @@ web3-shh@1.2.6:
|
|||||||
web3-core-subscriptions "1.2.6"
|
web3-core-subscriptions "1.2.6"
|
||||||
web3-net "1.2.6"
|
web3-net "1.2.6"
|
||||||
|
|
||||||
web3-utils@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.55.tgz#beb40926b7c04208b752d36a9bc959d27a04b308"
|
|
||||||
integrity sha512-ASWqUi8gtWK02Tp8ZtcoAbHenMpQXNvHrakgzvqTNNZn26wgpv+Q4mdPi0KOR6ZgHFL8R/9b5BBoUTglS1WPpg==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
"@types/bn.js" "^4.11.4"
|
|
||||||
"@types/node" "^10.12.18"
|
|
||||||
bn.js "4.11.8"
|
|
||||||
eth-lib "0.2.8"
|
|
||||||
ethjs-unit "^0.1.6"
|
|
||||||
lodash "^4.17.11"
|
|
||||||
number-to-bn "1.7.0"
|
|
||||||
randombytes "^2.1.0"
|
|
||||||
utf8 "2.1.1"
|
|
||||||
|
|
||||||
web3-utils@1.2.6, web3-utils@^1.2.1, web3-utils@^1.2.2:
|
web3-utils@1.2.6, web3-utils@^1.2.1, web3-utils@^1.2.2:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.6.tgz#b9a25432da00976457fcc1094c4af8ac6d486db9"
|
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.6.tgz#b9a25432da00976457fcc1094c4af8ac6d486db9"
|
||||||
@ -15229,21 +14812,6 @@ web3-utils@1.2.6, web3-utils@^1.2.1, web3-utils@^1.2.2:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
utf8 "3.0.0"
|
utf8 "3.0.0"
|
||||||
|
|
||||||
web3@1.0.0-beta.55:
|
|
||||||
version "1.0.0-beta.55"
|
|
||||||
resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.55.tgz#8845075129299da172c2eb41a748c8a87c2a2b5a"
|
|
||||||
integrity sha512-yJpwy4IUA3T/F9hWzYQVn0GbJCrAaZ0KTIO3iuqkhaYH0Y09KV7k4GzFi4hN7hT4cFTj4yIKaeVCwQ5kzvi2Vg==
|
|
||||||
dependencies:
|
|
||||||
"@babel/runtime" "^7.3.1"
|
|
||||||
"@types/node" "^10.12.18"
|
|
||||||
web3-core "1.0.0-beta.55"
|
|
||||||
web3-eth "1.0.0-beta.55"
|
|
||||||
web3-eth-personal "1.0.0-beta.55"
|
|
||||||
web3-net "1.0.0-beta.55"
|
|
||||||
web3-providers "1.0.0-beta.55"
|
|
||||||
web3-shh "1.0.0-beta.55"
|
|
||||||
web3-utils "1.0.0-beta.55"
|
|
||||||
|
|
||||||
web3@^1.2.1, web3@^1.2.2:
|
web3@^1.2.1, web3@^1.2.2:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.6.tgz#c497dcb14cdd8d6d9fb6b445b3b68ff83f8ccf68"
|
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.6.tgz#c497dcb14cdd8d6d9fb6b445b3b68ff83f8ccf68"
|
||||||
@ -15406,17 +14974,6 @@ websocket-extensions@>=0.1.1:
|
|||||||
resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
|
resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
|
||||||
integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
|
integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
|
||||||
|
|
||||||
websocket@^1.0.28:
|
|
||||||
version "1.0.31"
|
|
||||||
resolved "https://registry.yarnpkg.com/websocket/-/websocket-1.0.31.tgz#e5d0f16c3340ed87670e489ecae6144c79358730"
|
|
||||||
integrity sha512-VAouplvGKPiKFDTeCCO65vYHsyay8DqoBSlzIO3fayrfOgU94lQN5a1uWVnFrMLceTJw/+fQXR5PGbUVRaHshQ==
|
|
||||||
dependencies:
|
|
||||||
debug "^2.2.0"
|
|
||||||
es5-ext "^0.10.50"
|
|
||||||
nan "^2.14.0"
|
|
||||||
typedarray-to-buffer "^3.1.5"
|
|
||||||
yaeti "^0.0.6"
|
|
||||||
|
|
||||||
whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
|
whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3, whatwg-encoding@^1.0.5:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
|
resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
|
||||||
@ -15924,8 +15481,3 @@ yauzl@^2.4.2:
|
|||||||
dependencies:
|
dependencies:
|
||||||
buffer-crc32 "~0.2.3"
|
buffer-crc32 "~0.2.3"
|
||||||
fd-slicer "~1.1.0"
|
fd-slicer "~1.1.0"
|
||||||
|
|
||||||
yn@3.1.1:
|
|
||||||
version "3.1.1"
|
|
||||||
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
|
|
||||||
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
|
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 56c2c39722be96381084834db68f8d7acc4805fa
|
Subproject commit d67761d93855a2693b719dd619a400b9302b8952
|
@ -6,7 +6,7 @@ require('dotenv').config({
|
|||||||
})
|
})
|
||||||
const { sendRawTxHome, sendRawTxForeign, privateKeyToAddress } = require(`${contractsPath}/deploy/src/deploymentUtils`)
|
const { sendRawTxHome, sendRawTxForeign, privateKeyToAddress } = require(`${contractsPath}/deploy/src/deploymentUtils`)
|
||||||
const { web3Home, web3Foreign, deploymentPrivateKey } = require(`${contractsPath}/deploy/src/web3`)
|
const { web3Home, web3Foreign, deploymentPrivateKey } = require(`${contractsPath}/deploy/src/web3`)
|
||||||
const BlockReward = require(`${contractsPath}/build/contracts/BlockReward.json`)
|
const BlockReward = require(`${contractsPath}/build/contracts/BlockRewardMock.json`)
|
||||||
const ERC677BridgeTokenRewardable = require(`${contractsPath}/build/contracts/ERC677BridgeTokenRewardable.json`)
|
const ERC677BridgeTokenRewardable = require(`${contractsPath}/build/contracts/ERC677BridgeTokenRewardable.json`)
|
||||||
const ERC677MultiBridgeToken = require(`${contractsPath}/build/contracts/ERC677MultiBridgeToken.json`)
|
const ERC677MultiBridgeToken = require(`${contractsPath}/build/contracts/ERC677MultiBridgeToken.json`)
|
||||||
|
|
||||||
|
@ -14,11 +14,11 @@
|
|||||||
"mobx-react": "^5.0.0",
|
"mobx-react": "^5.0.0",
|
||||||
"node-sass-chokidar": "^1.0.1",
|
"node-sass-chokidar": "^1.0.1",
|
||||||
"numeral": "^2.0.6",
|
"numeral": "^2.0.6",
|
||||||
"react": "^16.2.0",
|
"react": "16.13.1",
|
||||||
"react-app-rewire-mobx": "^1.0.7",
|
"react-app-rewire-mobx": "^1.0.7",
|
||||||
"react-app-rewired": "^2.0.3",
|
"react-app-rewired": "^2.0.3",
|
||||||
"react-copy-to-clipboard": "^5.0.1",
|
"react-copy-to-clipboard": "^5.0.1",
|
||||||
"react-dom": "^16.2.0",
|
"react-dom": "16.13.1",
|
||||||
"react-router": "^4.3.1",
|
"react-router": "^4.3.1",
|
||||||
"react-router-dom": "^4.2.2",
|
"react-router-dom": "^4.2.2",
|
||||||
"react-scripts": "3.0.1",
|
"react-scripts": "3.0.1",
|
||||||
|
592
yarn.lock
592
yarn.lock
@ -1148,7 +1148,7 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
regenerator-runtime "^0.13.2"
|
regenerator-runtime "^0.13.2"
|
||||||
|
|
||||||
"@babel/runtime@^7.5.1", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4":
|
"@babel/runtime@^7.5.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.7.4", "@babel/runtime@^7.8.4":
|
||||||
version "7.10.2"
|
version "7.10.2"
|
||||||
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
|
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz#d103f21f2602497d38348a32e008637d506db839"
|
||||||
integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
|
integrity sha512-6sF3uQw2ivImfVIl62RZ7MXhO2tap69WeWK57vAaimT6AZbE4FbqjdEJIN1UqoD6wI6B+1n9UiagafH1sxjOtg==
|
||||||
@ -1267,6 +1267,28 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5"
|
resolved "https://registry.yarnpkg.com/@csstools/normalize.css/-/normalize.css-9.0.1.tgz#c27b391d8457d1e893f1eddeaf5e5412d12ffbb5"
|
||||||
integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==
|
integrity sha512-6It2EVfGskxZCQhuykrfnALg7oVeiI6KclWSmGDqB0AiInVrTGB9Jp9i4/Ad21u9Jde/voVQz6eFX/eSg/UsPA==
|
||||||
|
|
||||||
|
"@emotion/is-prop-valid@^0.8.8":
|
||||||
|
version "0.8.8"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a"
|
||||||
|
integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==
|
||||||
|
dependencies:
|
||||||
|
"@emotion/memoize" "0.7.4"
|
||||||
|
|
||||||
|
"@emotion/memoize@0.7.4":
|
||||||
|
version "0.7.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb"
|
||||||
|
integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==
|
||||||
|
|
||||||
|
"@emotion/stylis@^0.8.4":
|
||||||
|
version "0.8.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/stylis/-/stylis-0.8.5.tgz#deacb389bd6ee77d1e7fcaccce9e16c5c7e78e04"
|
||||||
|
integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==
|
||||||
|
|
||||||
|
"@emotion/unitless@^0.7.4":
|
||||||
|
version "0.7.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.7.5.tgz#77211291c1900a700b8a78cfafda3160d76949ed"
|
||||||
|
integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==
|
||||||
|
|
||||||
"@ethersproject/abi@5.0.0-beta.142":
|
"@ethersproject/abi@5.0.0-beta.142":
|
||||||
version "5.0.0-beta.142"
|
version "5.0.0-beta.142"
|
||||||
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.142.tgz#cde0ced7daa2fbc98e35a2c31203331907e84a39"
|
resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.0.0-beta.142.tgz#cde0ced7daa2fbc98e35a2c31203331907e84a39"
|
||||||
@ -2492,6 +2514,47 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" ">= 8"
|
"@types/node" ">= 8"
|
||||||
|
|
||||||
|
"@react-hook/debounce@^3.0.0":
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-hook/debounce/-/debounce-3.0.0.tgz#9eea8b5d81d4cb67cd72dd8657b3ff724afc7cad"
|
||||||
|
integrity sha512-ir/kPrSfAzY12Gre0sOHkZ2rkEmM4fS5M5zFxCi4BnCeXh2nvx9Ujd+U4IGpKCuPA+EQD0pg1eK2NGLvfWejag==
|
||||||
|
dependencies:
|
||||||
|
"@react-hook/latest" "^1.0.2"
|
||||||
|
|
||||||
|
"@react-hook/event@^1.2.1":
|
||||||
|
version "1.2.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-hook/event/-/event-1.2.1.tgz#4ebaff343ea3ab0f7c98d2e0e26e3aa719a69ebf"
|
||||||
|
integrity sha512-kzCZfUAtJl6A9Wvr+OLfVtjbqhC8o5/E0hqyHHQ6gX7/Gm/XlabM5OMCcoiipNu9PRMIfTlbeI4a8QOE6O00Qw==
|
||||||
|
dependencies:
|
||||||
|
"@react-hook/latest" "^1.0.2"
|
||||||
|
"@react-hook/passive-layout-effect" "^1.2.0"
|
||||||
|
|
||||||
|
"@react-hook/latest@^1.0.2":
|
||||||
|
version "1.0.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-hook/latest/-/latest-1.0.2.tgz#767eb6974f91eef353981b8b60a87147dadecb18"
|
||||||
|
integrity sha512-zLtOIToct1EBTbwldkMJsXC2eCsmWOOP7z6UG0M/sCgnPExtIjvVMCpPESvPnMbQzDZytXVy0nvMbUuK2gZs2A==
|
||||||
|
|
||||||
|
"@react-hook/passive-layout-effect@^1.2.0":
|
||||||
|
version "1.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-hook/passive-layout-effect/-/passive-layout-effect-1.2.0.tgz#1232f0b08f9bfd9f87a2898a3ae50d5f7731d806"
|
||||||
|
integrity sha512-obGcMHoeiG/qp9djzlxwvlsAzL4a+JFaxTLvJv8GykipmS/TEkfvdcpu6orE1ZL4dAT7OpoGwHDc/LGJbkZzXQ==
|
||||||
|
|
||||||
|
"@react-hook/throttle@^2.2.0":
|
||||||
|
version "2.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-hook/throttle/-/throttle-2.2.0.tgz#d0402714a06e1ba0bc1da1fdf5c3c5cd0e08d45a"
|
||||||
|
integrity sha512-LJ5eg+yMV8lXtqK3lR+OtOZ2WH/EfWvuiEEu0M3bhR7dZRfTyEJKxH1oK9uyBxiXPtWXiQggWbZirMCXam51tg==
|
||||||
|
dependencies:
|
||||||
|
"@react-hook/latest" "^1.0.2"
|
||||||
|
|
||||||
|
"@react-hook/window-size@^3.0.6":
|
||||||
|
version "3.0.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/@react-hook/window-size/-/window-size-3.0.6.tgz#1797ea307cb63d94602140c58af75ab51cae4a55"
|
||||||
|
integrity sha512-qlnpZV+IJFLgftCGQOjUf/VfRA/UO6w6/1kO7OBNLNbWXnAEEFvU+F9qPKIApd2oFmLfAOIlK8jm4wsoC+n9Uw==
|
||||||
|
dependencies:
|
||||||
|
"@react-hook/debounce" "^3.0.0"
|
||||||
|
"@react-hook/event" "^1.2.1"
|
||||||
|
"@react-hook/throttle" "^2.2.0"
|
||||||
|
|
||||||
"@resolver-engine/core@^0.2.1":
|
"@resolver-engine/core@^0.2.1":
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.2.1.tgz#0d71803f6d3b8cb2e9ed481a1bf0ca5f5256d0c0"
|
resolved "https://registry.yarnpkg.com/@resolver-engine/core/-/core-0.2.1.tgz#0d71803f6d3b8cb2e9ed481a1bf0ca5f5256d0c0"
|
||||||
@ -2837,6 +2900,19 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/history@*":
|
||||||
|
version "4.7.6"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356"
|
||||||
|
integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w==
|
||||||
|
|
||||||
|
"@types/hoist-non-react-statics@*":
|
||||||
|
version "3.3.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz#1124aafe5118cb591977aeb1ceaaed1070eb039f"
|
||||||
|
integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==
|
||||||
|
dependencies:
|
||||||
|
"@types/react" "*"
|
||||||
|
hoist-non-react-statics "^3.3.0"
|
||||||
|
|
||||||
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
|
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
|
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
|
||||||
@ -2904,6 +2980,13 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.59.tgz#9e34261f30183f9777017a13d185dfac6b899e04"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.59.tgz#9e34261f30183f9777017a13d185dfac6b899e04"
|
||||||
integrity sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==
|
integrity sha512-8RkBivJrDCyPpBXhVZcjh7cQxVBSmRk9QM7hOketZzp6Tg79c0N8kkpAIito9bnJ3HCVCHVYz+KHTEbfQNfeVQ==
|
||||||
|
|
||||||
|
"@types/promise-retry@^1.1.3":
|
||||||
|
version "1.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/promise-retry/-/promise-retry-1.1.3.tgz#baab427419da9088a1d2f21bf56249c21b3dd43c"
|
||||||
|
integrity sha512-LxIlEpEX6frE3co3vCO2EUJfHIta1IOmhDlcAsR4GMMv9hev1iTI9VwberVGkePJAuLZs5rMucrV8CziCfuJMw==
|
||||||
|
dependencies:
|
||||||
|
"@types/retry" "*"
|
||||||
|
|
||||||
"@types/prop-types@*":
|
"@types/prop-types@*":
|
||||||
version "15.7.3"
|
version "15.7.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
|
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
|
||||||
@ -2926,6 +3009,30 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
"@types/react" "*"
|
"@types/react" "*"
|
||||||
|
|
||||||
|
"@types/react-native@*":
|
||||||
|
version "0.62.12"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.62.12.tgz#24407983b527749f37b512cd5d2bdc6133810b17"
|
||||||
|
integrity sha512-EuM2QOx0LGwY3mKQ313+QcTYOwJhw5eggmE42GO4ElIKIfNK+zxxM6Pe9dT1Eq8eCJXY0oG327L7gUBWniwNNA==
|
||||||
|
dependencies:
|
||||||
|
"@types/react" "*"
|
||||||
|
|
||||||
|
"@types/react-router-dom@^5.1.5":
|
||||||
|
version "5.1.5"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090"
|
||||||
|
integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw==
|
||||||
|
dependencies:
|
||||||
|
"@types/history" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@types/react-router" "*"
|
||||||
|
|
||||||
|
"@types/react-router@*":
|
||||||
|
version "5.1.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.7.tgz#e9d12ed7dcfc79187e4d36667745b69a5aa11556"
|
||||||
|
integrity sha512-2ouP76VQafKjtuc0ShpwUebhHwJo0G6rhahW9Pb8au3tQTjYXd2jta4wv6U2tGLR/I42yuG00+UXjNYY0dTzbg==
|
||||||
|
dependencies:
|
||||||
|
"@types/history" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
|
||||||
"@types/react@*":
|
"@types/react@*":
|
||||||
version "16.9.32"
|
version "16.9.32"
|
||||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383"
|
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383"
|
||||||
@ -2942,6 +3049,11 @@
|
|||||||
"@types/prop-types" "*"
|
"@types/prop-types" "*"
|
||||||
csstype "^2.2.0"
|
csstype "^2.2.0"
|
||||||
|
|
||||||
|
"@types/retry@*":
|
||||||
|
version "0.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d"
|
||||||
|
integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
|
||||||
|
|
||||||
"@types/solidity-parser-antlr@^0.2.3":
|
"@types/solidity-parser-antlr@^0.2.3":
|
||||||
version "0.2.3"
|
version "0.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.3.tgz#bb2d9c6511bf483afe4fc3e2714da8a924e59e3f"
|
resolved "https://registry.yarnpkg.com/@types/solidity-parser-antlr/-/solidity-parser-antlr-0.2.3.tgz#bb2d9c6511bf483afe4fc3e2714da8a924e59e3f"
|
||||||
@ -2952,6 +3064,16 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
|
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
|
||||||
integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
|
integrity sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==
|
||||||
|
|
||||||
|
"@types/styled-components@^5.1.0":
|
||||||
|
version "5.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@types/styled-components/-/styled-components-5.1.0.tgz#24d3412ba5395aa06e14fbc93c52f9454cebd0d6"
|
||||||
|
integrity sha512-ZFlLCuwF5r+4Vb7JUmd+Yr2S0UBdBGmI7ctFTgJMypIp3xOHI4LCFVn2dKMvpk6xDB2hLRykrEWMBwJEpUAUIQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/hoist-non-react-statics" "*"
|
||||||
|
"@types/react" "*"
|
||||||
|
"@types/react-native" "*"
|
||||||
|
csstype "^2.2.0"
|
||||||
|
|
||||||
"@types/testing-library__dom@*":
|
"@types/testing-library__dom@*":
|
||||||
version "7.0.2"
|
version "7.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.0.2.tgz#2906f8a0dce58b0746c6ab606f786bd06fe6940e"
|
resolved "https://registry.yarnpkg.com/@types/testing-library__dom/-/testing-library__dom-7.0.2.tgz#2906f8a0dce58b0746c6ab606f786bd06fe6940e"
|
||||||
@ -3098,6 +3220,11 @@
|
|||||||
lodash.unescape "4.0.1"
|
lodash.unescape "4.0.1"
|
||||||
semver "5.5.0"
|
semver "5.5.0"
|
||||||
|
|
||||||
|
"@use-it/interval@^0.1.3":
|
||||||
|
version "0.1.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/@use-it/interval/-/interval-0.1.3.tgz#5d1096b2295d7a5dda8e8022f3abb5f9d9ef27f8"
|
||||||
|
integrity sha512-chshdtDZTFoWA9aszBz1Cc04Ca9NBD2JTi/GMjdJ+HGm4q7Vy1v71+2mm22r7Kfb2nYW+lTRsPcEHdB/VFVHsQ==
|
||||||
|
|
||||||
"@web3-js/scrypt-shim@^0.1.0":
|
"@web3-js/scrypt-shim@^0.1.0":
|
||||||
version "0.1.0"
|
version "0.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc"
|
resolved "https://registry.yarnpkg.com/@web3-js/scrypt-shim/-/scrypt-shim-0.1.0.tgz#0bf7529ab6788311d3e07586f7d89107c3bea2cc"
|
||||||
@ -4288,6 +4415,16 @@ babel-plugin-named-asset-import@^0.3.2:
|
|||||||
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz#20978ed446b8e1bf4a2f42d0a94c0ece85f75f4f"
|
resolved "https://registry.yarnpkg.com/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.2.tgz#20978ed446b8e1bf4a2f42d0a94c0ece85f75f4f"
|
||||||
integrity sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==
|
integrity sha512-CxwvxrZ9OirpXQ201Ec57OmGhmI8/ui/GwTDy0hSp6CmRvgRC0pSair6Z04Ck+JStA0sMPZzSJ3uE4n17EXpPQ==
|
||||||
|
|
||||||
|
"babel-plugin-styled-components@>= 1":
|
||||||
|
version "1.10.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.10.7.tgz#3494e77914e9989b33cc2d7b3b29527a949d635c"
|
||||||
|
integrity sha512-MBMHGcIA22996n9hZRf/UJLVVgkEOITuR2SvjHLb5dSTUyR4ZRGn+ngITapes36FI3WLxZHfRhkA1ffHxihOrg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-annotate-as-pure" "^7.0.0"
|
||||||
|
"@babel/helper-module-imports" "^7.0.0"
|
||||||
|
babel-plugin-syntax-jsx "^6.18.0"
|
||||||
|
lodash "^4.17.11"
|
||||||
|
|
||||||
babel-plugin-syntax-async-functions@^6.8.0:
|
babel-plugin-syntax-async-functions@^6.8.0:
|
||||||
version "6.13.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"
|
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
|
||||||
@ -4303,6 +4440,11 @@ babel-plugin-syntax-exponentiation-operator@^6.8.0:
|
|||||||
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
|
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
|
||||||
integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=
|
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-object-rest-spread@^6.8.0:
|
babel-plugin-syntax-object-rest-spread@^6.8.0:
|
||||||
version "6.13.0"
|
version "6.13.0"
|
||||||
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
|
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5"
|
||||||
@ -4775,7 +4917,7 @@ big.js@^5.2.2:
|
|||||||
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
|
||||||
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
|
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
|
||||||
|
|
||||||
bignumber.js@*:
|
bignumber.js@*, bignumber.js@^9.0.0:
|
||||||
version "9.0.0"
|
version "9.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075"
|
resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075"
|
||||||
integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==
|
integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==
|
||||||
@ -5439,6 +5581,11 @@ camelcase@^5.0.0, camelcase@^5.2.0, camelcase@^5.3.1:
|
|||||||
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
|
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
|
||||||
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
|
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
|
||||||
|
|
||||||
|
camelize@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b"
|
||||||
|
integrity sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=
|
||||||
|
|
||||||
caniuse-api@^3.0.0:
|
caniuse-api@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
|
resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0"
|
||||||
@ -6487,6 +6634,11 @@ css-blank-pseudo@^0.1.4:
|
|||||||
dependencies:
|
dependencies:
|
||||||
postcss "^7.0.5"
|
postcss "^7.0.5"
|
||||||
|
|
||||||
|
css-color-keywords@^1.0.0:
|
||||||
|
version "1.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/css-color-keywords/-/css-color-keywords-1.0.0.tgz#fea2616dc676b2962686b3af8dbdbe180b244e05"
|
||||||
|
integrity sha1-/qJhbcZ2spYmhrOvjb2+GAskTgU=
|
||||||
|
|
||||||
css-color-names@0.0.4, css-color-names@^0.0.4:
|
css-color-names@0.0.4, css-color-names@^0.0.4:
|
||||||
version "0.0.4"
|
version "0.0.4"
|
||||||
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
|
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
|
||||||
@ -6557,6 +6709,15 @@ css-select@^2.0.0:
|
|||||||
domutils "^1.7.0"
|
domutils "^1.7.0"
|
||||||
nth-check "^1.0.2"
|
nth-check "^1.0.2"
|
||||||
|
|
||||||
|
css-to-react-native@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/css-to-react-native/-/css-to-react-native-3.0.0.tgz#62dbe678072a824a689bcfee011fc96e02a7d756"
|
||||||
|
integrity sha512-Ro1yETZA813eoyUp2GDBhG2j+YggidUmzO1/v9eYBKR2EHVEniE2MI/NqpTQ954BMpTPZFsGNPm46qFB9dpaPQ==
|
||||||
|
dependencies:
|
||||||
|
camelize "^1.0.0"
|
||||||
|
css-color-keywords "^1.0.0"
|
||||||
|
postcss-value-parser "^4.0.2"
|
||||||
|
|
||||||
css-tree@1.0.0-alpha.28:
|
css-tree@1.0.0-alpha.28:
|
||||||
version "1.0.0-alpha.28"
|
version "1.0.0-alpha.28"
|
||||||
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
|
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.28.tgz#8e8968190d886c9477bc8d61e96f61af3f7ffa7f"
|
||||||
@ -6782,6 +6943,11 @@ date-fns@^2.13.0:
|
|||||||
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.13.0.tgz#d7b8a0a2d392e8d88a8024d0a46b980bbfdbd708"
|
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.13.0.tgz#d7b8a0a2d392e8d88a8024d0a46b980bbfdbd708"
|
||||||
integrity sha512-xm0c61mevGF7f0XpCGtDTGpzEFC/1fpLXHbmFpxZZQJuvByIK2ozm6cSYuU+nxFYOPh2EuCfzUwlTEFwKG+h5w==
|
integrity sha512-xm0c61mevGF7f0XpCGtDTGpzEFC/1fpLXHbmFpxZZQJuvByIK2ozm6cSYuU+nxFYOPh2EuCfzUwlTEFwKG+h5w==
|
||||||
|
|
||||||
|
date-fns@^2.14.0:
|
||||||
|
version "2.14.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba"
|
||||||
|
integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw==
|
||||||
|
|
||||||
date-now@^0.1.4:
|
date-now@^0.1.4:
|
||||||
version "0.1.4"
|
version "0.1.4"
|
||||||
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
|
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
|
||||||
@ -7563,6 +7729,11 @@ err-code@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
|
resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960"
|
||||||
integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
|
integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=
|
||||||
|
|
||||||
|
err-code@^2.0.2:
|
||||||
|
version "2.0.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9"
|
||||||
|
integrity sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==
|
||||||
|
|
||||||
errno@^0.1.3, errno@~0.1.1, errno@~0.1.7:
|
errno@^0.1.3, errno@~0.1.1, errno@~0.1.7:
|
||||||
version "0.1.7"
|
version "0.1.7"
|
||||||
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
|
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618"
|
||||||
@ -8270,6 +8441,15 @@ eth-lib@0.2.7:
|
|||||||
elliptic "^6.4.0"
|
elliptic "^6.4.0"
|
||||||
xhr-request-promise "^0.1.2"
|
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-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
|
eth-query@^2.0.2, eth-query@^2.1.0, eth-query@^2.1.2:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
|
resolved "https://registry.yarnpkg.com/eth-query/-/eth-query-2.1.2.tgz#d6741d9000106b51510c72db92d6365456a6da5e"
|
||||||
@ -8609,6 +8789,11 @@ eventemitter3@3.1.2, eventemitter3@^3.0.0, eventemitter3@^3.1.0:
|
|||||||
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
|
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.2.tgz#2d3d48f9c346698fce83a85d7d664e98535df6e7"
|
||||||
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
|
integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==
|
||||||
|
|
||||||
|
eventemitter3@^4.0.0:
|
||||||
|
version "4.0.4"
|
||||||
|
resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384"
|
||||||
|
integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==
|
||||||
|
|
||||||
events@^3.0.0:
|
events@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
|
resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
|
||||||
@ -8896,6 +9081,11 @@ fast-levenshtein@~2.0.4, fast-levenshtein@~2.0.6:
|
|||||||
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
|
||||||
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
|
integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
|
||||||
|
|
||||||
|
fast-memoize@^2.5.2:
|
||||||
|
version "2.5.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/fast-memoize/-/fast-memoize-2.5.2.tgz#79e3bb6a4ec867ea40ba0e7146816f6cdce9b57e"
|
||||||
|
integrity sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw==
|
||||||
|
|
||||||
fast-safe-stringify@^1.0.8, fast-safe-stringify@^1.2.3:
|
fast-safe-stringify@^1.0.8, fast-safe-stringify@^1.2.3:
|
||||||
version "1.2.3"
|
version "1.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.3.tgz#9fe22c37fb2f7f86f06b8f004377dbf8f1ee7bc1"
|
resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-1.2.3.tgz#9fe22c37fb2f7f86f06b8f004377dbf8f1ee7bc1"
|
||||||
@ -10257,6 +10447,18 @@ history@^4.7.2:
|
|||||||
tiny-warning "^1.0.0"
|
tiny-warning "^1.0.0"
|
||||||
value-equal "^0.4.0"
|
value-equal "^0.4.0"
|
||||||
|
|
||||||
|
history@^4.9.0:
|
||||||
|
version "4.10.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/history/-/history-4.10.1.tgz#33371a65e3a83b267434e2b3f3b1b4c58aad4cf3"
|
||||||
|
integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.1.2"
|
||||||
|
loose-envify "^1.2.0"
|
||||||
|
resolve-pathname "^3.0.0"
|
||||||
|
tiny-invariant "^1.0.2"
|
||||||
|
tiny-warning "^1.0.0"
|
||||||
|
value-equal "^1.0.1"
|
||||||
|
|
||||||
hmac-drbg@^1.0.0:
|
hmac-drbg@^1.0.0:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
|
||||||
@ -10278,6 +10480,13 @@ hoist-non-react-statics@^3.0.0:
|
|||||||
dependencies:
|
dependencies:
|
||||||
react-is "^16.7.0"
|
react-is "^16.7.0"
|
||||||
|
|
||||||
|
hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.0:
|
||||||
|
version "3.3.2"
|
||||||
|
resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45"
|
||||||
|
integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==
|
||||||
|
dependencies:
|
||||||
|
react-is "^16.7.0"
|
||||||
|
|
||||||
home-or-tmp@^2.0.0:
|
home-or-tmp@^2.0.0:
|
||||||
version "2.0.0"
|
version "2.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
|
resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8"
|
||||||
@ -13367,6 +13576,14 @@ min-indent@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
|
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
|
||||||
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
|
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
|
||||||
|
|
||||||
|
mini-create-react-context@^0.4.0:
|
||||||
|
version "0.4.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040"
|
||||||
|
integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.5.5"
|
||||||
|
tiny-warning "^1.0.3"
|
||||||
|
|
||||||
mini-css-extract-plugin@0.5.0:
|
mini-css-extract-plugin@0.5.0:
|
||||||
version "0.5.0"
|
version "0.5.0"
|
||||||
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
|
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
|
||||||
@ -15699,6 +15916,11 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0, postcss-value-parser@^
|
|||||||
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
|
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
|
||||||
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
|
integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
|
||||||
|
|
||||||
|
postcss-value-parser@^4.0.2:
|
||||||
|
version "4.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb"
|
||||||
|
integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==
|
||||||
|
|
||||||
postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
|
postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1:
|
||||||
version "2.0.1"
|
version "2.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
|
resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz#da8b472d901da1e205b47bdc98637b9e9e550e5f"
|
||||||
@ -15900,6 +16122,14 @@ promise-retry@^1.1.1:
|
|||||||
err-code "^1.0.0"
|
err-code "^1.0.0"
|
||||||
retry "^0.10.0"
|
retry "^0.10.0"
|
||||||
|
|
||||||
|
promise-retry@^2.0.1:
|
||||||
|
version "2.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-2.0.1.tgz#ff747a13620ab57ba688f5fc67855410c370da22"
|
||||||
|
integrity sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==
|
||||||
|
dependencies:
|
||||||
|
err-code "^2.0.2"
|
||||||
|
retry "^0.12.0"
|
||||||
|
|
||||||
promise-to-callback@^1.0.0:
|
promise-to-callback@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
|
resolved "https://registry.yarnpkg.com/promise-to-callback/-/promise-to-callback-1.0.0.tgz#5d2a749010bfb67d963598fcd3960746a68feef7"
|
||||||
@ -16313,7 +16543,7 @@ react-dev-utils@^9.0.1:
|
|||||||
strip-ansi "5.2.0"
|
strip-ansi "5.2.0"
|
||||||
text-table "0.2.0"
|
text-table "0.2.0"
|
||||||
|
|
||||||
react-dom@^16.13.1:
|
react-dom@16.13.1, react-dom@^16.13.1:
|
||||||
version "16.13.1"
|
version "16.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
|
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.13.1.tgz#c1bd37331a0486c078ee54c4740720993b2e0e7f"
|
||||||
integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
|
integrity sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==
|
||||||
@ -16323,22 +16553,12 @@ react-dom@^16.13.1:
|
|||||||
prop-types "^15.6.2"
|
prop-types "^15.6.2"
|
||||||
scheduler "^0.19.1"
|
scheduler "^0.19.1"
|
||||||
|
|
||||||
react-dom@^16.2.0:
|
|
||||||
version "16.8.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.6.tgz#71d6303f631e8b0097f56165ef608f051ff6e10f"
|
|
||||||
integrity sha512-1nL7PIq9LTL3fthPqwkvr2zY7phIPjYrT0jp4HjyEQrEROnw4dG41VVwi/wfoCneoleqrNX7iAD+pXebJZwrwA==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
object-assign "^4.1.1"
|
|
||||||
prop-types "^15.6.2"
|
|
||||||
scheduler "^0.13.6"
|
|
||||||
|
|
||||||
react-error-overlay@^5.1.6:
|
react-error-overlay@^5.1.6:
|
||||||
version "5.1.6"
|
version "5.1.6"
|
||||||
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.6.tgz#0cd73407c5d141f9638ae1e0c63e7b2bf7e9929d"
|
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.6.tgz#0cd73407c5d141f9638ae1e0c63e7b2bf7e9929d"
|
||||||
integrity sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==
|
integrity sha512-X1Y+0jR47ImDVr54Ab6V9eGk0Hnu7fVWGeHQSOXHf/C2pF9c6uy3gef8QUeuUiWlNb0i08InPSE5a/KJzNzw1Q==
|
||||||
|
|
||||||
react-is@^16.12.0:
|
react-is@^16.12.0, react-is@^16.6.0:
|
||||||
version "16.13.1"
|
version "16.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
|
||||||
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
|
||||||
@ -16365,6 +16585,35 @@ react-router-dom@^4.2.2:
|
|||||||
react-router "^4.3.1"
|
react-router "^4.3.1"
|
||||||
warning "^4.0.1"
|
warning "^4.0.1"
|
||||||
|
|
||||||
|
react-router-dom@^5.2.0:
|
||||||
|
version "5.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662"
|
||||||
|
integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.1.2"
|
||||||
|
history "^4.9.0"
|
||||||
|
loose-envify "^1.3.1"
|
||||||
|
prop-types "^15.6.2"
|
||||||
|
react-router "5.2.0"
|
||||||
|
tiny-invariant "^1.0.2"
|
||||||
|
tiny-warning "^1.0.0"
|
||||||
|
|
||||||
|
react-router@5.2.0:
|
||||||
|
version "5.2.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293"
|
||||||
|
integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw==
|
||||||
|
dependencies:
|
||||||
|
"@babel/runtime" "^7.1.2"
|
||||||
|
history "^4.9.0"
|
||||||
|
hoist-non-react-statics "^3.1.0"
|
||||||
|
loose-envify "^1.3.1"
|
||||||
|
mini-create-react-context "^0.4.0"
|
||||||
|
path-to-regexp "^1.7.0"
|
||||||
|
prop-types "^15.6.2"
|
||||||
|
react-is "^16.6.0"
|
||||||
|
tiny-invariant "^1.0.2"
|
||||||
|
tiny-warning "^1.0.0"
|
||||||
|
|
||||||
react-router@^4.3.1:
|
react-router@^4.3.1:
|
||||||
version "4.3.1"
|
version "4.3.1"
|
||||||
resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e"
|
resolved "https://registry.yarnpkg.com/react-router/-/react-router-4.3.1.tgz#aada4aef14c809cb2e686b05cee4742234506c4e"
|
||||||
@ -16456,7 +16705,7 @@ react-transition-group@^2.2.1:
|
|||||||
prop-types "^15.6.2"
|
prop-types "^15.6.2"
|
||||||
react-lifecycles-compat "^3.0.4"
|
react-lifecycles-compat "^3.0.4"
|
||||||
|
|
||||||
react@^16.13.1:
|
react@16.13.1, react@^16.13.1:
|
||||||
version "16.13.1"
|
version "16.13.1"
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
|
resolved "https://registry.yarnpkg.com/react/-/react-16.13.1.tgz#2e818822f1a9743122c063d6410d85c1e3afe48e"
|
||||||
integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
|
integrity sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==
|
||||||
@ -16465,16 +16714,6 @@ react@^16.13.1:
|
|||||||
object-assign "^4.1.1"
|
object-assign "^4.1.1"
|
||||||
prop-types "^15.6.2"
|
prop-types "^15.6.2"
|
||||||
|
|
||||||
react@^16.2.0:
|
|
||||||
version "16.8.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/react/-/react-16.8.6.tgz#ad6c3a9614fd3a4e9ef51117f54d888da01f2bbe"
|
|
||||||
integrity sha512-pC0uMkhLaHm11ZSJULfOBqV4tIZkx87ZLvbbQYunNixAAvjnC+snJCg0XQXn9VIsttVsbZP/H/ewzgsd5fxKXw==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
object-assign "^4.1.1"
|
|
||||||
prop-types "^15.6.2"
|
|
||||||
scheduler "^0.13.6"
|
|
||||||
|
|
||||||
read-cmd-shim@^1.0.1:
|
read-cmd-shim@^1.0.1:
|
||||||
version "1.0.5"
|
version "1.0.5"
|
||||||
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
|
resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz#87e43eba50098ba5a32d0ceb583ab8e43b961c16"
|
||||||
@ -17111,6 +17350,11 @@ resolve-pathname@^2.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"
|
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-2.2.0.tgz#7e9ae21ed815fd63ab189adeee64dc831eefa879"
|
||||||
integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==
|
integrity sha512-bAFz9ld18RzJfddgrO2e/0S2O81710++chRMUxHjXOYKF6jTAMrUNZrEZ1PvV0zlhfjidm08iRPdTLPno1FuRg==
|
||||||
|
|
||||||
|
resolve-pathname@^3.0.0:
|
||||||
|
version "3.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/resolve-pathname/-/resolve-pathname-3.0.0.tgz#99d02224d3cf263689becbb393bc560313025dcd"
|
||||||
|
integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==
|
||||||
|
|
||||||
resolve-url@^0.2.1:
|
resolve-url@^0.2.1:
|
||||||
version "0.2.1"
|
version "0.2.1"
|
||||||
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
|
||||||
@ -17196,6 +17440,11 @@ retry@^0.10.0:
|
|||||||
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
|
resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4"
|
||||||
integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
|
integrity sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=
|
||||||
|
|
||||||
|
retry@^0.12.0:
|
||||||
|
version "0.12.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
|
||||||
|
integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=
|
||||||
|
|
||||||
rgb-regex@^1.0.1:
|
rgb-regex@^1.0.1:
|
||||||
version "1.0.1"
|
version "1.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
|
resolved "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz#c0e0d6882df0e23be254a475e8edd41915feaeb1"
|
||||||
@ -17373,14 +17622,6 @@ saxes@^3.1.9:
|
|||||||
dependencies:
|
dependencies:
|
||||||
xmlchars "^1.3.1"
|
xmlchars "^1.3.1"
|
||||||
|
|
||||||
scheduler@^0.13.6:
|
|
||||||
version "0.13.6"
|
|
||||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.6.tgz#466a4ec332467b31a91b9bf74e5347072e4cd889"
|
|
||||||
integrity sha512-IWnObHt413ucAYKsD9J1QShUKkbKLQQHdxRyw73sw4FN26iWr3DY/H34xGPe4nmL1DwXyWmSWmMrA9TfQbE/XQ==
|
|
||||||
dependencies:
|
|
||||||
loose-envify "^1.1.0"
|
|
||||||
object-assign "^4.1.1"
|
|
||||||
|
|
||||||
scheduler@^0.19.1:
|
scheduler@^0.19.1:
|
||||||
version "0.19.1"
|
version "0.19.1"
|
||||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
|
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.19.1.tgz#4f3e2ed2c1a7d65681f4c854fa8c5a1ccb40f196"
|
||||||
@ -17709,6 +17950,11 @@ shallow-clone@^1.0.0:
|
|||||||
kind-of "^5.0.0"
|
kind-of "^5.0.0"
|
||||||
mixin-object "^2.0.1"
|
mixin-object "^2.0.1"
|
||||||
|
|
||||||
|
shallowequal@^1.1.0:
|
||||||
|
version "1.1.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
|
||||||
|
integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==
|
||||||
|
|
||||||
shebang-command@^1.2.0:
|
shebang-command@^1.2.0:
|
||||||
version "1.2.0"
|
version "1.2.0"
|
||||||
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
|
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
|
||||||
@ -18508,6 +18754,22 @@ style-loader@0.23.1:
|
|||||||
loader-utils "^1.1.0"
|
loader-utils "^1.1.0"
|
||||||
schema-utils "^1.0.0"
|
schema-utils "^1.0.0"
|
||||||
|
|
||||||
|
styled-components@^5.1.1:
|
||||||
|
version "5.1.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/styled-components/-/styled-components-5.1.1.tgz#96dfb02a8025794960863b9e8e365e3b6be5518d"
|
||||||
|
integrity sha512-1ps8ZAYu2Husx+Vz8D+MvXwEwvMwFv+hqqUwhNlDN5ybg6A+3xyW1ECrAgywhvXapNfXiz79jJyU0x22z0FFTg==
|
||||||
|
dependencies:
|
||||||
|
"@babel/helper-module-imports" "^7.0.0"
|
||||||
|
"@babel/traverse" "^7.4.5"
|
||||||
|
"@emotion/is-prop-valid" "^0.8.8"
|
||||||
|
"@emotion/stylis" "^0.8.4"
|
||||||
|
"@emotion/unitless" "^0.7.4"
|
||||||
|
babel-plugin-styled-components ">= 1"
|
||||||
|
css-to-react-native "^3.0.0"
|
||||||
|
hoist-non-react-statics "^3.0.0"
|
||||||
|
shallowequal "^1.1.0"
|
||||||
|
supports-color "^5.5.0"
|
||||||
|
|
||||||
stylehacks@^4.0.0:
|
stylehacks@^4.0.0:
|
||||||
version "4.0.3"
|
version "4.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
|
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
|
||||||
@ -18630,6 +18892,23 @@ swarm-js@0.1.39:
|
|||||||
tar "^4.0.2"
|
tar "^4.0.2"
|
||||||
xhr-request-promise "^0.1.2"
|
xhr-request-promise "^0.1.2"
|
||||||
|
|
||||||
|
swarm-js@^0.1.40:
|
||||||
|
version "0.1.40"
|
||||||
|
resolved "https://registry.yarnpkg.com/swarm-js/-/swarm-js-0.1.40.tgz#b1bc7b6dcc76061f6c772203e004c11997e06b99"
|
||||||
|
integrity sha512-yqiOCEoA4/IShXkY3WKwP5PvZhmoOOD8clsKA7EEcRILMkTEYHCQ21HDCAcVpmIxZq4LyZvWeRJ6quIyHk1caA==
|
||||||
|
dependencies:
|
||||||
|
bluebird "^3.5.0"
|
||||||
|
buffer "^5.0.5"
|
||||||
|
eth-lib "^0.1.26"
|
||||||
|
fs-extra "^4.0.2"
|
||||||
|
got "^7.1.0"
|
||||||
|
mime-types "^2.1.16"
|
||||||
|
mkdirp-promise "^5.0.1"
|
||||||
|
mock-fs "^4.1.0"
|
||||||
|
setimmediate "^1.0.5"
|
||||||
|
tar "^4.0.2"
|
||||||
|
xhr-request "^1.0.1"
|
||||||
|
|
||||||
sweetalert@^2.1.0:
|
sweetalert@^2.1.0:
|
||||||
version "2.1.2"
|
version "2.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/sweetalert/-/sweetalert-2.1.2.tgz#010baaa80d0dbdc86f96bfcaa96b490728594b79"
|
resolved "https://registry.yarnpkg.com/sweetalert/-/sweetalert-2.1.2.tgz#010baaa80d0dbdc86f96bfcaa96b490728594b79"
|
||||||
@ -18987,6 +19266,11 @@ tiny-warning@^1.0.0:
|
|||||||
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.2.tgz#1dfae771ee1a04396bdfde27a3adcebc6b648b28"
|
resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.2.tgz#1dfae771ee1a04396bdfde27a3adcebc6b648b28"
|
||||||
integrity sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==
|
integrity sha512-rru86D9CpQRLvsFG5XFdy0KdLAvjdQDyZCsRcuu60WtzFylDM3eAWSxEVz5kzL2Gp544XiUvPbVKtOA/txLi9Q==
|
||||||
|
|
||||||
|
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.30:
|
tmp@0.0.30:
|
||||||
version "0.0.30"
|
version "0.0.30"
|
||||||
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed"
|
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed"
|
||||||
@ -19774,6 +20058,11 @@ value-equal@^0.4.0:
|
|||||||
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7"
|
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7"
|
||||||
integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==
|
integrity sha512-x+cYdNnaA3CxvMaTX0INdTCN8m8aF2uY9BvEqmxuYp8bL09cs/kWVQPVGcA35fMktdOsP69IgU7wFj/61dJHEw==
|
||||||
|
|
||||||
|
value-equal@^1.0.1:
|
||||||
|
version "1.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-1.0.1.tgz#1e0b794c734c5c0cade179c437d356d931a34d6c"
|
||||||
|
integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==
|
||||||
|
|
||||||
value-or-function@^3.0.0:
|
value-or-function@^3.0.0:
|
||||||
version "3.0.0"
|
version "3.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
|
resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813"
|
||||||
@ -19985,6 +20274,16 @@ web3-bzz@1.2.4:
|
|||||||
swarm-js "0.1.39"
|
swarm-js "0.1.39"
|
||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
|
|
||||||
|
web3-bzz@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-bzz/-/web3-bzz-1.2.7.tgz#aa0f3d162f0777a5f35367dc5b70012dd1e129d0"
|
||||||
|
integrity sha512-iTIWBR+Z+Bn09WprtKm46LmyNOasg2lUn++AjXkBTB8UNxlUybxtza84yl2ETTZUs0zuFzdSSAEgbjhygG+9oA==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "^10.12.18"
|
||||||
|
got "9.6.0"
|
||||||
|
swarm-js "^0.1.40"
|
||||||
|
underscore "1.9.1"
|
||||||
|
|
||||||
web3-core-helpers@1.0.0-beta.30:
|
web3-core-helpers@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.30.tgz#a000cee3f0a09eea13d74b5730335d4635fe1f2f"
|
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.0.0-beta.30.tgz#a000cee3f0a09eea13d74b5730335d4635fe1f2f"
|
||||||
@ -20012,6 +20311,15 @@ web3-core-helpers@1.2.4:
|
|||||||
web3-eth-iban "1.2.4"
|
web3-eth-iban "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-core-helpers@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-core-helpers/-/web3-core-helpers-1.2.7.tgz#522f859775ea0d15e7e40359c46d4efc5da92aee"
|
||||||
|
integrity sha512-bdU++9QATGeCetVrMp8pV97aQtVkN5oLBf/TWu/qumC6jK/YqrvLlBJLdwbz0QveU8zOSap6GCvJbqKvmmbV2A==
|
||||||
|
dependencies:
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-eth-iban "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-core-method@1.0.0-beta.30:
|
web3-core-method@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.30.tgz#8dd6ff789e8d1563b8786d13a78c7facefae471c"
|
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.0.0-beta.30.tgz#8dd6ff789e8d1563b8786d13a78c7facefae471c"
|
||||||
@ -20045,6 +20353,17 @@ web3-core-method@1.2.4:
|
|||||||
web3-core-subscriptions "1.2.4"
|
web3-core-subscriptions "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-core-method@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-core-method/-/web3-core-method-1.2.7.tgz#73fd80d2bf0765ff6efc454db49ac83d1769a45e"
|
||||||
|
integrity sha512-e1TI0QUnByDMbQ8QHwnjxfjKw0LIgVRY4TYrlPijET9ebqUJU1HCayn/BHIMpV6LKyR1fQj9EldWyT64wZQXkg==
|
||||||
|
dependencies:
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-promievent "1.2.7"
|
||||||
|
web3-core-subscriptions "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-core-promievent@1.0.0-beta.30:
|
web3-core-promievent@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.30.tgz#6205192bfb097441132226a5939ec5aed3a8a291"
|
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.0.0-beta.30.tgz#6205192bfb097441132226a5939ec5aed3a8a291"
|
||||||
@ -20069,6 +20388,13 @@ web3-core-promievent@1.2.4:
|
|||||||
any-promise "1.3.0"
|
any-promise "1.3.0"
|
||||||
eventemitter3 "3.1.2"
|
eventemitter3 "3.1.2"
|
||||||
|
|
||||||
|
web3-core-promievent@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-core-promievent/-/web3-core-promievent-1.2.7.tgz#fc7fa489f4cf76a040800f3dfd4b45c51bd3a39f"
|
||||||
|
integrity sha512-jNmsM/czCeMGQqKKwM9/HZVTJVIF96hdMVNN/V9TGvp+EEE7vDhB4pUocDnc/QF9Z/5QFBCVmvNWttlRgZmU0A==
|
||||||
|
dependencies:
|
||||||
|
eventemitter3 "3.1.2"
|
||||||
|
|
||||||
web3-core-requestmanager@1.0.0-beta.30:
|
web3-core-requestmanager@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.30.tgz#6ee56fb8a6cb85fd01b3080854f50d64e52240c6"
|
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.0.0-beta.30.tgz#6ee56fb8a6cb85fd01b3080854f50d64e52240c6"
|
||||||
@ -20102,6 +20428,17 @@ web3-core-requestmanager@1.2.4:
|
|||||||
web3-providers-ipc "1.2.4"
|
web3-providers-ipc "1.2.4"
|
||||||
web3-providers-ws "1.2.4"
|
web3-providers-ws "1.2.4"
|
||||||
|
|
||||||
|
web3-core-requestmanager@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-core-requestmanager/-/web3-core-requestmanager-1.2.7.tgz#9da0efce898ead7004d4ac50f748f5131cfe4d79"
|
||||||
|
integrity sha512-HJb/txjHixu1dxIebiZQKBoJCaNu4gsh7mq/uj6Z/w6tIHbybL90s/7ADyMED353yyJ2tDWtYJqeMVAR+KtdaA==
|
||||||
|
dependencies:
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-providers-http "1.2.7"
|
||||||
|
web3-providers-ipc "1.2.7"
|
||||||
|
web3-providers-ws "1.2.7"
|
||||||
|
|
||||||
web3-core-subscriptions@1.0.0-beta.30:
|
web3-core-subscriptions@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.30.tgz#31652c75356c3f67e5a19cd14b8d314bad4e2127"
|
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.0.0-beta.30.tgz#31652c75356c3f67e5a19cd14b8d314bad4e2127"
|
||||||
@ -20129,6 +20466,15 @@ web3-core-subscriptions@1.2.4:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-core-helpers "1.2.4"
|
web3-core-helpers "1.2.4"
|
||||||
|
|
||||||
|
web3-core-subscriptions@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-core-subscriptions/-/web3-core-subscriptions-1.2.7.tgz#30c64aede03182832883b17c77e21cbb0933c86e"
|
||||||
|
integrity sha512-W/CzQYOUawdMDvkgA/fmLsnG5aMpbjrs78LZMbc0MFXLpH3ofqAgO2by4QZrrTShUUTeWS0ZuEkFFL/iFrSObw==
|
||||||
|
dependencies:
|
||||||
|
eventemitter3 "3.1.2"
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
|
||||||
web3-core@1.0.0-beta.30:
|
web3-core@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.30.tgz#f75f4d3b85be74c7674637921c3e013bc5d27679"
|
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.0.0-beta.30.tgz#f75f4d3b85be74c7674637921c3e013bc5d27679"
|
||||||
@ -20162,6 +20508,19 @@ web3-core@1.2.4:
|
|||||||
web3-core-requestmanager "1.2.4"
|
web3-core-requestmanager "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-core@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-core/-/web3-core-1.2.7.tgz#9248b04331e458c76263d758c51b0cc612953900"
|
||||||
|
integrity sha512-QA0MTae0gXcr3KHe3cQ4x56+Wh43ZKWfMwg1gfCc3NNxPRM1jJ8qudzyptCAUcxUGXWpDG8syLIn1APDz5J8BQ==
|
||||||
|
dependencies:
|
||||||
|
"@types/bn.js" "^4.11.4"
|
||||||
|
"@types/node" "^12.6.1"
|
||||||
|
bignumber.js "^9.0.0"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-core-requestmanager "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth-abi@1.0.0-beta.30:
|
web3-eth-abi@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.30.tgz#6ea52c999a8505b47c2f88ba61d2a680a1066409"
|
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.0.0-beta.30.tgz#6ea52c999a8505b47c2f88ba61d2a680a1066409"
|
||||||
@ -20191,6 +20550,15 @@ web3-eth-abi@1.2.4:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth-abi@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.7.tgz#6f3471b578649fddd844a14d397a3dd430fc44a5"
|
||||||
|
integrity sha512-4FnlT1q+D0XBkxSMXlIb/eG337uQeMaUdtVQ4PZ3XzxqpcoDuMgXm4o+3NRxnWmr4AMm6QKjM+hcC7c0mBKcyg==
|
||||||
|
dependencies:
|
||||||
|
ethers "4.0.0-beta.3"
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth-abi@^1.0.0-beta.24:
|
web3-eth-abi@^1.0.0-beta.24:
|
||||||
version "1.2.6"
|
version "1.2.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25"
|
resolved "https://registry.yarnpkg.com/web3-eth-abi/-/web3-eth-abi-1.2.6.tgz#b495383cc5c0d8e2857b26e7fe25606685983b25"
|
||||||
@ -20250,6 +20618,23 @@ web3-eth-accounts@1.2.4:
|
|||||||
web3-core-method "1.2.4"
|
web3-core-method "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth-accounts@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth-accounts/-/web3-eth-accounts-1.2.7.tgz#087f55d04a01b815b93151aac2fc1677436b9c59"
|
||||||
|
integrity sha512-AE7QWi/iIQIjXwlAPtlMabm/OPFF0a1PhxT1EiTckpYNP8fYs6jW7lYxEtJPPJIKqfMjoi1xkEqTVR1YZQ88lg==
|
||||||
|
dependencies:
|
||||||
|
"@web3-js/scrypt-shim" "^0.1.0"
|
||||||
|
crypto-browserify "3.12.0"
|
||||||
|
eth-lib "^0.2.8"
|
||||||
|
ethereumjs-common "^1.3.2"
|
||||||
|
ethereumjs-tx "^2.1.1"
|
||||||
|
underscore "1.9.1"
|
||||||
|
uuid "3.3.2"
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth-contract@1.0.0-beta.30:
|
web3-eth-contract@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.30.tgz#d7eba2385084dff3c75aac48235af2c8d2d6a258"
|
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.0.0-beta.30.tgz#d7eba2385084dff3c75aac48235af2c8d2d6a258"
|
||||||
@ -20293,6 +20678,21 @@ web3-eth-contract@1.2.4:
|
|||||||
web3-eth-abi "1.2.4"
|
web3-eth-abi "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth-contract@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth-contract/-/web3-eth-contract-1.2.7.tgz#13d7f6003d6221f9a5fd61c2d3b5d039477c9674"
|
||||||
|
integrity sha512-uW23Y0iL7XroRNbf9fWZ1N6OYhEYTJX8gTuYASuRnpYrISN5QGiQML6pq/NCzqypR1bl5E0fuINZQSK/xefIVw==
|
||||||
|
dependencies:
|
||||||
|
"@types/bn.js" "^4.11.4"
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-core-promievent "1.2.7"
|
||||||
|
web3-core-subscriptions "1.2.7"
|
||||||
|
web3-eth-abi "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth-ens@1.2.4:
|
web3-eth-ens@1.2.4:
|
||||||
version "1.2.4"
|
version "1.2.4"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e"
|
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.4.tgz#b95b3aa99fb1e35c802b9e02a44c3046a3fa065e"
|
||||||
@ -20307,6 +20707,20 @@ web3-eth-ens@1.2.4:
|
|||||||
web3-eth-contract "1.2.4"
|
web3-eth-contract "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth-ens@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth-ens/-/web3-eth-ens-1.2.7.tgz#0bfa7d4b6c7753abbb31a2eb01a364b538f4c860"
|
||||||
|
integrity sha512-SPRnvUNWQ0CnnTDBteGIJkvFWEizJcAHlVsrFLICwcwFZu+appjX1UOaoGu2h3GXWtc/XZlu7B451Gi+Os2cTg==
|
||||||
|
dependencies:
|
||||||
|
eth-ens-namehash "2.0.8"
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-promievent "1.2.7"
|
||||||
|
web3-eth-abi "1.2.7"
|
||||||
|
web3-eth-contract "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth-iban@1.0.0-beta.30:
|
web3-eth-iban@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.30.tgz#3b080a5c4da1fa37477b17e4c900781b92150645"
|
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.0.0-beta.30.tgz#3b080a5c4da1fa37477b17e4c900781b92150645"
|
||||||
@ -20331,6 +20745,14 @@ web3-eth-iban@1.2.4:
|
|||||||
bn.js "4.11.8"
|
bn.js "4.11.8"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth-iban@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth-iban/-/web3-eth-iban-1.2.7.tgz#832809c28586be3c667a713b77a2bcba11b7970f"
|
||||||
|
integrity sha512-2NrClz1PoQ3nSJBd+91ylCOVga9qbTxjRofq/oSCoHVAEvz3WZyttx9k5DC+0rWqwJF1h69ufFvdHAAlmN/4lg==
|
||||||
|
dependencies:
|
||||||
|
bn.js "4.11.8"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth-personal@1.0.0-beta.30:
|
web3-eth-personal@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.30.tgz#8bd4ef40b3b5f841dd3a8b97873d9dc791caf748"
|
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.0.0-beta.30.tgz#8bd4ef40b3b5f841dd3a8b97873d9dc791caf748"
|
||||||
@ -20365,6 +20787,18 @@ web3-eth-personal@1.2.4:
|
|||||||
web3-net "1.2.4"
|
web3-net "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth-personal@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth-personal/-/web3-eth-personal-1.2.7.tgz#322cc2b14c37737b21772a53e4185686a04bf9be"
|
||||||
|
integrity sha512-2OAa1Spz0uB29dwCM8+1y0So7E47A4gKznjBEwXIYEcUIsvwT5X7ofFhC2XxyRpqlIWZSQAxRSSJFyupRRXzyw==
|
||||||
|
dependencies:
|
||||||
|
"@types/node" "^12.6.1"
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-net "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-eth@1.0.0-beta.30:
|
web3-eth@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.30.tgz#029b15e14cb608b9cfe02603b504d651870f0501"
|
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.0.0-beta.30.tgz#029b15e14cb608b9cfe02603b504d651870f0501"
|
||||||
@ -20420,6 +20854,25 @@ web3-eth@1.2.4:
|
|||||||
web3-net "1.2.4"
|
web3-net "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-eth@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-eth/-/web3-eth-1.2.7.tgz#9427daefd3641200679c2946f77fc184dbfb5b4c"
|
||||||
|
integrity sha512-ljLd0oB4IjWkzFGVan4HkYhJXhSXgn9iaSaxdJixKGntZPgWMJfxeA+uLwTrlxrWzhvy4f+39WnT7wCh5e9TGg==
|
||||||
|
dependencies:
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-core-subscriptions "1.2.7"
|
||||||
|
web3-eth-abi "1.2.7"
|
||||||
|
web3-eth-accounts "1.2.7"
|
||||||
|
web3-eth-contract "1.2.7"
|
||||||
|
web3-eth-ens "1.2.7"
|
||||||
|
web3-eth-iban "1.2.7"
|
||||||
|
web3-eth-personal "1.2.7"
|
||||||
|
web3-net "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-net@1.0.0-beta.30:
|
web3-net@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.30.tgz#0a352ede296e6d4b7f88b67aa474e49703de73bf"
|
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.0.0-beta.30.tgz#0a352ede296e6d4b7f88b67aa474e49703de73bf"
|
||||||
@ -20447,6 +20900,15 @@ web3-net@1.2.4:
|
|||||||
web3-core-method "1.2.4"
|
web3-core-method "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3-net@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-net/-/web3-net-1.2.7.tgz#c355621a8769c9c1a967c801e7db90c92a0e3808"
|
||||||
|
integrity sha512-j9qeZrS1FNyCeA0BfdLojkxOZQz3FKa1DJI+Dw9fEVhZS68vLOFANu2RB96gR9BoPHo5+k5D3NsKOoxt1gw3Gg==
|
||||||
|
dependencies:
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
web3-provider-engine@14.0.6:
|
web3-provider-engine@14.0.6:
|
||||||
version "14.0.6"
|
version "14.0.6"
|
||||||
resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0"
|
resolved "https://registry.yarnpkg.com/web3-provider-engine/-/web3-provider-engine-14.0.6.tgz#cbdd66fe20c0136a3a495cbe40d18b6c4160d5f0"
|
||||||
@ -20524,6 +20986,14 @@ web3-providers-http@1.2.4:
|
|||||||
web3-core-helpers "1.2.4"
|
web3-core-helpers "1.2.4"
|
||||||
xhr2-cookies "1.1.0"
|
xhr2-cookies "1.1.0"
|
||||||
|
|
||||||
|
web3-providers-http@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-providers-http/-/web3-providers-http-1.2.7.tgz#31eb15390c103169b3d7d31bdb1ccae9e3f1629d"
|
||||||
|
integrity sha512-vazGx5onuH/zogrwkUaLFJwFcJ6CckP65VFSHoiV+GTQdkOqgoDIha7StKkslvDz4XJ2FuY/zOZHbtuOYeltXQ==
|
||||||
|
dependencies:
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
xhr2-cookies "1.1.0"
|
||||||
|
|
||||||
web3-providers-ipc@1.0.0-beta.30:
|
web3-providers-ipc@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.30.tgz#ee2d8d18a3f120b777044a56e67e0aee20854587"
|
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.0.0-beta.30.tgz#ee2d8d18a3f120b777044a56e67e0aee20854587"
|
||||||
@ -20551,6 +21021,15 @@ web3-providers-ipc@1.2.4:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-core-helpers "1.2.4"
|
web3-core-helpers "1.2.4"
|
||||||
|
|
||||||
|
web3-providers-ipc@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-providers-ipc/-/web3-providers-ipc-1.2.7.tgz#4e6716e8723d431df3d6bfa1acd2f7c04e7071ad"
|
||||||
|
integrity sha512-/zc0y724H2zbkV4UbGGMhsEiLfafjagIzfrsWZnyTZUlSB0OGRmmFm2EkLJAgtXrLiodaHHyXKM0vB8S24bxdA==
|
||||||
|
dependencies:
|
||||||
|
oboe "2.1.4"
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
|
||||||
web3-providers-ws@1.0.0-beta.30:
|
web3-providers-ws@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.30.tgz#9ae69a9ead8a8761f86379fa347b6db5ae44b12d"
|
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.0.0-beta.30.tgz#9ae69a9ead8a8761f86379fa347b6db5ae44b12d"
|
||||||
@ -20578,6 +21057,16 @@ web3-providers-ws@1.2.4:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
web3-core-helpers "1.2.4"
|
web3-core-helpers "1.2.4"
|
||||||
|
|
||||||
|
web3-providers-ws@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-providers-ws/-/web3-providers-ws-1.2.7.tgz#95b1cc5dc25e9b9d6630d6754f9354313b62f532"
|
||||||
|
integrity sha512-b5XzqDpRkNVe6MFs5K6iqOEyjQikHtg3KuU2/ClCDV37hm0WN4xCRVMC0LwegulbDXZej3zT9+1CYzGaGFREzA==
|
||||||
|
dependencies:
|
||||||
|
"@web3-js/websocket" "^1.0.29"
|
||||||
|
eventemitter3 "^4.0.0"
|
||||||
|
underscore "1.9.1"
|
||||||
|
web3-core-helpers "1.2.7"
|
||||||
|
|
||||||
web3-shh@1.0.0-beta.30:
|
web3-shh@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.30.tgz#2bfe3220d958ff4ca592017790852bc57b7b0ca7"
|
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.0.0-beta.30.tgz#2bfe3220d958ff4ca592017790852bc57b7b0ca7"
|
||||||
@ -20608,6 +21097,16 @@ web3-shh@1.2.4:
|
|||||||
web3-core-subscriptions "1.2.4"
|
web3-core-subscriptions "1.2.4"
|
||||||
web3-net "1.2.4"
|
web3-net "1.2.4"
|
||||||
|
|
||||||
|
web3-shh@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-shh/-/web3-shh-1.2.7.tgz#5382c7bc2f39539eb2841c4576d23ade25720461"
|
||||||
|
integrity sha512-f6PAgcpG0ZAo98KqCmeHoDEx5qzm3d5plet18DkT4U6WIeYowKdec8vZaLPRR7c2XreXFJ2gQf45CB7oqR7U/w==
|
||||||
|
dependencies:
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-core-method "1.2.7"
|
||||||
|
web3-core-subscriptions "1.2.7"
|
||||||
|
web3-net "1.2.7"
|
||||||
|
|
||||||
web3-utils@1.0.0-beta.30:
|
web3-utils@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.30.tgz#eae408cc8d6d6fecc8d5097cfead51773f231ff9"
|
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.0.0-beta.30.tgz#eae408cc8d6d6fecc8d5097cfead51773f231ff9"
|
||||||
@ -20662,6 +21161,20 @@ web3-utils@1.2.6:
|
|||||||
underscore "1.9.1"
|
underscore "1.9.1"
|
||||||
utf8 "3.0.0"
|
utf8 "3.0.0"
|
||||||
|
|
||||||
|
web3-utils@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3-utils/-/web3-utils-1.2.7.tgz#b68e232917e4376f81cf38ef79878e5903d18e93"
|
||||||
|
integrity sha512-FBh/CPJND+eiPeUF9KVbTyTZtXNWxPWtByBaWS6e2x4ACazPX711EeNaZaChIOGSLGe6se2n7kg6wnawe/MjuQ==
|
||||||
|
dependencies:
|
||||||
|
bn.js "4.11.8"
|
||||||
|
eth-lib "0.2.7"
|
||||||
|
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@1.0.0-beta.30:
|
web3@1.0.0-beta.30:
|
||||||
version "1.0.0-beta.30"
|
version "1.0.0-beta.30"
|
||||||
resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.30.tgz#ad3e761845aeb2f40a7760cde75793773a431ecd"
|
resolved "https://registry.yarnpkg.com/web3/-/web3-1.0.0-beta.30.tgz#ad3e761845aeb2f40a7760cde75793773a431ecd"
|
||||||
@ -20702,6 +21215,19 @@ web3@1.2.4:
|
|||||||
web3-shh "1.2.4"
|
web3-shh "1.2.4"
|
||||||
web3-utils "1.2.4"
|
web3-utils "1.2.4"
|
||||||
|
|
||||||
|
web3@1.2.7:
|
||||||
|
version "1.2.7"
|
||||||
|
resolved "https://registry.yarnpkg.com/web3/-/web3-1.2.7.tgz#fcb83571036c1c6f475bc984785982a444e8d78e"
|
||||||
|
integrity sha512-jAAJHMfUlTps+jH2li1ckDFEpPrEEriU/ubegSTGRl3KRdNhEqT93+3kd7FHJTn3NgjcyURo2+f7Da1YcZL8Mw==
|
||||||
|
dependencies:
|
||||||
|
web3-bzz "1.2.7"
|
||||||
|
web3-core "1.2.7"
|
||||||
|
web3-eth "1.2.7"
|
||||||
|
web3-eth-personal "1.2.7"
|
||||||
|
web3-net "1.2.7"
|
||||||
|
web3-shh "1.2.7"
|
||||||
|
web3-utils "1.2.7"
|
||||||
|
|
||||||
webidl-conversions@^4.0.2:
|
webidl-conversions@^4.0.2:
|
||||||
version "4.0.2"
|
version "4.0.2"
|
||||||
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
|
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
|
||||||
|
Loading…
Reference in New Issue
Block a user