diff --git a/web/app/WalletProvider.tsx b/web/app/WalletProvider.tsx index b1ca911..f41b94a 100644 --- a/web/app/WalletProvider.tsx +++ b/web/app/WalletProvider.tsx @@ -1,6 +1,5 @@ "use client" -import Onboard from "@web3-onboard/core" import { Web3OnboardProvider, init } from "@web3-onboard/react"; import injectedModule from "@web3-onboard/injected-wallets"; diff --git a/web/components/Strategy.tsx b/web/components/Strategy.tsx index 1f9766c..9a42354 100644 --- a/web/components/Strategy.tsx +++ b/web/components/Strategy.tsx @@ -1,12 +1,15 @@ "use client"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import Button from "./Button"; import { StrategyTable, StrategyWithProjects } from "./StrategyTable"; import TextField from "./TextField"; import { useConnectWallet } from "@web3-onboard/react"; import Dropdown from "./Dropdown"; import { pluralize } from "@/app/lib/utils/pluralize"; +import { ethers } from "ethers"; +import { distributeWeights } from "@/utils/distributeWeights"; +import { NetworkName, TokenInformation, getSupportedNetworkFromWallet, getTokensForNetwork, splitTransferFunds } from "@/utils/ethereum"; function Information(props: { title: string; @@ -36,8 +39,23 @@ export default function Strategy(props: { props.strategy ); const [currentPromp, setCurrentPrompt] = useState(props.prompt); - const [amount, setAmount] = useState(0); + const [token, setToken] = useState(undefined); + const [amount, setAmount] = useState("0"); const [{ wallet }, connectWallet] = useConnectWallet(); + const [isTransferPending, setIsTransferPending] = useState(false); + const network: NetworkName | undefined = getSupportedNetworkFromWallet(wallet); + + console.log("network", network) + + const tokens = network + ? getTokensForNetwork(network) + : []; + + useEffect(() => { + if (tokens.length) { + setToken(tokens[0]); + } + }, [tokens]); const selectedStrategiesLength = currentStrategy.filter( ({ selected }) => selected @@ -51,6 +69,46 @@ export default function Strategy(props: { // TODO: Attach current prompt with regenerate action } + async function transferFunds() { + if (!wallet || isTransferPending || !token) return; + + const ethersProvider = new ethers.providers.Web3Provider(wallet.provider, "any"); + + const signer = ethersProvider.getSigner() + + const projects = currentStrategy + .filter(({ selected }) => selected) + .filter(({ weight }) => weight) + .map(({ weight }) => ({ + //TODO: Use real addresses + address: "0xB1B7586656116D546033e3bAFF69BFcD6592225E", + weight: weight as number, + })); + + const amounts = distributeWeights( + projects.map(project => project.weight), + +amount, + token.decimals + ); + + setIsTransferPending(true); + + console.log(projects, amounts, signer, token) + try { + await splitTransferFunds( + projects.map((project) => project.address), + amounts, + signer, + token.address, + token.decimals + ); + } catch (e) { + throw e; + } finally { + setIsTransferPending(false); + } + } + return (
@@ -69,14 +127,26 @@ export default function Strategy(props: {

- {!!wallet && ( + {!!wallet && token && ( + x.name)} field={{ value: token.name }} onChange={val => setToken(tokens.find(x => x.name === val) as TokenInformation)} /> } value={amount} - onChange={(e) => setAmount(+e.target.value)} + onChange={(e) => { + const newValue = e.target.value; + // Allow only numbers with optional single leading zero, and only one decimal point + if (/^(0|[1-9]\d*)?(\.\d*)?$/.test(newValue)) { + setAmount(newValue); + } else { + // Fix the value to remove the invalid characters, maintaining only one leading zero if present + const fixedValue = newValue.replace(/[^0-9.]/g, "") + .replace(/^0+(?=\d)/, "") + .replace(/(\..*)\./g, '$1'); + setAmount(fixedValue); + } + }} /> )} {}} - disabled={selectedStrategiesLength === 0 || amount === 0} + onClick={transferFunds} + disabled={selectedStrategiesLength === 0 || amount === "0" || isTransferPending} /> )}
diff --git a/web/package.json b/web/package.json index 3598817..9eb26b3 100644 --- a/web/package.json +++ b/web/package.json @@ -20,6 +20,7 @@ "@web3-onboard/injected-wallets": "^2.10.11", "@web3-onboard/react": "^2.8.13", "clsx": "^2.1.0", + "ethers": "5.7.2", "next": "14.0.4", "react": "18.2.0", "react-dom": "18.2.0" diff --git a/web/utils/distributeWeights.ts b/web/utils/distributeWeights.ts new file mode 100644 index 0000000..8044728 --- /dev/null +++ b/web/utils/distributeWeights.ts @@ -0,0 +1,36 @@ +export function distributeWeights(weights: number[], total: number, decimals: number): number[] { + // Calculate initial amounts + let amounts = weights.map(weight => weight * total); + + // Round amounts to two decimals and calculate the sum of these amounts + let roundedAmounts = amounts.map(amount => parseFloat(amount.toFixed(decimals))); + let sumOfRoundedAmounts = roundedAmounts.reduce((a, b) => a + b, 0); + + // Calculate the remainder + let remainder = total - sumOfRoundedAmounts; + + // Distribute the remainder + // The idea here is to distribute the remainder starting from the largest fraction part + while (Math.abs(remainder) >= 0.01) { + let index = amounts.findIndex((amount, idx) => + roundedAmounts[idx] < amount && + (remainder > 0 || roundedAmounts[idx] > 0) + ); + + if (index === -1) { + break; // Break if no suitable item is found + } + + if (remainder > 0) { + roundedAmounts[index] += 0.01; + remainder -= 0.01; + } else { + roundedAmounts[index] -= 0.01; + remainder += 0.01; + } + + roundedAmounts[index] = parseFloat(roundedAmounts[index].toFixed(decimals)); + } + + return roundedAmounts; +} diff --git a/web/utils/ethereum/getSupportedNetworkFromWallet.ts b/web/utils/ethereum/getSupportedNetworkFromWallet.ts new file mode 100644 index 0000000..9e2cd95 --- /dev/null +++ b/web/utils/ethereum/getSupportedNetworkFromWallet.ts @@ -0,0 +1,14 @@ +import { WalletState } from "@web3-onboard/core"; +import { SUPPORTED_NETWORKS, NetworkName } from "."; + +export function getSupportedNetworkFromWallet(wallet: WalletState | null) { + return wallet + ? wallet.chains.length + ? Object.values(SUPPORTED_NETWORKS).includes(+wallet.chains[0].id as any) + ? Object.keys(SUPPORTED_NETWORKS).find((key) => + SUPPORTED_NETWORKS[key as NetworkName] === +wallet.chains[0].id + ) as NetworkName + : undefined + : undefined + : undefined; +} \ No newline at end of file diff --git a/web/utils/ethereum/getTokensForNetwork.ts b/web/utils/ethereum/getTokensForNetwork.ts new file mode 100644 index 0000000..82d1b78 --- /dev/null +++ b/web/utils/ethereum/getTokensForNetwork.ts @@ -0,0 +1,13 @@ +import { NetworkName, TokenInformation, supportedErc20TokensByNetwork } from "."; + +export function getTokensForNetwork(network: NetworkName): TokenInformation[] { + if (!network || !supportedErc20TokensByNetwork[network]) return []; + + const tokensForNetwork = supportedErc20TokensByNetwork[network]; + + if (!tokensForNetwork) return []; + + const tokens: TokenInformation[] = Object.values(tokensForNetwork) as TokenInformation[]; + + return tokens.filter(token => token); +} diff --git a/web/utils/ethereum/index.ts b/web/utils/ethereum/index.ts new file mode 100644 index 0000000..a12bd30 --- /dev/null +++ b/web/utils/ethereum/index.ts @@ -0,0 +1,6 @@ +export * from './getSupportedNetworkFromWallet'; +export * from './getTokensForNetwork'; +export * from './splitTransferFunds'; +export * from './supportedErc20Tokens'; +export * from './supportedErc20TokensByNetwork'; +export * from './supportedNetworks'; diff --git a/web/utils/ethereum/splitTransferFunds.ts b/web/utils/ethereum/splitTransferFunds.ts new file mode 100644 index 0000000..d0d0297 --- /dev/null +++ b/web/utils/ethereum/splitTransferFunds.ts @@ -0,0 +1,57 @@ +import { ethers, BigNumber } from "ethers"; + +const ERC20_ABI = [ + "function transfer(address to, uint256 value) external returns (bool)", + "function transferFrom(address from, address to, uint256 value) external returns (bool)", + "function approve(address spender, uint256 value) external returns (bool)", + "function allowance(address owner, address spender) external view returns (uint256)", +]; + +const DISPERSE_ABI = [ + "function disperseEther(address[] recipients, uint256[] values) external payable", + "function disperseToken(address token, address[] recipients, uint256[] values) external", + "function disperseTokenSimple(address token, address[] recipients, uint256[] values) external" +]; + +const DISPERSE_CONTRACT_ADDRESS = "0xD152f549545093347A162Dce210e7293f1452150"; + +// Use address(0) or 'undefined' for ETH +export async function splitTransferFunds( + addresses: string[], + amounts: number[], + signer: ethers.Signer, + tokenAddress?: string, + tokenDecimals?: number + ) { + const disperseContract = new ethers.Contract(DISPERSE_CONTRACT_ADDRESS, DISPERSE_ABI, signer); + + const validAddresses = addresses.filter((address) => ethers.utils.getAddress(address)); + const values = amounts.map((amount) => ethers.utils.parseUnits(amount.toString(), tokenDecimals)); + const totalValue = values.reduce((acc, value) => acc.add(value), ethers.constants.Zero); + + if (!tokenAddress || tokenAddress === ethers.constants.AddressZero) { + // Ether transfer + console.log("ether transfer"); + await disperseContract.disperseEther(validAddresses, values, { + value: totalValue, + }); + } else { + // ERC20 token transfer + console.log("tokenAddress", tokenAddress); + const tokenContract = new ethers.Contract(tokenAddress, ERC20_ABI, signer); + + const currentAllowance: BigNumber = await tokenContract.allowance( + await signer.getAddress(), + DISPERSE_CONTRACT_ADDRESS + ); + console.log("currentAllowance", currentAllowance); + + if (currentAllowance.lt(totalValue)) { + const approveTx = await tokenContract.approve(DISPERSE_CONTRACT_ADDRESS, totalValue); + await approveTx.wait(1); + } + + const transferTx = await disperseContract.disperseTokenSimple(tokenAddress, validAddresses, values); + await transferTx.wait(1); + } +} diff --git a/web/utils/ethereum/supportedErc20Tokens.ts b/web/utils/ethereum/supportedErc20Tokens.ts new file mode 100644 index 0000000..16c2876 --- /dev/null +++ b/web/utils/ethereum/supportedErc20Tokens.ts @@ -0,0 +1,20 @@ +import { NetworkName } from "./supportedNetworks"; + +export const supportedErc20Tokens = ["USDC", "USDT", "DAI", "WETH"] as const; +export type SupportedERC20Tokens = (typeof supportedErc20Tokens)[number]; + +export interface TokenInformation { + address: string; + decimals: number; + name: string; +} + +export type SupportedTokensInformation = Partial> +>>; + +export const isValidToken = (token: string): token is SupportedERC20Tokens => { + const tokens = supportedErc20Tokens as unknown as string[]; + return tokens.includes(token); +}; diff --git a/web/utils/ethereum/supportedErc20TokensByNetwork.ts b/web/utils/ethereum/supportedErc20TokensByNetwork.ts new file mode 100644 index 0000000..6cce415 --- /dev/null +++ b/web/utils/ethereum/supportedErc20TokensByNetwork.ts @@ -0,0 +1,40 @@ +import { NetworkName } from "."; +import { SupportedTokensInformation } from "./supportedErc20Tokens"; + +export const supportedErc20TokensByNetwork: SupportedTokensInformation = { + Sepolia: { + WETH: { + address: "0xfff9976782d46cc05630d1f6ebab18b2324d6b14", + decimals: 18, + name: "WETH", + }, + }, + Mainnet: { + USDC: { + address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", + decimals: 6, + name: "USDC", + }, + }, + Polygon: { + USDC: { + address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359", + decimals: 6, + name: "USDC", + }, + }, + ArbitrumOne: { + USDC: { + address: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831", + decimals: 6, + name: "USDC", + }, + }, + Optimism: { + USDC: { + address: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85", + decimals: 6, + name: "USDC", + }, + }, +}; diff --git a/web/utils/ethereum/supportedNetworks.ts b/web/utils/ethereum/supportedNetworks.ts new file mode 100644 index 0000000..6b3773d --- /dev/null +++ b/web/utils/ethereum/supportedNetworks.ts @@ -0,0 +1,21 @@ +export const SUPPORTED_NETWORKS = { + Mainnet: 1, + Polygon: 137, + ArbitrumOne: 42161, + Optimism: 10, + Base: 8453, + FantomOpera: 250, + Sepolia: 11155111, + // TODO: Disperse contract is not deployed on these networks + // zkSync: 324, + // Avalanche: 43114, + // PGN: 424, +} as const + +export type NetworkName = keyof typeof SUPPORTED_NETWORKS; +export type NetworkId = (typeof SUPPORTED_NETWORKS)[NetworkName] + +export const isValidNetworkName = (network: string): network is NetworkName => { + const values = Object.keys(SUPPORTED_NETWORKS) as unknown as string[]; + return values.includes(network); +}; \ No newline at end of file diff --git a/workers/fund_public_goods/workflows/create_strategy/functions/create_strategy.py b/workers/fund_public_goods/workflows/create_strategy/functions/create_strategy.py index 0638f48..ff4e688 100644 --- a/workers/fund_public_goods/workflows/create_strategy/functions/create_strategy.py +++ b/workers/fund_public_goods/workflows/create_strategy/functions/create_strategy.py @@ -79,7 +79,7 @@ async def create_strategy( lambda: logs.insert( supabase, run_id, - "Assessing impact of each project realted to the users interest", + "Assessing impact of each project related to the users interest", ), ) diff --git a/yarn.lock b/yarn.lock index 3930a97..2ff349c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -176,7 +176,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/abi@^5.5.0": +"@ethersproject/abi@5.7.0", "@ethersproject/abi@^5.5.0", "@ethersproject/abi@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.7.0.tgz#b3f3e045bbbeed1af3947335c247ad625a44e449" integrity sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA== @@ -204,7 +204,7 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/web" "^5.5.0" -"@ethersproject/abstract-provider@^5.5.0", "@ethersproject/abstract-provider@^5.7.0": +"@ethersproject/abstract-provider@5.7.0", "@ethersproject/abstract-provider@^5.5.0", "@ethersproject/abstract-provider@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.7.0.tgz#b0a8550f88b6bf9d51f90e4795d48294630cb9ef" integrity sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw== @@ -228,7 +228,7 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.7.0": +"@ethersproject/abstract-signer@5.7.0", "@ethersproject/abstract-signer@^5.5.0", "@ethersproject/abstract-signer@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.7.0.tgz#13f4f32117868452191a4649723cb086d2b596b2" integrity sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ== @@ -250,7 +250,7 @@ "@ethersproject/logger" "^5.5.0" "@ethersproject/rlp" "^5.5.0" -"@ethersproject/address@^5.5.0", "@ethersproject/address@^5.7.0": +"@ethersproject/address@5.7.0", "@ethersproject/address@^5.5.0", "@ethersproject/address@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.7.0.tgz#19b56c4d74a3b0a46bfdbb6cfcc0a153fc697f37" integrity sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA== @@ -268,7 +268,7 @@ dependencies: "@ethersproject/bytes" "^5.5.0" -"@ethersproject/base64@^5.5.0", "@ethersproject/base64@^5.7.0": +"@ethersproject/base64@5.7.0", "@ethersproject/base64@^5.5.0", "@ethersproject/base64@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.7.0.tgz#ac4ee92aa36c1628173e221d0d01f53692059e1c" integrity sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ== @@ -283,7 +283,7 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/properties" "^5.5.0" -"@ethersproject/basex@^5.5.0", "@ethersproject/basex@^5.7.0": +"@ethersproject/basex@5.7.0", "@ethersproject/basex@^5.5.0", "@ethersproject/basex@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.7.0.tgz#97034dc7e8938a8ca943ab20f8a5e492ece4020b" integrity sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw== @@ -300,7 +300,7 @@ "@ethersproject/logger" "^5.5.0" bn.js "^4.11.9" -"@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.7.0": +"@ethersproject/bignumber@5.7.0", "@ethersproject/bignumber@^5.5.0", "@ethersproject/bignumber@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.7.0.tgz#e2f03837f268ba655ffba03a57853e18a18dc9c2" integrity sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw== @@ -316,7 +316,7 @@ dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.7.0": +"@ethersproject/bytes@5.7.0", "@ethersproject/bytes@^5.5.0", "@ethersproject/bytes@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.7.0.tgz#a00f6ea8d7e7534d6d87f47188af1148d71f155d" integrity sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A== @@ -330,7 +330,7 @@ dependencies: "@ethersproject/bignumber" "^5.5.0" -"@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.7.0": +"@ethersproject/constants@5.7.0", "@ethersproject/constants@^5.5.0", "@ethersproject/constants@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.7.0.tgz#df80a9705a7e08984161f09014ea012d1c75295e" integrity sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA== @@ -353,6 +353,22 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/transactions" "^5.5.0" +"@ethersproject/contracts@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.7.0.tgz#c305e775abd07e48aa590e1a877ed5c316f8bd1e" + integrity sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg== + 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" + "@ethersproject/hash@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.5.0.tgz#7cee76d08f88d1873574c849e0207dcb32380cc9" @@ -367,7 +383,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/hash@^5.5.0", "@ethersproject/hash@^5.7.0": +"@ethersproject/hash@5.7.0", "@ethersproject/hash@^5.5.0", "@ethersproject/hash@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.7.0.tgz#eb7aca84a588508369562e16e514b539ba5240a7" integrity sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g== @@ -400,7 +416,7 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" -"@ethersproject/hdnode@^5.5.0", "@ethersproject/hdnode@^5.7.0": +"@ethersproject/hdnode@5.7.0", "@ethersproject/hdnode@^5.5.0", "@ethersproject/hdnode@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.7.0.tgz#e627ddc6b466bc77aebf1a6b9e47405ca5aef9cf" integrity sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg== @@ -437,7 +453,7 @@ aes-js "3.0.0" scrypt-js "3.0.1" -"@ethersproject/json-wallets@^5.5.0": +"@ethersproject/json-wallets@5.7.0", "@ethersproject/json-wallets@^5.5.0", "@ethersproject/json-wallets@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.7.0.tgz#5e3355287b548c32b368d91014919ebebddd5360" integrity sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g== @@ -464,7 +480,7 @@ "@ethersproject/bytes" "^5.5.0" js-sha3 "0.8.0" -"@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.7.0": +"@ethersproject/keccak256@5.7.0", "@ethersproject/keccak256@^5.5.0", "@ethersproject/keccak256@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.7.0.tgz#3186350c6e1cd6aba7940384ec7d6d9db01f335a" integrity sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg== @@ -477,7 +493,7 @@ resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== -"@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.7.0": +"@ethersproject/logger@5.7.0", "@ethersproject/logger@^5.5.0", "@ethersproject/logger@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.7.0.tgz#6ce9ae168e74fecf287be17062b590852c311892" integrity sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig== @@ -489,7 +505,7 @@ dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/networks@^5.5.0", "@ethersproject/networks@^5.7.0": +"@ethersproject/networks@5.7.1", "@ethersproject/networks@^5.5.0", "@ethersproject/networks@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.7.1.tgz#118e1a981d757d45ccea6bb58d9fd3d9db14ead6" integrity sha512-n/MufjFYv3yFcUyfhnXotyDlNdFb7onmkSy8aQERi2PjNcnWQ66xXxa3XlS8nCcA8aJKJjIIMNJTC7tu80GwpQ== @@ -504,7 +520,7 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/sha2" "^5.5.0" -"@ethersproject/pbkdf2@^5.5.0", "@ethersproject/pbkdf2@^5.7.0": +"@ethersproject/pbkdf2@5.7.0", "@ethersproject/pbkdf2@^5.5.0", "@ethersproject/pbkdf2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.7.0.tgz#d2267d0a1f6e123f3771007338c47cccd83d3102" integrity sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw== @@ -519,7 +535,7 @@ dependencies: "@ethersproject/logger" "^5.5.0" -"@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.7.0": +"@ethersproject/properties@5.7.0", "@ethersproject/properties@^5.5.0", "@ethersproject/properties@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.7.0.tgz#a6e12cb0439b878aaf470f1902a176033067ed30" integrity sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw== @@ -576,6 +592,32 @@ bech32 "1.1.4" ws "7.4.6" +"@ethersproject/providers@5.7.2": + version "5.7.2" + resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.7.2.tgz#f8b1a4f275d7ce58cf0a2eec222269a08beb18cb" + integrity sha512-g34EWZ1WWAVgr4aptGlVBF8mhl3VWjv+8hoAnzStu8Ah22VHBsuGzP17eb6xDVRzw895G4W7vvx60lFFur/1Rg== + 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" + "@ethersproject/random@5.5.1": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.5.1.tgz#7cdf38ea93dc0b1ed1d8e480ccdaf3535c555415" @@ -584,7 +626,7 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/random@^5.5.0", "@ethersproject/random@^5.7.0": +"@ethersproject/random@5.7.0", "@ethersproject/random@^5.5.0", "@ethersproject/random@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.7.0.tgz#af19dcbc2484aae078bb03656ec05df66253280c" integrity sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ== @@ -600,7 +642,7 @@ "@ethersproject/bytes" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.7.0": +"@ethersproject/rlp@5.7.0", "@ethersproject/rlp@^5.5.0", "@ethersproject/rlp@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.7.0.tgz#de39e4d5918b9d74d46de93af80b7685a9c21304" integrity sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w== @@ -617,7 +659,7 @@ "@ethersproject/logger" "^5.5.0" hash.js "1.1.7" -"@ethersproject/sha2@^5.5.0", "@ethersproject/sha2@^5.7.0": +"@ethersproject/sha2@5.7.0", "@ethersproject/sha2@^5.5.0", "@ethersproject/sha2@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.7.0.tgz#9a5f7a7824ef784f7f7680984e593a800480c9fb" integrity sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw== @@ -638,7 +680,7 @@ elliptic "6.5.4" hash.js "1.1.7" -"@ethersproject/signing-key@^5.5.0", "@ethersproject/signing-key@^5.7.0": +"@ethersproject/signing-key@5.7.0", "@ethersproject/signing-key@^5.5.0", "@ethersproject/signing-key@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.7.0.tgz#06b2df39411b00bc57c7c09b01d1e41cf1b16ab3" integrity sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q== @@ -662,6 +704,18 @@ "@ethersproject/sha2" "^5.5.0" "@ethersproject/strings" "^5.5.0" +"@ethersproject/solidity@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.7.0.tgz#5e9c911d8a2acce2a5ebb48a5e2e0af20b631cb8" + integrity sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA== + 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" + "@ethersproject/strings@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.5.0.tgz#e6784d00ec6c57710755699003bc747e98c5d549" @@ -671,7 +725,7 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" -"@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.7.0": +"@ethersproject/strings@5.7.0", "@ethersproject/strings@^5.5.0", "@ethersproject/strings@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.7.0.tgz#54c9d2a7c57ae8f1205c88a9d3a56471e14d5ed2" integrity sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg== @@ -695,7 +749,7 @@ "@ethersproject/rlp" "^5.5.0" "@ethersproject/signing-key" "^5.5.0" -"@ethersproject/transactions@^5.5.0", "@ethersproject/transactions@^5.7.0": +"@ethersproject/transactions@5.7.0", "@ethersproject/transactions@^5.5.0", "@ethersproject/transactions@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.7.0.tgz#91318fc24063e057885a6af13fdb703e1f993d3b" integrity sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ== @@ -719,6 +773,15 @@ "@ethersproject/constants" "^5.5.0" "@ethersproject/logger" "^5.5.0" +"@ethersproject/units@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.7.0.tgz#637b563d7e14f42deeee39245275d477aae1d8b1" + integrity sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg== + dependencies: + "@ethersproject/bignumber" "^5.7.0" + "@ethersproject/constants" "^5.7.0" + "@ethersproject/logger" "^5.7.0" + "@ethersproject/wallet@5.5.0": version "5.5.0" resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.5.0.tgz#322a10527a440ece593980dca6182f17d54eae75" @@ -740,6 +803,27 @@ "@ethersproject/transactions" "^5.5.0" "@ethersproject/wordlists" "^5.5.0" +"@ethersproject/wallet@5.7.0": + version "5.7.0" + resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.7.0.tgz#4e5d0790d96fe21d61d38fb40324e6c7ef350b2d" + integrity sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA== + dependencies: + "@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@5.5.1": version "5.5.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.5.1.tgz#cfcc4a074a6936c657878ac58917a61341681316" @@ -751,7 +835,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/web@^5.5.0", "@ethersproject/web@^5.7.0": +"@ethersproject/web@5.7.1", "@ethersproject/web@^5.5.0", "@ethersproject/web@^5.7.0": version "5.7.1" resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.7.1.tgz#de1f285b373149bee5928f4eb7bcb87ee5fbb4ae" integrity sha512-Gueu8lSvyjBWL4cYsWsjh6MtMwM0+H4HvqFPZfB6dV8ctbP9zFAO73VG1cMWae0FLPCtz0peKPpZY8/ugJJX2w== @@ -773,7 +857,7 @@ "@ethersproject/properties" "^5.5.0" "@ethersproject/strings" "^5.5.0" -"@ethersproject/wordlists@^5.5.0", "@ethersproject/wordlists@^5.7.0": +"@ethersproject/wordlists@5.7.0", "@ethersproject/wordlists@^5.5.0", "@ethersproject/wordlists@^5.7.0": version "5.7.0" resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.7.0.tgz#8fb2c07185d68c3e09eb3bfd6e779ba2774627f5" integrity sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA== @@ -2312,6 +2396,42 @@ ethers@5.5.4: "@ethersproject/web" "5.5.1" "@ethersproject/wordlists" "5.5.0" +ethers@5.7.2: + version "5.7.2" + resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e" + integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg== + 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" + event-emitter@^0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"