From 6b3dba5af52297a70c5773574134a3d74ffd5869 Mon Sep 17 00:00:00 2001 From: KimiWu Date: Sun, 16 Oct 2022 11:21:34 +0800 Subject: [PATCH 1/9] fix: apply new zkopru client --- src/components/AddTokenPopup.vue | 6 +++--- src/components/ConfirmDepositPopup.vue | 9 +++++---- src/components/ConfirmWithdrawPopup.vue | 2 +- src/stores/address-book.js | 6 +++--- src/stores/eth-account.js | 8 ++++---- 5 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/components/AddTokenPopup.vue b/src/components/AddTokenPopup.vue index 41447ea..b7f69ea 100644 --- a/src/components/AddTokenPopup.vue +++ b/src/components/AddTokenPopup.vue @@ -98,9 +98,9 @@ export default class AddTokenPopup extends Vue { try { const tokenContract = await this.$store.state.zkopru.client.getERC20Contract(this.tokenAddress) const [ decimals, symbol, name ] = await Promise.all([ - tokenContract.methods.decimals().call(), - tokenContract.methods.symbol().call(), - tokenContract.methods.name().call(), + tokenContract.decimals(), + tokenContract.symbol(), + tokenContract.name(), ]) this.tokenInfo = { decimals, symbol, name } if (this.$store.state.zkopru.tokensByAddress[this.tokenAddress]) { diff --git a/src/components/ConfirmDepositPopup.vue b/src/components/ConfirmDepositPopup.vue index 4000bd4..d13af46 100644 --- a/src/components/ConfirmDepositPopup.vue +++ b/src/components/ConfirmDepositPopup.vue @@ -140,7 +140,7 @@ export default class ConfirmDepositPopup extends Vue { this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) const amountDecimals = `${(+this.tokenDepositAmount)*(10**(+token.decimals))}` - const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( + const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20( toWei(this.etherDepositAmount), token.address, amountDecimals, @@ -150,7 +150,7 @@ export default class ConfirmDepositPopup extends Vue { const amount = new BN(this.tokenDepositAmount) const existingAllowance = await this.$store.dispatch('loadTokenAllowance', token.address) if (new BN(existingAllowance).lt(amount)) { - const transferData = tokenContract.methods.approve(to, amountDecimals).encodeABI() + const transferData = tokenContract.interface.functions.encode.approve(to, amountDecimals) try { const txHash = await window.ethereum.request({ method: 'eth_sendTransaction', @@ -182,8 +182,9 @@ export default class ConfirmDepositPopup extends Vue { this.loadingTitle = customMessage || 'Waiting for Metamask' this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' if (!this.activeToken) { + console.log(this.$store.state.zkopru.wallet.wallet.account.ethAddress) try { - const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositEtherTx( + const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositEther( toWei(this.etherDepositAmount), toWei(this.feeAmount), ) @@ -208,7 +209,7 @@ export default class ConfirmDepositPopup extends Vue { const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) const amountDecimals = `${(+this.tokenDepositAmount)*(10**(+token.decimals))}` try { - const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( + const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20( toWei(this.etherDepositAmount), token.address, amountDecimals, diff --git a/src/components/ConfirmWithdrawPopup.vue b/src/components/ConfirmWithdrawPopup.vue index 152605b..7019fb7 100644 --- a/src/components/ConfirmWithdrawPopup.vue +++ b/src/components/ConfirmWithdrawPopup.vue @@ -139,7 +139,7 @@ export default class ConfirmWithdrawPopup extends Vue { return symbol.toUpperCase() === this.activeAsset }) const tokenContract = await this.$store.state.zkopru.client.getERC20Contract(address) - decimals = await tokenContract.methods.decimals().call() + decimals = await tokenContract.decimals() this.$store.state.zkopru.tokensByAddres } let instantWithdrawFeeNoDecimal = this.instantWithdrawFee diff --git a/src/stores/address-book.js b/src/stores/address-book.js index 97e223a..3489ecd 100644 --- a/src/stores/address-book.js +++ b/src/stores/address-book.js @@ -7,11 +7,11 @@ export default { registerAddress: async ({ state, rootState }) => { const { web3 } = rootState.zkopru.client.node.layer1 const addressBookContract = new web3.eth.Contract(ABI, address) - const data = await addressBookContract.methods.registerAddress( + const data = await addressBookContract.interface.functions.encode.registerAddress( rootState.zkopru.client.node.layer1.address, rootState.zkopru.wallet.wallet.account.zkAddress.toBuffer(), false, - ).encodeABI() + ) await window.ethereum.request({ method: 'eth_sendTransaction', params: [{ @@ -52,7 +52,7 @@ export default { const { web3 } = rootState.zkopru.client.node.layer1 const addressBookContract = new web3.eth.Contract(ABI, address) try { - const resolvedAddr = await addressBookContract.methods.resolveENS(hash).call() + const resolvedAddr = await addressBookContract.resolveENS(hash) if (!resolvedAddr) return return { ethAddress: resolvedAddr, diff --git a/src/stores/eth-account.js b/src/stores/eth-account.js index 073625b..5cd713a 100644 --- a/src/stores/eth-account.js +++ b/src/stores/eth-account.js @@ -60,8 +60,8 @@ export default { const tokenContract = await rootState.zkopru.client.getERC20Contract(address) const myAddress = state.accounts[0] const [balance, decimals] = await Promise.all([ - tokenContract.methods.balanceOf(myAddress).call(), - tokenContract.methods.decimals().call(), + tokenContract.balanceOf(myAddress), + tokenContract.decimals(), ]) const balanceDecimal = +balance.toString() / (10 ** +decimals.toString()) state.tokenBalances = { ...state.tokenBalances, [symbol]: balanceDecimal } @@ -70,10 +70,10 @@ export default { loadTokenAllowance: async ({ state, rootState }, address) => { const tokenContract = await rootState.zkopru.client.getERC20Contract(address) const myAddress = state.accounts[0] - const allowance = await tokenContract.methods.allowance( + const allowance = await tokenContract.allowance( myAddress, rootState.zkopru.client.node.layer1.address - ).call() + ) return allowance } } From 25662c6dd1574259b5bdc1e95141281dcda8bbb6 Mon Sep 17 00:00:00 2001 From: KimiWu Date: Mon, 24 Oct 2022 16:58:45 +0800 Subject: [PATCH 2/9] fix: replace web3 with ethers --- package-lock.json | 15 +++++++-------- package.json | 1 + src/Deposit.vue | 5 +++-- src/Withdraw.vue | 5 +++-- src/components/ConfirmDepositPopup.vue | 11 +++++------ src/stores/address-book.js | 13 +++++-------- src/stores/test-token.js | 5 ++--- 7 files changed, 26 insertions(+), 29 deletions(-) diff --git a/package-lock.json b/package-lock.json index c14d086..f9f7b58 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "license": "MIT", "dependencies": { "axios": "^0.20.0", + "bignumber.js": "9.1.0", "compression": "^1.7.4", "dayjs": "^1.10.6", "especial": "0.0.4", @@ -3502,10 +3503,9 @@ } }, "node_modules/bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true, + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", "engines": { "node": "*" } @@ -20780,10 +20780,9 @@ "dev": true }, "bignumber.js": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", - "integrity": "sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA==", - "dev": true + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" }, "binary-extensions": { "version": "2.2.0", diff --git a/package.json b/package.json index d382f4b..fce8354 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "license": "MIT", "dependencies": { "axios": "^0.20.0", + "bignumber.js": "9.1.0", "compression": "^1.7.4", "dayjs": "^1.10.6", "especial": "0.0.4", diff --git a/src/Deposit.vue b/src/Deposit.vue index e56311a..17c3ef4 100644 --- a/src/Deposit.vue +++ b/src/Deposit.vue @@ -171,14 +171,15 @@ export default class Deposit extends Vue { async setFeeAmount(clickedButton) { const multiplier = clickedButton === 'Fast' ? new BN('200000') : new BN('100000') this.feeAmountState = 3 + let feePromise try { - const feePromise = this.$store.dispatch('loadCurrentWeiPerByte') + feePromise = this.$store.dispatch('loadCurrentWeiPerByte') this.activeFeePromise = feePromise const weiPerByte = await feePromise if (this.activeFeePromise !== feePromise) return this.activeFeePromise = undefined // Assume 2000 bytes for a simple deposit tx in a block - const feeWeiAmount = new BN(weiPerByte).mul(multiplier) + const feeWeiAmount = new BN(weiPerByte.toString()).mul(multiplier) this.feeAmount = '' Vue.nextTick(() => { if (this.activeFeePromise !== undefined) return diff --git a/src/Withdraw.vue b/src/Withdraw.vue index dcdbf7b..7ca1985 100644 --- a/src/Withdraw.vue +++ b/src/Withdraw.vue @@ -111,6 +111,7 @@ import ConfirmWithdrawPopup from './components/ConfirmWithdrawPopup' import InfoText from './components/InfoText' import tooltips from './tooltips' import decimalCount from './utils/decimal-count' +import BigNumber from 'bignumber.js' @Component({ name: 'Withdraw', @@ -217,10 +218,10 @@ export default class Withdraw extends Vue { }) const withdrawAmountDecimal = +this.withdrawAmount * (10 ** +decimals) const instantWithdrawFeeDecimal = +(this.instantWithdrawFee || 0) * (10 ** +decimals) - const decimalAmount = new BN(withdrawAmountDecimal).add(new BN(instantWithdrawFeeDecimal)) + const decimalAmount = new BigNumber(withdrawAmountDecimal).plus(new BigNumber(instantWithdrawFeeDecimal)) const tx = await this.$store.state.zkopru.wallet.generateTokenWithdrawal( this.$store.state.account.accounts[0], - decimalAmount, + decimalAmount.toString(), address, (+this.feeAmount * (10 ** 9)).toString(), '0', diff --git a/src/components/ConfirmDepositPopup.vue b/src/components/ConfirmDepositPopup.vue index d13af46..889f6dc 100644 --- a/src/components/ConfirmDepositPopup.vue +++ b/src/components/ConfirmDepositPopup.vue @@ -140,7 +140,7 @@ export default class ConfirmDepositPopup extends Vue { this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) const amountDecimals = `${(+this.tokenDepositAmount)*(10**(+token.decimals))}` - const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20( + const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( toWei(this.etherDepositAmount), token.address, amountDecimals, @@ -149,8 +149,8 @@ export default class ConfirmDepositPopup extends Vue { const tokenContract = await this.$store.state.zkopru.client.getERC20Contract(token.address) const amount = new BN(this.tokenDepositAmount) const existingAllowance = await this.$store.dispatch('loadTokenAllowance', token.address) - if (new BN(existingAllowance).lt(amount)) { - const transferData = tokenContract.interface.functions.encode.approve(to, amountDecimals) + if ((new BN(existingAllowance.toString())).lt(amount)) { + const transferData = tokenContract.interface.encodeFunctionData('approve', [to, amountDecimals]) try { const txHash = await window.ethereum.request({ method: 'eth_sendTransaction', @@ -182,9 +182,8 @@ export default class ConfirmDepositPopup extends Vue { this.loadingTitle = customMessage || 'Waiting for Metamask' this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' if (!this.activeToken) { - console.log(this.$store.state.zkopru.wallet.wallet.account.ethAddress) try { - const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositEther( + const { to, data, value, onComplete } = await this.$store.state.zkopru.wallet.wallet.depositEtherTx( toWei(this.etherDepositAmount), toWei(this.feeAmount), ) @@ -209,7 +208,7 @@ export default class ConfirmDepositPopup extends Vue { const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) const amountDecimals = `${(+this.tokenDepositAmount)*(10**(+token.decimals))}` try { - const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20( + const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( toWei(this.etherDepositAmount), token.address, amountDecimals, diff --git a/src/stores/address-book.js b/src/stores/address-book.js index 3489ecd..e150827 100644 --- a/src/stores/address-book.js +++ b/src/stores/address-book.js @@ -5,13 +5,12 @@ export default { state: {}, actions: { registerAddress: async ({ state, rootState }) => { - const { web3 } = rootState.zkopru.client.node.layer1 - const addressBookContract = new web3.eth.Contract(ABI, address) - const data = await addressBookContract.interface.functions.encode.registerAddress( + const addressBookContract = new ethers.Contract(ABI, address, rootState.zkopru.client.node.layer1.provider) + const data = await addressBookContract.interface.encodeFunctionData('registerAddress',[ rootState.zkopru.client.node.layer1.address, rootState.zkopru.wallet.wallet.account.zkAddress.toBuffer(), false, - ) + ]) await window.ethereum.request({ method: 'eth_sendTransaction', params: [{ @@ -23,8 +22,7 @@ export default { }) }, resolveAddress: async ({ state, rootState }, _address) => { - const { web3 } = rootState.zkopru.client.node.layer1 - const addressBookContract = new web3.eth.Contract(ABI, address) + const addressBookContract = new ethers.Contract(ABI, address, rootState.zkopru.client.node.layer1.provider) const events = await addressBookContract.getPastEvents('L2AddrChanged', { filter: { ownerAddr: _address, @@ -49,8 +47,7 @@ export default { }, resolveENS: async ({ state, rootState, dispatch }, ensAddress) => { const hash = namehash.hash(ensAddress) - const { web3 } = rootState.zkopru.client.node.layer1 - const addressBookContract = new web3.eth.Contract(ABI, address) + const addressBookContract = new ethers.Contract(ABI, address, rootState.zkopru.client.node.layer1.provider) try { const resolvedAddr = await addressBookContract.resolveENS(hash) if (!resolvedAddr) return diff --git a/src/stores/test-token.js b/src/stores/test-token.js index f23efdc..76eb12f 100644 --- a/src/stores/test-token.js +++ b/src/stores/test-token.js @@ -5,10 +5,9 @@ export default { }, actions: { mint: async ({ state, rootState }, amount) => { - const { web3 } = rootState.zkopru.client.node.layer1 - const tokenContract = new web3.eth.Contract(ABI, address) + const tokenContract = new ethers.Contract(ABI, address,rootState.zkopru.client.node.layer1.provider) const decimalAmount = ((+amount)*(10**decimals)) - const data = await tokenContract.methods.mint(`${decimalAmount}`).encodeABI() + const data = await tokenContract.interface.encodeFunctionData('mint',[decimalAmount]) await window.ethereum.request({ method: 'eth_sendTransaction', params: [{ From 4342d6ffa28686ced8f1ad6ad81f6ebf5023aec4 Mon Sep 17 00:00:00 2001 From: KimiWu Date: Mon, 24 Oct 2022 17:01:51 +0800 Subject: [PATCH 3/9] feat: add a network config for local hardhat node --- src/stores/zkopru.js | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/stores/zkopru.js b/src/stores/zkopru.js index 9db636c..921249b 100644 --- a/src/stores/zkopru.js +++ b/src/stores/zkopru.js @@ -1,6 +1,7 @@ import { fromWei } from '../utils/wei' import dayjs from 'dayjs' import BN from 'bn.js' +import BigNumber from "bignumber.js" const DEFAULT_NETWORKS = { '5': { @@ -38,6 +39,22 @@ const DEFAULT_NETWORKS = { rpcUrls: ['https://kovan.optimism.io'], blockExplorerUrls: ['https://kovan-optimistic.etherscan.io'] } + }, + '31337': { + NAME: 'hardhat testnet', + WEBSOCKET: 'ws://localhost:8545', + ZKOPRU_ADDRESSES: [ + '0xDb56f2e9369E0D7bD191099125a3f6C370F8ed15' + ], + METAMASK_PARAMS: { + chainId: '0x7A69', + chainName: 'hardhat', + nativeCurrency: { + name: 'hardhat ETH', + symbol: 'ETH', + decimals: 18 + }, + } } } @@ -252,6 +269,7 @@ export default { }) const { sha512_256 } = await import(/* webpackPrefetch: true */ 'js-sha512') state.walletKey = sha512_256(signedData) + console.log('rootState.account.accounts[0]', rootState.account.accounts[0]) return state.walletKey }, loadWallet: async ({ state, commit, dispatch }) => { @@ -262,6 +280,8 @@ export default { key ) const { address } = state.wallet.wallet.account.zkAddress + console.log('zkAddress', address) + console.dir(state.wallet.wallet.account.ethAccount) commit('setZkAddress', address) await dispatch('loadL2Balance') await dispatch('loadHistory') @@ -320,7 +340,7 @@ export default { const key = token ? token.symbol : 'ETH' const existing = info[key] || {} const count = existing.count ?? 0; - const total = existing.total ?? new BN('0'); + const total = existing.total ?? new BigNumber(0); const largestNotes = existing.largestNotes || [] const amount = key === 'ETH' ? asset.eth : asset.erc20Amount.add(asset.nft) if (largestNotes.length < 4) { @@ -336,14 +356,14 @@ export default { } } const maxSpend = largestNotes.reduce((total, current) => { - return total.add(current) - }, new BN('0')) + return total.plus(current) + }, new BigNumber(0)) const decimals = token ? token.decimals : 18 const offsetDecimals = Math.min(3, decimals) const maxSpendDecimal = +maxSpend.div(new BN(`${10 ** (decimals - offsetDecimals)}`)).toString() / (10 ** offsetDecimals) info[key] = { count: count + 1, - total: total.add(amount), + total: total.plus(amount), largestNotes, maxSpend, maxSpendDecimal, @@ -365,9 +385,10 @@ export default { if (!state.wallet) { await dispatch('loadWallet') } - return state.wallet.calculateWeiPerByte() + return await state.wallet.calculateWeiPerByte() }, resetDB: async ({ state, dispatch }) => { + console.log('== RESET DB ==') // take the db and empty it const { default: Zkopru } = await import(/* webpackPrefetch: true */ '@zkopru/client/browser') if (!state.client) { @@ -396,8 +417,6 @@ export default { }) }, loadHistory: async ({ state, rootState }) => { - const { layer2, db } = state.client.node - const { web3 } = state.client.node.layer1 const l2Address = state.wallet.wallet.account.zkAddress.toString() const l1Address = rootState.account.accounts[0] const { history, pending } = await state.wallet.transactionsFor(l2Address, l1Address) From 63c8384e04c476b893620444c32b73891d4b7f7d Mon Sep 17 00:00:00 2001 From: KimiWu Date: Wed, 26 Oct 2022 17:56:18 +0800 Subject: [PATCH 4/9] refactor: replace BN with BigNumber --- src/Deposit.vue | 8 ++++---- src/Transfer.vue | 9 +++++---- src/Withdraw.vue | 14 ++++++-------- src/components/ConfirmDepositPopup.vue | 14 +++++++------- src/components/ConfirmTransferPopup.vue | 2 +- src/components/ConfirmWithdrawPopup.vue | 14 +++++++------- src/components/HistoryCell.vue | 4 ++-- src/stores/eth-account.js | 2 +- src/stores/zkopru.js | 7 +++---- src/utils/wei.js | 14 +++++++------- tx-generator.js | 12 ++++++------ 11 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/Deposit.vue b/src/Deposit.vue index 17c3ef4..6454ca7 100644 --- a/src/Deposit.vue +++ b/src/Deposit.vue @@ -114,7 +114,7 @@ import AssetDropdown from './components/AssetDropdown' import AssetAmountField from './components/AssetAmountField' import { toWei, fromWei } from './utils/wei' import Checkbox from './components/Checkbox' -import BN from 'bn.js' +import BigNumber from 'bignumber.js' import CenteredLeftMenu from './components/CenteredLeftMenu' import NextButton from './components/NextButton' import ConfirmDepositPopup from './components/ConfirmDepositPopup' @@ -169,7 +169,7 @@ export default class Deposit extends Vue { } async setFeeAmount(clickedButton) { - const multiplier = clickedButton === 'Fast' ? new BN('200000') : new BN('100000') + const multiplier = clickedButton === 'Fast' ? new BigNumber('200000') : new BigNumber('100000') this.feeAmountState = 3 let feePromise try { @@ -179,11 +179,11 @@ export default class Deposit extends Vue { if (this.activeFeePromise !== feePromise) return this.activeFeePromise = undefined // Assume 2000 bytes for a simple deposit tx in a block - const feeWeiAmount = new BN(weiPerByte.toString()).mul(multiplier) + const feeWeiAmount = new BigNumber(weiPerByte.toString()).multipliedBy(multiplier) this.feeAmount = '' Vue.nextTick(() => { if (this.activeFeePromise !== undefined) return - this.feeAmount = fromWei(feeWeiAmount, 9).toString() + this.feeAmount = fromWei(feeWeiAmount.toString(), 9) }) } catch (err) { if (this.activeFeePromise === feePromise) this.activeFeePromise = undefined diff --git a/src/Transfer.vue b/src/Transfer.vue index df35a21..c104f3e 100644 --- a/src/Transfer.vue +++ b/src/Transfer.vue @@ -89,7 +89,7 @@ import AddressField from './components/AddressField' import FeeField from './components/FeeField' import AssetAmountField from './components/AssetAmountField' import { toWei, fromWei } from './utils/wei' -import BN from 'bn.js' +import BigNumber from "bignumber.js" import CenteredLeftMenu from './components/CenteredLeftMenu' import NextButton from './components/NextButton' import ConfirmTransferPopup from './components/ConfirmTransferPopup' @@ -187,8 +187,8 @@ export default class Transfer extends Vue { toWei(this.transferAmount), (+this.fee * (10 ** 9)).toString() ) - this.totalFee = fromWei(tx.fee.toString(), 8) - this.totalEther = fromWei(new BN(tx.fee).add(new BN(toWei(this.transferAmount))).toString()) + this.totalFee = fromWei(tx.fee, 9) + this.totalEther = fromWei(new BigNumber(tx.fee).plus(toWei(this.transferAmount))) this.tx = tx } else { const { address, decimals } = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => { @@ -202,7 +202,7 @@ export default class Transfer extends Vue { (+this.fee * (10 ** 9)).toString() ) this.totalFee = fromWei(tx.fee.toString(), 8) - this.totalEther = fromWei(new BN(tx.fee)).toString() + this.totalEther = fromWei(new BigNumber(tx.fee.toString())) this.tx = tx } } catch (err) { @@ -214,6 +214,7 @@ export default class Transfer extends Vue { this.amountState = 2 } } + console.log(err) } } diff --git a/src/Withdraw.vue b/src/Withdraw.vue index 7ca1985..4b6323a 100644 --- a/src/Withdraw.vue +++ b/src/Withdraw.vue @@ -104,7 +104,6 @@ import AssetAmountField from './components/AssetAmountField' import Button from './components/Button' import Checkbox from './components/Checkbox' import { toWei, fromWei } from './utils/wei' -import BN from 'bn.js' import CenteredLeftMenu from './components/CenteredLeftMenu' import NextButton from './components/NextButton' import ConfirmWithdrawPopup from './components/ConfirmWithdrawPopup' @@ -207,10 +206,10 @@ export default class Withdraw extends Vue { (+this.feeAmount * (10 ** 9)).toString(), toWei(this.instantWithdrawFee || '0') ) - this.totalFee = fromWei(tx.fee.toString(), 8) - this.totalEther = fromWei(new BN(tx.fee) - .add(new BN(toWei(this.withdrawAmount))) - .toString()) + this.totalFee = new BigNumber(fromWei(tx.fee, 8)) + this.totalEther = new BigNumber(fromWei(tx.fee)) + .plus(new BigNumber(toWei(this.withdrawAmount))) + .toString() this.tx = tx } else { const { address, decimals } = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => { @@ -226,9 +225,8 @@ export default class Withdraw extends Vue { (+this.feeAmount * (10 ** 9)).toString(), '0', ) - this.totalFee = fromWei(tx.fee.toString(), 8) - this.totalEther = fromWei(new BN(tx.fee) - .toString()) + this.totalFee = fromWei(tx.fee, 8) + this.totalEther = fromWei(tx.fee) this.tx = tx } } diff --git a/src/components/ConfirmDepositPopup.vue b/src/components/ConfirmDepositPopup.vue index 889f6dc..19ad843 100644 --- a/src/components/ConfirmDepositPopup.vue +++ b/src/components/ConfirmDepositPopup.vue @@ -94,7 +94,7 @@ import Component from 'vue-class-component' import NextButton from './NextButton' import { toWei, fromWei } from '../utils/wei' import lottie from 'lottie-web' -import BN from 'bn.js' +import BigNumber from "bignumber.js" @Component({ name: 'ConfirmDepositPopup', @@ -139,17 +139,17 @@ export default class ConfirmDepositPopup extends Vue { this.loadingTitle = 'Waiting for Metamask' this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) - const amountDecimals = `${(+this.tokenDepositAmount)*(10**(+token.decimals))}` + const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)) const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( toWei(this.etherDepositAmount), token.address, - amountDecimals, + amountDecimals.toString(10), toWei(this.feeAmount), ) const tokenContract = await this.$store.state.zkopru.client.getERC20Contract(token.address) - const amount = new BN(this.tokenDepositAmount) + const amount = new BigNumber(this.tokenDepositAmount.toString()) const existingAllowance = await this.$store.dispatch('loadTokenAllowance', token.address) - if ((new BN(existingAllowance.toString())).lt(amount)) { + if ((new BigNumber(existingAllowance.toString())).lt(amount)) { const transferData = tokenContract.interface.encodeFunctionData('approve', [to, amountDecimals]) try { const txHash = await window.ethereum.request({ @@ -206,12 +206,12 @@ export default class ConfirmDepositPopup extends Vue { } } else { const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) - const amountDecimals = `${(+this.tokenDepositAmount)*(10**(+token.decimals))}` + const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)) try { const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( toWei(this.etherDepositAmount), token.address, - amountDecimals, + amountDecimals.toString(10), toWei(this.feeAmount), ) await window.ethereum.request({ diff --git a/src/components/ConfirmTransferPopup.vue b/src/components/ConfirmTransferPopup.vue index 4eae931..349fc78 100644 --- a/src/components/ConfirmTransferPopup.vue +++ b/src/components/ConfirmTransferPopup.vue @@ -28,7 +28,7 @@ class="line-item" >
Layer 2 Fee
-
{{ feeAmount.toFixed(18) }} ETH
+
{{ feeAmount }} ETH
{ for (const { address, symbol } of rootState.zkopru.registeredTokens) { diff --git a/src/stores/zkopru.js b/src/stores/zkopru.js index 921249b..3e6041c 100644 --- a/src/stores/zkopru.js +++ b/src/stores/zkopru.js @@ -1,6 +1,5 @@ import { fromWei } from '../utils/wei' import dayjs from 'dayjs' -import BN from 'bn.js' import BigNumber from "bignumber.js" const DEFAULT_NETWORKS = { @@ -340,7 +339,7 @@ export default { const key = token ? token.symbol : 'ETH' const existing = info[key] || {} const count = existing.count ?? 0; - const total = existing.total ?? new BigNumber(0); + const total = existing.total ?? new BigNumber('0'); const largestNotes = existing.largestNotes || [] const amount = key === 'ETH' ? asset.eth : asset.erc20Amount.add(asset.nft) if (largestNotes.length < 4) { @@ -357,10 +356,10 @@ export default { } const maxSpend = largestNotes.reduce((total, current) => { return total.plus(current) - }, new BigNumber(0)) + }, new BigNumber('0')) const decimals = token ? token.decimals : 18 const offsetDecimals = Math.min(3, decimals) - const maxSpendDecimal = +maxSpend.div(new BN(`${10 ** (decimals - offsetDecimals)}`)).toString() / (10 ** offsetDecimals) + const maxSpendDecimal = +maxSpend.div(new BigNumber(`${10 ** (decimals - offsetDecimals)}`)).toString() / (10 ** offsetDecimals) info[key] = { count: count + 1, total: total.plus(amount), diff --git a/src/utils/wei.js b/src/utils/wei.js index 7481b66..d8d3228 100644 --- a/src/utils/wei.js +++ b/src/utils/wei.js @@ -1,15 +1,15 @@ -import BN from 'bn.js' +import BigNumber from "bignumber.js" export function fromWei(amount, decimals = 3) { let bnAmount if (typeof amount === 'string' && amount.indexOf('0x') === 0) { - bnAmount = new BN(amount.slice(2), 16) + bnAmount = new BigNumber(amount.slice(2), 16) } else { - bnAmount = new BN(amount) + bnAmount = new BigNumber(amount.toString()) } - const finney = bnAmount.div(new BN(`${10 ** (18 - decimals)}`)).toString() + const finney = bnAmount.div(new BigNumber(`${10 ** (18 - decimals)}`)).toString() const ether = +finney / (10 ** decimals) - return ether + return new BigNumber(ether.toString()).toString(10) } export function toWei(amount) { @@ -19,6 +19,6 @@ export function toWei(amount) { decimalCount = amount.toString().length - decimalIndex } const baseAmount = Math.floor(+amount.toString() * (10 ** decimalCount)) - const wei = new BN(baseAmount.toString()).mul(new BN('10').pow(new BN(18 - decimalCount))) - return wei.toString() + const wei = new BigNumber(baseAmount.toString()).multipliedBy(new BigNumber('10').pow(18 - decimalCount)) + return wei.toString(10) } diff --git a/tx-generator.js b/tx-generator.js index e7b69c5..a1f3704 100644 --- a/tx-generator.js +++ b/tx-generator.js @@ -1,6 +1,6 @@ const Zkopru = require('@zkopru/client').default const { sha512_256 } = require('js-sha512') -const BN = require('bn.js') +const { default: BigNumber } = require('bignumber.js') // const URL = 'wss://goerli.infura.io/ws/v3/5b122dbc87ed4260bf9a2031e8a0e2aa' const URL = 'ws://192.168.1.198:9546' @@ -54,11 +54,11 @@ const PUBLIC_KEY = '0x3537256fFB47da602871bE7FB26d9fe7e42dD055' function fromWei(amount, decimals = 3) { let bnAmount if (typeof amount === 'string' && amount.indexOf('0x') === 0) { - bnAmount = new BN(amount.slice(2), 16) + bnAmount = new BigNumber(amount.slice(2), 16) } else { - bnAmount = new BN(amount) + bnAmount = new BigNumber(amount.toString()) } - const finney = bnAmount.div(new BN(`${10 ** (18 - decimals)}`)).toString() + const finney = bnAmount.div(new BigNumber(`${10 ** (18 - decimals)}`)).toString() const ether = +finney / (10 ** decimals) return ether } @@ -70,6 +70,6 @@ function toWei(amount) { decimalCount = amount.toString().length - decimalIndex } const baseAmount = +amount.toString() * (10 ** decimalCount) - const wei = new BN(baseAmount.toString()).mul(new BN('10').pow(new BN(18 - decimalCount))) - return wei.toString() + const wei = new BigNumber(baseAmount.toString()).multipliedBy(new BigNumber('10').pow(18 - decimalCount)) + return wei.toString(10) } From 729dce4871a481b10367443a7e7ac8325b4df85e Mon Sep 17 00:00:00 2001 From: KimiWu Date: Thu, 27 Oct 2022 11:58:06 +0800 Subject: [PATCH 5/9] feat: using state.chainId intead of hard coded chain id --- src/components/ConfirmWithdrawPopup.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/ConfirmWithdrawPopup.vue b/src/components/ConfirmWithdrawPopup.vue index f066f6b..40c388f 100644 --- a/src/components/ConfirmWithdrawPopup.vue +++ b/src/components/ConfirmWithdrawPopup.vue @@ -156,7 +156,7 @@ export default class ConfirmWithdrawPopup extends Vue { .toString(16)}` const msgParams = { domain: { - chainId: 31337, + chainId: this.$store.state.chainId, name: 'Zkopru', verifyingContract: this.$store.state.zkopru.client.node.layer1.address, version: '1', From 61dd5185fea767fa3aea7fbd84f0bbd9313d6126 Mon Sep 17 00:00:00 2001 From: KimiWu Date: Thu, 27 Oct 2022 16:56:42 +0800 Subject: [PATCH 6/9] refine logic of sending a tx in transfer to align with withdraw --- src/components/ConfirmDepositPopup.vue | 8 ++++---- src/components/ConfirmTransferPopup.vue | 27 +++++++++++++------------ 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/src/components/ConfirmDepositPopup.vue b/src/components/ConfirmDepositPopup.vue index 19ad843..9348315 100644 --- a/src/components/ConfirmDepositPopup.vue +++ b/src/components/ConfirmDepositPopup.vue @@ -139,11 +139,11 @@ export default class ConfirmDepositPopup extends Vue { this.loadingTitle = 'Waiting for Metamask' this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) - const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)) + const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)).toString(10) const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( toWei(this.etherDepositAmount), token.address, - amountDecimals.toString(10), + amountDecimals, toWei(this.feeAmount), ) const tokenContract = await this.$store.state.zkopru.client.getERC20Contract(token.address) @@ -206,12 +206,12 @@ export default class ConfirmDepositPopup extends Vue { } } else { const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) - const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)) + const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)).toString(10) try { const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( toWei(this.etherDepositAmount), token.address, - amountDecimals.toString(10), + amountDecimals, toWei(this.feeAmount), ) await window.ethereum.request({ diff --git a/src/components/ConfirmTransferPopup.vue b/src/components/ConfirmTransferPopup.vue index 349fc78..c60279d 100644 --- a/src/components/ConfirmTransferPopup.vue +++ b/src/components/ConfirmTransferPopup.vue @@ -111,21 +111,22 @@ export default class ConfirmDepositPopup extends Vue { async send() { if (!this.tx) return this.sending = true - try { - this.currentMessageIndex = 0 - const zkTx = await this.$store.state.zkopru.wallet.wallet.shieldTx({ - tx: this.tx, - }) - this.currentMessageIndex = 1 - await this.$store.state.zkopru.wallet.wallet.sendLayer2Tx(zkTx) - await this.$store.dispatch('loadL2Balance') - await this.$store.dispatch('loadHistory') - this.sending = false - this.sendComplete = true - } catch (err) { + this.currentMessageIndex = 0 + const zkTx = await this.$store.state.zkopru.wallet.wallet.shieldTx({ + tx: this.tx, + }) + this.currentMessageIndex = 1 + const response = await this.$store.state.zkopru.wallet.wallet.sendLayer2Tx(zkTx) + if (response.status !== 200) { this.sending = false - console.log(err) + await this.$store.state.zkopru.wallet.wallet.unlockUtxos(this.tx.inflow) + await this.$store.state.zkopru.wallet.wallet.unlockUtxos(this.tx.outflow) + throw Error(await response.text()) } + await this.$store.dispatch('loadL2Balance') + await this.$store.dispatch('loadHistory') + this.sending = false + this.sendComplete = true } closeClicked() { if (typeof this.onClose === 'function') { From 2123239fd526aa08d4e72a14c887264ab3bd6a51 Mon Sep 17 00:00:00 2001 From: KimiWu Date: Mon, 31 Oct 2022 09:59:07 +0800 Subject: [PATCH 7/9] refactor: apply ethers utils to replace fromWei and toWei --- package-lock.json | 1263 +++++++++++++++++------ package.json | 3 +- src/Deposit.vue | 13 +- src/Transfer.vue | 21 +- src/Withdraw.vue | 30 +- src/components/ConfirmDepositPopup.vue | 25 +- src/components/ConfirmTransferPopup.vue | 1 - src/components/ConfirmWithdrawPopup.vue | 17 +- src/components/HistoryCell.vue | 14 +- src/stores/eth-account.js | 4 +- src/stores/zkopru.js | 19 +- src/utils/wei.js | 24 - tx-generator.js | 28 +- 13 files changed, 1014 insertions(+), 448 deletions(-) delete mode 100644 src/utils/wei.js diff --git a/package-lock.json b/package-lock.json index f9f7b58..2d680c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,12 +9,13 @@ "version": "1.0.0", "license": "MIT", "dependencies": { + "@ethersproject/bignumber": "5.7.0", "axios": "^0.20.0", - "bignumber.js": "9.1.0", "compression": "^1.7.4", "dayjs": "^1.10.6", "especial": "0.0.4", "eth-ens-namehash": "^2.0.8", + "ethers": "5.7.2", "express": "^4.17.1", "js-sha512": "^0.8.0", "lottie-web": "^5.8.1", @@ -611,10 +612,9 @@ } }, "node_modules/@ethersproject/abstract-provider": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", - "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "funding": [ { "type": "individual", @@ -626,20 +626,19 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/networks": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/transactions": "^5.5.0", - "@ethersproject/web": "^5.5.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, "node_modules/@ethersproject/abstract-signer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", - "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "funding": [ { "type": "individual", @@ -651,18 +650,17 @@ } ], "dependencies": { - "@ethersproject/abstract-provider": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "node_modules/@ethersproject/address": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", - "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "funding": [ { "type": "individual", @@ -674,18 +672,17 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/rlp": "^5.5.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, "node_modules/@ethersproject/base64": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", - "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "funding": [ { "type": "individual", @@ -697,14 +694,13 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.5.0" + "@ethersproject/bytes": "^5.7.0" } }, - "node_modules/@ethersproject/bignumber": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", - "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", - "dev": true, + "node_modules/@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", "funding": [ { "type": "individual", @@ -716,22 +712,34 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "bn.js": "^4.11.9" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, - "node_modules/@ethersproject/bignumber/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/@ethersproject/bignumber": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" + } }, "node_modules/@ethersproject/bytes": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", - "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "funding": [ { "type": "individual", @@ -743,14 +751,13 @@ } ], "dependencies": { - "@ethersproject/logger": "^5.5.0" + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/constants": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", - "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "funding": [ { "type": "individual", @@ -762,14 +769,92 @@ } ], "dependencies": { - "@ethersproject/bignumber": "^5.5.0" + "@ethersproject/bignumber": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + } + }, + "node_modules/@ethersproject/contracts/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@ethersproject/hash": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", - "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", "funding": [ { "type": "individual", @@ -781,21 +866,54 @@ } ], "dependencies": { - "@ethersproject/abstract-signer": "^5.5.0", - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "node_modules/@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, "node_modules/@ethersproject/keccak256": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", - "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "funding": [ { "type": "individual", @@ -807,21 +925,19 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.5.0", + "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" } }, "node_modules/@ethersproject/keccak256/node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" }, "node_modules/@ethersproject/logger": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", - "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==", "funding": [ { "type": "individual", @@ -834,10 +950,9 @@ ] }, "node_modules/@ethersproject/networks": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.0.tgz", - "integrity": "sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA==", - "dev": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "funding": [ { "type": "individual", @@ -849,14 +964,107 @@ } ], "dependencies": { - "@ethersproject/logger": "^5.5.0" + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, "node_modules/@ethersproject/properties": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", - "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + } + }, + "node_modules/@ethersproject/providers/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "funding": [ { "type": "individual", @@ -868,14 +1076,33 @@ } ], "dependencies": { - "@ethersproject/logger": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/rlp": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", - "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "funding": [ { "type": "individual", @@ -887,15 +1114,15 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" } }, "node_modules/@ethersproject/signing-key": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", - "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", "funding": [ { "type": "individual", @@ -907,25 +1134,41 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "bn.js": "^4.11.9", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", "elliptic": "6.5.4", "hash.js": "1.1.7" } }, - "node_modules/@ethersproject/signing-key/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "node_modules/@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } }, "node_modules/@ethersproject/strings": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", - "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "funding": [ { "type": "individual", @@ -937,16 +1180,61 @@ } ], "dependencies": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/logger": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "node_modules/@ethersproject/transactions": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", - "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "node_modules/@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "node_modules/@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", "funding": [ { "type": "individual", @@ -958,22 +1246,49 @@ } ], "dependencies": { - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/rlp": "^5.5.0", - "@ethersproject/signing-key": "^5.5.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, "node_modules/@ethersproject/web": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.0.tgz", - "integrity": "sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA==", - "dev": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "node_modules/@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", "funding": [ { "type": "individual", @@ -985,11 +1300,11 @@ } ], "dependencies": { - "@ethersproject/base64": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "node_modules/@hapi/bourne": { @@ -2981,6 +3296,11 @@ "node": ">=0.4.0" } }, + "node_modules/aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -3484,6 +3804,11 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "node_modules/bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, "node_modules/big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -3506,6 +3831,7 @@ "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true, "engines": { "node": "*" } @@ -3633,10 +3959,9 @@ "dev": true }, "node_modules/bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "node_modules/body-parser": { "version": "1.19.0", @@ -3730,8 +4055,7 @@ "node_modules/brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "node_modules/browserify-aes": { "version": "1.2.0", @@ -5683,7 +6007,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -5697,8 +6020,7 @@ "node_modules/elliptic/node_modules/bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -6191,6 +6513,79 @@ "node": ">=10.0.0" } }, + "node_modules/ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + } + }, + "node_modules/ethers/node_modules/@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "funding": [ + { + "type": "individual", + "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" + }, + { + "type": "individual", + "url": "https://www.buymeacoffee.com/ricmoo" + } + ], + "dependencies": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, "node_modules/ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -7629,7 +8024,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -7685,7 +8079,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "dependencies": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -8118,8 +8511,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -9577,14 +9969,12 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "node_modules/minimatch": { "version": "3.0.4", @@ -12259,8 +12649,7 @@ "node_modules/scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "node_modules/secp256k1": { "version": "4.0.2", @@ -18439,221 +18828,391 @@ } }, "@ethersproject/abstract-provider": { - "version": "5.5.1", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.5.1.tgz", - "integrity": "sha512-m+MA/ful6eKbxpr99xUYeRvLkfnlqzrF8SZ46d/xFB1A7ZVknYc/sXJG0RcufF52Qn2jeFj1hhcoQ7IXjNKUqg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz", + "integrity": "sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==", "requires": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/networks": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/transactions": "^5.5.0", - "@ethersproject/web": "^5.5.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0" } }, "@ethersproject/abstract-signer": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.5.0.tgz", - "integrity": "sha512-lj//7r250MXVLKI7sVarXAbZXbv9P50lgmJQGr2/is82EwEb8r7HrxsmMqAjTsztMYy7ohrIhGMIml+Gx4D3mA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz", + "integrity": "sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==", "requires": { - "@ethersproject/abstract-provider": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0" + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "@ethersproject/address": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.5.0.tgz", - "integrity": "sha512-l4Nj0eWlTUh6ro5IbPTgbpT4wRbdH5l8CQf7icF7sb/SI3Nhd9Y9HzhonTSTi6CefI0necIw7LJqQPopPLZyWw==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/address/-/address-5.7.0.tgz", + "integrity": "sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==", "requires": { - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/rlp": "^5.5.0" + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/rlp": "^5.7.0" } }, "@ethersproject/base64": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.5.0.tgz", - "integrity": "sha512-tdayUKhU1ljrlHzEWbStXazDpsx4eg1dBXUSI6+mHlYklOXoXF6lZvw8tnD6oVaWfnMxAgRSKROg3cVKtCcppA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/base64/-/base64-5.7.0.tgz", + "integrity": "sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==", "requires": { - "@ethersproject/bytes": "^5.5.0" + "@ethersproject/bytes": "^5.7.0" + } + }, + "@ethersproject/basex": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/basex/-/basex-5.7.0.tgz", + "integrity": "sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/properties": "^5.7.0" } }, "@ethersproject/bignumber": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.5.0.tgz", - "integrity": "sha512-6Xytlwvy6Rn3U3gKEc1vP7nR92frHkv6wtVr95LFR3jREXiCPzdWxKQ1cx4JGQBXxcguAwjA8murlYN2TSiEbg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bignumber/-/bignumber-5.7.0.tgz", + "integrity": "sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==", "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "bn.js": "^4.11.9" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "bn.js": "^5.2.1" } }, "@ethersproject/bytes": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.5.0.tgz", - "integrity": "sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.7.0.tgz", + "integrity": "sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==", "requires": { - "@ethersproject/logger": "^5.5.0" + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/constants": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.5.0.tgz", - "integrity": "sha512-2MsRRVChkvMWR+GyMGY4N1sAX9Mt3J9KykCsgUFd/1mwS0UH1qw+Bv9k1UJb3X3YJYFco9H20pjSlOIfCG5HYQ==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/constants/-/constants-5.7.0.tgz", + "integrity": "sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==", "requires": { - "@ethersproject/bignumber": "^5.5.0" + "@ethersproject/bignumber": "^5.7.0" } }, - "@ethersproject/hash": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.5.0.tgz", - "integrity": "sha512-dnGVpK1WtBjmnp3mUT0PlU2MpapnwWI0PibldQEq1408tQBAbZpPidkWoVVuNMOl/lISO3+4hXZWCL3YV7qzfg==", - "dev": true, + "@ethersproject/contracts": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/contracts/-/contracts-5.7.0.tgz", + "integrity": "sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==", "requires": { - "@ethersproject/abstract-signer": "^5.5.0", - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "@ethersproject/abi": "^5.7.0", + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/transactions": "^5.7.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + } + } + }, + "@ethersproject/hash": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hash/-/hash-5.7.0.tgz", + "integrity": "sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/hdnode": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/hdnode/-/hdnode-5.7.0.tgz", + "integrity": "sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" + } + }, + "@ethersproject/json-wallets": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz", + "integrity": "sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==", + "requires": { + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/pbkdf2": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "aes-js": "3.0.0", + "scrypt-js": "3.0.1" } }, "@ethersproject/keccak256": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.5.0.tgz", - "integrity": "sha512-5VoFCTjo2rYbBe1l2f4mccaRFN/4VQEYFwwn04aJV2h7qf4ZvI2wFxUE1XOX+snbwCLRzIeikOqtAoPwMza9kg==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/keccak256/-/keccak256-5.7.0.tgz", + "integrity": "sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==", "requires": { - "@ethersproject/bytes": "^5.5.0", + "@ethersproject/bytes": "^5.7.0", "js-sha3": "0.8.0" }, "dependencies": { "js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", - "dev": true + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" } } }, "@ethersproject/logger": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.5.0.tgz", - "integrity": "sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg==", - "dev": true + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.7.0.tgz", + "integrity": "sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==" }, "@ethersproject/networks": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.5.0.tgz", - "integrity": "sha512-KWfP3xOnJeF89Uf/FCJdV1a2aDJe5XTN2N52p4fcQ34QhDqQFkgQKZ39VGtiqUgHcLI8DfT0l9azC3KFTunqtA==", - "dev": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/networks/-/networks-5.7.1.tgz", + "integrity": "sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ==", "requires": { - "@ethersproject/logger": "^5.5.0" + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/pbkdf2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz", + "integrity": "sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/sha2": "^5.7.0" } }, "@ethersproject/properties": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.5.0.tgz", - "integrity": "sha512-l3zRQg3JkD8EL3CPjNK5g7kMx4qSwiR60/uk5IVjd3oq1MZR5qUg40CNOoEJoX5wc3DyY5bt9EbMk86C7x0DNA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/properties/-/properties-5.7.0.tgz", + "integrity": "sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==", + "requires": { + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/providers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/@ethersproject/providers/-/providers-5.7.2.tgz", + "integrity": "sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/base64": "^5.7.0", + "@ethersproject/basex": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/networks": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/web": "^5.7.0", + "bech32": "1.1.4", + "ws": "7.4.6" + }, + "dependencies": { + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + } + } + }, + "@ethersproject/random": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/random/-/random-5.7.0.tgz", + "integrity": "sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==", "requires": { - "@ethersproject/logger": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/rlp": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.5.0.tgz", - "integrity": "sha512-hLv8XaQ8PTI9g2RHoQGf/WSxBfTB/NudRacbzdxmst5VHAqd1sMibWG7SENzT5Dj3yZ3kJYx+WiRYEcQTAkcYA==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/rlp/-/rlp-5.7.0.tgz", + "integrity": "sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==", "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, - "@ethersproject/signing-key": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.5.0.tgz", - "integrity": "sha512-5VmseH7qjtNmDdZBswavhotYbWB0bOwKIlOTSlX14rKn5c11QmJwGt4GHeo7NrL/Ycl7uo9AHvEqs5xZgFBTng==", - "dev": true, + "@ethersproject/sha2": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.7.0.tgz", + "integrity": "sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==", "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "bn.js": "^4.11.9", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "hash.js": "1.1.7" + } + }, + "@ethersproject/signing-key": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/signing-key/-/signing-key-5.7.0.tgz", + "integrity": "sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "bn.js": "^5.2.1", "elliptic": "6.5.4", "hash.js": "1.1.7" - }, - "dependencies": { - "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true - } + } + }, + "@ethersproject/solidity": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/solidity/-/solidity-5.7.0.tgz", + "integrity": "sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/sha2": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@ethersproject/strings": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.5.0.tgz", - "integrity": "sha512-9fy3TtF5LrX/wTrBaT8FGE6TDJyVjOvXynXJz5MT5azq+E6D92zuKNx7i29sWW2FjVOaWjAsiZ1ZWznuduTIIQ==", - "dev": true, + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/strings/-/strings-5.7.0.tgz", + "integrity": "sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==", "requires": { - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/logger": "^5.5.0" + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" } }, "@ethersproject/transactions": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.5.0.tgz", - "integrity": "sha512-9RZYSKX26KfzEd/1eqvv8pLauCKzDTub0Ko4LfIgaERvRuwyaNV78mJs7cpIgZaDl6RJui4o49lHwwCM0526zA==", - "dev": true, - "requires": { - "@ethersproject/address": "^5.5.0", - "@ethersproject/bignumber": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/constants": "^5.5.0", - "@ethersproject/keccak256": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/rlp": "^5.5.0", - "@ethersproject/signing-key": "^5.5.0" + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/transactions/-/transactions-5.7.0.tgz", + "integrity": "sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/rlp": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0" + } + }, + "@ethersproject/units": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/units/-/units-5.7.0.tgz", + "integrity": "sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==", + "requires": { + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/logger": "^5.7.0" + } + }, + "@ethersproject/wallet": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wallet/-/wallet-5.7.0.tgz", + "integrity": "sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==", + "requires": { + "@ethersproject/abstract-provider": "^5.7.0", + "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/hdnode": "^5.7.0", + "@ethersproject/json-wallets": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/random": "^5.7.0", + "@ethersproject/signing-key": "^5.7.0", + "@ethersproject/transactions": "^5.7.0", + "@ethersproject/wordlists": "^5.7.0" } }, "@ethersproject/web": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.5.0.tgz", - "integrity": "sha512-BEgY0eL5oH4mAo37TNYVrFeHsIXLRxggCRG/ksRIxI2X5uj5IsjGmcNiRN/VirQOlBxcUhCgHhaDLG4m6XAVoA==", - "dev": true, + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@ethersproject/web/-/web-5.7.1.tgz", + "integrity": "sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w==", "requires": { - "@ethersproject/base64": "^5.5.0", - "@ethersproject/bytes": "^5.5.0", - "@ethersproject/logger": "^5.5.0", - "@ethersproject/properties": "^5.5.0", - "@ethersproject/strings": "^5.5.0" + "@ethersproject/base64": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + }, + "@ethersproject/wordlists": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/wordlists/-/wordlists-5.7.0.tgz", + "integrity": "sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==", + "requires": { + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" } }, "@hapi/bourne": { @@ -20365,6 +20924,11 @@ "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, + "aes-js": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aes-js/-/aes-js-3.0.0.tgz", + "integrity": "sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==" + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -20767,6 +21331,11 @@ } } }, + "bech32": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", + "integrity": "sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==" + }, "big-integer": { "version": "1.6.51", "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", @@ -20782,7 +21351,8 @@ "bignumber.js": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.0.tgz", - "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==" + "integrity": "sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A==", + "dev": true }, "binary-extensions": { "version": "2.2.0", @@ -20891,10 +21461,9 @@ "dev": true }, "bn.js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", - "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", + "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" }, "body-parser": { "version": "1.19.0", @@ -20983,8 +21552,7 @@ "brorand": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, "browserify-aes": { "version": "1.2.0", @@ -22625,7 +23193,6 @@ "version": "6.5.4", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", - "dev": true, "requires": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -22639,8 +23206,7 @@ "bn.js": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", - "dev": true + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" } } }, @@ -23087,6 +23653,61 @@ "rlp": "^2.2.4" } }, + "ethers": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/ethers/-/ethers-5.7.2.tgz", + "integrity": "sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==", + "requires": { + "@ethersproject/abi": "5.7.0", + "@ethersproject/abstract-provider": "5.7.0", + "@ethersproject/abstract-signer": "5.7.0", + "@ethersproject/address": "5.7.0", + "@ethersproject/base64": "5.7.0", + "@ethersproject/basex": "5.7.0", + "@ethersproject/bignumber": "5.7.0", + "@ethersproject/bytes": "5.7.0", + "@ethersproject/constants": "5.7.0", + "@ethersproject/contracts": "5.7.0", + "@ethersproject/hash": "5.7.0", + "@ethersproject/hdnode": "5.7.0", + "@ethersproject/json-wallets": "5.7.0", + "@ethersproject/keccak256": "5.7.0", + "@ethersproject/logger": "5.7.0", + "@ethersproject/networks": "5.7.1", + "@ethersproject/pbkdf2": "5.7.0", + "@ethersproject/properties": "5.7.0", + "@ethersproject/providers": "5.7.2", + "@ethersproject/random": "5.7.0", + "@ethersproject/rlp": "5.7.0", + "@ethersproject/sha2": "5.7.0", + "@ethersproject/signing-key": "5.7.0", + "@ethersproject/solidity": "5.7.0", + "@ethersproject/strings": "5.7.0", + "@ethersproject/transactions": "5.7.0", + "@ethersproject/units": "5.7.0", + "@ethersproject/wallet": "5.7.0", + "@ethersproject/web": "5.7.1", + "@ethersproject/wordlists": "5.7.0" + }, + "dependencies": { + "@ethersproject/abi": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@ethersproject/abi/-/abi-5.7.0.tgz", + "integrity": "sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==", + "requires": { + "@ethersproject/address": "^5.7.0", + "@ethersproject/bignumber": "^5.7.0", + "@ethersproject/bytes": "^5.7.0", + "@ethersproject/constants": "^5.7.0", + "@ethersproject/hash": "^5.7.0", + "@ethersproject/keccak256": "^5.7.0", + "@ethersproject/logger": "^5.7.0", + "@ethersproject/properties": "^5.7.0", + "@ethersproject/strings": "^5.7.0" + } + } + } + }, "ethjs-unit": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/ethjs-unit/-/ethjs-unit-0.1.6.tgz", @@ -24276,7 +24897,6 @@ "version": "1.1.7", "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" @@ -24327,7 +24947,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, "requires": { "hash.js": "^1.0.3", "minimalistic-assert": "^1.0.0", @@ -24675,8 +25294,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.8", @@ -25824,14 +26442,12 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" }, "minimatch": { "version": "3.0.4", @@ -28034,8 +28650,7 @@ "scrypt-js": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/scrypt-js/-/scrypt-js-3.0.1.tgz", - "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==", - "dev": true + "integrity": "sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==" }, "secp256k1": { "version": "4.0.2", diff --git a/package.json b/package.json index fce8354..d7327e1 100644 --- a/package.json +++ b/package.json @@ -17,12 +17,13 @@ "author": "Chance Hudson", "license": "MIT", "dependencies": { + "@ethersproject/bignumber": "5.7.0", "axios": "^0.20.0", - "bignumber.js": "9.1.0", "compression": "^1.7.4", "dayjs": "^1.10.6", "especial": "0.0.4", "eth-ens-namehash": "^2.0.8", + "ethers": "5.7.2", "express": "^4.17.1", "js-sha512": "^0.8.0", "lottie-web": "^5.8.1", diff --git a/src/Deposit.vue b/src/Deposit.vue index 6454ca7..df6d42e 100644 --- a/src/Deposit.vue +++ b/src/Deposit.vue @@ -112,13 +112,12 @@ import Vue from 'vue' import Component from 'vue-class-component' import AssetDropdown from './components/AssetDropdown' import AssetAmountField from './components/AssetAmountField' -import { toWei, fromWei } from './utils/wei' +import { ethers } from 'ethers' import Checkbox from './components/Checkbox' -import BigNumber from 'bignumber.js' +import { BigNumber } from "@ethersproject/bignumber"; import CenteredLeftMenu from './components/CenteredLeftMenu' import NextButton from './components/NextButton' import ConfirmDepositPopup from './components/ConfirmDepositPopup' -import measureText from './utils/measure-text' import tooltips from './tooltips' import InfoText from './components/InfoText' import decimalCount from './utils/decimal-count' @@ -150,6 +149,7 @@ export default class Deposit extends Vue { depositType = 0 showingDepositConfirm = false activeFeePromise = undefined + ethers = ethers mounted() { const { type, asset } = this.$route.query @@ -169,7 +169,7 @@ export default class Deposit extends Vue { } async setFeeAmount(clickedButton) { - const multiplier = clickedButton === 'Fast' ? new BigNumber('200000') : new BigNumber('100000') + const multiplier = clickedButton === 'Fast' ? BigNumber.from('200000') : BigNumber.from('100000') this.feeAmountState = 3 let feePromise try { @@ -179,11 +179,12 @@ export default class Deposit extends Vue { if (this.activeFeePromise !== feePromise) return this.activeFeePromise = undefined // Assume 2000 bytes for a simple deposit tx in a block - const feeWeiAmount = new BigNumber(weiPerByte.toString()).multipliedBy(multiplier) + const feeWeiAmount = BigNumber.from(weiPerByte.toString()).mul(multiplier) + console.log(feeWeiAmount) this.feeAmount = '' Vue.nextTick(() => { if (this.activeFeePromise !== undefined) return - this.feeAmount = fromWei(feeWeiAmount.toString(), 9) + this.feeAmount = ethers.utils.formatEther(feeWeiAmount) }) } catch (err) { if (this.activeFeePromise === feePromise) this.activeFeePromise = undefined diff --git a/src/Transfer.vue b/src/Transfer.vue index c104f3e..fa99e14 100644 --- a/src/Transfer.vue +++ b/src/Transfer.vue @@ -88,8 +88,7 @@ import Button from './components/Button' import AddressField from './components/AddressField' import FeeField from './components/FeeField' import AssetAmountField from './components/AssetAmountField' -import { toWei, fromWei } from './utils/wei' -import BigNumber from "bignumber.js" +import { ethers } from 'ethers' import CenteredLeftMenu from './components/CenteredLeftMenu' import NextButton from './components/NextButton' import ConfirmTransferPopup from './components/ConfirmTransferPopup' @@ -133,6 +132,7 @@ export default class Transfer extends Vue { tx = undefined showingTransferConfirm = false activeFeePromise = undefined + ethers = ethers mounted() { if (this.$route.query.asset) { @@ -184,25 +184,24 @@ export default class Transfer extends Vue { if (this.activeAsset === 'ETH') { const tx = await this.$store.state.zkopru.wallet.generateEtherTransfer( this.zkAddress, - toWei(this.transferAmount), - (+this.fee * (10 ** 9)).toString() + ethers.utils.parseEther(this.transferAmount.toString()).toString(), + ethers.utils.parseUnits(this.fee.toString(), 'gwei').toString(), ) - this.totalFee = fromWei(tx.fee, 9) - this.totalEther = fromWei(new BigNumber(tx.fee).plus(toWei(this.transferAmount))) + this.totalFee = ethers.utils.formatEther(tx.fee.toString()) + this.totalEther = this.totalFee.add(ethers.utils.parseEther(this.transferAmount)) this.tx = tx } else { const { address, decimals } = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => { return symbol === this.activeAsset }) - const decimalAmount = `${+this.transferAmount * (10 ** +decimals)}` const tx = await this.$store.state.zkopru.wallet.generateTokenTransfer( this.zkAddress, - decimalAmount, + ethers.utils.parseUnits(this.transferAmount.toString(), decimals), address, - (+this.fee * (10 ** 9)).toString() + ethers.utils.parseUnits(this.fee.toString(), 'gwei').toString(), ) - this.totalFee = fromWei(tx.fee.toString(), 8) - this.totalEther = fromWei(new BigNumber(tx.fee.toString())) + this.totalFee = ethers.utils.formatEther(tx.fee.toString()) + this.totalEther = this.totalFee this.tx = tx } } catch (err) { diff --git a/src/Withdraw.vue b/src/Withdraw.vue index 4b6323a..a87c67a 100644 --- a/src/Withdraw.vue +++ b/src/Withdraw.vue @@ -103,14 +103,13 @@ import FeeField from './components/FeeField' import AssetAmountField from './components/AssetAmountField' import Button from './components/Button' import Checkbox from './components/Checkbox' -import { toWei, fromWei } from './utils/wei' +import { ethers } from 'ethers' import CenteredLeftMenu from './components/CenteredLeftMenu' import NextButton from './components/NextButton' import ConfirmWithdrawPopup from './components/ConfirmWithdrawPopup' import InfoText from './components/InfoText' import tooltips from './tooltips' import decimalCount from './utils/decimal-count' -import BigNumber from 'bignumber.js' @Component({ name: 'Withdraw', @@ -159,6 +158,7 @@ export default class Withdraw extends Vue { withdrawType = 0 showingWithdrawConfirm = false activeFeePromise = undefined + ethers = ethers mounted() { const { type, asset } = this.$route.query @@ -202,31 +202,29 @@ export default class Withdraw extends Vue { if (this.activeAsset === 'ETH') { const tx = await this.$store.state.zkopru.wallet.generateWithdrawal( this.$store.state.account.accounts[0], - toWei(this.withdrawAmount), - (+this.feeAmount * (10 ** 9)).toString(), - toWei(this.instantWithdrawFee || '0') + ethers.utils.parseEther(this.withdrawAmount.toString()), + ethers.utils.parseUnits(this.feeAmount, 'gwei').toString(), + ethers.utils.parseEther(this.instantWithdrawFee.toString() || '0') ) - this.totalFee = new BigNumber(fromWei(tx.fee, 8)) - this.totalEther = new BigNumber(fromWei(tx.fee)) - .plus(new BigNumber(toWei(this.withdrawAmount))) - .toString() + this.totalFee = ethers.utils.parseEther(tx.fee.toString()) + this.totalEther = ethers.utils.parseEther(this.withdrawAmount).add(this.totalFee) this.tx = tx } else { const { address, decimals } = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => { return symbol === this.activeAsset }) - const withdrawAmountDecimal = +this.withdrawAmount * (10 ** +decimals) - const instantWithdrawFeeDecimal = +(this.instantWithdrawFee || 0) * (10 ** +decimals) - const decimalAmount = new BigNumber(withdrawAmountDecimal).plus(new BigNumber(instantWithdrawFeeDecimal)) + const withdrawAmountDecimal = ethers.utils.parseUnits(this.withdrawAmount, decimals.toString()) + const instantWithdrawFeeDecimal = ethers.utils.parseUnits((this.instantWithdrawFee || 0), decimals.toString()) + const decimalAmount = withdrawAmountDecimal.add(instantWithdrawFeeDecimal).toString() const tx = await this.$store.state.zkopru.wallet.generateTokenWithdrawal( this.$store.state.account.accounts[0], - decimalAmount.toString(), + decimalAmount, address, - (+this.feeAmount * (10 ** 9)).toString(), + ethers.utils.parseUnits(this.feeAmount, 'gwei').toString(), '0', ) - this.totalFee = fromWei(tx.fee, 8) - this.totalEther = fromWei(tx.fee) + this.totalFee = ethers.utils.parseEther(tx.fee.toString()) + this.totalEther = this.totalFee this.tx = tx } } diff --git a/src/components/ConfirmDepositPopup.vue b/src/components/ConfirmDepositPopup.vue index 9348315..39fb39a 100644 --- a/src/components/ConfirmDepositPopup.vue +++ b/src/components/ConfirmDepositPopup.vue @@ -92,9 +92,9 @@ import Vue from 'vue' import Component from 'vue-class-component' import NextButton from './NextButton' -import { toWei, fromWei } from '../utils/wei' import lottie from 'lottie-web' -import BigNumber from "bignumber.js" +import { BigNumber } from "@ethersproject/bignumber"; +import { ethers } from "ethers" @Component({ name: 'ConfirmDepositPopup', @@ -139,17 +139,17 @@ export default class ConfirmDepositPopup extends Vue { this.loadingTitle = 'Waiting for Metamask' this.loadingSubtitle = 'Please confirm the transaction to complete your deposit.' const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) - const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)).toString(10) + const amountDecimals = ethers.utils.parseUnits(this.tokenDepositAmount, token.decimals) const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( - toWei(this.etherDepositAmount), + ethers.utils.parseEther(this.etherDepositAmount), token.address, amountDecimals, - toWei(this.feeAmount), + ethers.utils.parseEther(this.feeAmount), ) const tokenContract = await this.$store.state.zkopru.client.getERC20Contract(token.address) - const amount = new BigNumber(this.tokenDepositAmount.toString()) + const amount = BigNumber.from(this.tokenDepositAmount.toString()) const existingAllowance = await this.$store.dispatch('loadTokenAllowance', token.address) - if ((new BigNumber(existingAllowance.toString())).lt(amount)) { + if ((BigNumber.from(existingAllowance.toString())).lt(amount)) { const transferData = tokenContract.interface.encodeFunctionData('approve', [to, amountDecimals]) try { const txHash = await window.ethereum.request({ @@ -184,8 +184,8 @@ export default class ConfirmDepositPopup extends Vue { if (!this.activeToken) { try { const { to, data, value, onComplete } = await this.$store.state.zkopru.wallet.wallet.depositEtherTx( - toWei(this.etherDepositAmount), - toWei(this.feeAmount), + ethers.utils.parseEther(this.etherDepositAmount), + ethers.utils.parseEther(this.feeAmount), ) await window.ethereum.request({ method: 'eth_sendTransaction', @@ -206,13 +206,12 @@ export default class ConfirmDepositPopup extends Vue { } } else { const token = this.$store.state.zkopru.registeredTokens.find(({ symbol }) => symbol === this.activeToken) - const amountDecimals = new BigNumber(this.tokenDepositAmount).multipliedBy(new BigNumber(10).pow(token.decimals)).toString(10) try { const { to, data, value, onComplete } = this.$store.state.zkopru.wallet.wallet.depositERC20Tx( - toWei(this.etherDepositAmount), + ethers.utils.parseEther(this.etherDepositAmount), token.address, - amountDecimals, - toWei(this.feeAmount), + ethers.utils.parseUnits(this.tokenDepositAmount, token.decimals), + ethers.utils.parseEther(this.feeAmount), ) await window.ethereum.request({ method: 'eth_sendTransaction', diff --git a/src/components/ConfirmTransferPopup.vue b/src/components/ConfirmTransferPopup.vue index c60279d..d959381 100644 --- a/src/components/ConfirmTransferPopup.vue +++ b/src/components/ConfirmTransferPopup.vue @@ -74,7 +74,6 @@ import Vue from 'vue' import Component from 'vue-class-component' import NextButton from './NextButton' -import { toWei, fromWei } from '../utils/wei' import lottie from 'lottie-web' @Component({ diff --git a/src/components/ConfirmWithdrawPopup.vue b/src/components/ConfirmWithdrawPopup.vue index 40c388f..6864bed 100644 --- a/src/components/ConfirmWithdrawPopup.vue +++ b/src/components/ConfirmWithdrawPopup.vue @@ -91,8 +91,8 @@ import Vue from 'vue' import Component from 'vue-class-component' import NextButton from './NextButton' -import { fromWei } from '../utils/wei' -import BigNumber from "bignumber.js" +import { ethers } from 'ethers' +import { BigNumber } from "@ethersproject/bignumber"; import lottie from 'lottie-web' @Component({ @@ -109,7 +109,7 @@ import lottie from 'lottie-web' ], computed: { etherFee() { - return fromWei(this.tx.fee, 8) + return ethers.utils.formatEther(this.tx.fee) } } }) @@ -118,6 +118,7 @@ export default class ConfirmWithdrawPopup extends Vue { prepayInfo = undefined loadingTitle = '' loadingSubtitle = '' + ethers = ethers mounted() { lottie.loadAnimation({ @@ -150,10 +151,10 @@ export default class ConfirmWithdrawPopup extends Vue { } console.log(decimals) console.log(instantWithdrawFeeNoDecimal) - const instantWithdrawFeeDecimal = `0x${new BigNumber(instantWithdrawFeeNoDecimal.toString()) - .multipliedBy(new BigNumber('10').pow(decimals)) - .div(new BigNumber('10').pow(precision)) - .toString(16)}` + const instantWithdrawFeeDecimal = BigNumber.from(instantWithdrawFeeNoDecimal.toString()) + .mul(BigNumber.from('10').pow(decimals)) + .div(BigNumber.from('10').pow(precision)) + .toHexString() const msgParams = { domain: { chainId: this.$store.state.chainId, @@ -220,7 +221,7 @@ export default class ConfirmWithdrawPopup extends Vue { await this.$store.dispatch('loadHistory') this.withdrawState = 3 } - + async withdraw() { if (this.withdrawType === 2 && this.withdrawState === 0) { this.withdrawState = 5 diff --git a/src/components/HistoryCell.vue b/src/components/HistoryCell.vue index ea6de15..13fcddc 100644 --- a/src/components/HistoryCell.vue +++ b/src/components/HistoryCell.vue @@ -57,7 +57,7 @@
- Fee {{ fromWei(transaction.fee, 8) }} Eth + Fee {{ ethers.utils.formatEther(transaction.fee) }} Eth
@@ -101,7 +101,7 @@
-
{{ fromWei(transaction.eth) }} ETH
+
{{ ethers.utils.formatEther(transaction.eth) }} ETH
@@ -114,13 +114,13 @@ import Vue from 'vue' import Component from 'vue-class-component' import dayjs from 'dayjs' -import { fromWei } from '../utils/wei' +import { ethers } from 'ethers' import AddressLink from './AddressLink' import ColorImage from './ColorImage' import { tryLoadAssetIcon } from '../utils/token' import InfoText from './InfoText' import tooltips from '../tooltips' -import BigNumber from 'bignumber.js' +import { BigNumber } from "@ethersproject/bignumber"; @Component({ name: 'HistoryCell', @@ -130,7 +130,7 @@ import BigNumber from 'bignumber.js' export default class HistoryCell extends Vue { tooltips = tooltips dayjs = dayjs - fromWei = fromWei + ethers = ethers tryLoadAssetIcon = tryLoadAssetIcon isExpanded = false @@ -155,8 +155,8 @@ export default class HistoryCell extends Vue { return +token.address === +tokenAddr }) const { decimals, symbol } = t - const tokenAmount = new BigNumber(amount) - return `${+tokenAmount.toString() / (10 ** +decimals)} ${symbol}` + const tokenAmount = BigNumber.from(amount) + return `${ethers.utils.formatUnits(tokenAmount, decimals)} ${symbol}` } tokenSymbol(tokenAddr) { diff --git a/src/stores/eth-account.js b/src/stores/eth-account.js index b737d5c..0d8a59e 100644 --- a/src/stores/eth-account.js +++ b/src/stores/eth-account.js @@ -1,4 +1,4 @@ -import { fromWei } from '../utils/wei' +const ethers = require('ethers'); export default { state: { @@ -53,7 +53,7 @@ export default { method: 'eth_getBalance', params: [state.accounts[0], 'latest'], }) - state.balance = fromWei(hexBalance) + state.balance = ethers.utils.formatEther(hexBalance) }, loadTokenBalances: async ({ state, rootState }) => { for (const { address, symbol } of rootState.zkopru.registeredTokens) { diff --git a/src/stores/zkopru.js b/src/stores/zkopru.js index 3e6041c..e6d9779 100644 --- a/src/stores/zkopru.js +++ b/src/stores/zkopru.js @@ -1,6 +1,5 @@ -import { fromWei } from '../utils/wei' -import dayjs from 'dayjs' -import BigNumber from "bignumber.js" +const ethers = require('ethers'); +import { BigNumber } from "@ethersproject/bignumber"; const DEFAULT_NETWORKS = { '5': { @@ -312,7 +311,7 @@ export default { } }, {}) const { erc20, erc721, eth } = spendable - state.balance = fromWei(eth.toString()) + state.balance = ethers.utils.formatEther(eth.toString()) state.tokenBalances = {} for (const _address of Object.keys(erc20)) { const token = state.tokensByAddress[_address.toLowerCase()] @@ -339,7 +338,7 @@ export default { const key = token ? token.symbol : 'ETH' const existing = info[key] || {} const count = existing.count ?? 0; - const total = existing.total ?? new BigNumber('0'); + const total = existing.total ?? BigNumber.from('0'); const largestNotes = existing.largestNotes || [] const amount = key === 'ETH' ? asset.eth : asset.erc20Amount.add(asset.nft) if (largestNotes.length < 4) { @@ -355,14 +354,14 @@ export default { } } const maxSpend = largestNotes.reduce((total, current) => { - return total.plus(current) - }, new BigNumber('0')) + return total.add(current) + }, BigNumber.from('0')) const decimals = token ? token.decimals : 18 const offsetDecimals = Math.min(3, decimals) - const maxSpendDecimal = +maxSpend.div(new BigNumber(`${10 ** (decimals - offsetDecimals)}`)).toString() / (10 ** offsetDecimals) + const maxSpendDecimal = +maxSpend.div(BigNumber.from(10).pow(decimals - offsetDecimals)).toString() / (10 ** offsetDecimals) info[key] = { count: count + 1, - total: total.plus(amount), + total: total.add(amount), largestNotes, maxSpend, maxSpendDecimal, @@ -376,7 +375,7 @@ export default { } { const { erc20, erc721, eth } = locked - state.lockedBalance = fromWei(eth.toString()) + state.lockedBalance = ethers.utils.formatEther(eth.toString()) } state.l2BalanceLoaded = true }, diff --git a/src/utils/wei.js b/src/utils/wei.js deleted file mode 100644 index d8d3228..0000000 --- a/src/utils/wei.js +++ /dev/null @@ -1,24 +0,0 @@ -import BigNumber from "bignumber.js" - -export function fromWei(amount, decimals = 3) { - let bnAmount - if (typeof amount === 'string' && amount.indexOf('0x') === 0) { - bnAmount = new BigNumber(amount.slice(2), 16) - } else { - bnAmount = new BigNumber(amount.toString()) - } - const finney = bnAmount.div(new BigNumber(`${10 ** (18 - decimals)}`)).toString() - const ether = +finney / (10 ** decimals) - return new BigNumber(ether.toString()).toString(10) -} - -export function toWei(amount) { - const decimalIndex = amount.toString().indexOf('.') - let decimalCount = 0 - if (decimalIndex !== -1) { - decimalCount = amount.toString().length - decimalIndex - } - const baseAmount = Math.floor(+amount.toString() * (10 ** decimalCount)) - const wei = new BigNumber(baseAmount.toString()).multipliedBy(new BigNumber('10').pow(18 - decimalCount)) - return wei.toString(10) -} diff --git a/tx-generator.js b/tx-generator.js index a1f3704..c9dbcd7 100644 --- a/tx-generator.js +++ b/tx-generator.js @@ -1,6 +1,6 @@ const Zkopru = require('@zkopru/client').default const { sha512_256 } = require('js-sha512') -const { default: BigNumber } = require('bignumber.js') +const ethers = require('ethers'); // const URL = 'wss://goerli.infura.io/ws/v3/5b122dbc87ed4260bf9a2031e8a0e2aa' const URL = 'ws://192.168.1.198:9546' @@ -28,8 +28,8 @@ const PUBLIC_KEY = '0x3537256fFB47da602871bE7FB26d9fe7e42dD055' } console.log(`Current gas price: ${+gasPrice / 10**9} gwei`) const { to, data, value, onComplete } = wallet.wallet.depositEtherTx( - toWei('0.0001'), - toWei('0.0004') + ethers.utils.parseEther('0.0001'), + ethers.utils.parseEther('0.0004') ) // sign/send tx console.log(gasPrice, to, data, value) @@ -51,25 +51,3 @@ const PUBLIC_KEY = '0x3537256fFB47da602871bE7FB26d9fe7e42dD055' } })() -function fromWei(amount, decimals = 3) { - let bnAmount - if (typeof amount === 'string' && amount.indexOf('0x') === 0) { - bnAmount = new BigNumber(amount.slice(2), 16) - } else { - bnAmount = new BigNumber(amount.toString()) - } - const finney = bnAmount.div(new BigNumber(`${10 ** (18 - decimals)}`)).toString() - const ether = +finney / (10 ** decimals) - return ether -} - -function toWei(amount) { - const decimalIndex = amount.toString().indexOf('.') - let decimalCount = 0 - if (decimalIndex !== -1) { - decimalCount = amount.toString().length - decimalIndex - } - const baseAmount = +amount.toString() * (10 ** decimalCount) - const wei = new BigNumber(baseAmount.toString()).multipliedBy(new BigNumber('10').pow(18 - decimalCount)) - return wei.toString(10) -} From 1056a229acfc704dc2f80247ec82b0ed98555897 Mon Sep 17 00:00:00 2001 From: KimiWu Date: Tue, 1 Nov 2022 09:35:32 +0800 Subject: [PATCH 8/9] fix: add type, EIP712Domain, in message for EIP712 sign --- src/stores/zkopru.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/stores/zkopru.js b/src/stores/zkopru.js index e6d9779..052b1ea 100644 --- a/src/stores/zkopru.js +++ b/src/stores/zkopru.js @@ -255,6 +255,11 @@ export default { }, primaryType: 'ZkopruKey', types: { + EIP712Domain: [ + { name: 'name', type: 'string' }, + { name: 'version', type: 'string' }, + { name: 'chainId', type: 'uint256' }, + ], ZkopruKey: [ { name: 'info', type: 'string', }, { name: 'warning', type: 'string', }, From b3d664d598fc0e9d2ded3832f956e2535ee0cfdb Mon Sep 17 00:00:00 2001 From: KimiWu Date: Sat, 5 Nov 2022 15:33:50 +0800 Subject: [PATCH 9/9] fix: apply new ZkAccount --- src/stores/zkopru.js | 5 +++-- tx-generator.js | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/stores/zkopru.js b/src/stores/zkopru.js index 052b1ea..022b3c6 100644 --- a/src/stores/zkopru.js +++ b/src/stores/zkopru.js @@ -275,12 +275,13 @@ export default { console.log('rootState.account.accounts[0]', rootState.account.accounts[0]) return state.walletKey }, - loadWallet: async ({ state, commit, dispatch }) => { + loadWallet: async ({ state, commit, dispatch, rootState }) => { const key = await dispatch('loadWalletKey') const { default: Zkopru } = await import(/* webpackPrefetch: true */ '@zkopru/client/browser') state.wallet = new Zkopru.Wallet( state.client, - key + key, + rootState.account.accounts[0] ) const { address } = state.wallet.wallet.account.zkAddress console.log('zkAddress', address) diff --git a/tx-generator.js b/tx-generator.js index c9dbcd7..e376e73 100644 --- a/tx-generator.js +++ b/tx-generator.js @@ -15,7 +15,8 @@ const PUBLIC_KEY = '0x3537256fFB47da602871bE7FB26d9fe7e42dD055' await client.start(':memory:') const wallet = new Zkopru.Wallet( client, - key + key, + rootState.account.accounts[0] ) for (;;) { try {