From 34a68d21b8b89c00b6c0d2c7c637c89dd111e090 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 9 Oct 2024 10:03:56 +0100 Subject: [PATCH 001/266] update documentation link --- .../src/layouts/MainLayout/MainLayout.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index 2e194aee..36c3ade2 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -20,7 +20,7 @@ const NAVIGATION_ITEMS = [ { name: 'bridge', navigateTo: '/bridge', icon: }, { name: 'faucet', navigateTo: '/faucet', icon: }, { name: 'explorer', navigateTo: 'https://testnet.game7.io/', icon: }, - { name: 'documentation', navigateTo: 'https://wiki.game7.io/developer-documents-external/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder', icon: }, + { name: 'documentation', navigateTo: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/', icon: }, ] const MainLayout: React.FC = ({}) => { From e86b93598a2a4e18af8156fc70093a7146a7f38e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 9 Oct 2024 10:47:12 +0100 Subject: [PATCH 002/266] remove arbitrum sepolia from settings --- .../src/components/bridge/settings/SettingsView.tsx | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx index 20441701..4d5eaf10 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx @@ -38,17 +38,6 @@ const SettingsView: React.FC = ({}) => { Request -
-
- -
-
Arbitrum Sepolia
-
Request $G7 testnet tokens on Arbitrum Sepolia
-
- -
) From 77597964894c423e561b1a75fa96b27e10705353 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 9 Oct 2024 14:48:21 +0100 Subject: [PATCH 003/266] updated pending badge --- .../bridge/history/WithdrawTransactions.module.css | 5 ++--- webapps/world-builder-dashboard/src/styles/global.css | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index d267234a..ccafa317 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -277,14 +277,13 @@ font-size: 12px; font-style: normal; font-weight: 500; - line-height: 18px; /* 150% */ - /* mix-blend-mode: var(--mix-blend, multiply); */ + line-height: 18px; cursor: pointer; } .pending { background: var(--Blue-50, #eff8ff); - color: var(--Blue-700, #175cd3); + color: var(--Primary-200, #175cd3); } .claimable { diff --git a/webapps/world-builder-dashboard/src/styles/global.css b/webapps/world-builder-dashboard/src/styles/global.css index 292bd185..2666e2fb 100644 --- a/webapps/world-builder-dashboard/src/styles/global.css +++ b/webapps/world-builder-dashboard/src/styles/global.css @@ -84,8 +84,8 @@ button { [data-theme='dark'] { --mix-blend: normal; - --Blue-50: #cce4ff; /* Adjusted from #eff8ff */ - --Blue-100: #aad1ff; /* Adjusted from #d1e9ff */ + --Blue-50: #175CD3; /* Adjusted from #eff8ff */ + --Blue-100: #1849A9; /* Adjusted from #d1e9ff */ --Blue-200: #8abfff; /* Adjusted from #b3d8ff */ --Blue-700: #164bbf; /* Adjusted from #175cd3 */ --Blue-800: #12399f; /* New: Darker blue shade */ From fbd8a60a04bb11a5af729965985be39d978a8fb0 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 9 Oct 2024 15:11:26 +0100 Subject: [PATCH 004/266] don't sort selectors --- .../bridge/bridge/NetworkSelector.tsx | 38 ++++++++---------- .../bridge/settings/SettingsView.tsx | 3 +- .../tokenSelector/TokenSelector.tsx | 40 ++++++++----------- 3 files changed, 34 insertions(+), 47 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 8901c96f..cf4d1961 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -62,29 +62,23 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelecto - {networks - .sort((a, b) => { - if (a.chainId === selectedNetwork.chainId) return 1 - if (b.chainId === selectedNetwork.chainId) return -1 - return 0 - }) - .map((n) => ( - - -
-
- {networkLogo(n.chainId)} - {n.displayName} -
- {n.chainId === selectedNetwork.chainId && } + {networks.map((n) => ( + + +
+
+ {networkLogo(n.chainId)} + {n.displayName}
- - - ))} + {n.chainId === selectedNetwork.chainId && } +
+
+
+ ))} diff --git a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx index eac98cf1..457c7291 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx @@ -1,8 +1,7 @@ import React from 'react' import { useNavigate } from 'react-router-dom' -import { L2_NETWORK, L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../../constants' +import { L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../../constants' import styles from './SettingsView.module.css' -import IconArbitrumLarge from '@/assets/IconArbitrumLarge' import IconG7tLarge from '@/assets/IconG7tLarge' import MessagingSettings from '@/components/bridge/settings/MessagingSettings' import { NetworkInterface } from '@/contexts/BlockchainContext' diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index fb7684a3..7c055fd9 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -41,7 +41,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected const addToken = (tokenAddress: string) => { try { - if (error !== '') return; + if (error !== '') return const storageKey = `${connectedAccount}-${selectedChainId}` const existingTokens = JSON.parse(localStorage.getItem(storageKey) || '[]') const rpc = ALL_NETWORKS.find((network) => network.chainId === selectedChainId)?.rpcs[0] @@ -91,29 +91,23 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected - {tokens - .sort((a, b) => { - if (a.address === selectedToken.address) return 1 - if (b.address === selectedToken.address) return -1 - return 0 - }) - .map((n) => ( - - -
-
- {} - {n.symbol} -
- {n.address === selectedToken.address && } + {tokens.map((n) => ( + + +
+
+ {} + {n.symbol}
- - - ))} + {n.address === selectedToken.address && } +
+
+
+ ))}
From debf7409869b709c90b5ffe35ebd45bc2bddaa6c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 9 Oct 2024 16:06:31 +0100 Subject: [PATCH 005/266] ext. links --- .../src/layouts/MainLayout/MobileSidebar.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index 37077d1c..98c4f09f 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -6,6 +6,7 @@ import IconLogoutLarge from '@/assets/IconLogoutLarge' import IconMenu02 from '@/assets/IconMenu02' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' +import IconExternalLink from '@/assets/IconExternalLink' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -46,8 +47,17 @@ const MobileSidebar: React.FC = ({ navigationItems }) => { }} key={item.name} > - {item.icon} - {item.name} +
+ {item.icon} + {item.name} +
+
+ {item.name === 'documentation' || item.name === 'explorer' ? ( + + ) : ( + '' + )} +
))}
From 9ca39c3ccdbaef14b2312dbea3a35e38024a1aa9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 9 Oct 2024 16:16:21 +0100 Subject: [PATCH 006/266] placeholder 0 --- .../src/components/bridge/bridge/ValueToBridge.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 1ded6ce6..804726b0 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -67,7 +67,7 @@ const ValueToBridge: React.FC = ({ useEffect(() => { if (!connectedAccount) { - setValue('0') + setValue('') } }, [connectedAccount]) @@ -92,6 +92,7 @@ const ValueToBridge: React.FC = ({ value={value} onChange={(e) => setValue(e.target.value)} disabled={!connectedAccount} + placeholder={'0'} />
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+
+ {timeAgo(status.data.lowNetworkTimeStamp)} +
Finalize
@@ -227,7 +229,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+
{timeAgo(status.data.lowNetworkTimeStamp)}
)} From 233527ae2aec6d07629f016b81d9acf3642d6b00 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 10 Oct 2024 15:59:50 +0100 Subject: [PATCH 008/266] g7 sepolia name change --- webapps/world-builder-dashboard/constants.ts | 2 +- .../src/components/bridge/bridge/BridgeMessage.module.css | 1 - .../components/bridge/history/WithdrawTransactions.module.css | 4 ++++ .../src/components/bridge/settings/SettingsView.tsx | 2 +- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index a2d53c5a..b7864211 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -38,7 +38,7 @@ export const L2_NETWORK: HighNetworkInterface = { export const L3_NETWORK: HighNetworkInterface = { chainId: 13746, name: 'conduit-orbit-deployer', - displayName: 'Game7 Testnet', + displayName: 'Game7 Sepolia', rpcs: ['https://testnet-rpc.game7.io'], blockExplorerUrls: ['https://testnet.game7.io'], nativeCurrency: { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeMessage.module.css b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeMessage.module.css index 4f90e43f..ff0b08fc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeMessage.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeMessage.module.css @@ -15,7 +15,6 @@ padding: 12px; justify-content: space-between; align-items: center; - border-bottom: 1px solid var(--Gray-100, #F2F4F7); cursor: pointer; border-top-right-radius: 8px; border-top-left-radius: 8px; diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index 1576eeb4..b3b28760 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -176,6 +176,10 @@ background: var(--Base-White, #eaecf0); } +.gridItem:last-child, .gridItemChild:last-child, .gridItemImportant:last-child, .gridItemInitiate:last-child { + border-bottom: none; +} + .gridNodeCompleted { position: absolute; left: 14px; diff --git a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx index 457c7291..cabf15be 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx @@ -35,7 +35,7 @@ const SettingsView: React.FC = ({}) => {
-
Game7 Testnet
+
Game7 Sepolia
Request $G7 testnet tokens
-
{ETA(status.data?.timestamp, withdrawal.challengePeriod)}
+
{ETA(status.data?.timestamp, withdrawal.challengePeriod)} left
)} diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index 1455502f..2fb25462 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -30,16 +30,16 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected console.log(tokens) }, [tokens]) - const handleTokenInput = (address: string) => { - setTokenAddress(address) + const handleTokenInput = (tokenAddress: string) => { + setTokenAddress(tokenAddress) let web3Provider if (window.ethereum) web3Provider = new ethers.providers.Web3Provider(window.ethereum) else throw new Error('Wallet is not installed') - if (!ethers.utils.isAddress(address)) setError('Not an address!') - else if (!doesContractExist(address, web3Provider)) setError(`Contract doesn't exist!`) - else if (tokens.find((token) => token.address === address)) setError('Token already exists') + if (!ethers.utils.isAddress(tokenAddress)) setError('Not an address!') + else if (!doesContractExist(tokenAddress, web3Provider)) setError(`Contract doesn't exist!`) + else if (tokens.find((token) => token.address === tokenAddress)) setError('Token already exists') else setError('') } @@ -56,9 +56,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected rpc: rpc } - console.log(tokens) if (tokens.find((token: Token) => token.address === tokenAddress)) { - console.log("found token!") setError("Can't add the same token!") return; } From acafdd636a323c7277dc69276d892ea9fea49e2b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 10 Oct 2024 19:42:29 +0100 Subject: [PATCH 014/266] update tx --- .../src/components/bridge/history/Withdrawal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 6fd89ec5..6046c620 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -194,7 +194,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status.data?.to ?? ''}
From 9437f813bf43d77be8e0fe1addae54078e13fc9c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 11 Oct 2024 10:45:02 +0100 Subject: [PATCH 015/266] move error div up --- .../bridge/bridge/ValueToBridge.tsx | 1 - .../tokenSelector/TokenSelector.tsx | 14 ++++------ .../src/components/faucet/FaucetView.tsx | 26 +++++++++---------- 3 files changed, 18 insertions(+), 23 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 9c6e3027..ad180cbf 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -45,7 +45,6 @@ const ValueToBridge: React.FC = ({ const getTokens = async () => { const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) handleTokenChange(_tokens[0]) - console.log(_tokens) setTokens(_tokens) } diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index 2fb25462..07f741d1 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -26,10 +26,6 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected const [error, setError] = useState('') const { connectedAccount } = useBlockchainContext() - useEffect(() => { - console.log(tokens) - }, [tokens]) - const handleTokenInput = (tokenAddress: string) => { setTokenAddress(tokenAddress) @@ -119,6 +115,11 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected
+ {error && error.length > 0 && ( +
+
{error}
+
+ )}
0 ? styles.error : ''}`} @@ -132,11 +133,6 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected
Import
- {error && error.length > 0 && ( -
-
{error}
-
- )}
diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index a1ba7fd3..e3e8153c 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -13,7 +13,7 @@ import { useUISettings } from '@/contexts/UISettingsContext' import { useFaucetAPI } from '@/hooks/useFaucetAPI' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { timeDifferenceInHoursAndMinutes, timeDifferenceInHoursMinutesAndSeconds } from '@/utils/timeFormat' -import { AccountType } from '../commonComponents/accountSelector/AccountSelector' +import { AccountType } from '../commonComponents/accountSelector/AccountSelector' import { useMediaQuery } from 'summon-ui/mantine' import { ethers } from 'ethers' import AccountSelector from '../commonComponents/accountSelector/AccountSelector' @@ -252,6 +252,18 @@ const FaucetView: React.FC = ({ }) => {
)}
+ {!!networkError &&
{networkError}.
} + {!networkError && nextClaimAvailable.isLoading && ( +
Checking faucet permissions...
+ )} + {selectedNetwork.chainId === L3_NETWORK.chainId && + nextClaimAvailable.data && + !nextClaimAvailable.data.L3.isAvailable && ( +
+ {`You requested funds recently. Come back in `}{' '} + {` ${animatedInterval}`} +
+ )}
- {!!networkError &&
{networkError}.
} - {!networkError && nextClaimAvailable.isLoading && ( -
Checking faucet permissions...
- )} - {selectedNetwork.chainId === L3_NETWORK.chainId && - nextClaimAvailable.data && - !nextClaimAvailable.data.L3.isAvailable && ( -
- {`You requested funds recently. Come back in `}{' '} - {` ${animatedInterval}`} -
- )} ) } From 8e195cd3c557a051b066a515de5156dde0006706 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 11 Oct 2024 11:11:23 +0100 Subject: [PATCH 016/266] change logo --- .../src/assets/IconGame7.tsx | 27 +++++-------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/webapps/world-builder-dashboard/src/assets/IconGame7.tsx b/webapps/world-builder-dashboard/src/assets/IconGame7.tsx index 0b5954ac..2d198158 100644 --- a/webapps/world-builder-dashboard/src/assets/IconGame7.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconGame7.tsx @@ -1,27 +1,12 @@ import React from 'react' const IconGame7: React.FC> = (props) => ( - - - - - - + + + + + + ) From 0e1d857bafa931d7e783574b53088d9d18172056 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 11 Oct 2024 12:25:05 +0100 Subject: [PATCH 017/266] border fix --- .../components/bridge/bridge/ActionButton.tsx | 5 +++-- .../history/WithdrawTransactions.module.css | 17 ++++++----------- .../src/utils/web3utils.ts | 7 ++++++- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 01e1e6bb..411dc152 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -19,6 +19,7 @@ import { sendDepositERC20ToNativeTransaction } from '@/utils/bridge/depositERC20 import { sendWithdrawERC20Transaction } from '@/utils/bridge/withdrawERC20' import { sendWithdrawTransaction } from '@/utils/bridge/withdrawNativeToken' import { L2ToL1MessageStatus } from '@arbitrum/sdk' +import { parseUntilDelimiter } from '@/utils/web3utils' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' @@ -166,7 +167,6 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl refetchNewNotifications(connectedAccount ?? '') queryClient.invalidateQueries(['ERC20Balance']) queryClient.invalidateQueries(['pendingTransactions']) - queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) queryClient.refetchQueries(['incomingMessages']) @@ -174,7 +174,8 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl navigate('/bridge/transactions') }, onError: (e: Error) => { - console.log(e) + const error = parseUntilDelimiter(e) + console.log(error) setErrorMessage('Something went wrong. Try again, please') } } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index b3b28760..9c87feae 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -14,7 +14,9 @@ align-self: stretch; border-radius: 12px; - border: 1px solid var(--Gray-200, #eaecf0); + border-top: 1px solid var(--Gray-200, #eaecf0); + border-left: 1px solid var(--Gray-200, #eaecf0); + border-right: 1px solid var(--Gray-200, #eaecf0); background: var(--Gray-25, #ffffff); /* Shadow/sm */ @@ -129,7 +131,7 @@ font-style: normal; font-weight: 400; line-height: 20px; /* 142.857% */ - border-bottom: 1px solid var(--Gray-60, #eaecf0); + border-bottom: 1px solid var(--Gray-200, #eaecf0); } .gridItemImportant { @@ -157,7 +159,7 @@ font-style: normal; font-weight: 400; line-height: 20px; /* 142.857% */ - border-bottom: 1px solid var(--Gray-60, #eaecf0); + border-bottom: 1px solid var(--Gray-200, #eaecf0); } .gridItemInitiate { @@ -172,14 +174,10 @@ font-style: normal; font-weight: 400; line-height: 20px; - border-bottom: 1px solid var(--Gray-60, #eaecf0); + border-bottom: 1px solid var(--Gray-200, #eaecf0); background: var(--Base-White, #eaecf0); } -.gridItem:last-child, .gridItemChild:last-child, .gridItemImportant:last-child, .gridItemInitiate:last-child { - border-bottom: none; -} - .gridNodeCompleted { position: absolute; left: 14px; @@ -203,11 +201,8 @@ gap: 12px; align-self: stretch; border-bottom: 1px solid var(--Gray-200, #eaecf0); - background: var(--Gray-60, #f9fafb); color: var(--Gray-600, #475467); - - /* Text xs/Medium */ font-family: Inter, sans-serif; font-size: 12px; font-style: normal; diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index f54bd28a..a21f122b 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -47,4 +47,9 @@ export const formatBigNumber = (bigNumber: ethers.BigNumber, lengthLimit = 25, u const exponent = bigNumberString.length - 1 - units return `${firstDigit}.${remainingDigits}e+${exponent}` -} \ No newline at end of file +} + +export const parseUntilDelimiter = (input: any) => { + const match = input.match(/^[^\(\[]+/); + return match ? match[0] : input; +} From b682c2d6f1e7eff2ed7534dcc058f59d131def3b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 11 Oct 2024 14:57:48 +0100 Subject: [PATCH 018/266] errors --- .../src/components/bridge/bridge/ActionButton.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 411dc152..40ce1812 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -90,6 +90,7 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl async (amount: string) => { const provider = await getProvider(selectedLowNetwork) if (!provider || !connectedAccount) { + setErrorMessage("Wallet isn't connected") throw new Error("Wallet isn't connected") } const allowance = await fetchERC20Allowance({ @@ -115,6 +116,7 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl messageExecutionCost = estimate.maxFeePerGas.mul(estimate.gasLimit) } } catch (e) { + setErrorMessage('Estimation message execution fee error') console.log(`Estimation message execution fee error: ${e}`) } } From d8da93074e689aa3d6c867abca86a43d317e7ff5 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 11 Oct 2024 16:17:25 +0100 Subject: [PATCH 019/266] added usdc to arb. sepolia --- webapps/world-builder-dashboard/src/utils/tokens.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 6273c67e..7e3992f0 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -62,6 +62,13 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconEthereum, rpc: L2_NETWORK.rpcs[0] }, + { + name: 'USDC', + symbol: 'USDC', + address: '0xf3C3351D6Bd0098EEb33ca8f830FAf2a141Ea2E1', + Icon: IconUSDC, + rpc: L2_NETWORK.rpcs[0] + }, ...storedTokensWithItems ] case L3_NETWORK.chainId: From a1a747acfa0f1331c4be92b21576a62af0ba5792 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 11 Oct 2024 16:18:53 +0100 Subject: [PATCH 020/266] game7 sepolia -> g7 sepolia --- webapps/world-builder-dashboard/constants.ts | 2 +- .../src/components/bridge/settings/SettingsView.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index b7864211..1a8d10cc 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -38,7 +38,7 @@ export const L2_NETWORK: HighNetworkInterface = { export const L3_NETWORK: HighNetworkInterface = { chainId: 13746, name: 'conduit-orbit-deployer', - displayName: 'Game7 Sepolia', + displayName: 'G7 Sepolia', rpcs: ['https://testnet-rpc.game7.io'], blockExplorerUrls: ['https://testnet.game7.io'], nativeCurrency: { diff --git a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx index cabf15be..35ffb73e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx @@ -35,7 +35,7 @@ const SettingsView: React.FC = ({}) => {
-
Game7 Sepolia
+
G7 Sepolia
Request $G7 testnet tokens
From 074fabdb40ed5edf4627eb7e28f4e6a9b43d6e9e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 21 Oct 2024 11:05:52 +0100 Subject: [PATCH 022/266] new condition to enable/disable button if account is new (nextClaimAvailable status is idle and lastFaucetClaimtimestamp is 0), then enable button. otherwise disable the button if the user has already claimed. --- .../src/components/faucet/FaucetView.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 9d4e0910..1ec89c13 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -178,7 +178,7 @@ const FaucetView: React.FC = ({}) => { const isNewAccount = nextClaimAvailable.status === 'idle' && lastClaimedTimestampQuery.data === 0 if (isNewAccount) { - isButtonDisabled = false // Enable button for new accounts or if claim info is still loading + isButtonDisabled = false } else { if (!nextClaimAvailable.data) { isButtonDisabled = true @@ -191,18 +191,18 @@ const FaucetView: React.FC = ({}) => { claim.isLoading } } - console.log(isButtonDisabled) setRequestDisabled(isButtonDisabled) }, [ selectedNetwork.chainId, nextClaimAvailable.data, - nextClaimAvailable.status, // Add status to dependencies + nextClaimAvailable.status, isValidAddress, address, selectedAccountType, claim.isLoading, - lastClaimedTimestampQuery.status // Ensure this dependency is watched + lastClaimedTimestampQuery.status ]) + useEffect(() => { if (!nextClaimAvailable.data) return const intervalInfo = nextClaimAvailable.data.L3 From e5b1f5b1ec9c9da66454e3471d6c854cede49638 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 22 Oct 2024 09:24:32 +0100 Subject: [PATCH 023/266] added g7-bridge-sdk --- webapps/world-builder-dashboard/constants.ts | 17 ++++++ .../world-builder-dashboard/package-lock.json | 56 +++++++++++++------ webapps/world-builder-dashboard/package.json | 1 + 3 files changed, 56 insertions(+), 18 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 1a8d10cc..bc62dba6 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,4 +1,5 @@ import { NetworkInterface, HighNetworkInterface } from '@/contexts/BlockchainContext' +import { TokenAddressMap } from 'game7-bridge-sdk' export const L1_NETWORK: NetworkInterface = { chainId: 11155111, @@ -71,3 +72,19 @@ export const FIVE_MINUTES = 1000 * 60 * 5 export const DEFAULT_STAKE_NATIVE_POOL_ID = '1' export const MAX_ALLOWANCE_ACCOUNT = '0x9ed191DB1829371F116Deb9748c26B49467a592A' + +export const TG7T: TokenAddressMap = { + 13746: '0x0000000000000000000000000000000000000000', + 421614: '0x10adbf84548f923577be12146eac104c899d1e75', + 11155111: '0xe2ef69e4af84dbefb0a75f8491f27a52bf047b01' +} + +export const ETH: TokenAddressMap = { + 421614: '0x0000000000000000000000000000000000000000', + 11155111: '0x0000000000000000000000000000000000000000' +} + +export const F5: TokenAddressMap = { + 11155111: '0x8A0e3350fFAEb5DCcAca6045B3c07646FE9b46e7', + 421614: '0xE48e26A902565f15E9F3a63caf55d339c1b3d49E' +} diff --git a/webapps/world-builder-dashboard/package-lock.json b/webapps/world-builder-dashboard/package-lock.json index 78c16595..831ba24e 100644 --- a/webapps/world-builder-dashboard/package-lock.json +++ b/webapps/world-builder-dashboard/package-lock.json @@ -15,6 +15,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", + "game7-bridge-sdk": "^0.0.49", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", @@ -5157,7 +5158,6 @@ "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "dev": true, "funding": [ { "type": "github", @@ -6879,6 +6879,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/game7-bridge-sdk": { + "version": "0.0.49", + "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.49.tgz", + "integrity": "sha512-epMLzZ6ZqR0ADy/re+ZvwZcphl8+3l1vxhHtXX4cf5hI7EnoonxhZ6W8mJiP3LpQmcZwLZlfG9bkguf5etEIdw==", + "hasInstallScript": true, + "dependencies": { + "@arbitrum/sdk": "4.0.1", + "ethers": "^5.7.2", + "patch-package": "^8.0.0", + "postinstall-postinstall": "^2.1.0" + } + }, + "node_modules/game7-bridge-sdk/node_modules/@arbitrum/sdk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@arbitrum/sdk/-/sdk-4.0.1.tgz", + "integrity": "sha512-uW0Pe/oICbmlHpIpYOaHHWsNQRG+3UbCa3s0SJsp2O1Kt9b0M0CX/fEdFOFLyAi3OxHonNEfzhfvQrALy9C3Yw==", + "dependencies": { + "@ethersproject/address": "^5.0.8", + "@ethersproject/bignumber": "^5.1.1", + "@ethersproject/bytes": "^5.0.8", + "async-mutex": "^0.4.0", + "ethers": "^5.1.0" + }, + "engines": { + "node": ">=v11", + "npm": "please-use-yarn", + "yarn": ">= 1.0.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -7727,8 +7756,7 @@ "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" }, "node_modules/isexe": { "version": "2.0.0", @@ -7830,7 +7858,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz", "integrity": "sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg==", - "dev": true, "dependencies": { "call-bind": "^1.0.5", "isarray": "^2.0.5", @@ -7877,7 +7904,6 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8377,7 +8403,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -8603,7 +8628,6 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-8.0.0.tgz", "integrity": "sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==", - "dev": true, "dependencies": { "@yarnpkg/lockfile": "^1.1.0", "chalk": "^4.1.2", @@ -8633,7 +8657,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -8648,7 +8671,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -8664,7 +8686,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8675,14 +8696,12 @@ "node_modules/patch-package/node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/patch-package/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -8692,7 +8711,6 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -8704,7 +8722,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, "engines": { "node": ">=6" } @@ -8713,7 +8730,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -9054,6 +9070,12 @@ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", "dev": true }, + "node_modules/postinstall-postinstall": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/postinstall-postinstall/-/postinstall-postinstall-2.1.0.tgz", + "integrity": "sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==", + "hasInstallScript": true + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9942,7 +9964,6 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", - "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -11421,7 +11442,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", - "dev": true, "bin": { "yaml": "bin.mjs" }, diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 6e1fb7cb..68f11fd9 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,6 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", + "game7-bridge-sdk": "^0.0.49", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", From e7fa5b96519e7908b05d339e5cd9e9f779983871 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 22 Oct 2024 09:34:25 +0100 Subject: [PATCH 024/266] init bridger --- .../src/components/bridge/bridge/BridgeView.tsx | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 21cb4a9c..21d6ec2d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -6,14 +6,17 @@ import { L1_NETWORK, L2_NETWORK, L3_NETWORK, - MAX_ALLOWANCE_ACCOUNT + MAX_ALLOWANCE_ACCOUNT, + TG7T } from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' +// G7 SDK +import { Bridger } from 'game7-bridge-sdk' +// Components import ActionButton from '@/components/bridge/bridge/ActionButton' import BridgeMessage from '@/components/bridge/bridge/BridgeMessage' -// Components import NetworkSelector from '@/components/bridge/bridge/NetworkSelector' import TransactionSummary from '@/components/bridge/bridge/TransactionSummary' import ValueToBridge from '@/components/bridge/bridge/ValueToBridge' @@ -40,6 +43,7 @@ const BridgeView = ({ direction: DepositDirection setDirection: (arg0: DepositDirection) => void }) => { + const [bridger, setBridger] = useState() const [token, setToken] = useState() const [balance, setBalance] = useState(null) const [value, setValue] = useState('0') @@ -123,10 +127,13 @@ const BridgeView = ({ }) useEffect(() => { - if (token && connectedAccount) { - setBalance(Number(tokenBalance)) // Update the balance when the hook returns it + if (token && connectedAccount && selectedHighNetwork && selectedLowNetwork) { + setBalance(Number(tokenBalance)) + const bridger: Bridger = new Bridger(selectedLowNetwork.chainId, selectedHighNetwork.chainId, TG7T) + setBridger(bridger) + console.log(bridger) } - }, [token, balance, connectedAccount]) + }, [token, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) useEffect(() => { setNetworkErrorMessage('') From 23033acfbc94c4b6bfcd5f6a63a175acb686ed1b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 22 Oct 2024 10:39:50 +0100 Subject: [PATCH 025/266] tokenaddressmap added to token interface --- webapps/world-builder-dashboard/constants.ts | 4 +- .../components/bridge/bridge/BridgeView.tsx | 3 +- .../src/utils/tokens.ts | 47 +++++++++++-------- 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index bc62dba6..c140e6dc 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,5 +1,5 @@ -import { NetworkInterface, HighNetworkInterface } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' +import { NetworkInterface, HighNetworkInterface } from '@/contexts/BlockchainContext' export const L1_NETWORK: NetworkInterface = { chainId: 11155111, @@ -88,3 +88,5 @@ export const F5: TokenAddressMap = { 11155111: '0x8A0e3350fFAEb5DCcAca6045B3c07646FE9b46e7', 421614: '0xE48e26A902565f15E9F3a63caf55d339c1b3d49E' } + +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH, F5] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 21d6ec2d..097b66fc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -129,8 +129,7 @@ const BridgeView = ({ useEffect(() => { if (token && connectedAccount && selectedHighNetwork && selectedLowNetwork) { setBalance(Number(tokenBalance)) - const bridger: Bridger = new Bridger(selectedLowNetwork.chainId, selectedHighNetwork.chainId, TG7T) - setBridger(bridger) + const bridger: Bridger = new Bridger(selectedLowNetwork.chainId, selectedHighNetwork.chainId, token.tokenAddressMap) console.log(bridger) } }, [token, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 7e3992f0..9756295b 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -1,9 +1,10 @@ -import { L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../constants' +import { ETH, L1_NETWORK, L2_NETWORK, L3_NETWORK, TG7T } from '../../constants' import { ZERO_ADDRESS } from './web3utils' import IconEthereum from '@/assets/IconEthereum' import IconG7T from '@/assets/IconG7T' import IconTokenNoSynbol from '@/assets/IconTokenNoSymbol' import IconUSDC from '@/assets/IconUSDC' +import { TokenAddressMap } from 'game7-bridge-sdk' export interface Token { name: string @@ -11,6 +12,7 @@ export interface Token { address: string Icon: React.FC> rpc: string + tokenAddressMap: TokenAddressMap } export const getTokensForNetwork = (chainId: number | undefined, userAddress: string | undefined): Token[] => { @@ -28,21 +30,23 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st symbol: 'TG7T', address: L1_NETWORK.g7TokenAddress, Icon: IconG7T, - rpc: L1_NETWORK.rpcs[0] - }, - { - name: 'USDC', - symbol: 'USDC', - address: '0xf08A50178dfcDe18524640EA6618a1f965821715', - Icon: IconUSDC, - rpc: L1_NETWORK.rpcs[0] + tokenAddressMap: TG7T }, + // { + // name: 'USDC', + // symbol: 'USDC', + // address: '0xf08A50178dfcDe18524640EA6618a1f965821715', + // Icon: IconUSDC, + // rpc: L1_NETWORK.rpcs[0], + // // tokenAddressMap: + // }, { name: 'Ethereum', symbol: 'ETH', address: ZERO_ADDRESS, Icon: IconEthereum, - rpc: L1_NETWORK.rpcs[0] + rpc: L1_NETWORK.rpcs[0], + tokenAddressMap: ETH }, ...storedTokensWithItems ] @@ -53,22 +57,24 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st symbol: 'TG7T', address: L2_NETWORK.g7TokenAddress, Icon: IconG7T, - rpc: L2_NETWORK.rpcs[0] + rpc: L2_NETWORK.rpcs[0], + tokenAddressMap: TG7T }, { name: 'Ethereum', symbol: 'ETH', address: ZERO_ADDRESS, Icon: IconEthereum, - rpc: L2_NETWORK.rpcs[0] - }, - { - name: 'USDC', - symbol: 'USDC', - address: '0xf3C3351D6Bd0098EEb33ca8f830FAf2a141Ea2E1', - Icon: IconUSDC, - rpc: L2_NETWORK.rpcs[0] + rpc: L2_NETWORK.rpcs[0], + tokenAddressMap: ETH }, + // { + // name: 'USDC', + // symbol: 'USDC', + // address: '0xf3C3351D6Bd0098EEb33ca8f830FAf2a141Ea2E1', + // Icon: IconUSDC, + // rpc: L2_NETWORK.rpcs[0], + // }, ...storedTokensWithItems ] case L3_NETWORK.chainId: @@ -78,7 +84,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st symbol: 'TG7T', address: L3_NETWORK.g7TokenAddress, Icon: IconG7T, - rpc: L3_NETWORK.rpcs[0] + rpc: L3_NETWORK.rpcs[0], + tokenAddressMap: TG7T }, ...storedTokensWithItems ] From 0de3cacc42534e4dedfebdefddbea6c408152068 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 22 Oct 2024 11:44:25 +0100 Subject: [PATCH 026/266] making tx's --- .../components/bridge/bridge/ActionButton.tsx | 37 ++++++++++++- .../components/bridge/bridge/BridgeView.tsx | 55 ++++++------------- 2 files changed, 52 insertions(+), 40 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 40ce1812..e3380d27 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' // Constants -import { L3_NETWORK } from '../../../../constants' +import { ALL_NETWORKS, L3_NETWORK } from '../../../../constants' // Styles import styles from './ActionButton.module.css' import { ethers } from 'ethers' @@ -18,8 +18,9 @@ import { depositERC20ArbitrumSDK, TransactionRecord } from '@/utils/bridge/depos import { sendDepositERC20ToNativeTransaction } from '@/utils/bridge/depositERC20ToNative' import { sendWithdrawERC20Transaction } from '@/utils/bridge/withdrawERC20' import { sendWithdrawTransaction } from '@/utils/bridge/withdrawNativeToken' -import { L2ToL1MessageStatus } from '@arbitrum/sdk' import { parseUntilDelimiter } from '@/utils/web3utils' +import { L2ToL1MessageStatus } from '@arbitrum/sdk' +import { Bridger } from 'game7-bridge-sdk' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' @@ -27,8 +28,9 @@ interface ActionButtonProps { isDisabled: boolean L2L3message?: { destination: string; data: string } setErrorMessage: (arg0: string) => void + bridger?: Bridger } -const ActionButton: React.FC = ({ direction, amount, isDisabled, setErrorMessage, L2L3message }) => { +const ActionButton: React.FC = ({ direction, amount, isDisabled, setErrorMessage, L2L3message, bridger }) => { const { connectedAccount, isConnecting, selectedHighNetwork, selectedLowNetwork, connectWallet, getProvider } = useBlockchainContext() const [isAllowanceModalOpened, setIsAllowanceModalOpened] = useState(false) @@ -75,6 +77,8 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl return } setErrorMessage('') + transfer.mutate(String(amount)) + return if (direction === 'DEPOSIT') { deposit.mutate(String(amount)) return @@ -233,6 +237,33 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl } ) + const transfer = useMutation({ + mutationFn: async (amount: string) => { + console.log(bridger) + const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) + console.log(network) + const provider = await getProvider(network!) + const signer = provider.getSigner() + const destinationRPC = selectedHighNetwork.rpcs[0] + const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider + return bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) + }, + onSuccess: (data) => { + console.log(data) + //0x5ce56d7cf0554bec609e995f3f3e98ad495a08fe29e66b91a9d951840fce6674 + // 0x68bb539766ba5fcc6eba8536eaa5ac3f7e346e2eab8b6ebbaa9a976d6b8786ec + //0x630d46c87e1df9ab91b8f6311b711033fc11b95ef3487135af5e0726506f4135 + // 0xc2c6cff17958df71b2507aa41393d9085ad4492b631271a590fdc7a834cb4275 L2->L3 + // 0x9a0d867b6523f1d55bbb0d1b16779c5cb433744f646bd9209f382142bb10ec06 L2->L1 + // 0x4f7aaf3d84d69a27123523deb85827982143c83fe6862eb1dca8c5ebef369740 L3->L2 + // 0x4d011728e4b8002750a0dcb8f2b18d7f17a08c278acda381d26d6eb9c460157f L3->L2 + // 0x8460187b8602c2cf2436f7821836c9097182d550a31cefaa07fb6352c013981e L2->L3 + // 0x6db1d677bc87d64d0adf0ef89d059e0a6b9a8f765af5dc0d2977f9d87aaf8677 L2->L1 ETH + // 0xb5ba500f030e662a3bd4742c8f090b819881c508c9b748d699cf7820253afea8 L2->L1 ETH + // 0x5311d470b7956262ad3329ea75bebb9fc01d9f07dde419e4dbcddae440215415 L2->L1 TG7T + // 0x3b3581e5000f84ddfd22e61e6a800a01ceba6246fb2042816967a0034978e9ec L2->L1 TG7T + } + }) return ( <>
) From d668337d843542a331dd2b464ba40d97731cafa3 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 22 Oct 2024 19:58:52 +0100 Subject: [PATCH 027/266] updated symbol --- .../components/bridge/bridge/BridgeView.tsx | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 3db5fbce..2278db0b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -87,13 +87,15 @@ const BridgeView = ({ setToken(token) } - const estimatedFee = useQuery( ['estimatedFee', bridger, connectedAccount], async () => { try { - console.log('hello') - const fee = await bridger.getGasAndFeeEstimation(ethers.utils.parseEther(value) ?? ethers.utils.parseEther('0'), selectedLowNetwork.rpcs[0], connectedAccount!) + const fee = await bridger.getGasAndFeeEstimation( + value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0.0'), + selectedLowNetwork.rpcs[0], + connectedAccount! + ) const feeFormatted = ethers.utils.formatEther(fee.estimatedFee) return feeFormatted } catch (e) { @@ -105,11 +107,14 @@ const BridgeView = ({ } ) - useEffect(() => { if (token && connectedAccount && selectedHighNetwork && selectedLowNetwork) { setBalance(Number(tokenBalance)) - const bridger: Bridger = new Bridger(selectedLowNetwork.chainId, selectedHighNetwork.chainId, token.tokenAddressMap) + const bridger: Bridger = new Bridger( + selectedLowNetwork.chainId, + selectedHighNetwork.chainId, + token.tokenAddressMap + ) setBridger(bridger) } }, [token, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) @@ -237,11 +242,7 @@ const BridgeView = ({ ethRate={ethUsdRate ?? 0} tokenSymbol={token?.symbol || ''} tokenRate={g7tUsdRate.data ?? 0} - gasTokenSymbol={ - direction === 'DEPOSIT' - ? (selectedLowNetwork.nativeCurrency?.symbol ?? '') - : (selectedHighNetwork.nativeCurrency?.symbol ?? '') - } + gasTokenSymbol={token?.symbol ?? ''} /> {networkErrorMessage &&
{networkErrorMessage}
} ) From 631d112273f8c55ec7dea30926a8085fbabef55a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 22 Oct 2024 20:51:22 +0100 Subject: [PATCH 028/266] updated balance --- .../components/bridge/bridge/ActionButton.tsx | 33 +++++++++---------- .../bridge/TransactionSummary.module.css | 1 + .../bridge/bridge/TransactionSummary.tsx | 2 +- .../src/utils/tokens.ts | 4 +-- 4 files changed, 19 insertions(+), 21 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index e3380d27..f8a6f916 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -7,6 +7,7 @@ import { ALL_NETWORKS, L3_NETWORK } from '../../../../constants' // Styles import styles from './ActionButton.module.css' import { ethers } from 'ethers' +import { Bridger } from 'game7-bridge-sdk' import { Modal } from 'summon-ui/mantine' // Absolute Imports import ApproveAllowance from '@/components/bridge/allowance/ApproveAllowance' @@ -19,8 +20,7 @@ import { sendDepositERC20ToNativeTransaction } from '@/utils/bridge/depositERC20 import { sendWithdrawERC20Transaction } from '@/utils/bridge/withdrawERC20' import { sendWithdrawTransaction } from '@/utils/bridge/withdrawNativeToken' import { parseUntilDelimiter } from '@/utils/web3utils' -import { L2ToL1MessageStatus } from '@arbitrum/sdk' -import { Bridger } from 'game7-bridge-sdk' +import { ChildToParentMessageStatus } from '@arbitrum/sdk' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' @@ -30,7 +30,14 @@ interface ActionButtonProps { setErrorMessage: (arg0: string) => void bridger?: Bridger } -const ActionButton: React.FC = ({ direction, amount, isDisabled, setErrorMessage, L2L3message, bridger }) => { +const ActionButton: React.FC = ({ + direction, + amount, + isDisabled, + setErrorMessage, + L2L3message, + bridger +}) => { const { connectedAccount, isConnecting, selectedHighNetwork, selectedLowNetwork, connectWallet, getProvider } = useBlockchainContext() const [isAllowanceModalOpened, setIsAllowanceModalOpened] = useState(false) @@ -217,7 +224,7 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl () => { return { timestamp: new Date().getTime() / 1000, - status: L2ToL1MessageStatus.UNCONFIRMED, + status: ChildToParentMessageStatus.UNCONFIRMED, value: record.amount, confirmations: 1 } @@ -239,9 +246,7 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl const transfer = useMutation({ mutationFn: async (amount: string) => { - console.log(bridger) const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) - console.log(network) const provider = await getProvider(network!) const signer = provider.getSigner() const destinationRPC = selectedHighNetwork.rpcs[0] @@ -250,20 +255,12 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl }, onSuccess: (data) => { console.log(data) - //0x5ce56d7cf0554bec609e995f3f3e98ad495a08fe29e66b91a9d951840fce6674 - // 0x68bb539766ba5fcc6eba8536eaa5ac3f7e346e2eab8b6ebbaa9a976d6b8786ec - //0x630d46c87e1df9ab91b8f6311b711033fc11b95ef3487135af5e0726506f4135 - // 0xc2c6cff17958df71b2507aa41393d9085ad4492b631271a590fdc7a834cb4275 L2->L3 - // 0x9a0d867b6523f1d55bbb0d1b16779c5cb433744f646bd9209f382142bb10ec06 L2->L1 - // 0x4f7aaf3d84d69a27123523deb85827982143c83fe6862eb1dca8c5ebef369740 L3->L2 - // 0x4d011728e4b8002750a0dcb8f2b18d7f17a08c278acda381d26d6eb9c460157f L3->L2 - // 0x8460187b8602c2cf2436f7821836c9097182d550a31cefaa07fb6352c013981e L2->L3 - // 0x6db1d677bc87d64d0adf0ef89d059e0a6b9a8f765af5dc0d2977f9d87aaf8677 L2->L1 ETH - // 0xb5ba500f030e662a3bd4742c8f090b819881c508c9b748d699cf7820253afea8 L2->L1 ETH - // 0x5311d470b7956262ad3329ea75bebb9fc01d9f07dde419e4dbcddae440215415 L2->L1 TG7T - // 0x3b3581e5000f84ddfd22e61e6a800a01ceba6246fb2042816967a0034978e9ec L2->L1 TG7T + }, + onError: (e) => { + console.log(e) } }) + return ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 2278db0b..fc38c768 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -91,12 +91,12 @@ const BridgeView = ({ ['estimatedFee', bridger, connectedAccount], async () => { try { - const fee = await bridger.getGasAndFeeEstimation( + const fee = await bridger?.getGasAndFeeEstimation( value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0.0'), selectedLowNetwork.rpcs[0], connectedAccount! ) - const feeFormatted = ethers.utils.formatEther(fee.estimatedFee) + const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || "") return feeFormatted } catch (e) { console.error(e) From b8f0cf5b7ce2ad6f23f6e42b48c7e08bea5329ac Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 23 Oct 2024 19:58:45 +0100 Subject: [PATCH 030/266] notifications looking good --- webapps/world-builder-dashboard/constants.ts | 7 +--- .../components/bridge/bridge/ActionButton.tsx | 32 ++++++++++++++++--- .../components/bridge/bridge/BridgeView.tsx | 11 +++---- .../bridge/history/HistoryDesktop.tsx | 5 +-- 4 files changed, 34 insertions(+), 21 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index c140e6dc..537779f2 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -84,9 +84,4 @@ export const ETH: TokenAddressMap = { 11155111: '0x0000000000000000000000000000000000000000' } -export const F5: TokenAddressMap = { - 11155111: '0x8A0e3350fFAEb5DCcAca6045B3c07646FE9b46e7', - 421614: '0xE48e26A902565f15E9F3a63caf55d339c1b3d49E' -} - -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH, F5] +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index c22d9a6a..8b45274d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -234,14 +234,39 @@ const ActionButton: React.FC = ({ amount, isDisabled, setErro const signer = provider.getSigner() const destinationRPC = selectedHighNetwork.rpcs[0] const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider + // If deposit if (bridger?.isDeposit) { const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' + // approve first if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { - await bridger.approve(ethers.utils.parseEther(amount), signer) - transfer.mutate(String(amount)) + const approveTx = await bridger?.approve(ethers.utils.parseEther(amount), signer) + await approveTx.wait() + } + const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) + await tx.wait() + return { + type: 'DEPOSIT', + amount, + lowNetworkChainId: selectedLowNetwork.chainId, + highNetworkChainId: selectedHighNetwork.chainId, + lowNetworkHash: tx.hash, + lowNetworkTimestamp: Date.now() / 1000, + completionTimestamp: Date.now() / 1000, + newTransaction: true + } + } else { + const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) + await tx?.wait() + return { + type: 'WITHDRAWAL', + amount: amount, + lowNetworkChainId: selectedLowNetwork.chainId, + highNetworkChainId: selectedHighNetwork.chainId, + highNetworkHash: tx?.hash, + highNetworkTimestamp: Date.now() / 1000, + challengePeriod: 60 * 60 } } - return await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) }, { onSuccess: async (record: any) => { @@ -260,7 +285,6 @@ const ActionButton: React.FC = ({ amount, isDisabled, setErro queryClient.refetchQueries(['nativeBalance']) queryClient.refetchQueries(['pendingNotifications']) queryClient.refetchQueries(['incomingMessages']) - navigate('/bridge/transactions') }, onError: (e) => { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index fc38c768..2d354b6d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -96,7 +96,7 @@ const BridgeView = ({ selectedLowNetwork.rpcs[0], connectedAccount! ) - const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || "") + const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '') return feeFormatted } catch (e) { console.error(e) @@ -110,11 +110,9 @@ const BridgeView = ({ useEffect(() => { if (token && connectedAccount && selectedHighNetwork && selectedLowNetwork) { setBalance(Number(tokenBalance)) - const bridger: Bridger = new Bridger( - selectedLowNetwork.chainId, - selectedHighNetwork.chainId, - token.tokenAddressMap - ) + const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId + const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId + const bridger: Bridger = new Bridger(originChainId, destinationChainId, token.tokenAddressMap) setBridger(bridger) } }, [token, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) @@ -126,7 +124,6 @@ const BridgeView = ({ useEffect(() => { if (message.data === 'stake') { if (!L3_NETWORK.staker) { - console.log('staker is undefined') return } setDataForStake(L3_NETWORK.staker) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index bfb83013..35a8876e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -1,9 +1,7 @@ // External Libraries import React, { Fragment } from 'react' - // Styles import styles from './WithdrawTransactions.module.css' - // Absolute Imports import Deposit from '@/components/bridge/history/Deposit' import Withdrawal from '@/components/bridge/history/Withdrawal' @@ -16,7 +14,6 @@ const HistoryDesktop: React.FC = () => { const { connectedAccount } = useBlockchainContext() const messages = useMessages(connectedAccount) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - return (
@@ -32,7 +29,7 @@ const HistoryDesktop: React.FC = () => { .filter((tx) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .map((tx: TransactionRecord, idx: number) => tx.type === 'WITHDRAWAL' ? ( - + ) : ( {tx.lowNetworkHash && } ) From 4673508bde72dc08c3cb1d1006c214f05e2ff0bd Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 10:08:59 +0100 Subject: [PATCH 031/266] fix notif. and added symbol to actionbutton to propdrill into notif. --- .../components/bridge/bridge/ActionButton.tsx | 67 ++++--------------- .../components/bridge/bridge/BridgeView.tsx | 16 +---- .../src/components/bridge/history/Deposit.tsx | 6 +- .../components/bridge/history/Withdrawal.tsx | 13 ++-- .../notifications/NotificationsDropModal.tsx | 6 +- .../utils/bridge/depositERC20ArbitrumSDK.ts | 1 + 6 files changed, 27 insertions(+), 82 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 8b45274d..40e70030 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -18,7 +18,6 @@ import { estimateCreateRetryableTicketFee, sendL2ToL3Message } from '@/utils/bri import { depositERC20ArbitrumSDK, TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { sendDepositERC20ToNativeTransaction } from '@/utils/bridge/depositERC20ToNative' import { parseUntilDelimiter } from '@/utils/web3utils' -import { ChildToParentMessageStatus } from '@arbitrum/sdk' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' @@ -27,8 +26,16 @@ interface ActionButtonProps { L2L3message?: { destination: string; data: string } setErrorMessage: (arg0: string) => void bridger?: Bridger + symbol?: string } -const ActionButton: React.FC = ({ amount, isDisabled, setErrorMessage, L2L3message, bridger }) => { +const ActionButton: React.FC = ({ + amount, + isDisabled, + setErrorMessage, + L2L3message, + bridger, + symbol +}) => { const { connectedAccount, isConnecting, selectedHighNetwork, selectedLowNetwork, connectWallet, getProvider } = useBlockchainContext() const [isAllowanceModalOpened, setIsAllowanceModalOpened] = useState(false) @@ -177,56 +184,6 @@ const ActionButton: React.FC = ({ amount, isDisabled, setErro } ) - // const withdraw = useMutation( - // async (amount: string) => { - // const provider = await getProvider(selectedHighNetwork) - // const signer = provider.getSigner() - // if (!provider || !connectedAccount) { - // throw new Error("Wallet isn't connected") - // } - // if (selectedHighNetwork.chainId !== L3_NETWORK.chainId) { - // return sendWithdrawERC20Transaction(amount, connectedAccount, signer) - // } - // return sendWithdrawTransaction(amount, connectedAccount, signer) - // }, - // { - // onSuccess: async (record: TransactionRecord) => { - // try { - // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - // let transactions = [] - // if (transactionsString) { - // transactions = JSON.parse(transactionsString) - // } - // transactions.push(record) - // localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(transactions)) - // } catch (e) { - // console.log(e) - // } - // queryClient.setQueryData( - // ['withdrawalStatus', record.highNetworkHash, selectedLowNetwork.rpcs[0], selectedHighNetwork.rpcs[0]], - // () => { - // return { - // timestamp: new Date().getTime() / 1000, - // status: ChildToParentMessageStatus.UNCONFIRMED, - // value: record.amount, - // confirmations: 1 - // } - // } - // ) - // queryClient.refetchQueries(['ERC20Balance']) - // queryClient.refetchQueries(['nativeBalance']) - // queryClient.refetchQueries(['pendingNotifications']) - // queryClient.refetchQueries(['incomingMessages']) - - // navigate('/bridge/transactions') - // }, - // onError: (e) => { - // console.log(e) - // setErrorMessage('Something went wrong. Try again, please') - // } - // } - // ) - const transfer = useMutation( async (amount: string) => { const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) @@ -252,7 +209,8 @@ const ActionButton: React.FC = ({ amount, isDisabled, setErro lowNetworkHash: tx.hash, lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, - newTransaction: true + newTransaction: true, + symbol } } else { const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) @@ -264,7 +222,8 @@ const ActionButton: React.FC = ({ amount, isDisabled, setErro highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: 60 * 60 + challengePeriod: 60 * 60, + symbol } } }, diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 2d354b6d..58129c1c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -1,14 +1,7 @@ // Libraries import { useEffect, useState } from 'react' import { useQuery } from 'react-query' -import { - DEFAULT_STAKE_NATIVE_POOL_ID, - L1_NETWORK, - L2_NETWORK, - L3_NETWORK, - MAX_ALLOWANCE_ACCOUNT, - TG7T -} from '../../../../constants' +import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' @@ -21,7 +14,7 @@ import NetworkSelector from '@/components/bridge/bridge/NetworkSelector' import TransactionSummary from '@/components/bridge/bridge/TransactionSummary' import ValueToBridge from '@/components/bridge/bridge/ValueToBridge' // Blockchain Context and Utility Functions -import { HighNetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useUISettings } from '@/contexts/UISettingsContext' // Hooks and Constants import useERC20Balance from '@/hooks/useERC20Balance' @@ -29,11 +22,7 @@ import useEthUsdRate from '@/hooks/useEthUsdRate' import useNativeBalance from '@/hooks/useNativeBalance' import useTokenBalance from '@/hooks/useTokenBalance' import { DepositDirection } from '@/pages/BridgePage/BridgePage' -import { estimateOutboundTransferGas } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { estimateDepositERC20ToNativeFee } from '@/utils/bridge/depositERC20ToNative' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' -import { estimateWithdrawGasAndFee } from '@/utils/bridge/withdrawERC20' -import { estimateWithdrawFee } from '@/utils/bridge/withdrawNativeToken' import { Token } from '@/utils/tokens' const BridgeView = ({ @@ -249,6 +238,7 @@ const BridgeView = ({ setErrorMessage={setNetworkErrorMessage} L2L3message={isMessageExpanded ? message : { data: '', destination: '' }} bridger={bridger} + symbol={token?.symbol} />
) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 13f9d801..4333b84a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { HIGH_NETWORKS, L3_NATIVE_TOKEN_SYMBOL, LOW_NETWORKS } from '../../../../constants' +import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { Skeleton } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' @@ -37,7 +37,7 @@ const Deposit: React.FC = ({ deposit }) => {
{timeAgo(deposit.lowNetworkTimestamp)}
-
{`${deposit.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${deposit.amount} ${deposit.symbol}`}
{depositInfo.from}
{depositInfo.to}
<> @@ -56,7 +56,7 @@ const Deposit: React.FC = ({ deposit }) => {
Pending -
+ )}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 6046c620..9327c12a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -4,7 +4,6 @@ import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, - L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' @@ -167,7 +166,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${status.data?.amount} ${status.data}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -189,7 +188,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
Initiate
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -205,15 +204,13 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
- {timeAgo(status.data.lowNetworkTimeStamp)} -
+
{timeAgo(status.data.lowNetworkTimeStamp)}
Finalize
{timeAgo(withdrawal?.completionTimestamp)}
-
{`${status.data?.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -242,7 +239,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
{status.data?.status === L2ToL1MessageStatus.CONFIRMED && ( diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 43aef2e6..ade11e36 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -25,16 +25,14 @@ interface NotificationsDropModalProps { const copy = (notification: BridgeNotification) => { const targetNetwork = getNetwork(notification.to)?.displayName ?? 'unknown chain' if (notification.status === 'CLAIMABLE') { - return `Heads Up: Your ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL} withdrawal is complete and you can now claim your assets` + return `Heads Up: Your ${notification.amount} ${notification.tx.symbol} withdrawal is complete and you can now claim your assets` } if (notification.status === 'COMPLETED') { if (notification.type === 'DEPOSIT') { return `${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL} deposited to ${targetNetwork}` } if (notification.type === 'CLAIM') { - return ( - `You requested ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL}` - ) + return `You requested ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL}` } return `Your ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL} withdrawal is complete` } diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts index 610c80a8..4698115a 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts @@ -36,6 +36,7 @@ export interface TransactionRecord { claimableTimestamp?: number newTransaction?: boolean isFailed?: boolean + symbol?: string } export const depositERC20ArbitrumSDK = async ( From 9d23e4a20b1d62a84127532e4d838fe9fb0a7d03 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 10:20:48 +0100 Subject: [PATCH 032/266] update symbols --- .../src/components/bridge/history/DepositMobile.tsx | 2 +- .../src/components/bridge/history/HistoryMobile.tsx | 7 ++++--- .../src/components/bridge/history/Withdrawal.tsx | 1 - .../src/components/bridge/history/WithdrawalMobile.tsx | 3 +-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index 3e5c5863..d653b5ce 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -23,7 +23,7 @@ const DepositMobile: React.FC = ({ deposit }) => {
Deposit
-
{`${deposit.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${deposit.amount} ${deposit.symbol}`}
{!isCollapsed && ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx index 7b2440f2..4374d19c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx @@ -3,7 +3,8 @@ import styles from './HistoryMobile.module.css' import DepositMobile from '@/components/bridge/history/DepositMobile' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { useMessages } from '@/hooks/useL2ToL1MessageStatus' +import { Transaction, useMessages } from '@/hooks/useL2ToL1MessageStatus' +import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' interface HistoryMobileProps {} const HistoryMobile: React.FC = ({}) => { @@ -13,8 +14,8 @@ const HistoryMobile: React.FC = ({}) => { return (
{messages.data && - messages.data.map((tx) => - tx.type === 'DEPOSIT' ? : + messages.data.map((tx: TransactionRecord, idx: number) => + tx.type === 'DEPOSIT' ? : )}
) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 9327c12a..2b995552 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -63,7 +63,6 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK - const status = getStatus(withdrawal) const { switchChain, connectedAccount } = useBlockchainContext() const queryClient = useQueryClient() diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index c38fba4c..1ec4285b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -1,5 +1,4 @@ import React, { useState } from 'react' -import { L3_NATIVE_TOKEN_SYMBOL } from '../../../../constants' import styles from './DepositMobile.module.css' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import parentStyles from '@/components/bridge/history/WithdrawTransactions.module.css' @@ -21,7 +20,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute
Withdraw
-
{`${withdrawal.amount} ${L3_NATIVE_TOKEN_SYMBOL}`}
+
{`${withdrawal.amount} ${withdrawal.symbol}`}
{!isCollapsed && ( <> From d3b29247c19fa3fd6f9b62cd17bb1b214b858b9c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 12:06:27 +0100 Subject: [PATCH 033/266] fix styles --- .../bridge/history/HistoryMobile.tsx | 4 ++-- .../components/bridge/history/Withdrawal.tsx | 23 ++++++++++--------- .../tokenSelector/TokenSelector.module.css | 2 -- .../tokenSelector/TokenSelector.tsx | 4 ++-- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx index 4374d19c..d80ebb57 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx @@ -3,7 +3,7 @@ import styles from './HistoryMobile.module.css' import DepositMobile from '@/components/bridge/history/DepositMobile' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { Transaction, useMessages } from '@/hooks/useL2ToL1MessageStatus' +import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' interface HistoryMobileProps {} @@ -15,7 +15,7 @@ const HistoryMobile: React.FC = ({}) => {
{messages.data && messages.data.map((tx: TransactionRecord, idx: number) => - tx.type === 'DEPOSIT' ? : + tx.type === 'DEPOSIT' ? : )}
) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 2b995552..65d9bcd3 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,12 +1,6 @@ import React from 'react' import { useMutation, useQueryClient } from 'react-query' -import { - HIGH_NETWORKS, - L1_NETWORK, - L2_NETWORK, - L3_NETWORK, - LOW_NETWORKS -} from '../../../../constants' +import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' import { Skeleton } from 'summon-ui/mantine' @@ -68,7 +62,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const queryClient = useQueryClient() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') - + + // Mutate function const execute = useMutation( async (highNetworkHash: string | undefined) => { if (!highNetworkHash) { @@ -105,16 +100,21 @@ const Withdrawal: React.FC = ({ withdrawal }) => { if (transactionsString) { transactions = JSON.parse(transactionsString) } - const newTransactions: TransactionRecord[] = transactions.map((t: any) => { + const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + console.log(t) + console.log(highNetworkHash) if (t.highNetworkHash === highNetworkHash) { + console.log('equal and pushing symbol') return { ...t, completionTimestamp: Date.now() / 1000, lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, - lowNetworkHash: data.transactionHash + lowNetworkHash: data.transactionHash, + symbol: t.symbol } } + console.log('not equal') return { ...t } }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) @@ -137,6 +137,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { } } ) + if (!status) { return <> } @@ -260,7 +261,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { className={styles.claimButton} onClick={() => execute.mutate(status.data.highNetworkHash)} > - {execute.isLoading ? 'Claiming...' : 'Claim Now'} + {execute.isLoading && !execute.isSuccess ? 'Claiming...' : 'Claim Now'}
diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.module.css index b557a33f..69fb4cf3 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.module.css +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.module.css @@ -46,7 +46,6 @@ } .options { - width: fit-content !important; display: flex !important; padding: 2px 6px !important; padding-top: 10px !important; @@ -57,7 +56,6 @@ } .option { - display: flex; align-items: center !important; padding: 2px 6px !important; padding-bottom: 10px !important; diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index 07f741d1..8f4e16b3 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -1,4 +1,4 @@ -import { useEffect, useState } from 'react' +import { useState } from 'react' import { ALL_NETWORKS } from '../../../../constants' import styles from './TokenSelector.module.css' import { ethers } from 'ethers' @@ -54,7 +54,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected if (tokens.find((token: Token) => token.address === tokenAddress)) { setError("Can't add the same token!") - return; + return } const updatedTokens = [...existingTokens, token] localStorage.setItem(storageKey, JSON.stringify(updatedTokens)) From 10b434b261fbf732411b90fe036204ed76a2b6fd Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 12:43:32 +0100 Subject: [PATCH 034/266] isChainId Valid --- .../tokenSelector/TokenSelector.tsx | 41 +++++++++++-------- .../src/utils/tokens.ts | 15 ------- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index 8f4e16b3..df2ed121 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -24,7 +24,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected const [tokenAddress, setTokenAddress] = useState('') const [error, setError] = useState('') - const { connectedAccount } = useBlockchainContext() + const { connectedAccount, selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() const handleTokenInput = (tokenAddress: string) => { setTokenAddress(tokenAddress) @@ -95,23 +95,30 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected - {tokens.map((n) => ( - - -
-
- {} - {n.symbol} + {tokens.map((n: Token) => { + const highNetworkChainId = String(selectedHighNetwork.chainId) + const lowNetworkChainId = String(selectedLowNetwork.chainId) + const isChainIdValid = + Object.keys(n.tokenAddressMap).includes(highNetworkChainId) && + Object.keys(n.tokenAddressMap).includes(lowNetworkChainId) + return ( + + +
+
+ {} + {n.symbol} +
+ {n.address === selectedToken.address && }
- {n.address === selectedToken.address && } -
- - - ))} + + + ) + })}
diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 2ec257a6..89ee33e1 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -32,14 +32,6 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: TG7T, rpc: L1_NETWORK.rpcs[0] }, - // { - // name: 'USDC', - // symbol: 'USDC', - // address: '0xf08A50178dfcDe18524640EA6618a1f965821715', - // Icon: IconUSDC, - // rpc: L1_NETWORK.rpcs[0], - // // tokenAddressMap: - // }, { name: 'Ethereum', symbol: 'ETH', @@ -68,13 +60,6 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st rpc: L2_NETWORK.rpcs[0], tokenAddressMap: ETH }, - // { - // name: 'USDC', - // symbol: 'USDC', - // address: '0xf3C3351D6Bd0098EEb33ca8f830FAf2a141Ea2E1', - // Icon: IconUSDC, - // rpc: L2_NETWORK.rpcs[0], - // }, ...storedTokensWithItems ] case L3_NETWORK.chainId: From e8ff29970e91ae337005685f7924dfa6f51c0334 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 14:16:32 +0100 Subject: [PATCH 035/266] NetworkSelector disable selection if chainid does not match tokenAddr. --- .../components/bridge/bridge/BridgeView.tsx | 23 ++++++----- .../bridge/bridge/NetworkSelector.tsx | 40 +++++++++++-------- .../bridge/bridge/ValueToBridge.tsx | 9 ++--- .../tokenSelector/TokenSelector.tsx | 5 +-- .../src/contexts/BlockchainContext.tsx | 10 ++++- 5 files changed, 50 insertions(+), 37 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 58129c1c..10cb270e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -33,7 +33,6 @@ const BridgeView = ({ setDirection: (arg0: DepositDirection) => void }) => { const [bridger, setBridger] = useState() - const [token, setToken] = useState() const [balance, setBalance] = useState(null) const [value, setValue] = useState('0') const [message, setMessage] = useState<{ destination: string; data: string }>({ destination: '', data: '' }) @@ -43,7 +42,7 @@ const BridgeView = ({ const { isMessagingEnabled } = useUISettings() const g7tUsdRate = useQuery(['rate'], () => 2501.32) const { data: ethUsdRate } = useEthUsdRate() - const { connectedAccount, selectedLowNetwork, setSelectedLowNetwork, selectedHighNetwork, setSelectedHighNetwork } = + const { connectedAccount, selectedLowNetwork, setSelectedLowNetwork, selectedHighNetwork, setSelectedHighNetwork, setSelectedBridgeToken, selectedBridgeToken } = useBlockchainContext() const { isFetching: isFetchingLowNetworkBalance } = useERC20Balance({ @@ -70,10 +69,10 @@ const BridgeView = ({ rpc: selectedHighNetwork.rpcs[0] }) - const { balance: tokenBalance } = useTokenBalance(token?.address || '', token?.rpc || '', connectedAccount) + const { balance: tokenBalance } = useTokenBalance(selectedBridgeToken?.address || '', selectedBridgeToken?.rpc || '', connectedAccount) const handleTokenChange = (token: Token) => { - setToken(token) + setSelectedBridgeToken(token) } const estimatedFee = useQuery( @@ -97,14 +96,14 @@ const BridgeView = ({ ) useEffect(() => { - if (token && connectedAccount && selectedHighNetwork && selectedLowNetwork) { + if (selectedBridgeToken && connectedAccount && selectedHighNetwork && selectedLowNetwork) { setBalance(Number(tokenBalance)) const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId - const bridger: Bridger = new Bridger(originChainId, destinationChainId, token.tokenAddressMap) + const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) setBridger(bridger) } - }, [token, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) + }, [selectedBridgeToken, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) useEffect(() => { setNetworkErrorMessage('') @@ -134,6 +133,7 @@ const BridgeView = ({ networks={[L1_NETWORK, L2_NETWORK]} selectedNetwork={selectedLowNetwork} onChange={setSelectedLowNetwork} + selectedToken={selectedBridgeToken} /> ) } else { @@ -142,6 +142,7 @@ const BridgeView = ({ networks={[L2_NETWORK, L3_NETWORK]} selectedNetwork={selectedHighNetwork} onChange={setSelectedHighNetwork} + selectedToken={selectedBridgeToken} /> ) } @@ -182,7 +183,7 @@ const BridgeView = ({
{networkErrorMessage &&
{networkErrorMessage}
}
) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index cf4d1961..3db94b2d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -7,14 +7,16 @@ import IconChevronDown from '@/assets/IconChevronDown' import IconEthereum from '@/assets/IconEthereum' import IconG7T from '@/assets/IconG7T' import { HighNetworkInterface, NetworkInterface } from '@/contexts/BlockchainContext' +import { Token } from '@/utils/tokens' type NetworkSelectorProps = { networks: NetworkInterface[] selectedNetwork: NetworkInterface onChange: (network: NetworkInterface | HighNetworkInterface) => void + selectedToken: Token } & InputBaseProps -const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelectorProps) => { +const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: NetworkSelectorProps) => { const combobox = useCombobox({ onDropdownClose: () => combobox.resetSelectedOption() }) @@ -62,23 +64,27 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelecto - {networks.map((n) => ( - - -
-
- {networkLogo(n.chainId)} - {n.displayName} + {networks.map((n) => { + const chainIds = Object.keys(selectedToken.tokenAddressMap) + const isDisabled = chainIds.includes(String(n.chainId)) + return ( + + +
+
+ {networkLogo(n.chainId)} + {n.displayName} +
+ {n.chainId === selectedNetwork.chainId && }
- {n.chainId === selectedNetwork.chainId && } -
- - - ))} + + + ) + })} diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index ad180cbf..898001ad 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -39,8 +39,7 @@ const ValueToBridge: React.FC = ({ selectedChainId }) => { const [tokens, setTokens] = useState([]) - const [token, setToken] = useState() - const { connectedAccount } = useBlockchainContext() + const { connectedAccount, selectedBridgeToken, setSelectedBridgeToken } = useBlockchainContext() const getTokens = async () => { const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) @@ -72,7 +71,7 @@ const ValueToBridge: React.FC = ({ }, [connectedAccount]) const handleTokenChange = (token: Token) => { - setToken(token) + setSelectedBridgeToken(token) onTokenChange(token) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) setTokens(_tokens) @@ -95,10 +94,10 @@ const ValueToBridge: React.FC = ({ - {tokens.length > 0 && token && ( + {tokens.length > 0 && selectedBridgeToken && ( handleTokenChange(token)} onTokenAdded={getTokens} selectedChainId={selectedChainId} diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index df2ed121..c220bdc2 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -98,9 +98,8 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected {tokens.map((n: Token) => { const highNetworkChainId = String(selectedHighNetwork.chainId) const lowNetworkChainId = String(selectedLowNetwork.chainId) - const isChainIdValid = - Object.keys(n.tokenAddressMap).includes(highNetworkChainId) && - Object.keys(n.tokenAddressMap).includes(lowNetworkChainId) + const chainIds = Object.keys(n.tokenAddressMap ?? []) + const isChainIdValid = chainIds.includes(highNetworkChainId) && chainIds.includes(lowNetworkChainId) return ( diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index ca9b001e..79e07383 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -2,6 +2,7 @@ import React, { createContext, useContext, ReactNode, useState, useEffect } from 'react' import { DEFAULT_HIGH_NETWORK, DEFAULT_LOW_NETWORK, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../constants' import { ethers } from 'ethers' +import { getTokensForNetwork, Token } from '@/utils/tokens' interface BlockchainContextType { walletProvider?: ethers.providers.Web3Provider @@ -14,6 +15,8 @@ interface BlockchainContextType { setSelectedLowNetwork: (network: NetworkInterface) => void selectedHighNetwork: NetworkInterface setSelectedHighNetwork: (network: NetworkInterface) => void + selectedBridgeToken: Token + setSelectedBridgeToken: (token: Token) => void isMetaMask: boolean getProvider: (network: NetworkInterface) => Promise accounts: string[] @@ -63,6 +66,9 @@ export const BlockchainProvider: React.FC = ({ children const [chainId, setChainId] = useState(undefined) const [connectedAccount, setConnectedAccount] = useState() const [accounts, setAccounts] = useState(['']) + const [selectedBridgeToken, setSelectedBridgeToken] = useState( + getTokensForNetwork(DEFAULT_LOW_NETWORK.chainId, connectedAccount)[0] + ) const tokenAddress = '0x5f88d811246222F6CB54266C42cc1310510b9feA' const setSelectedLowNetwork = (network: NetworkInterface) => { @@ -255,7 +261,9 @@ export const BlockchainProvider: React.FC = ({ children getProvider, isConnecting, accounts, - setAccounts + setAccounts, + setSelectedBridgeToken, + selectedBridgeToken }} > {children} From fe5422fbe86ac5e4a1af41d10264113b96e80673 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 14:28:16 +0100 Subject: [PATCH 036/266] correct symbol --- .../src/components/bridge/history/Withdrawal.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 65d9bcd3..b4b5d77a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -166,7 +166,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${status.data}`}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
From 1fcd82527563f23c0323a2a609d70e1e40e0b384 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 24 Oct 2024 15:38:06 +0100 Subject: [PATCH 037/266] Initialized BridgeTransfer on each Withdrawal --- .../components/bridge/history/Withdrawal.tsx | 24 +++++++++++++------ .../bridge/history/WithdrawalMobile.tsx | 7 +++--- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index b4b5d77a..cbcc1879 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,8 +1,9 @@ -import React from 'react' +import React, { useEffect } from 'react' import { useMutation, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' +import { BridgeTransfer } from 'game7-bridge-sdk' import { Skeleton } from 'summon-ui/mantine' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' @@ -58,11 +59,11 @@ export const getStatus = (withdrawal: TransactionRecord) => { const Withdrawal: React.FC = ({ withdrawal }) => { const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK const status = getStatus(withdrawal) - const { switchChain, connectedAccount } = useBlockchainContext() + const { switchChain, connectedAccount, selectedLowNetwork, selectedHighNetwork } = useBlockchainContext() const queryClient = useQueryClient() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') - + // Mutate function const execute = useMutation( async (highNetworkHash: string | undefined) => { @@ -104,17 +105,14 @@ const Withdrawal: React.FC = ({ withdrawal }) => { console.log(t) console.log(highNetworkHash) if (t.highNetworkHash === highNetworkHash) { - console.log('equal and pushing symbol') return { ...t, completionTimestamp: Date.now() / 1000, lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, - lowNetworkHash: data.transactionHash, - symbol: t.symbol + lowNetworkHash: data.transactionHash } } - console.log('not equal') return { ...t } }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) @@ -138,6 +136,18 @@ const Withdrawal: React.FC = ({ withdrawal }) => { } ) + useEffect(() => { + if (!withdrawal) return + const bridgeTransfer = new BridgeTransfer({ + txHash: withdrawal.highNetworkHash || '', + destinationNetworkChainId: selectedLowNetwork.chainId, + originNetworkChainId: selectedLowNetwork.chainId, + originSignerOrProviderOrRpc: selectedHighNetwork.rpcs[0], + destinationSignerOrProviderOrRpc: selectedLowNetwork.rpcs[0] + }) + console.log(bridgeTransfer) + }, [withdrawal]) + if (!status) { return <> } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 1ec4285b..abebc2d6 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -1,12 +1,12 @@ import React, { useState } from 'react' import styles from './DepositMobile.module.css' import IconLinkExternal02 from '@/assets/IconLinkExternal02' +import IconWithdrawalNodeCompletedMobile from '@/assets/IconWithdrawalNodeCompletedMobile' import parentStyles from '@/components/bridge/history/WithdrawTransactions.module.css' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' import { L2ToL1MessageStatus } from '@arbitrum/sdk' -import IconWithdrawalNodeCompletedMobile from '@/assets/IconWithdrawalNodeCompletedMobile' interface WithdrawalMobileProps { withdrawal: TransactionRecord @@ -15,6 +15,7 @@ interface WithdrawalMobileProps { } const WithdrawalMobile: React.FC = ({ withdrawal, execute, status }) => { const [isCollapsed, setIsCollapsed] = useState(true) + console.log(execute) return (
@@ -25,7 +26,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute {!isCollapsed && ( <>
- +
Transaction
{status.data?.status === L2ToL1MessageStatus.EXECUTED && ( = ({ withdrawal, execute )}
-
Status
+
Status
{status.data?.status === L2ToL1MessageStatus.CONFIRMED && (
)} - {status.data?.status === L2ToL1MessageStatus.EXECUTED && ( + {status.data?.status === ChildToParentMessageStatus.EXECUTED && (
{timeAgo(status.data.lowNetworkTimeStamp)}
)} - {status.data?.status === L2ToL1MessageStatus.UNCONFIRMED && ( + {status.data?.status === ChildToParentMessageStatus.UNCONFIRMED && (
{ETA(status.data?.timestamp, withdrawal.challengePeriod)}
)}
diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index b1dcf7df..d14c1b2a 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -4,7 +4,7 @@ import { ethers, providers } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { L1TransactionReceipt, L2ToL1MessageReader, L2ToL1MessageStatus, L2TransactionReceipt } from '@arbitrum/sdk' -import { L1ContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/L1Transaction' +import { L1ContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/ParentTransaction' const eventABI = [ { From 7c67c0c625b056abf10501481a7422c38813a50f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 12:32:26 +0100 Subject: [PATCH 042/266] fix build and make bridger even if token doesn't exist. --- webapps/world-builder-dashboard/constants.ts | 1 - .../components/bridge/bridge/BridgeView.tsx | 24 +++++++++++-- .../src/components/bridge/history/Deposit.tsx | 26 +++++++++++++- .../bridge/history/DepositMobile.tsx | 2 +- .../bridge/history/WithdrawalMobile.tsx | 2 +- .../src/hooks/useL2ToL1MessageStatus.ts | 34 +++++++++---------- .../utils/bridge/depositERC20ArbitrumSDK.ts | 10 +++--- webapps/world-builder-dashboard/tsconfig.json | 3 +- 8 files changed, 72 insertions(+), 30 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index e3412be7..ec1ff378 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -80,7 +80,6 @@ export const TG7T: TokenAddressMap = { } export const ETH: TokenAddressMap = { - 13746: '', 421614: '0x0000000000000000000000000000000000000000', 11155111: '0x0000000000000000000000000000000000000000' } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 10cb270e..1bd73367 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -24,6 +24,7 @@ import useTokenBalance from '@/hooks/useTokenBalance' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' +import { Erc20Bridger } from '@arbitrum/sdk' const BridgeView = ({ direction, @@ -42,8 +43,15 @@ const BridgeView = ({ const { isMessagingEnabled } = useUISettings() const g7tUsdRate = useQuery(['rate'], () => 2501.32) const { data: ethUsdRate } = useEthUsdRate() - const { connectedAccount, selectedLowNetwork, setSelectedLowNetwork, selectedHighNetwork, setSelectedHighNetwork, setSelectedBridgeToken, selectedBridgeToken } = - useBlockchainContext() + const { + connectedAccount, + selectedLowNetwork, + setSelectedLowNetwork, + selectedHighNetwork, + setSelectedHighNetwork, + setSelectedBridgeToken, + selectedBridgeToken + } = useBlockchainContext() const { isFetching: isFetchingLowNetworkBalance } = useERC20Balance({ tokenAddress: selectedLowNetwork.g7TokenAddress, @@ -69,7 +77,11 @@ const BridgeView = ({ rpc: selectedHighNetwork.rpcs[0] }) - const { balance: tokenBalance } = useTokenBalance(selectedBridgeToken?.address || '', selectedBridgeToken?.rpc || '', connectedAccount) + const { balance: tokenBalance } = useTokenBalance( + selectedBridgeToken?.address || '', + selectedBridgeToken?.rpc || '', + connectedAccount + ) const handleTokenChange = (token: Token) => { setSelectedBridgeToken(token) @@ -100,6 +112,12 @@ const BridgeView = ({ setBalance(Number(tokenBalance)) const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId + const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) + if (!chainIds.includes(String(destinationChainId))) { + console.log("Doesn't exist") + return + } + console.log('making a bridger') const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) setBridger(bridger) } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 4333b84a..3d38e495 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,9 +1,11 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' +import { BridgeTransfer } from 'game7-bridge-sdk' import { Skeleton } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -19,6 +21,28 @@ const Deposit: React.FC = ({ deposit }) => { } const status = useDepositStatus(deposit) + const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() + const [bridgeTransfer, setBridgeTransfer] = useState() + + useEffect(() => { + if (!deposit) return + const _bridgeTransfer = new BridgeTransfer({ + txHash: deposit.highNetworkHash || '', + destinationNetworkChainId: selectedLowNetwork.chainId, + originNetworkChainId: selectedLowNetwork.chainId, + originSignerOrProviderOrRpc: selectedHighNetwork.rpcs[0], + destinationSignerOrProviderOrRpc: selectedLowNetwork.rpcs[0] + }) + setBridgeTransfer(_bridgeTransfer) + // console.log(_bridgeTransfer) + + const getBridgeTransferInfo = async () => { + const info = await _bridgeTransfer.getInfo() + console.log(info) + } + + getBridgeTransferInfo() + }, [deposit]) return ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index d653b5ce..27fa6f5d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { HIGH_NETWORKS, L3_NATIVE_TOKEN_SYMBOL, LOW_NETWORKS } from '../../../../constants' +import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './DepositMobile.module.css' import parentStyles from './WithdrawTransactions.module.css' import IconLinkExternal02 from '@/assets/IconLinkExternal02' diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 958d6623..5e855e15 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -15,7 +15,7 @@ interface WithdrawalMobileProps { status: any bridgeTransfer: BridgeTransfer | undefined } -const WithdrawalMobile: React.FC = ({ withdrawal, execute, status, bridgeTransfer }) => { +const WithdrawalMobile: React.FC = ({ withdrawal, execute, status }) => { const [isCollapsed, setIsCollapsed] = useState(true) return ( diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index d14c1b2a..abb007ef 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -3,8 +3,8 @@ import { HIGH_NETWORKS, L2_NETWORK, LOW_NETWORKS } from '../../constants' import { ethers, providers } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { L1TransactionReceipt, L2ToL1MessageReader, L2ToL1MessageStatus, L2TransactionReceipt } from '@arbitrum/sdk' -import { L1ContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/ParentTransaction' +import { ParentTransactionReceipt, ChildToParentMessageReader, ChildToParentMessageStatus, ChildTransactionReceipt } from '@arbitrum/sdk' +import { ParentContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/ParentTransaction' const eventABI = [ { @@ -31,8 +31,8 @@ export interface L2ToL1MessageStatusResult { value?: string timestamp?: number confirmations?: number - status?: L2ToL1MessageStatus - l2Receipt?: L2TransactionReceipt + status?: ChildToParentMessageStatus + l2Receipt?: ChildTransactionReceipt } const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { @@ -48,10 +48,10 @@ const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { const l2Provider = new providers.JsonRpcProvider(lowNetwork.rpcs[0]) const receipt = await l3Provider.getTransactionReceipt(highNetworkHash) - const l2Receipt = new L2TransactionReceipt(receipt) - const messages: L2ToL1MessageReader[] = (await l2Receipt.getL2ToL1Messages(l2Provider)) as L2ToL1MessageReader[] - const l2ToL1Msg: L2ToL1MessageReader = messages[0] - const status: L2ToL1MessageStatus = await l2ToL1Msg.status(l3Provider) + const l2Receipt = new ChildTransactionReceipt(receipt) + const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages(l2Provider)) as ChildToParentMessageReader[] + const l2ToL1Msg: ChildToParentMessageReader = messages[0] + const status: ChildToParentMessageStatus = await l2ToL1Msg.status(l3Provider) return { status, @@ -99,8 +99,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { return } - const l1Receipt = new L1TransactionReceipt(receipt) - const l1ContractCallReceipt = new L1ContractCallTransactionReceipt(l1Receipt) + const l1Receipt = new ParentTransactionReceipt(receipt) + const l1ContractCallReceipt = new ParentContractCallTransactionReceipt(l1Receipt) if (!highNetwork) { return { l1Receipt } @@ -109,7 +109,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { const l2Provider = new providers.JsonRpcProvider(highNetwork.rpcs[0]) let l2Result try { - l2Result = await l1ContractCallReceipt.waitForL2(l2Provider, 3, 1000) + l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, 3, 1000) } catch (e) { console.log(e) } @@ -151,7 +151,7 @@ export const useL2ToL1MessagesStatus = (transactions: Transaction[] | undefined) const l3Provider = new ethers.providers.JsonRpcProvider(l3RPC) const l2Provider = new ethers.providers.JsonRpcProvider(l2RPC) const receipt = await l3Provider.getTransactionReceipt(txHash) - const l2Receipt = new L2TransactionReceipt(receipt) + const l2Receipt = new ChildTransactionReceipt(receipt) const log = receipt.logs.find((l) => l.data !== '0x') let decodedLog @@ -164,9 +164,9 @@ export const useL2ToL1MessagesStatus = (transactions: Transaction[] | undefined) } } - const messages: L2ToL1MessageReader[] = (await l2Receipt.getL2ToL1Messages(l2Provider)) as L2ToL1MessageReader[] - const l2ToL1Msg: L2ToL1MessageReader = messages[0] - const status: L2ToL1MessageStatus = await l2ToL1Msg.status(l3Provider) + const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages(l2Provider)) as ChildToParentMessageReader[] + const l2ToL1Msg: ChildToParentMessageReader = messages[0] + const status: ChildToParentMessageStatus = await l2ToL1Msg.status(l3Provider) return { from: decodedLog?.args?.caller, @@ -307,12 +307,12 @@ export const usePendingTransactions = (connectedAccount: string | undefined): Us } if (t.type === 'WITHDRAWAL') { const status = await fetchL2ToL1MessageStatus(t as TransactionRecord) - if (status?.status === L2ToL1MessageStatus.CONFIRMED) { + if (status?.status === ChildToParentMessageStatus.CONFIRMED) { if (!t.claimableTimestamp) { newCompletedTransactions.push({ ...t, claimableTimestamp: Date.now() / 1000, newTransaction: true }) } } - if (status?.status === L2ToL1MessageStatus.EXECUTED) { + if (status?.status === ChildToParentMessageStatus.EXECUTED) { newCompletedTransactions.push({ ...t, completionTimestamp: Date.now() / 1000, newTransaction: true }) } } diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts index 4698115a..949e8db8 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts @@ -2,7 +2,7 @@ import { ethers, providers } from 'ethers' import { NetworkInterface } from '@/contexts/BlockchainContext' import { convertToBigNumber } from '@/utils/web3utils' import { L2GatewayRouterABI } from '@/web3/ABI/l2GatewayRouter_abi' -import { Erc20Bridger, getL2Network } from '@arbitrum/sdk' +import { Erc20Bridger, getArbitrumNetwork } from '@arbitrum/sdk' import { Signer } from '@ethersproject/abstract-signer' export interface DepositRecord { @@ -47,7 +47,7 @@ export const depositERC20ArbitrumSDK = async ( ): Promise => { const l2Provider = new providers.JsonRpcProvider(highNetwork.rpcs[0]) - const l2Network = await getL2Network(l2Provider) + const l2Network = await getArbitrumNetwork(l2Provider) const erc20Bridger = new Erc20Bridger(l2Network) const l1Erc20Address = lowNetwork.g7TokenAddress @@ -56,9 +56,9 @@ export const depositERC20ArbitrumSDK = async ( const depositTx = await erc20Bridger.deposit({ amount: tokenDepositAmount, - erc20L1Address: l1Erc20Address, - l1Signer, - l2Provider: l2Provider + erc20ParentAddress: l1Erc20Address, + parentSigner: l1Signer, + childProvider: l2Provider }) return { diff --git a/webapps/world-builder-dashboard/tsconfig.json b/webapps/world-builder-dashboard/tsconfig.json index 30a45bec..407b32ab 100644 --- a/webapps/world-builder-dashboard/tsconfig.json +++ b/webapps/world-builder-dashboard/tsconfig.json @@ -27,7 +27,8 @@ "strict": true, "noUnusedLocals": true, "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true + "noFallthroughCasesInSwitch": true, + "strictPropertyInitialization": false }, "include": ["src", "global.d.ts", "reset.d.ts", "src/**/*.d.ts"], "references": [{ "path": "./tsconfig.node.json" }] From 9f7f54d1706678bdbbd4866071e4b1afb23a90e8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 13:03:14 +0100 Subject: [PATCH 043/266] todo: predict child or parent address --- webapps/world-builder-dashboard/constants.ts | 52 ++++++++++++++++++- .../components/bridge/bridge/BridgeView.tsx | 18 +++++-- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index ec1ff378..dc600e6f 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -84,5 +84,55 @@ export const ETH: TokenAddressMap = { 11155111: '0x0000000000000000000000000000000000000000' } -// ETH, ARBITRUM, USDC, MANTLE, USDT, +// ETH, ARBITRUM, USDC, MANTLE, USDT, export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] + +const SEVEN_DAYS_IN_SECONDS = 7 * 24 * 60 * 60 + +export const networks = { + 13746: { + chainId: 13746, + confirmPeriodBlocks: 20, + ethBridge: { + bridge: '0xC7EEB897bA9bc3fA071C3871e7F4Cf1Ae7570f16', + inbox: '0xE6470bb72291c39073AEd67a30ff93B69c1f47De', + outbox: '0x64105c6C3D494469D5F21323F0E917563489d9f5', + rollup: '0x6cf5bFffc54cDd13B4747e8DF2C72ce8A95043c0', + sequencerInbox: '0xAe2caC32b0eF386Ab683459648eDFC78F7FF8F1e' + }, + arbSys: '0x0000000000000000000000000000000000000064', + explorerUrl: 'https://testnet.game7.io', + rpcs: ['https://testnet-rpc.game7.io'], + isArbitrum: true, + isCustom: true, + name: 'Game7 Testnet', + nativeCurrency: { + decimals: 18, + name: 'Testnet Game7 Token', + symbol: 'TG7T' + }, + parentChainId: 421614, + retryableLifetimeSeconds: SEVEN_DAYS_IN_SECONDS, + tokenBridge: { + parentCustomGateway: '0x81aCB22000A2A81D26E7e1ed5a8f51930A31598E', + parentErc20Gateway: '0x4A24f98D6fB62Ce8eA8f6C2D5AF9c8BF1c853fD7', + parentGatewayRouter: '0x73EeAEEC11473534a2249c851e4b245E61Da8732', + parentMultiCall: '0xce1CAd780c529e66e3aa6D952a1ED9A6447791c1', + parentProxyAdmin: '0x8767Ea2Ce21ac4e624F8a36948BD5EA23A3288D9', + parentWeth: '0x0000000000000000000000000000000000000000', + parentWethGateway: '0x0000000000000000000000000000000000000000', + childCustomGateway: '0xe6c5Ab297E022A592a3fF26984cc6352C7cD0f92', + childErc20Gateway: '0x9b43912709756DcFd34A64D4362b579928fDcC26', + childGatewayRouter: '0xDA379C01a484fB9F0875730430a418eB8AAFdca2', + childMultiCall: '0x27c4a2f1B1685F0AD1ea2227F56606066Aa95Bd0', + childProxyAdmin: '0x07424574dbF6508D1c79755ab8f1ba3883cc38f3', + childWeth: '0x0000000000000000000000000000000000000000', + childWethGateway: '0x0000000000000000000000000000000000000000', + depositTimeout: 2 * 60 + }, + nitroGenesisBlock: 0, + nitroGenesisL1Block: 0, + depositTimeout: 900000, + isTestnet: true + } +} diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 1bd73367..601edf6c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -2,11 +2,12 @@ import { useEffect, useState } from 'react' import { useQuery } from 'react-query' import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' +import { networks } from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' // G7 SDK -import { Bridger } from 'game7-bridge-sdk' +import { Bridger, getProvider } from 'game7-bridge-sdk' // Components import ActionButton from '@/components/bridge/bridge/ActionButton' import BridgeMessage from '@/components/bridge/bridge/BridgeMessage' @@ -113,11 +114,22 @@ const BridgeView = ({ const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) + + // TODO: get predicted address + // const getPredictedAddress = async () => { + // const arbitrumBridger = new Erc20Bridger(networks[13746]) + // const childAddress = await arbitrumBridger.getChildErc20Address( + // selectedBridgeToken.tokenAddressMap[selectedLowNetwork.chainId], + // getProvider(selectedBridgeToken.rpc[0]) + // ) + // console.log(childAddress) + // return childAddress + // } + + if (!chainIds.includes(String(destinationChainId))) { - console.log("Doesn't exist") return } - console.log('making a bridger') const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) setBridger(bridger) } From e25346c85a33423e9bd463113b4d0d3417f9f260 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 13:21:41 +0100 Subject: [PATCH 044/266] build fixes --- .../components/bridge/bridge/BridgeView.tsx | 3 --- .../src/components/bridge/history/Deposit.tsx | 27 +------------------ .../components/bridge/history/Withdrawal.tsx | 13 +-------- 3 files changed, 2 insertions(+), 41 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 601edf6c..71b6e369 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -2,7 +2,6 @@ import { useEffect, useState } from 'react' import { useQuery } from 'react-query' import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' -import { networks } from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' @@ -25,7 +24,6 @@ import useTokenBalance from '@/hooks/useTokenBalance' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' -import { Erc20Bridger } from '@arbitrum/sdk' const BridgeView = ({ direction, @@ -126,7 +124,6 @@ const BridgeView = ({ // return childAddress // } - if (!chainIds.includes(String(destinationChainId))) { return } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 3d38e495..187ac068 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,11 +1,9 @@ -import React, { useEffect, useState } from 'react' +import React from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' -import { BridgeTransfer } from 'game7-bridge-sdk' import { Skeleton } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' -import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -19,30 +17,7 @@ const Deposit: React.FC = ({ deposit }) => { from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } - const status = useDepositStatus(deposit) - const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() - const [bridgeTransfer, setBridgeTransfer] = useState() - - useEffect(() => { - if (!deposit) return - const _bridgeTransfer = new BridgeTransfer({ - txHash: deposit.highNetworkHash || '', - destinationNetworkChainId: selectedLowNetwork.chainId, - originNetworkChainId: selectedLowNetwork.chainId, - originSignerOrProviderOrRpc: selectedHighNetwork.rpcs[0], - destinationSignerOrProviderOrRpc: selectedLowNetwork.rpcs[0] - }) - setBridgeTransfer(_bridgeTransfer) - // console.log(_bridgeTransfer) - - const getBridgeTransferInfo = async () => { - const info = await _bridgeTransfer.getInfo() - console.log(info) - } - - getBridgeTransferInfo() - }, [deposit]) return ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index c6407c18..f419b595 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -65,6 +65,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const smallView = useMediaQuery('(max-width: 1199px)') const [bridgeTransfer, setBridgeTransfer] = useState() + // Mutate function const execute = useMutation( async (highNetworkHash: string | undefined) => { @@ -129,18 +130,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { } ) - useEffect(() => { - if (!withdrawal) return - const _bridgeTransfer = new BridgeTransfer({ - txHash: withdrawal.highNetworkHash || '', - destinationNetworkChainId: selectedLowNetwork.chainId, - originNetworkChainId: selectedLowNetwork.chainId, - originSignerOrProviderOrRpc: selectedHighNetwork.rpcs[0], - destinationSignerOrProviderOrRpc: selectedLowNetwork.rpcs[0] - }) - setBridgeTransfer(_bridgeTransfer) - }, [withdrawal]) - if (!status) { return <> } From 5aa75c61c20c718348be32d0815a26586e5302e2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 13:40:23 +0100 Subject: [PATCH 045/266] sighash error --- .../components/bridge/bridge/ActionButton.tsx | 25 +++++++++++++------ .../history/WithdrawTransactions.module.css | 2 +- .../components/bridge/history/Withdrawal.tsx | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 40e70030..2b593520 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -17,7 +17,7 @@ import useERC20Balance, { fetchERC20Allowance } from '@/hooks/useERC20Balance' import { estimateCreateRetryableTicketFee, sendL2ToL3Message } from '@/utils/bridge/createRetryableTicket' import { depositERC20ArbitrumSDK, TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { sendDepositERC20ToNativeTransaction } from '@/utils/bridge/depositERC20ToNative' -import { parseUntilDelimiter } from '@/utils/web3utils' +import { parseUntilDelimiter, ZERO_ADDRESS } from '@/utils/web3utils' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' @@ -36,8 +36,15 @@ const ActionButton: React.FC = ({ bridger, symbol }) => { - const { connectedAccount, isConnecting, selectedHighNetwork, selectedLowNetwork, connectWallet, getProvider } = - useBlockchainContext() + const { + connectedAccount, + isConnecting, + selectedHighNetwork, + selectedLowNetwork, + connectWallet, + getProvider, + selectedBridgeToken + } = useBlockchainContext() const [isAllowanceModalOpened, setIsAllowanceModalOpened] = useState(false) const [additionalCost, setAdditionalCost] = useState(ethers.BigNumber.from(0)) const [feeEstimate, setFeeEstimate] = useState< @@ -193,11 +200,13 @@ const ActionButton: React.FC = ({ const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider // If deposit if (bridger?.isDeposit) { - const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' - // approve first - if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { - const approveTx = await bridger?.approve(ethers.utils.parseEther(amount), signer) - await approveTx.wait() + if (selectedBridgeToken.address != ZERO_ADDRESS) { + const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' + // approve first + if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { + const approveTx = await bridger?.approve(ethers.utils.parseEther(amount), signer) + await approveTx.wait() + } } const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) await tx.wait() diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index 9c87feae..49610303 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -183,7 +183,7 @@ left: 14px; top: 36px; stroke-width: 1px; - stroke: var(--Grid-Node, #eaecf0); + stroke: #393939; } .timeCenter { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index f419b595..f1ce5858 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from 'react' +import React, { useState } from 'react' import { useMutation, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' From fb84465bae92f5fc193252c97b5c44a29e1d9035 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 14:26:25 +0100 Subject: [PATCH 046/266] allowance --- .../components/bridge/bridge/ActionButton.tsx | 113 +--------------- .../src/components/bridge/history/Deposit.tsx | 2 +- .../bridge/history/DepositMobile.tsx | 4 +- .../bridge/history/WithdrawalMobile.tsx | 10 +- .../src/utils/bridge/depositERC20ToNative.ts | 122 ------------------ 5 files changed, 14 insertions(+), 237 deletions(-) delete mode 100644 webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 2b593520..2249748b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' // Constants -import { ALL_NETWORKS, L3_NETWORK } from '../../../../constants' +import { ALL_NETWORKS } from '../../../../constants' // Styles import styles from './ActionButton.module.css' import { ethers } from 'ethers' @@ -11,13 +11,10 @@ import { Bridger } from 'game7-bridge-sdk' import { Modal } from 'summon-ui/mantine' // Absolute Imports import ApproveAllowance from '@/components/bridge/allowance/ApproveAllowance' -import { HighNetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' -import useERC20Balance, { fetchERC20Allowance } from '@/hooks/useERC20Balance' -import { estimateCreateRetryableTicketFee, sendL2ToL3Message } from '@/utils/bridge/createRetryableTicket' -import { depositERC20ArbitrumSDK, TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { sendDepositERC20ToNativeTransaction } from '@/utils/bridge/depositERC20ToNative' -import { parseUntilDelimiter, ZERO_ADDRESS } from '@/utils/web3utils' +import useERC20Balance from '@/hooks/useERC20Balance' +import { ZERO_ADDRESS } from '@/utils/web3utils' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' @@ -94,103 +91,6 @@ const ActionButton: React.FC = ({ } const queryClient = useQueryClient() - const deposit = useMutation( - async (amount: string) => { - const provider = await getProvider(selectedLowNetwork) - if (!provider || !connectedAccount) { - setErrorMessage("Wallet isn't connected") - throw new Error("Wallet isn't connected") - } - const allowance = await fetchERC20Allowance({ - tokenAddress: selectedLowNetwork.g7TokenAddress, - owner: connectedAccount, - spender: selectedLowNetwork.routerSpender, - rpc: selectedLowNetwork.rpcs[0] - }) - - const signer = provider.getSigner() - let messageExecutionCost = additionalCost - let estimate: { gasLimit: ethers.BigNumber; maxFeePerGas: ethers.BigNumber } | undefined - if (L2L3message?.data && L2L3message.destination && messageExecutionCost.eq(ethers.BigNumber.from(0))) { - try { - estimate = await estimateCreateRetryableTicketFee( - '', - selectedLowNetwork, - L2L3message.destination ?? '', - L2L3message.data - ) - if (estimate) { - setFeeEstimate(estimate) - messageExecutionCost = estimate.maxFeePerGas.mul(estimate.gasLimit) - } - } catch (e) { - setErrorMessage('Estimation message execution fee error') - console.log(`Estimation message execution fee error: ${e}`) - } - } - - setAdditionalCost(messageExecutionCost) - if (allowance.raw.lt(ethers.utils.parseUnits(amount, 18).add(messageExecutionCost))) { - setIsAllowanceModalOpened(true) - return - } - if (selectedHighNetwork.chainId === L3_NETWORK.chainId) { - if (L2L3message?.data && L2L3message.destination) { - return sendL2ToL3Message( - selectedLowNetwork, - selectedHighNetwork, - amount, - signer, - connectedAccount, - L2L3message.destination, - L2L3message.data, - estimate ?? feeEstimate - ) - } - return sendDepositERC20ToNativeTransaction( - selectedLowNetwork, - selectedHighNetwork as HighNetworkInterface, - amount, - signer, - connectedAccount - ) - } - return depositERC20ArbitrumSDK(selectedLowNetwork, selectedHighNetwork, amount, signer) - }, - { - onSuccess: (deposit: TransactionRecord | undefined) => { - if (!deposit) { - return - } - try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - - let transactions = [] - if (transactionsString) { - transactions = JSON.parse(transactionsString) - } - transactions.push({ ...deposit, isDeposit: true }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(transactions)) - } catch (e) { - console.log(e) - } - refetchNewNotifications(connectedAccount ?? '') - queryClient.invalidateQueries(['ERC20Balance']) - queryClient.invalidateQueries(['pendingTransactions']) - queryClient.refetchQueries(['ERC20Balance']) - queryClient.refetchQueries(['nativeBalance']) - queryClient.refetchQueries(['incomingMessages']) - queryClient.refetchQueries(['pendingNotifications']) - navigate('/bridge/transactions') - }, - onError: (e: Error) => { - const error = parseUntilDelimiter(e) - console.log(error) - setErrorMessage('Something went wrong. Try again, please') - } - } - ) - const transfer = useMutation( async (amount: string) => { const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) @@ -204,8 +104,7 @@ const ActionButton: React.FC = ({ const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' // approve first if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { - const approveTx = await bridger?.approve(ethers.utils.parseEther(amount), signer) - await approveTx.wait() + setIsAllowanceModalOpened(true) } } const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) @@ -292,7 +191,7 @@ const ActionButton: React.FC = ({ amount={ethers.utils.parseUnits(String(amount), 18).add(additionalCost)} onSuccess={() => { setIsAllowanceModalOpened(false) - deposit.mutate(String(amount)) + transfer.mutate(String(amount)) }} onClose={() => setIsAllowanceModalOpened(false)} allowanceProps={{ diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 187ac068..edf69804 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -21,7 +21,7 @@ const Deposit: React.FC = ({ deposit }) => { return ( <> - {status.isLoading ? ( + {status.isLoading && !status.data ? ( Array.from(Array(7)).map((_, idx) => (
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index 27fa6f5d..d84ac634 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -37,12 +37,12 @@ const DepositMobile: React.FC = ({ deposit }) => { {status.data && status.data.l2Result?.complete ? (
Completed - +
) : (
Pending - +
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 5e855e15..cf599fc4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -36,7 +36,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute >
Completed - +
)} @@ -48,7 +48,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute >
Claimable - +
)} @@ -60,7 +60,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute >
Pending - +
)} @@ -77,7 +77,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute >
Completed - +
@@ -90,7 +90,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute >
Completed - +
diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative.ts deleted file mode 100644 index bae1b68f..00000000 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative.ts +++ /dev/null @@ -1,122 +0,0 @@ -import { ethers, providers, utils } from 'ethers' -import { HighNetworkInterface, NetworkInterface } from '@/contexts/BlockchainContext' -import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { convertToBigNumber } from '@/utils/web3utils' -import { ERC20_INBOX_ABI } from '@/web3/ABI/erc20_inbox_abi' -import { NodeInterface__factory } from '@arbitrum/sdk/dist/lib/abi/factories/NodeInterface__factory' -import { NODE_INTERFACE_ADDRESS } from '@arbitrum/sdk/dist/lib/dataEntities/constants' -import { Signer } from '@ethersproject/abstract-signer' - -const estimateGasComponents = async ( - amount: string, - account: string, - lowNetwork: NetworkInterface, - highNetwork: HighNetworkInterface -) => { - if (!highNetwork.inbox) { - console.log('inbox contract is undefined') - return - } - - const destinationAddress = highNetwork.inbox - const ethAmount = convertToBigNumber(amount) - const lowNetworkProvider = new providers.JsonRpcProvider(lowNetwork.rpcs[0]) - - const ERC20InboxContract = new ethers.Contract(highNetwork.inbox, ERC20_INBOX_ABI, lowNetworkProvider) - const tx = await ERC20InboxContract.populateTransaction.depositERC20(ethAmount) - const data = tx.data - - if (data) { - const nodeInterface = NodeInterface__factory.connect(NODE_INTERFACE_ADDRESS, lowNetworkProvider) - try { - return await nodeInterface.callStatic.gasEstimateComponents(destinationAddress, false, data, { - from: account - }) - } catch (e: any) { - console.log("Can't estimate gas: ", e.message) - } - } -} - -export const calculateGasValues = (gasEstimateComponents: any) => { - const l1GasEstimated = gasEstimateComponents.gasEstimateForL1 - const l2GasUsed = gasEstimateComponents.gasEstimate.sub(gasEstimateComponents.gasEstimateForL1) - const l2EstimatedPrice = gasEstimateComponents.baseFee - const l1EstimatedPrice = gasEstimateComponents.l1BaseFeeEstimate.mul(16) - const P = l2EstimatedPrice - const L2G = l2GasUsed - let B: ethers.BigNumber - if (l1EstimatedPrice.toNumber() !== 0 && l1GasEstimated.toNumber() !== 0) { - const L1P = l1EstimatedPrice - const l1Cost = l1GasEstimated.mul(l2EstimatedPrice) - const L1S = l1Cost.div(l1EstimatedPrice) - const L1C = L1P.mul(L1S) - B = L1C.div(P) - } else { - B = L2G.mul(ethers.BigNumber.from(8)) - } - - const G = L2G.add(B) - const TXFEES = P.mul(G) - - return { TXFEES, gasLimit: G, L2G, l2EstimatedPrice, G } -} - -export const estimateDepositERC20ToNativeFee = async ( - amount: string, - account: string, - lowNetwork: NetworkInterface, - highNetwork: HighNetworkInterface -) => { - const gasEstimateComponents = await estimateGasComponents(amount, account, lowNetwork, highNetwork) - if (gasEstimateComponents) { - const { TXFEES } = calculateGasValues(gasEstimateComponents) - return utils.formatEther(TXFEES) - } -} - -export const estimateDepositERC20ToNativeGas = async ( - amount: string, - account: string, - lowNetwork: NetworkInterface, - highNetwork: HighNetworkInterface -) => { - const gasEstimateComponents = await estimateGasComponents(amount, account, lowNetwork, highNetwork) - if (gasEstimateComponents) { - const { gasLimit } = calculateGasValues(gasEstimateComponents) - return gasLimit - } -} - -export const sendDepositERC20ToNativeTransaction = async ( - lowNetwork: NetworkInterface, - highNetwork: HighNetworkInterface, - amount: string, - l2Signer: Signer, - account: string -): Promise => { - const destinationAddress = highNetwork.inbox - const ethAmount = convertToBigNumber(amount) - const ERC20InboxContract = new ethers.Contract(destinationAddress, ERC20_INBOX_ABI, l2Signer) - const gasEstimate = await estimateDepositERC20ToNativeGas(amount, account, lowNetwork, highNetwork) - - const txRequest = await ERC20InboxContract.populateTransaction.depositERC20(ethAmount, { - gasLimit: gasEstimate - }) - - const txResponse = await l2Signer.sendTransaction(txRequest) - - // Wait for the transaction to be mined - await txResponse.wait() - - return { - type: 'DEPOSIT', - amount, - lowNetworkChainId: lowNetwork.chainId, - highNetworkChainId: highNetwork.chainId, - lowNetworkHash: txResponse.hash, - lowNetworkTimestamp: Date.now() / 1000, - completionTimestamp: Date.now() / 1000, - newTransaction: true - } -} From 352cf041e1969008bd6ec1206752e67d49866dbd Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 15:30:07 +0100 Subject: [PATCH 047/266] checkpoint for deposit type --- .../src/hooks/useL2ToL1MessageStatus.ts | 50 ++++++++++++++++--- 1 file changed, 44 insertions(+), 6 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index abb007ef..37b9b90b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -3,8 +3,14 @@ import { HIGH_NETWORKS, L2_NETWORK, LOW_NETWORKS } from '../../constants' import { ethers, providers } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { ParentTransactionReceipt, ChildToParentMessageReader, ChildToParentMessageStatus, ChildTransactionReceipt } from '@arbitrum/sdk' +import { + ParentTransactionReceipt, + ChildToParentMessageReader, + ChildToParentMessageStatus, + ChildTransactionReceipt +} from '@arbitrum/sdk' import { ParentContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/ParentTransaction' +import { Transaction } from 'ethers' const eventABI = [ { @@ -49,7 +55,9 @@ const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { const receipt = await l3Provider.getTransactionReceipt(highNetworkHash) const l2Receipt = new ChildTransactionReceipt(receipt) - const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages(l2Provider)) as ChildToParentMessageReader[] + const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages( + l2Provider + )) as ChildToParentMessageReader[] const l2ToL1Msg: ChildToParentMessageReader = messages[0] const status: ChildToParentMessageStatus = await l2ToL1Msg.status(l3Provider) @@ -70,9 +78,37 @@ export const useL2ToL1MessageStatus = (withdrawal: TransactionRecord) => { }) } +export const getDecodedInputs = (tx: Transaction, ABI: any) => { + //ABI: ReadonlyArray gives TS building error + const contractInterface = new ethers.utils.Interface(ABI) + return contractInterface.parseTransaction({ + data: tx.data, + value: tx.value + }) +} + +// const getDepositTransferType = (tx: Transaction) => { +// if (tx.to === networks[this.destinationNetworkChainId]?.ethBridge?.inbox) { +// try { +// const decodedInputs = getDecodedInputs(tx, INBOX_ABI) +// return { transferType: BridgeTransferType.DEPOSIT_GAS, decodedInputs } +// } catch (_) { +// try { +// const decodedInputs = getDecodedInputs(tx, ERC20_INBOX_ABI) +// return { transferType: BridgeTransferType.DEPOSIT_ERC20_TO_GAS, decodedInputs } +// } catch (_) { +// throw new Error(`Unable to decode inputs - unknown method of inbox contract ${tx.to}`) +// } +// } +// } else if (tx.to === networks[this.destinationNetworkChainId]?.tokenBridge?.parentGatewayRouter) { +// const decodedInputs = getDecodedInputs(tx, L1GatewayRouterABI) +// return { transferType: BridgeTransferType.DEPOSIT_ERC20, decodedInputs } +// } +// throw new Error(`Unable to decode inputs - ${tx.to} is unknown contract`) +// } + const fetchDepositStatus = async (deposit: TransactionRecord) => { const { lowNetworkChainId, highNetworkChainId, lowNetworkHash, lowNetworkTimestamp } = deposit - if (lowNetworkChainId === L2_NETWORK.chainId) { return { l2Result: { complete: true }, @@ -134,13 +170,13 @@ export const useDepositStatus = (deposit: TransactionRecord) => { }) } -export interface Transaction { +export interface TransactionType { txHash: string l2RPC: string l3RPC: string } -export const useL2ToL1MessagesStatus = (transactions: Transaction[] | undefined) => { +export const useL2ToL1MessagesStatus = (transactions: TransactionType[] | undefined) => { if (!transactions) { return useQueries([{ queryKey: ['withdrawalStatusEmpty'], queryFn: () => undefined }]) } @@ -164,7 +200,9 @@ export const useL2ToL1MessagesStatus = (transactions: Transaction[] | undefined) } } - const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages(l2Provider)) as ChildToParentMessageReader[] + const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages( + l2Provider + )) as ChildToParentMessageReader[] const l2ToL1Msg: ChildToParentMessageReader = messages[0] const status: ChildToParentMessageStatus = await l2ToL1Msg.status(l3Provider) From d6651cd5445aa735914aab79da1ac6183a61f78f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 15:43:41 +0100 Subject: [PATCH 048/266] remove getprovider --- .../src/components/bridge/bridge/BridgeView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 71b6e369..a94113fa 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -6,7 +6,7 @@ import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from import styles from './BridgeView.module.css' import { ethers } from 'ethers' // G7 SDK -import { Bridger, getProvider } from 'game7-bridge-sdk' +import { Bridger } from 'game7-bridge-sdk' // Components import ActionButton from '@/components/bridge/bridge/ActionButton' import BridgeMessage from '@/components/bridge/bridge/BridgeMessage' From ed418698161a67597bbf20b5184c2e4bd6860502 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 16:51:04 +0100 Subject: [PATCH 049/266] merge --- .github/workflows/build.yml | 34 + .github/workflows/release-game7.yml | 24 +- Makefile | 20 +- README.md | 11 +- abis/IMulticall3.json | 440 ++ api/package.json | 4 +- api/src/controllers/faucet.controller.ts | 19 +- api/src/routes/faucet.router.ts | 2 +- api/src/utils/error.ts | 4 + api/tsconfig.json | 9 +- bindings/ArbSys/ArbSys.go | 2 +- .../L1OrbitCustomGateway.go | 2 +- .../L1OrbitGatewayRouter.go | 2 +- .../L2CustomGateway.go | 2 +- .../ArbitrumUpgradeExecutor.go | 2 +- bindings/ERC20/ERC20.go | 675 +- bindings/ERC20Inbox/ERC20Inbox.go | 2 +- bindings/GnosisSafe/GnosisSafe.go | 6777 +++++++++++++++++ bindings/IMulticall3/IMulticall3.go | 647 ++ bindings/L1GatewayRouter/L1GatewayRouter.go | 4378 +++++++++++ bindings/L1Teleporter/L1Teleporter.go | 2 +- .../L2ForwarderFactory/L2ForwarderFactory.go | 2 +- bindings/Metronome/Metronome.go | 2704 +++++++ bindings/MockERC1155/MockERC1155.go | 864 ++- bindings/MockERC20/MockERC20.go | 858 ++- bindings/MockERC721/MockERC721.go | 1058 ++- bindings/NodeInterface/NodeInterface.go | 2 +- bindings/PositionMetadata/PositionMetadata.go | 361 +- bindings/Staker/Staker.go | 1970 ++++- bindings/TokenFaucet/TokenFaucet.go | 1258 ++- bindings/TokenSender/TokenSender.go | 466 +- .../WrappedNativeToken/WrappedNativeToken.go | 959 ++- bridge/bridge.go | 226 +- bridge/cmd.go | 240 +- bridge/safe.go | 212 + cmd/game7/cmd.go | 16 +- cmd/game7/version/version.go | 2 +- cmd/robognome/README.md | 50 + cmd/robognome/bot.go | 113 + cmd/robognome/cmd.go | 167 + cmd/robognome/main.go | 15 + cmd/robognome/version/version.go | 3 + go.mod | 32 +- go.sum | 106 +- web3/.env.example | 9 +- web3/constants/network.ts | 45 +- web3/constants/time.ts | 2 +- .../deploy/ImmutableCreate2Factory.sol | 211 - web3/contracts/faucet/TokenFaucet.sol | 2 +- web3/contracts/faucet/TokenSender.sol | 2 +- web3/contracts/interfaces/IStaker.sol | 102 + web3/contracts/metronome/Metronome.sol | 86 + web3/contracts/mock/tokens.sol | 3 + web3/contracts/staking/PositionMetadata.sol | 2 +- web3/contracts/staking/Staker.sol | 74 +- web3/contracts/staking/data.sol | 2 +- web3/contracts/token/ERC20.sol | 4 +- web3/hardhat.config.ts | 147 +- web3/helpers/addresses.ts | 2 +- web3/helpers/bignumber.ts | 8 +- web3/helpers/type.ts | 24 +- web3/package.json | 4 +- web3/scripts/bridge-example.md | 2 +- web3/scripts/bridge.md | 31 +- web3/scripts/metronome.md | 44 + web3/scripts/mock.game7-testnet.md | 2 +- web3/scripts/staker.game7-testnet.md | 2 +- web3/test/ERC20.behavior.ts | 319 +- web3/test/ERC20.test.ts | 117 +- web3/test/Metronome.test.ts | 216 + web3/test/Staker.test.1.ts | 159 +- web3/test/Staker.test.2.ts | 104 +- web3/test/Staker.test.3.ts | 563 +- web3/test/TokenFaucet.test.ts | 218 +- web3/test/WrappedNativeToken.test.ts | 219 +- .../world-builder-dashboard/public/Logo.svg | 21 +- .../src/assets/ArbitrumLogo.tsx | 23 + .../src/assets/ConduitLogo.tsx | 17 + .../src/assets/G7BridgeCardDark.jpg | Bin 0 -> 277693 bytes .../src/assets/G7DiscordCardDark.jpg | Bin 0 -> 273214 bytes .../src/assets/G7DocsCardDark.jpg | Bin 0 -> 264034 bytes .../src/assets/G7ExplorerCardDark.jpg | Bin 0 -> 273669 bytes .../src/assets/G7FaucetCardDark.jpg | Bin 0 -> 275875 bytes .../src/assets/G7LandingPageBG.png | Bin 0 -> 663421 bytes .../src/assets/G7LandingPageBGDark.jpg | Bin 0 -> 1213536 bytes .../src/assets/G7LightningQuickDark.jpg | Bin 0 -> 283224 bytes .../src/assets/G7ReachGamersDark.jpg | Bin 0 -> 437544 bytes .../src/assets/G7SpecialEconZoneDark.jpg | Bin 0 -> 281580 bytes .../src/assets/HyperPlayLogo.tsx | 10 + .../src/assets/IconDark.tsx | 2 +- .../src/assets/IconDocumentation.tsx | 6 +- .../src/assets/IconExplorer.tsx | 6 +- .../src/assets/IconExternalLink.tsx | 4 +- .../src/assets/IconGame7.tsx | 10 +- .../src/assets/IconGame7Logo.tsx | 2 +- .../src/assets/IconHamburgerLanding.tsx | 9 + .../src/assets/IconLogoutLarge.tsx | 2 +- .../src/assets/IconThemeSwitch.tsx | 16 + .../src/assets/MarketWarsLogo.tsx | 19 + .../src/assets/Summon.png | Bin 0 -> 2716 bytes .../src/assets/SummonLogo.tsx | 13 + .../src/assets/SummonTextLogo.tsx | 14 + .../src/assets/cursor.svg | 33 + .../src/assets/hand.svg | 28 + .../bridge/bridge/ActionButton.module.css | 12 +- .../components/bridge/bridge/ActionButton.tsx | 49 +- .../components/bridge/bridge/BridgeView.tsx | 4 +- .../bridge/bridge/ValueToBridge.module.css | 17 +- .../src/components/bridge/history/Deposit.tsx | 2 +- .../bridge/history/DepositMobile.module.css | 145 +- .../history/WithdrawTransactions.module.css | 6 +- .../components/bridge/history/Withdrawal.tsx | 32 +- .../commonComponents/tokenRow/TokenRow.tsx | 23 +- .../walletButton/WalletButton.module.css | 129 - .../walletButton/WalletButton.tsx | 95 - .../components/faucet/FaucetView.module.css | 6 +- .../src/components/faucet/FaucetView.tsx | 128 +- .../NotificationsDropModal.module.css | 302 +- .../notifications/NotificationsDropModal.tsx | 18 +- .../src/hooks/useERC20Balance.ts | 25 - .../src/hooks/useFaucetAPI.ts | 38 +- .../src/layouts/MainLayout/DesktopSidebar.tsx | 9 - .../src/layouts/MainLayout/Game7Logo.tsx | 4 +- .../layouts/MainLayout/MainLayout.module.css | 31 +- .../src/layouts/MainLayout/MainLayout.tsx | 36 +- .../src/layouts/MainLayout/MobileSidebar.tsx | 4 +- .../pages/BridgePage/BridgePage.module.css | 1 + .../pages/LandingPage/LandingPage.module.css | 850 +++ .../src/pages/LandingPage/LandingPage.tsx | 309 + .../world-builder-dashboard/src/router.tsx | 13 +- .../src/styles/global.css | 17 +- .../src/utils/bridge/l3Networks.ts | 2 +- 132 files changed, 27723 insertions(+), 2286 deletions(-) create mode 100644 .github/workflows/build.yml create mode 100644 abis/IMulticall3.json create mode 100644 api/src/utils/error.ts create mode 100644 bindings/GnosisSafe/GnosisSafe.go create mode 100644 bindings/IMulticall3/IMulticall3.go create mode 100644 bindings/L1GatewayRouter/L1GatewayRouter.go create mode 100644 bindings/Metronome/Metronome.go create mode 100644 bridge/safe.go create mode 100644 cmd/robognome/README.md create mode 100644 cmd/robognome/bot.go create mode 100644 cmd/robognome/cmd.go create mode 100644 cmd/robognome/main.go create mode 100644 cmd/robognome/version/version.go delete mode 100644 web3/contracts/deploy/ImmutableCreate2Factory.sol create mode 100644 web3/contracts/interfaces/IStaker.sol create mode 100644 web3/contracts/metronome/Metronome.sol create mode 100644 web3/scripts/metronome.md create mode 100644 web3/test/Metronome.test.ts create mode 100644 webapps/world-builder-dashboard/src/assets/ArbitrumLogo.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/ConduitLogo.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/G7BridgeCardDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7DiscordCardDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7DocsCardDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7ExplorerCardDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7FaucetCardDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7LandingPageBG.png create mode 100644 webapps/world-builder-dashboard/src/assets/G7LandingPageBGDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7LightningQuickDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7ReachGamersDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/G7SpecialEconZoneDark.jpg create mode 100644 webapps/world-builder-dashboard/src/assets/HyperPlayLogo.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/IconHamburgerLanding.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/IconThemeSwitch.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/MarketWarsLogo.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/Summon.png create mode 100644 webapps/world-builder-dashboard/src/assets/SummonLogo.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/SummonTextLogo.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/cursor.svg create mode 100644 webapps/world-builder-dashboard/src/assets/hand.svg delete mode 100644 webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.module.css delete mode 100644 webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx create mode 100644 webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css create mode 100644 webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..88d91cca --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,34 @@ +name: Build + +on: + pull_request: + branches: + - main + +jobs: + build: + runs-on: ubuntu-20.04 + steps: + - uses: actions/checkout@v3 + - name: Install Node.js + uses: actions/setup-node@v3 + with: + node-version: 18.18.0 + - uses: actions/setup-go@v2 + with: + go-version: ^1.20.0 + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + - name: Install dependencies + working-directory: ./web3 + run: npm install + - name: Run Hardhat compile + working-directory: ./web3 + run: npx hardhat compile + - name: Install seer + run: go install github.com/G7DAO/seer@latest + - name: Build everything + run: | + make \ No newline at end of file diff --git a/.github/workflows/release-game7.yml b/.github/workflows/release-game7.yml index 8a0515a4..7a8b902b 100644 --- a/.github/workflows/release-game7.yml +++ b/.github/workflows/release-game7.yml @@ -50,11 +50,15 @@ jobs: - name: Install dependencies working-directory: ./web3 run: npm install + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly - name: Run Hardhat compile working-directory: ./web3 run: npx hardhat compile - name: Install seer - run: go install github.com/moonstream-to/seer@latest + run: go install github.com/G7DAO/seer@latest - name: Build ERC20 interface with seer run: seer evm generate --package ERC20 --output bindings/ERC20/ERC20.go --hardhat web3/artifacts/contracts/token/ERC20.sol/ERC20.json --cli --struct ERC20 @@ -65,6 +69,24 @@ jobs: - name: Build WrappedNativeToken interface with seer run: seer evm generate --package WrappedNativeToken --output bindings/WrappedNativeToken/WrappedNativeToken.go --hardhat web3/artifacts/contracts/token/WrappedNativeToken.sol/WrappedNativeToken.json --cli --struct WrappedNativeToken + - name: Build Staker interface with seer + run: seer evm generate --package Staker --output bindings/Staker/Staker.go --hardhat web3/artifacts/contracts/staking/Staker.sol/Staker.json --cli --struct Staker + + - name: Build PositionMetadata interface with seer + run: seer evm generate --package PositionMetadata --output bindings/PositionMetadata/PositionMetadata.go --hardhat web3/artifacts/contracts/staking/PositionMetadata.sol/PositionMetadata.json --cli --struct PositionMetadata + + - name: Build MockERC20 interface with seer + run: seer evm generate --package MockERC20 --output bindings/MockERC20/MockERC20.go --hardhat web3/artifacts/contracts/mock/tokens.sol/MockERC20.json --cli --struct MockERC20 + + - name: Build MockERC721 interface with seer + run: seer evm generate --package MockERC721 --output bindings/MockERC721/MockERC721.go --hardhat web3/artifacts/contracts/mock/tokens.sol/MockERC721.json --cli --struct MockERC721 + + - name: Build MockERC1155 interface with seer + run: seer evm generate --package MockERC1155 --output bindings/MockERC1155/MockERC1155.go --hardhat web3/artifacts/contracts/mock/tokens.sol/MockERC1155.json --cli --struct MockERC1155 + + - name: Build TokenSender interface with seer + run: seer evm generate --package TokenSender --output bindings/TokenSender/TokenSender.go --hardhat web3/artifacts/contracts/faucet/TokenSender.sol/TokenSender.json --cli --struct TokenSender + - name: Build binary for each valid (GOOS, GOARCH) pair env: GOOS: ${{ matrix.os }} diff --git a/Makefile b/Makefile index 05d679d6..5e7b2f5f 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,28 @@ .PHONY: clean generate regenerate test docs redocs hardhat bindings test-graffiti test-web3 clean-web3 deepclean -build: hardhat bindings bin/game7 bin/graffiti +build: hardhat bindings bin/game7 bin/graffiti bin/robognome rebuild: clean generate build bin/game7: mkdir -p bin + go mod tidy go build -o bin/game7 ./cmd/game7 +bin/robognome: + mkdir -p bin + go mod tidy + go build -o bin/robognome ./cmd/robognome + bin/graffiti: mkdir -p bin + go mod tidy go build -o bin/graffiti ./cmd/graffiti +bindings/IMulticall3/IMulticall3.go: abis/IMulticall3.json + mkdir -p bindings/IMulticall3 + seer evm generate --package IMulticall3 --output bindings/IMulticall3/IMulticall3.go --abi abis/IMulticall3.json --struct IMulticall3 + bindings/ERC20/ERC20.go: hardhat mkdir -p bindings/ERC20 seer evm generate --package ERC20 --output bindings/ERC20/ERC20.go --hardhat web3/artifacts/contracts/token/ERC20.sol/ERC20.json --cli --struct ERC20 @@ -44,11 +55,16 @@ bindings/MockERC1155/MockERC1155.go: hardhat mkdir -p bindings/MockERC1155 seer evm generate --package MockERC1155 --output bindings/MockERC1155/MockERC1155.go --hardhat web3/artifacts/contracts/mock/tokens.sol/MockERC1155.json --cli --struct MockERC1155 +bindings/Metronome/Metronome.go: hardhat + mkdir -p bindings/Metronome + seer evm generate --package Metronome --output bindings/Metronome/Metronome.go --hardhat web3/artifacts/contracts/metronome/Metronome.sol/Metronome.json --cli --struct Metronome + + bindings/TokenSender/TokenSender.go: hardhat mkdir -p bindings/TokenSender seer evm generate --package TokenSender --output bindings/TokenSender/TokenSender.go --hardhat web3/artifacts/contracts/faucet/TokenSender.sol/TokenSender.json --cli --struct TokenSender -bindings: bindings/ERC20/ERC20.go bindings/TokenFaucet/TokenFaucet.go bindings/WrappedNativeToken/WrappedNativeToken.go bindings/Staker/Staker.go bindings/MockERC20/MockERC20.go bindings/MockERC721/MockERC721.go bindings/MockERC1155/MockERC1155.go bindings/PositionMetadata/PositionMetadata.go bindings/TokenSender/TokenSender.go +bindings: bindings/ERC20/ERC20.go bindings/TokenFaucet/TokenFaucet.go bindings/WrappedNativeToken/WrappedNativeToken.go bindings/Staker/Staker.go bindings/MockERC20/MockERC20.go bindings/MockERC721/MockERC721.go bindings/MockERC1155/MockERC1155.go bindings/PositionMetadata/PositionMetadata.go bindings/Metronome/Metronome.go bindings/TokenSender/TokenSender.go test-web3: cd web3 && npx hardhat test diff --git a/README.md b/README.md index 39cc6063..e5fcb6a0 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,15 @@ their staked tokens. Pool administrators can change any of these parameters at any time. To make a pool immutable, we recommend transferring administration of that pool to the zero address. +### Metronome + +The `Metronome` contract allows anyone to set incentivize for Game7 chain users to submit transactions at regular intervals. + +These incentives can have different purposes for different applications. For example, they can be used to improve the fairness of blockhash-based +on-chain entropy sources. We also use the `Metronome` to incentivize steady block production on Game7 testnet. + +- The [`Metronome` smart contract](./web3/contracts/metronome/Metronome.sol). +- [`robognome`](./cmd/robognome/README.md) - A reference bot which claims `Metronome` bounties. ## Development @@ -64,7 +73,7 @@ transferring administration of that pool to the zero address. - [Node.js](https://nodejs.org/en) (version >= 20) - [`hardhat`](https://github.com/NomicFoundation/hardhat), which we used to build and test our smart contracts - [Go](https://go.dev/) (version >= 1.21), for the `game7` CLI, and other developmental and operational tools -- [`seer`](https://github.com/moonstream-to/seer), which we use to generate Go bindings and command-line interfaces +- [`seer`](https://github.com/G7DAO/seer), which we use to generate Go bindings and command-line interfaces ### Building and testing this code diff --git a/abis/IMulticall3.json b/abis/IMulticall3.json new file mode 100644 index 00000000..d9c5855e --- /dev/null +++ b/abis/IMulticall3.json @@ -0,0 +1,440 @@ +[ + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Call[]", + "name": "calls", + "type": "tuple[]" + } + ], + "name": "aggregate", + "outputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes[]", + "name": "returnData", + "type": "bytes[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowFailure", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Call3[]", + "name": "calls", + "type": "tuple[]" + } + ], + "name": "aggregate3", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Result[]", + "name": "returnData", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bool", + "name": "allowFailure", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Call3Value[]", + "name": "calls", + "type": "tuple[]" + } + ], + "name": "aggregate3Value", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Result[]", + "name": "returnData", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Call[]", + "name": "calls", + "type": "tuple[]" + } + ], + "name": "blockAndAggregate", + "outputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Result[]", + "name": "returnData", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "getBasefee", + "outputs": [ + { + "internalType": "uint256", + "name": "basefee", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "name": "getBlockHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getBlockNumber", + "outputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getChainId", + "outputs": [ + { + "internalType": "uint256", + "name": "chainid", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCurrentBlockCoinbase", + "outputs": [ + { + "internalType": "address", + "name": "coinbase", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCurrentBlockDifficulty", + "outputs": [ + { + "internalType": "uint256", + "name": "difficulty", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCurrentBlockGasLimit", + "outputs": [ + { + "internalType": "uint256", + "name": "gaslimit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getCurrentBlockTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "getEthBalance", + "outputs": [ + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastBlockHash", + "outputs": [ + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "requireSuccess", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Call[]", + "name": "calls", + "type": "tuple[]" + } + ], + "name": "tryAggregate", + "outputs": [ + { + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Result[]", + "name": "returnData", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bool", + "name": "requireSuccess", + "type": "bool" + }, + { + "components": [ + { + "internalType": "address", + "name": "target", + "type": "address" + }, + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Call[]", + "name": "calls", + "type": "tuple[]" + } + ], + "name": "tryBlockAndAggregate", + "outputs": [ + { + "internalType": "uint256", + "name": "blockNumber", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "blockHash", + "type": "bytes32" + }, + { + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Multicall3.Result[]", + "name": "returnData", + "type": "tuple[]" + } + ], + "stateMutability": "payable", + "type": "function" + } +] \ No newline at end of file diff --git a/api/package.json b/api/package.json index 77cbfc13..6a32dc68 100644 --- a/api/package.json +++ b/api/package.json @@ -22,6 +22,7 @@ "cors": "^2.8.5", "dotenv": "^16.4.5", "ethers": "^6.13.2", + "ethers-decode-error": "^2.1.3", "express": "^4.19.2", "swagger-jsdoc": "^6.2.8", "swagger-ui-express": "^5.0.1", @@ -39,6 +40,5 @@ "ts-jest": "^29.1.4", "ts-node": "^10.9.2", "typescript": "^5.4.5" - }, - "packageManager": "pnpm@9.7.1+sha512.faf344af2d6ca65c4c5c8c2224ea77a81a5e8859cbc4e06b1511ddce2f0151512431dd19e6aff31f2c6a8f5f2aced9bd2273e1fed7dd4de1868984059d2c4247" + } } diff --git a/api/src/controllers/faucet.controller.ts b/api/src/controllers/faucet.controller.ts index 548ae37f..10c10f2d 100644 --- a/api/src/controllers/faucet.controller.ts +++ b/api/src/controllers/faucet.controller.ts @@ -1,6 +1,7 @@ import { Request, Response } from 'express'; import { FaucetService } from '../services'; import { ethers } from 'ethers'; +import { tokenSenderErrorDecoder } from '../utils/error'; export class FaucetController { private faucetService: FaucetService; @@ -16,8 +17,13 @@ export class FaucetController { const response = await this.faucetService.send(checksummedAddress); console.log(`[FaucetController::sendTokens] Tokens sent to ${checksummedAddress}: ${response}`); return res.status(200).send({ status: 'success', result: response }); - } catch (error) { - console.log(`[FaucetController::sendTokens] Error sending tokens: ${error}`); + } catch (error: any) { + const decodedError = await tokenSenderErrorDecoder.decode(error); + if(decodedError.name === "TokenSenderClaimIntervalNotPassed") { + console.log(`[FaucetController::sendTokens] Too many requests: ${decodedError.name} - ${decodedError.args}`); + return res.status(429).send({ status: 'error', result: "Too many requests" }); + } + console.log(`[FaucetController::sendTokens] Error sending tokens: ${decodedError.name} - ${decodedError.args}`); return res.status(500).send({ status: 'error', result: "Internal server error" }); } } @@ -31,7 +37,8 @@ export class FaucetController { console.log(`[FaucetController::getLastSentTimestamp] Last sent timestamp retrieved for ${checksummedAddress}: ${response}`); return res.status(200).send({ status: 'success', result: response }); } catch (error) { - console.log(`[FaucetController::getLastSentTimestamp] Error retrieving last sent timestamp: ${error}`); + const decodedError = await tokenSenderErrorDecoder.decode(error); + console.log(`[FaucetController::getLastSentTimestamp] Error retrieving last sent timestamp: ${decodedError.name} - ${decodedError.args}`); return res.status(500).send({ status: 'error', result: "Internal server error" }); } } @@ -43,7 +50,8 @@ export class FaucetController { console.log(`[FaucetController::getInterval] Interval retrieved: ${response}`); return res.status(200).send({ status: 'success', result: response }); } catch (error) { - console.log(`[FaucetController::getInterval] Error retrieving interval: ${error}`); + const decodedError = await tokenSenderErrorDecoder.decode(error); + console.log(`[FaucetController::getInterval] Error retrieving interval: ${decodedError.name} - ${decodedError.args}`); return res.status(500).send({ status: 'error', result: "Internal server error" }); } } @@ -57,7 +65,8 @@ export class FaucetController { console.log(`[FaucetController::getRemainingTime] Remaining time retrieved for ${checksummedAddress}: ${response}`); return res.status(200).send({ status: 'success', result: response }); } catch (error) { - console.log(`[FaucetController::getRemainingTime] Error retrieving remaining time: ${error}`); + const decodedError = await tokenSenderErrorDecoder.decode(error); + console.log(`[FaucetController::getRemainingTime] Error retrieving remaining time: ${decodedError.name} - ${decodedError.args}`); return res.status(500).send({ status: 'error', result: "Internal server error" }); } } diff --git a/api/src/routes/faucet.router.ts b/api/src/routes/faucet.router.ts index 1f0fa76f..007de0c7 100644 --- a/api/src/routes/faucet.router.ts +++ b/api/src/routes/faucet.router.ts @@ -11,7 +11,7 @@ const faucetRoutes = (): Router => { /** * @swagger * /faucet/request/{recipientAddress}: - * get: + * post: * summary: Request tokens from the faucet. * description: Request tokens from the faucet. * parameters: diff --git a/api/src/utils/error.ts b/api/src/utils/error.ts new file mode 100644 index 00000000..942a711d --- /dev/null +++ b/api/src/utils/error.ts @@ -0,0 +1,4 @@ +import { ErrorDecoder } from "ethers-decode-error"; +import { TokenSenderABI } from "../abis/TokenSenderABI"; + +export const tokenSenderErrorDecoder = ErrorDecoder.create([TokenSenderABI]); diff --git a/api/tsconfig.json b/api/tsconfig.json index 388beb75..36d16da7 100644 --- a/api/tsconfig.json +++ b/api/tsconfig.json @@ -10,7 +10,14 @@ "noImplicitAny": true, "esModuleInterop": true, "resolveJsonModule": true, + "skipLibCheck": true, "types": ["node"], "typeRoots": ["./node_modules/@types"] - } + }, + "exclude": [ + "dist", + "node_modules", + "**/*.test.ts", // Exclude test files + "**/*.spec.ts" // Exclude spec files + ] } \ No newline at end of file diff --git a/bindings/ArbSys/ArbSys.go b/bindings/ArbSys/ArbSys.go index 1b016519..f1338429 100644 --- a/bindings/ArbSys/ArbSys.go +++ b/bindings/ArbSys/ArbSys.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package ArbSys --cli --struct ArbSys // Code generated - DO NOT EDIT. diff --git a/bindings/ArbitrumL1OrbitCustomGateway/L1OrbitCustomGateway.go b/bindings/ArbitrumL1OrbitCustomGateway/L1OrbitCustomGateway.go index 8ec33d8a..35731341 100644 --- a/bindings/ArbitrumL1OrbitCustomGateway/L1OrbitCustomGateway.go +++ b/bindings/ArbitrumL1OrbitCustomGateway/L1OrbitCustomGateway.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package ArbitrumL1OrbitCustomGateway --cli --struct L1OrbitCustomGateway // Code generated - DO NOT EDIT. diff --git a/bindings/ArbitrumL1OrbitGatewayRouter/L1OrbitGatewayRouter.go b/bindings/ArbitrumL1OrbitGatewayRouter/L1OrbitGatewayRouter.go index 16c0b2e0..bf6bd9f4 100644 --- a/bindings/ArbitrumL1OrbitGatewayRouter/L1OrbitGatewayRouter.go +++ b/bindings/ArbitrumL1OrbitGatewayRouter/L1OrbitGatewayRouter.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package ArbitrumOrbitRouter --cli --struct L1OrbitGatewayRouter // Code generated - DO NOT EDIT. diff --git a/bindings/ArbitrumL2CustomGateway/L2CustomGateway.go b/bindings/ArbitrumL2CustomGateway/L2CustomGateway.go index 5e340686..379dc580 100644 --- a/bindings/ArbitrumL2CustomGateway/L2CustomGateway.go +++ b/bindings/ArbitrumL2CustomGateway/L2CustomGateway.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package ArbitrumL2CustomGateway --cli --struct L2CustomGateway // Code generated - DO NOT EDIT. diff --git a/bindings/ArbitrumUpgradeExecutor/ArbitrumUpgradeExecutor.go b/bindings/ArbitrumUpgradeExecutor/ArbitrumUpgradeExecutor.go index 1a098ba4..85200ebc 100644 --- a/bindings/ArbitrumUpgradeExecutor/ArbitrumUpgradeExecutor.go +++ b/bindings/ArbitrumUpgradeExecutor/ArbitrumUpgradeExecutor.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package ArbitrumUpgradeExecutor --cli --struct ArbitrumUpgradeExecutor // Code generated - DO NOT EDIT. diff --git a/bindings/ERC20/ERC20.go b/bindings/ERC20/ERC20.go index c562252a..0786c3d6 100644 --- a/bindings/ERC20/ERC20.go +++ b/bindings/ERC20/ERC20.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package ERC20 --cli --struct ERC20 --output bindings/ERC20/ERC20.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package ERC20 import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // ERC20MetaData contains all meta data concerning the ERC20 contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// ERC20MetaData contains all meta data concerning the ERC20 contract. var ERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"_totalSupply\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b50604051620014ab380380620014ab83398181016040528101906200003791906200033f565b836000908162000048919062000630565b5082600190816200005a919062000630565b5081600260006101000a81548160ff021916908360ff16021790555080600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550806003819055503373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000121919062000728565b60405180910390a35050505062000745565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200019c8262000151565b810181811067ffffffffffffffff82111715620001be57620001bd62000162565b5b80604052505050565b6000620001d362000133565b9050620001e1828262000191565b919050565b600067ffffffffffffffff82111562000204576200020362000162565b5b6200020f8262000151565b9050602081019050919050565b60005b838110156200023c5780820151818401526020810190506200021f565b60008484015250505050565b60006200025f6200025984620001e6565b620001c7565b9050828152602081018484840111156200027e576200027d6200014c565b5b6200028b8482856200021c565b509392505050565b600082601f830112620002ab57620002aa62000147565b5b8151620002bd84826020860162000248565b91505092915050565b600060ff82169050919050565b620002de81620002c6565b8114620002ea57600080fd5b50565b600081519050620002fe81620002d3565b92915050565b6000819050919050565b620003198162000304565b81146200032557600080fd5b50565b60008151905062000339816200030e565b92915050565b600080600080608085870312156200035c576200035b6200013d565b5b600085015167ffffffffffffffff8111156200037d576200037c62000142565b5b6200038b8782880162000293565b945050602085015167ffffffffffffffff811115620003af57620003ae62000142565b5b620003bd8782880162000293565b9350506040620003d087828801620002ed565b9250506060620003e38782880162000328565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200044257607f821691505b602082108103620004585762000457620003fa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004c27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000483565b620004ce868362000483565b95508019841693508086168417925050509392505050565b6000819050919050565b6000620005116200050b620005058462000304565b620004e6565b62000304565b9050919050565b6000819050919050565b6200052d83620004f0565b620005456200053c8262000518565b84845462000490565b825550505050565b600090565b6200055c6200054d565b6200056981848462000522565b505050565b5b8181101562000591576200058560008262000552565b6001810190506200056f565b5050565b601f821115620005e057620005aa816200045e565b620005b58462000473565b81016020851015620005c5578190505b620005dd620005d48562000473565b8301826200056e565b50505b505050565b600082821c905092915050565b60006200060560001984600802620005e5565b1980831691505092915050565b6000620006208383620005f2565b9150826002028217905092915050565b6200063b82620003ef565b67ffffffffffffffff81111562000657576200065662000162565b5b62000663825462000429565b6200067082828562000595565b600060209050601f831160018114620006a8576000841562000693578287015190505b6200069f858262000612565b8655506200070f565b601f198416620006b8866200045e565b60005b82811015620006e257848901518255600182019150602085019450602081019050620006bb565b86831015620007025784890151620006fe601f891682620005f2565b8355505b6001600288020188555050505b505050505050565b620007228162000304565b82525050565b60006020820190506200073f600083018462000717565b92915050565b610d5680620007556000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063313ce56711610066578063313ce5671461013457806370a082311461015257806395d89b4114610182578063a9059cbb146101a0578063dd62ed3e146101d057610093565b806306fdde0314610098578063095ea7b3146100b657806318160ddd146100e657806323b872dd14610104575b600080fd5b6100a0610200565b6040516100ad91906108d9565b60405180910390f35b6100d060048036038101906100cb9190610994565b61028e565b6040516100dd91906109ef565b60405180910390f35b6100ee610380565b6040516100fb9190610a19565b60405180910390f35b61011e60048036038101906101199190610a34565b610386565b60405161012b91906109ef565b60405180910390f35b61013c610756565b6040516101499190610aa3565b60405180910390f35b61016c60048036038101906101679190610abe565b610769565b6040516101799190610a19565b60405180910390f35b61018a610781565b60405161019791906108d9565b60405180910390f35b6101ba60048036038101906101b59190610994565b61080f565b6040516101c791906109ef565b60405180910390f35b6101ea60048036038101906101e59190610aeb565b610824565b6040516101f79190610a19565b60405180910390f35b6000805461020d90610b5a565b80601f016020809104026020016040519081016040528092919081815260200182805461023990610b5a565b80156102865780601f1061025b57610100808354040283529160200191610286565b820191906000526020600020905b81548152906001019060200180831161026957829003601f168201915b505050505081565b600081600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161036e9190610a19565b60405180910390a36001905092915050565b60035481565b600081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561040a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161040190610bfd565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156104e257507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b1561063a5781600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156105a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059d90610c69565b60405180910390fd5b81600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106329190610cb8565b925050819055505b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106899190610cb8565b9250508190555081600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546106df9190610cec565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516107439190610a19565b60405180910390a3600190509392505050565b600260009054906101000a900460ff1681565b60046020528060005260406000206000915090505481565b6001805461078e90610b5a565b80601f01602080910402602001604051908101604052809291908181526020018280546107ba90610b5a565b80156108075780601f106107dc57610100808354040283529160200191610807565b820191906000526020600020905b8154815290600101906020018083116107ea57829003601f168201915b505050505081565b600061081c338484610386565b905092915050565b6005602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b83811015610883578082015181840152602081019050610868565b60008484015250505050565b6000601f19601f8301169050919050565b60006108ab82610849565b6108b58185610854565b93506108c5818560208601610865565b6108ce8161088f565b840191505092915050565b600060208201905081810360008301526108f381846108a0565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061092b82610900565b9050919050565b61093b81610920565b811461094657600080fd5b50565b60008135905061095881610932565b92915050565b6000819050919050565b6109718161095e565b811461097c57600080fd5b50565b60008135905061098e81610968565b92915050565b600080604083850312156109ab576109aa6108fb565b5b60006109b985828601610949565b92505060206109ca8582860161097f565b9150509250929050565b60008115159050919050565b6109e9816109d4565b82525050565b6000602082019050610a0460008301846109e0565b92915050565b610a138161095e565b82525050565b6000602082019050610a2e6000830184610a0a565b92915050565b600080600060608486031215610a4d57610a4c6108fb565b5b6000610a5b86828701610949565b9350506020610a6c86828701610949565b9250506040610a7d8682870161097f565b9150509250925092565b600060ff82169050919050565b610a9d81610a87565b82525050565b6000602082019050610ab86000830184610a94565b92915050565b600060208284031215610ad457610ad36108fb565b5b6000610ae284828501610949565b91505092915050565b60008060408385031215610b0257610b016108fb565b5b6000610b1085828601610949565b9250506020610b2185828601610949565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610b7257607f821691505b602082108103610b8557610b84610b2b565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000610be7602683610854565b9150610bf282610b8b565b604082019050919050565b60006020820190508181036000830152610c1681610bda565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000610c53601d83610854565b9150610c5e82610c1d565b602082019050919050565b60006020820190508181036000830152610c8281610c46565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610cc38261095e565b9150610cce8361095e565b9250828203905081811115610ce657610ce5610c89565b5b92915050565b6000610cf78261095e565b9150610d028361095e565b9250828201905080821115610d1a57610d19610c89565b5b9291505056fea2646970667358221220eb7df362cab84a8ff20169029b023bb9826cd78ce87a446db7b3ae6a14fcada264736f6c63430008180033", + Bin: "0x60806040523480156200001157600080fd5b5060405162000b5938038062000b5983398101604081905262000034916200017c565b600062000042858262000298565b50600162000051848262000298565b506002805460ff191660ff84161790553360008181526004602090815260408083208590556003859055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050505062000364565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000dc57600080fd5b81516001600160401b0380821115620000f957620000f9620000b4565b604051601f8301601f19908116603f01168101908282118183101715620001245762000124620000b4565b81604052838152602092508660208588010111156200014257600080fd5b600091505b8382101562000166578582018301518183018401529082019062000147565b6000602085830101528094505050505092915050565b600080600080608085870312156200019357600080fd5b84516001600160401b0380821115620001ab57600080fd5b620001b988838901620000ca565b95506020870151915080821115620001d057600080fd5b50620001df87828801620000ca565b935050604085015160ff81168114620001f757600080fd5b6060959095015193969295505050565b600181811c908216806200021c57607f821691505b6020821081036200023d57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000293576000816000526020600020601f850160051c810160208610156200026e5750805b601f850160051c820191505b818110156200028f578281556001016200027a565b5050505b505050565b81516001600160401b03811115620002b457620002b4620000b4565b620002cc81620002c5845462000207565b8462000243565b602080601f831160018114620003045760008415620002eb5750858301515b600019600386901b1c1916600185901b1785556200028f565b600085815260208120601f198616915b82811015620003355788860151825594840194600190910190840162000314565b5085821015620003545787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6107e580620003746000396000f3fe608060405234801561001057600080fd5b50600436106100a35760003560e01c8063313ce5671161007657806395d89b411161005b57806395d89b4114610152578063a9059cbb1461015a578063dd62ed3e1461016d57600080fd5b8063313ce5671461011357806370a082311461013257600080fd5b806306fdde03146100a8578063095ea7b3146100c657806318160ddd146100e957806323b872dd14610100575b600080fd5b6100b0610198565b6040516100bd91906105bd565b60405180910390f35b6100d96100d4366004610653565b610226565b60405190151581526020016100bd565b6100f260035481565b6040519081526020016100bd565b6100d961010e36600461067d565b6102a0565b6002546101209060ff1681565b60405160ff90911681526020016100bd565b6100f26101403660046106b9565b60046020526000908152604090205481565b6100b061059c565b6100d9610168366004610653565b6105a9565b6100f261017b3660046106d4565b600560209081526000928352604080842090915290825290205481565b600080546101a590610707565b80601f01602080910402602001604051908101604052809291908181526020018280546101d190610707565b801561021e5780601f106101f35761010080835404028352916020019161021e565b820191906000526020600020905b81548152906001019060200180831161020157829003601f168201915b505050505081565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061028e9086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526004602052604081205482111561035a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff8516148015906103d0575073ffffffffffffffffffffffffffffffffffffffff841660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156104b55773ffffffffffffffffffffffffffffffffffffffff8416600090815260056020908152604080832033845290915290205482111561046f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610351565b73ffffffffffffffffffffffffffffffffffffffff84166000908152600560209081526040808320338452909152812080548492906104af908490610789565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8416600090815260046020526040812080548492906104ea908490610789565b909155505073ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805484929061052490849061079c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161058a91815260200190565b60405180910390a35060019392505050565b600180546101a590610707565b60006105b63384846102a0565b9392505050565b60006020808352835180602085015260005b818110156105eb578581018301518582016040015282016105cf565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461064e57600080fd5b919050565b6000806040838503121561066657600080fd5b61066f8361062a565b946020939093013593505050565b60008060006060848603121561069257600080fd5b61069b8461062a565b92506106a96020850161062a565b9150604084013590509250925092565b6000602082840312156106cb57600080fd5b6105b68261062a565b600080604083850312156106e757600080fd5b6106f08361062a565b91506106fe6020840161062a565b90509250929050565b600181811c9082168061071b57607f821691505b602082108103610754577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8181038181111561029a5761029a61075a565b8082018082111561029a5761029a61075a56fea2646970667358221220a517a1430df5fb9f752a156fc931c7bd0d52b457e9d22bd6b2738b64ea6023e164736f6c63430008180033", } // ERC20ABI is the input ABI used to generate the binding from. @@ -779,6 +789,11 @@ func CreateERC20DeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int var tokenName string @@ -797,6 +812,70 @@ func CreateERC20DeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if totalSupplyRaw == "" { return fmt.Errorf("--total-supply argument not specified") } @@ -830,6 +909,47 @@ func CreateERC20DeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateERC20DeployBytecode( + tokenName, + symbol, + decimals, + totalSupply, + ) + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployERC20( transactionOpts, client, @@ -883,6 +1003,13 @@ func CreateERC20DeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenName, "token-name", "", "token-name argument") cmd.Flags().StringVar(&symbol, "symbol", "", "symbol argument") @@ -892,6 +1019,31 @@ func CreateERC20DeploymentCommand() *cobra.Command { return cmd } +func generateERC20DeployBytecode( + tokenName string, + symbol string, + decimals uint8, + totalSupply *big.Int, +) ([]byte, error) { + abiPacked, err := ERC20MetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("", + tokenName, + symbol, + decimals, + totalSupply, + ) + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(ERC20MetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateAllowanceCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -1311,11 +1463,14 @@ func CreateTotalSupplyCommand() *cobra.Command { } func CreateApproveCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var spender common.Address var spenderRaw string @@ -1326,10 +1481,6 @@ func CreateApproveCommand() *cobra.Command { Use: "approve", Short: "Execute the Approve method on a ERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1337,6 +1488,48 @@ func CreateApproveCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if spenderRaw == "" { return fmt.Errorf("--spender argument not specified") } else if !common.IsHexAddress(spenderRaw) { @@ -1387,12 +1580,49 @@ func CreateApproveCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Approve( + if safeAddress != "" { + abi, err := ERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "approve" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + spender, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Approve( + spender, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1438,6 +1668,11 @@ func CreateApproveCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&spenderRaw, "spender", "", "spender argument (common.Address)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -1445,11 +1680,14 @@ func CreateApproveCommand() *cobra.Command { return cmd } func CreateTransferCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var to0 common.Address var to0Raw string @@ -1460,10 +1698,6 @@ func CreateTransferCommand() *cobra.Command { Use: "transfer", Short: "Execute the Transfer method on a ERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1471,6 +1705,48 @@ func CreateTransferCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if to0Raw == "" { return fmt.Errorf("--to-0 argument not specified") } else if !common.IsHexAddress(to0Raw) { @@ -1521,12 +1797,49 @@ func CreateTransferCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Transfer( + if safeAddress != "" { + abi, err := ERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transfer" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + to0, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Transfer( + to0, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1572,6 +1885,11 @@ func CreateTransferCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -1579,11 +1897,14 @@ func CreateTransferCommand() *cobra.Command { return cmd } func CreateTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -1596,10 +1917,6 @@ func CreateTransferFromCommand() *cobra.Command { Use: "transfer-from", Short: "Execute the TransferFrom method on a ERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1607,6 +1924,48 @@ func CreateTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -1664,13 +2023,51 @@ func CreateTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferFrom( + if safeAddress != "" { + abi, err := ERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferFrom( + from0, to0, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1716,6 +2113,11 @@ func CreateTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -1889,3 +2291,220 @@ func CreateERC20Command() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/ERC20Inbox/ERC20Inbox.go b/bindings/ERC20Inbox/ERC20Inbox.go index 71c72479..fc053fd1 100644 --- a/bindings/ERC20Inbox/ERC20Inbox.go +++ b/bindings/ERC20Inbox/ERC20Inbox.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package ERC20Inbox --cli --struct ERC20Inbox // Code generated - DO NOT EDIT. diff --git a/bindings/GnosisSafe/GnosisSafe.go b/bindings/GnosisSafe/GnosisSafe.go new file mode 100644 index 00000000..ca585865 --- /dev/null +++ b/bindings/GnosisSafe/GnosisSafe.go @@ -0,0 +1,6777 @@ +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.1.20 +// seer command: seer evm generate --package GnosisSafe --cli --struct GnosisSafe --output bindings/GnosisSafe/GnosisSafe.go +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package GnosisSafe + +import ( + "errors" + "math/big" + "strings" + + "context" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + + // Reference imports to suppress errors if they are not otherwise used. + "encoding/hex" + "encoding/json" + "fmt" + "os" + "time" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/spf13/cobra" + "golang.org/x/term" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// GnosisSafeMetaData contains all meta data concerning the GnosisSafe contract. +var GnosisSafeMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"AddedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"approvedHash\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ApproveHash\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"masterCopy\",\"type\":\"address\"}],\"name\":\"ChangedMasterCopy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"}],\"name\":\"ChangedThreshold\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractModule\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"DisabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"contractModule\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"EnabledModule\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleFailure\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"ExecutionFromModuleSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"txHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"ExecutionSuccess\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RemovedOwner\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"msgHash\",\"type\":\"bytes32\"}],\"name\":\"SignMsg\",\"type\":\"event\"},{\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"constant\":true,\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"addOwnerWithThreshold\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"hashToApprove\",\"type\":\"bytes32\"}],\"name\":\"approveHash\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"approvedHashes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"_masterCopy\",\"type\":\"address\"}],\"name\":\"changeMasterCopy\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"changeThreshold\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contractModule\",\"name\":\"prevModule\",\"type\":\"address\"},{\"internalType\":\"contractModule\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"disableModule\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"domainSeparator\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"contractModule\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"enableModule\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"encodeTransactionData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"addresspayable\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"signatures\",\"type\":\"bytes\"}],\"name\":\"execTransaction\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":true,\"stateMutability\":\"payable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModule\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"execTransactionFromModuleReturnData\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"getMessageHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getModules\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"start\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"}],\"name\":\"getModulesPaginated\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"array\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"next\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getOwners\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getThreshold\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"safeTxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"baseGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"gasPrice\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"gasToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"refundReceiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"}],\"name\":\"getTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"contractModule\",\"name\":\"module\",\"type\":\"address\"}],\"name\":\"isModuleEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"isOwner\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_signature\",\"type\":\"bytes\"}],\"name\":\"isValidSignature\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"}],\"name\":\"removeOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"enumEnum.Operation\",\"name\":\"operation\",\"type\":\"uint8\"}],\"name\":\"requiredTxGas\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_owners\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_threshold\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"paymentToken\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"},{\"internalType\":\"addresspayable\",\"name\":\"paymentReceiver\",\"type\":\"address\"}],\"name\":\"setup\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"signMessage\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"signedMessages\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"internalType\":\"address\",\"name\":\"prevOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"swapOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b506001600481905550615f5a80620000296000396000f3fe6080604052600436106101d85760003560e01c8063a3f4df7e11610102578063e009cfde11610095578063f08a032311610064578063f08a03231461156b578063f698da25146115bc578063f8dc5dd9146115e7578063ffa1ad7414611662576101d8565b8063e009cfde1461125d578063e318b52b146112ce578063e75235b81461135f578063e86637db1461138a576101d8565b8063c4ca3a9c116100d1578063c4ca3a9c14610ef2578063cc2f845214610fc3578063d4d9bdcd146110a6578063d8d11f78146110e1576101d8565b8063a3f4df7e14610c5b578063affed0e014610ceb578063b2494df314610d16578063b63e800d14610d82576101d8565b80635ae6bd371161017a5780637d832974116101495780637d83297414610aa95780637de7edef14610b1857806385a5affe14610b69578063a0e67e2b14610bef576101d8565b80635ae6bd3714610852578063610b5925146108a1578063694e80c3146108f25780636a7612021461092d576101d8565b80632d9ad53d116101b65780632d9ad53d146104e65780632f54bf6e1461054f578063468721a7146105b85780635229073f146106cf576101d8565b80630a1028c4146102825780630d582f131461035e57806320c13b0b146103b9575b60003411806101ea5750600080369050145b156101f457610280565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b9050600081549050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461027d57366000803760008036600080855af13d6000803e6000811415610278573d6000fd5b3d6000f35b50505b005b34801561028e57600080fd5b50610348600480360360208110156102a557600080fd5b81019080803590602001906401000000008111156102c257600080fd5b8201836020820111156102d457600080fd5b803590602001918460018302840111640100000000831117156102f657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506116f2565b6040518082815260200191505060405180910390f35b34801561036a57600080fd5b506103b76004803603604081101561038157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611829565b005b3480156103c557600080fd5b50610492600480360360408110156103dc57600080fd5b81019080803590602001906401000000008111156103f957600080fd5b82018360208201111561040b57600080fd5b8035906020019184600183028401116401000000008311171561042d57600080fd5b90919293919293908035906020019064010000000081111561044e57600080fd5b82018360208201111561046057600080fd5b8035906020019184600183028401116401000000008311171561048257600080fd5b9091929391929390505050611c73565b60405180827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200191505060405180910390f35b3480156104f257600080fd5b506105356004803603602081101561050957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e09565b604051808215151515815260200191505060405180910390f35b34801561055b57600080fd5b5061059e6004803603602081101561057257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611edb565b604051808215151515815260200191505060405180910390f35b3480156105c457600080fd5b506106b5600480360360808110156105db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561062257600080fd5b82018360208201111561063457600080fd5b8035906020019184600183028401116401000000008311171561065657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050611fad565b604051808215151515815260200191505060405180910390f35b3480156106db57600080fd5b506107cc600480360360808110156106f257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561073957600080fd5b82018360208201111561074b57600080fd5b8035906020019184600183028401116401000000008311171561076d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190505050612176565b604051808315151515815260200180602001828103825283818151815260200191508051906020019080838360005b838110156108165780820151818401526020810190506107fb565b50505050905090810190601f1680156108435780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b34801561085e57600080fd5b5061088b6004803603602081101561087557600080fd5b81019080803590602001909291905050506121ac565b6040518082815260200191505060405180910390f35b3480156108ad57600080fd5b506108f0600480360360208110156108c457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121c4565b005b3480156108fe57600080fd5b5061092b6004803603602081101561091557600080fd5b81019080803590602001909291905050506125e8565b005b610a8f600480360361014081101561094457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561098b57600080fd5b82018360208201111561099d57600080fd5b803590602001918460018302840111640100000000831117156109bf57600080fd5b9091929391929390803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610a4b57600080fd5b820183602082011115610a5d57600080fd5b80359060200191846001830284011164010000000083111715610a7f57600080fd5b9091929391929390505050612764565b604051808215151515815260200191505060405180910390f35b348015610ab557600080fd5b50610b0260048036036040811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129ec565b6040518082815260200191505060405180910390f35b348015610b2457600080fd5b50610b6760048036036020811015610b3b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a11565b005b348015610b7557600080fd5b50610bed60048036036020811015610b8c57600080fd5b8101908080359060200190640100000000811115610ba957600080fd5b820183602082011115610bbb57600080fd5b80359060200191846001830284011164010000000083111715610bdd57600080fd5b9091929391929390505050612bc1565b005b348015610bfb57600080fd5b50610c04612ce1565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610c47578082015181840152602081019050610c2c565b505050509050019250505060405180910390f35b348015610c6757600080fd5b50610c70612e76565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610cb0578082015181840152602081019050610c95565b50505050905090810190601f168015610cdd5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610cf757600080fd5b50610d00612eaf565b6040518082815260200191505060405180910390f35b348015610d2257600080fd5b50610d2b612eb5565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015610d6e578082015181840152602081019050610d53565b505050509050019250505060405180910390f35b348015610d8e57600080fd5b50610ef06004803603610100811015610da657600080fd5b8101908080359060200190640100000000811115610dc357600080fd5b820183602082011115610dd557600080fd5b80359060200191846020830284011164010000000083111715610df757600080fd5b909192939192939080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610e4257600080fd5b820183602082011115610e5457600080fd5b80359060200191846001830284011164010000000083111715610e7657600080fd5b9091929391929390803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ece565b005b348015610efe57600080fd5b50610fad60048036036080811015610f1557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190640100000000811115610f5c57600080fd5b820183602082011115610f6e57600080fd5b80359060200191846001830284011164010000000083111715610f9057600080fd5b9091929391929390803560ff1690602001909291905050506130c9565b6040518082815260200191505060405180910390f35b348015610fcf57600080fd5b5061101c60048036036040811015610fe657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050613276565b60405180806020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828103825284818151815260200191508051906020019060200280838360005b83811015611091578082015181840152602081019050611076565b50505050905001935050505060405180910390f35b3480156110b257600080fd5b506110df600480360360208110156110c957600080fd5b8101908080359060200190929190505050613455565b005b3480156110ed57600080fd5b50611247600480360361014081101561110557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561114c57600080fd5b82018360208201111561115e57600080fd5b8035906020019184600183028401116401000000008311171561118057600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506135f4565b6040518082815260200191505060405180910390f35b34801561126957600080fd5b506112cc6004803603604081101561128057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061361f565b005b3480156112da57600080fd5b5061135d600480360360608110156112f157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613a25565b005b34801561136b57600080fd5b506113746140ea565b6040518082815260200191505060405180910390f35b34801561139657600080fd5b506114f060048036036101408110156113ae57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803590602001906401000000008111156113f557600080fd5b82018360208201111561140757600080fd5b8035906020019184600183028401116401000000008311171561142957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803560ff169060200190929190803590602001909291908035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506140f4565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015611530578082015181840152602081019050611515565b50505050905090810190601f16801561155d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561157757600080fd5b506115ba6004803603602081101561158e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050614308565b005b3480156115c857600080fd5b506115d1614398565b6040518082815260200191505060405180910390f35b3480156115f357600080fd5b506116606004803603606081101561160a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061439e565b005b34801561166e57600080fd5b50611677614829565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156116b757808201518184015260208101905061169c565b50505050905090810190601f1680156116e45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6000807f60b3cbf8b4a223d68d641b3b6ddf9a298e7f33710cf3d3a9d1146b5a6150fbca60001b83805190602001206040516020018083815260200182815260200192505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260010183815260200182815260200194505050505060405160208183030381529060405280519060200120915050919050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156119175750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b60026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506003600081548092919060010191905055507f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2682604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a18060045414611c6f57611c6e816125e8565b5b5050565b600080611cc386868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506116f2565b90506000848490501415611d6057600060076000838152602001908152602001600020541415611d5b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f48617368206e6f7420617070726f76656400000000000000000000000000000081525060200191505060405180910390fd5b611df6565b611df58187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505086868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506000614862565b5b6320c13b0b60e01b915050949350505050565b60008173ffffffffffffffffffffffffffffffffffffffff16600173ffffffffffffffffffffffffffffffffffffffff1614158015611ed45750600073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015611fa65750600073ffffffffffffffffffffffffffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000600173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141580156120785750600073ffffffffffffffffffffffffffffffffffffffff16600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b6120cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180615e736030913960400191505060405180910390fd5b6120da858585855a615190565b9050801561212a573373ffffffffffffffffffffffffffffffffffffffff167f6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb860405160405180910390a261216e565b3373ffffffffffffffffffffffffffffffffffffffff167facd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd37560405160405180910390a25b949350505050565b6000606061218686868686611fad565b915060405160203d0181016040523d81523d6000602083013e8091505094509492505050565b60076020528060005260406000206000915090505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612248576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156122b25750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b612324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612425576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4d6f64756c652068617320616c7265616479206265656e20616464656400000081525060200191505060405180910390fd5b60016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f844081604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461266c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b6003548111156126c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615d166023913960400191505060405180910390fd5b6001811015612721576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615dec6024913960400191505060405180910390fd5b806004819055507f610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c936004546040518082815260200191505060405180910390a150565b60008060606127c18f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e8e8e8e8e8e6005546140f4565b905060056000815480929190600101919050555080805190602001209150612830828287878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001614862565b506101f46128586109c48b01603f60408d028161284957fe5b0461520290919063ffffffff16565b015a10156128b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180615efc602a913960400191505060405180910390fd5b60005a905061291a8f8f8f8f8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508e60008d1461290f578e612915565b6109c45a035b615190565b925061292f5a8261521c90919063ffffffff16565b90506000809050600089111561294f5761294c828b8b8b8b61523c565b90505b8315612999577f442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e8382604051808381526020018281526020019250505060405180910390a16129d9565b7f23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d238382604051808381526020018281526020019250505060405180910390a15b5050509c9b505050505050505050505050565b6008602052816000526040600020602052806000526040600020600091509150505481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612a95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612b1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615c826024913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b881604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612c45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b6000612c9483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506116f2565b905060016007600083815260200190815260200160002081905550807fe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e460405160405180910390a2505050565b606080600354604051908082528060200260200182016040528015612d155781602001602082028038833980820191505090505b5090506000809050600060026000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612e6d5780838381518110612dc457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600260008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050612d83565b82935050505090565b6040518060400160405280600b81526020017f476e6f736973205361666500000000000000000000000000000000000000000081525081565b60055481565b606080612ec46001600a613276565b5090508091505090565b6000801b60065414612f48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f446f6d61696e20536570617261746f7220616c7265616479207365742100000081525060200191505060405180910390fd5b7f035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d474960001b30604051602001808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050604051602081830303815290604052805190602001206006819055506130178a8a80806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505089615408565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130555761305484615861565b5b6130a38787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050615890565b60008211156130bd576130bb8260006001868561523c565b505b50505050505050505050565b60003073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461314f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b60005a90506131a5878787878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050865a615190565b6131ae57600080fd5b60005a8203905080604051602001808281526020019150506040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561323b578082015181840152602081019050613220565b50505050905090810190601f1680156132685780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60606000826040519080825280602002602001820160405280156132a95781602001602082028038833980820191505090505b50915060008090506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156133805750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561338b57508482105b15613446578084838151811061339d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508180600101925050613316565b80925081845250509250929050565b600073ffffffffffffffffffffffffffffffffffffffff16600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f6e6c79206f776e6572732063616e20617070726f766520612068617368000081525060200191505060405180910390fd5b6001600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff16817ff2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c60405160405180910390a350565b60006136088b8b8b8b8b8b8b8b8b8b6140f4565b8051906020012090509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146136a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415801561370d5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61377f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f496e76616c6964206d6f64756c6520616464726573732070726f76696465640081525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613862576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180615cee6028913960400191505060405180910390fd5b600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507faab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace405427681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a15050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614613aa9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613b135750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b613b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613c86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f4164647265737320697320616c726561647920616e206f776e6572000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614158015613cf05750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613d62576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d906026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a17f9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea2681604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050565b6000600454905090565b606060007fbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d860001b8c8c8c805190602001208c8c8c8c8c8c8c604051602001808c81526020018b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018a815260200189815260200188600181111561418457fe5b60ff1681526020018781526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019b505050505050505050505050604051602081830303815290604052805190602001209050601960f81b600160f81b6006548360405160200180857effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168152600101847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191681526001018381526020018281526020019450505050506040516020818303038152906040529150509a9950505050505050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461438c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b61439581615861565b50565b60065481565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614614422576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180615e47602c913960400191505060405180910390fd5b806001600354031015614480576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180615d396035913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156144ea5750600173ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b61455c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461463f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180615d906026913960400191505060405180910390fd5b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906001900391905055507ff8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf82604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1806004541461482457614823816125e8565b5b505050565b6040518060400160405280600581526020017f312e322e3000000000000000000000000000000000000000000000000000000081525081565b60006004549050600081116148df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5468726573686f6c64206e6565647320746f20626520646566696e656421000081525060200191505060405180910390fd5b6148f3604182615aaa90919063ffffffff16565b83511015614969576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5369676e617475726573206461746120746f6f2073686f72740000000000000081525060200191505060405180910390fd5b600080905060008060008060008090505b868110156151835761498c8982615ae4565b80945081955082965050505060008460ff161415614d21578260001c94506149be604188615aaa90919063ffffffff16565b8260001c1015614a19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615e106037913960400191505060405180910390fd5b8851614a3260208460001c615b1390919063ffffffff16565b1115614a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526037815260200180615ea36037913960400191505060405180910390fd5b60006020838b01015190508951614abf82614ab160208760001c615b1390919063ffffffff16565b615b1390919063ffffffff16565b1115614b16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526036815260200180615db66036913960400191505060405180910390fd5b60606020848c010190506320c13b0b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168773ffffffffffffffffffffffffffffffffffffffff166320c13b0b8e846040518363ffffffff1660e01b8152600401808060200180602001838103835285818151815260200191508051906020019080838360005b83811015614bb8578082015181840152602081019050614b9d565b50505050905090810190601f168015614be55780820380516001836020036101000a031916815260200191505b50838103825284818151815260200191508051906020019080838360005b83811015614c1e578082015181840152602081019050614c03565b50505050905090810190601f168015614c4b5780820380516001836020036101000a031916815260200191505b5094505050505060206040518083038186803b158015614c6a57600080fd5b505afa158015614c7e573d6000803e3d6000fd5b505050506040513d6020811015614c9457600080fd5b81019080805190602001909291905050507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614614d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615ccb6023913960400191505060405180910390fd5b5050615001565b60018460ff161415614eca578260001c94508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480614dbe57506000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d81526020019081526020016000205414155b614e30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4861736820686173206e6f74206265656e20617070726f76656400000000000081525060200191505060405180910390fd5b878015614e6957508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15614ec5576000600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008d8152602001908152602001600020819055505b615000565b601e8460ff161115614f955760018b60405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012060048603858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614f84573d6000803e3d6000fd5b505050602060405103519450614fff565b60018b85858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015614ff2573d6000803e3d6000fd5b5050506020604051035194505b5b5b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161180156150c85750600073ffffffffffffffffffffffffffffffffffffffff16600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b80156151015750600173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b615173576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f496e76616c6964206f776e65722070726f76696465640000000000000000000081525060200191505060405180910390fd5b849550808060010191505061497a565b5050505050505050505050565b600080600181111561519e57fe5b8360018111156151aa57fe5b14156151c3576151bc86868685615b32565b90506151f9565b6001808111156151cf57fe5b8360018111156151db57fe5b14156151f3576151ec868584615b4b565b90506151f8565b600090505b5b95945050505050565b6000818310156152125781615214565b825b905092915050565b60008282111561522b57600080fd5b600082840390508091505092915050565b600080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614615279578261527b565b325b9050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415615376576152e53a86106152c2573a6152c4565b855b6152d7888a615b1390919063ffffffff16565b615aaa90919063ffffffff16565b91508073ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f19350505050615371576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615eda6022913960400191505060405180910390fd5b6153fe565b61539b8561538d888a615b1390919063ffffffff16565b615aaa90919063ffffffff16565b91506153a8848284615b62565b6153fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180615d6e6022913960400191505060405180910390fd5b5b5095945050505050565b600060045414615480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4f776e657273206861766520616c7265616479206265656e207365747570000081525060200191505060405180910390fd5b81518111156154da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180615d166023913960400191505060405180910390fd5b6001811015615534576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180615dec6024913960400191505060405180910390fd5b60006001905060008090505b83518110156157cd57600084828151811061555757fe5b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141580156155cb5750600173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b61563d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f496e76616c6964206f776e657220616464726573732070726f7669646564000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461573e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4475706c6963617465206f776e657220616464726573732070726f766964656481525060200191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550809250508080600101915050615540565b506001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550825160038190555081600481905550505050565b60007f6c9a6c4a39284e37ed1cf53d337577d14212a4870fb976a4366c693b939918d560001b90508181555050565b600073ffffffffffffffffffffffffffffffffffffffff1660016000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614615975576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180615ca66025913960400191505060405180910390fd5b6001806000600173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614615aa657615a3382825a615b4b565b615aa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f436f756c64206e6f742066696e69736820696e697469616c697a6174696f6e0081525060200191505060405180910390fd5b5b5050565b600080831415615abd5760009050615ade565b6000828402905082848281615ace57fe5b0414615ad957600080fd5b809150505b92915050565b60008060008360410260208101860151925060408101860151915060ff60418201870151169350509250925092565b600080828401905083811015615b2857600080fd5b8091505092915050565b6000806000845160208601878987f19050949350505050565b60008060008451602086018786f490509392505050565b600060608383604051602401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001925050506040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505090506000808251602084016000896127105a03f16040513d81016040523d6000823e3d60008114615c645760208114615c6c5760009450615c76565b829450615c76565b8151158315171594505b50505050939250505056fe496e76616c6964206d617374657220636f707920616464726573732070726f76696465644d6f64756c6573206861766520616c7265616479206265656e20696e697469616c697a6564496e76616c696420636f6e7472616374207369676e61747572652070726f7669646564496e76616c696420707265764d6f64756c652c206d6f64756c6520706169722070726f76696465645468726573686f6c642063616e6e6f7420657863656564206f776e657220636f756e744e6577206f776e657220636f756e74206e6565647320746f206265206c6172676572207468616e206e6577207468726573686f6c64436f756c64206e6f74207061792067617320636f737473207769746820746f6b656e496e76616c696420707265764f776e65722c206f776e657220706169722070726f7669646564496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a2064617461206e6f7420636f6d706c6574655468726573686f6c64206e6565647320746f2062652067726561746572207468616e2030496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a20696e736964652073746174696320706172744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d207468697320636f6e74726163744d6574686f642063616e206f6e6c792062652063616c6c65642066726f6d20616e20656e61626c6564206d6f64756c65496e76616c696420636f6e7472616374207369676e6174757265206c6f636174696f6e3a206c656e677468206e6f742070726573656e74436f756c64206e6f74207061792067617320636f73747320776974682065746865724e6f7420656e6f7567682067617320746f20657865637574652073616665207472616e73616374696f6ea265627a7a72315820da2029b344faa0acf527c9aacdbb26d18ce3a0599d09b320dfe387081b8e392264736f6c63430005110032", +} + +// GnosisSafeABI is the input ABI used to generate the binding from. +// Deprecated: Use GnosisSafeMetaData.ABI instead. +var GnosisSafeABI = GnosisSafeMetaData.ABI + +// GnosisSafeBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use GnosisSafeMetaData.Bin instead. +var GnosisSafeBin = GnosisSafeMetaData.Bin + +// DeployGnosisSafe deploys a new Ethereum contract, binding an instance of GnosisSafe to it. +func DeployGnosisSafe(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *GnosisSafe, error) { + parsed, err := GnosisSafeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(GnosisSafeBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &GnosisSafe{GnosisSafeCaller: GnosisSafeCaller{contract: contract}, GnosisSafeTransactor: GnosisSafeTransactor{contract: contract}, GnosisSafeFilterer: GnosisSafeFilterer{contract: contract}}, nil +} + +// GnosisSafe is an auto generated Go binding around an Ethereum contract. +type GnosisSafe struct { + GnosisSafeCaller // Read-only binding to the contract + GnosisSafeTransactor // Write-only binding to the contract + GnosisSafeFilterer // Log filterer for contract events +} + +// GnosisSafeCaller is an auto generated read-only Go binding around an Ethereum contract. +type GnosisSafeCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GnosisSafeTransactor is an auto generated write-only Go binding around an Ethereum contract. +type GnosisSafeTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GnosisSafeFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type GnosisSafeFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// GnosisSafeSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type GnosisSafeSession struct { + Contract *GnosisSafe // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// GnosisSafeCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type GnosisSafeCallerSession struct { + Contract *GnosisSafeCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// GnosisSafeTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type GnosisSafeTransactorSession struct { + Contract *GnosisSafeTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// GnosisSafeRaw is an auto generated low-level Go binding around an Ethereum contract. +type GnosisSafeRaw struct { + Contract *GnosisSafe // Generic contract binding to access the raw methods on +} + +// GnosisSafeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type GnosisSafeCallerRaw struct { + Contract *GnosisSafeCaller // Generic read-only contract binding to access the raw methods on +} + +// GnosisSafeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type GnosisSafeTransactorRaw struct { + Contract *GnosisSafeTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewGnosisSafe creates a new instance of GnosisSafe, bound to a specific deployed contract. +func NewGnosisSafe(address common.Address, backend bind.ContractBackend) (*GnosisSafe, error) { + contract, err := bindGnosisSafe(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &GnosisSafe{GnosisSafeCaller: GnosisSafeCaller{contract: contract}, GnosisSafeTransactor: GnosisSafeTransactor{contract: contract}, GnosisSafeFilterer: GnosisSafeFilterer{contract: contract}}, nil +} + +// NewGnosisSafeCaller creates a new read-only instance of GnosisSafe, bound to a specific deployed contract. +func NewGnosisSafeCaller(address common.Address, caller bind.ContractCaller) (*GnosisSafeCaller, error) { + contract, err := bindGnosisSafe(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &GnosisSafeCaller{contract: contract}, nil +} + +// NewGnosisSafeTransactor creates a new write-only instance of GnosisSafe, bound to a specific deployed contract. +func NewGnosisSafeTransactor(address common.Address, transactor bind.ContractTransactor) (*GnosisSafeTransactor, error) { + contract, err := bindGnosisSafe(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &GnosisSafeTransactor{contract: contract}, nil +} + +// NewGnosisSafeFilterer creates a new log filterer instance of GnosisSafe, bound to a specific deployed contract. +func NewGnosisSafeFilterer(address common.Address, filterer bind.ContractFilterer) (*GnosisSafeFilterer, error) { + contract, err := bindGnosisSafe(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &GnosisSafeFilterer{contract: contract}, nil +} + +// bindGnosisSafe binds a generic wrapper to an already deployed contract. +func bindGnosisSafe(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := GnosisSafeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_GnosisSafe *GnosisSafeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _GnosisSafe.Contract.GnosisSafeCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_GnosisSafe *GnosisSafeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _GnosisSafe.Contract.GnosisSafeTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_GnosisSafe *GnosisSafeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _GnosisSafe.Contract.GnosisSafeTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_GnosisSafe *GnosisSafeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _GnosisSafe.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_GnosisSafe *GnosisSafeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _GnosisSafe.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_GnosisSafe *GnosisSafeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _GnosisSafe.Contract.contract.Transact(opts, method, params...) +} + +// NAME is a free data retrieval call binding the contract method 0xa3f4df7e. +// +// Solidity: function NAME() view returns(string) +func (_GnosisSafe *GnosisSafeCaller) NAME(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "NAME") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// NAME is a free data retrieval call binding the contract method 0xa3f4df7e. +// +// Solidity: function NAME() view returns(string) +func (_GnosisSafe *GnosisSafeSession) NAME() (string, error) { + return _GnosisSafe.Contract.NAME(&_GnosisSafe.CallOpts) +} + +// NAME is a free data retrieval call binding the contract method 0xa3f4df7e. +// +// Solidity: function NAME() view returns(string) +func (_GnosisSafe *GnosisSafeCallerSession) NAME() (string, error) { + return _GnosisSafe.Contract.NAME(&_GnosisSafe.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_GnosisSafe *GnosisSafeCaller) VERSION(opts *bind.CallOpts) (string, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "VERSION") + + if err != nil { + return *new(string), err + } + + out0 := *abi.ConvertType(out[0], new(string)).(*string) + + return out0, err + +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_GnosisSafe *GnosisSafeSession) VERSION() (string, error) { + return _GnosisSafe.Contract.VERSION(&_GnosisSafe.CallOpts) +} + +// VERSION is a free data retrieval call binding the contract method 0xffa1ad74. +// +// Solidity: function VERSION() view returns(string) +func (_GnosisSafe *GnosisSafeCallerSession) VERSION() (string, error) { + return _GnosisSafe.Contract.VERSION(&_GnosisSafe.CallOpts) +} + +// ApprovedHashes is a free data retrieval call binding the contract method 0x7d832974. +// +// Solidity: function approvedHashes(address , bytes32 ) view returns(uint256) +func (_GnosisSafe *GnosisSafeCaller) ApprovedHashes(opts *bind.CallOpts, arg0 common.Address, arg1 [32]byte) (*big.Int, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "approvedHashes", arg0, arg1) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ApprovedHashes is a free data retrieval call binding the contract method 0x7d832974. +// +// Solidity: function approvedHashes(address , bytes32 ) view returns(uint256) +func (_GnosisSafe *GnosisSafeSession) ApprovedHashes(arg0 common.Address, arg1 [32]byte) (*big.Int, error) { + return _GnosisSafe.Contract.ApprovedHashes(&_GnosisSafe.CallOpts, arg0, arg1) +} + +// ApprovedHashes is a free data retrieval call binding the contract method 0x7d832974. +// +// Solidity: function approvedHashes(address , bytes32 ) view returns(uint256) +func (_GnosisSafe *GnosisSafeCallerSession) ApprovedHashes(arg0 common.Address, arg1 [32]byte) (*big.Int, error) { + return _GnosisSafe.Contract.ApprovedHashes(&_GnosisSafe.CallOpts, arg0, arg1) +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_GnosisSafe *GnosisSafeCaller) DomainSeparator(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "domainSeparator") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_GnosisSafe *GnosisSafeSession) DomainSeparator() ([32]byte, error) { + return _GnosisSafe.Contract.DomainSeparator(&_GnosisSafe.CallOpts) +} + +// DomainSeparator is a free data retrieval call binding the contract method 0xf698da25. +// +// Solidity: function domainSeparator() view returns(bytes32) +func (_GnosisSafe *GnosisSafeCallerSession) DomainSeparator() ([32]byte, error) { + return _GnosisSafe.Contract.DomainSeparator(&_GnosisSafe.CallOpts) +} + +// EncodeTransactionData is a free data retrieval call binding the contract method 0xe86637db. +// +// Solidity: function encodeTransactionData(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes) +func (_GnosisSafe *GnosisSafeCaller) EncodeTransactionData(opts *bind.CallOpts, to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([]byte, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "encodeTransactionData", to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// EncodeTransactionData is a free data retrieval call binding the contract method 0xe86637db. +// +// Solidity: function encodeTransactionData(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes) +func (_GnosisSafe *GnosisSafeSession) EncodeTransactionData(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([]byte, error) { + return _GnosisSafe.Contract.EncodeTransactionData(&_GnosisSafe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// EncodeTransactionData is a free data retrieval call binding the contract method 0xe86637db. +// +// Solidity: function encodeTransactionData(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes) +func (_GnosisSafe *GnosisSafeCallerSession) EncodeTransactionData(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([]byte, error) { + return _GnosisSafe.Contract.EncodeTransactionData(&_GnosisSafe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// GetMessageHash is a free data retrieval call binding the contract method 0x0a1028c4. +// +// Solidity: function getMessageHash(bytes message) view returns(bytes32) +func (_GnosisSafe *GnosisSafeCaller) GetMessageHash(opts *bind.CallOpts, message []byte) ([32]byte, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "getMessageHash", message) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetMessageHash is a free data retrieval call binding the contract method 0x0a1028c4. +// +// Solidity: function getMessageHash(bytes message) view returns(bytes32) +func (_GnosisSafe *GnosisSafeSession) GetMessageHash(message []byte) ([32]byte, error) { + return _GnosisSafe.Contract.GetMessageHash(&_GnosisSafe.CallOpts, message) +} + +// GetMessageHash is a free data retrieval call binding the contract method 0x0a1028c4. +// +// Solidity: function getMessageHash(bytes message) view returns(bytes32) +func (_GnosisSafe *GnosisSafeCallerSession) GetMessageHash(message []byte) ([32]byte, error) { + return _GnosisSafe.Contract.GetMessageHash(&_GnosisSafe.CallOpts, message) +} + +// GetModules is a free data retrieval call binding the contract method 0xb2494df3. +// +// Solidity: function getModules() view returns(address[]) +func (_GnosisSafe *GnosisSafeCaller) GetModules(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "getModules") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetModules is a free data retrieval call binding the contract method 0xb2494df3. +// +// Solidity: function getModules() view returns(address[]) +func (_GnosisSafe *GnosisSafeSession) GetModules() ([]common.Address, error) { + return _GnosisSafe.Contract.GetModules(&_GnosisSafe.CallOpts) +} + +// GetModules is a free data retrieval call binding the contract method 0xb2494df3. +// +// Solidity: function getModules() view returns(address[]) +func (_GnosisSafe *GnosisSafeCallerSession) GetModules() ([]common.Address, error) { + return _GnosisSafe.Contract.GetModules(&_GnosisSafe.CallOpts) +} + +// GetModulesPaginated is a free data retrieval call binding the contract method 0xcc2f8452. +// +// Solidity: function getModulesPaginated(address start, uint256 pageSize) view returns(address[] array, address next) +func (_GnosisSafe *GnosisSafeCaller) GetModulesPaginated(opts *bind.CallOpts, start common.Address, pageSize *big.Int) (struct { + Array []common.Address + Next common.Address +}, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "getModulesPaginated", start, pageSize) + + outstruct := new(struct { + Array []common.Address + Next common.Address + }) + if err != nil { + return *outstruct, err + } + + outstruct.Array = *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + outstruct.Next = *abi.ConvertType(out[1], new(common.Address)).(*common.Address) + + return *outstruct, err + +} + +// GetModulesPaginated is a free data retrieval call binding the contract method 0xcc2f8452. +// +// Solidity: function getModulesPaginated(address start, uint256 pageSize) view returns(address[] array, address next) +func (_GnosisSafe *GnosisSafeSession) GetModulesPaginated(start common.Address, pageSize *big.Int) (struct { + Array []common.Address + Next common.Address +}, error) { + return _GnosisSafe.Contract.GetModulesPaginated(&_GnosisSafe.CallOpts, start, pageSize) +} + +// GetModulesPaginated is a free data retrieval call binding the contract method 0xcc2f8452. +// +// Solidity: function getModulesPaginated(address start, uint256 pageSize) view returns(address[] array, address next) +func (_GnosisSafe *GnosisSafeCallerSession) GetModulesPaginated(start common.Address, pageSize *big.Int) (struct { + Array []common.Address + Next common.Address +}, error) { + return _GnosisSafe.Contract.GetModulesPaginated(&_GnosisSafe.CallOpts, start, pageSize) +} + +// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b. +// +// Solidity: function getOwners() view returns(address[]) +func (_GnosisSafe *GnosisSafeCaller) GetOwners(opts *bind.CallOpts) ([]common.Address, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "getOwners") + + if err != nil { + return *new([]common.Address), err + } + + out0 := *abi.ConvertType(out[0], new([]common.Address)).(*[]common.Address) + + return out0, err + +} + +// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b. +// +// Solidity: function getOwners() view returns(address[]) +func (_GnosisSafe *GnosisSafeSession) GetOwners() ([]common.Address, error) { + return _GnosisSafe.Contract.GetOwners(&_GnosisSafe.CallOpts) +} + +// GetOwners is a free data retrieval call binding the contract method 0xa0e67e2b. +// +// Solidity: function getOwners() view returns(address[]) +func (_GnosisSafe *GnosisSafeCallerSession) GetOwners() ([]common.Address, error) { + return _GnosisSafe.Contract.GetOwners(&_GnosisSafe.CallOpts) +} + +// GetThreshold is a free data retrieval call binding the contract method 0xe75235b8. +// +// Solidity: function getThreshold() view returns(uint256) +func (_GnosisSafe *GnosisSafeCaller) GetThreshold(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "getThreshold") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetThreshold is a free data retrieval call binding the contract method 0xe75235b8. +// +// Solidity: function getThreshold() view returns(uint256) +func (_GnosisSafe *GnosisSafeSession) GetThreshold() (*big.Int, error) { + return _GnosisSafe.Contract.GetThreshold(&_GnosisSafe.CallOpts) +} + +// GetThreshold is a free data retrieval call binding the contract method 0xe75235b8. +// +// Solidity: function getThreshold() view returns(uint256) +func (_GnosisSafe *GnosisSafeCallerSession) GetThreshold() (*big.Int, error) { + return _GnosisSafe.Contract.GetThreshold(&_GnosisSafe.CallOpts) +} + +// GetTransactionHash is a free data retrieval call binding the contract method 0xd8d11f78. +// +// Solidity: function getTransactionHash(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes32) +func (_GnosisSafe *GnosisSafeCaller) GetTransactionHash(opts *bind.CallOpts, to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([32]byte, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "getTransactionHash", to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetTransactionHash is a free data retrieval call binding the contract method 0xd8d11f78. +// +// Solidity: function getTransactionHash(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes32) +func (_GnosisSafe *GnosisSafeSession) GetTransactionHash(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([32]byte, error) { + return _GnosisSafe.Contract.GetTransactionHash(&_GnosisSafe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// GetTransactionHash is a free data retrieval call binding the contract method 0xd8d11f78. +// +// Solidity: function getTransactionHash(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, uint256 _nonce) view returns(bytes32) +func (_GnosisSafe *GnosisSafeCallerSession) GetTransactionHash(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, _nonce *big.Int) ([32]byte, error) { + return _GnosisSafe.Contract.GetTransactionHash(&_GnosisSafe.CallOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, _nonce) +} + +// IsModuleEnabled is a free data retrieval call binding the contract method 0x2d9ad53d. +// +// Solidity: function isModuleEnabled(address module) view returns(bool) +func (_GnosisSafe *GnosisSafeCaller) IsModuleEnabled(opts *bind.CallOpts, module common.Address) (bool, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "isModuleEnabled", module) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsModuleEnabled is a free data retrieval call binding the contract method 0x2d9ad53d. +// +// Solidity: function isModuleEnabled(address module) view returns(bool) +func (_GnosisSafe *GnosisSafeSession) IsModuleEnabled(module common.Address) (bool, error) { + return _GnosisSafe.Contract.IsModuleEnabled(&_GnosisSafe.CallOpts, module) +} + +// IsModuleEnabled is a free data retrieval call binding the contract method 0x2d9ad53d. +// +// Solidity: function isModuleEnabled(address module) view returns(bool) +func (_GnosisSafe *GnosisSafeCallerSession) IsModuleEnabled(module common.Address) (bool, error) { + return _GnosisSafe.Contract.IsModuleEnabled(&_GnosisSafe.CallOpts, module) +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(address owner) view returns(bool) +func (_GnosisSafe *GnosisSafeCaller) IsOwner(opts *bind.CallOpts, owner common.Address) (bool, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "isOwner", owner) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(address owner) view returns(bool) +func (_GnosisSafe *GnosisSafeSession) IsOwner(owner common.Address) (bool, error) { + return _GnosisSafe.Contract.IsOwner(&_GnosisSafe.CallOpts, owner) +} + +// IsOwner is a free data retrieval call binding the contract method 0x2f54bf6e. +// +// Solidity: function isOwner(address owner) view returns(bool) +func (_GnosisSafe *GnosisSafeCallerSession) IsOwner(owner common.Address) (bool, error) { + return _GnosisSafe.Contract.IsOwner(&_GnosisSafe.CallOpts, owner) +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_GnosisSafe *GnosisSafeCaller) Nonce(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "nonce") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_GnosisSafe *GnosisSafeSession) Nonce() (*big.Int, error) { + return _GnosisSafe.Contract.Nonce(&_GnosisSafe.CallOpts) +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_GnosisSafe *GnosisSafeCallerSession) Nonce() (*big.Int, error) { + return _GnosisSafe.Contract.Nonce(&_GnosisSafe.CallOpts) +} + +// SignedMessages is a free data retrieval call binding the contract method 0x5ae6bd37. +// +// Solidity: function signedMessages(bytes32 ) view returns(uint256) +func (_GnosisSafe *GnosisSafeCaller) SignedMessages(opts *bind.CallOpts, arg0 [32]byte) (*big.Int, error) { + var out []interface{} + err := _GnosisSafe.contract.Call(opts, &out, "signedMessages", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// SignedMessages is a free data retrieval call binding the contract method 0x5ae6bd37. +// +// Solidity: function signedMessages(bytes32 ) view returns(uint256) +func (_GnosisSafe *GnosisSafeSession) SignedMessages(arg0 [32]byte) (*big.Int, error) { + return _GnosisSafe.Contract.SignedMessages(&_GnosisSafe.CallOpts, arg0) +} + +// SignedMessages is a free data retrieval call binding the contract method 0x5ae6bd37. +// +// Solidity: function signedMessages(bytes32 ) view returns(uint256) +func (_GnosisSafe *GnosisSafeCallerSession) SignedMessages(arg0 [32]byte) (*big.Int, error) { + return _GnosisSafe.Contract.SignedMessages(&_GnosisSafe.CallOpts, arg0) +} + +// AddOwnerWithThreshold is a paid mutator transaction binding the contract method 0x0d582f13. +// +// Solidity: function addOwnerWithThreshold(address owner, uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeTransactor) AddOwnerWithThreshold(opts *bind.TransactOpts, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "addOwnerWithThreshold", owner, _threshold) +} + +// AddOwnerWithThreshold is a paid mutator transaction binding the contract method 0x0d582f13. +// +// Solidity: function addOwnerWithThreshold(address owner, uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeSession) AddOwnerWithThreshold(owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.Contract.AddOwnerWithThreshold(&_GnosisSafe.TransactOpts, owner, _threshold) +} + +// AddOwnerWithThreshold is a paid mutator transaction binding the contract method 0x0d582f13. +// +// Solidity: function addOwnerWithThreshold(address owner, uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) AddOwnerWithThreshold(owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.Contract.AddOwnerWithThreshold(&_GnosisSafe.TransactOpts, owner, _threshold) +} + +// ApproveHash is a paid mutator transaction binding the contract method 0xd4d9bdcd. +// +// Solidity: function approveHash(bytes32 hashToApprove) returns() +func (_GnosisSafe *GnosisSafeTransactor) ApproveHash(opts *bind.TransactOpts, hashToApprove [32]byte) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "approveHash", hashToApprove) +} + +// ApproveHash is a paid mutator transaction binding the contract method 0xd4d9bdcd. +// +// Solidity: function approveHash(bytes32 hashToApprove) returns() +func (_GnosisSafe *GnosisSafeSession) ApproveHash(hashToApprove [32]byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.ApproveHash(&_GnosisSafe.TransactOpts, hashToApprove) +} + +// ApproveHash is a paid mutator transaction binding the contract method 0xd4d9bdcd. +// +// Solidity: function approveHash(bytes32 hashToApprove) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) ApproveHash(hashToApprove [32]byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.ApproveHash(&_GnosisSafe.TransactOpts, hashToApprove) +} + +// ChangeMasterCopy is a paid mutator transaction binding the contract method 0x7de7edef. +// +// Solidity: function changeMasterCopy(address _masterCopy) returns() +func (_GnosisSafe *GnosisSafeTransactor) ChangeMasterCopy(opts *bind.TransactOpts, _masterCopy common.Address) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "changeMasterCopy", _masterCopy) +} + +// ChangeMasterCopy is a paid mutator transaction binding the contract method 0x7de7edef. +// +// Solidity: function changeMasterCopy(address _masterCopy) returns() +func (_GnosisSafe *GnosisSafeSession) ChangeMasterCopy(_masterCopy common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.ChangeMasterCopy(&_GnosisSafe.TransactOpts, _masterCopy) +} + +// ChangeMasterCopy is a paid mutator transaction binding the contract method 0x7de7edef. +// +// Solidity: function changeMasterCopy(address _masterCopy) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) ChangeMasterCopy(_masterCopy common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.ChangeMasterCopy(&_GnosisSafe.TransactOpts, _masterCopy) +} + +// ChangeThreshold is a paid mutator transaction binding the contract method 0x694e80c3. +// +// Solidity: function changeThreshold(uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeTransactor) ChangeThreshold(opts *bind.TransactOpts, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "changeThreshold", _threshold) +} + +// ChangeThreshold is a paid mutator transaction binding the contract method 0x694e80c3. +// +// Solidity: function changeThreshold(uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeSession) ChangeThreshold(_threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.Contract.ChangeThreshold(&_GnosisSafe.TransactOpts, _threshold) +} + +// ChangeThreshold is a paid mutator transaction binding the contract method 0x694e80c3. +// +// Solidity: function changeThreshold(uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) ChangeThreshold(_threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.Contract.ChangeThreshold(&_GnosisSafe.TransactOpts, _threshold) +} + +// DisableModule is a paid mutator transaction binding the contract method 0xe009cfde. +// +// Solidity: function disableModule(address prevModule, address module) returns() +func (_GnosisSafe *GnosisSafeTransactor) DisableModule(opts *bind.TransactOpts, prevModule common.Address, module common.Address) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "disableModule", prevModule, module) +} + +// DisableModule is a paid mutator transaction binding the contract method 0xe009cfde. +// +// Solidity: function disableModule(address prevModule, address module) returns() +func (_GnosisSafe *GnosisSafeSession) DisableModule(prevModule common.Address, module common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.DisableModule(&_GnosisSafe.TransactOpts, prevModule, module) +} + +// DisableModule is a paid mutator transaction binding the contract method 0xe009cfde. +// +// Solidity: function disableModule(address prevModule, address module) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) DisableModule(prevModule common.Address, module common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.DisableModule(&_GnosisSafe.TransactOpts, prevModule, module) +} + +// EnableModule is a paid mutator transaction binding the contract method 0x610b5925. +// +// Solidity: function enableModule(address module) returns() +func (_GnosisSafe *GnosisSafeTransactor) EnableModule(opts *bind.TransactOpts, module common.Address) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "enableModule", module) +} + +// EnableModule is a paid mutator transaction binding the contract method 0x610b5925. +// +// Solidity: function enableModule(address module) returns() +func (_GnosisSafe *GnosisSafeSession) EnableModule(module common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.EnableModule(&_GnosisSafe.TransactOpts, module) +} + +// EnableModule is a paid mutator transaction binding the contract method 0x610b5925. +// +// Solidity: function enableModule(address module) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) EnableModule(module common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.EnableModule(&_GnosisSafe.TransactOpts, module) +} + +// ExecTransaction is a paid mutator transaction binding the contract method 0x6a761202. +// +// Solidity: function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures) payable returns(bool success) +func (_GnosisSafe *GnosisSafeTransactor) ExecTransaction(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, signatures []byte) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "execTransaction", to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures) +} + +// ExecTransaction is a paid mutator transaction binding the contract method 0x6a761202. +// +// Solidity: function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures) payable returns(bool success) +func (_GnosisSafe *GnosisSafeSession) ExecTransaction(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, signatures []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.ExecTransaction(&_GnosisSafe.TransactOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures) +} + +// ExecTransaction is a paid mutator transaction binding the contract method 0x6a761202. +// +// Solidity: function execTransaction(address to, uint256 value, bytes data, uint8 operation, uint256 safeTxGas, uint256 baseGas, uint256 gasPrice, address gasToken, address refundReceiver, bytes signatures) payable returns(bool success) +func (_GnosisSafe *GnosisSafeTransactorSession) ExecTransaction(to common.Address, value *big.Int, data []byte, operation uint8, safeTxGas *big.Int, baseGas *big.Int, gasPrice *big.Int, gasToken common.Address, refundReceiver common.Address, signatures []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.ExecTransaction(&_GnosisSafe.TransactOpts, to, value, data, operation, safeTxGas, baseGas, gasPrice, gasToken, refundReceiver, signatures) +} + +// ExecTransactionFromModule is a paid mutator transaction binding the contract method 0x468721a7. +// +// Solidity: function execTransactionFromModule(address to, uint256 value, bytes data, uint8 operation) returns(bool success) +func (_GnosisSafe *GnosisSafeTransactor) ExecTransactionFromModule(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "execTransactionFromModule", to, value, data, operation) +} + +// ExecTransactionFromModule is a paid mutator transaction binding the contract method 0x468721a7. +// +// Solidity: function execTransactionFromModule(address to, uint256 value, bytes data, uint8 operation) returns(bool success) +func (_GnosisSafe *GnosisSafeSession) ExecTransactionFromModule(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.Contract.ExecTransactionFromModule(&_GnosisSafe.TransactOpts, to, value, data, operation) +} + +// ExecTransactionFromModule is a paid mutator transaction binding the contract method 0x468721a7. +// +// Solidity: function execTransactionFromModule(address to, uint256 value, bytes data, uint8 operation) returns(bool success) +func (_GnosisSafe *GnosisSafeTransactorSession) ExecTransactionFromModule(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.Contract.ExecTransactionFromModule(&_GnosisSafe.TransactOpts, to, value, data, operation) +} + +// ExecTransactionFromModuleReturnData is a paid mutator transaction binding the contract method 0x5229073f. +// +// Solidity: function execTransactionFromModuleReturnData(address to, uint256 value, bytes data, uint8 operation) returns(bool success, bytes returnData) +func (_GnosisSafe *GnosisSafeTransactor) ExecTransactionFromModuleReturnData(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "execTransactionFromModuleReturnData", to, value, data, operation) +} + +// ExecTransactionFromModuleReturnData is a paid mutator transaction binding the contract method 0x5229073f. +// +// Solidity: function execTransactionFromModuleReturnData(address to, uint256 value, bytes data, uint8 operation) returns(bool success, bytes returnData) +func (_GnosisSafe *GnosisSafeSession) ExecTransactionFromModuleReturnData(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.Contract.ExecTransactionFromModuleReturnData(&_GnosisSafe.TransactOpts, to, value, data, operation) +} + +// ExecTransactionFromModuleReturnData is a paid mutator transaction binding the contract method 0x5229073f. +// +// Solidity: function execTransactionFromModuleReturnData(address to, uint256 value, bytes data, uint8 operation) returns(bool success, bytes returnData) +func (_GnosisSafe *GnosisSafeTransactorSession) ExecTransactionFromModuleReturnData(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.Contract.ExecTransactionFromModuleReturnData(&_GnosisSafe.TransactOpts, to, value, data, operation) +} + +// IsValidSignature is a paid mutator transaction binding the contract method 0x20c13b0b. +// +// Solidity: function isValidSignature(bytes _data, bytes _signature) returns(bytes4) +func (_GnosisSafe *GnosisSafeTransactor) IsValidSignature(opts *bind.TransactOpts, _data []byte, _signature []byte) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "isValidSignature", _data, _signature) +} + +// IsValidSignature is a paid mutator transaction binding the contract method 0x20c13b0b. +// +// Solidity: function isValidSignature(bytes _data, bytes _signature) returns(bytes4) +func (_GnosisSafe *GnosisSafeSession) IsValidSignature(_data []byte, _signature []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.IsValidSignature(&_GnosisSafe.TransactOpts, _data, _signature) +} + +// IsValidSignature is a paid mutator transaction binding the contract method 0x20c13b0b. +// +// Solidity: function isValidSignature(bytes _data, bytes _signature) returns(bytes4) +func (_GnosisSafe *GnosisSafeTransactorSession) IsValidSignature(_data []byte, _signature []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.IsValidSignature(&_GnosisSafe.TransactOpts, _data, _signature) +} + +// RemoveOwner is a paid mutator transaction binding the contract method 0xf8dc5dd9. +// +// Solidity: function removeOwner(address prevOwner, address owner, uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeTransactor) RemoveOwner(opts *bind.TransactOpts, prevOwner common.Address, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "removeOwner", prevOwner, owner, _threshold) +} + +// RemoveOwner is a paid mutator transaction binding the contract method 0xf8dc5dd9. +// +// Solidity: function removeOwner(address prevOwner, address owner, uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeSession) RemoveOwner(prevOwner common.Address, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.Contract.RemoveOwner(&_GnosisSafe.TransactOpts, prevOwner, owner, _threshold) +} + +// RemoveOwner is a paid mutator transaction binding the contract method 0xf8dc5dd9. +// +// Solidity: function removeOwner(address prevOwner, address owner, uint256 _threshold) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) RemoveOwner(prevOwner common.Address, owner common.Address, _threshold *big.Int) (*types.Transaction, error) { + return _GnosisSafe.Contract.RemoveOwner(&_GnosisSafe.TransactOpts, prevOwner, owner, _threshold) +} + +// RequiredTxGas is a paid mutator transaction binding the contract method 0xc4ca3a9c. +// +// Solidity: function requiredTxGas(address to, uint256 value, bytes data, uint8 operation) returns(uint256) +func (_GnosisSafe *GnosisSafeTransactor) RequiredTxGas(opts *bind.TransactOpts, to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "requiredTxGas", to, value, data, operation) +} + +// RequiredTxGas is a paid mutator transaction binding the contract method 0xc4ca3a9c. +// +// Solidity: function requiredTxGas(address to, uint256 value, bytes data, uint8 operation) returns(uint256) +func (_GnosisSafe *GnosisSafeSession) RequiredTxGas(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.Contract.RequiredTxGas(&_GnosisSafe.TransactOpts, to, value, data, operation) +} + +// RequiredTxGas is a paid mutator transaction binding the contract method 0xc4ca3a9c. +// +// Solidity: function requiredTxGas(address to, uint256 value, bytes data, uint8 operation) returns(uint256) +func (_GnosisSafe *GnosisSafeTransactorSession) RequiredTxGas(to common.Address, value *big.Int, data []byte, operation uint8) (*types.Transaction, error) { + return _GnosisSafe.Contract.RequiredTxGas(&_GnosisSafe.TransactOpts, to, value, data, operation) +} + +// SetFallbackHandler is a paid mutator transaction binding the contract method 0xf08a0323. +// +// Solidity: function setFallbackHandler(address handler) returns() +func (_GnosisSafe *GnosisSafeTransactor) SetFallbackHandler(opts *bind.TransactOpts, handler common.Address) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "setFallbackHandler", handler) +} + +// SetFallbackHandler is a paid mutator transaction binding the contract method 0xf08a0323. +// +// Solidity: function setFallbackHandler(address handler) returns() +func (_GnosisSafe *GnosisSafeSession) SetFallbackHandler(handler common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.SetFallbackHandler(&_GnosisSafe.TransactOpts, handler) +} + +// SetFallbackHandler is a paid mutator transaction binding the contract method 0xf08a0323. +// +// Solidity: function setFallbackHandler(address handler) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) SetFallbackHandler(handler common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.SetFallbackHandler(&_GnosisSafe.TransactOpts, handler) +} + +// Setup is a paid mutator transaction binding the contract method 0xb63e800d. +// +// Solidity: function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns() +func (_GnosisSafe *GnosisSafeTransactor) Setup(opts *bind.TransactOpts, _owners []common.Address, _threshold *big.Int, to common.Address, data []byte, fallbackHandler common.Address, paymentToken common.Address, payment *big.Int, paymentReceiver common.Address) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "setup", _owners, _threshold, to, data, fallbackHandler, paymentToken, payment, paymentReceiver) +} + +// Setup is a paid mutator transaction binding the contract method 0xb63e800d. +// +// Solidity: function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns() +func (_GnosisSafe *GnosisSafeSession) Setup(_owners []common.Address, _threshold *big.Int, to common.Address, data []byte, fallbackHandler common.Address, paymentToken common.Address, payment *big.Int, paymentReceiver common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.Setup(&_GnosisSafe.TransactOpts, _owners, _threshold, to, data, fallbackHandler, paymentToken, payment, paymentReceiver) +} + +// Setup is a paid mutator transaction binding the contract method 0xb63e800d. +// +// Solidity: function setup(address[] _owners, uint256 _threshold, address to, bytes data, address fallbackHandler, address paymentToken, uint256 payment, address paymentReceiver) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) Setup(_owners []common.Address, _threshold *big.Int, to common.Address, data []byte, fallbackHandler common.Address, paymentToken common.Address, payment *big.Int, paymentReceiver common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.Setup(&_GnosisSafe.TransactOpts, _owners, _threshold, to, data, fallbackHandler, paymentToken, payment, paymentReceiver) +} + +// SignMessage is a paid mutator transaction binding the contract method 0x85a5affe. +// +// Solidity: function signMessage(bytes _data) returns() +func (_GnosisSafe *GnosisSafeTransactor) SignMessage(opts *bind.TransactOpts, _data []byte) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "signMessage", _data) +} + +// SignMessage is a paid mutator transaction binding the contract method 0x85a5affe. +// +// Solidity: function signMessage(bytes _data) returns() +func (_GnosisSafe *GnosisSafeSession) SignMessage(_data []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.SignMessage(&_GnosisSafe.TransactOpts, _data) +} + +// SignMessage is a paid mutator transaction binding the contract method 0x85a5affe. +// +// Solidity: function signMessage(bytes _data) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) SignMessage(_data []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.SignMessage(&_GnosisSafe.TransactOpts, _data) +} + +// SwapOwner is a paid mutator transaction binding the contract method 0xe318b52b. +// +// Solidity: function swapOwner(address prevOwner, address oldOwner, address newOwner) returns() +func (_GnosisSafe *GnosisSafeTransactor) SwapOwner(opts *bind.TransactOpts, prevOwner common.Address, oldOwner common.Address, newOwner common.Address) (*types.Transaction, error) { + return _GnosisSafe.contract.Transact(opts, "swapOwner", prevOwner, oldOwner, newOwner) +} + +// SwapOwner is a paid mutator transaction binding the contract method 0xe318b52b. +// +// Solidity: function swapOwner(address prevOwner, address oldOwner, address newOwner) returns() +func (_GnosisSafe *GnosisSafeSession) SwapOwner(prevOwner common.Address, oldOwner common.Address, newOwner common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.SwapOwner(&_GnosisSafe.TransactOpts, prevOwner, oldOwner, newOwner) +} + +// SwapOwner is a paid mutator transaction binding the contract method 0xe318b52b. +// +// Solidity: function swapOwner(address prevOwner, address oldOwner, address newOwner) returns() +func (_GnosisSafe *GnosisSafeTransactorSession) SwapOwner(prevOwner common.Address, oldOwner common.Address, newOwner common.Address) (*types.Transaction, error) { + return _GnosisSafe.Contract.SwapOwner(&_GnosisSafe.TransactOpts, prevOwner, oldOwner, newOwner) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_GnosisSafe *GnosisSafeTransactor) Fallback(opts *bind.TransactOpts, calldata []byte) (*types.Transaction, error) { + return _GnosisSafe.contract.RawTransact(opts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_GnosisSafe *GnosisSafeSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.Fallback(&_GnosisSafe.TransactOpts, calldata) +} + +// Fallback is a paid mutator transaction binding the contract fallback function. +// +// Solidity: fallback() payable returns() +func (_GnosisSafe *GnosisSafeTransactorSession) Fallback(calldata []byte) (*types.Transaction, error) { + return _GnosisSafe.Contract.Fallback(&_GnosisSafe.TransactOpts, calldata) +} + +// GnosisSafeAddedOwnerIterator is returned from FilterAddedOwner and is used to iterate over the raw logs and unpacked data for AddedOwner events raised by the GnosisSafe contract. +type GnosisSafeAddedOwnerIterator struct { + Event *GnosisSafeAddedOwner // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeAddedOwnerIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeAddedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeAddedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeAddedOwnerIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeAddedOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeAddedOwner represents a AddedOwner event raised by the GnosisSafe contract. +type GnosisSafeAddedOwner struct { + Owner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAddedOwner is a free log retrieval operation binding the contract event 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26. +// +// Solidity: event AddedOwner(address owner) +func (_GnosisSafe *GnosisSafeFilterer) FilterAddedOwner(opts *bind.FilterOpts) (*GnosisSafeAddedOwnerIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "AddedOwner") + if err != nil { + return nil, err + } + return &GnosisSafeAddedOwnerIterator{contract: _GnosisSafe.contract, event: "AddedOwner", logs: logs, sub: sub}, nil +} + +// WatchAddedOwner is a free log subscription operation binding the contract event 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26. +// +// Solidity: event AddedOwner(address owner) +func (_GnosisSafe *GnosisSafeFilterer) WatchAddedOwner(opts *bind.WatchOpts, sink chan<- *GnosisSafeAddedOwner) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "AddedOwner") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeAddedOwner) + if err := _GnosisSafe.contract.UnpackLog(event, "AddedOwner", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseAddedOwner is a log parse operation binding the contract event 0x9465fa0c962cc76958e6373a993326400c1c94f8be2fe3a952adfa7f60b2ea26. +// +// Solidity: event AddedOwner(address owner) +func (_GnosisSafe *GnosisSafeFilterer) ParseAddedOwner(log types.Log) (*GnosisSafeAddedOwner, error) { + event := new(GnosisSafeAddedOwner) + if err := _GnosisSafe.contract.UnpackLog(event, "AddedOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeApproveHashIterator is returned from FilterApproveHash and is used to iterate over the raw logs and unpacked data for ApproveHash events raised by the GnosisSafe contract. +type GnosisSafeApproveHashIterator struct { + Event *GnosisSafeApproveHash // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeApproveHashIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeApproveHash) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeApproveHash) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeApproveHashIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeApproveHashIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeApproveHash represents a ApproveHash event raised by the GnosisSafe contract. +type GnosisSafeApproveHash struct { + ApprovedHash [32]byte + Owner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterApproveHash is a free log retrieval operation binding the contract event 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c. +// +// Solidity: event ApproveHash(bytes32 indexed approvedHash, address indexed owner) +func (_GnosisSafe *GnosisSafeFilterer) FilterApproveHash(opts *bind.FilterOpts, approvedHash [][32]byte, owner []common.Address) (*GnosisSafeApproveHashIterator, error) { + + var approvedHashRule []interface{} + for _, approvedHashItem := range approvedHash { + approvedHashRule = append(approvedHashRule, approvedHashItem) + } + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ApproveHash", approvedHashRule, ownerRule) + if err != nil { + return nil, err + } + return &GnosisSafeApproveHashIterator{contract: _GnosisSafe.contract, event: "ApproveHash", logs: logs, sub: sub}, nil +} + +// WatchApproveHash is a free log subscription operation binding the contract event 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c. +// +// Solidity: event ApproveHash(bytes32 indexed approvedHash, address indexed owner) +func (_GnosisSafe *GnosisSafeFilterer) WatchApproveHash(opts *bind.WatchOpts, sink chan<- *GnosisSafeApproveHash, approvedHash [][32]byte, owner []common.Address) (event.Subscription, error) { + + var approvedHashRule []interface{} + for _, approvedHashItem := range approvedHash { + approvedHashRule = append(approvedHashRule, approvedHashItem) + } + var ownerRule []interface{} + for _, ownerItem := range owner { + ownerRule = append(ownerRule, ownerItem) + } + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ApproveHash", approvedHashRule, ownerRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeApproveHash) + if err := _GnosisSafe.contract.UnpackLog(event, "ApproveHash", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseApproveHash is a log parse operation binding the contract event 0xf2a0eb156472d1440255b0d7c1e19cc07115d1051fe605b0dce69acfec884d9c. +// +// Solidity: event ApproveHash(bytes32 indexed approvedHash, address indexed owner) +func (_GnosisSafe *GnosisSafeFilterer) ParseApproveHash(log types.Log) (*GnosisSafeApproveHash, error) { + event := new(GnosisSafeApproveHash) + if err := _GnosisSafe.contract.UnpackLog(event, "ApproveHash", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeChangedMasterCopyIterator is returned from FilterChangedMasterCopy and is used to iterate over the raw logs and unpacked data for ChangedMasterCopy events raised by the GnosisSafe contract. +type GnosisSafeChangedMasterCopyIterator struct { + Event *GnosisSafeChangedMasterCopy // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeChangedMasterCopyIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeChangedMasterCopy) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeChangedMasterCopy) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeChangedMasterCopyIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeChangedMasterCopyIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeChangedMasterCopy represents a ChangedMasterCopy event raised by the GnosisSafe contract. +type GnosisSafeChangedMasterCopy struct { + MasterCopy common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChangedMasterCopy is a free log retrieval operation binding the contract event 0x75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b8. +// +// Solidity: event ChangedMasterCopy(address masterCopy) +func (_GnosisSafe *GnosisSafeFilterer) FilterChangedMasterCopy(opts *bind.FilterOpts) (*GnosisSafeChangedMasterCopyIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ChangedMasterCopy") + if err != nil { + return nil, err + } + return &GnosisSafeChangedMasterCopyIterator{contract: _GnosisSafe.contract, event: "ChangedMasterCopy", logs: logs, sub: sub}, nil +} + +// WatchChangedMasterCopy is a free log subscription operation binding the contract event 0x75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b8. +// +// Solidity: event ChangedMasterCopy(address masterCopy) +func (_GnosisSafe *GnosisSafeFilterer) WatchChangedMasterCopy(opts *bind.WatchOpts, sink chan<- *GnosisSafeChangedMasterCopy) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ChangedMasterCopy") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeChangedMasterCopy) + if err := _GnosisSafe.contract.UnpackLog(event, "ChangedMasterCopy", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChangedMasterCopy is a log parse operation binding the contract event 0x75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b8. +// +// Solidity: event ChangedMasterCopy(address masterCopy) +func (_GnosisSafe *GnosisSafeFilterer) ParseChangedMasterCopy(log types.Log) (*GnosisSafeChangedMasterCopy, error) { + event := new(GnosisSafeChangedMasterCopy) + if err := _GnosisSafe.contract.UnpackLog(event, "ChangedMasterCopy", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeChangedThresholdIterator is returned from FilterChangedThreshold and is used to iterate over the raw logs and unpacked data for ChangedThreshold events raised by the GnosisSafe contract. +type GnosisSafeChangedThresholdIterator struct { + Event *GnosisSafeChangedThreshold // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeChangedThresholdIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeChangedThreshold) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeChangedThreshold) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeChangedThresholdIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeChangedThresholdIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeChangedThreshold represents a ChangedThreshold event raised by the GnosisSafe contract. +type GnosisSafeChangedThreshold struct { + Threshold *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterChangedThreshold is a free log retrieval operation binding the contract event 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93. +// +// Solidity: event ChangedThreshold(uint256 threshold) +func (_GnosisSafe *GnosisSafeFilterer) FilterChangedThreshold(opts *bind.FilterOpts) (*GnosisSafeChangedThresholdIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ChangedThreshold") + if err != nil { + return nil, err + } + return &GnosisSafeChangedThresholdIterator{contract: _GnosisSafe.contract, event: "ChangedThreshold", logs: logs, sub: sub}, nil +} + +// WatchChangedThreshold is a free log subscription operation binding the contract event 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93. +// +// Solidity: event ChangedThreshold(uint256 threshold) +func (_GnosisSafe *GnosisSafeFilterer) WatchChangedThreshold(opts *bind.WatchOpts, sink chan<- *GnosisSafeChangedThreshold) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ChangedThreshold") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeChangedThreshold) + if err := _GnosisSafe.contract.UnpackLog(event, "ChangedThreshold", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseChangedThreshold is a log parse operation binding the contract event 0x610f7ff2b304ae8903c3de74c60c6ab1f7d6226b3f52c5161905bb5ad4039c93. +// +// Solidity: event ChangedThreshold(uint256 threshold) +func (_GnosisSafe *GnosisSafeFilterer) ParseChangedThreshold(log types.Log) (*GnosisSafeChangedThreshold, error) { + event := new(GnosisSafeChangedThreshold) + if err := _GnosisSafe.contract.UnpackLog(event, "ChangedThreshold", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeDisabledModuleIterator is returned from FilterDisabledModule and is used to iterate over the raw logs and unpacked data for DisabledModule events raised by the GnosisSafe contract. +type GnosisSafeDisabledModuleIterator struct { + Event *GnosisSafeDisabledModule // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeDisabledModuleIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeDisabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeDisabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeDisabledModuleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeDisabledModuleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeDisabledModule represents a DisabledModule event raised by the GnosisSafe contract. +type GnosisSafeDisabledModule struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDisabledModule is a free log retrieval operation binding the contract event 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276. +// +// Solidity: event DisabledModule(address module) +func (_GnosisSafe *GnosisSafeFilterer) FilterDisabledModule(opts *bind.FilterOpts) (*GnosisSafeDisabledModuleIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "DisabledModule") + if err != nil { + return nil, err + } + return &GnosisSafeDisabledModuleIterator{contract: _GnosisSafe.contract, event: "DisabledModule", logs: logs, sub: sub}, nil +} + +// WatchDisabledModule is a free log subscription operation binding the contract event 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276. +// +// Solidity: event DisabledModule(address module) +func (_GnosisSafe *GnosisSafeFilterer) WatchDisabledModule(opts *bind.WatchOpts, sink chan<- *GnosisSafeDisabledModule) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "DisabledModule") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeDisabledModule) + if err := _GnosisSafe.contract.UnpackLog(event, "DisabledModule", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDisabledModule is a log parse operation binding the contract event 0xaab4fa2b463f581b2b32cb3b7e3b704b9ce37cc209b5fb4d77e593ace4054276. +// +// Solidity: event DisabledModule(address module) +func (_GnosisSafe *GnosisSafeFilterer) ParseDisabledModule(log types.Log) (*GnosisSafeDisabledModule, error) { + event := new(GnosisSafeDisabledModule) + if err := _GnosisSafe.contract.UnpackLog(event, "DisabledModule", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeEnabledModuleIterator is returned from FilterEnabledModule and is used to iterate over the raw logs and unpacked data for EnabledModule events raised by the GnosisSafe contract. +type GnosisSafeEnabledModuleIterator struct { + Event *GnosisSafeEnabledModule // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeEnabledModuleIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeEnabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeEnabledModule) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeEnabledModuleIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeEnabledModuleIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeEnabledModule represents a EnabledModule event raised by the GnosisSafe contract. +type GnosisSafeEnabledModule struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterEnabledModule is a free log retrieval operation binding the contract event 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440. +// +// Solidity: event EnabledModule(address module) +func (_GnosisSafe *GnosisSafeFilterer) FilterEnabledModule(opts *bind.FilterOpts) (*GnosisSafeEnabledModuleIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "EnabledModule") + if err != nil { + return nil, err + } + return &GnosisSafeEnabledModuleIterator{contract: _GnosisSafe.contract, event: "EnabledModule", logs: logs, sub: sub}, nil +} + +// WatchEnabledModule is a free log subscription operation binding the contract event 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440. +// +// Solidity: event EnabledModule(address module) +func (_GnosisSafe *GnosisSafeFilterer) WatchEnabledModule(opts *bind.WatchOpts, sink chan<- *GnosisSafeEnabledModule) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "EnabledModule") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeEnabledModule) + if err := _GnosisSafe.contract.UnpackLog(event, "EnabledModule", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseEnabledModule is a log parse operation binding the contract event 0xecdf3a3effea5783a3c4c2140e677577666428d44ed9d474a0b3a4c9943f8440. +// +// Solidity: event EnabledModule(address module) +func (_GnosisSafe *GnosisSafeFilterer) ParseEnabledModule(log types.Log) (*GnosisSafeEnabledModule, error) { + event := new(GnosisSafeEnabledModule) + if err := _GnosisSafe.contract.UnpackLog(event, "EnabledModule", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeExecutionFailureIterator is returned from FilterExecutionFailure and is used to iterate over the raw logs and unpacked data for ExecutionFailure events raised by the GnosisSafe contract. +type GnosisSafeExecutionFailureIterator struct { + Event *GnosisSafeExecutionFailure // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeExecutionFailureIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeExecutionFailureIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeExecutionFailureIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeExecutionFailure represents a ExecutionFailure event raised by the GnosisSafe contract. +type GnosisSafeExecutionFailure struct { + TxHash [32]byte + Payment *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionFailure is a free log retrieval operation binding the contract event 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23. +// +// Solidity: event ExecutionFailure(bytes32 txHash, uint256 payment) +func (_GnosisSafe *GnosisSafeFilterer) FilterExecutionFailure(opts *bind.FilterOpts) (*GnosisSafeExecutionFailureIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ExecutionFailure") + if err != nil { + return nil, err + } + return &GnosisSafeExecutionFailureIterator{contract: _GnosisSafe.contract, event: "ExecutionFailure", logs: logs, sub: sub}, nil +} + +// WatchExecutionFailure is a free log subscription operation binding the contract event 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23. +// +// Solidity: event ExecutionFailure(bytes32 txHash, uint256 payment) +func (_GnosisSafe *GnosisSafeFilterer) WatchExecutionFailure(opts *bind.WatchOpts, sink chan<- *GnosisSafeExecutionFailure) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ExecutionFailure") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeExecutionFailure) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionFailure", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionFailure is a log parse operation binding the contract event 0x23428b18acfb3ea64b08dc0c1d296ea9c09702c09083ca5272e64d115b687d23. +// +// Solidity: event ExecutionFailure(bytes32 txHash, uint256 payment) +func (_GnosisSafe *GnosisSafeFilterer) ParseExecutionFailure(log types.Log) (*GnosisSafeExecutionFailure, error) { + event := new(GnosisSafeExecutionFailure) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionFailure", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeExecutionFromModuleFailureIterator is returned from FilterExecutionFromModuleFailure and is used to iterate over the raw logs and unpacked data for ExecutionFromModuleFailure events raised by the GnosisSafe contract. +type GnosisSafeExecutionFromModuleFailureIterator struct { + Event *GnosisSafeExecutionFromModuleFailure // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeExecutionFromModuleFailureIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionFromModuleFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionFromModuleFailure) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeExecutionFromModuleFailureIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeExecutionFromModuleFailureIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeExecutionFromModuleFailure represents a ExecutionFromModuleFailure event raised by the GnosisSafe contract. +type GnosisSafeExecutionFromModuleFailure struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionFromModuleFailure is a free log retrieval operation binding the contract event 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375. +// +// Solidity: event ExecutionFromModuleFailure(address indexed module) +func (_GnosisSafe *GnosisSafeFilterer) FilterExecutionFromModuleFailure(opts *bind.FilterOpts, module []common.Address) (*GnosisSafeExecutionFromModuleFailureIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ExecutionFromModuleFailure", moduleRule) + if err != nil { + return nil, err + } + return &GnosisSafeExecutionFromModuleFailureIterator{contract: _GnosisSafe.contract, event: "ExecutionFromModuleFailure", logs: logs, sub: sub}, nil +} + +// WatchExecutionFromModuleFailure is a free log subscription operation binding the contract event 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375. +// +// Solidity: event ExecutionFromModuleFailure(address indexed module) +func (_GnosisSafe *GnosisSafeFilterer) WatchExecutionFromModuleFailure(opts *bind.WatchOpts, sink chan<- *GnosisSafeExecutionFromModuleFailure, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ExecutionFromModuleFailure", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeExecutionFromModuleFailure) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionFromModuleFailure", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionFromModuleFailure is a log parse operation binding the contract event 0xacd2c8702804128fdb0db2bb49f6d127dd0181c13fd45dbfe16de0930e2bd375. +// +// Solidity: event ExecutionFromModuleFailure(address indexed module) +func (_GnosisSafe *GnosisSafeFilterer) ParseExecutionFromModuleFailure(log types.Log) (*GnosisSafeExecutionFromModuleFailure, error) { + event := new(GnosisSafeExecutionFromModuleFailure) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionFromModuleFailure", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeExecutionFromModuleSuccessIterator is returned from FilterExecutionFromModuleSuccess and is used to iterate over the raw logs and unpacked data for ExecutionFromModuleSuccess events raised by the GnosisSafe contract. +type GnosisSafeExecutionFromModuleSuccessIterator struct { + Event *GnosisSafeExecutionFromModuleSuccess // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeExecutionFromModuleSuccessIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionFromModuleSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionFromModuleSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeExecutionFromModuleSuccessIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeExecutionFromModuleSuccessIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeExecutionFromModuleSuccess represents a ExecutionFromModuleSuccess event raised by the GnosisSafe contract. +type GnosisSafeExecutionFromModuleSuccess struct { + Module common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionFromModuleSuccess is a free log retrieval operation binding the contract event 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8. +// +// Solidity: event ExecutionFromModuleSuccess(address indexed module) +func (_GnosisSafe *GnosisSafeFilterer) FilterExecutionFromModuleSuccess(opts *bind.FilterOpts, module []common.Address) (*GnosisSafeExecutionFromModuleSuccessIterator, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ExecutionFromModuleSuccess", moduleRule) + if err != nil { + return nil, err + } + return &GnosisSafeExecutionFromModuleSuccessIterator{contract: _GnosisSafe.contract, event: "ExecutionFromModuleSuccess", logs: logs, sub: sub}, nil +} + +// WatchExecutionFromModuleSuccess is a free log subscription operation binding the contract event 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8. +// +// Solidity: event ExecutionFromModuleSuccess(address indexed module) +func (_GnosisSafe *GnosisSafeFilterer) WatchExecutionFromModuleSuccess(opts *bind.WatchOpts, sink chan<- *GnosisSafeExecutionFromModuleSuccess, module []common.Address) (event.Subscription, error) { + + var moduleRule []interface{} + for _, moduleItem := range module { + moduleRule = append(moduleRule, moduleItem) + } + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ExecutionFromModuleSuccess", moduleRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeExecutionFromModuleSuccess) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionFromModuleSuccess", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionFromModuleSuccess is a log parse operation binding the contract event 0x6895c13664aa4f67288b25d7a21d7aaa34916e355fb9b6fae0a139a9085becb8. +// +// Solidity: event ExecutionFromModuleSuccess(address indexed module) +func (_GnosisSafe *GnosisSafeFilterer) ParseExecutionFromModuleSuccess(log types.Log) (*GnosisSafeExecutionFromModuleSuccess, error) { + event := new(GnosisSafeExecutionFromModuleSuccess) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionFromModuleSuccess", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeExecutionSuccessIterator is returned from FilterExecutionSuccess and is used to iterate over the raw logs and unpacked data for ExecutionSuccess events raised by the GnosisSafe contract. +type GnosisSafeExecutionSuccessIterator struct { + Event *GnosisSafeExecutionSuccess // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeExecutionSuccessIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeExecutionSuccess) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeExecutionSuccessIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeExecutionSuccessIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeExecutionSuccess represents a ExecutionSuccess event raised by the GnosisSafe contract. +type GnosisSafeExecutionSuccess struct { + TxHash [32]byte + Payment *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterExecutionSuccess is a free log retrieval operation binding the contract event 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e. +// +// Solidity: event ExecutionSuccess(bytes32 txHash, uint256 payment) +func (_GnosisSafe *GnosisSafeFilterer) FilterExecutionSuccess(opts *bind.FilterOpts) (*GnosisSafeExecutionSuccessIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "ExecutionSuccess") + if err != nil { + return nil, err + } + return &GnosisSafeExecutionSuccessIterator{contract: _GnosisSafe.contract, event: "ExecutionSuccess", logs: logs, sub: sub}, nil +} + +// WatchExecutionSuccess is a free log subscription operation binding the contract event 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e. +// +// Solidity: event ExecutionSuccess(bytes32 txHash, uint256 payment) +func (_GnosisSafe *GnosisSafeFilterer) WatchExecutionSuccess(opts *bind.WatchOpts, sink chan<- *GnosisSafeExecutionSuccess) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "ExecutionSuccess") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeExecutionSuccess) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionSuccess", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseExecutionSuccess is a log parse operation binding the contract event 0x442e715f626346e8c54381002da614f62bee8d27386535b2521ec8540898556e. +// +// Solidity: event ExecutionSuccess(bytes32 txHash, uint256 payment) +func (_GnosisSafe *GnosisSafeFilterer) ParseExecutionSuccess(log types.Log) (*GnosisSafeExecutionSuccess, error) { + event := new(GnosisSafeExecutionSuccess) + if err := _GnosisSafe.contract.UnpackLog(event, "ExecutionSuccess", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeRemovedOwnerIterator is returned from FilterRemovedOwner and is used to iterate over the raw logs and unpacked data for RemovedOwner events raised by the GnosisSafe contract. +type GnosisSafeRemovedOwnerIterator struct { + Event *GnosisSafeRemovedOwner // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeRemovedOwnerIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeRemovedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeRemovedOwner) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeRemovedOwnerIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeRemovedOwnerIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeRemovedOwner represents a RemovedOwner event raised by the GnosisSafe contract. +type GnosisSafeRemovedOwner struct { + Owner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterRemovedOwner is a free log retrieval operation binding the contract event 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf. +// +// Solidity: event RemovedOwner(address owner) +func (_GnosisSafe *GnosisSafeFilterer) FilterRemovedOwner(opts *bind.FilterOpts) (*GnosisSafeRemovedOwnerIterator, error) { + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "RemovedOwner") + if err != nil { + return nil, err + } + return &GnosisSafeRemovedOwnerIterator{contract: _GnosisSafe.contract, event: "RemovedOwner", logs: logs, sub: sub}, nil +} + +// WatchRemovedOwner is a free log subscription operation binding the contract event 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf. +// +// Solidity: event RemovedOwner(address owner) +func (_GnosisSafe *GnosisSafeFilterer) WatchRemovedOwner(opts *bind.WatchOpts, sink chan<- *GnosisSafeRemovedOwner) (event.Subscription, error) { + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "RemovedOwner") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeRemovedOwner) + if err := _GnosisSafe.contract.UnpackLog(event, "RemovedOwner", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseRemovedOwner is a log parse operation binding the contract event 0xf8d49fc529812e9a7c5c50e69c20f0dccc0db8fa95c98bc58cc9a4f1c1299eaf. +// +// Solidity: event RemovedOwner(address owner) +func (_GnosisSafe *GnosisSafeFilterer) ParseRemovedOwner(log types.Log) (*GnosisSafeRemovedOwner, error) { + event := new(GnosisSafeRemovedOwner) + if err := _GnosisSafe.contract.UnpackLog(event, "RemovedOwner", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// GnosisSafeSignMsgIterator is returned from FilterSignMsg and is used to iterate over the raw logs and unpacked data for SignMsg events raised by the GnosisSafe contract. +type GnosisSafeSignMsgIterator struct { + Event *GnosisSafeSignMsg // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *GnosisSafeSignMsgIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(GnosisSafeSignMsg) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(GnosisSafeSignMsg) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *GnosisSafeSignMsgIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *GnosisSafeSignMsgIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// GnosisSafeSignMsg represents a SignMsg event raised by the GnosisSafe contract. +type GnosisSafeSignMsg struct { + MsgHash [32]byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterSignMsg is a free log retrieval operation binding the contract event 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4. +// +// Solidity: event SignMsg(bytes32 indexed msgHash) +func (_GnosisSafe *GnosisSafeFilterer) FilterSignMsg(opts *bind.FilterOpts, msgHash [][32]byte) (*GnosisSafeSignMsgIterator, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _GnosisSafe.contract.FilterLogs(opts, "SignMsg", msgHashRule) + if err != nil { + return nil, err + } + return &GnosisSafeSignMsgIterator{contract: _GnosisSafe.contract, event: "SignMsg", logs: logs, sub: sub}, nil +} + +// WatchSignMsg is a free log subscription operation binding the contract event 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4. +// +// Solidity: event SignMsg(bytes32 indexed msgHash) +func (_GnosisSafe *GnosisSafeFilterer) WatchSignMsg(opts *bind.WatchOpts, sink chan<- *GnosisSafeSignMsg, msgHash [][32]byte) (event.Subscription, error) { + + var msgHashRule []interface{} + for _, msgHashItem := range msgHash { + msgHashRule = append(msgHashRule, msgHashItem) + } + + logs, sub, err := _GnosisSafe.contract.WatchLogs(opts, "SignMsg", msgHashRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(GnosisSafeSignMsg) + if err := _GnosisSafe.contract.UnpackLog(event, "SignMsg", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseSignMsg is a log parse operation binding the contract event 0xe7f4675038f4f6034dfcbbb24c4dc08e4ebf10eb9d257d3d02c0f38d122ac6e4. +// +// Solidity: event SignMsg(bytes32 indexed msgHash) +func (_GnosisSafe *GnosisSafeFilterer) ParseSignMsg(log types.Log) (*GnosisSafeSignMsg, error) { + event := new(GnosisSafeSignMsg) + if err := _GnosisSafe.contract.UnpackLog(event, "SignMsg", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func CreateGnosisSafeDeploymentCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc string + var gasLimit uint64 + var simulate bool + var timeout uint + + cmd := &cobra.Command{ + Use: "deploy", + Short: "Deploy a new GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + address, deploymentTransaction, _, deploymentErr := DeployGnosisSafe( + transactionOpts, + client, + ) + if deploymentErr != nil { + return deploymentErr + } + + cmd.Printf("Transaction hash: %s\nContract address: %s\n", deploymentTransaction.Hash().Hex(), address.Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + Data: deploymentTransaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := deploymentTransaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + + return cmd +} + +func CreateApprovedHashesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var arg0 common.Address + var arg0Raw string + var arg1 [32]byte + var arg1Raw string + + var capture0 *big.Int + + cmd := &cobra.Command{ + Use: "approved-hashes", + Short: "Call the ApprovedHashes view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if arg0Raw == "" { + return fmt.Errorf("--arg-0 argument not specified") + } else if !common.IsHexAddress(arg0Raw) { + return fmt.Errorf("--arg-0 argument is not a valid Ethereum address") + } + arg0 = common.HexToAddress(arg0Raw) + + var arg1Intermediate []byte + + var arg1IntermediateHexDecodeErr error + arg1Intermediate, arg1IntermediateHexDecodeErr = hex.DecodeString(arg1Raw) + if arg1IntermediateHexDecodeErr != nil { + return arg1IntermediateHexDecodeErr + } + + copy(arg1[:], arg1Intermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.ApprovedHashes( + arg0, + arg1, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.String()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument (common.Address)") + cmd.Flags().StringVar(&arg1Raw, "arg-1", "", "arg-1 argument ([32]byte)") + + return cmd +} +func CreateDomainSeparatorCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 [32]byte + + cmd := &cobra.Command{ + Use: "domain-separator", + Short: "Call the DomainSeparator view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.DomainSeparator() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateEncodeTransactionDataCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var to0 common.Address + var to0Raw string + var value0 *big.Int + var value0Raw string + var data []byte + var dataRaw string + var operation uint8 + + var safeTxGas *big.Int + var safeTxGasRaw string + var baseGas *big.Int + var baseGasRaw string + var gasPrice0 *big.Int + var gasPrice0Raw string + var gasToken common.Address + var gasTokenRaw string + var refundReceiver common.Address + var refundReceiverRaw string + var _nonce0 *big.Int + var _nonce0Raw string + + var capture0 []byte + + cmd := &cobra.Command{ + Use: "encode-transaction-data", + Short: "Call the EncodeTransactionData view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + if value0Raw == "" { + return fmt.Errorf("--value-0 argument not specified") + } + value0 = new(big.Int) + value0.SetString(value0Raw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + if safeTxGasRaw == "" { + return fmt.Errorf("--safe-tx-gas argument not specified") + } + safeTxGas = new(big.Int) + safeTxGas.SetString(safeTxGasRaw, 0) + + if baseGasRaw == "" { + return fmt.Errorf("--base-gas argument not specified") + } + baseGas = new(big.Int) + baseGas.SetString(baseGasRaw, 0) + + if gasPrice0Raw == "" { + return fmt.Errorf("--gas-price-0 argument not specified") + } + gasPrice0 = new(big.Int) + gasPrice0.SetString(gasPrice0Raw, 0) + + if gasTokenRaw == "" { + return fmt.Errorf("--gas-token argument not specified") + } else if !common.IsHexAddress(gasTokenRaw) { + return fmt.Errorf("--gas-token argument is not a valid Ethereum address") + } + gasToken = common.HexToAddress(gasTokenRaw) + + if refundReceiverRaw == "" { + return fmt.Errorf("--refund-receiver argument not specified") + } else if !common.IsHexAddress(refundReceiverRaw) { + return fmt.Errorf("--refund-receiver argument is not a valid Ethereum address") + } + refundReceiver = common.HexToAddress(refundReceiverRaw) + + if _nonce0Raw == "" { + return fmt.Errorf("---nonce-0 argument not specified") + } + _nonce0 = new(big.Int) + _nonce0.SetString(_nonce0Raw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.EncodeTransactionData( + to0, + value0, + data, + operation, + safeTxGas, + baseGas, + gasPrice0, + gasToken, + refundReceiver, + _nonce0, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().Uint8Var(&operation, "operation", 0, "operation argument") + cmd.Flags().StringVar(&safeTxGasRaw, "safe-tx-gas", "", "safe-tx-gas argument") + cmd.Flags().StringVar(&baseGasRaw, "base-gas", "", "base-gas argument") + cmd.Flags().StringVar(&gasPrice0Raw, "gas-price-0", "", "gas-price-0 argument") + cmd.Flags().StringVar(&gasTokenRaw, "gas-token", "", "gas-token argument (common.Address)") + cmd.Flags().StringVar(&refundReceiverRaw, "refund-receiver", "", "refund-receiver argument (common.Address)") + cmd.Flags().StringVar(&_nonce0Raw, "-nonce-0", "", "-nonce-0 argument") + + return cmd +} +func CreateGetMessageHashCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var message []byte + var messageRaw string + + var capture0 [32]byte + + cmd := &cobra.Command{ + Use: "get-message-hash", + Short: "Call the GetMessageHash view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var messageIntermediate []byte + + var messageIntermediateHexDecodeErr error + messageIntermediate, messageIntermediateHexDecodeErr = hex.DecodeString(messageRaw) + if messageIntermediateHexDecodeErr != nil { + return messageIntermediateHexDecodeErr + } + + copy(message[:], messageIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetMessageHash( + message, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&messageRaw, "message", "", "message argument ([]byte)") + + return cmd +} +func CreateGetModulesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 []common.Address + + cmd := &cobra.Command{ + Use: "get-modules", + Short: "Call the GetModules view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetModules() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateGetModulesPaginatedCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var start common.Address + var startRaw string + var pageSize *big.Int + var pageSizeRaw string + + var capture0 struct { + Array []common.Address + Next common.Address + } + + cmd := &cobra.Command{ + Use: "get-modules-paginated", + Short: "Call the GetModulesPaginated view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if startRaw == "" { + return fmt.Errorf("--start argument not specified") + } else if !common.IsHexAddress(startRaw) { + return fmt.Errorf("--start argument is not a valid Ethereum address") + } + start = common.HexToAddress(startRaw) + + if pageSizeRaw == "" { + return fmt.Errorf("--page-size argument not specified") + } + pageSize = new(big.Int) + pageSize.SetString(pageSizeRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetModulesPaginated( + start, + pageSize, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&startRaw, "start", "", "start argument (common.Address)") + cmd.Flags().StringVar(&pageSizeRaw, "page-size", "", "page-size argument") + + return cmd +} +func CreateGetOwnersCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 []common.Address + + cmd := &cobra.Command{ + Use: "get-owners", + Short: "Call the GetOwners view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetOwners() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateGetThresholdCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 *big.Int + + cmd := &cobra.Command{ + Use: "get-threshold", + Short: "Call the GetThreshold view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetThreshold() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.String()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateGetTransactionHashCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var to0 common.Address + var to0Raw string + var value0 *big.Int + var value0Raw string + var data []byte + var dataRaw string + var operation uint8 + + var safeTxGas *big.Int + var safeTxGasRaw string + var baseGas *big.Int + var baseGasRaw string + var gasPrice0 *big.Int + var gasPrice0Raw string + var gasToken common.Address + var gasTokenRaw string + var refundReceiver common.Address + var refundReceiverRaw string + var _nonce0 *big.Int + var _nonce0Raw string + + var capture0 [32]byte + + cmd := &cobra.Command{ + Use: "get-transaction-hash", + Short: "Call the GetTransactionHash view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + if value0Raw == "" { + return fmt.Errorf("--value-0 argument not specified") + } + value0 = new(big.Int) + value0.SetString(value0Raw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + if safeTxGasRaw == "" { + return fmt.Errorf("--safe-tx-gas argument not specified") + } + safeTxGas = new(big.Int) + safeTxGas.SetString(safeTxGasRaw, 0) + + if baseGasRaw == "" { + return fmt.Errorf("--base-gas argument not specified") + } + baseGas = new(big.Int) + baseGas.SetString(baseGasRaw, 0) + + if gasPrice0Raw == "" { + return fmt.Errorf("--gas-price-0 argument not specified") + } + gasPrice0 = new(big.Int) + gasPrice0.SetString(gasPrice0Raw, 0) + + if gasTokenRaw == "" { + return fmt.Errorf("--gas-token argument not specified") + } else if !common.IsHexAddress(gasTokenRaw) { + return fmt.Errorf("--gas-token argument is not a valid Ethereum address") + } + gasToken = common.HexToAddress(gasTokenRaw) + + if refundReceiverRaw == "" { + return fmt.Errorf("--refund-receiver argument not specified") + } else if !common.IsHexAddress(refundReceiverRaw) { + return fmt.Errorf("--refund-receiver argument is not a valid Ethereum address") + } + refundReceiver = common.HexToAddress(refundReceiverRaw) + + if _nonce0Raw == "" { + return fmt.Errorf("---nonce-0 argument not specified") + } + _nonce0 = new(big.Int) + _nonce0.SetString(_nonce0Raw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetTransactionHash( + to0, + value0, + data, + operation, + safeTxGas, + baseGas, + gasPrice0, + gasToken, + refundReceiver, + _nonce0, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().Uint8Var(&operation, "operation", 0, "operation argument") + cmd.Flags().StringVar(&safeTxGasRaw, "safe-tx-gas", "", "safe-tx-gas argument") + cmd.Flags().StringVar(&baseGasRaw, "base-gas", "", "base-gas argument") + cmd.Flags().StringVar(&gasPrice0Raw, "gas-price-0", "", "gas-price-0 argument") + cmd.Flags().StringVar(&gasTokenRaw, "gas-token", "", "gas-token argument (common.Address)") + cmd.Flags().StringVar(&refundReceiverRaw, "refund-receiver", "", "refund-receiver argument (common.Address)") + cmd.Flags().StringVar(&_nonce0Raw, "-nonce-0", "", "-nonce-0 argument") + + return cmd +} +func CreateIsModuleEnabledCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var module common.Address + var moduleRaw string + + var capture0 bool + + cmd := &cobra.Command{ + Use: "is-module-enabled", + Short: "Call the IsModuleEnabled view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if moduleRaw == "" { + return fmt.Errorf("--module argument not specified") + } else if !common.IsHexAddress(moduleRaw) { + return fmt.Errorf("--module argument is not a valid Ethereum address") + } + module = common.HexToAddress(moduleRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.IsModuleEnabled( + module, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %t\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&moduleRaw, "module", "", "module argument (common.Address)") + + return cmd +} +func CreateIsOwnerCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var owner common.Address + var ownerRaw string + + var capture0 bool + + cmd := &cobra.Command{ + Use: "is-owner", + Short: "Call the IsOwner view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if ownerRaw == "" { + return fmt.Errorf("--owner argument not specified") + } else if !common.IsHexAddress(ownerRaw) { + return fmt.Errorf("--owner argument is not a valid Ethereum address") + } + owner = common.HexToAddress(ownerRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.IsOwner( + owner, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %t\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&ownerRaw, "owner", "", "owner argument (common.Address)") + + return cmd +} +func CreateNameCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 string + + cmd := &cobra.Command{ + Use: "name", + Short: "Call the NAME view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.NAME() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateNonceCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 *big.Int + + cmd := &cobra.Command{ + Use: "nonce", + Short: "Call the Nonce view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.Nonce() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.String()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateSignedMessagesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var arg0 [32]byte + var arg0Raw string + + var capture0 *big.Int + + cmd := &cobra.Command{ + Use: "signed-messages", + Short: "Call the SignedMessages view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var arg0Intermediate []byte + + var arg0IntermediateHexDecodeErr error + arg0Intermediate, arg0IntermediateHexDecodeErr = hex.DecodeString(arg0Raw) + if arg0IntermediateHexDecodeErr != nil { + return arg0IntermediateHexDecodeErr + } + + copy(arg0[:], arg0Intermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.SignedMessages( + arg0, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.String()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument ([32]byte)") + + return cmd +} +func CreateVersionCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 string + + cmd := &cobra.Command{ + Use: "version", + Short: "Call the VERSION view method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := GnosisSafeCallerSession{ + Contract: &contract.GnosisSafeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.VERSION() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} + +func CreateAddOwnerWithThresholdCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var owner common.Address + var ownerRaw string + var threshold *big.Int + var thresholdRaw string + + cmd := &cobra.Command{ + Use: "add-owner-with-threshold", + Short: "Execute the AddOwnerWithThreshold method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if ownerRaw == "" { + return fmt.Errorf("--owner argument not specified") + } else if !common.IsHexAddress(ownerRaw) { + return fmt.Errorf("--owner argument is not a valid Ethereum address") + } + owner = common.HexToAddress(ownerRaw) + + if thresholdRaw == "" { + return fmt.Errorf("--threshold argument not specified") + } + threshold = new(big.Int) + threshold.SetString(thresholdRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.AddOwnerWithThreshold( + owner, + threshold, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&ownerRaw, "owner", "", "owner argument (common.Address)") + cmd.Flags().StringVar(&thresholdRaw, "threshold", "", "threshold argument") + + return cmd +} +func CreateApproveHashCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var hashToApprove [32]byte + var hashToApproveRaw string + + cmd := &cobra.Command{ + Use: "approve-hash", + Short: "Execute the ApproveHash method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var hashToApproveIntermediate []byte + + var hashToApproveIntermediateHexDecodeErr error + hashToApproveIntermediate, hashToApproveIntermediateHexDecodeErr = hex.DecodeString(hashToApproveRaw) + if hashToApproveIntermediateHexDecodeErr != nil { + return hashToApproveIntermediateHexDecodeErr + } + + copy(hashToApprove[:], hashToApproveIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.ApproveHash( + hashToApprove, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&hashToApproveRaw, "hash-to-approve", "", "hash-to-approve argument ([32]byte)") + + return cmd +} +func CreateChangeMasterCopyCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var masterCopy common.Address + var masterCopyRaw string + + cmd := &cobra.Command{ + Use: "change-master-copy", + Short: "Execute the ChangeMasterCopy method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if masterCopyRaw == "" { + return fmt.Errorf("--master-copy argument not specified") + } else if !common.IsHexAddress(masterCopyRaw) { + return fmt.Errorf("--master-copy argument is not a valid Ethereum address") + } + masterCopy = common.HexToAddress(masterCopyRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.ChangeMasterCopy( + masterCopy, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&masterCopyRaw, "master-copy", "", "master-copy argument (common.Address)") + + return cmd +} +func CreateChangeThresholdCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var threshold *big.Int + var thresholdRaw string + + cmd := &cobra.Command{ + Use: "change-threshold", + Short: "Execute the ChangeThreshold method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if thresholdRaw == "" { + return fmt.Errorf("--threshold argument not specified") + } + threshold = new(big.Int) + threshold.SetString(thresholdRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.ChangeThreshold( + threshold, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&thresholdRaw, "threshold", "", "threshold argument") + + return cmd +} +func CreateDisableModuleCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var prevModule common.Address + var prevModuleRaw string + var module common.Address + var moduleRaw string + + cmd := &cobra.Command{ + Use: "disable-module", + Short: "Execute the DisableModule method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if prevModuleRaw == "" { + return fmt.Errorf("--prev-module argument not specified") + } else if !common.IsHexAddress(prevModuleRaw) { + return fmt.Errorf("--prev-module argument is not a valid Ethereum address") + } + prevModule = common.HexToAddress(prevModuleRaw) + + if moduleRaw == "" { + return fmt.Errorf("--module argument not specified") + } else if !common.IsHexAddress(moduleRaw) { + return fmt.Errorf("--module argument is not a valid Ethereum address") + } + module = common.HexToAddress(moduleRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.DisableModule( + prevModule, + module, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&prevModuleRaw, "prev-module", "", "prev-module argument (common.Address)") + cmd.Flags().StringVar(&moduleRaw, "module", "", "module argument (common.Address)") + + return cmd +} +func CreateEnableModuleCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var module common.Address + var moduleRaw string + + cmd := &cobra.Command{ + Use: "enable-module", + Short: "Execute the EnableModule method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if moduleRaw == "" { + return fmt.Errorf("--module argument not specified") + } else if !common.IsHexAddress(moduleRaw) { + return fmt.Errorf("--module argument is not a valid Ethereum address") + } + module = common.HexToAddress(moduleRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.EnableModule( + module, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&moduleRaw, "module", "", "module argument (common.Address)") + + return cmd +} +func CreateExecTransactionCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var to0 common.Address + var to0Raw string + var value0 *big.Int + var value0Raw string + var data []byte + var dataRaw string + var operation uint8 + + var safeTxGas *big.Int + var safeTxGasRaw string + var baseGas *big.Int + var baseGasRaw string + var gasPrice0 *big.Int + var gasPrice0Raw string + var gasToken common.Address + var gasTokenRaw string + var refundReceiver common.Address + var refundReceiverRaw string + var signatures []byte + var signaturesRaw string + + cmd := &cobra.Command{ + Use: "exec-transaction", + Short: "Execute the ExecTransaction method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + if value0Raw == "" { + return fmt.Errorf("--value-0 argument not specified") + } + value0 = new(big.Int) + value0.SetString(value0Raw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + if safeTxGasRaw == "" { + return fmt.Errorf("--safe-tx-gas argument not specified") + } + safeTxGas = new(big.Int) + safeTxGas.SetString(safeTxGasRaw, 0) + + if baseGasRaw == "" { + return fmt.Errorf("--base-gas argument not specified") + } + baseGas = new(big.Int) + baseGas.SetString(baseGasRaw, 0) + + if gasPrice0Raw == "" { + return fmt.Errorf("--gas-price-0 argument not specified") + } + gasPrice0 = new(big.Int) + gasPrice0.SetString(gasPrice0Raw, 0) + + if gasTokenRaw == "" { + return fmt.Errorf("--gas-token argument not specified") + } else if !common.IsHexAddress(gasTokenRaw) { + return fmt.Errorf("--gas-token argument is not a valid Ethereum address") + } + gasToken = common.HexToAddress(gasTokenRaw) + + if refundReceiverRaw == "" { + return fmt.Errorf("--refund-receiver argument not specified") + } else if !common.IsHexAddress(refundReceiverRaw) { + return fmt.Errorf("--refund-receiver argument is not a valid Ethereum address") + } + refundReceiver = common.HexToAddress(refundReceiverRaw) + + var signaturesIntermediate []byte + + var signaturesIntermediateHexDecodeErr error + signaturesIntermediate, signaturesIntermediateHexDecodeErr = hex.DecodeString(signaturesRaw) + if signaturesIntermediateHexDecodeErr != nil { + return signaturesIntermediateHexDecodeErr + } + + copy(signatures[:], signaturesIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.ExecTransaction( + to0, + value0, + data, + operation, + safeTxGas, + baseGas, + gasPrice0, + gasToken, + refundReceiver, + signatures, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().Uint8Var(&operation, "operation", 0, "operation argument") + cmd.Flags().StringVar(&safeTxGasRaw, "safe-tx-gas", "", "safe-tx-gas argument") + cmd.Flags().StringVar(&baseGasRaw, "base-gas", "", "base-gas argument") + cmd.Flags().StringVar(&gasPrice0Raw, "gas-price-0", "", "gas-price-0 argument") + cmd.Flags().StringVar(&gasTokenRaw, "gas-token", "", "gas-token argument (common.Address)") + cmd.Flags().StringVar(&refundReceiverRaw, "refund-receiver", "", "refund-receiver argument (common.Address)") + cmd.Flags().StringVar(&signaturesRaw, "signatures", "", "signatures argument ([]byte)") + + return cmd +} +func CreateExecTransactionFromModuleCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var to0 common.Address + var to0Raw string + var value0 *big.Int + var value0Raw string + var data []byte + var dataRaw string + var operation uint8 + + cmd := &cobra.Command{ + Use: "exec-transaction-from-module", + Short: "Execute the ExecTransactionFromModule method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + if value0Raw == "" { + return fmt.Errorf("--value-0 argument not specified") + } + value0 = new(big.Int) + value0.SetString(value0Raw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.ExecTransactionFromModule( + to0, + value0, + data, + operation, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().Uint8Var(&operation, "operation", 0, "operation argument") + + return cmd +} +func CreateExecTransactionFromModuleReturnDataCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var to0 common.Address + var to0Raw string + var value0 *big.Int + var value0Raw string + var data []byte + var dataRaw string + var operation uint8 + + cmd := &cobra.Command{ + Use: "exec-transaction-from-module-return-data", + Short: "Execute the ExecTransactionFromModuleReturnData method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + if value0Raw == "" { + return fmt.Errorf("--value-0 argument not specified") + } + value0 = new(big.Int) + value0.SetString(value0Raw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.ExecTransactionFromModuleReturnData( + to0, + value0, + data, + operation, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().Uint8Var(&operation, "operation", 0, "operation argument") + + return cmd +} +func CreateFallbackCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var calldata []byte + var calldataRaw string + + cmd := &cobra.Command{ + Use: "fallback", + Short: "Execute the Fallback method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var calldataIntermediate []byte + + var calldataIntermediateHexDecodeErr error + calldataIntermediate, calldataIntermediateHexDecodeErr = hex.DecodeString(calldataRaw) + if calldataIntermediateHexDecodeErr != nil { + return calldataIntermediateHexDecodeErr + } + + copy(calldata[:], calldataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.Fallback( + calldata, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&calldataRaw, "calldata", "", "calldata argument ([]byte)") + + return cmd +} +func CreateIsValidSignatureCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var data []byte + var dataRaw string + var signature []byte + var signatureRaw string + + cmd := &cobra.Command{ + Use: "is-valid-signature", + Short: "Execute the IsValidSignature method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + var signatureIntermediate []byte + + var signatureIntermediateHexDecodeErr error + signatureIntermediate, signatureIntermediateHexDecodeErr = hex.DecodeString(signatureRaw) + if signatureIntermediateHexDecodeErr != nil { + return signatureIntermediateHexDecodeErr + } + + copy(signature[:], signatureIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.IsValidSignature( + data, + signature, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().StringVar(&signatureRaw, "signature", "", "signature argument ([]byte)") + + return cmd +} +func CreateRemoveOwnerCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var prevOwner common.Address + var prevOwnerRaw string + var owner common.Address + var ownerRaw string + var threshold *big.Int + var thresholdRaw string + + cmd := &cobra.Command{ + Use: "remove-owner", + Short: "Execute the RemoveOwner method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if prevOwnerRaw == "" { + return fmt.Errorf("--prev-owner argument not specified") + } else if !common.IsHexAddress(prevOwnerRaw) { + return fmt.Errorf("--prev-owner argument is not a valid Ethereum address") + } + prevOwner = common.HexToAddress(prevOwnerRaw) + + if ownerRaw == "" { + return fmt.Errorf("--owner argument not specified") + } else if !common.IsHexAddress(ownerRaw) { + return fmt.Errorf("--owner argument is not a valid Ethereum address") + } + owner = common.HexToAddress(ownerRaw) + + if thresholdRaw == "" { + return fmt.Errorf("--threshold argument not specified") + } + threshold = new(big.Int) + threshold.SetString(thresholdRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.RemoveOwner( + prevOwner, + owner, + threshold, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&prevOwnerRaw, "prev-owner", "", "prev-owner argument (common.Address)") + cmd.Flags().StringVar(&ownerRaw, "owner", "", "owner argument (common.Address)") + cmd.Flags().StringVar(&thresholdRaw, "threshold", "", "threshold argument") + + return cmd +} +func CreateRequiredTxGasCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var to0 common.Address + var to0Raw string + var value0 *big.Int + var value0Raw string + var data []byte + var dataRaw string + var operation uint8 + + cmd := &cobra.Command{ + Use: "required-tx-gas", + Short: "Execute the RequiredTxGas method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + if value0Raw == "" { + return fmt.Errorf("--value-0 argument not specified") + } + value0 = new(big.Int) + value0.SetString(value0Raw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.RequiredTxGas( + to0, + value0, + data, + operation, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().Uint8Var(&operation, "operation", 0, "operation argument") + + return cmd +} +func CreateSetFallbackHandlerCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var handler common.Address + var handlerRaw string + + cmd := &cobra.Command{ + Use: "set-fallback-handler", + Short: "Execute the SetFallbackHandler method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if handlerRaw == "" { + return fmt.Errorf("--handler argument not specified") + } else if !common.IsHexAddress(handlerRaw) { + return fmt.Errorf("--handler argument is not a valid Ethereum address") + } + handler = common.HexToAddress(handlerRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SetFallbackHandler( + handler, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&handlerRaw, "handler", "", "handler argument (common.Address)") + + return cmd +} +func CreateSetupCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var owners []common.Address + var ownersRaw string + var threshold *big.Int + var thresholdRaw string + var to0 common.Address + var to0Raw string + var data []byte + var dataRaw string + var fallbackHandler common.Address + var fallbackHandlerRaw string + var paymentToken common.Address + var paymentTokenRaw string + var payment *big.Int + var paymentRaw string + var paymentReceiver common.Address + var paymentReceiverRaw string + + cmd := &cobra.Command{ + Use: "setup", + Short: "Execute the Setup method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if ownersRaw == "" { + return fmt.Errorf("--owners argument not specified") + } else if strings.HasPrefix(ownersRaw, "@") { + filename := strings.TrimPrefix(ownersRaw, "@") + contents, readErr := os.ReadFile(filename) + if readErr != nil { + return readErr + } + unmarshalErr := json.Unmarshal(contents, &owners) + if unmarshalErr != nil { + return unmarshalErr + } + } else { + unmarshalErr := json.Unmarshal([]byte(ownersRaw), &owners) + if unmarshalErr != nil { + return unmarshalErr + } + } + + if thresholdRaw == "" { + return fmt.Errorf("--threshold argument not specified") + } + threshold = new(big.Int) + threshold.SetString(thresholdRaw, 0) + + if to0Raw == "" { + return fmt.Errorf("--to-0 argument not specified") + } else if !common.IsHexAddress(to0Raw) { + return fmt.Errorf("--to-0 argument is not a valid Ethereum address") + } + to0 = common.HexToAddress(to0Raw) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + if fallbackHandlerRaw == "" { + return fmt.Errorf("--fallback-handler argument not specified") + } else if !common.IsHexAddress(fallbackHandlerRaw) { + return fmt.Errorf("--fallback-handler argument is not a valid Ethereum address") + } + fallbackHandler = common.HexToAddress(fallbackHandlerRaw) + + if paymentTokenRaw == "" { + return fmt.Errorf("--payment-token argument not specified") + } else if !common.IsHexAddress(paymentTokenRaw) { + return fmt.Errorf("--payment-token argument is not a valid Ethereum address") + } + paymentToken = common.HexToAddress(paymentTokenRaw) + + if paymentRaw == "" { + return fmt.Errorf("--payment argument not specified") + } + payment = new(big.Int) + payment.SetString(paymentRaw, 0) + + if paymentReceiverRaw == "" { + return fmt.Errorf("--payment-receiver argument not specified") + } else if !common.IsHexAddress(paymentReceiverRaw) { + return fmt.Errorf("--payment-receiver argument is not a valid Ethereum address") + } + paymentReceiver = common.HexToAddress(paymentReceiverRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.Setup( + owners, + threshold, + to0, + data, + fallbackHandler, + paymentToken, + payment, + paymentReceiver, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&ownersRaw, "owners", "", "owners argument ([]common.Address)") + cmd.Flags().StringVar(&thresholdRaw, "threshold", "", "threshold argument") + cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + cmd.Flags().StringVar(&fallbackHandlerRaw, "fallback-handler", "", "fallback-handler argument (common.Address)") + cmd.Flags().StringVar(&paymentTokenRaw, "payment-token", "", "payment-token argument (common.Address)") + cmd.Flags().StringVar(&paymentRaw, "payment", "", "payment argument") + cmd.Flags().StringVar(&paymentReceiverRaw, "payment-receiver", "", "payment-receiver argument (common.Address)") + + return cmd +} +func CreateSignMessageCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var data []byte + var dataRaw string + + cmd := &cobra.Command{ + Use: "sign-message", + Short: "Execute the SignMessage method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SignMessage( + data, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + + return cmd +} +func CreateSwapOwnerCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var prevOwner common.Address + var prevOwnerRaw string + var oldOwner common.Address + var oldOwnerRaw string + var newOwner common.Address + var newOwnerRaw string + + cmd := &cobra.Command{ + Use: "swap-owner", + Short: "Execute the SwapOwner method on a GnosisSafe contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if prevOwnerRaw == "" { + return fmt.Errorf("--prev-owner argument not specified") + } else if !common.IsHexAddress(prevOwnerRaw) { + return fmt.Errorf("--prev-owner argument is not a valid Ethereum address") + } + prevOwner = common.HexToAddress(prevOwnerRaw) + + if oldOwnerRaw == "" { + return fmt.Errorf("--old-owner argument not specified") + } else if !common.IsHexAddress(oldOwnerRaw) { + return fmt.Errorf("--old-owner argument is not a valid Ethereum address") + } + oldOwner = common.HexToAddress(oldOwnerRaw) + + if newOwnerRaw == "" { + return fmt.Errorf("--new-owner argument not specified") + } else if !common.IsHexAddress(newOwnerRaw) { + return fmt.Errorf("--new-owner argument is not a valid Ethereum address") + } + newOwner = common.HexToAddress(newOwnerRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewGnosisSafe(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := GnosisSafeTransactorSession{ + Contract: &contract.GnosisSafeTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SwapOwner( + prevOwner, + oldOwner, + newOwner, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&prevOwnerRaw, "prev-owner", "", "prev-owner argument (common.Address)") + cmd.Flags().StringVar(&oldOwnerRaw, "old-owner", "", "old-owner argument (common.Address)") + cmd.Flags().StringVar(&newOwnerRaw, "new-owner", "", "new-owner argument (common.Address)") + + return cmd +} + +var ErrNoRPCURL error = errors.New("no RPC URL provided -- please pass an RPC URL from the command line or set the GNOSIS_SAFE_RPC_URL environment variable") + +// Generates an Ethereum client to the JSONRPC API at the given URL. If rpcURL is empty, then it +// attempts to read the RPC URL from the GNOSIS_SAFE_RPC_URL environment variable. If that is empty, +// too, then it returns an error. +func NewClient(rpcURL string) (*ethclient.Client, error) { + if rpcURL == "" { + rpcURL = os.Getenv("GNOSIS_SAFE_RPC_URL") + } + + if rpcURL == "" { + return nil, ErrNoRPCURL + } + + client, err := ethclient.Dial(rpcURL) + return client, err +} + +// Creates a new context to be used when interacting with the chain client. +func NewChainContext(timeout uint) (context.Context, context.CancelFunc) { + baseCtx := context.Background() + parsedTimeout := time.Duration(timeout) * time.Second + ctx, cancel := context.WithTimeout(baseCtx, parsedTimeout) + return ctx, cancel +} + +// Unlocks a key from a keystore (byte contents of a keystore file) with the given password. +func UnlockKeystore(keystoreData []byte, password string) (*keystore.Key, error) { + key, err := keystore.DecryptKey(keystoreData, password) + return key, err +} + +// Loads a key from file, prompting the user for the password if it is not provided as a function argument. +func KeyFromFile(keystoreFile string, password string) (*keystore.Key, error) { + var emptyKey *keystore.Key + keystoreContent, readErr := os.ReadFile(keystoreFile) + if readErr != nil { + return emptyKey, readErr + } + + // If password is "", prompt user for password. + if password == "" { + fmt.Printf("Please provide a password for keystore (%s): ", keystoreFile) + passwordRaw, inputErr := term.ReadPassword(int(os.Stdin.Fd())) + if inputErr != nil { + return emptyKey, fmt.Errorf("error reading password: %s", inputErr.Error()) + } + fmt.Print("\n") + password = string(passwordRaw) + } + + key, err := UnlockKeystore(keystoreContent, password) + return key, err +} + +// This method is used to set the parameters on a view call from command line arguments (represented mostly as +// strings). +func SetCallParametersFromArgs(opts *bind.CallOpts, pending bool, fromAddress, blockNumber string) { + if pending { + opts.Pending = true + } + + if fromAddress != "" { + opts.From = common.HexToAddress(fromAddress) + } + + if blockNumber != "" { + opts.BlockNumber = new(big.Int) + opts.BlockNumber.SetString(blockNumber, 0) + } +} + +// This method is used to set the parameters on a transaction from command line arguments (represented mostly as +// strings). +func SetTransactionParametersFromArgs(opts *bind.TransactOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas string, gasLimit uint64, noSend bool) { + if nonce != "" { + opts.Nonce = new(big.Int) + opts.Nonce.SetString(nonce, 0) + } + + if value != "" { + opts.Value = new(big.Int) + opts.Value.SetString(value, 0) + } + + if gasPrice != "" { + opts.GasPrice = new(big.Int) + opts.GasPrice.SetString(gasPrice, 0) + } + + if maxFeePerGas != "" { + opts.GasFeeCap = new(big.Int) + opts.GasFeeCap.SetString(maxFeePerGas, 0) + } + + if maxPriorityFeePerGas != "" { + opts.GasTipCap = new(big.Int) + opts.GasTipCap.SetString(maxPriorityFeePerGas, 0) + } + + if gasLimit != 0 { + opts.GasLimit = gasLimit + } + + opts.NoSend = noSend +} + +func CreateGnosisSafeCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "gnosis-safe", + Short: "Interact with the GnosisSafe contract", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + + cmd.SetOut(os.Stdout) + + DeployGroup := &cobra.Group{ + ID: "deploy", Title: "Commands which deploy contracts", + } + cmd.AddGroup(DeployGroup) + ViewGroup := &cobra.Group{ + ID: "view", Title: "Commands which view contract state", + } + TransactGroup := &cobra.Group{ + ID: "transact", Title: "Commands which submit transactions", + } + cmd.AddGroup(ViewGroup, TransactGroup) + + cmdDeployGnosisSafe := CreateGnosisSafeDeploymentCommand() + cmdDeployGnosisSafe.GroupID = DeployGroup.ID + cmd.AddCommand(cmdDeployGnosisSafe) + + cmdViewApprovedHashes := CreateApprovedHashesCommand() + cmdViewApprovedHashes.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewApprovedHashes) + cmdViewDomainSeparator := CreateDomainSeparatorCommand() + cmdViewDomainSeparator.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewDomainSeparator) + cmdViewEncodeTransactionData := CreateEncodeTransactionDataCommand() + cmdViewEncodeTransactionData.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewEncodeTransactionData) + cmdViewGetMessageHash := CreateGetMessageHashCommand() + cmdViewGetMessageHash.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetMessageHash) + cmdViewGetModules := CreateGetModulesCommand() + cmdViewGetModules.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetModules) + cmdViewGetModulesPaginated := CreateGetModulesPaginatedCommand() + cmdViewGetModulesPaginated.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetModulesPaginated) + cmdViewGetOwners := CreateGetOwnersCommand() + cmdViewGetOwners.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetOwners) + cmdViewGetThreshold := CreateGetThresholdCommand() + cmdViewGetThreshold.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetThreshold) + cmdViewGetTransactionHash := CreateGetTransactionHashCommand() + cmdViewGetTransactionHash.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetTransactionHash) + cmdViewIsModuleEnabled := CreateIsModuleEnabledCommand() + cmdViewIsModuleEnabled.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewIsModuleEnabled) + cmdViewIsOwner := CreateIsOwnerCommand() + cmdViewIsOwner.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewIsOwner) + cmdViewNAME := CreateNameCommand() + cmdViewNAME.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewNAME) + cmdViewNonce := CreateNonceCommand() + cmdViewNonce.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewNonce) + cmdViewSignedMessages := CreateSignedMessagesCommand() + cmdViewSignedMessages.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewSignedMessages) + cmdViewVERSION := CreateVersionCommand() + cmdViewVERSION.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewVERSION) + + cmdTransactAddOwnerWithThreshold := CreateAddOwnerWithThresholdCommand() + cmdTransactAddOwnerWithThreshold.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactAddOwnerWithThreshold) + cmdTransactApproveHash := CreateApproveHashCommand() + cmdTransactApproveHash.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactApproveHash) + cmdTransactChangeMasterCopy := CreateChangeMasterCopyCommand() + cmdTransactChangeMasterCopy.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactChangeMasterCopy) + cmdTransactChangeThreshold := CreateChangeThresholdCommand() + cmdTransactChangeThreshold.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactChangeThreshold) + cmdTransactDisableModule := CreateDisableModuleCommand() + cmdTransactDisableModule.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactDisableModule) + cmdTransactEnableModule := CreateEnableModuleCommand() + cmdTransactEnableModule.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactEnableModule) + cmdTransactExecTransaction := CreateExecTransactionCommand() + cmdTransactExecTransaction.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactExecTransaction) + cmdTransactExecTransactionFromModule := CreateExecTransactionFromModuleCommand() + cmdTransactExecTransactionFromModule.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactExecTransactionFromModule) + cmdTransactExecTransactionFromModuleReturnData := CreateExecTransactionFromModuleReturnDataCommand() + cmdTransactExecTransactionFromModuleReturnData.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactExecTransactionFromModuleReturnData) + cmdTransactFallback := CreateFallbackCommand() + cmdTransactFallback.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactFallback) + cmdTransactIsValidSignature := CreateIsValidSignatureCommand() + cmdTransactIsValidSignature.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactIsValidSignature) + cmdTransactRemoveOwner := CreateRemoveOwnerCommand() + cmdTransactRemoveOwner.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactRemoveOwner) + cmdTransactRequiredTxGas := CreateRequiredTxGasCommand() + cmdTransactRequiredTxGas.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactRequiredTxGas) + cmdTransactSetFallbackHandler := CreateSetFallbackHandlerCommand() + cmdTransactSetFallbackHandler.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetFallbackHandler) + cmdTransactSetup := CreateSetupCommand() + cmdTransactSetup.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetup) + cmdTransactSignMessage := CreateSignMessageCommand() + cmdTransactSignMessage.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSignMessage) + cmdTransactSwapOwner := CreateSwapOwnerCommand() + cmdTransactSwapOwner.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSwapOwner) + + return cmd +} diff --git a/bindings/IMulticall3/IMulticall3.go b/bindings/IMulticall3/IMulticall3.go new file mode 100644 index 00000000..ffca98ef --- /dev/null +++ b/bindings/IMulticall3/IMulticall3.go @@ -0,0 +1,647 @@ +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.0 +// seer command: seer evm generate --package IMulticall3 --abi abis/IMulticall3.json --struct IMulticall3 --output bindings/IMulticall3/IMulticall3.go +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package IMulticall3 + +import ( + "errors" + "math/big" + "strings" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// Multicall3Call is an auto generated low-level Go binding around an user-defined struct. +type Multicall3Call struct { + Target common.Address + CallData []byte +} + +// Multicall3Call3 is an auto generated low-level Go binding around an user-defined struct. +type Multicall3Call3 struct { + Target common.Address + AllowFailure bool + CallData []byte +} + +// Multicall3Call3Value is an auto generated low-level Go binding around an user-defined struct. +type Multicall3Call3Value struct { + Target common.Address + AllowFailure bool + Value *big.Int + CallData []byte +} + +// Multicall3Result is an auto generated low-level Go binding around an user-defined struct. +type Multicall3Result struct { + Success bool + ReturnData []byte +} + +// IMulticall3MetaData contains all meta data concerning the IMulticall3 contract. +var IMulticall3MetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes[]\",\"name\":\"returnData\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowFailure\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call3[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate3\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"allowFailure\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call3Value[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"aggregate3Value\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"blockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBasefee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"basefee\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"name\":\"getBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getBlockNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getChainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"chainid\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockCoinbase\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"coinbase\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockDifficulty\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"difficulty\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"gaslimit\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getCurrentBlockTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getEthBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getLastBlockHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryAggregate\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"requireSuccess\",\"type\":\"bool\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Call[]\",\"name\":\"calls\",\"type\":\"tuple[]\"}],\"name\":\"tryBlockAndAggregate\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"blockHash\",\"type\":\"bytes32\"},{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"structMulticall3.Result[]\",\"name\":\"returnData\",\"type\":\"tuple[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"}]", +} + +// IMulticall3ABI is the input ABI used to generate the binding from. +// Deprecated: Use IMulticall3MetaData.ABI instead. +var IMulticall3ABI = IMulticall3MetaData.ABI + +// IMulticall3 is an auto generated Go binding around an Ethereum contract. +type IMulticall3 struct { + IMulticall3Caller // Read-only binding to the contract + IMulticall3Transactor // Write-only binding to the contract + IMulticall3Filterer // Log filterer for contract events +} + +// IMulticall3Caller is an auto generated read-only Go binding around an Ethereum contract. +type IMulticall3Caller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IMulticall3Transactor is an auto generated write-only Go binding around an Ethereum contract. +type IMulticall3Transactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IMulticall3Filterer is an auto generated log filtering Go binding around an Ethereum contract events. +type IMulticall3Filterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// IMulticall3Session is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type IMulticall3Session struct { + Contract *IMulticall3 // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IMulticall3CallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type IMulticall3CallerSession struct { + Contract *IMulticall3Caller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// IMulticall3TransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type IMulticall3TransactorSession struct { + Contract *IMulticall3Transactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// IMulticall3Raw is an auto generated low-level Go binding around an Ethereum contract. +type IMulticall3Raw struct { + Contract *IMulticall3 // Generic contract binding to access the raw methods on +} + +// IMulticall3CallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type IMulticall3CallerRaw struct { + Contract *IMulticall3Caller // Generic read-only contract binding to access the raw methods on +} + +// IMulticall3TransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type IMulticall3TransactorRaw struct { + Contract *IMulticall3Transactor // Generic write-only contract binding to access the raw methods on +} + +// NewIMulticall3 creates a new instance of IMulticall3, bound to a specific deployed contract. +func NewIMulticall3(address common.Address, backend bind.ContractBackend) (*IMulticall3, error) { + contract, err := bindIMulticall3(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &IMulticall3{IMulticall3Caller: IMulticall3Caller{contract: contract}, IMulticall3Transactor: IMulticall3Transactor{contract: contract}, IMulticall3Filterer: IMulticall3Filterer{contract: contract}}, nil +} + +// NewIMulticall3Caller creates a new read-only instance of IMulticall3, bound to a specific deployed contract. +func NewIMulticall3Caller(address common.Address, caller bind.ContractCaller) (*IMulticall3Caller, error) { + contract, err := bindIMulticall3(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &IMulticall3Caller{contract: contract}, nil +} + +// NewIMulticall3Transactor creates a new write-only instance of IMulticall3, bound to a specific deployed contract. +func NewIMulticall3Transactor(address common.Address, transactor bind.ContractTransactor) (*IMulticall3Transactor, error) { + contract, err := bindIMulticall3(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &IMulticall3Transactor{contract: contract}, nil +} + +// NewIMulticall3Filterer creates a new log filterer instance of IMulticall3, bound to a specific deployed contract. +func NewIMulticall3Filterer(address common.Address, filterer bind.ContractFilterer) (*IMulticall3Filterer, error) { + contract, err := bindIMulticall3(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &IMulticall3Filterer{contract: contract}, nil +} + +// bindIMulticall3 binds a generic wrapper to an already deployed contract. +func bindIMulticall3(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := IMulticall3MetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IMulticall3 *IMulticall3Raw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IMulticall3.Contract.IMulticall3Caller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IMulticall3 *IMulticall3Raw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IMulticall3.Contract.IMulticall3Transactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IMulticall3 *IMulticall3Raw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IMulticall3.Contract.IMulticall3Transactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_IMulticall3 *IMulticall3CallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _IMulticall3.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_IMulticall3 *IMulticall3TransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _IMulticall3.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_IMulticall3 *IMulticall3TransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _IMulticall3.Contract.contract.Transact(opts, method, params...) +} + +// GetBasefee is a free data retrieval call binding the contract method 0x3e64a696. +// +// Solidity: function getBasefee() view returns(uint256 basefee) +func (_IMulticall3 *IMulticall3Caller) GetBasefee(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getBasefee") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBasefee is a free data retrieval call binding the contract method 0x3e64a696. +// +// Solidity: function getBasefee() view returns(uint256 basefee) +func (_IMulticall3 *IMulticall3Session) GetBasefee() (*big.Int, error) { + return _IMulticall3.Contract.GetBasefee(&_IMulticall3.CallOpts) +} + +// GetBasefee is a free data retrieval call binding the contract method 0x3e64a696. +// +// Solidity: function getBasefee() view returns(uint256 basefee) +func (_IMulticall3 *IMulticall3CallerSession) GetBasefee() (*big.Int, error) { + return _IMulticall3.Contract.GetBasefee(&_IMulticall3.CallOpts) +} + +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. +// +// Solidity: function getBlockHash(uint256 blockNumber) view returns(bytes32 blockHash) +func (_IMulticall3 *IMulticall3Caller) GetBlockHash(opts *bind.CallOpts, blockNumber *big.Int) ([32]byte, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getBlockHash", blockNumber) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. +// +// Solidity: function getBlockHash(uint256 blockNumber) view returns(bytes32 blockHash) +func (_IMulticall3 *IMulticall3Session) GetBlockHash(blockNumber *big.Int) ([32]byte, error) { + return _IMulticall3.Contract.GetBlockHash(&_IMulticall3.CallOpts, blockNumber) +} + +// GetBlockHash is a free data retrieval call binding the contract method 0xee82ac5e. +// +// Solidity: function getBlockHash(uint256 blockNumber) view returns(bytes32 blockHash) +func (_IMulticall3 *IMulticall3CallerSession) GetBlockHash(blockNumber *big.Int) ([32]byte, error) { + return _IMulticall3.Contract.GetBlockHash(&_IMulticall3.CallOpts, blockNumber) +} + +// GetBlockNumber is a free data retrieval call binding the contract method 0x42cbb15c. +// +// Solidity: function getBlockNumber() view returns(uint256 blockNumber) +func (_IMulticall3 *IMulticall3Caller) GetBlockNumber(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getBlockNumber") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetBlockNumber is a free data retrieval call binding the contract method 0x42cbb15c. +// +// Solidity: function getBlockNumber() view returns(uint256 blockNumber) +func (_IMulticall3 *IMulticall3Session) GetBlockNumber() (*big.Int, error) { + return _IMulticall3.Contract.GetBlockNumber(&_IMulticall3.CallOpts) +} + +// GetBlockNumber is a free data retrieval call binding the contract method 0x42cbb15c. +// +// Solidity: function getBlockNumber() view returns(uint256 blockNumber) +func (_IMulticall3 *IMulticall3CallerSession) GetBlockNumber() (*big.Int, error) { + return _IMulticall3.Contract.GetBlockNumber(&_IMulticall3.CallOpts) +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256 chainid) +func (_IMulticall3 *IMulticall3Caller) GetChainId(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getChainId") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256 chainid) +func (_IMulticall3 *IMulticall3Session) GetChainId() (*big.Int, error) { + return _IMulticall3.Contract.GetChainId(&_IMulticall3.CallOpts) +} + +// GetChainId is a free data retrieval call binding the contract method 0x3408e470. +// +// Solidity: function getChainId() view returns(uint256 chainid) +func (_IMulticall3 *IMulticall3CallerSession) GetChainId() (*big.Int, error) { + return _IMulticall3.Contract.GetChainId(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockCoinbase is a free data retrieval call binding the contract method 0xa8b0574e. +// +// Solidity: function getCurrentBlockCoinbase() view returns(address coinbase) +func (_IMulticall3 *IMulticall3Caller) GetCurrentBlockCoinbase(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getCurrentBlockCoinbase") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetCurrentBlockCoinbase is a free data retrieval call binding the contract method 0xa8b0574e. +// +// Solidity: function getCurrentBlockCoinbase() view returns(address coinbase) +func (_IMulticall3 *IMulticall3Session) GetCurrentBlockCoinbase() (common.Address, error) { + return _IMulticall3.Contract.GetCurrentBlockCoinbase(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockCoinbase is a free data retrieval call binding the contract method 0xa8b0574e. +// +// Solidity: function getCurrentBlockCoinbase() view returns(address coinbase) +func (_IMulticall3 *IMulticall3CallerSession) GetCurrentBlockCoinbase() (common.Address, error) { + return _IMulticall3.Contract.GetCurrentBlockCoinbase(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockDifficulty is a free data retrieval call binding the contract method 0x72425d9d. +// +// Solidity: function getCurrentBlockDifficulty() view returns(uint256 difficulty) +func (_IMulticall3 *IMulticall3Caller) GetCurrentBlockDifficulty(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getCurrentBlockDifficulty") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetCurrentBlockDifficulty is a free data retrieval call binding the contract method 0x72425d9d. +// +// Solidity: function getCurrentBlockDifficulty() view returns(uint256 difficulty) +func (_IMulticall3 *IMulticall3Session) GetCurrentBlockDifficulty() (*big.Int, error) { + return _IMulticall3.Contract.GetCurrentBlockDifficulty(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockDifficulty is a free data retrieval call binding the contract method 0x72425d9d. +// +// Solidity: function getCurrentBlockDifficulty() view returns(uint256 difficulty) +func (_IMulticall3 *IMulticall3CallerSession) GetCurrentBlockDifficulty() (*big.Int, error) { + return _IMulticall3.Contract.GetCurrentBlockDifficulty(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockGasLimit is a free data retrieval call binding the contract method 0x86d516e8. +// +// Solidity: function getCurrentBlockGasLimit() view returns(uint256 gaslimit) +func (_IMulticall3 *IMulticall3Caller) GetCurrentBlockGasLimit(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getCurrentBlockGasLimit") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetCurrentBlockGasLimit is a free data retrieval call binding the contract method 0x86d516e8. +// +// Solidity: function getCurrentBlockGasLimit() view returns(uint256 gaslimit) +func (_IMulticall3 *IMulticall3Session) GetCurrentBlockGasLimit() (*big.Int, error) { + return _IMulticall3.Contract.GetCurrentBlockGasLimit(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockGasLimit is a free data retrieval call binding the contract method 0x86d516e8. +// +// Solidity: function getCurrentBlockGasLimit() view returns(uint256 gaslimit) +func (_IMulticall3 *IMulticall3CallerSession) GetCurrentBlockGasLimit() (*big.Int, error) { + return _IMulticall3.Contract.GetCurrentBlockGasLimit(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockTimestamp is a free data retrieval call binding the contract method 0x0f28c97d. +// +// Solidity: function getCurrentBlockTimestamp() view returns(uint256 timestamp) +func (_IMulticall3 *IMulticall3Caller) GetCurrentBlockTimestamp(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getCurrentBlockTimestamp") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetCurrentBlockTimestamp is a free data retrieval call binding the contract method 0x0f28c97d. +// +// Solidity: function getCurrentBlockTimestamp() view returns(uint256 timestamp) +func (_IMulticall3 *IMulticall3Session) GetCurrentBlockTimestamp() (*big.Int, error) { + return _IMulticall3.Contract.GetCurrentBlockTimestamp(&_IMulticall3.CallOpts) +} + +// GetCurrentBlockTimestamp is a free data retrieval call binding the contract method 0x0f28c97d. +// +// Solidity: function getCurrentBlockTimestamp() view returns(uint256 timestamp) +func (_IMulticall3 *IMulticall3CallerSession) GetCurrentBlockTimestamp() (*big.Int, error) { + return _IMulticall3.Contract.GetCurrentBlockTimestamp(&_IMulticall3.CallOpts) +} + +// GetEthBalance is a free data retrieval call binding the contract method 0x4d2301cc. +// +// Solidity: function getEthBalance(address addr) view returns(uint256 balance) +func (_IMulticall3 *IMulticall3Caller) GetEthBalance(opts *bind.CallOpts, addr common.Address) (*big.Int, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getEthBalance", addr) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetEthBalance is a free data retrieval call binding the contract method 0x4d2301cc. +// +// Solidity: function getEthBalance(address addr) view returns(uint256 balance) +func (_IMulticall3 *IMulticall3Session) GetEthBalance(addr common.Address) (*big.Int, error) { + return _IMulticall3.Contract.GetEthBalance(&_IMulticall3.CallOpts, addr) +} + +// GetEthBalance is a free data retrieval call binding the contract method 0x4d2301cc. +// +// Solidity: function getEthBalance(address addr) view returns(uint256 balance) +func (_IMulticall3 *IMulticall3CallerSession) GetEthBalance(addr common.Address) (*big.Int, error) { + return _IMulticall3.Contract.GetEthBalance(&_IMulticall3.CallOpts, addr) +} + +// GetLastBlockHash is a free data retrieval call binding the contract method 0x27e86d6e. +// +// Solidity: function getLastBlockHash() view returns(bytes32 blockHash) +func (_IMulticall3 *IMulticall3Caller) GetLastBlockHash(opts *bind.CallOpts) ([32]byte, error) { + var out []interface{} + err := _IMulticall3.contract.Call(opts, &out, "getLastBlockHash") + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// GetLastBlockHash is a free data retrieval call binding the contract method 0x27e86d6e. +// +// Solidity: function getLastBlockHash() view returns(bytes32 blockHash) +func (_IMulticall3 *IMulticall3Session) GetLastBlockHash() ([32]byte, error) { + return _IMulticall3.Contract.GetLastBlockHash(&_IMulticall3.CallOpts) +} + +// GetLastBlockHash is a free data retrieval call binding the contract method 0x27e86d6e. +// +// Solidity: function getLastBlockHash() view returns(bytes32 blockHash) +func (_IMulticall3 *IMulticall3CallerSession) GetLastBlockHash() ([32]byte, error) { + return _IMulticall3.Contract.GetLastBlockHash(&_IMulticall3.CallOpts) +} + +// Aggregate is a paid mutator transaction binding the contract method 0x252dba42. +// +// Solidity: function aggregate((address,bytes)[] calls) payable returns(uint256 blockNumber, bytes[] returnData) +func (_IMulticall3 *IMulticall3Transactor) Aggregate(opts *bind.TransactOpts, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.contract.Transact(opts, "aggregate", calls) +} + +// Aggregate is a paid mutator transaction binding the contract method 0x252dba42. +// +// Solidity: function aggregate((address,bytes)[] calls) payable returns(uint256 blockNumber, bytes[] returnData) +func (_IMulticall3 *IMulticall3Session) Aggregate(calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.Aggregate(&_IMulticall3.TransactOpts, calls) +} + +// Aggregate is a paid mutator transaction binding the contract method 0x252dba42. +// +// Solidity: function aggregate((address,bytes)[] calls) payable returns(uint256 blockNumber, bytes[] returnData) +func (_IMulticall3 *IMulticall3TransactorSession) Aggregate(calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.Aggregate(&_IMulticall3.TransactOpts, calls) +} + +// Aggregate3 is a paid mutator transaction binding the contract method 0x82ad56cb. +// +// Solidity: function aggregate3((address,bool,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Transactor) Aggregate3(opts *bind.TransactOpts, calls []Multicall3Call3) (*types.Transaction, error) { + return _IMulticall3.contract.Transact(opts, "aggregate3", calls) +} + +// Aggregate3 is a paid mutator transaction binding the contract method 0x82ad56cb. +// +// Solidity: function aggregate3((address,bool,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Session) Aggregate3(calls []Multicall3Call3) (*types.Transaction, error) { + return _IMulticall3.Contract.Aggregate3(&_IMulticall3.TransactOpts, calls) +} + +// Aggregate3 is a paid mutator transaction binding the contract method 0x82ad56cb. +// +// Solidity: function aggregate3((address,bool,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3TransactorSession) Aggregate3(calls []Multicall3Call3) (*types.Transaction, error) { + return _IMulticall3.Contract.Aggregate3(&_IMulticall3.TransactOpts, calls) +} + +// Aggregate3Value is a paid mutator transaction binding the contract method 0x174dea71. +// +// Solidity: function aggregate3Value((address,bool,uint256,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Transactor) Aggregate3Value(opts *bind.TransactOpts, calls []Multicall3Call3Value) (*types.Transaction, error) { + return _IMulticall3.contract.Transact(opts, "aggregate3Value", calls) +} + +// Aggregate3Value is a paid mutator transaction binding the contract method 0x174dea71. +// +// Solidity: function aggregate3Value((address,bool,uint256,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Session) Aggregate3Value(calls []Multicall3Call3Value) (*types.Transaction, error) { + return _IMulticall3.Contract.Aggregate3Value(&_IMulticall3.TransactOpts, calls) +} + +// Aggregate3Value is a paid mutator transaction binding the contract method 0x174dea71. +// +// Solidity: function aggregate3Value((address,bool,uint256,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3TransactorSession) Aggregate3Value(calls []Multicall3Call3Value) (*types.Transaction, error) { + return _IMulticall3.Contract.Aggregate3Value(&_IMulticall3.TransactOpts, calls) +} + +// BlockAndAggregate is a paid mutator transaction binding the contract method 0xc3077fa9. +// +// Solidity: function blockAndAggregate((address,bytes)[] calls) payable returns(uint256 blockNumber, bytes32 blockHash, (bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Transactor) BlockAndAggregate(opts *bind.TransactOpts, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.contract.Transact(opts, "blockAndAggregate", calls) +} + +// BlockAndAggregate is a paid mutator transaction binding the contract method 0xc3077fa9. +// +// Solidity: function blockAndAggregate((address,bytes)[] calls) payable returns(uint256 blockNumber, bytes32 blockHash, (bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Session) BlockAndAggregate(calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.BlockAndAggregate(&_IMulticall3.TransactOpts, calls) +} + +// BlockAndAggregate is a paid mutator transaction binding the contract method 0xc3077fa9. +// +// Solidity: function blockAndAggregate((address,bytes)[] calls) payable returns(uint256 blockNumber, bytes32 blockHash, (bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3TransactorSession) BlockAndAggregate(calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.BlockAndAggregate(&_IMulticall3.TransactOpts, calls) +} + +// TryAggregate is a paid mutator transaction binding the contract method 0xbce38bd7. +// +// Solidity: function tryAggregate(bool requireSuccess, (address,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Transactor) TryAggregate(opts *bind.TransactOpts, requireSuccess bool, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.contract.Transact(opts, "tryAggregate", requireSuccess, calls) +} + +// TryAggregate is a paid mutator transaction binding the contract method 0xbce38bd7. +// +// Solidity: function tryAggregate(bool requireSuccess, (address,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Session) TryAggregate(requireSuccess bool, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.TryAggregate(&_IMulticall3.TransactOpts, requireSuccess, calls) +} + +// TryAggregate is a paid mutator transaction binding the contract method 0xbce38bd7. +// +// Solidity: function tryAggregate(bool requireSuccess, (address,bytes)[] calls) payable returns((bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3TransactorSession) TryAggregate(requireSuccess bool, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.TryAggregate(&_IMulticall3.TransactOpts, requireSuccess, calls) +} + +// TryBlockAndAggregate is a paid mutator transaction binding the contract method 0x399542e9. +// +// Solidity: function tryBlockAndAggregate(bool requireSuccess, (address,bytes)[] calls) payable returns(uint256 blockNumber, bytes32 blockHash, (bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Transactor) TryBlockAndAggregate(opts *bind.TransactOpts, requireSuccess bool, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.contract.Transact(opts, "tryBlockAndAggregate", requireSuccess, calls) +} + +// TryBlockAndAggregate is a paid mutator transaction binding the contract method 0x399542e9. +// +// Solidity: function tryBlockAndAggregate(bool requireSuccess, (address,bytes)[] calls) payable returns(uint256 blockNumber, bytes32 blockHash, (bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3Session) TryBlockAndAggregate(requireSuccess bool, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.TryBlockAndAggregate(&_IMulticall3.TransactOpts, requireSuccess, calls) +} + +// TryBlockAndAggregate is a paid mutator transaction binding the contract method 0x399542e9. +// +// Solidity: function tryBlockAndAggregate(bool requireSuccess, (address,bytes)[] calls) payable returns(uint256 blockNumber, bytes32 blockHash, (bool,bytes)[] returnData) +func (_IMulticall3 *IMulticall3TransactorSession) TryBlockAndAggregate(requireSuccess bool, calls []Multicall3Call) (*types.Transaction, error) { + return _IMulticall3.Contract.TryBlockAndAggregate(&_IMulticall3.TransactOpts, requireSuccess, calls) +} diff --git a/bindings/L1GatewayRouter/L1GatewayRouter.go b/bindings/L1GatewayRouter/L1GatewayRouter.go new file mode 100644 index 00000000..70628d57 --- /dev/null +++ b/bindings/L1GatewayRouter/L1GatewayRouter.go @@ -0,0 +1,4378 @@ +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.1.20 +// seer command: seer evm generate --package L1GatewayRouter --cli --struct L1GatewayRouter --output bindings/L1GatewayRouter/L1GatewayRouter.go +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package L1GatewayRouter + +import ( + "errors" + "math/big" + "strings" + + "context" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + + // Reference imports to suppress errors if they are not otherwise used. + "encoding/hex" + "encoding/json" + "fmt" + "os" + "time" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/spf13/cobra" + "golang.org/x/term" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// L1GatewayRouterMetaData contains all meta data concerning the L1GatewayRouter contract. +var L1GatewayRouterMetaData = &bind.MetaData{ + ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newDefaultGateway\",\"type\":\"address\"}],\"name\":\"DefaultGatewayUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"gateway\",\"type\":\"address\"}],\"name\":\"GatewaySet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_userFrom\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_userTo\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"gateway\",\"type\":\"address\"}],\"name\":\"TransferRouted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_seqNum\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"TxToL2\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newSource\",\"type\":\"address\"}],\"name\":\"WhitelistSourceUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"l1ERC20\",\"type\":\"address\"}],\"name\":\"calculateL2TokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpartGateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"defaultGateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"finalizeInboundTransfer\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"}],\"name\":\"getGateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"gateway\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"getOutboundCalldata\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inbox\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_defaultGateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_counterpartGateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_inbox\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"l1TokenToGateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasPriceBid\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"outboundTransfer\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_refundTo\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasPriceBid\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"outboundTransferCustomRefund\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"postUpgradeInit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"router\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newL1DefaultGateway\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasPriceBid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxSubmissionCost\",\"type\":\"uint256\"}],\"name\":\"setDefaultGateway\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_gateway\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasPriceBid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxSubmissionCost\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_creditBackAddress\",\"type\":\"address\"}],\"name\":\"setGateway\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_gateway\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasPriceBid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxSubmissionCost\",\"type\":\"uint256\"}],\"name\":\"setGateway\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_token\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"_gateway\",\"type\":\"address[]\"},{\"internalType\":\"uint256\",\"name\":\"_maxGas\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasPriceBid\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxSubmissionCost\",\"type\":\"uint256\"}],\"name\":\"setGateways\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newSource\",\"type\":\"address\"}],\"name\":\"updateWhitelistSource\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelist\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b50611dba806100206000396000f3fe6080604052600436106101355760003560e01c80638da5cb5b116100ab578063bda009fe1161006f578063bda009fe1461032d578063d2ce7d651461034d578063dd61456914610360578063ed08fdc614610373578063f887ea40146103a9578063fb0e722b146103c957600080fd5b80638da5cb5b1461029857806393e59dc1146102b857806395fcea78146102d8578063a0c76a96146102ed578063a7e28d481461030d57600080fd5b80632db09c1c116100fd5780632db09c1c146101ff5780632e567b361461021f57806347466f98146102325780634fb1a07b146102525780635625a95214610272578063658b53f41461028557600080fd5b806301ffc9a71461013a578063032958021461016f57806313af40351461019c5780631459457a146101be5780632d67b72d146101de575b600080fd5b34801561014657600080fd5b5061015a6101553660046114d3565b6103e9565b60405190151581526020015b60405180910390f35b34801561017b57600080fd5b5060045461018f906001600160a01b031681565b60405161016691906114fd565b3480156101a857600080fd5b506101bc6101b7366004611526565b610420565b005b3480156101ca57600080fd5b506101bc6101d9366004611543565b6104bb565b6101f16101ec3660046115b4565b610501565b604051908152602001610166565b34801561020b57600080fd5b5060015461018f906001600160a01b031681565b6101bc61022d366004611644565b61051b565b34801561023e57600080fd5b506101bc61024d366004611526565b61055a565b6102656102603660046116c8565b6105fa565b60405161016691906117af565b6101f16102803660046117c2565b6106fd565b6101f16102933660046118c0565b610740565b3480156102a457600080fd5b5060055461018f906001600160a01b031681565b3480156102c457600080fd5b5060005461018f906001600160a01b031681565b3480156102e457600080fd5b506101bc61077c565b3480156102f957600080fd5b50610265610308366004611965565b6107f4565b34801561031957600080fd5b5061018f610328366004611526565b610888565b34801561033957600080fd5b5061018f610348366004611526565b610921565b61026561035b366004611a26565b610981565b6101f161036e3660046117c2565b61099e565b34801561037f57600080fd5b5061018f61038e366004611526565b6003602052600090815260409020546001600160a01b031681565b3480156103b557600080fd5b5060025461018f906001600160a01b031681565b3480156103d557600080fd5b5060065461018f906001600160a01b031681565b60006001600160e01b03198216634fb1a07b60e01b148061041a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6005546001600160a01b031633146104535760405162461bcd60e51b815260040161044a90611aab565b60405180910390fd5b6001600160a01b0381166104995760405162461bcd60e51b815260206004820152600d60248201526c24a72b20a624a22fa7aba722a960991b604482015260640161044a565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6104c7826000866109ad565b600580546001600160a01b039687166001600160a01b03199182161790915560008054821690556006805492909616911617909355505050565b6000610511868686868634610a1f565b9695505050505050565b60405162461bcd60e51b815260206004820152601460248201527327a7262cafa7aaaa2127aaa7222fa927aaaa22a960611b604482015260640161044a565b6000546001600160a01b031633146105a45760405162461bcd60e51b815260206004820152600d60248201526c1393d517d19493d357d31254d5609a1b604482015260640161044a565b600080546001600160a01b0319166001600160a01b0383161790556040517f37389c47920d5cc3229678a0205d0455002c07541a4139ebdce91ac227465777906105ef9083906114fd565b60405180910390a150565b606060006106078a610921565b90506000610616338686610c70565b9050886001600160a01b0316336001600160a01b03168c6001600160a01b03167f85291dff2161a93c2f12c819d31889c96c63042116f5bc5a205aa701c2c429f58560405161066591906114fd565b60405180910390a4604051634fb1a07b60e01b81526001600160a01b03831690634fb1a07b9034906106a7908f908f908f908f908f908f908b90600401611acf565b60006040518083038185885af11580156106c5573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526106ee9190810190611b14565b9b9a5050505050505050505050565b6005546000906001600160a01b0316331461072a5760405162461bcd60e51b815260040161044a90611aab565b6107378585858534610c9f565b95945050505050565b6005546000906001600160a01b0316331461076d5760405162461bcd60e51b815260040161044a90611aab565b61051186868686863334610dfb565b60006107a67fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b9050336001600160a01b038216146107f15760405162461bcd60e51b815260206004820152600e60248201526d2727aa2fa32927a6afa0a226a4a760911b604482015260640161044a565b50565b6060600061080187610921565b604051635063b54b60e11b81529091506001600160a01b0382169063a0c76a9690610838908a908a908a908a908a90600401611b81565b600060405180830381865afa158015610855573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261087d9190810190611b14565b979650505050505050565b60008061089483610921565b90506001600160a01b0381166108ad5750600092915050565b6040516314fc51a960e31b81526001600160a01b0382169063a7e28d48906108d99086906004016114fd565b602060405180830381865afa1580156108f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091a9190611bbc565b9392505050565b6001600160a01b03808216600090815260036020526040902054168061094f57506004546001600160a01b03165b6001600160a01b0381166001148061096f57506001600160a01b0381163b155b1561097c57506000919050565b919050565b606061099288888888888888611204565b98975050505050505050565b60006107378585858533610501565b6001600160a01b038216156109f15760405162461bcd60e51b815260206004820152600a6024820152692120a22fa927aaaa22a960b11b604482015260640161044a565b6109fb83836112f6565b600480546001600160a01b0319166001600160a01b03929092169190911790555050565b600060b160ff16336001600160a01b0316638e5f5ad16040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a889190611bd9565b60ff1614610aca5760405162461bcd60e51b815260206004820152600f60248201526e1393d517d0549097d1539050931151608a1b604482015260640161044a565b6001600160a01b0387163b610b135760405162461bcd60e51b815260206004820152600f60248201526e1393d517d513d7d0d3d395149050d5608a1b604482015260640161044a565b6000610b1e33610921565b90506001600160a01b03811615801590610b4657506004546001600160a01b03828116911614155b15610bac57876001600160a01b0316816001600160a01b031614610bac5760405162461bcd60e51b815260206004820152601b60248201527f4e4f5f5550444154455f544f5f444946464552454e545f414444520000000000604482015260640161044a565b604080516001808252818301909252600091602080830190803683370190505090503381600081518110610be257610be2611bfc565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508981600081518110610c3357610c33611bfc565b60200260200101906001600160a01b031690816001600160a01b031681525050610c6282828b8b8b8b8b610dfb565b9a9950505050505050505050565b6060838383604051602001610c8793929190611c12565b60405160208183030381529060405290509392505050565b600480546001600160a01b0319166001600160a01b0387161790556040516000907f3a8f8eb961383a94d41d193e16a3af73eaddfd5764a4c640257323a1603ac33190610ced9088906114fd565b60405180910390a160006001600160a01b03871615610d6b57866001600160a01b0316632db09c1c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d689190611bbc565b90505b600063f7c9362f60e01b82604051602401610d8691906114fd565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b03199095169490941790935260065460015482516060810184528a81529485018c90529184018a9052919350610992926001600160a01b0392831692919091169033908890600090876113b8565b60008651885114610e3d5760405162461bcd60e51b815260206004820152600c60248201526b0aea49e9c8ebe988a9c8ea8960a31b604482015260640161044a565b60005b885181101561116457878181518110610e5b57610e5b611bfc565b6020026020010151600360008b8481518110610e7957610e79611bfc565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a8154816001600160a01b0302191690836001600160a01b03160217905550878181518110610ed757610ed7611bfc565b60200260200101516001600160a01b0316898281518110610efa57610efa611bfc565b60200260200101516001600160a01b03167f812ca95fe4492a9e2d1f2723c2c40c03a60a27b059581ae20ac4e4d73bfba35460405160405180910390a360006001600160a01b0316888281518110610f5457610f54611bfc565b60200260200101516001600160a01b031614158015610f9f575060016001600160a01b0316888281518110610f8b57610f8b611bfc565b60200260200101516001600160a01b031614155b156111525760006001600160a01b0316888281518110610fc157610fc1611bfc565b60200260200101516001600160a01b031663a7e28d488b8481518110610fe957610fe9611bfc565b60200260200101516040518263ffffffff1660e01b815260040161100d91906114fd565b602060405180830381865afa15801561102a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061104e9190611bbc565b6001600160a01b0316036110a45760405162461bcd60e51b815260206004820152601c60248201527f544f4b454e5f4e4f545f48414e444c45445f42595f4741544557415900000000604482015260640161044a565b8781815181106110b6576110b6611bfc565b60200260200101516001600160a01b0316632db09c1c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156110fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061111f9190611bbc565b88828151811061113157611131611bfc565b60200260200101906001600160a01b031690816001600160a01b0316815250505b8061115c81611c52565b915050610e40565b506000634201f98560e01b8989604051602401611182929190611cbd565b60408051601f19818403018152918152602080830180516001600160e01b03166001600160e01b03199095169490941790935260065460015482516060810184528a81529485018c90529184018a90529193506111f7926001600160a01b0392831692919091169087908790600090876113b8565b9998505050505050505050565b6060600061121189610921565b90506000611220338686610c70565b9050886001600160a01b0316336001600160a01b03168b6001600160a01b03167f85291dff2161a93c2f12c819d31889c96c63042116f5bc5a205aa701c2c429f58560405161126f91906114fd565b60405180910390a460405163d2ce7d6560e01b81526001600160a01b0383169063d2ce7d659034906112af908e908e908e908e908e908a90600401611ce2565b60006040518083038185885af11580156112cd573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f19168201604052610c629190810190611b14565b6001600160a01b0382166113425760405162461bcd60e51b81526020600482015260136024820152721253959053125117d0d3d55395115494105495606a1b604482015260640161044a565b6001546001600160a01b03161561138a5760405162461bcd60e51b815260206004820152600c60248201526b1053149150511657d253925560a21b604482015260640161044a565b600180546001600160a01b039384166001600160a01b03199182161790915560028054929093169116179055565b60006109928888888888886000015189602001518a604001518a6000610c628a8a8a8b8b8b8b8b8b8b6000806113f68c8c8c8c8c8c8c8c8c8c611453565b9050808b6001600160a01b03168a6001600160a01b03167fc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b08660405161143c91906117af565b60405180910390a49b9a5050505050505050505050565b60008a6001600160a01b031663679b6ded888c89898e8e8b8b8b6040518a63ffffffff1660e01b8152600401611490989796959493929190611d1f565b60206040518083038185885af11580156114ae573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906106ee9190611d6b565b6000602082840312156114e557600080fd5b81356001600160e01b03198116811461091a57600080fd5b6001600160a01b0391909116815260200190565b6001600160a01b03811681146107f157600080fd5b60006020828403121561153857600080fd5b813561091a81611511565b600080600080600060a0868803121561155b57600080fd5b853561156681611511565b9450602086013561157681611511565b9350604086013561158681611511565b9250606086013561159681611511565b915060808601356115a681611511565b809150509295509295909350565b600080600080600060a086880312156115cc57600080fd5b85356115d781611511565b945060208601359350604086013592506060860135915060808601356115a681611511565b60008083601f84011261160e57600080fd5b5081356001600160401b0381111561162557600080fd5b60208301915083602082850101111561163d57600080fd5b9250929050565b60008060008060008060a0878903121561165d57600080fd5b863561166881611511565b9550602087013561167881611511565b9450604087013561168881611511565b93506060870135925060808701356001600160401b038111156116aa57600080fd5b6116b689828a016115fc565b979a9699509497509295939492505050565b60008060008060008060008060e0898b0312156116e457600080fd5b88356116ef81611511565b975060208901356116ff81611511565b9650604089013561170f81611511565b9550606089013594506080890135935060a0890135925060c08901356001600160401b0381111561173f57600080fd5b61174b8b828c016115fc565b999c989b5096995094979396929594505050565b60005b8381101561177a578181015183820152602001611762565b50506000910152565b6000815180845261179b81602086016020860161175f565b601f01601f19169290920160200192915050565b60208152600061091a6020830184611783565b600080600080608085870312156117d857600080fd5b84356117e381611511565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561183b5761183b6117fd565b604052919050565b600082601f83011261185457600080fd5b813560206001600160401b0382111561186f5761186f6117fd565b8160051b61187e828201611813565b928352848101820192828101908785111561189857600080fd5b83870192505b8483101561087d5782356118b181611511565b8252918301919083019061189e565b600080600080600060a086880312156118d857600080fd5b85356001600160401b03808211156118ef57600080fd5b6118fb89838a01611843565b9650602088013591508082111561191157600080fd5b5061191e88828901611843565b959895975050505060408401359360608101359360809091013592509050565b60006001600160401b03821115611957576119576117fd565b50601f01601f191660200190565b600080600080600060a0868803121561197d57600080fd5b853561198881611511565b9450602086013561199881611511565b935060408601356119a881611511565b92506060860135915060808601356001600160401b038111156119ca57600080fd5b8601601f810188136119db57600080fd5b80356119ee6119e98261193e565b611813565b818152896020838501011115611a0357600080fd5b816020840160208301376000602083830101528093505050509295509295909350565b600080600080600080600060c0888a031215611a4157600080fd5b8735611a4c81611511565b96506020880135611a5c81611511565b955060408801359450606088013593506080880135925060a08801356001600160401b03811115611a8c57600080fd5b611a988a828b016115fc565b989b979a50959850939692959293505050565b6020808252600a908201526927a7262cafa7aba722a960b11b604082015260600190565b600060018060a01b03808a16835280891660208401528088166040840152508560608301528460808301528360a083015260e060c08301526111f760e0830184611783565b600060208284031215611b2657600080fd5b81516001600160401b03811115611b3c57600080fd5b8201601f81018413611b4d57600080fd5b8051611b5b6119e98261193e565b818152856020838501011115611b7057600080fd5b61073782602083016020860161175f565b6001600160a01b0386811682528581166020830152841660408201526060810183905260a06080820181905260009061087d90830184611783565b600060208284031215611bce57600080fd5b815161091a81611511565b600060208284031215611beb57600080fd5b815160ff8116811461091a57600080fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b600060018201611c7257634e487b7160e01b600052601160045260246000fd5b5060010190565b600081518084526020808501945080840160005b83811015611cb25781516001600160a01b031687529582019590820190600101611c8d565b509495945050505050565b604081526000611cd06040830185611c79565b82810360208401526107378185611c79565b600060018060a01b03808916835280881660208401525085604083015284606083015283608083015260c060a083015261099260c0830184611783565b600061010060018060a01b03808c1684528a602085015289604085015280891660608501528088166080850152508560a08401528460c08401528060e08401526106ee81840185611783565b600060208284031215611d7d57600080fd5b505191905056fea264697066735822122099098a2a49fd087bb2f3cfee1d3e8835ec87d32d11e317475df423a23478658d64736f6c63430008100033", +} + +// L1GatewayRouterABI is the input ABI used to generate the binding from. +// Deprecated: Use L1GatewayRouterMetaData.ABI instead. +var L1GatewayRouterABI = L1GatewayRouterMetaData.ABI + +// L1GatewayRouterBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use L1GatewayRouterMetaData.Bin instead. +var L1GatewayRouterBin = L1GatewayRouterMetaData.Bin + +// DeployL1GatewayRouter deploys a new Ethereum contract, binding an instance of L1GatewayRouter to it. +func DeployL1GatewayRouter(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L1GatewayRouter, error) { + parsed, err := L1GatewayRouterMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L1GatewayRouterBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &L1GatewayRouter{L1GatewayRouterCaller: L1GatewayRouterCaller{contract: contract}, L1GatewayRouterTransactor: L1GatewayRouterTransactor{contract: contract}, L1GatewayRouterFilterer: L1GatewayRouterFilterer{contract: contract}}, nil +} + +// L1GatewayRouter is an auto generated Go binding around an Ethereum contract. +type L1GatewayRouter struct { + L1GatewayRouterCaller // Read-only binding to the contract + L1GatewayRouterTransactor // Write-only binding to the contract + L1GatewayRouterFilterer // Log filterer for contract events +} + +// L1GatewayRouterCaller is an auto generated read-only Go binding around an Ethereum contract. +type L1GatewayRouterCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1GatewayRouterTransactor is an auto generated write-only Go binding around an Ethereum contract. +type L1GatewayRouterTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1GatewayRouterFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type L1GatewayRouterFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L1GatewayRouterSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type L1GatewayRouterSession struct { + Contract *L1GatewayRouter // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L1GatewayRouterCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type L1GatewayRouterCallerSession struct { + Contract *L1GatewayRouterCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// L1GatewayRouterTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type L1GatewayRouterTransactorSession struct { + Contract *L1GatewayRouterTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L1GatewayRouterRaw is an auto generated low-level Go binding around an Ethereum contract. +type L1GatewayRouterRaw struct { + Contract *L1GatewayRouter // Generic contract binding to access the raw methods on +} + +// L1GatewayRouterCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type L1GatewayRouterCallerRaw struct { + Contract *L1GatewayRouterCaller // Generic read-only contract binding to access the raw methods on +} + +// L1GatewayRouterTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type L1GatewayRouterTransactorRaw struct { + Contract *L1GatewayRouterTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewL1GatewayRouter creates a new instance of L1GatewayRouter, bound to a specific deployed contract. +func NewL1GatewayRouter(address common.Address, backend bind.ContractBackend) (*L1GatewayRouter, error) { + contract, err := bindL1GatewayRouter(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &L1GatewayRouter{L1GatewayRouterCaller: L1GatewayRouterCaller{contract: contract}, L1GatewayRouterTransactor: L1GatewayRouterTransactor{contract: contract}, L1GatewayRouterFilterer: L1GatewayRouterFilterer{contract: contract}}, nil +} + +// NewL1GatewayRouterCaller creates a new read-only instance of L1GatewayRouter, bound to a specific deployed contract. +func NewL1GatewayRouterCaller(address common.Address, caller bind.ContractCaller) (*L1GatewayRouterCaller, error) { + contract, err := bindL1GatewayRouter(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &L1GatewayRouterCaller{contract: contract}, nil +} + +// NewL1GatewayRouterTransactor creates a new write-only instance of L1GatewayRouter, bound to a specific deployed contract. +func NewL1GatewayRouterTransactor(address common.Address, transactor bind.ContractTransactor) (*L1GatewayRouterTransactor, error) { + contract, err := bindL1GatewayRouter(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &L1GatewayRouterTransactor{contract: contract}, nil +} + +// NewL1GatewayRouterFilterer creates a new log filterer instance of L1GatewayRouter, bound to a specific deployed contract. +func NewL1GatewayRouterFilterer(address common.Address, filterer bind.ContractFilterer) (*L1GatewayRouterFilterer, error) { + contract, err := bindL1GatewayRouter(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &L1GatewayRouterFilterer{contract: contract}, nil +} + +// bindL1GatewayRouter binds a generic wrapper to an already deployed contract. +func bindL1GatewayRouter(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := L1GatewayRouterMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L1GatewayRouter *L1GatewayRouterRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L1GatewayRouter.Contract.L1GatewayRouterCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L1GatewayRouter *L1GatewayRouterRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.L1GatewayRouterTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L1GatewayRouter *L1GatewayRouterRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.L1GatewayRouterTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L1GatewayRouter *L1GatewayRouterCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L1GatewayRouter.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L1GatewayRouter *L1GatewayRouterTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L1GatewayRouter *L1GatewayRouterTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.contract.Transact(opts, method, params...) +} + +// CalculateL2TokenAddress is a free data retrieval call binding the contract method 0xa7e28d48. +// +// Solidity: function calculateL2TokenAddress(address l1ERC20) view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) CalculateL2TokenAddress(opts *bind.CallOpts, l1ERC20 common.Address) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "calculateL2TokenAddress", l1ERC20) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// CalculateL2TokenAddress is a free data retrieval call binding the contract method 0xa7e28d48. +// +// Solidity: function calculateL2TokenAddress(address l1ERC20) view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) CalculateL2TokenAddress(l1ERC20 common.Address) (common.Address, error) { + return _L1GatewayRouter.Contract.CalculateL2TokenAddress(&_L1GatewayRouter.CallOpts, l1ERC20) +} + +// CalculateL2TokenAddress is a free data retrieval call binding the contract method 0xa7e28d48. +// +// Solidity: function calculateL2TokenAddress(address l1ERC20) view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) CalculateL2TokenAddress(l1ERC20 common.Address) (common.Address, error) { + return _L1GatewayRouter.Contract.CalculateL2TokenAddress(&_L1GatewayRouter.CallOpts, l1ERC20) +} + +// CounterpartGateway is a free data retrieval call binding the contract method 0x2db09c1c. +// +// Solidity: function counterpartGateway() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) CounterpartGateway(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "counterpartGateway") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// CounterpartGateway is a free data retrieval call binding the contract method 0x2db09c1c. +// +// Solidity: function counterpartGateway() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) CounterpartGateway() (common.Address, error) { + return _L1GatewayRouter.Contract.CounterpartGateway(&_L1GatewayRouter.CallOpts) +} + +// CounterpartGateway is a free data retrieval call binding the contract method 0x2db09c1c. +// +// Solidity: function counterpartGateway() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) CounterpartGateway() (common.Address, error) { + return _L1GatewayRouter.Contract.CounterpartGateway(&_L1GatewayRouter.CallOpts) +} + +// DefaultGateway is a free data retrieval call binding the contract method 0x03295802. +// +// Solidity: function defaultGateway() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) DefaultGateway(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "defaultGateway") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// DefaultGateway is a free data retrieval call binding the contract method 0x03295802. +// +// Solidity: function defaultGateway() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) DefaultGateway() (common.Address, error) { + return _L1GatewayRouter.Contract.DefaultGateway(&_L1GatewayRouter.CallOpts) +} + +// DefaultGateway is a free data retrieval call binding the contract method 0x03295802. +// +// Solidity: function defaultGateway() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) DefaultGateway() (common.Address, error) { + return _L1GatewayRouter.Contract.DefaultGateway(&_L1GatewayRouter.CallOpts) +} + +// GetGateway is a free data retrieval call binding the contract method 0xbda009fe. +// +// Solidity: function getGateway(address _token) view returns(address gateway) +func (_L1GatewayRouter *L1GatewayRouterCaller) GetGateway(opts *bind.CallOpts, _token common.Address) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "getGateway", _token) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// GetGateway is a free data retrieval call binding the contract method 0xbda009fe. +// +// Solidity: function getGateway(address _token) view returns(address gateway) +func (_L1GatewayRouter *L1GatewayRouterSession) GetGateway(_token common.Address) (common.Address, error) { + return _L1GatewayRouter.Contract.GetGateway(&_L1GatewayRouter.CallOpts, _token) +} + +// GetGateway is a free data retrieval call binding the contract method 0xbda009fe. +// +// Solidity: function getGateway(address _token) view returns(address gateway) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) GetGateway(_token common.Address) (common.Address, error) { + return _L1GatewayRouter.Contract.GetGateway(&_L1GatewayRouter.CallOpts, _token) +} + +// GetOutboundCalldata is a free data retrieval call binding the contract method 0xa0c76a96. +// +// Solidity: function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterCaller) GetOutboundCalldata(opts *bind.CallOpts, _token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _data []byte) ([]byte, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "getOutboundCalldata", _token, _from, _to, _amount, _data) + + if err != nil { + return *new([]byte), err + } + + out0 := *abi.ConvertType(out[0], new([]byte)).(*[]byte) + + return out0, err + +} + +// GetOutboundCalldata is a free data retrieval call binding the contract method 0xa0c76a96. +// +// Solidity: function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterSession) GetOutboundCalldata(_token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _data []byte) ([]byte, error) { + return _L1GatewayRouter.Contract.GetOutboundCalldata(&_L1GatewayRouter.CallOpts, _token, _from, _to, _amount, _data) +} + +// GetOutboundCalldata is a free data retrieval call binding the contract method 0xa0c76a96. +// +// Solidity: function getOutboundCalldata(address _token, address _from, address _to, uint256 _amount, bytes _data) view returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) GetOutboundCalldata(_token common.Address, _from common.Address, _to common.Address, _amount *big.Int, _data []byte) ([]byte, error) { + return _L1GatewayRouter.Contract.GetOutboundCalldata(&_L1GatewayRouter.CallOpts, _token, _from, _to, _amount, _data) +} + +// Inbox is a free data retrieval call binding the contract method 0xfb0e722b. +// +// Solidity: function inbox() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) Inbox(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "inbox") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Inbox is a free data retrieval call binding the contract method 0xfb0e722b. +// +// Solidity: function inbox() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) Inbox() (common.Address, error) { + return _L1GatewayRouter.Contract.Inbox(&_L1GatewayRouter.CallOpts) +} + +// Inbox is a free data retrieval call binding the contract method 0xfb0e722b. +// +// Solidity: function inbox() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) Inbox() (common.Address, error) { + return _L1GatewayRouter.Contract.Inbox(&_L1GatewayRouter.CallOpts) +} + +// L1TokenToGateway is a free data retrieval call binding the contract method 0xed08fdc6. +// +// Solidity: function l1TokenToGateway(address ) view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) L1TokenToGateway(opts *bind.CallOpts, arg0 common.Address) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "l1TokenToGateway", arg0) + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// L1TokenToGateway is a free data retrieval call binding the contract method 0xed08fdc6. +// +// Solidity: function l1TokenToGateway(address ) view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) L1TokenToGateway(arg0 common.Address) (common.Address, error) { + return _L1GatewayRouter.Contract.L1TokenToGateway(&_L1GatewayRouter.CallOpts, arg0) +} + +// L1TokenToGateway is a free data retrieval call binding the contract method 0xed08fdc6. +// +// Solidity: function l1TokenToGateway(address ) view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) L1TokenToGateway(arg0 common.Address) (common.Address, error) { + return _L1GatewayRouter.Contract.L1TokenToGateway(&_L1GatewayRouter.CallOpts, arg0) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) Owner() (common.Address, error) { + return _L1GatewayRouter.Contract.Owner(&_L1GatewayRouter.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) Owner() (common.Address, error) { + return _L1GatewayRouter.Contract.Owner(&_L1GatewayRouter.CallOpts) +} + +// Router is a free data retrieval call binding the contract method 0xf887ea40. +// +// Solidity: function router() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) Router(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "router") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Router is a free data retrieval call binding the contract method 0xf887ea40. +// +// Solidity: function router() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) Router() (common.Address, error) { + return _L1GatewayRouter.Contract.Router(&_L1GatewayRouter.CallOpts) +} + +// Router is a free data retrieval call binding the contract method 0xf887ea40. +// +// Solidity: function router() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) Router() (common.Address, error) { + return _L1GatewayRouter.Contract.Router(&_L1GatewayRouter.CallOpts) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_L1GatewayRouter *L1GatewayRouterCaller) SupportsInterface(opts *bind.CallOpts, interfaceId [4]byte) (bool, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "supportsInterface", interfaceId) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_L1GatewayRouter *L1GatewayRouterSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _L1GatewayRouter.Contract.SupportsInterface(&_L1GatewayRouter.CallOpts, interfaceId) +} + +// SupportsInterface is a free data retrieval call binding the contract method 0x01ffc9a7. +// +// Solidity: function supportsInterface(bytes4 interfaceId) view returns(bool) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) SupportsInterface(interfaceId [4]byte) (bool, error) { + return _L1GatewayRouter.Contract.SupportsInterface(&_L1GatewayRouter.CallOpts, interfaceId) +} + +// Whitelist is a free data retrieval call binding the contract method 0x93e59dc1. +// +// Solidity: function whitelist() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCaller) Whitelist(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L1GatewayRouter.contract.Call(opts, &out, "whitelist") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Whitelist is a free data retrieval call binding the contract method 0x93e59dc1. +// +// Solidity: function whitelist() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterSession) Whitelist() (common.Address, error) { + return _L1GatewayRouter.Contract.Whitelist(&_L1GatewayRouter.CallOpts) +} + +// Whitelist is a free data retrieval call binding the contract method 0x93e59dc1. +// +// Solidity: function whitelist() view returns(address) +func (_L1GatewayRouter *L1GatewayRouterCallerSession) Whitelist() (common.Address, error) { + return _L1GatewayRouter.Contract.Whitelist(&_L1GatewayRouter.CallOpts) +} + +// FinalizeInboundTransfer is a paid mutator transaction binding the contract method 0x2e567b36. +// +// Solidity: function finalizeInboundTransfer(address , address , address , uint256 , bytes ) payable returns() +func (_L1GatewayRouter *L1GatewayRouterTransactor) FinalizeInboundTransfer(opts *bind.TransactOpts, arg0 common.Address, arg1 common.Address, arg2 common.Address, arg3 *big.Int, arg4 []byte) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "finalizeInboundTransfer", arg0, arg1, arg2, arg3, arg4) +} + +// FinalizeInboundTransfer is a paid mutator transaction binding the contract method 0x2e567b36. +// +// Solidity: function finalizeInboundTransfer(address , address , address , uint256 , bytes ) payable returns() +func (_L1GatewayRouter *L1GatewayRouterSession) FinalizeInboundTransfer(arg0 common.Address, arg1 common.Address, arg2 common.Address, arg3 *big.Int, arg4 []byte) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.FinalizeInboundTransfer(&_L1GatewayRouter.TransactOpts, arg0, arg1, arg2, arg3, arg4) +} + +// FinalizeInboundTransfer is a paid mutator transaction binding the contract method 0x2e567b36. +// +// Solidity: function finalizeInboundTransfer(address , address , address , uint256 , bytes ) payable returns() +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) FinalizeInboundTransfer(arg0 common.Address, arg1 common.Address, arg2 common.Address, arg3 *big.Int, arg4 []byte) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.FinalizeInboundTransfer(&_L1GatewayRouter.TransactOpts, arg0, arg1, arg2, arg3, arg4) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1459457a. +// +// Solidity: function initialize(address _owner, address _defaultGateway, address , address _counterpartGateway, address _inbox) returns() +func (_L1GatewayRouter *L1GatewayRouterTransactor) Initialize(opts *bind.TransactOpts, _owner common.Address, _defaultGateway common.Address, arg2 common.Address, _counterpartGateway common.Address, _inbox common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "initialize", _owner, _defaultGateway, arg2, _counterpartGateway, _inbox) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1459457a. +// +// Solidity: function initialize(address _owner, address _defaultGateway, address , address _counterpartGateway, address _inbox) returns() +func (_L1GatewayRouter *L1GatewayRouterSession) Initialize(_owner common.Address, _defaultGateway common.Address, arg2 common.Address, _counterpartGateway common.Address, _inbox common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.Initialize(&_L1GatewayRouter.TransactOpts, _owner, _defaultGateway, arg2, _counterpartGateway, _inbox) +} + +// Initialize is a paid mutator transaction binding the contract method 0x1459457a. +// +// Solidity: function initialize(address _owner, address _defaultGateway, address , address _counterpartGateway, address _inbox) returns() +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) Initialize(_owner common.Address, _defaultGateway common.Address, arg2 common.Address, _counterpartGateway common.Address, _inbox common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.Initialize(&_L1GatewayRouter.TransactOpts, _owner, _defaultGateway, arg2, _counterpartGateway, _inbox) +} + +// OutboundTransfer is a paid mutator transaction binding the contract method 0xd2ce7d65. +// +// Solidity: function outboundTransfer(address _token, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterTransactor) OutboundTransfer(opts *bind.TransactOpts, _token common.Address, _to common.Address, _amount *big.Int, _maxGas *big.Int, _gasPriceBid *big.Int, _data []byte) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "outboundTransfer", _token, _to, _amount, _maxGas, _gasPriceBid, _data) +} + +// OutboundTransfer is a paid mutator transaction binding the contract method 0xd2ce7d65. +// +// Solidity: function outboundTransfer(address _token, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterSession) OutboundTransfer(_token common.Address, _to common.Address, _amount *big.Int, _maxGas *big.Int, _gasPriceBid *big.Int, _data []byte) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.OutboundTransfer(&_L1GatewayRouter.TransactOpts, _token, _to, _amount, _maxGas, _gasPriceBid, _data) +} + +// OutboundTransfer is a paid mutator transaction binding the contract method 0xd2ce7d65. +// +// Solidity: function outboundTransfer(address _token, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) OutboundTransfer(_token common.Address, _to common.Address, _amount *big.Int, _maxGas *big.Int, _gasPriceBid *big.Int, _data []byte) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.OutboundTransfer(&_L1GatewayRouter.TransactOpts, _token, _to, _amount, _maxGas, _gasPriceBid, _data) +} + +// OutboundTransferCustomRefund is a paid mutator transaction binding the contract method 0x4fb1a07b. +// +// Solidity: function outboundTransferCustomRefund(address _token, address _refundTo, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterTransactor) OutboundTransferCustomRefund(opts *bind.TransactOpts, _token common.Address, _refundTo common.Address, _to common.Address, _amount *big.Int, _maxGas *big.Int, _gasPriceBid *big.Int, _data []byte) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "outboundTransferCustomRefund", _token, _refundTo, _to, _amount, _maxGas, _gasPriceBid, _data) +} + +// OutboundTransferCustomRefund is a paid mutator transaction binding the contract method 0x4fb1a07b. +// +// Solidity: function outboundTransferCustomRefund(address _token, address _refundTo, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterSession) OutboundTransferCustomRefund(_token common.Address, _refundTo common.Address, _to common.Address, _amount *big.Int, _maxGas *big.Int, _gasPriceBid *big.Int, _data []byte) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.OutboundTransferCustomRefund(&_L1GatewayRouter.TransactOpts, _token, _refundTo, _to, _amount, _maxGas, _gasPriceBid, _data) +} + +// OutboundTransferCustomRefund is a paid mutator transaction binding the contract method 0x4fb1a07b. +// +// Solidity: function outboundTransferCustomRefund(address _token, address _refundTo, address _to, uint256 _amount, uint256 _maxGas, uint256 _gasPriceBid, bytes _data) payable returns(bytes) +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) OutboundTransferCustomRefund(_token common.Address, _refundTo common.Address, _to common.Address, _amount *big.Int, _maxGas *big.Int, _gasPriceBid *big.Int, _data []byte) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.OutboundTransferCustomRefund(&_L1GatewayRouter.TransactOpts, _token, _refundTo, _to, _amount, _maxGas, _gasPriceBid, _data) +} + +// PostUpgradeInit is a paid mutator transaction binding the contract method 0x95fcea78. +// +// Solidity: function postUpgradeInit() returns() +func (_L1GatewayRouter *L1GatewayRouterTransactor) PostUpgradeInit(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "postUpgradeInit") +} + +// PostUpgradeInit is a paid mutator transaction binding the contract method 0x95fcea78. +// +// Solidity: function postUpgradeInit() returns() +func (_L1GatewayRouter *L1GatewayRouterSession) PostUpgradeInit() (*types.Transaction, error) { + return _L1GatewayRouter.Contract.PostUpgradeInit(&_L1GatewayRouter.TransactOpts) +} + +// PostUpgradeInit is a paid mutator transaction binding the contract method 0x95fcea78. +// +// Solidity: function postUpgradeInit() returns() +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) PostUpgradeInit() (*types.Transaction, error) { + return _L1GatewayRouter.Contract.PostUpgradeInit(&_L1GatewayRouter.TransactOpts) +} + +// SetDefaultGateway is a paid mutator transaction binding the contract method 0x5625a952. +// +// Solidity: function setDefaultGateway(address newL1DefaultGateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactor) SetDefaultGateway(opts *bind.TransactOpts, newL1DefaultGateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "setDefaultGateway", newL1DefaultGateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetDefaultGateway is a paid mutator transaction binding the contract method 0x5625a952. +// +// Solidity: function setDefaultGateway(address newL1DefaultGateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterSession) SetDefaultGateway(newL1DefaultGateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetDefaultGateway(&_L1GatewayRouter.TransactOpts, newL1DefaultGateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetDefaultGateway is a paid mutator transaction binding the contract method 0x5625a952. +// +// Solidity: function setDefaultGateway(address newL1DefaultGateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) SetDefaultGateway(newL1DefaultGateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetDefaultGateway(&_L1GatewayRouter.TransactOpts, newL1DefaultGateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetGateway is a paid mutator transaction binding the contract method 0x2d67b72d. +// +// Solidity: function setGateway(address _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost, address _creditBackAddress) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactor) SetGateway(opts *bind.TransactOpts, _gateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int, _creditBackAddress common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "setGateway", _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost, _creditBackAddress) +} + +// SetGateway is a paid mutator transaction binding the contract method 0x2d67b72d. +// +// Solidity: function setGateway(address _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost, address _creditBackAddress) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterSession) SetGateway(_gateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int, _creditBackAddress common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetGateway(&_L1GatewayRouter.TransactOpts, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost, _creditBackAddress) +} + +// SetGateway is a paid mutator transaction binding the contract method 0x2d67b72d. +// +// Solidity: function setGateway(address _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost, address _creditBackAddress) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) SetGateway(_gateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int, _creditBackAddress common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetGateway(&_L1GatewayRouter.TransactOpts, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost, _creditBackAddress) +} + +// SetGateway0 is a paid mutator transaction binding the contract method 0xdd614569. +// +// Solidity: function setGateway(address _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactor) SetGateway0(opts *bind.TransactOpts, _gateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "setGateway0", _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetGateway0 is a paid mutator transaction binding the contract method 0xdd614569. +// +// Solidity: function setGateway(address _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterSession) SetGateway0(_gateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetGateway0(&_L1GatewayRouter.TransactOpts, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetGateway0 is a paid mutator transaction binding the contract method 0xdd614569. +// +// Solidity: function setGateway(address _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) SetGateway0(_gateway common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetGateway0(&_L1GatewayRouter.TransactOpts, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetGateways is a paid mutator transaction binding the contract method 0x658b53f4. +// +// Solidity: function setGateways(address[] _token, address[] _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactor) SetGateways(opts *bind.TransactOpts, _token []common.Address, _gateway []common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "setGateways", _token, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetGateways is a paid mutator transaction binding the contract method 0x658b53f4. +// +// Solidity: function setGateways(address[] _token, address[] _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterSession) SetGateways(_token []common.Address, _gateway []common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetGateways(&_L1GatewayRouter.TransactOpts, _token, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetGateways is a paid mutator transaction binding the contract method 0x658b53f4. +// +// Solidity: function setGateways(address[] _token, address[] _gateway, uint256 _maxGas, uint256 _gasPriceBid, uint256 _maxSubmissionCost) payable returns(uint256) +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) SetGateways(_token []common.Address, _gateway []common.Address, _maxGas *big.Int, _gasPriceBid *big.Int, _maxSubmissionCost *big.Int) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetGateways(&_L1GatewayRouter.TransactOpts, _token, _gateway, _maxGas, _gasPriceBid, _maxSubmissionCost) +} + +// SetOwner is a paid mutator transaction binding the contract method 0x13af4035. +// +// Solidity: function setOwner(address newOwner) returns() +func (_L1GatewayRouter *L1GatewayRouterTransactor) SetOwner(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "setOwner", newOwner) +} + +// SetOwner is a paid mutator transaction binding the contract method 0x13af4035. +// +// Solidity: function setOwner(address newOwner) returns() +func (_L1GatewayRouter *L1GatewayRouterSession) SetOwner(newOwner common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetOwner(&_L1GatewayRouter.TransactOpts, newOwner) +} + +// SetOwner is a paid mutator transaction binding the contract method 0x13af4035. +// +// Solidity: function setOwner(address newOwner) returns() +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) SetOwner(newOwner common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.SetOwner(&_L1GatewayRouter.TransactOpts, newOwner) +} + +// UpdateWhitelistSource is a paid mutator transaction binding the contract method 0x47466f98. +// +// Solidity: function updateWhitelistSource(address newSource) returns() +func (_L1GatewayRouter *L1GatewayRouterTransactor) UpdateWhitelistSource(opts *bind.TransactOpts, newSource common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.contract.Transact(opts, "updateWhitelistSource", newSource) +} + +// UpdateWhitelistSource is a paid mutator transaction binding the contract method 0x47466f98. +// +// Solidity: function updateWhitelistSource(address newSource) returns() +func (_L1GatewayRouter *L1GatewayRouterSession) UpdateWhitelistSource(newSource common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.UpdateWhitelistSource(&_L1GatewayRouter.TransactOpts, newSource) +} + +// UpdateWhitelistSource is a paid mutator transaction binding the contract method 0x47466f98. +// +// Solidity: function updateWhitelistSource(address newSource) returns() +func (_L1GatewayRouter *L1GatewayRouterTransactorSession) UpdateWhitelistSource(newSource common.Address) (*types.Transaction, error) { + return _L1GatewayRouter.Contract.UpdateWhitelistSource(&_L1GatewayRouter.TransactOpts, newSource) +} + +// L1GatewayRouterDefaultGatewayUpdatedIterator is returned from FilterDefaultGatewayUpdated and is used to iterate over the raw logs and unpacked data for DefaultGatewayUpdated events raised by the L1GatewayRouter contract. +type L1GatewayRouterDefaultGatewayUpdatedIterator struct { + Event *L1GatewayRouterDefaultGatewayUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1GatewayRouterDefaultGatewayUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterDefaultGatewayUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterDefaultGatewayUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1GatewayRouterDefaultGatewayUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1GatewayRouterDefaultGatewayUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1GatewayRouterDefaultGatewayUpdated represents a DefaultGatewayUpdated event raised by the L1GatewayRouter contract. +type L1GatewayRouterDefaultGatewayUpdated struct { + NewDefaultGateway common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterDefaultGatewayUpdated is a free log retrieval operation binding the contract event 0x3a8f8eb961383a94d41d193e16a3af73eaddfd5764a4c640257323a1603ac331. +// +// Solidity: event DefaultGatewayUpdated(address newDefaultGateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) FilterDefaultGatewayUpdated(opts *bind.FilterOpts) (*L1GatewayRouterDefaultGatewayUpdatedIterator, error) { + + logs, sub, err := _L1GatewayRouter.contract.FilterLogs(opts, "DefaultGatewayUpdated") + if err != nil { + return nil, err + } + return &L1GatewayRouterDefaultGatewayUpdatedIterator{contract: _L1GatewayRouter.contract, event: "DefaultGatewayUpdated", logs: logs, sub: sub}, nil +} + +// WatchDefaultGatewayUpdated is a free log subscription operation binding the contract event 0x3a8f8eb961383a94d41d193e16a3af73eaddfd5764a4c640257323a1603ac331. +// +// Solidity: event DefaultGatewayUpdated(address newDefaultGateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) WatchDefaultGatewayUpdated(opts *bind.WatchOpts, sink chan<- *L1GatewayRouterDefaultGatewayUpdated) (event.Subscription, error) { + + logs, sub, err := _L1GatewayRouter.contract.WatchLogs(opts, "DefaultGatewayUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1GatewayRouterDefaultGatewayUpdated) + if err := _L1GatewayRouter.contract.UnpackLog(event, "DefaultGatewayUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseDefaultGatewayUpdated is a log parse operation binding the contract event 0x3a8f8eb961383a94d41d193e16a3af73eaddfd5764a4c640257323a1603ac331. +// +// Solidity: event DefaultGatewayUpdated(address newDefaultGateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) ParseDefaultGatewayUpdated(log types.Log) (*L1GatewayRouterDefaultGatewayUpdated, error) { + event := new(L1GatewayRouterDefaultGatewayUpdated) + if err := _L1GatewayRouter.contract.UnpackLog(event, "DefaultGatewayUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1GatewayRouterGatewaySetIterator is returned from FilterGatewaySet and is used to iterate over the raw logs and unpacked data for GatewaySet events raised by the L1GatewayRouter contract. +type L1GatewayRouterGatewaySetIterator struct { + Event *L1GatewayRouterGatewaySet // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1GatewayRouterGatewaySetIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterGatewaySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterGatewaySet) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1GatewayRouterGatewaySetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1GatewayRouterGatewaySetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1GatewayRouterGatewaySet represents a GatewaySet event raised by the L1GatewayRouter contract. +type L1GatewayRouterGatewaySet struct { + L1Token common.Address + Gateway common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterGatewaySet is a free log retrieval operation binding the contract event 0x812ca95fe4492a9e2d1f2723c2c40c03a60a27b059581ae20ac4e4d73bfba354. +// +// Solidity: event GatewaySet(address indexed l1Token, address indexed gateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) FilterGatewaySet(opts *bind.FilterOpts, l1Token []common.Address, gateway []common.Address) (*L1GatewayRouterGatewaySetIterator, error) { + + var l1TokenRule []interface{} + for _, l1TokenItem := range l1Token { + l1TokenRule = append(l1TokenRule, l1TokenItem) + } + var gatewayRule []interface{} + for _, gatewayItem := range gateway { + gatewayRule = append(gatewayRule, gatewayItem) + } + + logs, sub, err := _L1GatewayRouter.contract.FilterLogs(opts, "GatewaySet", l1TokenRule, gatewayRule) + if err != nil { + return nil, err + } + return &L1GatewayRouterGatewaySetIterator{contract: _L1GatewayRouter.contract, event: "GatewaySet", logs: logs, sub: sub}, nil +} + +// WatchGatewaySet is a free log subscription operation binding the contract event 0x812ca95fe4492a9e2d1f2723c2c40c03a60a27b059581ae20ac4e4d73bfba354. +// +// Solidity: event GatewaySet(address indexed l1Token, address indexed gateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) WatchGatewaySet(opts *bind.WatchOpts, sink chan<- *L1GatewayRouterGatewaySet, l1Token []common.Address, gateway []common.Address) (event.Subscription, error) { + + var l1TokenRule []interface{} + for _, l1TokenItem := range l1Token { + l1TokenRule = append(l1TokenRule, l1TokenItem) + } + var gatewayRule []interface{} + for _, gatewayItem := range gateway { + gatewayRule = append(gatewayRule, gatewayItem) + } + + logs, sub, err := _L1GatewayRouter.contract.WatchLogs(opts, "GatewaySet", l1TokenRule, gatewayRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1GatewayRouterGatewaySet) + if err := _L1GatewayRouter.contract.UnpackLog(event, "GatewaySet", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseGatewaySet is a log parse operation binding the contract event 0x812ca95fe4492a9e2d1f2723c2c40c03a60a27b059581ae20ac4e4d73bfba354. +// +// Solidity: event GatewaySet(address indexed l1Token, address indexed gateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) ParseGatewaySet(log types.Log) (*L1GatewayRouterGatewaySet, error) { + event := new(L1GatewayRouterGatewaySet) + if err := _L1GatewayRouter.contract.UnpackLog(event, "GatewaySet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1GatewayRouterTransferRoutedIterator is returned from FilterTransferRouted and is used to iterate over the raw logs and unpacked data for TransferRouted events raised by the L1GatewayRouter contract. +type L1GatewayRouterTransferRoutedIterator struct { + Event *L1GatewayRouterTransferRouted // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1GatewayRouterTransferRoutedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterTransferRouted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterTransferRouted) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1GatewayRouterTransferRoutedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1GatewayRouterTransferRoutedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1GatewayRouterTransferRouted represents a TransferRouted event raised by the L1GatewayRouter contract. +type L1GatewayRouterTransferRouted struct { + Token common.Address + UserFrom common.Address + UserTo common.Address + Gateway common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTransferRouted is a free log retrieval operation binding the contract event 0x85291dff2161a93c2f12c819d31889c96c63042116f5bc5a205aa701c2c429f5. +// +// Solidity: event TransferRouted(address indexed token, address indexed _userFrom, address indexed _userTo, address gateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) FilterTransferRouted(opts *bind.FilterOpts, token []common.Address, _userFrom []common.Address, _userTo []common.Address) (*L1GatewayRouterTransferRoutedIterator, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var _userFromRule []interface{} + for _, _userFromItem := range _userFrom { + _userFromRule = append(_userFromRule, _userFromItem) + } + var _userToRule []interface{} + for _, _userToItem := range _userTo { + _userToRule = append(_userToRule, _userToItem) + } + + logs, sub, err := _L1GatewayRouter.contract.FilterLogs(opts, "TransferRouted", tokenRule, _userFromRule, _userToRule) + if err != nil { + return nil, err + } + return &L1GatewayRouterTransferRoutedIterator{contract: _L1GatewayRouter.contract, event: "TransferRouted", logs: logs, sub: sub}, nil +} + +// WatchTransferRouted is a free log subscription operation binding the contract event 0x85291dff2161a93c2f12c819d31889c96c63042116f5bc5a205aa701c2c429f5. +// +// Solidity: event TransferRouted(address indexed token, address indexed _userFrom, address indexed _userTo, address gateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) WatchTransferRouted(opts *bind.WatchOpts, sink chan<- *L1GatewayRouterTransferRouted, token []common.Address, _userFrom []common.Address, _userTo []common.Address) (event.Subscription, error) { + + var tokenRule []interface{} + for _, tokenItem := range token { + tokenRule = append(tokenRule, tokenItem) + } + var _userFromRule []interface{} + for _, _userFromItem := range _userFrom { + _userFromRule = append(_userFromRule, _userFromItem) + } + var _userToRule []interface{} + for _, _userToItem := range _userTo { + _userToRule = append(_userToRule, _userToItem) + } + + logs, sub, err := _L1GatewayRouter.contract.WatchLogs(opts, "TransferRouted", tokenRule, _userFromRule, _userToRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1GatewayRouterTransferRouted) + if err := _L1GatewayRouter.contract.UnpackLog(event, "TransferRouted", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTransferRouted is a log parse operation binding the contract event 0x85291dff2161a93c2f12c819d31889c96c63042116f5bc5a205aa701c2c429f5. +// +// Solidity: event TransferRouted(address indexed token, address indexed _userFrom, address indexed _userTo, address gateway) +func (_L1GatewayRouter *L1GatewayRouterFilterer) ParseTransferRouted(log types.Log) (*L1GatewayRouterTransferRouted, error) { + event := new(L1GatewayRouterTransferRouted) + if err := _L1GatewayRouter.contract.UnpackLog(event, "TransferRouted", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1GatewayRouterTxToL2Iterator is returned from FilterTxToL2 and is used to iterate over the raw logs and unpacked data for TxToL2 events raised by the L1GatewayRouter contract. +type L1GatewayRouterTxToL2Iterator struct { + Event *L1GatewayRouterTxToL2 // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1GatewayRouterTxToL2Iterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterTxToL2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterTxToL2) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1GatewayRouterTxToL2Iterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1GatewayRouterTxToL2Iterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1GatewayRouterTxToL2 represents a TxToL2 event raised by the L1GatewayRouter contract. +type L1GatewayRouterTxToL2 struct { + From common.Address + To common.Address + SeqNum *big.Int + Data []byte + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTxToL2 is a free log retrieval operation binding the contract event 0xc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b0. +// +// Solidity: event TxToL2(address indexed _from, address indexed _to, uint256 indexed _seqNum, bytes _data) +func (_L1GatewayRouter *L1GatewayRouterFilterer) FilterTxToL2(opts *bind.FilterOpts, _from []common.Address, _to []common.Address, _seqNum []*big.Int) (*L1GatewayRouterTxToL2Iterator, error) { + + var _fromRule []interface{} + for _, _fromItem := range _from { + _fromRule = append(_fromRule, _fromItem) + } + var _toRule []interface{} + for _, _toItem := range _to { + _toRule = append(_toRule, _toItem) + } + var _seqNumRule []interface{} + for _, _seqNumItem := range _seqNum { + _seqNumRule = append(_seqNumRule, _seqNumItem) + } + + logs, sub, err := _L1GatewayRouter.contract.FilterLogs(opts, "TxToL2", _fromRule, _toRule, _seqNumRule) + if err != nil { + return nil, err + } + return &L1GatewayRouterTxToL2Iterator{contract: _L1GatewayRouter.contract, event: "TxToL2", logs: logs, sub: sub}, nil +} + +// WatchTxToL2 is a free log subscription operation binding the contract event 0xc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b0. +// +// Solidity: event TxToL2(address indexed _from, address indexed _to, uint256 indexed _seqNum, bytes _data) +func (_L1GatewayRouter *L1GatewayRouterFilterer) WatchTxToL2(opts *bind.WatchOpts, sink chan<- *L1GatewayRouterTxToL2, _from []common.Address, _to []common.Address, _seqNum []*big.Int) (event.Subscription, error) { + + var _fromRule []interface{} + for _, _fromItem := range _from { + _fromRule = append(_fromRule, _fromItem) + } + var _toRule []interface{} + for _, _toItem := range _to { + _toRule = append(_toRule, _toItem) + } + var _seqNumRule []interface{} + for _, _seqNumItem := range _seqNum { + _seqNumRule = append(_seqNumRule, _seqNumItem) + } + + logs, sub, err := _L1GatewayRouter.contract.WatchLogs(opts, "TxToL2", _fromRule, _toRule, _seqNumRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1GatewayRouterTxToL2) + if err := _L1GatewayRouter.contract.UnpackLog(event, "TxToL2", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseTxToL2 is a log parse operation binding the contract event 0xc1d1490cf25c3b40d600dfb27c7680340ed1ab901b7e8f3551280968a3b372b0. +// +// Solidity: event TxToL2(address indexed _from, address indexed _to, uint256 indexed _seqNum, bytes _data) +func (_L1GatewayRouter *L1GatewayRouterFilterer) ParseTxToL2(log types.Log) (*L1GatewayRouterTxToL2, error) { + event := new(L1GatewayRouterTxToL2) + if err := _L1GatewayRouter.contract.UnpackLog(event, "TxToL2", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L1GatewayRouterWhitelistSourceUpdatedIterator is returned from FilterWhitelistSourceUpdated and is used to iterate over the raw logs and unpacked data for WhitelistSourceUpdated events raised by the L1GatewayRouter contract. +type L1GatewayRouterWhitelistSourceUpdatedIterator struct { + Event *L1GatewayRouterWhitelistSourceUpdated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *L1GatewayRouterWhitelistSourceUpdatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterWhitelistSourceUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(L1GatewayRouterWhitelistSourceUpdated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *L1GatewayRouterWhitelistSourceUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L1GatewayRouterWhitelistSourceUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L1GatewayRouterWhitelistSourceUpdated represents a WhitelistSourceUpdated event raised by the L1GatewayRouter contract. +type L1GatewayRouterWhitelistSourceUpdated struct { + NewSource common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterWhitelistSourceUpdated is a free log retrieval operation binding the contract event 0x37389c47920d5cc3229678a0205d0455002c07541a4139ebdce91ac227465777. +// +// Solidity: event WhitelistSourceUpdated(address newSource) +func (_L1GatewayRouter *L1GatewayRouterFilterer) FilterWhitelistSourceUpdated(opts *bind.FilterOpts) (*L1GatewayRouterWhitelistSourceUpdatedIterator, error) { + + logs, sub, err := _L1GatewayRouter.contract.FilterLogs(opts, "WhitelistSourceUpdated") + if err != nil { + return nil, err + } + return &L1GatewayRouterWhitelistSourceUpdatedIterator{contract: _L1GatewayRouter.contract, event: "WhitelistSourceUpdated", logs: logs, sub: sub}, nil +} + +// WatchWhitelistSourceUpdated is a free log subscription operation binding the contract event 0x37389c47920d5cc3229678a0205d0455002c07541a4139ebdce91ac227465777. +// +// Solidity: event WhitelistSourceUpdated(address newSource) +func (_L1GatewayRouter *L1GatewayRouterFilterer) WatchWhitelistSourceUpdated(opts *bind.WatchOpts, sink chan<- *L1GatewayRouterWhitelistSourceUpdated) (event.Subscription, error) { + + logs, sub, err := _L1GatewayRouter.contract.WatchLogs(opts, "WhitelistSourceUpdated") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L1GatewayRouterWhitelistSourceUpdated) + if err := _L1GatewayRouter.contract.UnpackLog(event, "WhitelistSourceUpdated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseWhitelistSourceUpdated is a log parse operation binding the contract event 0x37389c47920d5cc3229678a0205d0455002c07541a4139ebdce91ac227465777. +// +// Solidity: event WhitelistSourceUpdated(address newSource) +func (_L1GatewayRouter *L1GatewayRouterFilterer) ParseWhitelistSourceUpdated(log types.Log) (*L1GatewayRouterWhitelistSourceUpdated, error) { + event := new(L1GatewayRouterWhitelistSourceUpdated) + if err := _L1GatewayRouter.contract.UnpackLog(event, "WhitelistSourceUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func CreateL1GatewayRouterDeploymentCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc string + var gasLimit uint64 + var simulate bool + var timeout uint + + cmd := &cobra.Command{ + Use: "deploy", + Short: "Deploy a new L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + address, deploymentTransaction, _, deploymentErr := DeployL1GatewayRouter( + transactionOpts, + client, + ) + if deploymentErr != nil { + return deploymentErr + } + + cmd.Printf("Transaction hash: %s\nContract address: %s\n", deploymentTransaction.Hash().Hex(), address.Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + Data: deploymentTransaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := deploymentTransaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + + return cmd +} + +func CreateCalculateL2TokenAddressCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var l1ERC20 common.Address + var l1ERC20Raw string + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "calculate-l-2-token-address", + Short: "Call the CalculateL2TokenAddress view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if l1ERC20Raw == "" { + return fmt.Errorf("--l-1-erc-20 argument not specified") + } else if !common.IsHexAddress(l1ERC20Raw) { + return fmt.Errorf("--l-1-erc-20 argument is not a valid Ethereum address") + } + l1ERC20 = common.HexToAddress(l1ERC20Raw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.CalculateL2TokenAddress( + l1ERC20, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&l1ERC20Raw, "l-1-erc-20", "", "l-1-erc-20 argument (common.Address)") + + return cmd +} +func CreateCounterpartGatewayCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "counterpart-gateway", + Short: "Call the CounterpartGateway view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.CounterpartGateway() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateDefaultGatewayCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "default-gateway", + Short: "Call the DefaultGateway view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.DefaultGateway() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateGetGatewayCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var token common.Address + var tokenRaw string + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "get-gateway", + Short: "Call the GetGateway view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if tokenRaw == "" { + return fmt.Errorf("--token argument not specified") + } else if !common.IsHexAddress(tokenRaw) { + return fmt.Errorf("--token argument is not a valid Ethereum address") + } + token = common.HexToAddress(tokenRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetGateway( + token, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&tokenRaw, "token", "", "token argument (common.Address)") + + return cmd +} +func CreateGetOutboundCalldataCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var token common.Address + var tokenRaw string + var _from0 common.Address + var _from0Raw string + var _to0 common.Address + var _to0Raw string + var amount *big.Int + var amountRaw string + var data []byte + var dataRaw string + + var capture0 []byte + + cmd := &cobra.Command{ + Use: "get-outbound-calldata", + Short: "Call the GetOutboundCalldata view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if tokenRaw == "" { + return fmt.Errorf("--token argument not specified") + } else if !common.IsHexAddress(tokenRaw) { + return fmt.Errorf("--token argument is not a valid Ethereum address") + } + token = common.HexToAddress(tokenRaw) + + if _from0Raw == "" { + return fmt.Errorf("---from-0 argument not specified") + } else if !common.IsHexAddress(_from0Raw) { + return fmt.Errorf("---from-0 argument is not a valid Ethereum address") + } + _from0 = common.HexToAddress(_from0Raw) + + if _to0Raw == "" { + return fmt.Errorf("---to-0 argument not specified") + } else if !common.IsHexAddress(_to0Raw) { + return fmt.Errorf("---to-0 argument is not a valid Ethereum address") + } + _to0 = common.HexToAddress(_to0Raw) + + if amountRaw == "" { + return fmt.Errorf("--amount argument not specified") + } + amount = new(big.Int) + amount.SetString(amountRaw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.GetOutboundCalldata( + token, + _from0, + _to0, + amount, + data, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&tokenRaw, "token", "", "token argument (common.Address)") + cmd.Flags().StringVar(&_from0Raw, "-from-0", "", "-from-0 argument (common.Address)") + cmd.Flags().StringVar(&_to0Raw, "-to-0", "", "-to-0 argument (common.Address)") + cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + + return cmd +} +func CreateInboxCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "inbox", + Short: "Call the Inbox view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.Inbox() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateL1TokenToGatewayCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var arg0 common.Address + var arg0Raw string + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "l-1-token-to-gateway", + Short: "Call the L1TokenToGateway view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if arg0Raw == "" { + return fmt.Errorf("--arg-0 argument not specified") + } else if !common.IsHexAddress(arg0Raw) { + return fmt.Errorf("--arg-0 argument is not a valid Ethereum address") + } + arg0 = common.HexToAddress(arg0Raw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.L1TokenToGateway( + arg0, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument (common.Address)") + + return cmd +} +func CreateOwnerCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "owner", + Short: "Call the Owner view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.Owner() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateRouterCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "router", + Short: "Call the Router view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.Router() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateSupportsInterfaceCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var interfaceId [4]byte + var interfaceIdRaw string + + var capture0 bool + + cmd := &cobra.Command{ + Use: "supports-interface", + Short: "Call the SupportsInterface view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + var interfaceIdIntermediate []byte + + var interfaceIdIntermediateHexDecodeErr error + interfaceIdIntermediate, interfaceIdIntermediateHexDecodeErr = hex.DecodeString(interfaceIdRaw) + if interfaceIdIntermediateHexDecodeErr != nil { + return interfaceIdIntermediateHexDecodeErr + } + + copy(interfaceId[:], interfaceIdIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.SupportsInterface( + interfaceId, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %t\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&interfaceIdRaw, "interface-id", "", "interface-id argument ([4]byte)") + + return cmd +} +func CreateWhitelistCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 common.Address + + cmd := &cobra.Command{ + Use: "whitelist", + Short: "Call the Whitelist view method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := L1GatewayRouterCallerSession{ + Contract: &contract.L1GatewayRouterCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.Whitelist() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.Hex()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} + +func CreateFinalizeInboundTransferCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var arg0 common.Address + var arg0Raw string + var arg1 common.Address + var arg1Raw string + var arg2 common.Address + var arg2Raw string + var arg3 *big.Int + var arg3Raw string + var arg4 []byte + var arg4Raw string + + cmd := &cobra.Command{ + Use: "finalize-inbound-transfer", + Short: "Execute the FinalizeInboundTransfer method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if arg0Raw == "" { + return fmt.Errorf("--arg-0 argument not specified") + } else if !common.IsHexAddress(arg0Raw) { + return fmt.Errorf("--arg-0 argument is not a valid Ethereum address") + } + arg0 = common.HexToAddress(arg0Raw) + + if arg1Raw == "" { + return fmt.Errorf("--arg-1 argument not specified") + } else if !common.IsHexAddress(arg1Raw) { + return fmt.Errorf("--arg-1 argument is not a valid Ethereum address") + } + arg1 = common.HexToAddress(arg1Raw) + + if arg2Raw == "" { + return fmt.Errorf("--arg-2 argument not specified") + } else if !common.IsHexAddress(arg2Raw) { + return fmt.Errorf("--arg-2 argument is not a valid Ethereum address") + } + arg2 = common.HexToAddress(arg2Raw) + + if arg3Raw == "" { + return fmt.Errorf("--arg-3 argument not specified") + } + arg3 = new(big.Int) + arg3.SetString(arg3Raw, 0) + + var arg4Intermediate []byte + + var arg4IntermediateHexDecodeErr error + arg4Intermediate, arg4IntermediateHexDecodeErr = hex.DecodeString(arg4Raw) + if arg4IntermediateHexDecodeErr != nil { + return arg4IntermediateHexDecodeErr + } + + copy(arg4[:], arg4Intermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.FinalizeInboundTransfer( + arg0, + arg1, + arg2, + arg3, + arg4, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument (common.Address)") + cmd.Flags().StringVar(&arg1Raw, "arg-1", "", "arg-1 argument (common.Address)") + cmd.Flags().StringVar(&arg2Raw, "arg-2", "", "arg-2 argument (common.Address)") + cmd.Flags().StringVar(&arg3Raw, "arg-3", "", "arg-3 argument") + cmd.Flags().StringVar(&arg4Raw, "arg-4", "", "arg-4 argument ([]byte)") + + return cmd +} +func CreateInitializeCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var owner common.Address + var ownerRaw string + var defaultGateway common.Address + var defaultGatewayRaw string + var arg2 common.Address + var arg2Raw string + var counterpartGateway common.Address + var counterpartGatewayRaw string + var inbox common.Address + var inboxRaw string + + cmd := &cobra.Command{ + Use: "initialize", + Short: "Execute the Initialize method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if ownerRaw == "" { + return fmt.Errorf("--owner argument not specified") + } else if !common.IsHexAddress(ownerRaw) { + return fmt.Errorf("--owner argument is not a valid Ethereum address") + } + owner = common.HexToAddress(ownerRaw) + + if defaultGatewayRaw == "" { + return fmt.Errorf("--default-gateway argument not specified") + } else if !common.IsHexAddress(defaultGatewayRaw) { + return fmt.Errorf("--default-gateway argument is not a valid Ethereum address") + } + defaultGateway = common.HexToAddress(defaultGatewayRaw) + + if arg2Raw == "" { + return fmt.Errorf("--arg-2 argument not specified") + } else if !common.IsHexAddress(arg2Raw) { + return fmt.Errorf("--arg-2 argument is not a valid Ethereum address") + } + arg2 = common.HexToAddress(arg2Raw) + + if counterpartGatewayRaw == "" { + return fmt.Errorf("--counterpart-gateway argument not specified") + } else if !common.IsHexAddress(counterpartGatewayRaw) { + return fmt.Errorf("--counterpart-gateway argument is not a valid Ethereum address") + } + counterpartGateway = common.HexToAddress(counterpartGatewayRaw) + + if inboxRaw == "" { + return fmt.Errorf("--inbox argument not specified") + } else if !common.IsHexAddress(inboxRaw) { + return fmt.Errorf("--inbox argument is not a valid Ethereum address") + } + inbox = common.HexToAddress(inboxRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.Initialize( + owner, + defaultGateway, + arg2, + counterpartGateway, + inbox, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&ownerRaw, "owner", "", "owner argument (common.Address)") + cmd.Flags().StringVar(&defaultGatewayRaw, "default-gateway", "", "default-gateway argument (common.Address)") + cmd.Flags().StringVar(&arg2Raw, "arg-2", "", "arg-2 argument (common.Address)") + cmd.Flags().StringVar(&counterpartGatewayRaw, "counterpart-gateway", "", "counterpart-gateway argument (common.Address)") + cmd.Flags().StringVar(&inboxRaw, "inbox", "", "inbox argument (common.Address)") + + return cmd +} +func CreateOutboundTransferCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var token common.Address + var tokenRaw string + var _to0 common.Address + var _to0Raw string + var amount *big.Int + var amountRaw string + var maxGas *big.Int + var maxGasRaw string + var gasPriceBid *big.Int + var gasPriceBidRaw string + var data []byte + var dataRaw string + + cmd := &cobra.Command{ + Use: "outbound-transfer", + Short: "Execute the OutboundTransfer method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if tokenRaw == "" { + return fmt.Errorf("--token argument not specified") + } else if !common.IsHexAddress(tokenRaw) { + return fmt.Errorf("--token argument is not a valid Ethereum address") + } + token = common.HexToAddress(tokenRaw) + + if _to0Raw == "" { + return fmt.Errorf("---to-0 argument not specified") + } else if !common.IsHexAddress(_to0Raw) { + return fmt.Errorf("---to-0 argument is not a valid Ethereum address") + } + _to0 = common.HexToAddress(_to0Raw) + + if amountRaw == "" { + return fmt.Errorf("--amount argument not specified") + } + amount = new(big.Int) + amount.SetString(amountRaw, 0) + + if maxGasRaw == "" { + return fmt.Errorf("--max-gas argument not specified") + } + maxGas = new(big.Int) + maxGas.SetString(maxGasRaw, 0) + + if gasPriceBidRaw == "" { + return fmt.Errorf("--gas-price-bid argument not specified") + } + gasPriceBid = new(big.Int) + gasPriceBid.SetString(gasPriceBidRaw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.OutboundTransfer( + token, + _to0, + amount, + maxGas, + gasPriceBid, + data, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&tokenRaw, "token", "", "token argument (common.Address)") + cmd.Flags().StringVar(&_to0Raw, "-to-0", "", "-to-0 argument (common.Address)") + cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") + cmd.Flags().StringVar(&maxGasRaw, "max-gas", "", "max-gas argument") + cmd.Flags().StringVar(&gasPriceBidRaw, "gas-price-bid", "", "gas-price-bid argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + + return cmd +} +func CreateOutboundTransferCustomRefundCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var token common.Address + var tokenRaw string + var refundTo common.Address + var refundToRaw string + var _to0 common.Address + var _to0Raw string + var amount *big.Int + var amountRaw string + var maxGas *big.Int + var maxGasRaw string + var gasPriceBid *big.Int + var gasPriceBidRaw string + var data []byte + var dataRaw string + + cmd := &cobra.Command{ + Use: "outbound-transfer-custom-refund", + Short: "Execute the OutboundTransferCustomRefund method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if tokenRaw == "" { + return fmt.Errorf("--token argument not specified") + } else if !common.IsHexAddress(tokenRaw) { + return fmt.Errorf("--token argument is not a valid Ethereum address") + } + token = common.HexToAddress(tokenRaw) + + if refundToRaw == "" { + return fmt.Errorf("--refund-to argument not specified") + } else if !common.IsHexAddress(refundToRaw) { + return fmt.Errorf("--refund-to argument is not a valid Ethereum address") + } + refundTo = common.HexToAddress(refundToRaw) + + if _to0Raw == "" { + return fmt.Errorf("---to-0 argument not specified") + } else if !common.IsHexAddress(_to0Raw) { + return fmt.Errorf("---to-0 argument is not a valid Ethereum address") + } + _to0 = common.HexToAddress(_to0Raw) + + if amountRaw == "" { + return fmt.Errorf("--amount argument not specified") + } + amount = new(big.Int) + amount.SetString(amountRaw, 0) + + if maxGasRaw == "" { + return fmt.Errorf("--max-gas argument not specified") + } + maxGas = new(big.Int) + maxGas.SetString(maxGasRaw, 0) + + if gasPriceBidRaw == "" { + return fmt.Errorf("--gas-price-bid argument not specified") + } + gasPriceBid = new(big.Int) + gasPriceBid.SetString(gasPriceBidRaw, 0) + + var dataIntermediate []byte + + var dataIntermediateHexDecodeErr error + dataIntermediate, dataIntermediateHexDecodeErr = hex.DecodeString(dataRaw) + if dataIntermediateHexDecodeErr != nil { + return dataIntermediateHexDecodeErr + } + + copy(data[:], dataIntermediate) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.OutboundTransferCustomRefund( + token, + refundTo, + _to0, + amount, + maxGas, + gasPriceBid, + data, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&tokenRaw, "token", "", "token argument (common.Address)") + cmd.Flags().StringVar(&refundToRaw, "refund-to", "", "refund-to argument (common.Address)") + cmd.Flags().StringVar(&_to0Raw, "-to-0", "", "-to-0 argument (common.Address)") + cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") + cmd.Flags().StringVar(&maxGasRaw, "max-gas", "", "max-gas argument") + cmd.Flags().StringVar(&gasPriceBidRaw, "gas-price-bid", "", "gas-price-bid argument") + cmd.Flags().StringVar(&dataRaw, "data", "", "data argument ([]byte)") + + return cmd +} +func CreatePostUpgradeInitCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + cmd := &cobra.Command{ + Use: "post-upgrade-init", + Short: "Execute the PostUpgradeInit method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.PostUpgradeInit() + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + return cmd +} +func CreateSetDefaultGatewayCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var newL1DefaultGateway common.Address + var newL1DefaultGatewayRaw string + var maxGas *big.Int + var maxGasRaw string + var gasPriceBid *big.Int + var gasPriceBidRaw string + var maxSubmissionCost *big.Int + var maxSubmissionCostRaw string + + cmd := &cobra.Command{ + Use: "set-default-gateway", + Short: "Execute the SetDefaultGateway method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if newL1DefaultGatewayRaw == "" { + return fmt.Errorf("--new-l-1-default-gateway argument not specified") + } else if !common.IsHexAddress(newL1DefaultGatewayRaw) { + return fmt.Errorf("--new-l-1-default-gateway argument is not a valid Ethereum address") + } + newL1DefaultGateway = common.HexToAddress(newL1DefaultGatewayRaw) + + if maxGasRaw == "" { + return fmt.Errorf("--max-gas argument not specified") + } + maxGas = new(big.Int) + maxGas.SetString(maxGasRaw, 0) + + if gasPriceBidRaw == "" { + return fmt.Errorf("--gas-price-bid argument not specified") + } + gasPriceBid = new(big.Int) + gasPriceBid.SetString(gasPriceBidRaw, 0) + + if maxSubmissionCostRaw == "" { + return fmt.Errorf("--max-submission-cost argument not specified") + } + maxSubmissionCost = new(big.Int) + maxSubmissionCost.SetString(maxSubmissionCostRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SetDefaultGateway( + newL1DefaultGateway, + maxGas, + gasPriceBid, + maxSubmissionCost, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&newL1DefaultGatewayRaw, "new-l-1-default-gateway", "", "new-l-1-default-gateway argument (common.Address)") + cmd.Flags().StringVar(&maxGasRaw, "max-gas", "", "max-gas argument") + cmd.Flags().StringVar(&gasPriceBidRaw, "gas-price-bid", "", "gas-price-bid argument") + cmd.Flags().StringVar(&maxSubmissionCostRaw, "max-submission-cost", "", "max-submission-cost argument") + + return cmd +} +func CreateSetGatewayCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var gateway common.Address + var gatewayRaw string + var maxGas *big.Int + var maxGasRaw string + var gasPriceBid *big.Int + var gasPriceBidRaw string + var maxSubmissionCost *big.Int + var maxSubmissionCostRaw string + var creditBackAddress common.Address + var creditBackAddressRaw string + + cmd := &cobra.Command{ + Use: "set-gateway", + Short: "Execute the SetGateway method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if gatewayRaw == "" { + return fmt.Errorf("--gateway argument not specified") + } else if !common.IsHexAddress(gatewayRaw) { + return fmt.Errorf("--gateway argument is not a valid Ethereum address") + } + gateway = common.HexToAddress(gatewayRaw) + + if maxGasRaw == "" { + return fmt.Errorf("--max-gas argument not specified") + } + maxGas = new(big.Int) + maxGas.SetString(maxGasRaw, 0) + + if gasPriceBidRaw == "" { + return fmt.Errorf("--gas-price-bid argument not specified") + } + gasPriceBid = new(big.Int) + gasPriceBid.SetString(gasPriceBidRaw, 0) + + if maxSubmissionCostRaw == "" { + return fmt.Errorf("--max-submission-cost argument not specified") + } + maxSubmissionCost = new(big.Int) + maxSubmissionCost.SetString(maxSubmissionCostRaw, 0) + + if creditBackAddressRaw == "" { + return fmt.Errorf("--credit-back-address argument not specified") + } else if !common.IsHexAddress(creditBackAddressRaw) { + return fmt.Errorf("--credit-back-address argument is not a valid Ethereum address") + } + creditBackAddress = common.HexToAddress(creditBackAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SetGateway( + gateway, + maxGas, + gasPriceBid, + maxSubmissionCost, + creditBackAddress, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&gatewayRaw, "gateway", "", "gateway argument (common.Address)") + cmd.Flags().StringVar(&maxGasRaw, "max-gas", "", "max-gas argument") + cmd.Flags().StringVar(&gasPriceBidRaw, "gas-price-bid", "", "gas-price-bid argument") + cmd.Flags().StringVar(&maxSubmissionCostRaw, "max-submission-cost", "", "max-submission-cost argument") + cmd.Flags().StringVar(&creditBackAddressRaw, "credit-back-address", "", "credit-back-address argument (common.Address)") + + return cmd +} +func CreateSetGateway0Command() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var gateway common.Address + var gatewayRaw string + var maxGas *big.Int + var maxGasRaw string + var gasPriceBid *big.Int + var gasPriceBidRaw string + var maxSubmissionCost *big.Int + var maxSubmissionCostRaw string + + cmd := &cobra.Command{ + Use: "set-gateway-0", + Short: "Execute the SetGateway0 method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if gatewayRaw == "" { + return fmt.Errorf("--gateway argument not specified") + } else if !common.IsHexAddress(gatewayRaw) { + return fmt.Errorf("--gateway argument is not a valid Ethereum address") + } + gateway = common.HexToAddress(gatewayRaw) + + if maxGasRaw == "" { + return fmt.Errorf("--max-gas argument not specified") + } + maxGas = new(big.Int) + maxGas.SetString(maxGasRaw, 0) + + if gasPriceBidRaw == "" { + return fmt.Errorf("--gas-price-bid argument not specified") + } + gasPriceBid = new(big.Int) + gasPriceBid.SetString(gasPriceBidRaw, 0) + + if maxSubmissionCostRaw == "" { + return fmt.Errorf("--max-submission-cost argument not specified") + } + maxSubmissionCost = new(big.Int) + maxSubmissionCost.SetString(maxSubmissionCostRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SetGateway0( + gateway, + maxGas, + gasPriceBid, + maxSubmissionCost, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&gatewayRaw, "gateway", "", "gateway argument (common.Address)") + cmd.Flags().StringVar(&maxGasRaw, "max-gas", "", "max-gas argument") + cmd.Flags().StringVar(&gasPriceBidRaw, "gas-price-bid", "", "gas-price-bid argument") + cmd.Flags().StringVar(&maxSubmissionCostRaw, "max-submission-cost", "", "max-submission-cost argument") + + return cmd +} +func CreateSetGatewaysCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var token []common.Address + var tokenRaw string + var gateway []common.Address + var gatewayRaw string + var maxGas *big.Int + var maxGasRaw string + var gasPriceBid *big.Int + var gasPriceBidRaw string + var maxSubmissionCost *big.Int + var maxSubmissionCostRaw string + + cmd := &cobra.Command{ + Use: "set-gateways", + Short: "Execute the SetGateways method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if tokenRaw == "" { + return fmt.Errorf("--token argument not specified") + } else if strings.HasPrefix(tokenRaw, "@") { + filename := strings.TrimPrefix(tokenRaw, "@") + contents, readErr := os.ReadFile(filename) + if readErr != nil { + return readErr + } + unmarshalErr := json.Unmarshal(contents, &token) + if unmarshalErr != nil { + return unmarshalErr + } + } else { + unmarshalErr := json.Unmarshal([]byte(tokenRaw), &token) + if unmarshalErr != nil { + return unmarshalErr + } + } + + if gatewayRaw == "" { + return fmt.Errorf("--gateway argument not specified") + } else if strings.HasPrefix(gatewayRaw, "@") { + filename := strings.TrimPrefix(gatewayRaw, "@") + contents, readErr := os.ReadFile(filename) + if readErr != nil { + return readErr + } + unmarshalErr := json.Unmarshal(contents, &gateway) + if unmarshalErr != nil { + return unmarshalErr + } + } else { + unmarshalErr := json.Unmarshal([]byte(gatewayRaw), &gateway) + if unmarshalErr != nil { + return unmarshalErr + } + } + + if maxGasRaw == "" { + return fmt.Errorf("--max-gas argument not specified") + } + maxGas = new(big.Int) + maxGas.SetString(maxGasRaw, 0) + + if gasPriceBidRaw == "" { + return fmt.Errorf("--gas-price-bid argument not specified") + } + gasPriceBid = new(big.Int) + gasPriceBid.SetString(gasPriceBidRaw, 0) + + if maxSubmissionCostRaw == "" { + return fmt.Errorf("--max-submission-cost argument not specified") + } + maxSubmissionCost = new(big.Int) + maxSubmissionCost.SetString(maxSubmissionCostRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SetGateways( + token, + gateway, + maxGas, + gasPriceBid, + maxSubmissionCost, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&tokenRaw, "token", "", "token argument ([]common.Address)") + cmd.Flags().StringVar(&gatewayRaw, "gateway", "", "gateway argument ([]common.Address)") + cmd.Flags().StringVar(&maxGasRaw, "max-gas", "", "max-gas argument") + cmd.Flags().StringVar(&gasPriceBidRaw, "gas-price-bid", "", "gas-price-bid argument") + cmd.Flags().StringVar(&maxSubmissionCostRaw, "max-submission-cost", "", "max-submission-cost argument") + + return cmd +} +func CreateSetOwnerCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var newOwner common.Address + var newOwnerRaw string + + cmd := &cobra.Command{ + Use: "set-owner", + Short: "Execute the SetOwner method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if newOwnerRaw == "" { + return fmt.Errorf("--new-owner argument not specified") + } else if !common.IsHexAddress(newOwnerRaw) { + return fmt.Errorf("--new-owner argument is not a valid Ethereum address") + } + newOwner = common.HexToAddress(newOwnerRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.SetOwner( + newOwner, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&newOwnerRaw, "new-owner", "", "new-owner argument (common.Address)") + + return cmd +} +func CreateUpdateWhitelistSourceCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + + var newSource common.Address + var newSourceRaw string + + cmd := &cobra.Command{ + Use: "update-whitelist-source", + Short: "Execute the UpdateWhitelistSource method on a L1GatewayRouter contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified") + } + + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if newSourceRaw == "" { + return fmt.Errorf("--new-source argument not specified") + } else if !common.IsHexAddress(newSourceRaw) { + return fmt.Errorf("--new-source argument is not a valid Ethereum address") + } + newSource = common.HexToAddress(newSourceRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewL1GatewayRouter(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := L1GatewayRouterTransactorSession{ + Contract: &contract.L1GatewayRouterTransactor, + TransactOpts: *transactionOpts, + } + + transaction, transactionErr := session.UpdateWhitelistSource( + newSource, + ) + if transactionErr != nil { + return transactionErr + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + + cmd.Flags().StringVar(&newSourceRaw, "new-source", "", "new-source argument (common.Address)") + + return cmd +} + +var ErrNoRPCURL error = errors.New("no RPC URL provided -- please pass an RPC URL from the command line or set the L_1_GATEWAY_ROUTER_RPC_URL environment variable") + +// Generates an Ethereum client to the JSONRPC API at the given URL. If rpcURL is empty, then it +// attempts to read the RPC URL from the L_1_GATEWAY_ROUTER_RPC_URL environment variable. If that is empty, +// too, then it returns an error. +func NewClient(rpcURL string) (*ethclient.Client, error) { + if rpcURL == "" { + rpcURL = os.Getenv("L_1_GATEWAY_ROUTER_RPC_URL") + } + + if rpcURL == "" { + return nil, ErrNoRPCURL + } + + client, err := ethclient.Dial(rpcURL) + return client, err +} + +// Creates a new context to be used when interacting with the chain client. +func NewChainContext(timeout uint) (context.Context, context.CancelFunc) { + baseCtx := context.Background() + parsedTimeout := time.Duration(timeout) * time.Second + ctx, cancel := context.WithTimeout(baseCtx, parsedTimeout) + return ctx, cancel +} + +// Unlocks a key from a keystore (byte contents of a keystore file) with the given password. +func UnlockKeystore(keystoreData []byte, password string) (*keystore.Key, error) { + key, err := keystore.DecryptKey(keystoreData, password) + return key, err +} + +// Loads a key from file, prompting the user for the password if it is not provided as a function argument. +func KeyFromFile(keystoreFile string, password string) (*keystore.Key, error) { + var emptyKey *keystore.Key + keystoreContent, readErr := os.ReadFile(keystoreFile) + if readErr != nil { + return emptyKey, readErr + } + + // If password is "", prompt user for password. + if password == "" { + fmt.Printf("Please provide a password for keystore (%s): ", keystoreFile) + passwordRaw, inputErr := term.ReadPassword(int(os.Stdin.Fd())) + if inputErr != nil { + return emptyKey, fmt.Errorf("error reading password: %s", inputErr.Error()) + } + fmt.Print("\n") + password = string(passwordRaw) + } + + key, err := UnlockKeystore(keystoreContent, password) + return key, err +} + +// This method is used to set the parameters on a view call from command line arguments (represented mostly as +// strings). +func SetCallParametersFromArgs(opts *bind.CallOpts, pending bool, fromAddress, blockNumber string) { + if pending { + opts.Pending = true + } + + if fromAddress != "" { + opts.From = common.HexToAddress(fromAddress) + } + + if blockNumber != "" { + opts.BlockNumber = new(big.Int) + opts.BlockNumber.SetString(blockNumber, 0) + } +} + +// This method is used to set the parameters on a transaction from command line arguments (represented mostly as +// strings). +func SetTransactionParametersFromArgs(opts *bind.TransactOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas string, gasLimit uint64, noSend bool) { + if nonce != "" { + opts.Nonce = new(big.Int) + opts.Nonce.SetString(nonce, 0) + } + + if value != "" { + opts.Value = new(big.Int) + opts.Value.SetString(value, 0) + } + + if gasPrice != "" { + opts.GasPrice = new(big.Int) + opts.GasPrice.SetString(gasPrice, 0) + } + + if maxFeePerGas != "" { + opts.GasFeeCap = new(big.Int) + opts.GasFeeCap.SetString(maxFeePerGas, 0) + } + + if maxPriorityFeePerGas != "" { + opts.GasTipCap = new(big.Int) + opts.GasTipCap.SetString(maxPriorityFeePerGas, 0) + } + + if gasLimit != 0 { + opts.GasLimit = gasLimit + } + + opts.NoSend = noSend +} + +func CreateL1GatewayRouterCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "l-1-gateway-router", + Short: "Interact with the L1GatewayRouter contract", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + + cmd.SetOut(os.Stdout) + + DeployGroup := &cobra.Group{ + ID: "deploy", Title: "Commands which deploy contracts", + } + cmd.AddGroup(DeployGroup) + ViewGroup := &cobra.Group{ + ID: "view", Title: "Commands which view contract state", + } + TransactGroup := &cobra.Group{ + ID: "transact", Title: "Commands which submit transactions", + } + cmd.AddGroup(ViewGroup, TransactGroup) + + cmdDeployL1GatewayRouter := CreateL1GatewayRouterDeploymentCommand() + cmdDeployL1GatewayRouter.GroupID = DeployGroup.ID + cmd.AddCommand(cmdDeployL1GatewayRouter) + + cmdViewCalculateL2TokenAddress := CreateCalculateL2TokenAddressCommand() + cmdViewCalculateL2TokenAddress.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewCalculateL2TokenAddress) + cmdViewCounterpartGateway := CreateCounterpartGatewayCommand() + cmdViewCounterpartGateway.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewCounterpartGateway) + cmdViewDefaultGateway := CreateDefaultGatewayCommand() + cmdViewDefaultGateway.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewDefaultGateway) + cmdViewGetGateway := CreateGetGatewayCommand() + cmdViewGetGateway.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetGateway) + cmdViewGetOutboundCalldata := CreateGetOutboundCalldataCommand() + cmdViewGetOutboundCalldata.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewGetOutboundCalldata) + cmdViewInbox := CreateInboxCommand() + cmdViewInbox.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewInbox) + cmdViewL1TokenToGateway := CreateL1TokenToGatewayCommand() + cmdViewL1TokenToGateway.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewL1TokenToGateway) + cmdViewOwner := CreateOwnerCommand() + cmdViewOwner.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewOwner) + cmdViewRouter := CreateRouterCommand() + cmdViewRouter.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewRouter) + cmdViewSupportsInterface := CreateSupportsInterfaceCommand() + cmdViewSupportsInterface.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewSupportsInterface) + cmdViewWhitelist := CreateWhitelistCommand() + cmdViewWhitelist.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewWhitelist) + + cmdTransactFinalizeInboundTransfer := CreateFinalizeInboundTransferCommand() + cmdTransactFinalizeInboundTransfer.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactFinalizeInboundTransfer) + cmdTransactInitialize := CreateInitializeCommand() + cmdTransactInitialize.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactInitialize) + cmdTransactOutboundTransfer := CreateOutboundTransferCommand() + cmdTransactOutboundTransfer.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactOutboundTransfer) + cmdTransactOutboundTransferCustomRefund := CreateOutboundTransferCustomRefundCommand() + cmdTransactOutboundTransferCustomRefund.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactOutboundTransferCustomRefund) + cmdTransactPostUpgradeInit := CreatePostUpgradeInitCommand() + cmdTransactPostUpgradeInit.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactPostUpgradeInit) + cmdTransactSetDefaultGateway := CreateSetDefaultGatewayCommand() + cmdTransactSetDefaultGateway.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetDefaultGateway) + cmdTransactSetGateway := CreateSetGatewayCommand() + cmdTransactSetGateway.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetGateway) + cmdTransactSetGateway0 := CreateSetGateway0Command() + cmdTransactSetGateway0.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetGateway0) + cmdTransactSetGateways := CreateSetGatewaysCommand() + cmdTransactSetGateways.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetGateways) + cmdTransactSetOwner := CreateSetOwnerCommand() + cmdTransactSetOwner.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactSetOwner) + cmdTransactUpdateWhitelistSource := CreateUpdateWhitelistSourceCommand() + cmdTransactUpdateWhitelistSource.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactUpdateWhitelistSource) + + return cmd +} diff --git a/bindings/L1Teleporter/L1Teleporter.go b/bindings/L1Teleporter/L1Teleporter.go index 1c75e480..b3a43b59 100644 --- a/bindings/L1Teleporter/L1Teleporter.go +++ b/bindings/L1Teleporter/L1Teleporter.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package L1Teleporter --cli --struct L1Teleporter // Code generated - DO NOT EDIT. diff --git a/bindings/L2ForwarderFactory/L2ForwarderFactory.go b/bindings/L2ForwarderFactory/L2ForwarderFactory.go index 0240a3cd..f368ded3 100644 --- a/bindings/L2ForwarderFactory/L2ForwarderFactory.go +++ b/bindings/L2ForwarderFactory/L2ForwarderFactory.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package L2ForwarderFactory --cli --struct L2ForwarderFactory // Code generated - DO NOT EDIT. diff --git a/bindings/Metronome/Metronome.go b/bindings/Metronome/Metronome.go new file mode 100644 index 00000000..5c0c4c27 --- /dev/null +++ b/bindings/Metronome/Metronome.go @@ -0,0 +1,2704 @@ +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 +// seer command: seer evm generate --package Metronome --cli --struct Metronome --output bindings/Metronome/Metronome.go +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package Metronome + +import ( + "bytes" + "crypto/rand" + "errors" + "math/big" + "net/http" + "strings" + + "context" + + ethereum "github.com/ethereum/go-ethereum" + "github.com/ethereum/go-ethereum/accounts/abi" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" + "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" + + // Reference imports to suppress errors if they are not otherwise used. + "encoding/hex" + "encoding/json" + "fmt" + "os" + "time" + + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/spf13/cobra" + "golang.org/x/term" + + // MetronomeMetaData contains all meta data concerning the Metronome contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" +) + +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +var MetronomeMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"name\":\"InvalidSchedule\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"scheduleID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"BalanceIncreased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"scheduleID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"forAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"payment\",\"type\":\"uint256\"}],\"name\":\"BountyClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"scheduleID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"remainder\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"divisor\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"bounty\",\"type\":\"uint256\"}],\"name\":\"ScheduleCreated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ClaimedBounties\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NumSchedules\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"ScheduleBalances\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"Schedules\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"remainder\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"divisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bounty\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"scheduleID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"forAddress\",\"type\":\"address\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"scheduleIDs\",\"type\":\"uint256[]\"},{\"internalType\":\"address\",\"name\":\"forAddress\",\"type\":\"address\"}],\"name\":\"claimBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"remainder\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"divisor\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"bounty\",\"type\":\"uint256\"}],\"name\":\"createSchedule\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"scheduleID\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"scheduleID\",\"type\":\"uint256\"}],\"name\":\"increaseBalance\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561001057600080fd5b506001600055610917806100256000396000f3fe60806040526004361061007b5760003560e01c80634a82fe981161004e5780634a82fe98146101295780635294bac8146101565780638c3f896e14610169578063ddd5e1b2146101bf57600080fd5b806314e6424c1461008057806318d052e3146100a95780631e2339e3146100cb5780633e4ccb4014610116575b600080fd5b34801561008c57600080fd5b5061009660045481565b6040519081526020015b60405180910390f35b3480156100b557600080fd5b506100c96100c4366004610663565b6101df565b005b3480156100d757600080fd5b506101066100e6366004610751565b600360209081526000928352604080842090915290825290205460ff1681565b60405190151581526020016100a0565b6100c9610124366004610773565b61022d565b34801561013557600080fd5b50610096610144366004610773565b60026020526000908152604090205481565b61009661016436600461078c565b610288565b34801561017557600080fd5b506101a4610184366004610773565b600160208190526000918252604090912080549181015460029091015483565b604080519384526020840192909252908201526060016100a0565b3480156101cb57600080fd5b506100c96101da3660046107b8565b610427565b6101e7610443565b60005b825181101561021e57610216838281518110610208576102086107e4565b602002602001015183610486565b6001016101ea565b506102296001600055565b5050565b6000818152600260205260408120805434929061024b908490610842565b909155505060405134815281907f4547cc37be8de03db39508613822773a49bc23d17ee4230fa6ec1a0c260156b79060200160405180910390a250565b6000826000036102c4576040517fdba16ce800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000036102fe576040517fdba16ce800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828410610337576040517fdba16ce800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5060048054908190600061034a8361085b565b909155505060408051606081018252858152602080820186815282840186815260008681526001938490528590209351845590519183019190915551600290910155518390859083907fbd7880573155705535dce3194981f4b25e22063a5619ea279e73b43b34831670906103c29087815260200190565b60405180910390a4341561042057600081815260026020526040908190203490819055905182917f4547cc37be8de03db39508613822773a49bc23d17ee4230fa6ec1a0c260156b79161041791815260200190565b60405180910390a25b9392505050565b61042f610443565b6104398282610486565b6102296001600055565b60026000540361047f576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600055565b600082815260036020908152604080832043845290915290205460ff161580156104cd5750600082815260016020819052604090912080549101546104cb9043610893565b145b15610229576000828152600260208181526040808420546001909252909220015481111561050957506000828152600160205260409020600201545b8015610606576000838152600360209081526040808320438452825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905585835260029091528120805483929061056b9084906108ce565b909155505060405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f193505050501580156105b3573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff16837f23c972d46b3251ae358ad69fb3761ef8f5c38c5131502ed9e9bde9b129da9215836040516105fd91815260200190565b60405180910390a35b505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461065e57600080fd5b919050565b6000806040838503121561067657600080fd5b823567ffffffffffffffff8082111561068e57600080fd5b818501915085601f8301126106a257600080fd5b81356020828211156106b6576106b661060b565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811086821117156106f9576106f961060b565b60405292835281830193508481018201928984111561071757600080fd5b948201945b838610156107355785358552948201949382019361071c565b9650610744905087820161063a565b9450505050509250929050565b6000806040838503121561076457600080fd5b50508035926020909101359150565b60006020828403121561078557600080fd5b5035919050565b6000806000606084860312156107a157600080fd5b505081359360208301359350604090920135919050565b600080604083850312156107cb57600080fd5b823591506107db6020840161063a565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561085557610855610813565b92915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361088c5761088c610813565b5060010190565b6000826108c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500690565b818103818111156108555761085561081356fea26469706673582212206a2c009a424938086f99d5a1171e4e60ed96858f3a37ab580ae8e4ca5dde8ccb64736f6c63430008180033", +} + +// MetronomeABI is the input ABI used to generate the binding from. +// Deprecated: Use MetronomeMetaData.ABI instead. +var MetronomeABI = MetronomeMetaData.ABI + +// MetronomeBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use MetronomeMetaData.Bin instead. +var MetronomeBin = MetronomeMetaData.Bin + +// DeployMetronome deploys a new Ethereum contract, binding an instance of Metronome to it. +func DeployMetronome(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Metronome, error) { + parsed, err := MetronomeMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(MetronomeBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &Metronome{MetronomeCaller: MetronomeCaller{contract: contract}, MetronomeTransactor: MetronomeTransactor{contract: contract}, MetronomeFilterer: MetronomeFilterer{contract: contract}}, nil +} + +// Metronome is an auto generated Go binding around an Ethereum contract. +type Metronome struct { + MetronomeCaller // Read-only binding to the contract + MetronomeTransactor // Write-only binding to the contract + MetronomeFilterer // Log filterer for contract events +} + +// MetronomeCaller is an auto generated read-only Go binding around an Ethereum contract. +type MetronomeCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MetronomeTransactor is an auto generated write-only Go binding around an Ethereum contract. +type MetronomeTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MetronomeFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type MetronomeFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// MetronomeSession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type MetronomeSession struct { + Contract *Metronome // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MetronomeCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type MetronomeCallerSession struct { + Contract *MetronomeCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// MetronomeTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type MetronomeTransactorSession struct { + Contract *MetronomeTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// MetronomeRaw is an auto generated low-level Go binding around an Ethereum contract. +type MetronomeRaw struct { + Contract *Metronome // Generic contract binding to access the raw methods on +} + +// MetronomeCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type MetronomeCallerRaw struct { + Contract *MetronomeCaller // Generic read-only contract binding to access the raw methods on +} + +// MetronomeTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type MetronomeTransactorRaw struct { + Contract *MetronomeTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewMetronome creates a new instance of Metronome, bound to a specific deployed contract. +func NewMetronome(address common.Address, backend bind.ContractBackend) (*Metronome, error) { + contract, err := bindMetronome(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &Metronome{MetronomeCaller: MetronomeCaller{contract: contract}, MetronomeTransactor: MetronomeTransactor{contract: contract}, MetronomeFilterer: MetronomeFilterer{contract: contract}}, nil +} + +// NewMetronomeCaller creates a new read-only instance of Metronome, bound to a specific deployed contract. +func NewMetronomeCaller(address common.Address, caller bind.ContractCaller) (*MetronomeCaller, error) { + contract, err := bindMetronome(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &MetronomeCaller{contract: contract}, nil +} + +// NewMetronomeTransactor creates a new write-only instance of Metronome, bound to a specific deployed contract. +func NewMetronomeTransactor(address common.Address, transactor bind.ContractTransactor) (*MetronomeTransactor, error) { + contract, err := bindMetronome(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &MetronomeTransactor{contract: contract}, nil +} + +// NewMetronomeFilterer creates a new log filterer instance of Metronome, bound to a specific deployed contract. +func NewMetronomeFilterer(address common.Address, filterer bind.ContractFilterer) (*MetronomeFilterer, error) { + contract, err := bindMetronome(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &MetronomeFilterer{contract: contract}, nil +} + +// bindMetronome binds a generic wrapper to an already deployed contract. +func bindMetronome(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := MetronomeMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Metronome *MetronomeRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Metronome.Contract.MetronomeCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Metronome *MetronomeRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Metronome.Contract.MetronomeTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Metronome *MetronomeRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Metronome.Contract.MetronomeTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_Metronome *MetronomeCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _Metronome.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_Metronome *MetronomeTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _Metronome.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_Metronome *MetronomeTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _Metronome.Contract.contract.Transact(opts, method, params...) +} + +// ClaimedBounties is a free data retrieval call binding the contract method 0x1e2339e3. +// +// Solidity: function ClaimedBounties(uint256 , uint256 ) view returns(bool) +func (_Metronome *MetronomeCaller) ClaimedBounties(opts *bind.CallOpts, arg0 *big.Int, arg1 *big.Int) (bool, error) { + var out []interface{} + err := _Metronome.contract.Call(opts, &out, "ClaimedBounties", arg0, arg1) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// ClaimedBounties is a free data retrieval call binding the contract method 0x1e2339e3. +// +// Solidity: function ClaimedBounties(uint256 , uint256 ) view returns(bool) +func (_Metronome *MetronomeSession) ClaimedBounties(arg0 *big.Int, arg1 *big.Int) (bool, error) { + return _Metronome.Contract.ClaimedBounties(&_Metronome.CallOpts, arg0, arg1) +} + +// ClaimedBounties is a free data retrieval call binding the contract method 0x1e2339e3. +// +// Solidity: function ClaimedBounties(uint256 , uint256 ) view returns(bool) +func (_Metronome *MetronomeCallerSession) ClaimedBounties(arg0 *big.Int, arg1 *big.Int) (bool, error) { + return _Metronome.Contract.ClaimedBounties(&_Metronome.CallOpts, arg0, arg1) +} + +// NumSchedules is a free data retrieval call binding the contract method 0x14e6424c. +// +// Solidity: function NumSchedules() view returns(uint256) +func (_Metronome *MetronomeCaller) NumSchedules(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Metronome.contract.Call(opts, &out, "NumSchedules") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// NumSchedules is a free data retrieval call binding the contract method 0x14e6424c. +// +// Solidity: function NumSchedules() view returns(uint256) +func (_Metronome *MetronomeSession) NumSchedules() (*big.Int, error) { + return _Metronome.Contract.NumSchedules(&_Metronome.CallOpts) +} + +// NumSchedules is a free data retrieval call binding the contract method 0x14e6424c. +// +// Solidity: function NumSchedules() view returns(uint256) +func (_Metronome *MetronomeCallerSession) NumSchedules() (*big.Int, error) { + return _Metronome.Contract.NumSchedules(&_Metronome.CallOpts) +} + +// ScheduleBalances is a free data retrieval call binding the contract method 0x4a82fe98. +// +// Solidity: function ScheduleBalances(uint256 ) view returns(uint256) +func (_Metronome *MetronomeCaller) ScheduleBalances(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var out []interface{} + err := _Metronome.contract.Call(opts, &out, "ScheduleBalances", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// ScheduleBalances is a free data retrieval call binding the contract method 0x4a82fe98. +// +// Solidity: function ScheduleBalances(uint256 ) view returns(uint256) +func (_Metronome *MetronomeSession) ScheduleBalances(arg0 *big.Int) (*big.Int, error) { + return _Metronome.Contract.ScheduleBalances(&_Metronome.CallOpts, arg0) +} + +// ScheduleBalances is a free data retrieval call binding the contract method 0x4a82fe98. +// +// Solidity: function ScheduleBalances(uint256 ) view returns(uint256) +func (_Metronome *MetronomeCallerSession) ScheduleBalances(arg0 *big.Int) (*big.Int, error) { + return _Metronome.Contract.ScheduleBalances(&_Metronome.CallOpts, arg0) +} + +// Schedules is a free data retrieval call binding the contract method 0x8c3f896e. +// +// Solidity: function Schedules(uint256 ) view returns(uint256 remainder, uint256 divisor, uint256 bounty) +func (_Metronome *MetronomeCaller) Schedules(opts *bind.CallOpts, arg0 *big.Int) (struct { + Remainder *big.Int + Divisor *big.Int + Bounty *big.Int +}, error) { + var out []interface{} + err := _Metronome.contract.Call(opts, &out, "Schedules", arg0) + + outstruct := new(struct { + Remainder *big.Int + Divisor *big.Int + Bounty *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.Remainder = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + outstruct.Divisor = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int) + outstruct.Bounty = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// Schedules is a free data retrieval call binding the contract method 0x8c3f896e. +// +// Solidity: function Schedules(uint256 ) view returns(uint256 remainder, uint256 divisor, uint256 bounty) +func (_Metronome *MetronomeSession) Schedules(arg0 *big.Int) (struct { + Remainder *big.Int + Divisor *big.Int + Bounty *big.Int +}, error) { + return _Metronome.Contract.Schedules(&_Metronome.CallOpts, arg0) +} + +// Schedules is a free data retrieval call binding the contract method 0x8c3f896e. +// +// Solidity: function Schedules(uint256 ) view returns(uint256 remainder, uint256 divisor, uint256 bounty) +func (_Metronome *MetronomeCallerSession) Schedules(arg0 *big.Int) (struct { + Remainder *big.Int + Divisor *big.Int + Bounty *big.Int +}, error) { + return _Metronome.Contract.Schedules(&_Metronome.CallOpts, arg0) +} + +// Claim is a paid mutator transaction binding the contract method 0xddd5e1b2. +// +// Solidity: function claim(uint256 scheduleID, address forAddress) returns() +func (_Metronome *MetronomeTransactor) Claim(opts *bind.TransactOpts, scheduleID *big.Int, forAddress common.Address) (*types.Transaction, error) { + return _Metronome.contract.Transact(opts, "claim", scheduleID, forAddress) +} + +// Claim is a paid mutator transaction binding the contract method 0xddd5e1b2. +// +// Solidity: function claim(uint256 scheduleID, address forAddress) returns() +func (_Metronome *MetronomeSession) Claim(scheduleID *big.Int, forAddress common.Address) (*types.Transaction, error) { + return _Metronome.Contract.Claim(&_Metronome.TransactOpts, scheduleID, forAddress) +} + +// Claim is a paid mutator transaction binding the contract method 0xddd5e1b2. +// +// Solidity: function claim(uint256 scheduleID, address forAddress) returns() +func (_Metronome *MetronomeTransactorSession) Claim(scheduleID *big.Int, forAddress common.Address) (*types.Transaction, error) { + return _Metronome.Contract.Claim(&_Metronome.TransactOpts, scheduleID, forAddress) +} + +// ClaimBatch is a paid mutator transaction binding the contract method 0x18d052e3. +// +// Solidity: function claimBatch(uint256[] scheduleIDs, address forAddress) returns() +func (_Metronome *MetronomeTransactor) ClaimBatch(opts *bind.TransactOpts, scheduleIDs []*big.Int, forAddress common.Address) (*types.Transaction, error) { + return _Metronome.contract.Transact(opts, "claimBatch", scheduleIDs, forAddress) +} + +// ClaimBatch is a paid mutator transaction binding the contract method 0x18d052e3. +// +// Solidity: function claimBatch(uint256[] scheduleIDs, address forAddress) returns() +func (_Metronome *MetronomeSession) ClaimBatch(scheduleIDs []*big.Int, forAddress common.Address) (*types.Transaction, error) { + return _Metronome.Contract.ClaimBatch(&_Metronome.TransactOpts, scheduleIDs, forAddress) +} + +// ClaimBatch is a paid mutator transaction binding the contract method 0x18d052e3. +// +// Solidity: function claimBatch(uint256[] scheduleIDs, address forAddress) returns() +func (_Metronome *MetronomeTransactorSession) ClaimBatch(scheduleIDs []*big.Int, forAddress common.Address) (*types.Transaction, error) { + return _Metronome.Contract.ClaimBatch(&_Metronome.TransactOpts, scheduleIDs, forAddress) +} + +// CreateSchedule is a paid mutator transaction binding the contract method 0x5294bac8. +// +// Solidity: function createSchedule(uint256 remainder, uint256 divisor, uint256 bounty) payable returns(uint256 scheduleID) +func (_Metronome *MetronomeTransactor) CreateSchedule(opts *bind.TransactOpts, remainder *big.Int, divisor *big.Int, bounty *big.Int) (*types.Transaction, error) { + return _Metronome.contract.Transact(opts, "createSchedule", remainder, divisor, bounty) +} + +// CreateSchedule is a paid mutator transaction binding the contract method 0x5294bac8. +// +// Solidity: function createSchedule(uint256 remainder, uint256 divisor, uint256 bounty) payable returns(uint256 scheduleID) +func (_Metronome *MetronomeSession) CreateSchedule(remainder *big.Int, divisor *big.Int, bounty *big.Int) (*types.Transaction, error) { + return _Metronome.Contract.CreateSchedule(&_Metronome.TransactOpts, remainder, divisor, bounty) +} + +// CreateSchedule is a paid mutator transaction binding the contract method 0x5294bac8. +// +// Solidity: function createSchedule(uint256 remainder, uint256 divisor, uint256 bounty) payable returns(uint256 scheduleID) +func (_Metronome *MetronomeTransactorSession) CreateSchedule(remainder *big.Int, divisor *big.Int, bounty *big.Int) (*types.Transaction, error) { + return _Metronome.Contract.CreateSchedule(&_Metronome.TransactOpts, remainder, divisor, bounty) +} + +// IncreaseBalance is a paid mutator transaction binding the contract method 0x3e4ccb40. +// +// Solidity: function increaseBalance(uint256 scheduleID) payable returns() +func (_Metronome *MetronomeTransactor) IncreaseBalance(opts *bind.TransactOpts, scheduleID *big.Int) (*types.Transaction, error) { + return _Metronome.contract.Transact(opts, "increaseBalance", scheduleID) +} + +// IncreaseBalance is a paid mutator transaction binding the contract method 0x3e4ccb40. +// +// Solidity: function increaseBalance(uint256 scheduleID) payable returns() +func (_Metronome *MetronomeSession) IncreaseBalance(scheduleID *big.Int) (*types.Transaction, error) { + return _Metronome.Contract.IncreaseBalance(&_Metronome.TransactOpts, scheduleID) +} + +// IncreaseBalance is a paid mutator transaction binding the contract method 0x3e4ccb40. +// +// Solidity: function increaseBalance(uint256 scheduleID) payable returns() +func (_Metronome *MetronomeTransactorSession) IncreaseBalance(scheduleID *big.Int) (*types.Transaction, error) { + return _Metronome.Contract.IncreaseBalance(&_Metronome.TransactOpts, scheduleID) +} + +// MetronomeBalanceIncreasedIterator is returned from FilterBalanceIncreased and is used to iterate over the raw logs and unpacked data for BalanceIncreased events raised by the Metronome contract. +type MetronomeBalanceIncreasedIterator struct { + Event *MetronomeBalanceIncreased // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MetronomeBalanceIncreasedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MetronomeBalanceIncreased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MetronomeBalanceIncreased) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MetronomeBalanceIncreasedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MetronomeBalanceIncreasedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MetronomeBalanceIncreased represents a BalanceIncreased event raised by the Metronome contract. +type MetronomeBalanceIncreased struct { + ScheduleID *big.Int + Amount *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBalanceIncreased is a free log retrieval operation binding the contract event 0x4547cc37be8de03db39508613822773a49bc23d17ee4230fa6ec1a0c260156b7. +// +// Solidity: event BalanceIncreased(uint256 indexed scheduleID, uint256 amount) +func (_Metronome *MetronomeFilterer) FilterBalanceIncreased(opts *bind.FilterOpts, scheduleID []*big.Int) (*MetronomeBalanceIncreasedIterator, error) { + + var scheduleIDRule []interface{} + for _, scheduleIDItem := range scheduleID { + scheduleIDRule = append(scheduleIDRule, scheduleIDItem) + } + + logs, sub, err := _Metronome.contract.FilterLogs(opts, "BalanceIncreased", scheduleIDRule) + if err != nil { + return nil, err + } + return &MetronomeBalanceIncreasedIterator{contract: _Metronome.contract, event: "BalanceIncreased", logs: logs, sub: sub}, nil +} + +// WatchBalanceIncreased is a free log subscription operation binding the contract event 0x4547cc37be8de03db39508613822773a49bc23d17ee4230fa6ec1a0c260156b7. +// +// Solidity: event BalanceIncreased(uint256 indexed scheduleID, uint256 amount) +func (_Metronome *MetronomeFilterer) WatchBalanceIncreased(opts *bind.WatchOpts, sink chan<- *MetronomeBalanceIncreased, scheduleID []*big.Int) (event.Subscription, error) { + + var scheduleIDRule []interface{} + for _, scheduleIDItem := range scheduleID { + scheduleIDRule = append(scheduleIDRule, scheduleIDItem) + } + + logs, sub, err := _Metronome.contract.WatchLogs(opts, "BalanceIncreased", scheduleIDRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MetronomeBalanceIncreased) + if err := _Metronome.contract.UnpackLog(event, "BalanceIncreased", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBalanceIncreased is a log parse operation binding the contract event 0x4547cc37be8de03db39508613822773a49bc23d17ee4230fa6ec1a0c260156b7. +// +// Solidity: event BalanceIncreased(uint256 indexed scheduleID, uint256 amount) +func (_Metronome *MetronomeFilterer) ParseBalanceIncreased(log types.Log) (*MetronomeBalanceIncreased, error) { + event := new(MetronomeBalanceIncreased) + if err := _Metronome.contract.UnpackLog(event, "BalanceIncreased", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MetronomeBountyClaimedIterator is returned from FilterBountyClaimed and is used to iterate over the raw logs and unpacked data for BountyClaimed events raised by the Metronome contract. +type MetronomeBountyClaimedIterator struct { + Event *MetronomeBountyClaimed // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MetronomeBountyClaimedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MetronomeBountyClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MetronomeBountyClaimed) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MetronomeBountyClaimedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MetronomeBountyClaimedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MetronomeBountyClaimed represents a BountyClaimed event raised by the Metronome contract. +type MetronomeBountyClaimed struct { + ScheduleID *big.Int + ForAddress common.Address + Payment *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterBountyClaimed is a free log retrieval operation binding the contract event 0x23c972d46b3251ae358ad69fb3761ef8f5c38c5131502ed9e9bde9b129da9215. +// +// Solidity: event BountyClaimed(uint256 indexed scheduleID, address indexed forAddress, uint256 payment) +func (_Metronome *MetronomeFilterer) FilterBountyClaimed(opts *bind.FilterOpts, scheduleID []*big.Int, forAddress []common.Address) (*MetronomeBountyClaimedIterator, error) { + + var scheduleIDRule []interface{} + for _, scheduleIDItem := range scheduleID { + scheduleIDRule = append(scheduleIDRule, scheduleIDItem) + } + var forAddressRule []interface{} + for _, forAddressItem := range forAddress { + forAddressRule = append(forAddressRule, forAddressItem) + } + + logs, sub, err := _Metronome.contract.FilterLogs(opts, "BountyClaimed", scheduleIDRule, forAddressRule) + if err != nil { + return nil, err + } + return &MetronomeBountyClaimedIterator{contract: _Metronome.contract, event: "BountyClaimed", logs: logs, sub: sub}, nil +} + +// WatchBountyClaimed is a free log subscription operation binding the contract event 0x23c972d46b3251ae358ad69fb3761ef8f5c38c5131502ed9e9bde9b129da9215. +// +// Solidity: event BountyClaimed(uint256 indexed scheduleID, address indexed forAddress, uint256 payment) +func (_Metronome *MetronomeFilterer) WatchBountyClaimed(opts *bind.WatchOpts, sink chan<- *MetronomeBountyClaimed, scheduleID []*big.Int, forAddress []common.Address) (event.Subscription, error) { + + var scheduleIDRule []interface{} + for _, scheduleIDItem := range scheduleID { + scheduleIDRule = append(scheduleIDRule, scheduleIDItem) + } + var forAddressRule []interface{} + for _, forAddressItem := range forAddress { + forAddressRule = append(forAddressRule, forAddressItem) + } + + logs, sub, err := _Metronome.contract.WatchLogs(opts, "BountyClaimed", scheduleIDRule, forAddressRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MetronomeBountyClaimed) + if err := _Metronome.contract.UnpackLog(event, "BountyClaimed", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseBountyClaimed is a log parse operation binding the contract event 0x23c972d46b3251ae358ad69fb3761ef8f5c38c5131502ed9e9bde9b129da9215. +// +// Solidity: event BountyClaimed(uint256 indexed scheduleID, address indexed forAddress, uint256 payment) +func (_Metronome *MetronomeFilterer) ParseBountyClaimed(log types.Log) (*MetronomeBountyClaimed, error) { + event := new(MetronomeBountyClaimed) + if err := _Metronome.contract.UnpackLog(event, "BountyClaimed", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// MetronomeScheduleCreatedIterator is returned from FilterScheduleCreated and is used to iterate over the raw logs and unpacked data for ScheduleCreated events raised by the Metronome contract. +type MetronomeScheduleCreatedIterator struct { + Event *MetronomeScheduleCreated // Event containing the contract specifics and raw log + + contract *bind.BoundContract // Generic contract to use for unpacking event data + event string // Event name to use for unpacking event data + + logs chan types.Log // Log channel receiving the found contract events + sub ethereum.Subscription // Subscription for errors, completion and termination + done bool // Whether the subscription completed delivering logs + fail error // Occurred error to stop iteration +} + +// Next advances the iterator to the subsequent event, returning whether there +// are any more events found. In case of a retrieval or parsing error, false is +// returned and Error() can be queried for the exact failure. +func (it *MetronomeScheduleCreatedIterator) Next() bool { + // If the iterator failed, stop iterating + if it.fail != nil { + return false + } + // If the iterator completed, deliver directly whatever's available + if it.done { + select { + case log := <-it.logs: + it.Event = new(MetronomeScheduleCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + default: + return false + } + } + // Iterator still in progress, wait for either a data or an error event + select { + case log := <-it.logs: + it.Event = new(MetronomeScheduleCreated) + if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil { + it.fail = err + return false + } + it.Event.Raw = log + return true + + case err := <-it.sub.Err(): + it.done = true + it.fail = err + return it.Next() + } +} + +// Error returns any retrieval or parsing error occurred during filtering. +func (it *MetronomeScheduleCreatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *MetronomeScheduleCreatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// MetronomeScheduleCreated represents a ScheduleCreated event raised by the Metronome contract. +type MetronomeScheduleCreated struct { + ScheduleID *big.Int + Remainder *big.Int + Divisor *big.Int + Bounty *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterScheduleCreated is a free log retrieval operation binding the contract event 0xbd7880573155705535dce3194981f4b25e22063a5619ea279e73b43b34831670. +// +// Solidity: event ScheduleCreated(uint256 indexed scheduleID, uint256 indexed remainder, uint256 indexed divisor, uint256 bounty) +func (_Metronome *MetronomeFilterer) FilterScheduleCreated(opts *bind.FilterOpts, scheduleID []*big.Int, remainder []*big.Int, divisor []*big.Int) (*MetronomeScheduleCreatedIterator, error) { + + var scheduleIDRule []interface{} + for _, scheduleIDItem := range scheduleID { + scheduleIDRule = append(scheduleIDRule, scheduleIDItem) + } + var remainderRule []interface{} + for _, remainderItem := range remainder { + remainderRule = append(remainderRule, remainderItem) + } + var divisorRule []interface{} + for _, divisorItem := range divisor { + divisorRule = append(divisorRule, divisorItem) + } + + logs, sub, err := _Metronome.contract.FilterLogs(opts, "ScheduleCreated", scheduleIDRule, remainderRule, divisorRule) + if err != nil { + return nil, err + } + return &MetronomeScheduleCreatedIterator{contract: _Metronome.contract, event: "ScheduleCreated", logs: logs, sub: sub}, nil +} + +// WatchScheduleCreated is a free log subscription operation binding the contract event 0xbd7880573155705535dce3194981f4b25e22063a5619ea279e73b43b34831670. +// +// Solidity: event ScheduleCreated(uint256 indexed scheduleID, uint256 indexed remainder, uint256 indexed divisor, uint256 bounty) +func (_Metronome *MetronomeFilterer) WatchScheduleCreated(opts *bind.WatchOpts, sink chan<- *MetronomeScheduleCreated, scheduleID []*big.Int, remainder []*big.Int, divisor []*big.Int) (event.Subscription, error) { + + var scheduleIDRule []interface{} + for _, scheduleIDItem := range scheduleID { + scheduleIDRule = append(scheduleIDRule, scheduleIDItem) + } + var remainderRule []interface{} + for _, remainderItem := range remainder { + remainderRule = append(remainderRule, remainderItem) + } + var divisorRule []interface{} + for _, divisorItem := range divisor { + divisorRule = append(divisorRule, divisorItem) + } + + logs, sub, err := _Metronome.contract.WatchLogs(opts, "ScheduleCreated", scheduleIDRule, remainderRule, divisorRule) + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(MetronomeScheduleCreated) + if err := _Metronome.contract.UnpackLog(event, "ScheduleCreated", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseScheduleCreated is a log parse operation binding the contract event 0xbd7880573155705535dce3194981f4b25e22063a5619ea279e73b43b34831670. +// +// Solidity: event ScheduleCreated(uint256 indexed scheduleID, uint256 indexed remainder, uint256 indexed divisor, uint256 bounty) +func (_Metronome *MetronomeFilterer) ParseScheduleCreated(log types.Log) (*MetronomeScheduleCreated, error) { + event := new(MetronomeScheduleCreated) + if err := _Metronome.contract.UnpackLog(event, "ScheduleCreated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +func CreateMetronomeDeploymentCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc string + var gasLimit uint64 + var simulate bool + var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int + + cmd := &cobra.Command{ + Use: "deploy", + Short: "Deploy a new Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateMetronomeDeployBytecode() + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + + address, deploymentTransaction, _, deploymentErr := DeployMetronome( + transactionOpts, + client, + ) + if deploymentErr != nil { + return deploymentErr + } + + cmd.Printf("Transaction hash: %s\nContract address: %s\n", deploymentTransaction.Hash().Hex(), address.Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + Data: deploymentTransaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := deploymentTransaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + + return cmd +} + +func generateMetronomeDeployBytecode() ([]byte, error) { + abiPacked, err := MetronomeMetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("") + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(MetronomeMetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + +func CreateClaimedBountiesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var arg0 *big.Int + var arg0Raw string + var arg1 *big.Int + var arg1Raw string + + var capture0 bool + + cmd := &cobra.Command{ + Use: "claimed-bounties", + Short: "Call the ClaimedBounties view method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if arg0Raw == "" { + return fmt.Errorf("--arg-0 argument not specified") + } + arg0 = new(big.Int) + arg0.SetString(arg0Raw, 0) + + if arg1Raw == "" { + return fmt.Errorf("--arg-1 argument not specified") + } + arg1 = new(big.Int) + arg1.SetString(arg1Raw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := MetronomeCallerSession{ + Contract: &contract.MetronomeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.ClaimedBounties( + arg0, + arg1, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %t\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument") + cmd.Flags().StringVar(&arg1Raw, "arg-1", "", "arg-1 argument") + + return cmd +} +func CreateNumSchedulesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var capture0 *big.Int + + cmd := &cobra.Command{ + Use: "num-schedules", + Short: "Call the NumSchedules view method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := MetronomeCallerSession{ + Contract: &contract.MetronomeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.NumSchedules() + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.String()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + return cmd +} +func CreateScheduleBalancesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var arg0 *big.Int + var arg0Raw string + + var capture0 *big.Int + + cmd := &cobra.Command{ + Use: "schedule-balances", + Short: "Call the ScheduleBalances view method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if arg0Raw == "" { + return fmt.Errorf("--arg-0 argument not specified") + } + arg0 = new(big.Int) + arg0.SetString(arg0Raw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := MetronomeCallerSession{ + Contract: &contract.MetronomeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.ScheduleBalances( + arg0, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %s\n", capture0.String()) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument") + + return cmd +} +func CreateSchedulesCommand() *cobra.Command { + var contractAddressRaw, rpc string + var contractAddress common.Address + var timeout uint + + var blockNumberRaw, fromAddressRaw string + var pending bool + + var arg0 *big.Int + var arg0Raw string + + var capture0 struct { + Remainder *big.Int + Divisor *big.Int + Bounty *big.Int + } + + cmd := &cobra.Command{ + Use: "schedules", + Short: "Call the Schedules view method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if arg0Raw == "" { + return fmt.Errorf("--arg-0 argument not specified") + } + arg0 = new(big.Int) + arg0.SetString(arg0Raw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + callOpts := bind.CallOpts{} + SetCallParametersFromArgs(&callOpts, pending, fromAddressRaw, blockNumberRaw) + + session := MetronomeCallerSession{ + Contract: &contract.MetronomeCaller, + CallOpts: callOpts, + } + + var callErr error + capture0, callErr = session.Schedules( + arg0, + ) + if callErr != nil { + return callErr + } + + cmd.Printf("0: %v\n", capture0) + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&blockNumberRaw, "block", "", "Block number at which to call the view method") + cmd.Flags().BoolVar(&pending, "pending", false, "Set this flag if it's ok to call the view method against pending state") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&fromAddressRaw, "from", "", "Optional address for caller of the view method") + + cmd.Flags().StringVar(&arg0Raw, "arg-0", "", "arg-0 argument") + + return cmd +} + +func CreateClaimCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + + var scheduleID *big.Int + var scheduleIDRaw string + var forAddress common.Address + var forAddressRaw string + + cmd := &cobra.Command{ + Use: "claim", + Short: "Execute the Claim method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if scheduleIDRaw == "" { + return fmt.Errorf("--schedule-id argument not specified") + } + scheduleID = new(big.Int) + scheduleID.SetString(scheduleIDRaw, 0) + + if forAddressRaw == "" { + return fmt.Errorf("--for-address argument not specified") + } else if !common.IsHexAddress(forAddressRaw) { + return fmt.Errorf("--for-address argument is not a valid Ethereum address") + } + forAddress = common.HexToAddress(forAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := MetronomeTransactorSession{ + Contract: &contract.MetronomeTransactor, + TransactOpts: *transactionOpts, + } + + if safeAddress != "" { + abi, err := MetronomeMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "claim" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + scheduleID, + forAddress, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Claim( + + scheduleID, + forAddress, + ) + if err != nil { + return err + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + + cmd.Flags().StringVar(&scheduleIDRaw, "schedule-id", "", "schedule-id argument") + cmd.Flags().StringVar(&forAddressRaw, "for-address", "", "for-address argument (common.Address)") + + return cmd +} +func CreateClaimBatchCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + + var scheduleIDs []*big.Int + var scheduleIDsRaw string + var forAddress common.Address + var forAddressRaw string + + cmd := &cobra.Command{ + Use: "claim-batch", + Short: "Execute the ClaimBatch method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if scheduleIDsRaw == "" { + return fmt.Errorf("--schedule-i-ds argument not specified") + } else if strings.HasPrefix(scheduleIDsRaw, "@") { + filename := strings.TrimPrefix(scheduleIDsRaw, "@") + contents, readErr := os.ReadFile(filename) + if readErr != nil { + return readErr + } + unmarshalErr := json.Unmarshal(contents, &scheduleIDs) + if unmarshalErr != nil { + return unmarshalErr + } + } else { + unmarshalErr := json.Unmarshal([]byte(scheduleIDsRaw), &scheduleIDs) + if unmarshalErr != nil { + return unmarshalErr + } + } + + if forAddressRaw == "" { + return fmt.Errorf("--for-address argument not specified") + } else if !common.IsHexAddress(forAddressRaw) { + return fmt.Errorf("--for-address argument is not a valid Ethereum address") + } + forAddress = common.HexToAddress(forAddressRaw) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := MetronomeTransactorSession{ + Contract: &contract.MetronomeTransactor, + TransactOpts: *transactionOpts, + } + + if safeAddress != "" { + abi, err := MetronomeMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "claimBatch" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + scheduleIDs, + forAddress, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.ClaimBatch( + + scheduleIDs, + forAddress, + ) + if err != nil { + return err + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + + cmd.Flags().StringVar(&scheduleIDsRaw, "schedule-i-ds", "", "schedule-i-ds argument ([]*big.Int)") + cmd.Flags().StringVar(&forAddressRaw, "for-address", "", "for-address argument (common.Address)") + + return cmd +} +func CreateCreateScheduleCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + + var remainder *big.Int + var remainderRaw string + var divisor *big.Int + var divisorRaw string + var bounty *big.Int + var bountyRaw string + + cmd := &cobra.Command{ + Use: "create-schedule", + Short: "Execute the CreateSchedule method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if remainderRaw == "" { + return fmt.Errorf("--remainder argument not specified") + } + remainder = new(big.Int) + remainder.SetString(remainderRaw, 0) + + if divisorRaw == "" { + return fmt.Errorf("--divisor argument not specified") + } + divisor = new(big.Int) + divisor.SetString(divisorRaw, 0) + + if bountyRaw == "" { + return fmt.Errorf("--bounty argument not specified") + } + bounty = new(big.Int) + bounty.SetString(bountyRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := MetronomeTransactorSession{ + Contract: &contract.MetronomeTransactor, + TransactOpts: *transactionOpts, + } + + if safeAddress != "" { + abi, err := MetronomeMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "createSchedule" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + remainder, + divisor, + bounty, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.CreateSchedule( + + remainder, + divisor, + bounty, + ) + if err != nil { + return err + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + + cmd.Flags().StringVar(&remainderRaw, "remainder", "", "remainder argument") + cmd.Flags().StringVar(&divisorRaw, "divisor", "", "divisor argument") + cmd.Flags().StringVar(&bountyRaw, "bounty", "", "bounty argument") + + return cmd +} +func CreateIncreaseBalanceCommand() *cobra.Command { + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string + var gasLimit uint64 + var simulate bool + var timeout uint + var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + + var scheduleID *big.Int + var scheduleIDRaw string + + cmd := &cobra.Command{ + Use: "increase-balance", + Short: "Execute the IncreaseBalance method on a Metronome contract", + PreRunE: func(cmd *cobra.Command, args []string) error { + if contractAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(contractAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + contractAddress = common.HexToAddress(contractAddressRaw) + + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if scheduleIDRaw == "" { + return fmt.Errorf("--schedule-id argument not specified") + } + scheduleID = new(big.Int) + scheduleID.SetString(scheduleIDRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + + transactionOpts, transactionOptsErr := bind.NewKeyedTransactorWithChainID(key.PrivateKey, chainID) + if transactionOptsErr != nil { + return transactionOptsErr + } + + SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + + contract, contractErr := NewMetronome(contractAddress, client) + if contractErr != nil { + return contractErr + } + + session := MetronomeTransactorSession{ + Contract: &contract.MetronomeTransactor, + TransactOpts: *transactionOpts, + } + + if safeAddress != "" { + abi, err := MetronomeMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "increaseBalance" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + scheduleID, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.IncreaseBalance( + + scheduleID, + ) + if err != nil { + return err + } + + cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) + if transactionOpts.NoSend { + estimationMessage := ethereum.CallMsg{ + From: transactionOpts.From, + To: &contractAddress, + Data: transaction.Data(), + } + + gasEstimationCtx, cancelGasEstimationCtx := NewChainContext(timeout) + defer cancelGasEstimationCtx() + + gasEstimate, gasEstimateErr := client.EstimateGas(gasEstimationCtx, estimationMessage) + if gasEstimateErr != nil { + return gasEstimateErr + } + + transactionBinary, transactionBinaryErr := transaction.MarshalBinary() + if transactionBinaryErr != nil { + return transactionBinaryErr + } + transactionBinaryHex := hex.EncodeToString(transactionBinary) + + cmd.Printf("Transaction: %s\nEstimated gas: %d\n", transactionBinaryHex, gasEstimate) + } else { + cmd.Println("Transaction submitted") + } + + return nil + }, + } + + cmd.Flags().StringVar(&rpc, "rpc", "", "URL of the JSONRPC API to use") + cmd.Flags().StringVar(&keyfile, "keyfile", "", "Path to the keystore file to use for the transaction") + cmd.Flags().StringVar(&password, "password", "", "Password to use to unlock the keystore (if not specified, you will be prompted for the password when the command executes)") + cmd.Flags().StringVar(&nonce, "nonce", "", "Nonce to use for the transaction") + cmd.Flags().StringVar(&value, "value", "", "Value to send with the transaction") + cmd.Flags().StringVar(&gasPrice, "gas-price", "", "Gas price to use for the transaction") + cmd.Flags().StringVar(&maxFeePerGas, "max-fee-per-gas", "", "Maximum fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().StringVar(&maxPriorityFeePerGas, "max-priority-fee-per-gas", "", "Maximum priority fee per gas to use for the (EIP-1559) transaction") + cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") + cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") + cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + + cmd.Flags().StringVar(&scheduleIDRaw, "schedule-id", "", "schedule-id argument") + + return cmd +} + +var ErrNoRPCURL error = errors.New("no RPC URL provided -- please pass an RPC URL from the command line or set the METRONOME_RPC_URL environment variable") + +// Generates an Ethereum client to the JSONRPC API at the given URL. If rpcURL is empty, then it +// attempts to read the RPC URL from the METRONOME_RPC_URL environment variable. If that is empty, +// too, then it returns an error. +func NewClient(rpcURL string) (*ethclient.Client, error) { + if rpcURL == "" { + rpcURL = os.Getenv("METRONOME_RPC_URL") + } + + if rpcURL == "" { + return nil, ErrNoRPCURL + } + + client, err := ethclient.Dial(rpcURL) + return client, err +} + +// Creates a new context to be used when interacting with the chain client. +func NewChainContext(timeout uint) (context.Context, context.CancelFunc) { + baseCtx := context.Background() + parsedTimeout := time.Duration(timeout) * time.Second + ctx, cancel := context.WithTimeout(baseCtx, parsedTimeout) + return ctx, cancel +} + +// Unlocks a key from a keystore (byte contents of a keystore file) with the given password. +func UnlockKeystore(keystoreData []byte, password string) (*keystore.Key, error) { + key, err := keystore.DecryptKey(keystoreData, password) + return key, err +} + +// Loads a key from file, prompting the user for the password if it is not provided as a function argument. +func KeyFromFile(keystoreFile string, password string) (*keystore.Key, error) { + var emptyKey *keystore.Key + keystoreContent, readErr := os.ReadFile(keystoreFile) + if readErr != nil { + return emptyKey, readErr + } + + // If password is "", prompt user for password. + if password == "" { + fmt.Printf("Please provide a password for keystore (%s): ", keystoreFile) + passwordRaw, inputErr := term.ReadPassword(int(os.Stdin.Fd())) + if inputErr != nil { + return emptyKey, fmt.Errorf("error reading password: %s", inputErr.Error()) + } + fmt.Print("\n") + password = string(passwordRaw) + } + + key, err := UnlockKeystore(keystoreContent, password) + return key, err +} + +// This method is used to set the parameters on a view call from command line arguments (represented mostly as +// strings). +func SetCallParametersFromArgs(opts *bind.CallOpts, pending bool, fromAddress, blockNumber string) { + if pending { + opts.Pending = true + } + + if fromAddress != "" { + opts.From = common.HexToAddress(fromAddress) + } + + if blockNumber != "" { + opts.BlockNumber = new(big.Int) + opts.BlockNumber.SetString(blockNumber, 0) + } +} + +// This method is used to set the parameters on a transaction from command line arguments (represented mostly as +// strings). +func SetTransactionParametersFromArgs(opts *bind.TransactOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas string, gasLimit uint64, noSend bool) { + if nonce != "" { + opts.Nonce = new(big.Int) + opts.Nonce.SetString(nonce, 0) + } + + if value != "" { + opts.Value = new(big.Int) + opts.Value.SetString(value, 0) + } + + if gasPrice != "" { + opts.GasPrice = new(big.Int) + opts.GasPrice.SetString(gasPrice, 0) + } + + if maxFeePerGas != "" { + opts.GasFeeCap = new(big.Int) + opts.GasFeeCap.SetString(maxFeePerGas, 0) + } + + if maxPriorityFeePerGas != "" { + opts.GasTipCap = new(big.Int) + opts.GasTipCap.SetString(maxPriorityFeePerGas, 0) + } + + if gasLimit != 0 { + opts.GasLimit = gasLimit + } + + opts.NoSend = noSend +} + +func CreateMetronomeCommand() *cobra.Command { + cmd := &cobra.Command{ + Use: "metronome", + Short: "Interact with the Metronome contract", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + + cmd.SetOut(os.Stdout) + + DeployGroup := &cobra.Group{ + ID: "deploy", Title: "Commands which deploy contracts", + } + cmd.AddGroup(DeployGroup) + ViewGroup := &cobra.Group{ + ID: "view", Title: "Commands which view contract state", + } + TransactGroup := &cobra.Group{ + ID: "transact", Title: "Commands which submit transactions", + } + cmd.AddGroup(ViewGroup, TransactGroup) + + cmdDeployMetronome := CreateMetronomeDeploymentCommand() + cmdDeployMetronome.GroupID = DeployGroup.ID + cmd.AddCommand(cmdDeployMetronome) + + cmdViewClaimedBounties := CreateClaimedBountiesCommand() + cmdViewClaimedBounties.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewClaimedBounties) + cmdViewNumSchedules := CreateNumSchedulesCommand() + cmdViewNumSchedules.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewNumSchedules) + cmdViewScheduleBalances := CreateScheduleBalancesCommand() + cmdViewScheduleBalances.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewScheduleBalances) + cmdViewSchedules := CreateSchedulesCommand() + cmdViewSchedules.GroupID = ViewGroup.ID + cmd.AddCommand(cmdViewSchedules) + + cmdTransactClaim := CreateClaimCommand() + cmdTransactClaim.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactClaim) + cmdTransactClaimBatch := CreateClaimBatchCommand() + cmdTransactClaimBatch.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactClaimBatch) + cmdTransactCreateSchedule := CreateCreateScheduleCommand() + cmdTransactCreateSchedule.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactCreateSchedule) + cmdTransactIncreaseBalance := CreateIncreaseBalanceCommand() + cmdTransactIncreaseBalance.GroupID = TransactGroup.ID + cmd.AddCommand(cmdTransactIncreaseBalance) + + return cmd +} + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/MockERC1155/MockERC1155.go b/bindings/MockERC1155/MockERC1155.go index 0709b826..1e442327 100644 --- a/bindings/MockERC1155/MockERC1155.go +++ b/bindings/MockERC1155/MockERC1155.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package MockERC1155 --cli --struct MockERC1155 --output bindings/MockERC1155/MockERC1155.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package MockERC1155 import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" @@ -27,10 +31,16 @@ import ( "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // MockERC1155MetaData contains all meta data concerning the MockERC1155 contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -45,10 +55,9 @@ var ( _ = abi.ConvertType ) -// MockERC1155MetaData contains all meta data concerning the MockERC1155 contract. var MockERC1155MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC1155InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idsLength\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"valuesLength\",\"type\":\"uint256\"}],\"name\":\"ERC1155InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC1155InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC1155MissingApprovalForAll\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b50604051806060016040528060258152602001620024cc602591396200003d816200004460201b60201c565b50620003ba565b8060029081620000559190620002d3565b5050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620000db57607f821691505b602082108103620000f157620000f062000093565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200011c565b6200016786836200011c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620001b4620001ae620001a8846200017f565b62000189565b6200017f565b9050919050565b6000819050919050565b620001d08362000193565b620001e8620001df82620001bb565b84845462000129565b825550505050565b600090565b620001ff620001f0565b6200020c818484620001c5565b505050565b5b81811015620002345762000228600082620001f5565b60018101905062000212565b5050565b601f82111562000283576200024d81620000f7565b62000258846200010c565b8101602085101562000268578190505b6200028062000277856200010c565b83018262000211565b50505b505050565b600082821c905092915050565b6000620002a86000198460080262000288565b1980831691505092915050565b6000620002c3838362000295565b9150826002028217905092915050565b620002de8262000059565b67ffffffffffffffff811115620002fa57620002f962000064565b5b620003068254620000c2565b6200031382828562000238565b600060209050601f8311600181146200034b576000841562000336578287015190505b620003428582620002b5565b865550620003b2565b601f1984166200035b86620000f7565b60005b8281101562000385578489015182556001820191506020850194506020810190506200035e565b86831015620003a55784890151620003a1601f89168262000295565b8355505b6001600288020188555050505b505050505050565b61210280620003ca6000396000f3fe608060405234801561001057600080fd5b506004361061009d5760003560e01c80634e1273f4116100665780634e1273f41461016a578063a22cb4651461019a578063e985e9c5146101b6578063f242432a146101e6578063f5298aca146102025761009d565b8062fdd58e146100a257806301ffc9a7146100d25780630e89341c14610102578063156e29f6146101325780632eb2c2d61461014e575b600080fd5b6100bc60048036038101906100b79190611508565b61021e565b6040516100c99190611557565b60405180910390f35b6100ec60048036038101906100e791906115ca565b610278565b6040516100f99190611612565b60405180910390f35b61011c6004803603810190610117919061162d565b61035a565b60405161012991906116ea565b60405180910390f35b61014c6004803603810190610147919061170c565b6103ee565b005b6101686004803603810190610163919061195c565b61040e565b005b610184600480360381019061017f9190611aee565b6104b6565b6040516101919190611c24565b60405180910390f35b6101b460048036038101906101af9190611c72565b6105bf565b005b6101d060048036038101906101cb9190611cb2565b6105d5565b6040516101dd9190611612565b60405180910390f35b61020060048036038101906101fb9190611cf2565b610669565b005b61021c6004803603810190610217919061170c565b610711565b005b600080600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061034357507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610353575061035282610721565b5b9050919050565b60606002805461036990611db8565b80601f016020809104026020016040519081016040528092919081815260200182805461039590611db8565b80156103e25780601f106103b7576101008083540402835291602001916103e2565b820191906000526020600020905b8154815290600101906020018083116103c557829003601f168201915b50505050509050919050565b6104098383836040518060200160405280600081525061078b565b505050565b6000610418610824565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161415801561045d575061045b86826105d5565b155b156104a15780866040517fe237d922000000000000000000000000000000000000000000000000000000008152600401610498929190611df8565b60405180910390fd5b6104ae868686868661082c565b505050505050565b6060815183511461050257815183516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004016104f9929190611e21565b60405180910390fd5b6000835167ffffffffffffffff81111561051f5761051e611764565b5b60405190808252806020026020018201604052801561054d5781602001602082028036833780820191505090505b50905060005b84518110156105b45761058a610572828761092490919063ffffffff16565b610585838761093890919063ffffffff16565b61021e565b82828151811061059d5761059c611e4a565b5b602002602001018181525050806001019050610553565b508091505092915050565b6105d16105ca610824565b838361094c565b5050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000610673610824565b90508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16141580156106b857506106b686826105d5565b155b156106fc5780866040517fe237d9220000000000000000000000000000000000000000000000000000000081526004016106f3929190611df8565b60405180910390fd5b6107098686868686610abc565b505050505050565b61071c838383610bc7565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107fd5760006040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016107f49190611e79565b60405180910390fd5b60008061080a8585610c6e565b9150915061081c600087848487610c9e565b505050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361089e5760006040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016108959190611e79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036109105760006040517f01a835140000000000000000000000000000000000000000000000000000000081526004016109079190611e79565b60405180910390fd5b61091d8585858585610c9e565b5050505050565b600060208202602084010151905092915050565b600060208202602084010151905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036109be5760006040517fced3e1000000000000000000000000000000000000000000000000000000000081526004016109b59190611e79565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610aaf9190611612565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610b2e5760006040517f57f447ce000000000000000000000000000000000000000000000000000000008152600401610b259190611e79565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610ba05760006040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610b979190611e79565b60405180910390fd5b600080610bad8585610c6e565b91509150610bbe8787848487610c9e565b50505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610c395760006040517f01a83514000000000000000000000000000000000000000000000000000000008152600401610c309190611e79565b60405180910390fd5b600080610c468484610c6e565b91509150610c67856000848460405180602001604052806000815250610c9e565b5050505050565b60608060405191506001825283602083015260408201905060018152826020820152604081016040529250929050565b610caa85858585610d50565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610d49576000610ce8610824565b90506001845103610d38576000610d0960008661093890919063ffffffff16565b90506000610d2160008661093890919063ffffffff16565b9050610d318389898585896110f8565b5050610d47565b610d468187878787876112ac565b5b505b5050505050565b8051825114610d9a57815181516040517f5b059991000000000000000000000000000000000000000000000000000000008152600401610d91929190611e21565b60405180910390fd5b6000610da4610824565b905060005b8351811015610fb3576000610dc7828661093890919063ffffffff16565b90506000610dde838661093890919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff1614610f0b57600080600084815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610eb357888183856040517f03dee4c5000000000000000000000000000000000000000000000000000000008152600401610eaa9493929190611e94565b60405180910390fd5b81810360008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614610fa6578060008084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f9e9190611f08565b925050819055505b5050806001019050610da9565b506001835103611072576000610fd360008561093890919063ffffffff16565b90506000610feb60008561093890919063ffffffff16565b90508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051611063929190611e21565b60405180910390a450506110f1565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516110e8929190611f3c565b60405180910390a45b5050505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b11156112a4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611159959493929190611fc8565b6020604051808303816000875af192505050801561119557506040513d601f19601f820116820180604052508101906111929190612037565b60015b611219573d80600081146111c5576040519150601f19603f3d011682016040523d82523d6000602084013e6111ca565b606091505b50600081510361121157846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016112089190611e79565b60405180910390fd5b805181602001fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146112a257846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016112999190611e79565b60405180910390fd5b505b505050505050565b60008473ffffffffffffffffffffffffffffffffffffffff163b1115611458578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161130d959493929190612064565b6020604051808303816000875af192505050801561134957506040513d601f19601f820116820180604052508101906113469190612037565b60015b6113cd573d8060008114611379576040519150601f19603f3d011682016040523d82523d6000602084013e61137e565b606091505b5060008151036113c557846040517f57f447ce0000000000000000000000000000000000000000000000000000000081526004016113bc9190611e79565b60405180910390fd5b805181602001fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461145657846040517f57f447ce00000000000000000000000000000000000000000000000000000000815260040161144d9190611e79565b60405180910390fd5b505b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061149f82611474565b9050919050565b6114af81611494565b81146114ba57600080fd5b50565b6000813590506114cc816114a6565b92915050565b6000819050919050565b6114e5816114d2565b81146114f057600080fd5b50565b600081359050611502816114dc565b92915050565b6000806040838503121561151f5761151e61146a565b5b600061152d858286016114bd565b925050602061153e858286016114f3565b9150509250929050565b611551816114d2565b82525050565b600060208201905061156c6000830184611548565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115a781611572565b81146115b257600080fd5b50565b6000813590506115c48161159e565b92915050565b6000602082840312156115e0576115df61146a565b5b60006115ee848285016115b5565b91505092915050565b60008115159050919050565b61160c816115f7565b82525050565b60006020820190506116276000830184611603565b92915050565b6000602082840312156116435761164261146a565b5b6000611651848285016114f3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611694578082015181840152602081019050611679565b60008484015250505050565b6000601f19601f8301169050919050565b60006116bc8261165a565b6116c68185611665565b93506116d6818560208601611676565b6116df816116a0565b840191505092915050565b6000602082019050818103600083015261170481846116b1565b905092915050565b6000806000606084860312156117255761172461146a565b5b6000611733868287016114bd565b9350506020611744868287016114f3565b9250506040611755868287016114f3565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61179c826116a0565b810181811067ffffffffffffffff821117156117bb576117ba611764565b5b80604052505050565b60006117ce611460565b90506117da8282611793565b919050565b600067ffffffffffffffff8211156117fa576117f9611764565b5b602082029050602081019050919050565b600080fd5b600061182361181e846117df565b6117c4565b905080838252602082019050602084028301858111156118465761184561180b565b5b835b8181101561186f578061185b88826114f3565b845260208401935050602081019050611848565b5050509392505050565b600082601f83011261188e5761188d61175f565b5b813561189e848260208601611810565b91505092915050565b600080fd5b600067ffffffffffffffff8211156118c7576118c6611764565b5b6118d0826116a0565b9050602081019050919050565b82818337600083830152505050565b60006118ff6118fa846118ac565b6117c4565b90508281526020810184848401111561191b5761191a6118a7565b5b6119268482856118dd565b509392505050565b600082601f8301126119435761194261175f565b5b81356119538482602086016118ec565b91505092915050565b600080600080600060a086880312156119785761197761146a565b5b6000611986888289016114bd565b9550506020611997888289016114bd565b945050604086013567ffffffffffffffff8111156119b8576119b761146f565b5b6119c488828901611879565b935050606086013567ffffffffffffffff8111156119e5576119e461146f565b5b6119f188828901611879565b925050608086013567ffffffffffffffff811115611a1257611a1161146f565b5b611a1e8882890161192e565b9150509295509295909350565b600067ffffffffffffffff821115611a4657611a45611764565b5b602082029050602081019050919050565b6000611a6a611a6584611a2b565b6117c4565b90508083825260208201905060208402830185811115611a8d57611a8c61180b565b5b835b81811015611ab65780611aa288826114bd565b845260208401935050602081019050611a8f565b5050509392505050565b600082601f830112611ad557611ad461175f565b5b8135611ae5848260208601611a57565b91505092915050565b60008060408385031215611b0557611b0461146a565b5b600083013567ffffffffffffffff811115611b2357611b2261146f565b5b611b2f85828601611ac0565b925050602083013567ffffffffffffffff811115611b5057611b4f61146f565b5b611b5c85828601611879565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b611b9b816114d2565b82525050565b6000611bad8383611b92565b60208301905092915050565b6000602082019050919050565b6000611bd182611b66565b611bdb8185611b71565b9350611be683611b82565b8060005b83811015611c17578151611bfe8882611ba1565b9750611c0983611bb9565b925050600181019050611bea565b5085935050505092915050565b60006020820190508181036000830152611c3e8184611bc6565b905092915050565b611c4f816115f7565b8114611c5a57600080fd5b50565b600081359050611c6c81611c46565b92915050565b60008060408385031215611c8957611c8861146a565b5b6000611c97858286016114bd565b9250506020611ca885828601611c5d565b9150509250929050565b60008060408385031215611cc957611cc861146a565b5b6000611cd7858286016114bd565b9250506020611ce8858286016114bd565b9150509250929050565b600080600080600060a08688031215611d0e57611d0d61146a565b5b6000611d1c888289016114bd565b9550506020611d2d888289016114bd565b9450506040611d3e888289016114f3565b9350506060611d4f888289016114f3565b925050608086013567ffffffffffffffff811115611d7057611d6f61146f565b5b611d7c8882890161192e565b9150509295509295909350565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611dd057607f821691505b602082108103611de357611de2611d89565b5b50919050565b611df281611494565b82525050565b6000604082019050611e0d6000830185611de9565b611e1a6020830184611de9565b9392505050565b6000604082019050611e366000830185611548565b611e436020830184611548565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000602082019050611e8e6000830184611de9565b92915050565b6000608082019050611ea96000830187611de9565b611eb66020830186611548565b611ec36040830185611548565b611ed06060830184611548565b95945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611f13826114d2565b9150611f1e836114d2565b9250828201905080821115611f3657611f35611ed9565b5b92915050565b60006040820190508181036000830152611f568185611bc6565b90508181036020830152611f6a8184611bc6565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000611f9a82611f73565b611fa48185611f7e565b9350611fb4818560208601611676565b611fbd816116a0565b840191505092915050565b600060a082019050611fdd6000830188611de9565b611fea6020830187611de9565b611ff76040830186611548565b6120046060830185611548565b81810360808301526120168184611f8f565b90509695505050505050565b6000815190506120318161159e565b92915050565b60006020828403121561204d5761204c61146a565b5b600061205b84828501612022565b91505092915050565b600060a0820190506120796000830188611de9565b6120866020830187611de9565b81810360408301526120988186611bc6565b905081810360608301526120ac8185611bc6565b905081810360808301526120c08184611f8f565b9050969550505050505056fea2646970667358221220264b171b5f0fddea1b7551d7c21ec241eb0490f9bb84a793b634c887edda8d8164736f6c6343000818003368747470733a2f2f6578616d706c652e636f6d2f6d6f636b2f657263313135352e6a736f6e", + Bin: "0x60806040523480156200001157600080fd5b50604051806060016040528060258152602001620019f66025913962000037816200003e565b50620001c3565b60026200004c8282620000f7565b5050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200007b57607f821691505b6020821081036200009c57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620000f2576000816000526020600020601f850160051c81016020861015620000cd5750805b601f850160051c820191505b81811015620000ee57828155600101620000d9565b5050505b505050565b81516001600160401b0381111562000113576200011362000050565b6200012b8162000124845462000066565b84620000a2565b602080601f8311600181146200016357600084156200014a5750858301515b600019600386901b1c1916600185901b178555620000ee565b600085815260208120601f198616915b82811015620001945788860151825594840194600190910190840162000173565b5085821015620001b35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61182380620001d36000396000f3fe608060405234801561001057600080fd5b50600436106100bd5760003560e01c80634e1273f411610076578063e985e9c51161005b578063e985e9c514610186578063f242432a146101cf578063f5298aca146101e257600080fd5b80634e1273f414610153578063a22cb4651461017357600080fd5b80630e89341c116100a75780630e89341c1461010b578063156e29f61461012b5780632eb2c2d61461014057600080fd5b8062fdd58e146100c257806301ffc9a7146100e8575b600080fd5b6100d56100d03660046110bd565b6101f5565b6040519081526020015b60405180910390f35b6100fb6100f6366004611118565b61022a565b60405190151581526020016100df565b61011e61011936600461113c565b61030d565b6040516100df91906111b9565b61013e6101393660046111cc565b6103a1565b005b61013e61014e36600461139e565b6103c1565b610166610161366004611448565b61048c565b6040516100df9190611544565b61013e610181366004611557565b610572565b6100fb610194366004611593565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205460ff1690565b61013e6101dd3660046115c6565b610581565b61013e6101f03660046111cc565b61063f565b60008181526020818152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a260000000000000000000000000000000000000000000000000000000014806102bd57507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061022457507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610224565b60606002805461031c9061162b565b80601f01602080910402602001604051908101604052809291908181526020018280546103489061162b565b80156103955780601f1061036a57610100808354040283529160200191610395565b820191906000526020600020905b81548152906001019060200180831161037857829003601f168201915b50505050509050919050565b6103bc8383836040518060200160405280600081525061064a565b505050565b3373ffffffffffffffffffffffffffffffffffffffff8616811480159061041b575073ffffffffffffffffffffffffffffffffffffffff80871660009081526001602090815260408083209385168352929052205460ff16155b15610477576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152871660248201526044015b60405180910390fd5b61048486868686866106cd565b505050505050565b606081518351146104d657815183516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161046e565b6000835167ffffffffffffffff8111156104f2576104f26111ff565b60405190808252806020026020018201604052801561051b578160200160208202803683370190505b50905060005b845181101561056a57602080820286010151610545906020808402870101516101f5565b8282815181106105575761055761167e565b6020908102919091010152600101610521565b509392505050565b61057d338383610781565b5050565b3373ffffffffffffffffffffffffffffffffffffffff861681148015906105db575073ffffffffffffffffffffffffffffffffffffffff80871660009081526001602090815260408083209385168352929052205460ff16155b15610632576040517fe237d92200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80831660048301528716602482015260440161046e565b6104848686868686610869565b6103bc838383610944565b73ffffffffffffffffffffffffffffffffffffffff841661069a576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b604080516001808252602082018690528183019081526060820185905260808201909252906104846000878484876109cf565b73ffffffffffffffffffffffffffffffffffffffff841661071d576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b73ffffffffffffffffffffffffffffffffffffffff851661076d576040517f01a835140000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b61077a85858585856109cf565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff82166107d1576040517fced3e1000000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff84166108b9576040517f57f447ce0000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b73ffffffffffffffffffffffffffffffffffffffff8516610909576040517f01a835140000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b6040805160018082526020820186905281830190815260608201859052608082019092529061093b87878484876109cf565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610994576040517f01a835140000000000000000000000000000000000000000000000000000000081526000600482015260240161046e565b604080516001808252602082018590528183019081526060820184905260a0820190925260006080820181815291929161077a918791859085905b6109db85858585610a2f565b73ffffffffffffffffffffffffffffffffffffffff84161561077a5782513390600103610a215760208481015190840151610a1a838989858589610d11565b5050610484565b610484818787878787610f03565b8051825114610a7757815181516040517f5b0599910000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161046e565b3360005b8351811015610be45760208181028581018201519085019091015173ffffffffffffffffffffffffffffffffffffffff881615610b7b5760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8c16845290915290205481811015610b47576040517f03dee4c500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16600482015260248101829052604481018390526064810184905260840161046e565b60008381526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8d16845290915290209082900390555b73ffffffffffffffffffffffffffffffffffffffff871615610bda5760008281526020818152604080832073ffffffffffffffffffffffffffffffffffffffff8b16845290915281208054839290610bd49084906116ad565b90915550505b5050600101610a7b565b508251600103610c8c57602083015160009060208401519091508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628585604051610c7d929190918252602082015260400190565b60405180910390a4505061077a565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051610d029291906116e7565b60405180910390a45050505050565b73ffffffffffffffffffffffffffffffffffffffff84163b15610484576040517ff23a6e6100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063f23a6e6190610d889089908990889088908890600401611715565b6020604051808303816000875af1925050508015610de1575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610dde91810190611765565b60015b610e70573d808015610e0f576040519150601f19603f3d011682016040523d82523d6000602084013e610e14565b606091505b508051600003610e68576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161046e565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e61000000000000000000000000000000000000000000000000000000001461093b576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161046e565b73ffffffffffffffffffffffffffffffffffffffff84163b15610484576040517fbc197c8100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063bc197c8190610f7a9089908990889088908890600401611782565b6020604051808303816000875af1925050508015610fd3575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610fd091810190611765565b60015b611001573d808015610e0f576040519150601f19603f3d011682016040523d82523d6000602084013e610e14565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c81000000000000000000000000000000000000000000000000000000001461093b576040517f57f447ce00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8616600482015260240161046e565b803573ffffffffffffffffffffffffffffffffffffffff811681146110b857600080fd5b919050565b600080604083850312156110d057600080fd5b6110d983611094565b946020939093013593505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461111557600080fd5b50565b60006020828403121561112a57600080fd5b8135611135816110e7565b9392505050565b60006020828403121561114e57600080fd5b5035919050565b6000815180845260005b8181101561117b5760208185018101518683018201520161115f565b5060006020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b6020815260006111356020830184611155565b6000806000606084860312156111e157600080fd5b6111ea84611094565b95602085013595506040909401359392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611275576112756111ff565b604052919050565b600067ffffffffffffffff821115611297576112976111ff565b5060051b60200190565b600082601f8301126112b257600080fd5b813560206112c76112c28361127d565b61122e565b8083825260208201915060208460051b8701019350868411156112e957600080fd5b602086015b8481101561130557803583529183019183016112ee565b509695505050505050565b600082601f83011261132157600080fd5b813567ffffffffffffffff81111561133b5761133b6111ff565b61136c60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160161122e565b81815284602083860101111561138157600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a086880312156113b657600080fd5b6113bf86611094565b94506113cd60208701611094565b9350604086013567ffffffffffffffff808211156113ea57600080fd5b6113f689838a016112a1565b9450606088013591508082111561140c57600080fd5b61141889838a016112a1565b9350608088013591508082111561142e57600080fd5b5061143b88828901611310565b9150509295509295909350565b6000806040838503121561145b57600080fd5b823567ffffffffffffffff8082111561147357600080fd5b818501915085601f83011261148757600080fd5b813560206114976112c28361127d565b82815260059290921b840181019181810190898411156114b657600080fd5b948201945b838610156114db576114cc86611094565b825294820194908201906114bb565b965050860135925050808211156114f157600080fd5b506114fe858286016112a1565b9150509250929050565b60008151808452602080850194506020840160005b838110156115395781518752958201959082019060010161151d565b509495945050505050565b6020815260006111356020830184611508565b6000806040838503121561156a57600080fd5b61157383611094565b91506020830135801515811461158857600080fd5b809150509250929050565b600080604083850312156115a657600080fd5b6115af83611094565b91506115bd60208401611094565b90509250929050565b600080600080600060a086880312156115de57600080fd5b6115e786611094565b94506115f560208701611094565b93506040860135925060608601359150608086013567ffffffffffffffff81111561161f57600080fd5b61143b88828901611310565b600181811c9082168061163f57607f821691505b602082108103611678577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80820180821115610224577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6040815260006116fa6040830185611508565b828103602084015261170c8185611508565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261175a60a0830184611155565b979650505050505050565b60006020828403121561177757600080fd5b8151611135816110e7565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a060408301526117bb60a0830186611508565b82810360608401526117cd8186611508565b905082810360808401526117e18185611155565b9897505050505050505056fea26469706673582212207a063298a7e5e371709fe902925da8efdf91d5a947067ff262af71ef935468e964736f6c6343000818003368747470733a2f2f6578616d706c652e636f6d2f6d6f636b2f657263313135352e6a736f6e", } // MockERC1155ABI is the input ABI used to generate the binding from. @@ -1110,6 +1119,11 @@ func CreateMockERC1155DeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int cmd := &cobra.Command{ Use: "deploy", @@ -1119,6 +1133,70 @@ func CreateMockERC1155DeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1146,6 +1224,42 @@ func CreateMockERC1155DeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateMockERC1155DeployBytecode() + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployMockERC1155( transactionOpts, client, @@ -1195,10 +1309,32 @@ func CreateMockERC1155DeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } +func generateMockERC1155DeployBytecode() ([]byte, error) { + abiPacked, err := MockERC1155MetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("") + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(MockERC1155MetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateBalanceOfCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -1644,11 +1780,14 @@ func CreateUriCommand() *cobra.Command { } func CreateBurnCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var account common.Address var accountRaw string @@ -1661,10 +1800,6 @@ func CreateBurnCommand() *cobra.Command { Use: "burn", Short: "Execute the Burn method on a MockERC1155 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1672,6 +1807,48 @@ func CreateBurnCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if accountRaw == "" { return fmt.Errorf("--account argument not specified") } else if !common.IsHexAddress(accountRaw) { @@ -1728,13 +1905,51 @@ func CreateBurnCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Burn( + if safeAddress != "" { + abi, err := MockERC1155MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "burn" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + account, + tokenId, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Burn( + account, tokenId, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1780,6 +1995,11 @@ func CreateBurnCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&accountRaw, "account", "", "account argument (common.Address)") cmd.Flags().StringVar(&tokenIdRaw, "token-id", "", "token-id argument") @@ -1788,11 +2008,14 @@ func CreateBurnCommand() *cobra.Command { return cmd } func CreateMintCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var account common.Address var accountRaw string @@ -1805,10 +2028,6 @@ func CreateMintCommand() *cobra.Command { Use: "mint", Short: "Execute the Mint method on a MockERC1155 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1816,6 +2035,48 @@ func CreateMintCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if accountRaw == "" { return fmt.Errorf("--account argument not specified") } else if !common.IsHexAddress(accountRaw) { @@ -1872,13 +2133,51 @@ func CreateMintCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Mint( + if safeAddress != "" { + abi, err := MockERC1155MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "mint" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + account, + tokenId, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Mint( + account, tokenId, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1924,6 +2223,11 @@ func CreateMintCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&accountRaw, "account", "", "account argument (common.Address)") cmd.Flags().StringVar(&tokenIdRaw, "token-id", "", "token-id argument") @@ -1932,11 +2236,14 @@ func CreateMintCommand() *cobra.Command { return cmd } func CreateSafeBatchTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -1953,10 +2260,6 @@ func CreateSafeBatchTransferFromCommand() *cobra.Command { Use: "safe-batch-transfer-from", Short: "Execute the SafeBatchTransferFrom method on a MockERC1155 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1964,6 +2267,48 @@ func CreateSafeBatchTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -2063,15 +2408,55 @@ func CreateSafeBatchTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SafeBatchTransferFrom( + if safeAddress != "" { + abi, err := MockERC1155MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "safeBatchTransferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + ids, + values, + data, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SafeBatchTransferFrom( + from0, to0, ids, values, data, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2117,6 +2502,11 @@ func CreateSafeBatchTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2127,11 +2517,14 @@ func CreateSafeBatchTransferFromCommand() *cobra.Command { return cmd } func CreateSafeTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -2148,10 +2541,6 @@ func CreateSafeTransferFromCommand() *cobra.Command { Use: "safe-transfer-from", Short: "Execute the SafeTransferFrom method on a MockERC1155 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2159,6 +2548,48 @@ func CreateSafeTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -2232,15 +2663,55 @@ func CreateSafeTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SafeTransferFrom( + if safeAddress != "" { + abi, err := MockERC1155MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "safeTransferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + id, + value0, + data, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SafeTransferFrom( + from0, to0, id, value0, data, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2286,6 +2757,11 @@ func CreateSafeTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2296,11 +2772,14 @@ func CreateSafeTransferFromCommand() *cobra.Command { return cmd } func CreateSetApprovalForAllCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var operator common.Address var operatorRaw string @@ -2311,10 +2790,6 @@ func CreateSetApprovalForAllCommand() *cobra.Command { Use: "set-approval-for-all", Short: "Execute the SetApprovalForAll method on a MockERC1155 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2322,6 +2797,48 @@ func CreateSetApprovalForAllCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if operatorRaw == "" { return fmt.Errorf("--operator argument not specified") } else if !common.IsHexAddress(operatorRaw) { @@ -2376,12 +2893,49 @@ func CreateSetApprovalForAllCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetApprovalForAll( + if safeAddress != "" { + abi, err := MockERC1155MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setApprovalForAll" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + operator, + approved, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetApprovalForAll( + operator, approved, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2427,6 +2981,11 @@ func CreateSetApprovalForAllCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&operatorRaw, "operator", "", "operator argument (common.Address)") cmd.Flags().StringVar(&approvedRaw, "approved", "", "approved argument (true, t, y, yes, 1 OR false, f, n, no, 0)") @@ -2602,3 +3161,220 @@ func CreateMockERC1155Command() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/MockERC20/MockERC20.go b/bindings/MockERC20/MockERC20.go index d77866e9..6d3823e7 100644 --- a/bindings/MockERC20/MockERC20.go +++ b/bindings/MockERC20/MockERC20.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package MockERC20 --cli --struct MockERC20 --output bindings/MockERC20/MockERC20.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package MockERC20 import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // MockERC20MetaData contains all meta data concerning the MockERC20 contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// MockERC20MetaData contains all meta data concerning the MockERC20 contract. var MockERC20MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"allowance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientAllowance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"balance\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"needed\",\"type\":\"uint256\"}],\"name\":\"ERC20InsufficientBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC20InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"ERC20InvalidSpender\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020017f4d6f636b204552433230000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4d4f434b3230000000000000000000000000000000000000000000000000000081525081600390816200008f919062000324565b508060049081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b610fc3806200041b6000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c806340c10f191161007157806340c10f191461016857806370a082311461018457806395d89b41146101b45780639dc29fac146101d2578063a9059cbb146101ee578063dd62ed3e1461021e576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b661024e565b6040516100c39190610c17565b60405180910390f35b6100e660048036038101906100e19190610cd2565b6102e0565b6040516100f39190610d2d565b60405180910390f35b610104610303565b6040516101119190610d57565b60405180910390f35b610134600480360381019061012f9190610d72565b61030d565b6040516101419190610d2d565b60405180910390f35b61015261033c565b60405161015f9190610de1565b60405180910390f35b610182600480360381019061017d9190610cd2565b610345565b005b61019e60048036038101906101999190610dfc565b610353565b6040516101ab9190610d57565b60405180910390f35b6101bc61039b565b6040516101c99190610c17565b60405180910390f35b6101ec60048036038101906101e79190610cd2565b61042d565b005b61020860048036038101906102039190610cd2565b61043b565b6040516102159190610d2d565b60405180910390f35b61023860048036038101906102339190610e29565b61045e565b6040516102459190610d57565b60405180910390f35b60606003805461025d90610e98565b80601f016020809104026020016040519081016040528092919081815260200182805461028990610e98565b80156102d65780601f106102ab576101008083540402835291602001916102d6565b820191906000526020600020905b8154815290600101906020018083116102b957829003601f168201915b5050505050905090565b6000806102eb6104e5565b90506102f88185856104ed565b600191505092915050565b6000600254905090565b6000806103186104e5565b90506103258582856104ff565b610330858585610593565b60019150509392505050565b60006012905090565b61034f8282610687565b5050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103aa90610e98565b80601f01602080910402602001604051908101604052809291908181526020018280546103d690610e98565b80156104235780601f106103f857610100808354040283529160200191610423565b820191906000526020600020905b81548152906001019060200180831161040657829003601f168201915b5050505050905090565b6104378282610709565b5050565b6000806104466104e5565b9050610453818585610593565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b6104fa838383600161078b565b505050565b600061050b848461045e565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461058d578181101561057d578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161057493929190610ed8565b60405180910390fd5b61058c8484848403600061078b565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106055760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016105fc9190610f0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106775760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161066e9190610f0f565b60405180910390fd5b610682838383610962565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106f95760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016106f09190610f0f565b60405180910390fd5b61070560008383610962565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361077b5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016107729190610f0f565b60405180910390fd5b61078782600083610962565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036107fd5760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016107f49190610f0f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086f5760006040517f94280d620000000000000000000000000000000000000000000000000000000081526004016108669190610f0f565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550801561095c578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109539190610d57565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b45780600260008282546109a89190610f59565b92505081905550610a87565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610a40578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610a3793929190610ed8565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ad05780600260008282540392505081905550610b1d565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610b7a9190610d57565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610bc1578082015181840152602081019050610ba6565b60008484015250505050565b6000601f19601f8301169050919050565b6000610be982610b87565b610bf38185610b92565b9350610c03818560208601610ba3565b610c0c81610bcd565b840191505092915050565b60006020820190508181036000830152610c318184610bde565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c6982610c3e565b9050919050565b610c7981610c5e565b8114610c8457600080fd5b50565b600081359050610c9681610c70565b92915050565b6000819050919050565b610caf81610c9c565b8114610cba57600080fd5b50565b600081359050610ccc81610ca6565b92915050565b60008060408385031215610ce957610ce8610c39565b5b6000610cf785828601610c87565b9250506020610d0885828601610cbd565b9150509250929050565b60008115159050919050565b610d2781610d12565b82525050565b6000602082019050610d426000830184610d1e565b92915050565b610d5181610c9c565b82525050565b6000602082019050610d6c6000830184610d48565b92915050565b600080600060608486031215610d8b57610d8a610c39565b5b6000610d9986828701610c87565b9350506020610daa86828701610c87565b9250506040610dbb86828701610cbd565b9150509250925092565b600060ff82169050919050565b610ddb81610dc5565b82525050565b6000602082019050610df66000830184610dd2565b92915050565b600060208284031215610e1257610e11610c39565b5b6000610e2084828501610c87565b91505092915050565b60008060408385031215610e4057610e3f610c39565b5b6000610e4e85828601610c87565b9250506020610e5f85828601610c87565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610eb057607f821691505b602082108103610ec357610ec2610e69565b5b50919050565b610ed281610c5e565b82525050565b6000606082019050610eed6000830186610ec9565b610efa6020830185610d48565b610f076040830184610d48565b949350505050565b6000602082019050610f246000830184610ec9565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610f6482610c9c565b9150610f6f83610c9c565b9250828201905080821115610f8757610f86610f2a565b5b9291505056fea264697066735822122026c0996950e40c5163fd1599b3e05aafe58684acd58372e161f4245a7e799df264736f6c63430008180033", + Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600a81526020016904d6f636b2045524332360b41b8152506040518060400160405280600681526020016504d4f434b32360d41b815250816003908162000065919062000124565b50600462000074828262000124565b505050620001f0565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000a857607f821691505b602082108103620000c957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200011f576000816000526020600020601f850160051c81016020861015620000fa5750805b601f850160051c820191505b818110156200011b5782815560010162000106565b5050505b505050565b81516001600160401b038111156200014057620001406200007d565b620001588162000151845462000093565b84620000cf565b602080601f831160018114620001905760008415620001775750858301515b600019600386901b1c1916600185901b1785556200011b565b600085815260208120601f198616915b82811015620001c157888601518255948401946001909101908401620001a0565b5085821015620001e05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610a5780620002006000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806340c10f19116100815780639dc29fac1161005b5780639dc29fac14610196578063a9059cbb146101a9578063dd62ed3e146101bc57600080fd5b806340c10f191461014357806370a082311461015857806395d89b411461018e57600080fd5b806318160ddd116100b257806318160ddd1461010f57806323b872dd14610121578063313ce5671461013457600080fd5b806306fdde03146100ce578063095ea7b3146100ec575b600080fd5b6100d6610202565b6040516100e39190610843565b60405180910390f35b6100ff6100fa3660046108d9565b610294565b60405190151581526020016100e3565b6002545b6040519081526020016100e3565b6100ff61012f366004610903565b6102ae565b604051601281526020016100e3565b6101566101513660046108d9565b6102d2565b005b61011361016636600461093f565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b6100d66102e0565b6101566101a43660046108d9565b6102ef565b6100ff6101b73660046108d9565b6102f9565b6101136101ca366004610961565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b60606003805461021190610994565b80601f016020809104026020016040519081016040528092919081815260200182805461023d90610994565b801561028a5780601f1061025f5761010080835404028352916020019161028a565b820191906000526020600020905b81548152906001019060200180831161026d57829003601f168201915b5050505050905090565b6000336102a2818585610307565b60019150505b92915050565b6000336102bc858285610319565b6102c78585856103ed565b506001949350505050565b6102dc8282610498565b5050565b60606004805461021190610994565b6102dc82826104f4565b6000336102a28185856103ed565b6103148383836001610550565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103e757818110156103d8576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064015b60405180910390fd5b6103e784848484036000610550565b50505050565b73ffffffffffffffffffffffffffffffffffffffff831661043d576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103cf565b73ffffffffffffffffffffffffffffffffffffffff821661048d576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103cf565b610314838383610698565b73ffffffffffffffffffffffffffffffffffffffff82166104e8576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016103cf565b6102dc60008383610698565b73ffffffffffffffffffffffffffffffffffffffff8216610544576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016103cf565b6102dc82600083610698565b73ffffffffffffffffffffffffffffffffffffffff84166105a0576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016103cf565b73ffffffffffffffffffffffffffffffffffffffff83166105f0576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016103cf565b73ffffffffffffffffffffffffffffffffffffffff808516600090815260016020908152604080832093871683529290522082905580156103e7578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161068a91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff83166106d05780600260008282546106c591906109e7565b909155506107829050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526020819052604090205481811015610756576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016103cf565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff82166107ab576002805482900390556107d7565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161083691815260200190565b60405180910390a3505050565b60006020808352835180602085015260005b8181101561087157858101830151858201604001528201610855565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108d457600080fd5b919050565b600080604083850312156108ec57600080fd5b6108f5836108b0565b946020939093013593505050565b60008060006060848603121561091857600080fd5b610921846108b0565b925061092f602085016108b0565b9150604084013590509250925092565b60006020828403121561095157600080fd5b61095a826108b0565b9392505050565b6000806040838503121561097457600080fd5b61097d836108b0565b915061098b602084016108b0565b90509250929050565b600181811c908216806109a857607f821691505b6020821081036109e1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b808201808211156102a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fdfea26469706673582212200ad1f8323e46174d72a50d337ef35bc2d5e64f974ff40ad970d4d5756d947c6b64736f6c63430008180033", } // MockERC20ABI is the input ABI used to generate the binding from. @@ -821,6 +831,11 @@ func CreateMockERC20DeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int cmd := &cobra.Command{ Use: "deploy", @@ -830,6 +845,70 @@ func CreateMockERC20DeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -857,6 +936,42 @@ func CreateMockERC20DeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateMockERC20DeployBytecode() + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployMockERC20( transactionOpts, client, @@ -906,10 +1021,32 @@ func CreateMockERC20DeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } +func generateMockERC20DeployBytecode() ([]byte, error) { + abiPacked, err := MockERC20MetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("") + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(MockERC20MetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateAllowanceCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -1329,11 +1466,14 @@ func CreateTotalSupplyCommand() *cobra.Command { } func CreateApproveCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var spender common.Address var spenderRaw string @@ -1344,10 +1484,6 @@ func CreateApproveCommand() *cobra.Command { Use: "approve", Short: "Execute the Approve method on a MockERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1355,6 +1491,48 @@ func CreateApproveCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if spenderRaw == "" { return fmt.Errorf("--spender argument not specified") } else if !common.IsHexAddress(spenderRaw) { @@ -1405,12 +1583,49 @@ func CreateApproveCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Approve( + if safeAddress != "" { + abi, err := MockERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "approve" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + spender, + value0, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Approve( + spender, value0, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1456,6 +1671,11 @@ func CreateApproveCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&spenderRaw, "spender", "", "spender argument (common.Address)") cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") @@ -1463,11 +1683,14 @@ func CreateApproveCommand() *cobra.Command { return cmd } func CreateBurnCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var account common.Address var accountRaw string @@ -1478,10 +1701,6 @@ func CreateBurnCommand() *cobra.Command { Use: "burn", Short: "Execute the Burn method on a MockERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1489,6 +1708,48 @@ func CreateBurnCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if accountRaw == "" { return fmt.Errorf("--account argument not specified") } else if !common.IsHexAddress(accountRaw) { @@ -1539,12 +1800,49 @@ func CreateBurnCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Burn( + if safeAddress != "" { + abi, err := MockERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "burn" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + account, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Burn( + account, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1590,6 +1888,11 @@ func CreateBurnCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&accountRaw, "account", "", "account argument (common.Address)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -1597,11 +1900,14 @@ func CreateBurnCommand() *cobra.Command { return cmd } func CreateMintCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var account common.Address var accountRaw string @@ -1612,10 +1918,6 @@ func CreateMintCommand() *cobra.Command { Use: "mint", Short: "Execute the Mint method on a MockERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1623,6 +1925,48 @@ func CreateMintCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if accountRaw == "" { return fmt.Errorf("--account argument not specified") } else if !common.IsHexAddress(accountRaw) { @@ -1673,12 +2017,49 @@ func CreateMintCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Mint( + if safeAddress != "" { + abi, err := MockERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "mint" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + account, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Mint( + account, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1724,6 +2105,11 @@ func CreateMintCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&accountRaw, "account", "", "account argument (common.Address)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -1731,11 +2117,14 @@ func CreateMintCommand() *cobra.Command { return cmd } func CreateTransferCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var to0 common.Address var to0Raw string @@ -1746,10 +2135,6 @@ func CreateTransferCommand() *cobra.Command { Use: "transfer", Short: "Execute the Transfer method on a MockERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1757,6 +2142,48 @@ func CreateTransferCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if to0Raw == "" { return fmt.Errorf("--to-0 argument not specified") } else if !common.IsHexAddress(to0Raw) { @@ -1807,12 +2234,49 @@ func CreateTransferCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Transfer( + if safeAddress != "" { + abi, err := MockERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transfer" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + to0, + value0, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Transfer( + to0, value0, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1858,6 +2322,11 @@ func CreateTransferCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") cmd.Flags().StringVar(&value0Raw, "value-0", "", "value-0 argument") @@ -1865,11 +2334,14 @@ func CreateTransferCommand() *cobra.Command { return cmd } func CreateTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -1882,10 +2354,6 @@ func CreateTransferFromCommand() *cobra.Command { Use: "transfer-from", Short: "Execute the TransferFrom method on a MockERC20 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1893,6 +2361,48 @@ func CreateTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -1950,13 +2460,51 @@ func CreateTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferFrom( + if safeAddress != "" { + abi, err := MockERC20MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + value0, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferFrom( + from0, to0, value0, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2002,6 +2550,11 @@ func CreateTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2181,3 +2734,220 @@ func CreateMockERC20Command() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/MockERC721/MockERC721.go b/bindings/MockERC721/MockERC721.go index a7295b1b..59f2713d 100644 --- a/bindings/MockERC721/MockERC721.go +++ b/bindings/MockERC721/MockERC721.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package MockERC721 --cli --struct MockERC721 --output bindings/MockERC721/MockERC721.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package MockERC721 import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // MockERC721MetaData contains all meta data concerning the MockERC721 contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// MockERC721MetaData contains all meta data concerning the MockERC721 contract. var MockERC721MetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600b81526020017f4d6f636b204552433732310000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4d4f434b3732310000000000000000000000000000000000000000000000000081525081600090816200008f919062000324565b508060019081620000a1919062000324565b5050506200040b565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200012c57607f821691505b602082108103620001425762000141620000e4565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620001ac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200016d565b620001b886836200016d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000205620001ff620001f984620001d0565b620001da565b620001d0565b9050919050565b6000819050919050565b6200022183620001e4565b6200023962000230826200020c565b8484546200017a565b825550505050565b600090565b6200025062000241565b6200025d81848462000216565b505050565b5b8181101562000285576200027960008262000246565b60018101905062000263565b5050565b601f821115620002d4576200029e8162000148565b620002a9846200015d565b81016020851015620002b9578190505b620002d1620002c8856200015d565b83018262000262565b50505b505050565b600082821c905092915050565b6000620002f960001984600802620002d9565b1980831691505092915050565b6000620003148383620002e6565b9150826002028217905092915050565b6200032f82620000aa565b67ffffffffffffffff8111156200034b576200034a620000b5565b5b62000357825462000113565b6200036482828562000289565b600060209050601f8311600181146200039c576000841562000387578287015190505b62000393858262000306565b86555062000403565b601f198416620003ac8662000148565b60005b82811015620003d657848901518255600182019150602085019450602081019050620003af565b86831015620003f65784890151620003f2601f891682620002e6565b8355505b6001600288020188555050505b505050505050565b611e73806200041b6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806342966c6811610097578063a22cb46511610066578063a22cb46514610282578063b88d4fde1461029e578063c87b56dd146102ba578063e985e9c5146102ea576100f5565b806342966c68146101e85780636352211e1461020457806370a082311461023457806395d89b4114610264576100f5565b8063095ea7b3116100d3578063095ea7b31461017857806323b872dd1461019457806340c10f19146101b057806342842e0e146101cc576100f5565b806301ffc9a7146100fa57806306fdde031461012a578063081812fc14610148575b600080fd5b610114600480360381019061010f91906116bd565b61031a565b6040516101219190611705565b60405180910390f35b6101326103fc565b60405161013f91906117b0565b60405180910390f35b610162600480360381019061015d9190611808565b61048e565b60405161016f9190611876565b60405180910390f35b610192600480360381019061018d91906118bd565b6104aa565b005b6101ae60048036038101906101a991906118fd565b6104c0565b005b6101ca60048036038101906101c591906118bd565b6105c2565b005b6101e660048036038101906101e191906118fd565b6105d0565b005b61020260048036038101906101fd9190611808565b6105f0565b005b61021e60048036038101906102199190611808565b6105fc565b60405161022b9190611876565b60405180910390f35b61024e60048036038101906102499190611950565b61060e565b60405161025b919061198c565b60405180910390f35b61026c6106c8565b60405161027991906117b0565b60405180910390f35b61029c600480360381019061029791906119d3565b61075a565b005b6102b860048036038101906102b39190611b48565b610770565b005b6102d460048036038101906102cf9190611808565b61078d565b6040516102e191906117b0565b60405180910390f35b61030460048036038101906102ff9190611bcb565b6107f6565b6040516103119190611705565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103e557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f557506103f48261088a565b5b9050919050565b60606000805461040b90611c3a565b80601f016020809104026020016040519081016040528092919081815260200182805461043790611c3a565b80156104845780601f1061045957610100808354040283529160200191610484565b820191906000526020600020905b81548152906001019060200180831161046757829003601f168201915b5050505050905090565b6000610499826108f4565b506104a38261097c565b9050919050565b6104bc82826104b76109b9565b6109c1565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036105325760006040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016105299190611876565b60405180910390fd5b600061054683836105416109b9565b6109d3565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105bc578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016105b393929190611c6b565b60405180910390fd5b50505050565b6105cc8282610bed565b5050565b6105eb83838360405180602001604052806000815250610770565b505050565b6105f981610ce6565b50565b6000610607826108f4565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106815760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016106789190611876565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600180546106d790611c3a565b80601f016020809104026020016040519081016040528092919081815260200182805461070390611c3a565b80156107505780601f1061072557610100808354040283529160200191610750565b820191906000526020600020905b81548152906001019060200180831161073357829003601f168201915b5050505050905090565b61076c6107656109b9565b8383610d6c565b5050565b61077b8484846104c0565b61078784848484610edb565b50505050565b6060610798826108f4565b5060006107a3611092565b905060008151116107c357604051806020016040528060008152506107ee565b806107cd846110a9565b6040516020016107de929190611cde565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008061090083611177565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361097357826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161096a919061198c565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b6109ce83838360016111b4565b505050565b6000806109df84611177565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a2157610a20818486611379565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab257610a636000856000806111b4565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610b35576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5f5760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c569190611876565b60405180910390fd5b6000610c6d838360006109d3565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce15760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401610cd89190611876565b60405180910390fd5b505050565b6000610cf560008360006109d3565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d6857816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610d5f919061198c565b60405180910390fd5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610ddd57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610dd49190611876565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610ece9190611705565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b111561108c578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02610f1f6109b9565b8685856040518563ffffffff1660e01b8152600401610f419493929190611d57565b6020604051808303816000875af1925050508015610f7d57506040513d601f19601f82011682018060405250810190610f7a9190611db8565b60015b611001573d8060008114610fad576040519150601f19603f3d011682016040523d82523d6000602084013e610fb2565b606091505b506000815103610ff957836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610ff09190611876565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461108a57836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016110819190611876565b60405180910390fd5b505b50505050565b606060405180602001604052806000815250905090565b6060600060016110b88461143d565b01905060008167ffffffffffffffff8111156110d7576110d6611a1d565b5b6040519080825280601f01601f1916602001820160405280156111095781602001600182028036833780820191505090505b509050600082602001820190505b60011561116c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816111605761115f611de5565b5b04945060008503611117575b819350505050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806111ed5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156113215760006111fd846108f4565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561126857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561127b575061127981846107f6565b155b156112bd57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016112b49190611876565b60405180910390fd5b811561131f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b611384838383611590565b61143857600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036113f957806040517f7e2732890000000000000000000000000000000000000000000000000000000081526004016113f0919061198c565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161142f929190611e14565b60405180910390fd5b505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000831061149b577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161149157611490611de5565b5b0492506040810190505b6d04ee2d6d415b85acef810000000083106114d8576d04ee2d6d415b85acef810000000083816114ce576114cd611de5565b5b0492506020810190505b662386f26fc10000831061150757662386f26fc1000083816114fd576114fc611de5565b5b0492506010810190505b6305f5e1008310611530576305f5e100838161152657611525611de5565b5b0492506008810190505b612710831061155557612710838161154b5761154a611de5565b5b0492506004810190505b60648310611578576064838161156e5761156d611de5565b5b0492506002810190505b600a8310611587576001810190505b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561164857508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611609575061160884846107f6565b5b8061164757508273ffffffffffffffffffffffffffffffffffffffff1661162f8361097c565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61169a81611665565b81146116a557600080fd5b50565b6000813590506116b781611691565b92915050565b6000602082840312156116d3576116d261165b565b5b60006116e1848285016116a8565b91505092915050565b60008115159050919050565b6116ff816116ea565b82525050565b600060208201905061171a60008301846116f6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561175a57808201518184015260208101905061173f565b60008484015250505050565b6000601f19601f8301169050919050565b600061178282611720565b61178c818561172b565b935061179c81856020860161173c565b6117a581611766565b840191505092915050565b600060208201905081810360008301526117ca8184611777565b905092915050565b6000819050919050565b6117e5816117d2565b81146117f057600080fd5b50565b600081359050611802816117dc565b92915050565b60006020828403121561181e5761181d61165b565b5b600061182c848285016117f3565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061186082611835565b9050919050565b61187081611855565b82525050565b600060208201905061188b6000830184611867565b92915050565b61189a81611855565b81146118a557600080fd5b50565b6000813590506118b781611891565b92915050565b600080604083850312156118d4576118d361165b565b5b60006118e2858286016118a8565b92505060206118f3858286016117f3565b9150509250929050565b6000806000606084860312156119165761191561165b565b5b6000611924868287016118a8565b9350506020611935868287016118a8565b9250506040611946868287016117f3565b9150509250925092565b6000602082840312156119665761196561165b565b5b6000611974848285016118a8565b91505092915050565b611986816117d2565b82525050565b60006020820190506119a1600083018461197d565b92915050565b6119b0816116ea565b81146119bb57600080fd5b50565b6000813590506119cd816119a7565b92915050565b600080604083850312156119ea576119e961165b565b5b60006119f8858286016118a8565b9250506020611a09858286016119be565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b611a5582611766565b810181811067ffffffffffffffff82111715611a7457611a73611a1d565b5b80604052505050565b6000611a87611651565b9050611a938282611a4c565b919050565b600067ffffffffffffffff821115611ab357611ab2611a1d565b5b611abc82611766565b9050602081019050919050565b82818337600083830152505050565b6000611aeb611ae684611a98565b611a7d565b905082815260208101848484011115611b0757611b06611a18565b5b611b12848285611ac9565b509392505050565b600082601f830112611b2f57611b2e611a13565b5b8135611b3f848260208601611ad8565b91505092915050565b60008060008060808587031215611b6257611b6161165b565b5b6000611b70878288016118a8565b9450506020611b81878288016118a8565b9350506040611b92878288016117f3565b925050606085013567ffffffffffffffff811115611bb357611bb2611660565b5b611bbf87828801611b1a565b91505092959194509250565b60008060408385031215611be257611be161165b565b5b6000611bf0858286016118a8565b9250506020611c01858286016118a8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680611c5257607f821691505b602082108103611c6557611c64611c0b565b5b50919050565b6000606082019050611c806000830186611867565b611c8d602083018561197d565b611c9a6040830184611867565b949350505050565b600081905092915050565b6000611cb882611720565b611cc28185611ca2565b9350611cd281856020860161173c565b80840191505092915050565b6000611cea8285611cad565b9150611cf68284611cad565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000611d2982611d02565b611d338185611d0d565b9350611d4381856020860161173c565b611d4c81611766565b840191505092915050565b6000608082019050611d6c6000830187611867565b611d796020830186611867565b611d86604083018561197d565b8181036060830152611d988184611d1e565b905095945050505050565b600081519050611db281611691565b92915050565b600060208284031215611dce57611dcd61165b565b5b6000611ddc84828501611da3565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000604082019050611e296000830185611867565b611e36602083018461197d565b939250505056fea26469706673582212201f4687b33eeeaf7f13dc65a5f80bfaef26a00aa9c1059ec1dc52028dff51561164736f6c63430008180033", + Bin: "0x60806040523480156200001157600080fd5b506040518060400160405280600b81526020016a4d6f636b2045524337323160a81b815250604051806040016040528060078152602001664d4f434b37323160c81b815250816000908162000067919062000126565b50600162000076828262000126565b505050620001f2565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000aa57607f821691505b602082108103620000cb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000121576000816000526020600020601f850160051c81016020861015620000fc5750805b601f850160051c820191505b818110156200011d5782815560010162000108565b5050505b505050565b81516001600160401b038111156200014257620001426200007f565b6200015a8162000153845462000095565b84620000d1565b602080601f831160018114620001925760008415620001795750858301515b600019600386901b1c1916600185901b1785556200011d565b600085815260208120601f198616915b82811015620001c357888601518255948401946001909101908401620001a2565b5085821015620001e25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6115b880620002026000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806342966c6811610097578063a22cb46511610066578063a22cb4651461020c578063b88d4fde1461021f578063c87b56dd14610232578063e985e9c51461024557600080fd5b806342966c68146101bd5780636352211e146101d057806370a08231146101e357806395d89b411461020457600080fd5b8063095ea7b3116100d3578063095ea7b31461016f57806323b872dd1461018457806340c10f191461019757806342842e0e146101aa57600080fd5b806301ffc9a7146100fa57806306fdde0314610122578063081812fc14610137575b600080fd5b61010d6101083660046111a1565b61028e565b60405190151581526020015b60405180910390f35b61012a610373565b604051610119919061122c565b61014a61014536600461123f565b610405565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610119565b61018261017d366004611281565b61043b565b005b6101826101923660046112ab565b61044a565b6101826101a5366004611281565b610540565b6101826101b83660046112ab565b61054a565b6101826101cb36600461123f565b61056a565b61014a6101de36600461123f565b610576565b6101f66101f13660046112e7565b610581565b604051908152602001610119565b61012a6105fc565b61018261021a366004611302565b61060b565b61018261022d36600461136d565b610616565b61012a61024036600461123f565b61062d565b61010d610253366004611467565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061032157507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061036d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6060600080546103829061149a565b80601f01602080910402602001604051908101604052809291908181526020018280546103ae9061149a565b80156103fb5780601f106103d0576101008083540402835291602001916103fb565b820191906000526020600020905b8154815290600101906020018083116103de57829003601f168201915b5050505050905090565b6000610410826106a2565b5060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1661036d565b610446828233610701565b5050565b73ffffffffffffffffffffffffffffffffffffffff821661049f576040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b60006104ac83833361070e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461053a576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301526024820184905282166044820152606401610496565b50505050565b610446828261088b565b61056583838360405180602001604052806000815250610616565b505050565b6105738161093c565b50565b600061036d826106a2565b600073ffffffffffffffffffffffffffffffffffffffff82166105d3576040517f89c62b6400000000000000000000000000000000000000000000000000000000815260006004820152602401610496565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b6060600180546103829061149a565b61044633838361099d565b61062184848461044a565b61053a84848484610a9a565b6060610638826106a2565b50600061065060408051602081019091526000815290565b90506000815111610670576040518060200160405280600081525061069b565b8061067a84610c91565b60405160200161068b9291906114ed565b6040516020818303038152906040525b9392505050565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff168061036d576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101849052602401610496565b6105658383836001610d4f565b60008281526002602052604081205473ffffffffffffffffffffffffffffffffffffffff9081169083161561074857610748818486610f1a565b73ffffffffffffffffffffffffffffffffffffffff8116156107be57610772600085600080610d4f565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff8516156108075773ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260409020805460010190555b60008481526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b73ffffffffffffffffffffffffffffffffffffffff82166108db576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610496565b60006108e98383600061070e565b905073ffffffffffffffffffffffffffffffffffffffff811615610565576040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152602401610496565b600061094b600083600061070e565b905073ffffffffffffffffffffffffffffffffffffffff8116610446576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101839052602401610496565b73ffffffffffffffffffffffffffffffffffffffff8216610a02576040517f5b08ba1800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610496565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff83163b1561053a576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063150b7a0290610b0f90339088908790879060040161151c565b6020604051808303816000875af1925050508015610b68575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610b6591810190611565565b60015b610bf7573d808015610b96576040519150601f19603f3d011682016040523d82523d6000602084013e610b9b565b606091505b508051600003610bef576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610496565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014610c8a576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610496565b5050505050565b60606000610c9e83610fca565b600101905060008167ffffffffffffffff811115610cbe57610cbe61133e565b6040519080825280601f01601f191660200182016040528015610ce8576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8504945084610cf257509392505050565b8080610d70575073ffffffffffffffffffffffffffffffffffffffff821615155b15610ec5576000610d80846106a2565b905073ffffffffffffffffffffffffffffffffffffffff831615801590610dd357508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015610e12575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209387168352929052205460ff16155b15610e61576040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610496565b8115610ec357838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610f258383836110ac565b6105655773ffffffffffffffffffffffffffffffffffffffff8316610f79576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101829052602401610496565b6040517f177e802f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610496565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310611013577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef8100000000831061103f576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061105d57662386f26fc10000830492506010015b6305f5e1008310611075576305f5e100830492506008015b612710831061108957612710830492506004015b6064831061109b576064830492506002015b600a831061036d5760010192915050565b600073ffffffffffffffffffffffffffffffffffffffff83161580159061116b57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061113a575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b8061116b575060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff8481169116145b949350505050565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461057357600080fd5b6000602082840312156111b357600080fd5b813561069b81611173565b60005b838110156111d95781810151838201526020016111c1565b50506000910152565b600081518084526111fa8160208601602086016111be565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061069b60208301846111e2565b60006020828403121561125157600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461127c57600080fd5b919050565b6000806040838503121561129457600080fd5b61129d83611258565b946020939093013593505050565b6000806000606084860312156112c057600080fd5b6112c984611258565b92506112d760208501611258565b9150604084013590509250925092565b6000602082840312156112f957600080fd5b61069b82611258565b6000806040838503121561131557600080fd5b61131e83611258565b91506020830135801515811461133357600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000806000806080858703121561138357600080fd5b61138c85611258565b935061139a60208601611258565b925060408501359150606085013567ffffffffffffffff808211156113be57600080fd5b818701915087601f8301126113d257600080fd5b8135818111156113e4576113e461133e565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561142a5761142a61133e565b816040528281528a602084870101111561144357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561147a57600080fd5b61148383611258565b915061149160208401611258565b90509250929050565b600181811c908216806114ae57607f821691505b6020821081036114e7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600083516114ff8184602088016111be565b8351908301906115138183602088016111be565b01949350505050565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261155b60808301846111e2565b9695505050505050565b60006020828403121561157757600080fd5b815161069b8161117356fea26469706673582212201490a04f6bdd9ed6620d924a06a9ff17849ae8ced13d0f67a73274bba055f31764736f6c63430008180033", } // MockERC721ABI is the input ABI used to generate the binding from. @@ -1095,6 +1105,11 @@ func CreateMockERC721DeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int cmd := &cobra.Command{ Use: "deploy", @@ -1104,6 +1119,70 @@ func CreateMockERC721DeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1131,6 +1210,42 @@ func CreateMockERC721DeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateMockERC721DeployBytecode() + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployMockERC721( transactionOpts, client, @@ -1180,10 +1295,32 @@ func CreateMockERC721DeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } +func generateMockERC721DeployBytecode() ([]byte, error) { + abiPacked, err := MockERC721MetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("") + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(MockERC721MetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateBalanceOfCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -1785,11 +1922,14 @@ func CreateTokenUriCommand() *cobra.Command { } func CreateApproveCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var to0 common.Address var to0Raw string @@ -1800,10 +1940,6 @@ func CreateApproveCommand() *cobra.Command { Use: "approve", Short: "Execute the Approve method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1811,6 +1947,48 @@ func CreateApproveCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if to0Raw == "" { return fmt.Errorf("--to-0 argument not specified") } else if !common.IsHexAddress(to0Raw) { @@ -1861,12 +2039,49 @@ func CreateApproveCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Approve( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "approve" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + to0, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Approve( + to0, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1912,6 +2127,11 @@ func CreateApproveCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") cmd.Flags().StringVar(&tokenIdRaw, "token-id", "", "token-id argument") @@ -1919,11 +2139,14 @@ func CreateApproveCommand() *cobra.Command { return cmd } func CreateBurnCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var tokenId *big.Int var tokenIdRaw string @@ -1932,10 +2155,6 @@ func CreateBurnCommand() *cobra.Command { Use: "burn", Short: "Execute the Burn method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1943,6 +2162,48 @@ func CreateBurnCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if tokenIdRaw == "" { return fmt.Errorf("--token-id argument not specified") } @@ -1986,11 +2247,47 @@ func CreateBurnCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Burn( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "burn" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Burn( + tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2036,17 +2333,25 @@ func CreateBurnCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenIdRaw, "token-id", "", "token-id argument") return cmd } func CreateMintCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var account common.Address var accountRaw string @@ -2057,10 +2362,6 @@ func CreateMintCommand() *cobra.Command { Use: "mint", Short: "Execute the Mint method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2068,6 +2369,48 @@ func CreateMintCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if accountRaw == "" { return fmt.Errorf("--account argument not specified") } else if !common.IsHexAddress(accountRaw) { @@ -2118,12 +2461,49 @@ func CreateMintCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Mint( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "mint" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + account, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Mint( + account, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2169,6 +2549,11 @@ func CreateMintCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&accountRaw, "account", "", "account argument (common.Address)") cmd.Flags().StringVar(&tokenIdRaw, "token-id", "", "token-id argument") @@ -2176,11 +2561,14 @@ func CreateMintCommand() *cobra.Command { return cmd } func CreateSafeTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -2193,10 +2581,6 @@ func CreateSafeTransferFromCommand() *cobra.Command { Use: "safe-transfer-from", Short: "Execute the SafeTransferFrom method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2204,6 +2588,48 @@ func CreateSafeTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -2261,13 +2687,51 @@ func CreateSafeTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SafeTransferFrom( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "safeTransferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SafeTransferFrom( + from0, to0, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2313,6 +2777,11 @@ func CreateSafeTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2321,11 +2790,14 @@ func CreateSafeTransferFromCommand() *cobra.Command { return cmd } func CreateSafeTransferFrom0Command() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -2340,10 +2812,6 @@ func CreateSafeTransferFrom0Command() *cobra.Command { Use: "safe-transfer-from-0", Short: "Execute the SafeTransferFrom0 method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2351,6 +2819,48 @@ func CreateSafeTransferFrom0Command() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -2418,14 +2928,53 @@ func CreateSafeTransferFrom0Command() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SafeTransferFrom0( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "safeTransferFrom0" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + tokenId, + data, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SafeTransferFrom0( + from0, to0, tokenId, data, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2471,6 +3020,11 @@ func CreateSafeTransferFrom0Command() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2480,11 +3034,14 @@ func CreateSafeTransferFrom0Command() *cobra.Command { return cmd } func CreateSetApprovalForAllCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var operator common.Address var operatorRaw string @@ -2495,10 +3052,6 @@ func CreateSetApprovalForAllCommand() *cobra.Command { Use: "set-approval-for-all", Short: "Execute the SetApprovalForAll method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2506,6 +3059,48 @@ func CreateSetApprovalForAllCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if operatorRaw == "" { return fmt.Errorf("--operator argument not specified") } else if !common.IsHexAddress(operatorRaw) { @@ -2560,12 +3155,49 @@ func CreateSetApprovalForAllCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetApprovalForAll( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setApprovalForAll" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + operator, + approved, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetApprovalForAll( + operator, approved, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2611,6 +3243,11 @@ func CreateSetApprovalForAllCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&operatorRaw, "operator", "", "operator argument (common.Address)") cmd.Flags().StringVar(&approvedRaw, "approved", "", "approved argument (true, t, y, yes, 1 OR false, f, n, no, 0)") @@ -2618,11 +3255,14 @@ func CreateSetApprovalForAllCommand() *cobra.Command { return cmd } func CreateTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -2635,10 +3275,6 @@ func CreateTransferFromCommand() *cobra.Command { Use: "transfer-from", Short: "Execute the TransferFrom method on a MockERC721 contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2646,6 +3282,48 @@ func CreateTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -2703,13 +3381,51 @@ func CreateTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferFrom( + if safeAddress != "" { + abi, err := MockERC721MetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferFrom( + from0, to0, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2755,6 +3471,11 @@ func CreateTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2946,3 +3667,220 @@ func CreateMockERC721Command() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/NodeInterface/NodeInterface.go b/bindings/NodeInterface/NodeInterface.go index 68f6ce3c..f82c60af 100644 --- a/bindings/NodeInterface/NodeInterface.go +++ b/bindings/NodeInterface/NodeInterface.go @@ -1,4 +1,4 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. +// This file was generated by seer: https://github.com/G7DAO/seer. // seer version: 0.1.3 // seer command: seer evm generate --package NodeInterface --cli --struct NodeInterface // Code generated - DO NOT EDIT. diff --git a/bindings/PositionMetadata/PositionMetadata.go b/bindings/PositionMetadata/PositionMetadata.go index 94b927a5..8416eb52 100644 --- a/bindings/PositionMetadata/PositionMetadata.go +++ b/bindings/PositionMetadata/PositionMetadata.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package PositionMetadata --cli --struct PositionMetadata --output bindings/PositionMetadata/PositionMetadata.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package PositionMetadata import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,6 +22,7 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" @@ -27,10 +31,16 @@ import ( "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // Position is an auto generated low-level Go binding around an user-defined struct. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -45,7 +55,6 @@ var ( _ = abi.ConvertType ) -// Position is an auto generated low-level Go binding around an user-defined struct. type Position struct { PoolID *big.Int AmountOrTokenID *big.Int @@ -67,7 +76,7 @@ type StakingPool struct { // PositionMetadataMetaData contains all meta data concerning the PositionMetadata contract. var PositionMetadataMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeInitiatedAt\",\"type\":\"uint256\"}],\"internalType\":\"structPosition\",\"name\":\"position\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"internalType\":\"structStakingPool\",\"name\":\"pool\",\"type\":\"tuple\"}],\"name\":\"metadata\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeInitiatedAt\",\"type\":\"uint256\"}],\"internalType\":\"structPosition\",\"name\":\"position\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"internalType\":\"structStakingPool\",\"name\":\"pool\",\"type\":\"tuple\"}],\"name\":\"metadataBytes\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeInitiatedAt\",\"type\":\"uint256\"}],\"internalType\":\"structPosition\",\"name\":\"position\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"internalType\":\"structStakingPool\",\"name\":\"pool\",\"type\":\"tuple\"}],\"name\":\"metadataJSON\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"pure\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5061120c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063239bdf6c14610046578063721ac18a146100765780637b2f34ff146100a6575b600080fd5b610060600480360381019061005b91906108c4565b6100d6565b60405161006d9190610997565b60405180910390f35b610090600480360381019061008b91906108c4565b6100ec565b60405161009d9190610a0e565b60405180910390f35b6100c060048036038101906100bb91906108c4565b61025c565b6040516100cd9190610997565b60405180910390f35b60606100e38484846100ec565b90509392505050565b606060006100f985610299565b6040516020016101099190610b9c565b6040516020818303038152906040529050806101288560000151610299565b604051602001610139929190610cce565b6040516020818303038152906040529050806102d1846020015114610176576040518060600160405280602781526020016111b060279139610190565b604051806060016040528060298152602001611187602991395b61019d8660200151610299565b6040516020016101af93929190610d54565b6040516020818303038152906040529050806101ce8560400151610299565b6040516020016101df929190610e59565b60405160208183030381529060405290508061020d8460a0015186604001516102089190610ec2565b610299565b60405160200161021e929190610f8e565b6040516020818303038152906040529050806040516020016102409190611014565b6040516020818303038152906040529050809150509392505050565b606061027161026c8585856100ec565b610367565b6040516020016102819190611082565b60405160208183030381529060405290509392505050565b6060600060016102a8846104d9565b01905060008167ffffffffffffffff8111156102c7576102c6610687565b5b6040519080825280601f01601f1916602001820160405280156102f95781602001600182028036833780820191505090505b509050600082602001820190505b60011561035c578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816103505761034f6110a4565b5b04945060008503610307575b819350505050919050565b60606000825103610389576040518060200160405280600081525090506104d4565b600060405180606001604052806040815260200161114760409139905060006003600285516103b89190610ec2565b6103c291906110d3565b60046103ce9190611104565b67ffffffffffffffff8111156103e7576103e6610687565b5b6040519080825280601f01601f1916602001820160405280156104195781602001600182028036833780820191505090505b50905060018201602082018586518701602081018051600082525b8284101561048f576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f8116870151865360018601955050610434565b80825260038a5106600181146104ac57600281146104bf576104c7565b603d6001870353603d60028703536104c7565b603d60018703535b5050505050505080925050505b919050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310610537577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000838161052d5761052c6110a4565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310610574576d04ee2d6d415b85acef8100000000838161056a576105696110a4565b5b0492506020810190505b662386f26fc1000083106105a357662386f26fc100008381610599576105986110a4565b5b0492506010810190505b6305f5e10083106105cc576305f5e10083816105c2576105c16110a4565b5b0492506008810190505b61271083106105f15761271083816105e7576105e66110a4565b5b0492506004810190505b60648310610614576064838161060a576106096110a4565b5b0492506002810190505b600a8310610623576001810190505b80915050919050565b6000604051905090565b600080fd5b6000819050919050565b61064e8161063b565b811461065957600080fd5b50565b60008135905061066b81610645565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6106bf82610676565b810181811067ffffffffffffffff821117156106de576106dd610687565b5b80604052505050565b60006106f161062c565b90506106fd82826106b6565b919050565b60006080828403121561071857610717610671565b5b61072260806106e7565b905060006107328482850161065c565b60008301525060206107468482850161065c565b602083015250604061075a8482850161065c565b604083015250606061076e8482850161065c565b60608301525092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006107a58261077a565b9050919050565b6107b58161079a565b81146107c057600080fd5b50565b6000813590506107d2816107ac565b92915050565b60008115159050919050565b6107ed816107d8565b81146107f857600080fd5b50565b60008135905061080a816107e4565b92915050565b600060e0828403121561082657610825610671565b5b61083060e06106e7565b90506000610840848285016107c3565b60008301525060206108548482850161065c565b6020830152506040610868848285016107c3565b604083015250606061087c8482850161065c565b6060830152506080610890848285016107fb565b60808301525060a06108a48482850161065c565b60a08301525060c06108b88482850161065c565b60c08301525092915050565b600080600061018084860312156108de576108dd610636565b5b60006108ec8682870161065c565b93505060206108fd86828701610702565b92505060a061090e86828701610810565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b60005b83811015610952578082015181840152602081019050610937565b60008484015250505050565b600061096982610918565b6109738185610923565b9350610983818560208601610934565b61098c81610676565b840191505092915050565b600060208201905081810360008301526109b1818461095e565b905092915050565b600081519050919050565b600082825260208201905092915050565b60006109e0826109b9565b6109ea81856109c4565b93506109fa818560208601610934565b610a0381610676565b840191505092915050565b60006020820190508181036000830152610a2881846109d5565b905092915050565b600081905092915050565b7f7b22746f6b656e5f6964223a2200000000000000000000000000000000000000600082015250565b6000610a71600d83610a30565b9150610a7c82610a3b565b600d82019050919050565b6000610a9282610918565b610a9c8185610a30565b9350610aac818560208601610934565b80840191505092915050565b7f222c22696d616765223a202268747470733a2f2f6261646765732e6d6f6f6e7360008201527f747265616d2e746f2f746573742f7374616b696e675f6c6f676f2e706e672200602082015250565b6000610b14603f83610a30565b9150610b1f82610ab8565b603f82019050919050565b7f2c22726573756c745f76657273696f6e223a312c22617474726962757465732260008201527f3a205b0000000000000000000000000000000000000000000000000000000000602082015250565b6000610b86602383610a30565b9150610b9182610b2a565b602382019050919050565b6000610ba782610a64565b9150610bb38284610a87565b9150610bbe82610b07565b9150610bc982610b79565b915081905092915050565b600081905092915050565b6000610bea826109b9565b610bf48185610bd4565b9350610c04818560208601610934565b80840191505092915050565b7f7b2274726169745f74797065223a22506f6f6c204944222c2276616c7565223a60008201527f2200000000000000000000000000000000000000000000000000000000000000602082015250565b6000610c6c602183610a30565b9150610c7782610c10565b602182019050919050565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b6000610cb8600283610a30565b9150610cc382610c82565b600282019050919050565b6000610cda8285610bdf565b9150610ce582610c5f565b9150610cf18284610a87565b9150610cfc82610cab565b91508190509392505050565b7f2c00000000000000000000000000000000000000000000000000000000000000600082015250565b6000610d3e600183610a30565b9150610d4982610d08565b600182019050919050565b6000610d608286610bdf565b9150610d6b82610d31565b9150610d778285610a87565b9150610d838284610a87565b9150610d8e82610cab565b9150819050949350505050565b7f2c7b22646973706c61795f74797065223a226e756d626572222c22747261697460008201527f5f74797065223a225374616b6564206174222c2276616c7565223a0000000000602082015250565b6000610df7603b83610a30565b9150610e0282610d9b565b603b82019050919050565b7f7d00000000000000000000000000000000000000000000000000000000000000600082015250565b6000610e43600183610a30565b9150610e4e82610e0d565b600182019050919050565b6000610e658285610bdf565b9150610e7082610dea565b9150610e7c8284610a87565b9150610e8782610e36565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610ecd8261063b565b9150610ed88361063b565b9250828201905080821115610ef057610eef610e93565b5b92915050565b7f2c7b22646973706c61795f74797065223a226e756d626572222c22747261697460008201527f5f74797065223a224c6f636b75702065787069726573206174222c2276616c7560208201527f65223a0000000000000000000000000000000000000000000000000000000000604082015250565b6000610f78604383610a30565b9150610f8382610ef6565b604382019050919050565b6000610f9a8285610bdf565b9150610fa582610f6b565b9150610fb18284610a87565b9150610fbc82610e36565b91508190509392505050565b7f5d7d000000000000000000000000000000000000000000000000000000000000600082015250565b6000610ffe600283610a30565b915061100982610fc8565b600282019050919050565b60006110208284610bdf565b915061102b82610ff1565b915081905092915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b600061106c601d83610a30565b915061107782611036565b601d82019050919050565b600061108d8261105f565b91506110998284610a87565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006110de8261063b565b91506110e98361063b565b9250826110f9576110f86110a4565b5b828204905092915050565b600061110f8261063b565b915061111a8361063b565b92508282026111288161063b565b9150828204841483151761113f5761113e610e93565b5b509291505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a225374616b656420746f6b656e204944222c2276616c7565223a227b2274726169745f74797065223a225374616b656420616d6f756e74222c2276616c7565223a22a26469706673582212201ba45e687da3ccb740445486ef2bae091e5dc525110f352658f7c961a8db363e64736f6c63430008180033", + Bin: "0x608060405234801561001057600080fd5b50610d86806100206000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063239bdf6c14610046578063721ac18a1461006f5780637b2f34ff14610082575b600080fd5b610059610054366004610665565b610095565b60405161006691906107f4565b60405180910390f35b61005961007d366004610665565b6100aa565b610059610090366004610665565b610235565b60606100a28484846100aa565b949350505050565b606060006100b785610272565b6040516020016100c7919061080e565b6040516020818303038152906040529050806100e68560000151610272565b6040516020016100f79291906108ec565b60405160208183030381529060405290508083602001516102d11461013457604051806060016040528060278152602001610d2a6027913961014e565b604051806060016040528060298152602001610d01602991395b61015b8660200151610272565b60405160200161016d93929190610995565b60405160208183030381529060405290508061018c8560400151610272565b60405160200161019d929190610a2e565b6040516020818303038152906040529050806101cb8460a0015186604001516101c69190610b06565b610272565b6040516020016101dc929190610b19565b6040516020818303038152906040529050806040516020016101fe9190610be8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe001815291905295945050505050565b606061024a6102458585856100aa565b610330565b60405160200161025a9190610c29565b60405160208183030381529060405290509392505050565b6060600061027f83610490565b600101905060008167ffffffffffffffff81111561029f5761029f610573565b6040519080825280601f01601f1916602001820160405280156102c9576020820181803683370190505b5090508181016020015b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff017f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85049450846102d357509392505050565b6060815160000361034f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001610cc1604091399050600060038451600261037e9190610b06565b6103889190610c6e565b610393906004610ca9565b67ffffffffffffffff8111156103ab576103ab610573565b6040519080825280601f01601f1916602001820160405280156103d5576020820181803683370190505b50905060018201602082018586518701602081018051600082525b8284101561044b576003840193508351603f8160121c168701518653600186019550603f81600c1c168701518653600186019550603f8160061c168701518653600186019550603f81168701518653506001850194506103f0565b905250508551600390066001811461046a576002811461047d57610485565b603d6001830353603d6002830353610485565b603d60018303535b509195945050505050565b6000807a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106104d9577a184f03e93ff9f4daa797ed6e38ed64bf6a1f010000000000000000830492506040015b6d04ee2d6d415b85acef81000000008310610505576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061052357662386f26fc10000830492506010015b6305f5e100831061053b576305f5e100830492506008015b612710831061054f57612710830492506004015b60648310610561576064830492506002015b600a831061056d576001015b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156105ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405290565b60405160e0810167ffffffffffffffff811182821017156105ec577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b803573ffffffffffffffffffffffffffffffffffffffff8116811461066057600080fd5b919050565b600080600083850361018081121561067c57600080fd5b8435935060807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0820112156106b057600080fd5b6106b86105a2565b602086013581526040860135602082015260608601356040820152608086013560608201528093505060e07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff608201121561071157600080fd5b5061071a6105f2565b61072660a0860161063c565b815260c0850135602082015261073e60e0860161063c565b60408201526101008501356060820152610120850135801515811461076257600080fd5b608082015261014085013560a08201526101609094013560c0850152509093909250565b60005b838110156107a1578181015183820152602001610789565b50506000910152565b600081518084526107c2816020860160208601610786565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061080760208301846107aa565b9392505050565b7f7b22746f6b656e5f6964223a220000000000000000000000000000000000000081526000825161084681600d850160208701610786565b7f222c22696d616765223a202268747470733a2f2f6261646765732e6d6f6f6e73600d9390910192830152507f747265616d2e746f2f746573742f7374616b696e675f6c6f676f2e706e672200602d8201527f2c22726573756c745f76657273696f6e223a312c226174747269627574657322604c8201527f3a205b0000000000000000000000000000000000000000000000000000000000606c820152606f01919050565b600083516108fe818460208801610786565b80830190507f7b2274726169745f74797065223a22506f6f6c204944222c2276616c7565223a81527f22000000000000000000000000000000000000000000000000000000000000006020820152835161095f816021840160208801610786565b7f227d00000000000000000000000000000000000000000000000000000000000060219290910191820152602301949350505050565b600084516109a7818460208901610786565b7f2c0000000000000000000000000000000000000000000000000000000000000090830190815284516109e1816001840160208901610786565b84519101906109f7816001840160208801610786565b7f227d0000000000000000000000000000000000000000000000000000000000006001929091019182015260030195945050505050565b60008351610a40818460208801610786565b80830190507f2c7b22646973706c61795f74797065223a226e756d626572222c22747261697481527f5f74797065223a225374616b6564206174222c2276616c7565223a000000000060208201528351610aa181603b840160208801610786565b7f7d00000000000000000000000000000000000000000000000000000000000000603b9290910191820152603c01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561056d5761056d610ad7565b60008351610b2b818460208801610786565b80830190507f2c7b22646973706c61795f74797065223a226e756d626572222c22747261697481527f5f74797065223a224c6f636b75702065787069726573206174222c2276616c7560208201527f65223a000000000000000000000000000000000000000000000000000000000060408201528351610bb2816043840160208801610786565b7f7d0000000000000000000000000000000000000000000000000000000000000060439290910191820152604401949350505050565b60008251610bfa818460208701610786565b7f5d7d000000000000000000000000000000000000000000000000000000000000920191825250600201919050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251610c6181601d850160208701610786565b91909101601d0192915050565b600082610ca4577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b808202811582820484141761056d5761056d610ad756fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f7b2274726169745f74797065223a225374616b656420746f6b656e204944222c2276616c7565223a227b2274726169745f74797065223a225374616b656420616d6f756e74222c2276616c7565223a22a2646970667358221220765e718c273588624e90c593b93211f9d55db2a6b211d136e8f83d4d8ee6eb7264736f6c63430008180033", } // PositionMetadataABI is the input ABI used to generate the binding from. @@ -335,6 +344,11 @@ func CreatePositionMetadataDeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int cmd := &cobra.Command{ Use: "deploy", @@ -344,6 +358,70 @@ func CreatePositionMetadataDeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -371,6 +449,42 @@ func CreatePositionMetadataDeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generatePositionMetadataDeployBytecode() + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployPositionMetadata( transactionOpts, client, @@ -420,10 +534,32 @@ func CreatePositionMetadataDeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } +func generatePositionMetadataDeployBytecode() ([]byte, error) { + abiPacked, err := PositionMetadataMetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("") + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(PositionMetadataMetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateMetadataCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -937,3 +1073,220 @@ func CreatePositionMetadataCommand() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/Staker/Staker.go b/bindings/Staker/Staker.go index 93a1c766..2608bf97 100644 --- a/bindings/Staker/Staker.go +++ b/bindings/Staker/Staker.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package Staker --cli --struct Staker --output bindings/Staker/Staker.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package Staker import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // StakerMetaData contains all meta data concerning the Staker contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// StakerMetaData contains all meta data concerning the Staker contract. var StakerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionMetadata\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721EnumerableForbiddenBatchMint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"ERC721OutOfBoundsIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"poolTokenType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenTypeArg\",\"type\":\"uint256\"}],\"name\":\"IncorrectTokenType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"InitiateUnstakeFirst\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfiguration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expiresAt\",\"type\":\"uint256\"}],\"name\":\"LockupNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MetadataError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonAdministrator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"name\":\"PositionNotTransferable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedForPosition\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"StakingPoolConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"StakingPoolCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"UnstakeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"}],\"name\":\"Unstaked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"CurrentAmountInPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"CurrentPositionsInPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC721_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"Pools\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"Positions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeInitiatedAt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TotalPools\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TotalPositions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"createPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"name\":\"initiateUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"positionMetadataAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeERC1155\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeERC20\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"stakeERC721\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"}],\"name\":\"stakeNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newAdministrator\",\"type\":\"address\"}],\"name\":\"transferPoolAdministration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"changeTransferability\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"changeLockup\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"changeCooldown\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"updatePoolConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60a06040523480156200001157600080fd5b50604051620054f8380380620054f8833981810160405281019062000037919062000176565b6040518060400160405280600c81526020017f47616d6537205374616b657200000000000000000000000000000000000000008152506040518060400160405280600881526020017f47375354414b45520000000000000000000000000000000000000000000000008152508160009081620000b4919062000422565b508060019081620000c6919062000422565b5050506001600a819055508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505062000509565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200013e8262000111565b9050919050565b620001508162000131565b81146200015c57600080fd5b50565b600081519050620001708162000145565b92915050565b6000602082840312156200018f576200018e6200010c565b5b60006200019f848285016200015f565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200022a57607f821691505b60208210810362000240576200023f620001e2565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620002aa7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200026b565b620002b686836200026b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000303620002fd620002f784620002ce565b620002d8565b620002ce565b9050919050565b6000819050919050565b6200031f83620002e2565b620003376200032e826200030a565b84845462000278565b825550505050565b600090565b6200034e6200033f565b6200035b81848462000314565b505050565b5b8181101562000383576200037760008262000344565b60018101905062000361565b5050565b601f821115620003d2576200039c8162000246565b620003a7846200025b565b81016020851015620003b7578190505b620003cf620003c6856200025b565b83018262000360565b50505b505050565b600082821c905092915050565b6000620003f760001984600802620003d7565b1980831691505092915050565b6000620004128383620003e4565b9150826002028217905092915050565b6200042d82620001a8565b67ffffffffffffffff811115620004495762000448620001b3565b5b62000455825462000211565b6200046282828562000387565b600060209050601f8311600181146200049a576000841562000485578287015190505b62000491858262000404565b86555062000501565b601f198416620004aa8662000246565b60005b82811015620004d457848901518255600182019150602085019450602081019050620004ad565b86831015620004f45784890151620004f0601f891682620003e4565b8355505b6001600288020188555050505b505050505050565b608051614fcc6200052c6000396000818161245201526125900152614fcc6000f3fe6080604052600436106102245760003560e01c806373caf0f711610123578063b29087da116100ab578063d693595d1161006f578063d693595d146108b7578063e63c6bf0146108e2578063e985e9c514610912578063f09e76a11461094f578063f23a6e611461097a57610224565b8063b29087da146107ac578063b2db30e9146107e9578063b88d4fde14610826578063c87b56dd1461084f578063d2ba44091461088c57610224565b8063911e476c116100f2578063911e476c146106db57806395d89b4114610704578063a22cb4651461072f578063abd4ce7814610758578063ae5ac9211461078357610224565b806373caf0f7146105f057806373dfccca1461063057806377bd2e781461067357806381c822e61461069e57610224565b80632f745c59116101b157806342842e0e1161017557806342842e0e146104d35780634f6ccce7146104fc5780636352211e146105395780636fafa1e91461057657806370a08231146105b357610224565b80632f745c59146103da57806337d9e9cc146104175780633ab0f1c1146104545780633db263191461047f578063424b9311146104a857610224565b8063095ea7b3116101f8578063095ea7b3146102f7578063150b7a021461032057806318160ddd1461035d57806323b872dd146103885780632e17de78146103b157610224565b80627d0cec1461022957806301ffc9a71461025257806306fdde031461028f578063081812fc146102ba575b600080fd5b34801561023557600080fd5b50610250600480360381019061024b9190613dfb565b6109b7565b005b34801561025e57600080fd5b5061027960048036038101906102749190613ef5565b610b34565b6040516102869190613f31565b60405180910390f35b34801561029b57600080fd5b506102a4610bae565b6040516102b19190613fdc565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190613ffe565b610c40565b6040516102ee919061406c565b60405180910390f35b34801561030357600080fd5b5061031e600480360381019061031991906140b3565b610c5c565b005b34801561032c57600080fd5b5061034760048036038101906103429190614158565b610c72565b60405161035491906141ef565b60405180910390f35b34801561036957600080fd5b50610372610c87565b60405161037f9190614219565b60405180910390f35b34801561039457600080fd5b506103af60048036038101906103aa9190614234565b610c94565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613ffe565b610d2b565b005b3480156103e657600080fd5b5061040160048036038101906103fc91906140b3565b61121f565b60405161040e9190614219565b60405180910390f35b34801561042357600080fd5b5061043e60048036038101906104399190614287565b6112c8565b60405161044b9190614219565b60405180910390f35b34801561046057600080fd5b506104696114fc565b6040516104769190614219565b60405180910390f35b34801561048b57600080fd5b506104a660048036038101906104a191906142c7565b611502565b005b3480156104b457600080fd5b506104bd611656565b6040516104ca9190614219565b60405180910390f35b3480156104df57600080fd5b506104fa60048036038101906104f59190614234565b61165c565b005b34801561050857600080fd5b50610523600480360381019061051e9190613ffe565b61167c565b6040516105309190614219565b60405180910390f35b34801561054557600080fd5b50610560600480360381019061055b9190613ffe565b6116f2565b60405161056d919061406c565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190614287565b611704565b6040516105aa9190614219565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190614307565b611982565b6040516105e79190614219565b60405180910390f35b3480156105fc57600080fd5b5061061760048036038101906106129190613ffe565b611a3c565b6040516106279493929190614334565b60405180910390f35b34801561063c57600080fd5b5061065760048036038101906106529190613ffe565b611a6c565b60405161066a9796959493929190614379565b60405180910390f35b34801561067f57600080fd5b50610688611afb565b6040516106959190614219565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190613ffe565b611b00565b6040516106d29190614219565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd91906143e8565b611b18565b005b34801561071057600080fd5b50610719611f59565b6040516107269190613fdc565b60405180910390f35b34801561073b57600080fd5b5061075660048036038101906107519190614475565b611feb565b005b34801561076457600080fd5b5061076d612001565b60405161077a9190614219565b60405180910390f35b34801561078f57600080fd5b506107aa60048036038101906107a59190613ffe565b612007565b005b3480156107b857600080fd5b506107d360048036038101906107ce9190613ffe565b61219d565b6040516107e09190614219565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190614287565b6121b5565b60405161081d9190614219565b60405180910390f35b34801561083257600080fd5b5061084d600480360381019061084891906145e5565b6123f2565b005b34801561085b57600080fd5b5061087660048036038101906108719190613ffe565b61240f565b6040516108839190613fdc565b60405180910390f35b34801561089857600080fd5b506108a1612589565b6040516108ae9190614219565b60405180910390f35b3480156108c357600080fd5b506108cc61258e565b6040516108d9919061406c565b60405180910390f35b6108fc60048036038101906108f79190613ffe565b6125b2565b6040516109099190614219565b60405180910390f35b34801561091e57600080fd5b5061093960048036038101906109349190614668565b612794565b6040516109469190613f31565b60405180910390f35b34801561095b57600080fd5b50610964612828565b6040516109719190614219565b60405180910390f35b34801561098657600080fd5b506109a1600480360381019061099c91906146a8565b61282e565b6040516109ae91906141ef565b60405180910390f35b6000600f600089815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a57576040517f29f9fc8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8615610a7a57858160040160006101000a81548160ff0219169083151502179055505b8415610a8a578381600501819055505b8215610a9a578181600601819055505b8060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16887f8587d3b7f5e8e73d0f5be513ce84b6c7c9497e221295d831f57ba7ecc36589b58360040160009054906101000a900460ff1684600501548560060154604051610b2293929190614742565b60405180910390a35050505050505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ba75750610ba682612844565b5b9050919050565b606060008054610bbd906147a8565b80601f0160208091040260200160405190810160405280929190818152602001828054610be9906147a8565b8015610c365780601f10610c0b57610100808354040283529160200191610c36565b820191906000526020600020905b815481529060010190602001808311610c1957829003601f168201915b5050505050905090565b6000610c4b82612926565b50610c55826129ae565b9050919050565b610c6e8282610c696129eb565b6129f3565b5050565b600063150b7a0260e01b905095945050505050565b6000600880549050905090565b60006010600083815260200190815260200160002090506000600f60008360000154815260200190815260200160002090508060040160009054906101000a900460ff16610d1957826040517f2ed602a6000000000000000000000000000000000000000000000000000000008152600401610d109190614219565b60405180910390fd5b610d24858585612a05565b5050505050565b610d33612b07565b6000610d3e826116f2565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610db25780336040517f5a4c5074000000000000000000000000000000000000000000000000000000008152600401610da99291906147d9565b60405180910390fd5b5060006010600083815260200190815260200160002090506000600f6000836000015481526020019081526020016000209050600081600601541115610e6257600082600301541480610e17575080600601548260030154610e149190614831565b42105b15610e5d5780600601546040517f2098e24d000000000000000000000000000000000000000000000000000000008152600401610e549190614219565b60405180910390fd5b610ece565b80600501548260020154610e769190614831565b421015610ecd5780600501548260020154610e919190614831565b6040517f9dc1207c000000000000000000000000000000000000000000000000000000008152600401610ec49190614219565b60405180910390fd5b5b6102d1816001015403610f0d57600d6000836000015481526020019081526020016000206000815480929190610f0390614865565b9190505550610f40565b8160010154600d6000846000015481526020019081526020016000206000828254610f38919061488e565b925050819055505b600e6000836000015481526020019081526020016000206000815480929190610f6890614865565b919050555060008260010154905082600001543373ffffffffffffffffffffffffffffffffffffffff167fffdaf13b1d96bfc2213355f353f84c19493e0681eb0df26f83d862acd266750a8684604051610fc39291906148c2565b60405180910390a360106000858152602001908152602001600020600080820160009055600182016000905560028201600090556003820160009055505061100a84612b4d565b6001826001015403611062573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561105c573d6000803e3d6000fd5b50611211565b60148260010154036110c2576110bd33828460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612bd39092919063ffffffff16565b611210565b6102d1826001015403611167578160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3033846040518463ffffffff1660e01b8152600401611130939291906148eb565b600060405180830381600087803b15801561114a57600080fd5b505af115801561115e573d6000803e3d6000fd5b5050505061120f565b61048382600101540361120e578160020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a30338560030154856040518563ffffffff1660e01b81526004016111db9493929190614959565b600060405180830381600087803b1580156111f557600080fd5b505af1158015611209573d6000803e3d6000fd5b505050505b5b5b5b50505061121c612c52565b50565b600061122a83611982565b821061126f5782826040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526004016112669291906149b1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60006112d2612b07565b6000600f60008581526020019081526020016000209050601481600101541461133b5783816001015460146040517f323b95bb000000000000000000000000000000000000000000000000000000008152600401611332939291906149da565b60405180910390fd5b60008303611375576040517fd23fa2a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113c63330858460020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612c5c909392919063ffffffff16565b600c60008154809291906113d990614a11565b9190505591506113e93383612cde565b60405180608001604052808581526020018481526020014281526020016000815250601060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505082600d6000868152602001908152602001600020600082825461146c9190614831565b92505081905550600e6000858152602001908152602001600020600081548092919061149790614a11565b9190505550833373ffffffffffffffffffffffffffffffffffffffff167f17700ceb1658b18206f427c1578048e87504106b14ec69e9b4586d9a95174a3284866040516114e59291906148c2565b60405180910390a3506114f6612c52565b92915050565b600c5481565b6000600f600084815260200190815260200160002090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f29f9fc8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16837f8587d3b7f5e8e73d0f5be513ce84b6c7c9497e221295d831f57ba7ecc36589b58360040160009054906101000a900460ff168460050154856006015460405161164993929190614742565b60405180910390a3505050565b600b5481565b611677838383604051806020016040528060008152506123f2565b505050565b6000611686610c87565b82106116cc576000826040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526004016116c39291906149b1565b60405180910390fd5b600882815481106116e0576116df614a59565b5b90600052602060002001549050919050565b60006116fd82612926565b9050919050565b600061170e612b07565b6000600f60008581526020019081526020016000209050610483816001015414611779578381600101546104836040517f323b95bb000000000000000000000000000000000000000000000000000000008152600401611770939291906149da565b60405180910390fd5b600083036117b3576040517fd23fa2a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f242432a33308460030154876040518563ffffffff1660e01b815260040161181a9493929190614959565b600060405180830381600087803b15801561183457600080fd5b505af1158015611848573d6000803e3d6000fd5b50505050600c600081548092919061185f90614a11565b91905055915061186f3383612cde565b60405180608001604052808581526020018481526020014281526020016000815250601060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505082600d600086815260200190815260200160002060008282546118f29190614831565b92505081905550600e6000858152602001908152602001600020600081548092919061191d90614a11565b9190505550833373ffffffffffffffffffffffffffffffffffffffff167f17700ceb1658b18206f427c1578048e87504106b14ec69e9b4586d9a95174a32848660405161196b9291906148c2565b60405180910390a35061197c612c52565b92915050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119f55760006040517f89c62b640000000000000000000000000000000000000000000000000000000081526004016119ec919061406c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60106020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600f6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040160009054906101000a900460ff16908060050154908060060154905087565b600181565b600d6020528060005260406000206000915090505481565b60018603611b9957600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141580611b5d575060008414155b15611b94576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d43565b60148603611c1957600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bdd575060008414155b15611c14576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d42565b6102d18603611c9a57600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611c5e575060008414155b15611c95576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d41565b6104838603611d0e57600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611d09576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d40565b6040517fa1e9dd9d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b5b6040518060e001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018781526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001841515815260200183815260200182815250600f6000600b54815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a0820151816005015560c082015181600601559050508473ffffffffffffffffffffffffffffffffffffffff1686600b547f36b06296d9441695787e7cbfc0b9cfc5deeeabec4406a3a90d30a222103c2dc887604051611edc9190614219565b60405180910390a43373ffffffffffffffffffffffffffffffffffffffff16600b547f8587d3b7f5e8e73d0f5be513ce84b6c7c9497e221295d831f57ba7ecc36589b5858585604051611f3193929190614742565b60405180910390a3600b6000815480929190611f4c90614a11565b9190505550505050505050565b606060018054611f68906147a8565b80601f0160208091040260200160405190810160405280929190818152602001828054611f94906147a8565b8015611fe15780601f10611fb657610100808354040283529160200191611fe1565b820191906000526020600020905b815481529060010190602001808311611fc457829003601f168201915b5050505050905090565b611ffd611ff66129eb565b8383612dd7565b5050565b61048381565b61200f612b07565b600061201a826116f2565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461208e5780336040517f5a4c50740000000000000000000000000000000000000000000000000000000081526004016120859291906147d9565b60405180910390fd5b60006010600084815260200190815260200160002090506000600f6000836000015481526020019081526020016000209050806005015482600201546120d49190614831565b42101561212b57806005015482600201546120ef9190614831565b6040517f9dc1207c0000000000000000000000000000000000000000000000000000000081526004016121229190614219565b60405180910390fd5b600082600301540361218f574282600301819055503373ffffffffffffffffffffffffffffffffffffffff167fb88af44ff67f15b82bc60b5ecd6ac0f0c27da279a6c21b7d200174756ea5c5e4856040516121869190614219565b60405180910390a25b50505061219a612c52565b50565b600e6020528060005260406000206000915090505481565b60006121bf612b07565b6000600f600085815260200190815260200160002090506102d181600101541461222a578381600101546102d16040517f323b95bb000000000000000000000000000000000000000000000000000000008152600401612221939291906149da565b60405180910390fd5b8060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e3330866040518463ffffffff1660e01b815260040161228b939291906148eb565b600060405180830381600087803b1580156122a557600080fd5b505af11580156122b9573d6000803e3d6000fd5b50505050600c60008154809291906122d090614a11565b9190505591506122e03383612cde565b604051806080016040528085815260200184815260200142815260200160008152506010600084815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050600d6000858152602001908152602001600020600081548092919061236490614a11565b9190505550600e6000858152602001908152602001600020600081548092919061238d90614a11565b9190505550833373ffffffffffffffffffffffffffffffffffffffff167f17700ceb1658b18206f427c1578048e87504106b14ec69e9b4586d9a95174a3284866040516123db9291906148c2565b60405180910390a3506123ec612c52565b92915050565b6123fd848484610c94565b61240984848484612f46565b50505050565b606061241a82612926565b5060006010600084815260200190815260200160002090506000600f60008360000154815260200190815260200160002090506000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686858560405160240161249c93929190614ca7565b604051602081830303815290604052637b2f34ff60e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124ee9190614d26565b600060405180830381855afa9150503d8060008114612529576040519150601f19603f3d011682016040523d82523d6000602084013e61252e565b606091505b50915091508161256a576040517f0e8d7e7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8080602001905181019061257e9190614dde565b945050505050919050565b601481565b7f000000000000000000000000000000000000000000000000000000000000000081565b60006125bc612b07565b6000600f6000848152602001908152602001600020905060018160010154146126255782816001015460016040517f323b95bb00000000000000000000000000000000000000000000000000000000815260040161261c939291906149da565b60405180910390fd5b6000340361265f576040517fd23fa2a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c600081548092919061267290614a11565b9190505591506126823383612cde565b60405180608001604052808481526020013481526020014281526020016000815250601060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201556060820151816003015590505034600d600085815260200190815260200160002060008282546127059190614831565b92505081905550600e6000848152602001908152602001600020600081548092919061273090614a11565b9190505550823373ffffffffffffffffffffffffffffffffffffffff167f17700ceb1658b18206f427c1578048e87504106b14ec69e9b4586d9a95174a32843460405161277e9291906148c2565b60405180910390a35061278f612c52565b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6102d181565b600063f23a6e6160e01b90509695505050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061290f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061291f575061291e826130fd565b5b9050919050565b60008061293283613167565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036129a557826040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161299c9190614219565b60405180910390fd5b80915050919050565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b612a0083838360016131a4565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612a775760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612a6e919061406c565b60405180910390fd5b6000612a8b8383612a866129eb565b613369565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612b01578382826040517f64283d7b000000000000000000000000000000000000000000000000000000008152600401612af893929190614e27565b60405180910390fd5b50505050565b6002600a5403612b43576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a81905550565b6000612b5c6000836000613369565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612bcf57816040517f7e273289000000000000000000000000000000000000000000000000000000008152600401612bc69190614219565b60405180910390fd5b5050565b612c4d838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401612c069291906149b1565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613486565b505050565b6001600a81905550565b612cd8848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401612c91939291906148eb565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613486565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612d505760006040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401612d47919061406c565b60405180910390fd5b6000612d5e83836000613369565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612dd25760006040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401612dc9919061406c565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612e4857816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401612e3f919061406c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612f399190613f31565b60405180910390a3505050565b60008373ffffffffffffffffffffffffffffffffffffffff163b11156130f7578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f8a6129eb565b8685856040518563ffffffff1660e01b8152600401612fac9493929190614e97565b6020604051808303816000875af1925050508015612fe857506040513d601f19601f82011682018060405250810190612fe59190614ef8565b60015b61306c573d8060008114613018576040519150601f19603f3d011682016040523d82523d6000602084013e61301d565b606091505b50600081510361306457836040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161305b919061406c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146130f557836040517f64a0ae920000000000000000000000000000000000000000000000000000000081526004016130ec919061406c565b60405180910390fd5b505b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b80806131dd5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b156133115760006131ed84612926565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561325857508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b801561326b57506132698184612794565b155b156132ad57826040517fa9fbf51f0000000000000000000000000000000000000000000000000000000081526004016132a4919061406c565b60405180910390fd5b811561330f57838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b836004600085815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b60008061337785858561351d565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036133bb576133b684613737565b6133fa565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146133f9576133f88185613780565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361343c57613437846138e1565b61347b565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461347a5761347985856139b2565b5b5b809150509392505050565b60006134b1828473ffffffffffffffffffffffffffffffffffffffff16613a3d90919063ffffffff16565b905060008151141580156134d65750808060200190518101906134d49190614f3a565b155b1561351857826040517f5274afe700000000000000000000000000000000000000000000000000000000815260040161350f919061406c565b60405180910390fd5b505050565b60008061352984613167565b9050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461356b5761356a818486613a53565b5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146135fc576135ad6000856000806131a4565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461367f576001600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b846002600086815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600061378b83611982565b9050600060076000848152602001908152602001600020549050818114613870576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506138f5919061488e565b905060006009600084815260200190815260200160002054905060006008838154811061392557613924614a59565b5b90600052602060002001549050806008838154811061394757613946614a59565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061399657613995614f67565b5b6001900381819060005260206000200160009055905550505050565b600060016139bf84611982565b6139c9919061488e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6060613a4b83836000613b17565b905092915050565b613a5e838383613be4565b613b1257600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603613ad357806040517f7e273289000000000000000000000000000000000000000000000000000000008152600401613aca9190614219565b60405180910390fd5b81816040517f177e802f000000000000000000000000000000000000000000000000000000008152600401613b099291906149b1565b60405180910390fd5b505050565b606081471015613b5e57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401613b55919061406c565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051613b879190614d26565b60006040518083038185875af1925050503d8060008114613bc4576040519150601f19603f3d011682016040523d82523d6000602084013e613bc9565b606091505b5091509150613bd9868383613ca5565b925050509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613c9c57508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613c5d5750613c5c8484612794565b5b80613c9b57508273ffffffffffffffffffffffffffffffffffffffff16613c83836129ae565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b606082613cba57613cb582613d34565b613d2c565b60008251148015613ce2575060008473ffffffffffffffffffffffffffffffffffffffff163b145b15613d2457836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401613d1b919061406c565b60405180910390fd5b819050613d2d565b5b9392505050565b600081511115613d475780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000604051905090565b600080fd5b600080fd5b6000819050919050565b613da081613d8d565b8114613dab57600080fd5b50565b600081359050613dbd81613d97565b92915050565b60008115159050919050565b613dd881613dc3565b8114613de357600080fd5b50565b600081359050613df581613dcf565b92915050565b600080600080600080600060e0888a031215613e1a57613e19613d83565b5b6000613e288a828b01613dae565b9750506020613e398a828b01613de6565b9650506040613e4a8a828b01613de6565b9550506060613e5b8a828b01613de6565b9450506080613e6c8a828b01613dae565b93505060a0613e7d8a828b01613de6565b92505060c0613e8e8a828b01613dae565b91505092959891949750929550565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613ed281613e9d565b8114613edd57600080fd5b50565b600081359050613eef81613ec9565b92915050565b600060208284031215613f0b57613f0a613d83565b5b6000613f1984828501613ee0565b91505092915050565b613f2b81613dc3565b82525050565b6000602082019050613f466000830184613f22565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613f86578082015181840152602081019050613f6b565b60008484015250505050565b6000601f19601f8301169050919050565b6000613fae82613f4c565b613fb88185613f57565b9350613fc8818560208601613f68565b613fd181613f92565b840191505092915050565b60006020820190508181036000830152613ff68184613fa3565b905092915050565b60006020828403121561401457614013613d83565b5b600061402284828501613dae565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006140568261402b565b9050919050565b6140668161404b565b82525050565b6000602082019050614081600083018461405d565b92915050565b6140908161404b565b811461409b57600080fd5b50565b6000813590506140ad81614087565b92915050565b600080604083850312156140ca576140c9613d83565b5b60006140d88582860161409e565b92505060206140e985828601613dae565b9150509250929050565b600080fd5b600080fd5b600080fd5b60008083601f840112614118576141176140f3565b5b8235905067ffffffffffffffff811115614135576141346140f8565b5b602083019150836001820283011115614151576141506140fd565b5b9250929050565b60008060008060006080868803121561417457614173613d83565b5b60006141828882890161409e565b95505060206141938882890161409e565b94505060406141a488828901613dae565b935050606086013567ffffffffffffffff8111156141c5576141c4613d88565b5b6141d188828901614102565b92509250509295509295909350565b6141e981613e9d565b82525050565b600060208201905061420460008301846141e0565b92915050565b61421381613d8d565b82525050565b600060208201905061422e600083018461420a565b92915050565b60008060006060848603121561424d5761424c613d83565b5b600061425b8682870161409e565b935050602061426c8682870161409e565b925050604061427d86828701613dae565b9150509250925092565b6000806040838503121561429e5761429d613d83565b5b60006142ac85828601613dae565b92505060206142bd85828601613dae565b9150509250929050565b600080604083850312156142de576142dd613d83565b5b60006142ec85828601613dae565b92505060206142fd8582860161409e565b9150509250929050565b60006020828403121561431d5761431c613d83565b5b600061432b8482850161409e565b91505092915050565b6000608082019050614349600083018761420a565b614356602083018661420a565b614363604083018561420a565b614370606083018461420a565b95945050505050565b600060e08201905061438e600083018a61405d565b61439b602083018961420a565b6143a8604083018861405d565b6143b5606083018761420a565b6143c26080830186613f22565b6143cf60a083018561420a565b6143dc60c083018461420a565b98975050505050505050565b60008060008060008060c0878903121561440557614404613d83565b5b600061441389828a01613dae565b965050602061442489828a0161409e565b955050604061443589828a01613dae565b945050606061444689828a01613de6565b935050608061445789828a01613dae565b92505060a061446889828a01613dae565b9150509295509295509295565b6000806040838503121561448c5761448b613d83565b5b600061449a8582860161409e565b92505060206144ab85828601613de6565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144f282613f92565b810181811067ffffffffffffffff82111715614511576145106144ba565b5b80604052505050565b6000614524613d79565b905061453082826144e9565b919050565b600067ffffffffffffffff8211156145505761454f6144ba565b5b61455982613f92565b9050602081019050919050565b82818337600083830152505050565b600061458861458384614535565b61451a565b9050828152602081018484840111156145a4576145a36144b5565b5b6145af848285614566565b509392505050565b600082601f8301126145cc576145cb6140f3565b5b81356145dc848260208601614575565b91505092915050565b600080600080608085870312156145ff576145fe613d83565b5b600061460d8782880161409e565b945050602061461e8782880161409e565b935050604061462f87828801613dae565b925050606085013567ffffffffffffffff8111156146505761464f613d88565b5b61465c878288016145b7565b91505092959194509250565b6000806040838503121561467f5761467e613d83565b5b600061468d8582860161409e565b925050602061469e8582860161409e565b9150509250929050565b60008060008060008060a087890312156146c5576146c4613d83565b5b60006146d389828a0161409e565b96505060206146e489828a0161409e565b95505060406146f589828a01613dae565b945050606061470689828a01613dae565b935050608087013567ffffffffffffffff81111561472757614726613d88565b5b61473389828a01614102565b92509250509295509295509295565b60006060820190506147576000830186613f22565b614764602083018561420a565b614771604083018461420a565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806147c057607f821691505b6020821081036147d3576147d2614779565b5b50919050565b60006040820190506147ee600083018561405d565b6147fb602083018461405d565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061483c82613d8d565b915061484783613d8d565b925082820190508082111561485f5761485e614802565b5b92915050565b600061487082613d8d565b91506000820361488357614882614802565b5b600182039050919050565b600061489982613d8d565b91506148a483613d8d565b92508282039050818111156148bc576148bb614802565b5b92915050565b60006040820190506148d7600083018561420a565b6148e4602083018461420a565b9392505050565b6000606082019050614900600083018661405d565b61490d602083018561405d565b61491a604083018461420a565b949350505050565b600082825260208201905092915050565b50565b6000614943600083614922565b915061494e82614933565b600082019050919050565b600060a08201905061496e600083018761405d565b61497b602083018661405d565b614988604083018561420a565b614995606083018461420a565b81810360808301526149a681614936565b905095945050505050565b60006040820190506149c6600083018561405d565b6149d3602083018461420a565b9392505050565b60006060820190506149ef600083018661420a565b6149fc602083018561420a565b614a09604083018461420a565b949350505050565b6000614a1c82613d8d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a4e57614a4d614802565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008160001c9050919050565b6000819050919050565b6000614ab2614aad83614a88565b614a95565b9050919050565b614ac281613d8d565b82525050565b608082016000808301549050614add81614a9f565b614aea6000860182614ab9565b5060018301549050614afb81614a9f565b614b086020860182614ab9565b5060028301549050614b1981614a9f565b614b266040860182614ab9565b5060038301549050614b3781614a9f565b614b446060860182614ab9565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000614b7e614b7983614a88565b614b4b565b9050919050565b614b8e8161404b565b82525050565b600060ff82169050919050565b6000614bb4614baf83614a88565b614b94565b9050919050565b614bc481613dc3565b82525050565b60e082016000808301549050614bdf81614b6b565b614bec6000860182614b85565b5060018301549050614bfd81614a9f565b614c0a6020860182614ab9565b5060028301549050614c1b81614b6b565b614c286040860182614b85565b5060038301549050614c3981614a9f565b614c466060860182614ab9565b5060048301549050614c5781614ba1565b614c646080860182614bbb565b5060058301549050614c7581614a9f565b614c8260a0860182614ab9565b5060068301549050614c9381614a9f565b614ca060c0860182614ab9565b5050505050565b600061018082019050614cbd600083018661420a565b614cca6020830185614ac8565b614cd760a0830184614bca565b949350505050565b600081519050919050565b600081905092915050565b6000614d0082614cdf565b614d0a8185614cea565b9350614d1a818560208601613f68565b80840191505092915050565b6000614d328284614cf5565b915081905092915050565b600067ffffffffffffffff821115614d5857614d576144ba565b5b614d6182613f92565b9050602081019050919050565b6000614d81614d7c84614d3d565b61451a565b905082815260208101848484011115614d9d57614d9c6144b5565b5b614da8848285613f68565b509392505050565b600082601f830112614dc557614dc46140f3565b5b8151614dd5848260208601614d6e565b91505092915050565b600060208284031215614df457614df3613d83565b5b600082015167ffffffffffffffff811115614e1257614e11613d88565b5b614e1e84828501614db0565b91505092915050565b6000606082019050614e3c600083018661405d565b614e49602083018561420a565b614e56604083018461405d565b949350505050565b6000614e6982614cdf565b614e738185614922565b9350614e83818560208601613f68565b614e8c81613f92565b840191505092915050565b6000608082019050614eac600083018761405d565b614eb9602083018661405d565b614ec6604083018561420a565b8181036060830152614ed88184614e5e565b905095945050505050565b600081519050614ef281613ec9565b92915050565b600060208284031215614f0e57614f0d613d83565b5b6000614f1c84828501614ee3565b91505092915050565b600081519050614f3481613dcf565b92915050565b600060208284031215614f5057614f4f613d83565b5b6000614f5e84828501614f25565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220d45270ee2a4519532183f3aa5af1628dc642cfa865b5c6e6b4ff8a5fbac5ac4164736f6c63430008180033", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionMetadata\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"AddressInsufficientBalance\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC721EnumerableForbiddenBatchMint\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721IncorrectOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721InsufficientApproval\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"approver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidApprover\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOperator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"ERC721InvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"ERC721InvalidReceiver\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"ERC721InvalidSender\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ERC721NonexistentToken\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"ERC721OutOfBoundsIndex\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedInnerCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"poolTokenType\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenTypeArg\",\"type\":\"uint256\"}],\"name\":\"IncorrectTokenType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"InitiateUnstakeFirst\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidConfiguration\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenType\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"expiresAt\",\"type\":\"uint256\"}],\"name\":\"LockupNotExpired\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MetadataError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NonAdministrator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NothingToStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"name\":\"PositionNotTransferable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ReentrancyGuardReentrantCall\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"}],\"name\":\"SafeERC20FailedOperation\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"UnauthorizedForPosition\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"}],\"name\":\"Staked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"StakingPoolConfigured\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"StakingPoolCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"UnstakeInitiated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"}],\"name\":\"Unstaked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"CurrentAmountInPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"CurrentPositionsInPool\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC1155_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC20_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ERC721_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_TYPE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"Pools\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"Positions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amountOrTokenID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"stakeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unstakeInitiatedAt\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TotalPools\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TotalPositions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenType\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"administrator\",\"type\":\"address\"}],\"name\":\"createPool\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"name\":\"initiateUnstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"positionMetadataAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionHolder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeERC1155\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionHolder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"stakeERC20\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionHolder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokenID\",\"type\":\"uint256\"}],\"name\":\"stakeERC721\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionHolder\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"}],\"name\":\"stakeNative\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"tokenOfOwnerByIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"newAdministrator\",\"type\":\"address\"}],\"name\":\"transferPoolAdministration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"positionTokenID\",\"type\":\"uint256\"}],\"name\":\"unstake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"poolID\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"changeTransferability\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"transferable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"changeLockup\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"lockupSeconds\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"changeCooldown\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"cooldownSeconds\",\"type\":\"uint256\"}],\"name\":\"updatePoolConfiguration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60a06040523480156200001157600080fd5b5060405162003c9938038062003c998339810160408190526200003491620000b4565b6040518060400160405280600c81526020016b23b0b6b29b9029ba30b5b2b960a11b81525060405180604001604052806008815260200167239ba9aa20a5a2a960c11b81525081600090816200008b91906200018d565b5060016200009a82826200018d565b50506001600a55506001600160a01b031660805262000259565b600060208284031215620000c757600080fd5b81516001600160a01b0381168114620000df57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011157607f821691505b6020821081036200013257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000188576000816000526020600020601f850160051c81016020861015620001635750805b601f850160051c820191505b8181101562000184578281556001016200016f565b5050505b505050565b81516001600160401b03811115620001a957620001a9620000e6565b620001c181620001ba8454620000fc565b8462000138565b602080601f831160018114620001f95760008415620001e05750858301515b600019600386901b1c1916600185901b17855562000184565b600085815260208120601f198616915b828110156200022a5788860151825594840194600190910190840162000209565b5085821015620002495787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051613a1d6200027c600039600081816108080152611bea0152613a1d6000f3fe6080604052600436106102845760003560e01c806373dfccca11610153578063b0fe4a7e116100cb578063d693595d1161007f578063e985e9c511610064578063e985e9c51461084a578063f09e76a1146108a0578063f23a6e61146108b657600080fd5b8063d693595d146107f6578063df44bf761461082a57600080fd5b8063b88d4fde116100b0578063b88d4fde146107a1578063c87b56dd146107c1578063d2ba4409146107e157600080fd5b8063b0fe4a7e14610754578063b29087da1461077457600080fd5b806395d89b4111610122578063a22cb46511610107578063a22cb465146106fe578063abd4ce781461071e578063ae5ac9211461073457600080fd5b806395d89b41146106d6578063a1ed8fef146106eb57600080fd5b806373dfccca146105aa57806377bd2e781461067457806381c822e6146106895780638d4a9e85146106b657600080fd5b80632f745c59116102015780634f6ccce7116101b55780636352211e1161019a5780636352211e1461050857806370a082311461052857806373caf0f71461054857600080fd5b80634f6ccce7146104c8578063621519c0146104e857600080fd5b80633db26319116101e65780633db2631914610472578063424b93111461049257806342842e0e146104a857600080fd5b80632f745c591461043c5780633ab0f1c11461045c57600080fd5b8063095ea7b31161025857806318160ddd1161023d57806318160ddd146103dd57806323b872dd146103fc5780632e17de781461041c57600080fd5b8063095ea7b314610347578063150b7a021461036757600080fd5b80627d0cec1461028957806301ffc9a7146102ab57806306fdde03146102e0578063081812fc14610302575b600080fd5b34801561029557600080fd5b506102a96102a4366004613193565b6108fc565b005b3480156102b757600080fd5b506102cb6102c636600461323c565b610a27565b60405190151581526020015b60405180910390f35b3480156102ec57600080fd5b506102f5610a83565b6040516102d791906132c7565b34801561030e57600080fd5b5061032261031d3660046132da565b610b15565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102d7565b34801561035357600080fd5b506102a961036236600461331c565b610b4b565b34801561037357600080fd5b506103ac61038236600461338f565b7f150b7a020000000000000000000000000000000000000000000000000000000095945050505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016102d7565b3480156103e957600080fd5b506008545b6040519081526020016102d7565b34801561040857600080fd5b506102a96104173660046133fe565b610b5a565b34801561042857600080fd5b506102a96104373660046132da565b610bcf565b34801561044857600080fd5b506103ee61045736600461331c565b611069565b34801561046857600080fd5b506103ee600c5481565b34801561047e57600080fd5b506102a961048d36600461343a565b611101565b34801561049e57600080fd5b506103ee600b5481565b3480156104b457600080fd5b506102a96104c33660046133fe565b6111fc565b3480156104d457600080fd5b506103ee6104e33660046132da565b61121c565b3480156104f457600080fd5b506103ee610503366004613466565b61128e565b34801561051457600080fd5b506103226105233660046132da565b61149b565b34801561053457600080fd5b506103ee610543366004613499565b6114a6565b34801561055457600080fd5b5061058a6105633660046132da565b60106020526000908152604090208054600182015460028301546003909301549192909184565b6040805194855260208501939093529183015260608201526080016102d7565b3480156105b657600080fd5b5061061f6105c53660046132da565b600f60205260009081526040902080546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff95861696949590931693919260ff909116919087565b6040805173ffffffffffffffffffffffffffffffffffffffff98891681526020810197909752949096169385019390935260608401919091521515608083015260a082015260c081019190915260e0016102d7565b34801561068057600080fd5b506103ee600181565b34801561069557600080fd5b506103ee6106a43660046132da565b600d6020526000908152604090205481565b3480156106c257600080fd5b506103ee6106d1366004613466565b611521565b3480156106e257600080fd5b506102f5611675565b6103ee6106f936600461331c565b611684565b34801561070a57600080fd5b506102a96107193660046134b4565b611834565b34801561072a57600080fd5b506103ee61048381565b34801561074057600080fd5b506102a961074f3660046132da565b61183f565b34801561076057600080fd5b506103ee61076f366004613466565b61199f565b34801561078057600080fd5b506103ee61078f3660046132da565b600e6020526000908152604090205481565b3480156107ad57600080fd5b506102a96107bc3660046135af565b611b06565b3480156107cd57600080fd5b506102f56107dc3660046132da565b611b23565b3480156107ed57600080fd5b506103ee601481565b34801561080257600080fd5b506103227f000000000000000000000000000000000000000000000000000000000000000081565b34801561083657600080fd5b506102a961084536600461365a565b611d2a565b34801561085657600080fd5b506102cb6108653660046136c6565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156108ac57600080fd5b506103ee6102d181565b3480156108c257600080fd5b506103ac6108d13660046136f0565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b6000878152600f60205260409020805473ffffffffffffffffffffffffffffffffffffffff16331461095a576040517f29f9fc8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b861561098f576004810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168715151790555b841561099d57600581018490555b82156109ab57600681018290555b80546004820154600583015460068401546040805160ff9094161515845260208401929092529082015273ffffffffffffffffffffffffffffffffffffffff9091169089907f8587d3b7f5e8e73d0f5be513ce84b6c7c9497e221295d831f57ba7ecc36589b59060600160405180910390a35050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d63000000000000000000000000000000000000000000000000000000001480610a7d5750610a7d82612086565b92915050565b606060008054610a9290613768565b80601f0160208091040260200160405190810160405280929190818152602001828054610abe90613768565b8015610b0b5780601f10610ae057610100808354040283529160200191610b0b565b820191906000526020600020905b815481529060010190602001808311610aee57829003601f168201915b5050505050905090565b6000610b2082612169565b5060008281526004602052604090205473ffffffffffffffffffffffffffffffffffffffff16610a7d565b610b568282336121c8565b5050565b600081815260106020908152604080832080548452600f909252909120600481015460ff16610bbd576040517f2ed602a6000000000000000000000000000000000000000000000000000000008152600481018490526024015b60405180910390fd5b610bc88585856121d5565b5050505050565b610bd76122c0565b600081815260106020908152604080832080548452600f90925282209091610bfe8461149b565b905073ffffffffffffffffffffffffffffffffffffffff81163314801590610c3d5750815473ffffffffffffffffffffffffffffffffffffffff163314155b15610c92576040517f5a4c507400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff82166004820152336024820152604401610bb4565b600682015415610d035760038301541580610cbf575081600601548360030154610cbc91906137ea565b42105b15610cfe5781600601546040517f2098e24d000000000000000000000000000000000000000000000000000000008152600401610bb491815260200190565b610d67565b81600501548360020154610d1791906137ea565b421015610d675781600501548360020154610d3291906137ea565b6040517f9dc1207c000000000000000000000000000000000000000000000000000000008152600401610bb491815260200190565b6102d1826001015403610d9a5782546000908152600d60205260408120805491610d90836137fd565b9190505550610dc5565b600183015483546000908152600d602052604081208054909190610dbf908490613832565b90915550505b82546000908152600e60205260408120805491610de1836137fd565b909155505060018301548354604080518781526020810184905273ffffffffffffffffffffffffffffffffffffffff8516917fffdaf13b1d96bfc2213355f353f84c19493e0681eb0df26f83d862acd266750a910160405180910390a36000858152601060205260408120818155600181018290556002810182905560030155610e6a85612303565b6001836001015403610ebf5760405173ffffffffffffffffffffffffffffffffffffffff83169082156108fc029083906000818181858888f19350505050158015610eb9573d6000803e3d6000fd5b50611058565b6014836001015403610ef6576002830154610ef19073ffffffffffffffffffffffffffffffffffffffff168383612364565b611058565b6102d1836001015403610f9c5760028301546040517f42842e0e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff848116602483015260448201849052909116906342842e0e90606401600060405180830381600087803b158015610f7f57600080fd5b505af1158015610f93573d6000803e3d6000fd5b50505050611058565b61048383600101540361105857600283015460038401546040517ff242432a00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff858116602483015260448201929092526064810184905260a06084820152600060a482015291169063f242432a9060c401600060405180830381600087803b15801561103f57600080fd5b505af1158015611053573d6000803e3d6000fd5b505050505b505050506110666001600a55565b50565b6000611074836114a6565b82106110cb576040517fa57d13dc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101839052604401610bb4565b5073ffffffffffffffffffffffffffffffffffffffff919091166000908152600660209081526040808320938352929052205490565b6000828152600f60205260409020805473ffffffffffffffffffffffffffffffffffffffff16331461115f576040517f29f9fc8100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811782556004820154600583015460068401546040805160ff9094161515845260208401929092529082015284907f8587d3b7f5e8e73d0f5be513ce84b6c7c9497e221295d831f57ba7ecc36589b5906060015b60405180910390a3505050565b61121783838360405180602001604052806000815250611b06565b505050565b600061122760085490565b8210611269576040517fa57d13dc0000000000000000000000000000000000000000000000000000000081526000600482015260248101839052604401610bb4565b6008828154811061127c5761127c613845565b90600052602060002001549050919050565b60006112986122c0565b6000838152600f6020526040902060018101546102d1146112fd5760018101546040517f323b95bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101919091526102d16044820152606401610bb4565b60028101546040517f42842e0e0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906342842e0e90606401600060405180830381600087803b15801561137757600080fd5b505af115801561138b573d6000803e3d6000fd5b5050600c80549250905060006113a083613874565b9190505591506113b085836123e5565b60408051608081018252858152602080820186815242838501908152600060608501818152888252601085528682209551865592516001860155905160028501559051600390930192909255868252600d905290812080549161141283613874565b90915550506000848152600e6020526040812080549161143183613874565b90915550506040805183815260208101859052859173ffffffffffffffffffffffffffffffffffffffff8816917f17700ceb1658b18206f427c1578048e87504106b14ec69e9b4586d9a95174a32910160405180910390a3506114946001600a55565b9392505050565b6000610a7d82612169565b600073ffffffffffffffffffffffffffffffffffffffff82166114f8576040517f89c62b6400000000000000000000000000000000000000000000000000000000815260006004820152602401610bb4565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b600061152b6122c0565b6000838152600f60205260409020600181015460141461158e5760018101546040517f323b95bb00000000000000000000000000000000000000000000000000000000815260048101869052602481019190915260146044820152606401610bb4565b826000036115c8576040517fd23fa2a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60028101546115ef9073ffffffffffffffffffffffffffffffffffffffff16333086612496565b600c80549060006115ff83613874565b91905055915061160f85836123e5565b60408051608081018252858152602080820186815242838501908152600060608501818152888252601085528682209551865592516001860155905160028501559051600390930192909255868252600d905290812080548592906114129084906137ea565b606060018054610a9290613768565b600061168e6122c0565b6000828152600f60205260409020600180820154146116f2576001818101546040517f323b95bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101919091526044810191909152606401610bb4565b3460000361172c576040517fd23fa2a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c805490600061173c83613874565b91905055915061174c84836123e5565b6040805160808101825284815234602080830182815242848601908152600060608601818152898252601085528782209651875592516001870155905160028601559051600390940193909355868352600d905291812080549091906117b39084906137ea565b90915550506000838152600e602052604081208054916117d283613874565b909155505060408051838152346020820152849173ffffffffffffffffffffffffffffffffffffffff8716917f17700ceb1658b18206f427c1578048e87504106b14ec69e9b4586d9a95174a32910160405180910390a350610a7d6001600a55565b610b563383836124dc565b6118476122c0565b60006118528261149b565b600083815260106020908152604080832080548452600f9092529091209192509073ffffffffffffffffffffffffffffffffffffffff831633148015906118b05750805473ffffffffffffffffffffffffffffffffffffffff163314155b15611905576040517f5a4c507400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152336024820152604401610bb4565b8060050154826002015461191991906137ea565b4210156119345780600501548260020154610d3291906137ea565b81600301546000036119925742600383015560405184815273ffffffffffffffffffffffffffffffffffffffff8416907fb88af44ff67f15b82bc60b5ecd6ac0f0c27da279a6c21b7d200174756ea5c5e49060200160405180910390a25b5050506110666001600a55565b60006119a96122c0565b6000838152600f60205260409020600181015461048314611a0e5760018101546040517f323b95bb0000000000000000000000000000000000000000000000000000000081526004810186905260248101919091526104836044820152606401610bb4565b82600003611a48576040517fd23fa2a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600281015460038201546040517ff242432a00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101919091526064810185905260a06084820152600060a482015273ffffffffffffffffffffffffffffffffffffffff9091169063f242432a9060c401600060405180830381600087803b158015611add57600080fd5b505af1158015611af1573d6000803e3d6000fd5b5050600c80549250905060006115ff83613874565b611b11848484610b5a565b611b1d848484846125d1565b50505050565b6060611b2e82612169565b5060008281526010602090815260408083208054808552600f90935281842091516024810187905260448101939093526001808201546064850152600280830154608486015260038084015460a4870152845473ffffffffffffffffffffffffffffffffffffffff90811660c48801529285015460e4870152908401548216610104860152830154610124850152600483015460ff161515610144850152600583015461016485015260068301546101848501529093919282917f000000000000000000000000000000000000000000000000000000000000000016906101a401604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7b2f34ff0000000000000000000000000000000000000000000000000000000017905251611c9091906138ac565b600060405180830381855afa9150503d8060008114611ccb576040519150601f19603f3d011682016040523d82523d6000602084013e611cd0565b606091505b509150915081611d0c576040517f0e8d7e7400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80806020019051810190611d2091906138c8565b9695505050505050565b60018703611d915773ffffffffffffffffffffffffffffffffffffffff8616151580611d5557508415155b15611d8c576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ed6565b60148703611def5773ffffffffffffffffffffffffffffffffffffffff86161580611d5557508415611d8c576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6102d18703611e4e5773ffffffffffffffffffffffffffffffffffffffff86161580611d5557508415611d8c576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6104838703611ea45773ffffffffffffffffffffffffffffffffffffffff8616611d8c576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fa1e9dd9d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160e08101825273ffffffffffffffffffffffffffffffffffffffff838116825260208083018b81528a8316848601818152606086018c81528b15156080880190815260a088018c815260c089018c8152600b80546000908152600f8a528c90209a518b547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116918c16919091178c55975160018c0155945160028b01805490981699169890981790955590516003880155516004870180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790559151600586015592516006909401939093559154925188815290928a9290917f36b06296d9441695787e7cbfc0b9cfc5deeeabec4406a3a90d30a222103c2dc8910160405180910390a4600b546040805186151581526020810186905290810184905273ffffffffffffffffffffffffffffffffffffffff831691907f8587d3b7f5e8e73d0f5be513ce84b6c7c9497e221295d831f57ba7ecc36589b59060600160405180910390a3600b805490600061207883613874565b919050555050505050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061211957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610a7d57507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610a7d565b60008181526002602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610a7d576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101849052602401610bb4565b61121783838360016127c1565b73ffffffffffffffffffffffffffffffffffffffff8216612225576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610bb4565b600061223283833361298c565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b1d576040517f64283d7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80861660048301526024820184905282166044820152606401610bb4565b6002600a54036122fc576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600a55565b6000612312600083600061298c565b905073ffffffffffffffffffffffffffffffffffffffff8116610b56576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101839052602401610bb4565b60405173ffffffffffffffffffffffffffffffffffffffff83811660248301526044820183905261121791859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612aaf565b73ffffffffffffffffffffffffffffffffffffffff8216612435576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260006004820152602401610bb4565b60006124438383600061298c565b905073ffffffffffffffffffffffffffffffffffffffff811615611217576040517f73c6ac6e00000000000000000000000000000000000000000000000000000000815260006004820152602401610bb4565b60405173ffffffffffffffffffffffffffffffffffffffff8481166024830152838116604483015260648201839052611b1d9186918216906323b872dd9060840161239e565b73ffffffffffffffffffffffffffffffffffffffff8216612541576040517f5b08ba1800000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83166004820152602401610bb4565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526005602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191016111ef565b73ffffffffffffffffffffffffffffffffffffffff83163b15611b1d576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84169063150b7a029061264690339088908790879060040161393f565b6020604051808303816000875af192505050801561269f575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261269c9181019061397e565b60015b61272e573d8080156126cd576040519150601f19603f3d011682016040523d82523d6000602084013e6126d2565b606091505b508051600003612726576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610bb4565b805181602001fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167f150b7a020000000000000000000000000000000000000000000000000000000014610bc8576040517f64a0ae9200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610bb4565b80806127e2575073ffffffffffffffffffffffffffffffffffffffff821615155b156129375760006127f284612169565b905073ffffffffffffffffffffffffffffffffffffffff83161580159061284557508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b8015612884575073ffffffffffffffffffffffffffffffffffffffff80821660009081526005602090815260408083209387168352929052205460ff16155b156128d3576040517fa9fbf51f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610bb4565b811561293557838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b5050600090815260046020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008061299a858585612b45565b905073ffffffffffffffffffffffffffffffffffffffff8116612a04576129ff84600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b612a41565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612a4157612a418185612cc2565b73ffffffffffffffffffffffffffffffffffffffff8516612a6a57612a6584612d6d565b612aa7565b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612aa757612aa78585612e1c565b949350505050565b6000612ad173ffffffffffffffffffffffffffffffffffffffff841683612e79565b90508051600014158015612af6575080806020019051810190612af4919061399b565b155b15611217576040517f5274afe700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84166004820152602401610bb4565b60008281526002602052604081205473ffffffffffffffffffffffffffffffffffffffff90811690831615612b7f57612b7f818486612e87565b73ffffffffffffffffffffffffffffffffffffffff811615612bf557612ba96000856000806127c1565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190555b73ffffffffffffffffffffffffffffffffffffffff851615612c3e5773ffffffffffffffffffffffffffffffffffffffff85166000908152600360205260409020805460010190555b60008481526002602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b6000612ccd836114a6565b600083815260076020526040902054909150808214612d2d5773ffffffffffffffffffffffffffffffffffffffff841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b50600091825260076020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600681528383209183525290812055565b600854600090612d7f90600190613832565b60008381526009602052604081205460088054939450909284908110612da757612da7613845565b906000526020600020015490508060088381548110612dc857612dc8613845565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612e0057612e006139b8565b6001900381819060005260206000200160009055905550505050565b60006001612e29846114a6565b612e339190613832565b73ffffffffffffffffffffffffffffffffffffffff9093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b606061149483836000612f37565b612e92838383612ff0565b6112175773ffffffffffffffffffffffffffffffffffffffff8316612ee6576040517f7e27328900000000000000000000000000000000000000000000000000000000815260048101829052602401610bb4565b6040517f177e802f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8316600482015260248101829052604401610bb4565b606081471015612f75576040517fcd786059000000000000000000000000000000000000000000000000000000008152306004820152602401610bb4565b6000808573ffffffffffffffffffffffffffffffffffffffff168486604051612f9e91906138ac565b60006040518083038185875af1925050503d8060008114612fdb576040519150601f19603f3d011682016040523d82523d6000602084013e612fe0565b606091505b5091509150611d208683836130b4565b600073ffffffffffffffffffffffffffffffffffffffff831615801590612aa757508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061307e575073ffffffffffffffffffffffffffffffffffffffff80851660009081526005602090815260408083209387168352929052205460ff165b80612aa757505060009081526004602052604090205473ffffffffffffffffffffffffffffffffffffffff908116911614919050565b6060826130c9576130c482613143565b611494565b81511580156130ed575073ffffffffffffffffffffffffffffffffffffffff84163b155b1561313c576040517f9996b31500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85166004820152602401610bb4565b5080611494565b8051156131535780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b801515811461106657600080fd5b600080600080600080600060e0888a0312156131ae57600080fd5b8735965060208801356131c081613185565b955060408801356131d081613185565b945060608801356131e081613185565b93506080880135925060a08801356131f781613185565b8092505060c0880135905092959891949750929550565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461106657600080fd5b60006020828403121561324e57600080fd5b81356114948161320e565b60005b8381101561327457818101518382015260200161325c565b50506000910152565b60008151808452613295816020860160208601613259565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611494602083018461327d565b6000602082840312156132ec57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461331757600080fd5b919050565b6000806040838503121561332f57600080fd5b613338836132f3565b946020939093013593505050565b60008083601f84011261335857600080fd5b50813567ffffffffffffffff81111561337057600080fd5b60208301915083602082850101111561338857600080fd5b9250929050565b6000806000806000608086880312156133a757600080fd5b6133b0866132f3565b94506133be602087016132f3565b935060408601359250606086013567ffffffffffffffff8111156133e157600080fd5b6133ed88828901613346565b969995985093965092949392505050565b60008060006060848603121561341357600080fd5b61341c846132f3565b925061342a602085016132f3565b9150604084013590509250925092565b6000806040838503121561344d57600080fd5b8235915061345d602084016132f3565b90509250929050565b60008060006060848603121561347b57600080fd5b613484846132f3565b95602085013595506040909401359392505050565b6000602082840312156134ab57600080fd5b611494826132f3565b600080604083850312156134c757600080fd5b6134d0836132f3565b915060208301356134e081613185565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613561576135616134eb565b604052919050565b600067ffffffffffffffff821115613583576135836134eb565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600080600080608085870312156135c557600080fd5b6135ce856132f3565b93506135dc602086016132f3565b925060408501359150606085013567ffffffffffffffff8111156135ff57600080fd5b8501601f8101871361361057600080fd5b803561362361361e82613569565b61351a565b81815288602083850101111561363857600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600080600080600080600060e0888a03121561367557600080fd5b87359650613685602089016132f3565b955060408801359450606088013561369c81613185565b93506080880135925060a088013591506136b860c089016132f3565b905092959891949750929550565b600080604083850312156136d957600080fd5b6136e2836132f3565b915061345d602084016132f3565b60008060008060008060a0878903121561370957600080fd5b613712876132f3565b9550613720602088016132f3565b94506040870135935060608701359250608087013567ffffffffffffffff81111561374a57600080fd5b61375689828a01613346565b979a9699509497509295939492505050565b600181811c9082168061377c57607f821691505b6020821081036137b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610a7d57610a7d6137bb565b60008161380c5761380c6137bb565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b81810381811115610a7d57610a7d6137bb565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036138a5576138a56137bb565b5060010190565b600082516138be818460208701613259565b9190910192915050565b6000602082840312156138da57600080fd5b815167ffffffffffffffff8111156138f157600080fd5b8201601f8101841361390257600080fd5b805161391061361e82613569565b81815285602083850101111561392557600080fd5b613936826020830160208601613259565b95945050505050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152611d20608083018461327d565b60006020828403121561399057600080fd5b81516114948161320e565b6000602082840312156139ad57600080fd5b815161149481613185565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220551159e06b0b01ac5e87c41191e31bbc7ed6ca8cbfa0afb0945c4601a9a0ec3c64736f6c63430008180033", } // StakerABI is the input ABI used to generate the binding from. @@ -1045,25 +1055,25 @@ func (_Staker *StakerTransactorSession) Approve(to common.Address, tokenId *big. return _Staker.Contract.Approve(&_Staker.TransactOpts, to, tokenId) } -// CreatePool is a paid mutator transaction binding the contract method 0x911e476c. +// CreatePool is a paid mutator transaction binding the contract method 0xdf44bf76. // -// Solidity: function createPool(uint256 tokenType, address tokenAddress, uint256 tokenID, bool transferable, uint256 lockupSeconds, uint256 cooldownSeconds) returns() -func (_Staker *StakerTransactor) CreatePool(opts *bind.TransactOpts, tokenType *big.Int, tokenAddress common.Address, tokenID *big.Int, transferable bool, lockupSeconds *big.Int, cooldownSeconds *big.Int) (*types.Transaction, error) { - return _Staker.contract.Transact(opts, "createPool", tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds) +// Solidity: function createPool(uint256 tokenType, address tokenAddress, uint256 tokenID, bool transferable, uint256 lockupSeconds, uint256 cooldownSeconds, address administrator) returns() +func (_Staker *StakerTransactor) CreatePool(opts *bind.TransactOpts, tokenType *big.Int, tokenAddress common.Address, tokenID *big.Int, transferable bool, lockupSeconds *big.Int, cooldownSeconds *big.Int, administrator common.Address) (*types.Transaction, error) { + return _Staker.contract.Transact(opts, "createPool", tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds, administrator) } -// CreatePool is a paid mutator transaction binding the contract method 0x911e476c. +// CreatePool is a paid mutator transaction binding the contract method 0xdf44bf76. // -// Solidity: function createPool(uint256 tokenType, address tokenAddress, uint256 tokenID, bool transferable, uint256 lockupSeconds, uint256 cooldownSeconds) returns() -func (_Staker *StakerSession) CreatePool(tokenType *big.Int, tokenAddress common.Address, tokenID *big.Int, transferable bool, lockupSeconds *big.Int, cooldownSeconds *big.Int) (*types.Transaction, error) { - return _Staker.Contract.CreatePool(&_Staker.TransactOpts, tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds) +// Solidity: function createPool(uint256 tokenType, address tokenAddress, uint256 tokenID, bool transferable, uint256 lockupSeconds, uint256 cooldownSeconds, address administrator) returns() +func (_Staker *StakerSession) CreatePool(tokenType *big.Int, tokenAddress common.Address, tokenID *big.Int, transferable bool, lockupSeconds *big.Int, cooldownSeconds *big.Int, administrator common.Address) (*types.Transaction, error) { + return _Staker.Contract.CreatePool(&_Staker.TransactOpts, tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds, administrator) } -// CreatePool is a paid mutator transaction binding the contract method 0x911e476c. +// CreatePool is a paid mutator transaction binding the contract method 0xdf44bf76. // -// Solidity: function createPool(uint256 tokenType, address tokenAddress, uint256 tokenID, bool transferable, uint256 lockupSeconds, uint256 cooldownSeconds) returns() -func (_Staker *StakerTransactorSession) CreatePool(tokenType *big.Int, tokenAddress common.Address, tokenID *big.Int, transferable bool, lockupSeconds *big.Int, cooldownSeconds *big.Int) (*types.Transaction, error) { - return _Staker.Contract.CreatePool(&_Staker.TransactOpts, tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds) +// Solidity: function createPool(uint256 tokenType, address tokenAddress, uint256 tokenID, bool transferable, uint256 lockupSeconds, uint256 cooldownSeconds, address administrator) returns() +func (_Staker *StakerTransactorSession) CreatePool(tokenType *big.Int, tokenAddress common.Address, tokenID *big.Int, transferable bool, lockupSeconds *big.Int, cooldownSeconds *big.Int, administrator common.Address) (*types.Transaction, error) { + return _Staker.Contract.CreatePool(&_Staker.TransactOpts, tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds, administrator) } // InitiateUnstake is a paid mutator transaction binding the contract method 0xae5ac921. @@ -1150,88 +1160,88 @@ func (_Staker *StakerTransactorSession) SetApprovalForAll(operator common.Addres return _Staker.Contract.SetApprovalForAll(&_Staker.TransactOpts, operator, approved) } -// StakeERC1155 is a paid mutator transaction binding the contract method 0x6fafa1e9. +// StakeERC1155 is a paid mutator transaction binding the contract method 0xb0fe4a7e. // -// Solidity: function stakeERC1155(uint256 poolID, uint256 amount) returns(uint256 positionTokenID) -func (_Staker *StakerTransactor) StakeERC1155(opts *bind.TransactOpts, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { - return _Staker.contract.Transact(opts, "stakeERC1155", poolID, amount) +// Solidity: function stakeERC1155(address positionHolder, uint256 poolID, uint256 amount) returns(uint256 positionTokenID) +func (_Staker *StakerTransactor) StakeERC1155(opts *bind.TransactOpts, positionHolder common.Address, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { + return _Staker.contract.Transact(opts, "stakeERC1155", positionHolder, poolID, amount) } -// StakeERC1155 is a paid mutator transaction binding the contract method 0x6fafa1e9. +// StakeERC1155 is a paid mutator transaction binding the contract method 0xb0fe4a7e. // -// Solidity: function stakeERC1155(uint256 poolID, uint256 amount) returns(uint256 positionTokenID) -func (_Staker *StakerSession) StakeERC1155(poolID *big.Int, amount *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeERC1155(&_Staker.TransactOpts, poolID, amount) +// Solidity: function stakeERC1155(address positionHolder, uint256 poolID, uint256 amount) returns(uint256 positionTokenID) +func (_Staker *StakerSession) StakeERC1155(positionHolder common.Address, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeERC1155(&_Staker.TransactOpts, positionHolder, poolID, amount) } -// StakeERC1155 is a paid mutator transaction binding the contract method 0x6fafa1e9. +// StakeERC1155 is a paid mutator transaction binding the contract method 0xb0fe4a7e. // -// Solidity: function stakeERC1155(uint256 poolID, uint256 amount) returns(uint256 positionTokenID) -func (_Staker *StakerTransactorSession) StakeERC1155(poolID *big.Int, amount *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeERC1155(&_Staker.TransactOpts, poolID, amount) +// Solidity: function stakeERC1155(address positionHolder, uint256 poolID, uint256 amount) returns(uint256 positionTokenID) +func (_Staker *StakerTransactorSession) StakeERC1155(positionHolder common.Address, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeERC1155(&_Staker.TransactOpts, positionHolder, poolID, amount) } -// StakeERC20 is a paid mutator transaction binding the contract method 0x37d9e9cc. +// StakeERC20 is a paid mutator transaction binding the contract method 0x8d4a9e85. // -// Solidity: function stakeERC20(uint256 poolID, uint256 amount) returns(uint256 positionTokenID) -func (_Staker *StakerTransactor) StakeERC20(opts *bind.TransactOpts, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { - return _Staker.contract.Transact(opts, "stakeERC20", poolID, amount) +// Solidity: function stakeERC20(address positionHolder, uint256 poolID, uint256 amount) returns(uint256 positionTokenID) +func (_Staker *StakerTransactor) StakeERC20(opts *bind.TransactOpts, positionHolder common.Address, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { + return _Staker.contract.Transact(opts, "stakeERC20", positionHolder, poolID, amount) } -// StakeERC20 is a paid mutator transaction binding the contract method 0x37d9e9cc. +// StakeERC20 is a paid mutator transaction binding the contract method 0x8d4a9e85. // -// Solidity: function stakeERC20(uint256 poolID, uint256 amount) returns(uint256 positionTokenID) -func (_Staker *StakerSession) StakeERC20(poolID *big.Int, amount *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeERC20(&_Staker.TransactOpts, poolID, amount) +// Solidity: function stakeERC20(address positionHolder, uint256 poolID, uint256 amount) returns(uint256 positionTokenID) +func (_Staker *StakerSession) StakeERC20(positionHolder common.Address, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeERC20(&_Staker.TransactOpts, positionHolder, poolID, amount) } -// StakeERC20 is a paid mutator transaction binding the contract method 0x37d9e9cc. +// StakeERC20 is a paid mutator transaction binding the contract method 0x8d4a9e85. // -// Solidity: function stakeERC20(uint256 poolID, uint256 amount) returns(uint256 positionTokenID) -func (_Staker *StakerTransactorSession) StakeERC20(poolID *big.Int, amount *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeERC20(&_Staker.TransactOpts, poolID, amount) +// Solidity: function stakeERC20(address positionHolder, uint256 poolID, uint256 amount) returns(uint256 positionTokenID) +func (_Staker *StakerTransactorSession) StakeERC20(positionHolder common.Address, poolID *big.Int, amount *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeERC20(&_Staker.TransactOpts, positionHolder, poolID, amount) } -// StakeERC721 is a paid mutator transaction binding the contract method 0xb2db30e9. +// StakeERC721 is a paid mutator transaction binding the contract method 0x621519c0. // -// Solidity: function stakeERC721(uint256 poolID, uint256 tokenID) returns(uint256 positionTokenID) -func (_Staker *StakerTransactor) StakeERC721(opts *bind.TransactOpts, poolID *big.Int, tokenID *big.Int) (*types.Transaction, error) { - return _Staker.contract.Transact(opts, "stakeERC721", poolID, tokenID) +// Solidity: function stakeERC721(address positionHolder, uint256 poolID, uint256 tokenID) returns(uint256 positionTokenID) +func (_Staker *StakerTransactor) StakeERC721(opts *bind.TransactOpts, positionHolder common.Address, poolID *big.Int, tokenID *big.Int) (*types.Transaction, error) { + return _Staker.contract.Transact(opts, "stakeERC721", positionHolder, poolID, tokenID) } -// StakeERC721 is a paid mutator transaction binding the contract method 0xb2db30e9. +// StakeERC721 is a paid mutator transaction binding the contract method 0x621519c0. // -// Solidity: function stakeERC721(uint256 poolID, uint256 tokenID) returns(uint256 positionTokenID) -func (_Staker *StakerSession) StakeERC721(poolID *big.Int, tokenID *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeERC721(&_Staker.TransactOpts, poolID, tokenID) +// Solidity: function stakeERC721(address positionHolder, uint256 poolID, uint256 tokenID) returns(uint256 positionTokenID) +func (_Staker *StakerSession) StakeERC721(positionHolder common.Address, poolID *big.Int, tokenID *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeERC721(&_Staker.TransactOpts, positionHolder, poolID, tokenID) } -// StakeERC721 is a paid mutator transaction binding the contract method 0xb2db30e9. +// StakeERC721 is a paid mutator transaction binding the contract method 0x621519c0. // -// Solidity: function stakeERC721(uint256 poolID, uint256 tokenID) returns(uint256 positionTokenID) -func (_Staker *StakerTransactorSession) StakeERC721(poolID *big.Int, tokenID *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeERC721(&_Staker.TransactOpts, poolID, tokenID) +// Solidity: function stakeERC721(address positionHolder, uint256 poolID, uint256 tokenID) returns(uint256 positionTokenID) +func (_Staker *StakerTransactorSession) StakeERC721(positionHolder common.Address, poolID *big.Int, tokenID *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeERC721(&_Staker.TransactOpts, positionHolder, poolID, tokenID) } -// StakeNative is a paid mutator transaction binding the contract method 0xe63c6bf0. +// StakeNative is a paid mutator transaction binding the contract method 0xa1ed8fef. // -// Solidity: function stakeNative(uint256 poolID) payable returns(uint256 positionTokenID) -func (_Staker *StakerTransactor) StakeNative(opts *bind.TransactOpts, poolID *big.Int) (*types.Transaction, error) { - return _Staker.contract.Transact(opts, "stakeNative", poolID) +// Solidity: function stakeNative(address positionHolder, uint256 poolID) payable returns(uint256 positionTokenID) +func (_Staker *StakerTransactor) StakeNative(opts *bind.TransactOpts, positionHolder common.Address, poolID *big.Int) (*types.Transaction, error) { + return _Staker.contract.Transact(opts, "stakeNative", positionHolder, poolID) } -// StakeNative is a paid mutator transaction binding the contract method 0xe63c6bf0. +// StakeNative is a paid mutator transaction binding the contract method 0xa1ed8fef. // -// Solidity: function stakeNative(uint256 poolID) payable returns(uint256 positionTokenID) -func (_Staker *StakerSession) StakeNative(poolID *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeNative(&_Staker.TransactOpts, poolID) +// Solidity: function stakeNative(address positionHolder, uint256 poolID) payable returns(uint256 positionTokenID) +func (_Staker *StakerSession) StakeNative(positionHolder common.Address, poolID *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeNative(&_Staker.TransactOpts, positionHolder, poolID) } -// StakeNative is a paid mutator transaction binding the contract method 0xe63c6bf0. +// StakeNative is a paid mutator transaction binding the contract method 0xa1ed8fef. // -// Solidity: function stakeNative(uint256 poolID) payable returns(uint256 positionTokenID) -func (_Staker *StakerTransactorSession) StakeNative(poolID *big.Int) (*types.Transaction, error) { - return _Staker.Contract.StakeNative(&_Staker.TransactOpts, poolID) +// Solidity: function stakeNative(address positionHolder, uint256 poolID) payable returns(uint256 positionTokenID) +func (_Staker *StakerTransactorSession) StakeNative(positionHolder common.Address, poolID *big.Int) (*types.Transaction, error) { + return _Staker.Contract.StakeNative(&_Staker.TransactOpts, positionHolder, poolID) } // TransferFrom is a paid mutator transaction binding the contract method 0x23b872dd. @@ -2575,6 +2585,11 @@ func CreateStakerDeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int var positionMetadata common.Address var positionMetadataRaw string @@ -2587,6 +2602,70 @@ func CreateStakerDeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if positionMetadataRaw == "" { return fmt.Errorf("--position-metadata argument not specified") } else if !common.IsHexAddress(positionMetadataRaw) { @@ -2621,6 +2700,44 @@ func CreateStakerDeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateStakerDeployBytecode( + positionMetadata, + ) + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployStaker( transactionOpts, client, @@ -2671,12 +2788,38 @@ func CreateStakerDeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&positionMetadataRaw, "position-metadata", "", "position-metadata argument (common.Address)") return cmd } +func generateStakerDeployBytecode( + positionMetadata common.Address, +) ([]byte, error) { + abiPacked, err := StakerMetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("", + positionMetadata, + ) + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(StakerMetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateBalanceOfCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -4496,11 +4639,14 @@ func CreateTotalSupplyCommand() *cobra.Command { } func CreateApproveCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var to0 common.Address var to0Raw string @@ -4511,10 +4657,6 @@ func CreateApproveCommand() *cobra.Command { Use: "approve", Short: "Execute the Approve method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -4522,6 +4664,48 @@ func CreateApproveCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if to0Raw == "" { return fmt.Errorf("--to-0 argument not specified") } else if !common.IsHexAddress(to0Raw) { @@ -4572,12 +4756,49 @@ func CreateApproveCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Approve( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "approve" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + to0, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Approve( + to0, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -4623,6 +4844,11 @@ func CreateApproveCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") cmd.Flags().StringVar(&tokenIdRaw, "token-id", "", "token-id argument") @@ -4630,11 +4856,14 @@ func CreateApproveCommand() *cobra.Command { return cmd } func CreateCreatePoolCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var tokenType *big.Int var tokenTypeRaw string @@ -4648,15 +4877,13 @@ func CreateCreatePoolCommand() *cobra.Command { var lockupSecondsRaw string var cooldownSeconds *big.Int var cooldownSecondsRaw string + var administrator common.Address + var administratorRaw string cmd := &cobra.Command{ Use: "create-pool", Short: "Execute the CreatePool method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -4664,6 +4891,48 @@ func CreateCreatePoolCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if tokenTypeRaw == "" { return fmt.Errorf("--token-type argument not specified") } @@ -4705,6 +4974,13 @@ func CreateCreatePoolCommand() *cobra.Command { cooldownSeconds = new(big.Int) cooldownSeconds.SetString(cooldownSecondsRaw, 0) + if administratorRaw == "" { + return fmt.Errorf("--administrator argument not specified") + } else if !common.IsHexAddress(administratorRaw) { + return fmt.Errorf("--administrator argument is not a valid Ethereum address") + } + administrator = common.HexToAddress(administratorRaw) + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -4742,16 +5018,59 @@ func CreateCreatePoolCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.CreatePool( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "createPool" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + tokenType, + tokenAddress, + tokenID, + transferable, + lockupSeconds, + cooldownSeconds, + administrator, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.CreatePool( + tokenType, tokenAddress, tokenID, transferable, lockupSeconds, cooldownSeconds, + administrator, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -4797,6 +5116,11 @@ func CreateCreatePoolCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenTypeRaw, "token-type", "", "token-type argument") cmd.Flags().StringVar(&tokenAddressRaw, "token-address", "", "token-address argument (common.Address)") @@ -4804,15 +5128,19 @@ func CreateCreatePoolCommand() *cobra.Command { cmd.Flags().StringVar(&transferableRaw, "transferable", "", "transferable argument (true, t, y, yes, 1 OR false, f, n, no, 0)") cmd.Flags().StringVar(&lockupSecondsRaw, "lockup-seconds", "", "lockup-seconds argument") cmd.Flags().StringVar(&cooldownSecondsRaw, "cooldown-seconds", "", "cooldown-seconds argument") + cmd.Flags().StringVar(&administratorRaw, "administrator", "", "administrator argument (common.Address)") return cmd } func CreateInitiateUnstakeCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var positionTokenID *big.Int var positionTokenIDRaw string @@ -4821,10 +5149,6 @@ func CreateInitiateUnstakeCommand() *cobra.Command { Use: "initiate-unstake", Short: "Execute the InitiateUnstake method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -4832,6 +5156,48 @@ func CreateInitiateUnstakeCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if positionTokenIDRaw == "" { return fmt.Errorf("--position-token-id argument not specified") } @@ -4875,11 +5241,47 @@ func CreateInitiateUnstakeCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.InitiateUnstake( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "initiateUnstake" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + positionTokenID, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.InitiateUnstake( + positionTokenID, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -4925,17 +5327,25 @@ func CreateInitiateUnstakeCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&positionTokenIDRaw, "position-token-id", "", "position-token-id argument") return cmd } func CreateSafeTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -4948,10 +5358,6 @@ func CreateSafeTransferFromCommand() *cobra.Command { Use: "safe-transfer-from", Short: "Execute the SafeTransferFrom method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -4959,6 +5365,48 @@ func CreateSafeTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -5016,13 +5464,51 @@ func CreateSafeTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SafeTransferFrom( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "safeTransferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SafeTransferFrom( + from0, to0, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5068,6 +5554,11 @@ func CreateSafeTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -5076,11 +5567,14 @@ func CreateSafeTransferFromCommand() *cobra.Command { return cmd } func CreateSafeTransferFrom0Command() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -5095,10 +5589,6 @@ func CreateSafeTransferFrom0Command() *cobra.Command { Use: "safe-transfer-from-0", Short: "Execute the SafeTransferFrom0 method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5106,6 +5596,48 @@ func CreateSafeTransferFrom0Command() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -5173,14 +5705,53 @@ func CreateSafeTransferFrom0Command() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SafeTransferFrom0( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "safeTransferFrom0" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + tokenId, + data, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SafeTransferFrom0( + from0, to0, tokenId, data, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5226,6 +5797,11 @@ func CreateSafeTransferFrom0Command() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -5235,11 +5811,14 @@ func CreateSafeTransferFrom0Command() *cobra.Command { return cmd } func CreateSetApprovalForAllCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var operator common.Address var operatorRaw string @@ -5250,10 +5829,6 @@ func CreateSetApprovalForAllCommand() *cobra.Command { Use: "set-approval-for-all", Short: "Execute the SetApprovalForAll method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5261,6 +5836,48 @@ func CreateSetApprovalForAllCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if operatorRaw == "" { return fmt.Errorf("--operator argument not specified") } else if !common.IsHexAddress(operatorRaw) { @@ -5315,12 +5932,49 @@ func CreateSetApprovalForAllCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetApprovalForAll( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setApprovalForAll" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + operator, + approved, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetApprovalForAll( + operator, approved, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5366,6 +6020,11 @@ func CreateSetApprovalForAllCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&operatorRaw, "operator", "", "operator argument (common.Address)") cmd.Flags().StringVar(&approvedRaw, "approved", "", "approved argument (true, t, y, yes, 1 OR false, f, n, no, 0)") @@ -5373,12 +6032,17 @@ func CreateSetApprovalForAllCommand() *cobra.Command { return cmd } func CreateStakeErc1155Command() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + var positionHolder common.Address + var positionHolderRaw string var poolID *big.Int var poolIDRaw string var amount *big.Int @@ -5388,10 +6052,6 @@ func CreateStakeErc1155Command() *cobra.Command { Use: "stake-erc-1155", Short: "Execute the StakeERC1155 method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5399,22 +6059,71 @@ func CreateStakeErc1155Command() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) - if poolIDRaw == "" { - return fmt.Errorf("--pool-id argument not specified") + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } - poolID = new(big.Int) - poolID.SetString(poolIDRaw, 0) - if amountRaw == "" { - return fmt.Errorf("--amount argument not specified") + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") } - amount = new(big.Int) - amount.SetString(amountRaw, 0) - return nil - }, - RunE: func(cmd *cobra.Command, args []string) error { - client, clientErr := NewClient(rpc) + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if positionHolderRaw == "" { + return fmt.Errorf("--position-holder argument not specified") + } else if !common.IsHexAddress(positionHolderRaw) { + return fmt.Errorf("--position-holder argument is not a valid Ethereum address") + } + positionHolder = common.HexToAddress(positionHolderRaw) + + if poolIDRaw == "" { + return fmt.Errorf("--pool-id argument not specified") + } + poolID = new(big.Int) + poolID.SetString(poolIDRaw, 0) + + if amountRaw == "" { + return fmt.Errorf("--amount argument not specified") + } + amount = new(big.Int) + amount.SetString(amountRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := NewClient(rpc) if clientErr != nil { return clientErr } @@ -5448,12 +6157,51 @@ func CreateStakeErc1155Command() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.StakeERC1155( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "stakeErc1155" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + positionHolder, + poolID, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.StakeERC1155( + + positionHolder, poolID, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5499,19 +6247,30 @@ func CreateStakeErc1155Command() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + cmd.Flags().StringVar(&positionHolderRaw, "position-holder", "", "position-holder argument (common.Address)") cmd.Flags().StringVar(&poolIDRaw, "pool-id", "", "pool-id argument") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") return cmd } func CreateStakeErc20Command() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + var positionHolder common.Address + var positionHolderRaw string var poolID *big.Int var poolIDRaw string var amount *big.Int @@ -5521,10 +6280,6 @@ func CreateStakeErc20Command() *cobra.Command { Use: "stake-erc-20", Short: "Execute the StakeERC20 method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5532,6 +6287,55 @@ func CreateStakeErc20Command() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if positionHolderRaw == "" { + return fmt.Errorf("--position-holder argument not specified") + } else if !common.IsHexAddress(positionHolderRaw) { + return fmt.Errorf("--position-holder argument is not a valid Ethereum address") + } + positionHolder = common.HexToAddress(positionHolderRaw) + if poolIDRaw == "" { return fmt.Errorf("--pool-id argument not specified") } @@ -5581,12 +6385,51 @@ func CreateStakeErc20Command() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.StakeERC20( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "stakeErc20" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + positionHolder, + poolID, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.StakeERC20( + + positionHolder, poolID, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5632,19 +6475,30 @@ func CreateStakeErc20Command() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + cmd.Flags().StringVar(&positionHolderRaw, "position-holder", "", "position-holder argument (common.Address)") cmd.Flags().StringVar(&poolIDRaw, "pool-id", "", "pool-id argument") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") return cmd } func CreateStakeErc721Command() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + var positionHolder common.Address + var positionHolderRaw string var poolID *big.Int var poolIDRaw string var tokenID *big.Int @@ -5654,10 +6508,6 @@ func CreateStakeErc721Command() *cobra.Command { Use: "stake-erc-721", Short: "Execute the StakeERC721 method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5665,6 +6515,55 @@ func CreateStakeErc721Command() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if positionHolderRaw == "" { + return fmt.Errorf("--position-holder argument not specified") + } else if !common.IsHexAddress(positionHolderRaw) { + return fmt.Errorf("--position-holder argument is not a valid Ethereum address") + } + positionHolder = common.HexToAddress(positionHolderRaw) + if poolIDRaw == "" { return fmt.Errorf("--pool-id argument not specified") } @@ -5714,12 +6613,51 @@ func CreateStakeErc721Command() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.StakeERC721( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "stakeErc721" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + positionHolder, + poolID, + tokenID, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.StakeERC721( + + positionHolder, poolID, tokenID, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5765,19 +6703,30 @@ func CreateStakeErc721Command() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + cmd.Flags().StringVar(&positionHolderRaw, "position-holder", "", "position-holder argument (common.Address)") cmd.Flags().StringVar(&poolIDRaw, "pool-id", "", "pool-id argument") cmd.Flags().StringVar(&tokenIDRaw, "token-id", "", "token-id argument") return cmd } func CreateStakeNativeCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int + var positionHolder common.Address + var positionHolderRaw string var poolID *big.Int var poolIDRaw string @@ -5785,10 +6734,6 @@ func CreateStakeNativeCommand() *cobra.Command { Use: "stake-native", Short: "Execute the StakeNative method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5796,6 +6741,55 @@ func CreateStakeNativeCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + + if positionHolderRaw == "" { + return fmt.Errorf("--position-holder argument not specified") + } else if !common.IsHexAddress(positionHolderRaw) { + return fmt.Errorf("--position-holder argument is not a valid Ethereum address") + } + positionHolder = common.HexToAddress(positionHolderRaw) + if poolIDRaw == "" { return fmt.Errorf("--pool-id argument not specified") } @@ -5839,11 +6833,49 @@ func CreateStakeNativeCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.StakeNative( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "stakeNative" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + positionHolder, + poolID, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.StakeNative( + + positionHolder, poolID, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -5889,17 +6921,26 @@ func CreateStakeNativeCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") + cmd.Flags().StringVar(&positionHolderRaw, "position-holder", "", "position-holder argument (common.Address)") cmd.Flags().StringVar(&poolIDRaw, "pool-id", "", "pool-id argument") return cmd } func CreateTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -5912,10 +6953,6 @@ func CreateTransferFromCommand() *cobra.Command { Use: "transfer-from", Short: "Execute the TransferFrom method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -5923,6 +6960,48 @@ func CreateTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -5980,13 +7059,51 @@ func CreateTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferFrom( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + tokenId, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferFrom( + from0, to0, tokenId, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -6032,6 +7149,11 @@ func CreateTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -6040,11 +7162,14 @@ func CreateTransferFromCommand() *cobra.Command { return cmd } func CreateTransferPoolAdministrationCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var poolID *big.Int var poolIDRaw string @@ -6055,10 +7180,6 @@ func CreateTransferPoolAdministrationCommand() *cobra.Command { Use: "transfer-pool-administration", Short: "Execute the TransferPoolAdministration method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -6066,6 +7187,48 @@ func CreateTransferPoolAdministrationCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if poolIDRaw == "" { return fmt.Errorf("--pool-id argument not specified") } @@ -6116,12 +7279,49 @@ func CreateTransferPoolAdministrationCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferPoolAdministration( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferPoolAdministration" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + poolID, + newAdministrator, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferPoolAdministration( + poolID, newAdministrator, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -6167,6 +7367,11 @@ func CreateTransferPoolAdministrationCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&poolIDRaw, "pool-id", "", "pool-id argument") cmd.Flags().StringVar(&newAdministratorRaw, "new-administrator", "", "new-administrator argument (common.Address)") @@ -6174,11 +7379,14 @@ func CreateTransferPoolAdministrationCommand() *cobra.Command { return cmd } func CreateUnstakeCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var positionTokenID *big.Int var positionTokenIDRaw string @@ -6187,10 +7395,6 @@ func CreateUnstakeCommand() *cobra.Command { Use: "unstake", Short: "Execute the Unstake method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -6198,6 +7402,48 @@ func CreateUnstakeCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if positionTokenIDRaw == "" { return fmt.Errorf("--position-token-id argument not specified") } @@ -6241,11 +7487,47 @@ func CreateUnstakeCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Unstake( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "unstake" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + positionTokenID, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Unstake( + positionTokenID, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -6291,17 +7573,25 @@ func CreateUnstakeCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&positionTokenIDRaw, "position-token-id", "", "position-token-id argument") return cmd } func CreateUpdatePoolConfigurationCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var poolID *big.Int var poolIDRaw string @@ -6322,10 +7612,6 @@ func CreateUpdatePoolConfigurationCommand() *cobra.Command { Use: "update-pool-configuration", Short: "Execute the UpdatePoolConfiguration method on a Staker contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -6333,6 +7619,48 @@ func CreateUpdatePoolConfigurationCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if poolIDRaw == "" { return fmt.Errorf("--pool-id argument not specified") } @@ -6428,7 +7756,49 @@ func CreateUpdatePoolConfigurationCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.UpdatePoolConfiguration( + if safeAddress != "" { + abi, err := StakerMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "updatePoolConfiguration" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + poolID, + changeTransferability, + transferable, + changeLockup, + lockupSeconds, + changeCooldown, + cooldownSeconds, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.UpdatePoolConfiguration( + poolID, changeTransferability, transferable, @@ -6437,8 +7807,8 @@ func CreateUpdatePoolConfigurationCommand() *cobra.Command { changeCooldown, cooldownSeconds, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -6484,6 +7854,11 @@ func CreateUpdatePoolConfigurationCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&poolIDRaw, "pool-id", "", "pool-id argument") cmd.Flags().StringVar(&changeTransferabilityRaw, "change-transferability", "", "change-transferability argument (true, t, y, yes, 1 OR false, f, n, no, 0)") @@ -6748,3 +8123,220 @@ func CreateStakerCommand() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/TokenFaucet/TokenFaucet.go b/bindings/TokenFaucet/TokenFaucet.go index 1461aa5b..25e92f97 100644 --- a/bindings/TokenFaucet/TokenFaucet.go +++ b/bindings/TokenFaucet/TokenFaucet.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package TokenFaucet --cli --struct TokenFaucet --output bindings/TokenFaucet/TokenFaucet.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package TokenFaucet import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // TokenFaucetMetaData contains all meta data concerning the TokenFaucet contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// TokenFaucetMetaData contains all meta data concerning the TokenFaucet contract. var TokenFaucetMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_inboxAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_faucetAmount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_faucetTimeInterval\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenFaucetClaimIntervalNotPassed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEFAULT_GAS_LIMIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimL3\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"faucetAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"faucetTimeInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inboxAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastClaimedL2Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastClaimedL3Timestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"rescueTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_faucetAmount\",\"type\":\"uint256\"}],\"name\":\"setFaucetAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_faucetTimeInterval\",\"type\":\"uint256\"}],\"name\":\"setFaucetTimeInterval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_inboxAddress\",\"type\":\"address\"}],\"name\":\"setInboxAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"}],\"name\":\"setTokenAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokenAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60806040526152086005553480156200001757600080fd5b50604051620014033803806200140383398181016040528101906200003d919062000446565b83600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000b35760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620000aa9190620004df565b60405180910390fd5b620000c4816200017160201b60201c565b5084600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816003819055508060048190555062000166846200023560201b60201c565b5050505050620004fc565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000245620002ce60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620002ba5760006040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401620002b19190620004df565b60405180910390fd5b620002cb816200017160201b60201c565b50565b620002de6200037060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003046200037860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200036e57620003306200037060201b60201c565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401620003659190620004df565b60405180910390fd5b565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003d382620003a6565b9050919050565b620003e581620003c6565b8114620003f157600080fd5b50565b6000815190506200040581620003da565b92915050565b6000819050919050565b62000420816200040b565b81146200042c57600080fd5b50565b600081519050620004408162000415565b92915050565b600080600080600060a08688031215620004655762000464620003a1565b5b60006200047588828901620003f4565b95505060206200048888828901620003f4565b94505060406200049b88828901620003f4565b9350506060620004ae888289016200042f565b9250506080620004c1888289016200042f565b9150509295509295909350565b620004d981620003c6565b82525050565b6000602082019050620004f66000830184620004ce565b92915050565b610ef7806200050c6000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80638da5cb5b116100a2578063b8dbe3f511610071578063b8dbe3f51461025a578063cdffca3a14610278578063cea9d26f14610294578063d6be695a146102b0578063f2fde38b146102ce5761010b565b80638da5cb5b146101e25780639c281430146102005780639d76ea581461021e578063a42532ad1461023c5761010b565b8063706bb59a116100de578063706bb59a14610182578063715018a61461018c57806371559c751461019657806381d2fd9c146101c65761010b565b8063020c324e1461011057806326a4e8d21461012c57806331c32cbe146101485780634e71d92d14610178575b600080fd5b61012a60048036038101906101259190610adf565b6102ea565b005b61014660048036038101906101419190610b6a565b6102fc565b005b610162600480360381019061015d9190610b6a565b610348565b60405161016f9190610ba6565b60405180910390f35b610180610360565b005b61018a6104ce565b005b61019461072e565b005b6101b060048036038101906101ab9190610b6a565b610742565b6040516101bd9190610ba6565b60405180910390f35b6101e060048036038101906101db9190610adf565b61075a565b005b6101ea61076c565b6040516101f79190610bd0565b60405180910390f35b610208610795565b6040516102159190610ba6565b60405180910390f35b61022661079b565b6040516102339190610bd0565b60405180910390f35b6102446107c1565b6040516102519190610ba6565b60405180910390f35b6102626107c7565b60405161026f9190610bd0565b60405180910390f35b610292600480360381019061028d9190610b6a565b6107ed565b005b6102ae60048036038101906102a99190610beb565b610839565b005b6102b86108c5565b6040516102c59190610ba6565b60405180910390f35b6102e860048036038101906102e39190610b6a565b6108cb565b005b6102f2610951565b8060048190555050565b610304610951565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60066020528060005260406000206000915090505481565b600454600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546103ad9190610c6d565b42116103e5576040517f6fab395900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb336003546040518363ffffffff1660e01b8152600401610444929190610ca1565b6020604051808303816000875af1158015610463573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104879190610d02565b5042600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550565b600454600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461051b9190610c6d565b4211610553576040517f6fab395900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600354486005546105669190610d2f565b6105709190610c6d565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b81526004016105f1929190610ca1565b6020604051808303816000875af1158015610610573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106349190610d02565b50600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663549e8426336003546000303060055448896040518963ffffffff1660e01b81526004016106a3989796959493929190610ded565b6020604051808303816000875af11580156106c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e69190610e94565b5042600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050565b610736610951565b61074060006109d8565b565b60076020528060005260406000206000915090505481565b610762610951565b8060038190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107f5610951565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610841610951565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b815260040161087c929190610ca1565b6020604051808303816000875af115801561089b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bf9190610d02565b50505050565b60055481565b6108d3610951565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109455760006040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260040161093c9190610bd0565b60405180910390fd5b61094e816109d8565b50565b610959610a9c565b73ffffffffffffffffffffffffffffffffffffffff1661097761076c565b73ffffffffffffffffffffffffffffffffffffffff16146109d65761099a610a9c565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016109cd9190610bd0565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b600080fd5b6000819050919050565b610abc81610aa9565b8114610ac757600080fd5b50565b600081359050610ad981610ab3565b92915050565b600060208284031215610af557610af4610aa4565b5b6000610b0384828501610aca565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b3782610b0c565b9050919050565b610b4781610b2c565b8114610b5257600080fd5b50565b600081359050610b6481610b3e565b92915050565b600060208284031215610b8057610b7f610aa4565b5b6000610b8e84828501610b55565b91505092915050565b610ba081610aa9565b82525050565b6000602082019050610bbb6000830184610b97565b92915050565b610bca81610b2c565b82525050565b6000602082019050610be56000830184610bc1565b92915050565b600080600060608486031215610c0457610c03610aa4565b5b6000610c1286828701610b55565b9350506020610c2386828701610b55565b9250506040610c3486828701610aca565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610c7882610aa9565b9150610c8383610aa9565b9250828201905080821115610c9b57610c9a610c3e565b5b92915050565b6000604082019050610cb66000830185610bc1565b610cc36020830184610b97565b9392505050565b60008115159050919050565b610cdf81610cca565b8114610cea57600080fd5b50565b600081519050610cfc81610cd6565b92915050565b600060208284031215610d1857610d17610aa4565b5b6000610d2684828501610ced565b91505092915050565b6000610d3a82610aa9565b9150610d4583610aa9565b9250828202610d5381610aa9565b91508282048414831517610d6a57610d69610c3e565b5b5092915050565b6000819050919050565b6000819050919050565b6000610da0610d9b610d9684610d71565b610d7b565b610aa9565b9050919050565b610db081610d85565b82525050565b600082825260208201905092915050565b50565b6000610dd7600083610db6565b9150610de282610dc7565b600082019050919050565b600061012082019050610e03600083018b610bc1565b610e10602083018a610b97565b610e1d6040830189610da7565b610e2a6060830188610bc1565b610e376080830187610bc1565b610e4460a0830186610b97565b610e5160c0830185610b97565b610e5e60e0830184610b97565b818103610100830152610e7081610dca565b90509998505050505050505050565b600081519050610e8e81610ab3565b92915050565b600060208284031215610eaa57610ea9610aa4565b5b6000610eb884828501610e7f565b9150509291505056fea26469706673582212200555a04cf750cbff9867921d44348548c3818b2d52ba4c525e518148579e736264736f6c63430008180033", + Bin: "0x608060405261520860055534801561001657600080fd5b5060405162000bba38038062000bba83398101604081905261003791610197565b836001600160a01b03811661006757604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610070816100be565b50600180546001600160a01b038088166001600160a01b0319928316179092556002805492861692909116919091179055600382905560048190556100b48461010e565b50505050506101ed565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61011661014c565b6001600160a01b03811661014057604051631e4fbdf760e01b81526000600482015260240161005e565b610149816100be565b50565b6000546001600160a01b031633146101795760405163118cdaa760e01b815233600482015260240161005e565b565b80516001600160a01b038116811461019257600080fd5b919050565b600080600080600060a086880312156101af57600080fd5b6101b88661017b565b94506101c66020870161017b565b93506101d46040870161017b565b6060870151608090970151959894975095949392505050565b6109bd80620001fd6000396000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c80638da5cb5b116100b2578063b8dbe3f511610081578063cea9d26f11610066578063cea9d26f1461026a578063d6be695a1461027d578063f2fde38b1461028657600080fd5b8063b8dbe3f514610237578063cdffca3a1461025757600080fd5b80638da5cb5b146101c65780639c281430146102055780639d76ea581461020e578063a42532ad1461022e57600080fd5b8063706bb59a116100ee578063706bb59a14610183578063715018a61461018b57806371559c751461019357806381d2fd9c146101b357600080fd5b8063020c324e1461012057806326a4e8d21461013557806331c32cbe146101485780634e71d92d1461017b575b600080fd5b61013361012e36600461084d565b610299565b005b61013361014336600461088f565b6102a6565b61016861015636600461088f565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b6101336102f5565b6101336103fe565b610133610605565b6101686101a136600461088f565b60076020526000908152604090205481565b6101336101c136600461084d565b610619565b60005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610172565b61016860035481565b6001546101e09073ffffffffffffffffffffffffffffffffffffffff1681565b61016860045481565b6002546101e09073ffffffffffffffffffffffffffffffffffffffff1681565b61013361026536600461088f565b610626565b6101336102783660046108b1565b610675565b61016860055481565b61013361029436600461088f565b61071c565b6102a1610785565b600455565b6102ae610785565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60045433600090815260066020526040902054610312919061091c565b421161034a576040517f6fab395900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001546003546040517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063a9059cbb906044016020604051808303816000875af11580156103c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103e99190610935565b50336000908152600660205260409020429055565b6004543360009081526007602052604090205461041b919061091c565b4211610453576040517f6fab395900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600354486005546104669190610957565b610470919061091c565b6001546002546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101849052929350169063095ea7b3906044016020604051808303816000875af11580156104ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105119190610935565b506002546003546005546040517f549e842600000000000000000000000000000000000000000000000000000000815233600482015260248101929092526000604483018190523060648401819052608484015260a48301919091524860c483015260e4820184905261012061010483015261012482015273ffffffffffffffffffffffffffffffffffffffff9091169063549e842690610144016020604051808303816000875af11580156105cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ef919061096e565b5050336000908152600760205260409020429055565b61060d610785565b61061760006107d8565b565b610621610785565b600355565b61062e610785565b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61067d610785565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156106f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107169190610935565b50505050565b610724610785565b73ffffffffffffffffffffffffffffffffffffffff8116610779576040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600060048201526024015b60405180910390fd5b610782816107d8565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610617576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610770565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561085f57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461088a57600080fd5b919050565b6000602082840312156108a157600080fd5b6108aa82610866565b9392505050565b6000806000606084860312156108c657600080fd5b6108cf84610866565b92506108dd60208501610866565b9150604084013590509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b8082018082111561092f5761092f6108ed565b92915050565b60006020828403121561094757600080fd5b815180151581146108aa57600080fd5b808202811582820484141761092f5761092f6108ed565b60006020828403121561098057600080fd5b505191905056fea2646970667358221220695d0ebba8bdc0aedf19cfe101419c324c0623b00f59f1ef5e00dc2e450da37664736f6c63430008180033", } // TokenFaucetABI is the input ABI used to generate the binding from. @@ -812,6 +822,11 @@ func CreateTokenFaucetDeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int var tokenAddress common.Address var tokenAddressRaw string @@ -832,6 +847,70 @@ func CreateTokenFaucetDeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if tokenAddressRaw == "" { return fmt.Errorf("--token-address argument not specified") } else if !common.IsHexAddress(tokenAddressRaw) { @@ -892,6 +971,48 @@ func CreateTokenFaucetDeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateTokenFaucetDeployBytecode( + tokenAddress, + owner, + inboxAddress, + faucetAmount, + faucetTimeInterval, + ) + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployTokenFaucet( transactionOpts, client, @@ -946,6 +1067,13 @@ func CreateTokenFaucetDeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenAddressRaw, "token-address", "", "token-address argument (common.Address)") cmd.Flags().StringVar(&ownerRaw, "owner", "", "owner argument (common.Address)") @@ -956,6 +1084,33 @@ func CreateTokenFaucetDeploymentCommand() *cobra.Command { return cmd } +func generateTokenFaucetDeployBytecode( + tokenAddress common.Address, + owner common.Address, + inboxAddress common.Address, + faucetAmount *big.Int, + faucetTimeInterval *big.Int, +) ([]byte, error) { + abiPacked, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("", + tokenAddress, + owner, + inboxAddress, + faucetAmount, + faucetTimeInterval, + ) + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(TokenFaucetMetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateDefaultgaslimitCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -1490,20 +1645,19 @@ func CreateTokenAddressCommand() *cobra.Command { } func CreateClaimCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int cmd := &cobra.Command{ Use: "claim", Short: "Execute the Claim method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1511,6 +1665,48 @@ func CreateClaimCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1548,9 +1744,43 @@ func CreateClaimCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Claim() - if transactionErr != nil { - return transactionErr + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "claim" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Claim() + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1596,24 +1826,28 @@ func CreateClaimCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } func CreateClaimL3Command() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int cmd := &cobra.Command{ Use: "claim-l-3", Short: "Execute the ClaimL3 method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1621,6 +1855,48 @@ func CreateClaimL3Command() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1658,9 +1934,43 @@ func CreateClaimL3Command() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.ClaimL3() - if transactionErr != nil { - return transactionErr + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "claimL3" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.ClaimL3() + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1706,24 +2016,28 @@ func CreateClaimL3Command() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } func CreateRenounceOwnershipCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int cmd := &cobra.Command{ Use: "renounce-ownership", Short: "Execute the RenounceOwnership method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1731,6 +2045,48 @@ func CreateRenounceOwnershipCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1768,9 +2124,43 @@ func CreateRenounceOwnershipCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.RenounceOwnership() - if transactionErr != nil { - return transactionErr + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "renounceOwnership" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.RenounceOwnership() + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1816,15 +2206,23 @@ func CreateRenounceOwnershipCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } func CreateRescueTokensCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var token common.Address var tokenRaw string @@ -1837,10 +2235,6 @@ func CreateRescueTokensCommand() *cobra.Command { Use: "rescue-tokens", Short: "Execute the RescueTokens method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1848,6 +2242,48 @@ func CreateRescueTokensCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if tokenRaw == "" { return fmt.Errorf("--token argument not specified") } else if !common.IsHexAddress(tokenRaw) { @@ -1905,13 +2341,51 @@ func CreateRescueTokensCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.RescueTokens( + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "rescueTokens" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + token, + _to0, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.RescueTokens( + token, _to0, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1957,6 +2431,11 @@ func CreateRescueTokensCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenRaw, "token", "", "token argument (common.Address)") cmd.Flags().StringVar(&_to0Raw, "-to-0", "", "-to-0 argument (common.Address)") @@ -1965,11 +2444,14 @@ func CreateRescueTokensCommand() *cobra.Command { return cmd } func CreateSetFaucetAmountCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var faucetAmount *big.Int var faucetAmountRaw string @@ -1978,10 +2460,6 @@ func CreateSetFaucetAmountCommand() *cobra.Command { Use: "set-faucet-amount", Short: "Execute the SetFaucetAmount method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1989,6 +2467,48 @@ func CreateSetFaucetAmountCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if faucetAmountRaw == "" { return fmt.Errorf("--faucet-amount argument not specified") } @@ -2032,11 +2552,47 @@ func CreateSetFaucetAmountCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetFaucetAmount( + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setFaucetAmount" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + faucetAmount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetFaucetAmount( + faucetAmount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2082,17 +2638,25 @@ func CreateSetFaucetAmountCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&faucetAmountRaw, "faucet-amount", "", "faucet-amount argument") return cmd } func CreateSetFaucetTimeIntervalCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var faucetTimeInterval *big.Int var faucetTimeIntervalRaw string @@ -2101,10 +2665,6 @@ func CreateSetFaucetTimeIntervalCommand() *cobra.Command { Use: "set-faucet-time-interval", Short: "Execute the SetFaucetTimeInterval method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2112,6 +2672,48 @@ func CreateSetFaucetTimeIntervalCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if faucetTimeIntervalRaw == "" { return fmt.Errorf("--faucet-time-interval argument not specified") } @@ -2155,11 +2757,47 @@ func CreateSetFaucetTimeIntervalCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetFaucetTimeInterval( + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setFaucetTimeInterval" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + faucetTimeInterval, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetFaucetTimeInterval( + faucetTimeInterval, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2205,17 +2843,25 @@ func CreateSetFaucetTimeIntervalCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&faucetTimeIntervalRaw, "faucet-time-interval", "", "faucet-time-interval argument") return cmd } func CreateSetInboxAddressCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var inboxAddress common.Address var inboxAddressRaw string @@ -2224,10 +2870,6 @@ func CreateSetInboxAddressCommand() *cobra.Command { Use: "set-inbox-address", Short: "Execute the SetInboxAddress method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2235,6 +2877,48 @@ func CreateSetInboxAddressCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if inboxAddressRaw == "" { return fmt.Errorf("--inbox-address argument not specified") } else if !common.IsHexAddress(inboxAddressRaw) { @@ -2279,11 +2963,47 @@ func CreateSetInboxAddressCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetInboxAddress( + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setInboxAddress" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + inboxAddress, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetInboxAddress( + inboxAddress, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2329,17 +3049,25 @@ func CreateSetInboxAddressCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&inboxAddressRaw, "inbox-address", "", "inbox-address argument (common.Address)") return cmd } func CreateSetTokenAddressCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var tokenAddress common.Address var tokenAddressRaw string @@ -2348,10 +3076,6 @@ func CreateSetTokenAddressCommand() *cobra.Command { Use: "set-token-address", Short: "Execute the SetTokenAddress method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2359,6 +3083,48 @@ func CreateSetTokenAddressCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if tokenAddressRaw == "" { return fmt.Errorf("--token-address argument not specified") } else if !common.IsHexAddress(tokenAddressRaw) { @@ -2403,11 +3169,47 @@ func CreateSetTokenAddressCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.SetTokenAddress( + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "setTokenAddress" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + tokenAddress, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.SetTokenAddress( + tokenAddress, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2453,17 +3255,25 @@ func CreateSetTokenAddressCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenAddressRaw, "token-address", "", "token-address argument (common.Address)") return cmd } func CreateTransferOwnershipCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var newOwner common.Address var newOwnerRaw string @@ -2472,10 +3282,6 @@ func CreateTransferOwnershipCommand() *cobra.Command { Use: "transfer-ownership", Short: "Execute the TransferOwnership method on a TokenFaucet contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2483,6 +3289,48 @@ func CreateTransferOwnershipCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if newOwnerRaw == "" { return fmt.Errorf("--new-owner argument not specified") } else if !common.IsHexAddress(newOwnerRaw) { @@ -2527,11 +3375,47 @@ func CreateTransferOwnershipCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferOwnership( + if safeAddress != "" { + abi, err := TokenFaucetMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferOwnership" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + newOwner, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferOwnership( + newOwner, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2577,6 +3461,11 @@ func CreateTransferOwnershipCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&newOwnerRaw, "new-owner", "", "new-owner argument (common.Address)") @@ -2772,3 +3661,220 @@ func CreateTokenFaucetCommand() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/TokenSender/TokenSender.go b/bindings/TokenSender/TokenSender.go index 3e8ae2f2..131fde2b 100644 --- a/bindings/TokenSender/TokenSender.go +++ b/bindings/TokenSender/TokenSender.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package TokenSender --cli --struct TokenSender --output bindings/TokenSender/TokenSender.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package TokenSender import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // TokenSenderMetaData contains all meta data concerning the TokenSender contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// TokenSenderMetaData contains all meta data concerning the TokenSender contract. var TokenSenderMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_faucetTimeInterval\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"TokenSenderClaimIntervalNotPassed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"TokensSent\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"faucetTimeInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastSentTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"}],\"name\":\"send\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561001057600080fd5b5060405161049b38038061049b8339818101604052810190610032919061007a565b80600081905550506100a7565b600080fd5b6000819050919050565b61005781610044565b811461006257600080fd5b50565b6000815190506100748161004e565b92915050565b6000602082840312156100905761008f61003f565b5b600061009e84828501610065565b91505092915050565b6103e5806100b66000396000f3fe6080604052600436106100345760003560e01c80631aa23f48146100395780633e58c58c14610076578063a42532ad14610092575b600080fd5b34801561004557600080fd5b50610060600480360381019061005b91906102c1565b6100bd565b60405161006d9190610307565b60405180910390f35b610090600480360381019061008b91906102c1565b6100d5565b005b34801561009e57600080fd5b506100a7610258565b6040516100b49190610307565b60405180910390f35b60016020528060005260406000206000915090505481565b600054600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546101229190610351565b421161016557806040517f12bf079900000000000000000000000000000000000000000000000000000000815260040161015c9190610394565b60405180910390fd5b42600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f193505050501580156101ef573d6000803e3d6000fd5b508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fe607861baff3d292b19188affe88c1a72bdcb69d3015f18bb2cd0bf5349cc3e13460405161024d9190610307565b60405180910390a350565b60005481565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061028e82610263565b9050919050565b61029e81610283565b81146102a957600080fd5b50565b6000813590506102bb81610295565b92915050565b6000602082840312156102d7576102d661025e565b5b60006102e5848285016102ac565b91505092915050565b6000819050919050565b610301816102ee565b82525050565b600060208201905061031c60008301846102f8565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061035c826102ee565b9150610367836102ee565b925082820190508082111561037f5761037e610322565b5b92915050565b61038e81610283565b82525050565b60006020820190506103a96000830184610385565b9291505056fea26469706673582212201d3dc52877d49b4c0e47e5b19ea4b8fea522834ac0d54b05d8cf2bc34a98ec7b64736f6c63430008180033", + Bin: "0x608060405234801561001057600080fd5b506040516102de3803806102de83398101604081905261002f91610037565b600055610050565b60006020828403121561004957600080fd5b5051919050565b61027f8061005f6000396000f3fe6080604052600436106100345760003560e01c80631aa23f48146100395780633e58c58c14610078578063a42532ad1461008d575b600080fd5b34801561004557600080fd5b506100666100543660046101cc565b60016020526000908152604090205481565b60405190815260200160405180910390f35b61008b6100863660046101cc565b6100a3565b005b34801561009957600080fd5b5061006660005481565b6000805473ffffffffffffffffffffffffffffffffffffffff8316825260016020526040909120546100d59190610209565b4211610129576040517f12bf079900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8216600482015260240160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116600081815260016020526040808220429055513480156108fc0292909190818181858888f1935050505015801561017b573d6000803e3d6000fd5b5060405134815273ffffffffffffffffffffffffffffffffffffffff82169033907fe607861baff3d292b19188affe88c1a72bdcb69d3015f18bb2cd0bf5349cc3e19060200160405180910390a350565b6000602082840312156101de57600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461020257600080fd5b9392505050565b80820180821115610243577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9291505056fea26469706673582212202c8bf25323906e8a2b8dd1f13fcd30df1067f7bd8257d3144b3dcba23a5b83b964736f6c63430008180033", } // TokenSenderABI is the input ABI used to generate the binding from. @@ -459,6 +469,11 @@ func CreateTokenSenderDeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int var faucetTimeInterval *big.Int var faucetTimeIntervalRaw string @@ -471,6 +486,70 @@ func CreateTokenSenderDeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if faucetTimeIntervalRaw == "" { return fmt.Errorf("--faucet-time-interval argument not specified") } @@ -504,6 +583,44 @@ func CreateTokenSenderDeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateTokenSenderDeployBytecode( + faucetTimeInterval, + ) + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployTokenSender( transactionOpts, client, @@ -554,12 +671,38 @@ func CreateTokenSenderDeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&faucetTimeIntervalRaw, "faucet-time-interval", "", "faucet-time-interval argument") return cmd } +func generateTokenSenderDeployBytecode( + faucetTimeInterval *big.Int, +) ([]byte, error) { + abiPacked, err := TokenSenderMetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("", + faucetTimeInterval, + ) + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(TokenSenderMetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateFaucetTimeIntervalCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -702,11 +845,14 @@ func CreateLastSentTimestampCommand() *cobra.Command { } func CreateSendCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var recipient common.Address var recipientRaw string @@ -715,10 +861,6 @@ func CreateSendCommand() *cobra.Command { Use: "send", Short: "Execute the Send method on a TokenSender contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -726,6 +868,48 @@ func CreateSendCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if recipientRaw == "" { return fmt.Errorf("--recipient argument not specified") } else if !common.IsHexAddress(recipientRaw) { @@ -770,11 +954,47 @@ func CreateSendCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Send( + if safeAddress != "" { + abi, err := TokenSenderMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "send" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + recipient, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Send( + recipient, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -820,6 +1040,11 @@ func CreateSendCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&recipientRaw, "recipient", "", "recipient argument (common.Address)") @@ -973,3 +1198,220 @@ func CreateTokenSenderCommand() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bindings/WrappedNativeToken/WrappedNativeToken.go b/bindings/WrappedNativeToken/WrappedNativeToken.go index 0031b557..e3824ee2 100644 --- a/bindings/WrappedNativeToken/WrappedNativeToken.go +++ b/bindings/WrappedNativeToken/WrappedNativeToken.go @@ -1,5 +1,5 @@ -// This file was generated by seer: https://github.com/moonstream-to/seer. -// seer version: 0.1.20 +// This file was generated by seer: https://github.com/G7DAO/seer. +// seer version: 0.3.5 // seer command: seer evm generate --package WrappedNativeToken --cli --struct WrappedNativeToken --output bindings/WrappedNativeToken/WrappedNativeToken.go // Code generated - DO NOT EDIT. // This file is a generated binding and any manual changes will be lost. @@ -7,8 +7,11 @@ package WrappedNativeToken import ( + "bytes" + "crypto/rand" "errors" "math/big" + "net/http" "strings" "context" @@ -19,17 +22,25 @@ import ( "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/event" + "github.com/ethereum/go-ethereum/signer/core/apitypes" // Reference imports to suppress errors if they are not otherwise used. "encoding/hex" + "encoding/json" "fmt" "os" "time" + "github.com/G7DAO/seer/bindings/CreateCall" + "github.com/G7DAO/seer/bindings/GnosisSafe" "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" "golang.org/x/term" + + // WrappedNativeTokenMetaData contains all meta data concerning the WrappedNativeToken contract. + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" ) var ( @@ -44,10 +55,9 @@ var ( _ = abi.ConvertType ) -// WrappedNativeTokenMetaData contains all meta data concerning the WrappedNativeToken contract. var WrappedNativeTokenMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_tokenName\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Deposit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deposit\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60806040523480156200001157600080fd5b50604051620016ca380380620016ca8339818101604052810190620000379190620001f6565b8160009081620000489190620004c6565b5080600190816200005a9190620004c6565b505050620005ad565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620000cc8262000081565b810181811067ffffffffffffffff82111715620000ee57620000ed62000092565b5b80604052505050565b60006200010362000063565b9050620001118282620000c1565b919050565b600067ffffffffffffffff82111562000134576200013362000092565b5b6200013f8262000081565b9050602081019050919050565b60005b838110156200016c5780820151818401526020810190506200014f565b60008484015250505050565b60006200018f620001898462000116565b620000f7565b905082815260208101848484011115620001ae57620001ad6200007c565b5b620001bb8482856200014c565b509392505050565b600082601f830112620001db57620001da62000077565b5b8151620001ed84826020860162000178565b91505092915050565b6000806040838503121562000210576200020f6200006d565b5b600083015167ffffffffffffffff81111562000231576200023062000072565b5b6200023f85828601620001c3565b925050602083015167ffffffffffffffff81111562000263576200026262000072565b5b6200027185828601620001c3565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002ce57607f821691505b602082108103620002e457620002e362000286565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200034e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200030f565b6200035a86836200030f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620003a7620003a16200039b8462000372565b6200037c565b62000372565b9050919050565b6000819050919050565b620003c38362000386565b620003db620003d282620003ae565b8484546200031c565b825550505050565b600090565b620003f2620003e3565b620003ff818484620003b8565b505050565b5b8181101562000427576200041b600082620003e8565b60018101905062000405565b5050565b601f82111562000476576200044081620002ea565b6200044b84620002ff565b810160208510156200045b578190505b620004736200046a85620002ff565b83018262000404565b50505b505050565b600082821c905092915050565b60006200049b600019846008026200047b565b1980831691505092915050565b6000620004b6838362000488565b9150826002028217905092915050565b620004d1826200027b565b67ffffffffffffffff811115620004ed57620004ec62000092565b5b620004f98254620002b5565b620005068282856200042b565b600060209050601f8311600181146200053e576000841562000529578287015190505b620005358582620004a8565b865550620005a5565b601f1984166200054e86620002ea565b60005b82811015620005785784890151825560018201915060208501945060208101905062000551565b8683101562000598578489015162000594601f89168262000488565b8355505b6001600288020188555050505b505050505050565b61110d80620005bd6000396000f3fe6080604052600436106100a05760003560e01c8063313ce56711610064578063313ce567146101ad57806370a08231146101d857806395d89b4114610215578063a9059cbb14610240578063d0e30db01461027d578063dd62ed3e14610287576100af565b806306fdde03146100b4578063095ea7b3146100df57806318160ddd1461011c57806323b872dd146101475780632e1a7d4d14610184576100af565b366100af576100ad6102c4565b005b600080fd5b3480156100c057600080fd5b506100c96103ad565b6040516100d69190610bf7565b60405180910390f35b3480156100eb57600080fd5b5061010660048036038101906101019190610cb2565b61043b565b6040516101139190610d0d565b60405180910390f35b34801561012857600080fd5b5061013161052d565b60405161013e9190610d37565b60405180910390f35b34801561015357600080fd5b5061016e60048036038101906101699190610d52565b610535565b60405161017b9190610d0d565b60405180910390f35b34801561019057600080fd5b506101ab60048036038101906101a69190610da5565b610905565b005b3480156101b957600080fd5b506101c2610a82565b6040516101cf9190610dee565b60405180910390f35b3480156101e457600080fd5b506101ff60048036038101906101fa9190610e09565b610a87565b60405161020c9190610d37565b60405180910390f35b34801561022157600080fd5b5061022a610a9f565b6040516102379190610bf7565b60405180910390f35b34801561024c57600080fd5b5061026760048036038101906102629190610cb2565b610b2d565b6040516102749190610d0d565b60405180910390f35b6102856102c4565b005b34801561029357600080fd5b506102ae60048036038101906102a99190610e36565b610b42565b6040516102bb9190610d37565b60405180910390f35b60003411610307576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102fe90610ec2565b60405180910390fd5b34600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546103569190610f11565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c346040516103a39190610d37565b60405180910390a2565b600080546103ba90610f74565b80601f01602080910402602001604051908101604052809291908181526020018280546103e690610f74565b80156104335780601f1061040857610100808354040283529160200191610433565b820191906000526020600020905b81548152906001019060200180831161041657829003601f168201915b505050505081565b600081600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161051b9190610d37565b60405180910390a36001905092915050565b600047905090565b600081600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156105b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105b090611017565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415801561069157507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414155b156107e95781600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541015610755576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074c90611083565b60405180910390fd5b81600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546107e191906110a3565b925050819055505b81600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461083891906110a3565b9250508190555081600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461088e9190610f11565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516108f29190610d37565b60405180910390a3600190509392505050565b60008111610948576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093f90610ec2565b60405180910390fd5b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561099457600080fd5b80600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109e391906110a3565b925050819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610a30573d6000803e3d6000fd5b503373ffffffffffffffffffffffffffffffffffffffff167f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b6582604051610a779190610d37565b60405180910390a250565b601281565b60026020528060005260406000206000915090505481565b60018054610aac90610f74565b80601f0160208091040260200160405190810160405280929190818152602001828054610ad890610f74565b8015610b255780601f10610afa57610100808354040283529160200191610b25565b820191906000526020600020905b815481529060010190602001808311610b0857829003601f168201915b505050505081565b6000610b3a338484610535565b905092915050565b6003602052816000526040600020602052806000526040600020600091509150505481565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ba1578082015181840152602081019050610b86565b60008484015250505050565b6000601f19601f8301169050919050565b6000610bc982610b67565b610bd38185610b72565b9350610be3818560208601610b83565b610bec81610bad565b840191505092915050565b60006020820190508181036000830152610c118184610bbe565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610c4982610c1e565b9050919050565b610c5981610c3e565b8114610c6457600080fd5b50565b600081359050610c7681610c50565b92915050565b6000819050919050565b610c8f81610c7c565b8114610c9a57600080fd5b50565b600081359050610cac81610c86565b92915050565b60008060408385031215610cc957610cc8610c19565b5b6000610cd785828601610c67565b9250506020610ce885828601610c9d565b9150509250929050565b60008115159050919050565b610d0781610cf2565b82525050565b6000602082019050610d226000830184610cfe565b92915050565b610d3181610c7c565b82525050565b6000602082019050610d4c6000830184610d28565b92915050565b600080600060608486031215610d6b57610d6a610c19565b5b6000610d7986828701610c67565b9350506020610d8a86828701610c67565b9250506040610d9b86828701610c9d565b9150509250925092565b600060208284031215610dbb57610dba610c19565b5b6000610dc984828501610c9d565b91505092915050565b600060ff82169050919050565b610de881610dd2565b82525050565b6000602082019050610e036000830184610ddf565b92915050565b600060208284031215610e1f57610e1e610c19565b5b6000610e2d84828501610c67565b91505092915050565b60008060408385031215610e4d57610e4c610c19565b5b6000610e5b85828601610c67565b9250506020610e6c85828601610c67565b9150509250929050565b7f7a65726f2076616c756500000000000000000000000000000000000000000000600082015250565b6000610eac600a83610b72565b9150610eb782610e76565b602082019050919050565b60006020820190508181036000830152610edb81610e9f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610f1c82610c7c565b9150610f2783610c7c565b9250828201905080821115610f3f57610f3e610ee2565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610f8c57607f821691505b602082108103610f9f57610f9e610f45565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000611001602683610b72565b915061100c82610fa5565b604082019050919050565b6000602082019050818103600083015261103081610ff4565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061106d601d83610b72565b915061107882611037565b602082019050919050565b6000602082019050818103600083015261109c81611060565b9050919050565b60006110ae82610c7c565b91506110b983610c7c565b92508282039050818111156110d1576110d0610ee2565b5b9291505056fea2646970667358221220fde6844b771fac35302ecfaf9ae80897ff03faac9b77218de9b0647dba1687df64736f6c63430008180033", + Bin: "0x60806040523480156200001157600080fd5b5060405162000d8938038062000d89833981016040819052620000349162000122565b60006200004283826200021d565b5060016200005182826200021d565b505050620002e9565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200008257600080fd5b81516001600160401b03808211156200009f576200009f6200005a565b604051601f8301601f19908116603f01168101908282118183101715620000ca57620000ca6200005a565b8160405283815260209250866020858801011115620000e857600080fd5b600091505b838210156200010c5785820183015181830184015290820190620000ed565b6000602085830101528094505050505092915050565b600080604083850312156200013657600080fd5b82516001600160401b03808211156200014e57600080fd5b6200015c8683870162000070565b935060208501519150808211156200017357600080fd5b50620001828582860162000070565b9150509250929050565b600181811c90821680620001a157607f821691505b602082108103620001c257634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000218576000816000526020600020601f850160051c81016020861015620001f35750805b601f850160051c820191505b818110156200021457828155600101620001ff565b5050505b505050565b81516001600160401b038111156200023957620002396200005a565b62000251816200024a84546200018c565b84620001c8565b602080601f831160018114620002895760008415620002705750858301515b600019600386901b1c1916600185901b17855562000214565b600085815260208120601f198616915b82811015620002ba5788860151825594840194600190910190840162000299565b5085821015620002d95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610a9080620002f96000396000f3fe6080604052600436106100c05760003560e01c8063313ce56711610074578063a9059cbb1161004e578063a9059cbb146101f5578063d0e30db014610215578063dd62ed3e1461021d57600080fd5b8063313ce5671461018c57806370a08231146101b357806395d89b41146101e057600080fd5b806318160ddd116100a557806318160ddd1461012f57806323b872dd1461014c5780632e1a7d4d1461016c57600080fd5b806306fdde03146100d4578063095ea7b3146100ff57600080fd5b366100cf576100cd610255565b005b600080fd5b3480156100e057600080fd5b506100e961031f565b6040516100f6919061084f565b60405180910390f35b34801561010b57600080fd5b5061011f61011a3660046108e5565b6103ad565b60405190151581526020016100f6565b34801561013b57600080fd5b50475b6040519081526020016100f6565b34801561015857600080fd5b5061011f61016736600461090f565b610427565b34801561017857600080fd5b506100cd61018736600461094b565b61071e565b34801561019857600080fd5b506101a1601281565b60405160ff90911681526020016100f6565b3480156101bf57600080fd5b5061013e6101ce366004610964565b60026020526000908152604090205481565b3480156101ec57600080fd5b506100e961082e565b34801561020157600080fd5b5061011f6102103660046108e5565b61083b565b6100cd610255565b34801561022957600080fd5b5061013e61023836600461097f565b600360209081526000928352604080842090915290825290205481565b600034116102c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f7a65726f2076616c75650000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b33600090815260026020526040812080543492906102e39084906109e1565b909155505060405134815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a2565b6000805461032c906109f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610358906109f4565b80156103a55780601f1061037a576101008083540402835291602001916103a5565b820191906000526020600020905b81548152906001019060200180831161038857829003601f168201915b505050505081565b33600081815260036020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104159086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600260205260408120548211156104dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016102bb565b3373ffffffffffffffffffffffffffffffffffffffff851614801590610552575073ffffffffffffffffffffffffffffffffffffffff841660009081526003602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff14155b156106375773ffffffffffffffffffffffffffffffffffffffff841660009081526003602090815260408083203384529091529020548211156105f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016102bb565b73ffffffffffffffffffffffffffffffffffffffff8416600090815260036020908152604080832033845290915281208054849290610631908490610a47565b90915550505b73ffffffffffffffffffffffffffffffffffffffff84166000908152600260205260408120805484929061066c908490610a47565b909155505073ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080548492906106a69084906109e1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161070c91815260200190565b60405180910390a35060019392505050565b60008111610788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f7a65726f2076616c75650000000000000000000000000000000000000000000060448201526064016102bb565b336000908152600260205260409020548111156107a457600080fd5b33600090815260026020526040812080548392906107c3908490610a47565b9091555050604051339082156108fc029083906000818181858888f193505050501580156107f5573d6000803e3d6000fd5b5060405181815233907f7fcf532c15f0a6db0bd6d0e038bea71d30d808c7d98cb3bf7268a95bf5081b659060200160405180910390a250565b6001805461032c906109f4565b6000610848338484610427565b9392505050565b60006020808352835180602085015260005b8181101561087d57858101830151858201604001528201610861565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146108e057600080fd5b919050565b600080604083850312156108f857600080fd5b610901836108bc565b946020939093013593505050565b60008060006060848603121561092457600080fd5b61092d846108bc565b925061093b602085016108bc565b9150604084013590509250925092565b60006020828403121561095d57600080fd5b5035919050565b60006020828403121561097657600080fd5b610848826108bc565b6000806040838503121561099257600080fd5b61099b836108bc565b91506109a9602084016108bc565b90509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b80820180821115610421576104216109b2565b600181811c90821680610a0857607f821691505b602082108103610a41577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b81810381811115610421576104216109b256fea2646970667358221220dd9391304972607e980a9903ab83384ebe2dd5cb9b681adfcfde7ec7dd64097c64736f6c63430008180033", } // WrappedNativeTokenABI is the input ABI used to generate the binding from. @@ -1132,6 +1142,11 @@ func CreateWrappedNativeTokenDeploymentCommand() *cobra.Command { var gasLimit uint64 var simulate bool var timeout uint + var safeAddress, safeApi, safeCreateCall, safeSaltRaw, safeNonceRaw string + var safeOperationType uint8 + var salt [32]byte + var predictAddress bool + var safeNonce *big.Int var tokenName string @@ -1145,6 +1160,70 @@ func CreateWrappedNativeTokenDeploymentCommand() *cobra.Command { return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") } + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if safeCreateCall == "" { + fmt.Println("--safe-create-call not specified, using default (0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4)") + safeCreateCall = "0x7cbB62EaA69F79e6873cD1ecB2392971036cFAa4" + } + if !common.IsHexAddress(safeCreateCall) { + return fmt.Errorf("--safe-create-call is not a valid Ethereum address") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeSaltRaw == "" { + fmt.Println("--safe-salt not specified, generating random salt") + _, err := rand.Read(salt[:]) + if err != nil { + return fmt.Errorf("failed to generate random salt: %v", err) + } + // prompt user to accept random salt + fmt.Println("Generated salt:", common.Bytes2Hex(salt[:])) + fmt.Println("Please check the salt and confirm (y/n)") + var confirm string + fmt.Scanln(&confirm) + if confirm != "y" && confirm != "Y" && confirm != "\n" && confirm != "" { + return fmt.Errorf("salt not accepted, please specify a valid salt") + } + } else { + copy(salt[:], safeSaltRaw) + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1172,6 +1251,45 @@ func CreateWrappedNativeTokenDeploymentCommand() *cobra.Command { SetTransactionParametersFromArgs(transactionOpts, nonce, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, simulate) + if safeAddress != "" { + // Generate deploy bytecode with constructor arguments + deployBytecode, err := generateWrappedNativeTokenDeployBytecode( + tokenName, + symbol, + ) + if err != nil { + return fmt.Errorf("failed to generate deploy bytecode: %v", err) + } + + // Create Safe proposal for deployment + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + if predictAddress { + fmt.Println("Predicting deployment address...") + from := common.HexToAddress(safeAddress) + if safeOperationType == 0 { + from = common.HexToAddress(safeCreateCall) + } + deploymentAddress, err := PredictDeploymentAddressSafe(from, salt, deployBytecode) + if err != nil { + return fmt.Errorf("failed to predict deployment address: %v", err) + } + fmt.Println("Predicted deployment address:", deploymentAddress.Hex()) + return nil + } else { + fmt.Println("Creating Safe proposal...") + err = DeployWithSafe(client, key, common.HexToAddress(safeAddress), common.HexToAddress(safeCreateCall), value, safeApi, deployBytecode, SafeOperationType(safeOperationType), salt, safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + } + + return nil + } + address, deploymentTransaction, _, deploymentErr := DeployWrappedNativeToken( transactionOpts, client, @@ -1223,6 +1341,13 @@ func CreateWrappedNativeTokenDeploymentCommand() *cobra.Command { cmd.Flags().Uint64Var(&gasLimit, "gas-limit", 0, "Gas limit for the transaction") cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().StringVar(&safeCreateCall, "safe-create-call", "", "Address of the CreateCall contract (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 1, "Safe operation type: 0 (Call) or 1 (DelegateCall) - default is 1") + cmd.Flags().StringVar(&safeSaltRaw, "safe-salt", "", "Salt to use for the Safe transaction") + cmd.Flags().BoolVar(&predictAddress, "safe-predict-address", false, "Predict the deployment address (only works for Safe transactions)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&tokenName, "token-name", "", "token-name argument") cmd.Flags().StringVar(&symbol, "symbol", "", "symbol argument") @@ -1230,6 +1355,27 @@ func CreateWrappedNativeTokenDeploymentCommand() *cobra.Command { return cmd } +func generateWrappedNativeTokenDeployBytecode( + tokenName string, + symbol string, +) ([]byte, error) { + abiPacked, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return nil, fmt.Errorf("failed to get ABI: %v", err) + } + + constructorArguments, err := abiPacked.Pack("", + tokenName, + symbol, + ) + if err != nil { + return nil, fmt.Errorf("failed to pack constructor arguments: %v", err) + } + + deployBytecode := append(common.FromHex(WrappedNativeTokenMetaData.Bin), constructorArguments...) + return deployBytecode, nil +} + func CreateAllowanceCommand() *cobra.Command { var contractAddressRaw, rpc string var contractAddress common.Address @@ -1649,11 +1795,14 @@ func CreateTotalSupplyCommand() *cobra.Command { } func CreateApproveCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var spender common.Address var spenderRaw string @@ -1664,10 +1813,6 @@ func CreateApproveCommand() *cobra.Command { Use: "approve", Short: "Execute the Approve method on a WrappedNativeToken contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1675,6 +1820,48 @@ func CreateApproveCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if spenderRaw == "" { return fmt.Errorf("--spender argument not specified") } else if !common.IsHexAddress(spenderRaw) { @@ -1725,12 +1912,49 @@ func CreateApproveCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Approve( + if safeAddress != "" { + abi, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "approve" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + spender, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Approve( + spender, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1776,6 +2000,11 @@ func CreateApproveCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&spenderRaw, "spender", "", "spender argument (common.Address)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -1783,20 +2012,19 @@ func CreateApproveCommand() *cobra.Command { return cmd } func CreateDepositCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int cmd := &cobra.Command{ Use: "deposit", Short: "Execute the Deposit method on a WrappedNativeToken contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1804,6 +2032,48 @@ func CreateDepositCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1841,9 +2111,43 @@ func CreateDepositCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Deposit() - if transactionErr != nil { - return transactionErr + if safeAddress != "" { + abi, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "deposit" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Deposit() + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1889,24 +2193,28 @@ func CreateDepositCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } func CreateReceiveCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int cmd := &cobra.Command{ Use: "receive", Short: "Execute the Receive method on a WrappedNativeToken contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -1914,6 +2222,48 @@ func CreateReceiveCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { @@ -1951,9 +2301,43 @@ func CreateReceiveCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Receive() - if transactionErr != nil { - return transactionErr + if safeAddress != "" { + abi, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "receive" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Receive() + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -1999,15 +2383,23 @@ func CreateReceiveCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") return cmd } func CreateTransferCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var to0 common.Address var to0Raw string @@ -2018,10 +2410,6 @@ func CreateTransferCommand() *cobra.Command { Use: "transfer", Short: "Execute the Transfer method on a WrappedNativeToken contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2029,6 +2417,48 @@ func CreateTransferCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if to0Raw == "" { return fmt.Errorf("--to-0 argument not specified") } else if !common.IsHexAddress(to0Raw) { @@ -2079,12 +2509,49 @@ func CreateTransferCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Transfer( + if safeAddress != "" { + abi, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transfer" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + to0, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Transfer( + to0, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2130,6 +2597,11 @@ func CreateTransferCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -2137,11 +2609,14 @@ func CreateTransferCommand() *cobra.Command { return cmd } func CreateTransferFromCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var from0 common.Address var from0Raw string @@ -2154,10 +2629,6 @@ func CreateTransferFromCommand() *cobra.Command { Use: "transfer-from", Short: "Execute the TransferFrom method on a WrappedNativeToken contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2165,6 +2636,48 @@ func CreateTransferFromCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if from0Raw == "" { return fmt.Errorf("--from-0 argument not specified") } else if !common.IsHexAddress(from0Raw) { @@ -2222,13 +2735,51 @@ func CreateTransferFromCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.TransferFrom( + if safeAddress != "" { + abi, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "transferFrom" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + from0, + to0, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.TransferFrom( + from0, to0, amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2274,6 +2825,11 @@ func CreateTransferFromCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&from0Raw, "from-0", "", "from-0 argument (common.Address)") cmd.Flags().StringVar(&to0Raw, "to-0", "", "to-0 argument (common.Address)") @@ -2282,11 +2838,14 @@ func CreateTransferFromCommand() *cobra.Command { return cmd } func CreateWithdrawCommand() *cobra.Command { - var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw string + var keyfile, nonce, password, value, gasPrice, maxFeePerGas, maxPriorityFeePerGas, rpc, contractAddressRaw, safeFunction, safeNonceRaw string var gasLimit uint64 var simulate bool var timeout uint var contractAddress common.Address + var safeAddress, safeApi string + var safeOperationType uint8 + var safeNonce *big.Int var amount *big.Int var amountRaw string @@ -2295,10 +2854,6 @@ func CreateWithdrawCommand() *cobra.Command { Use: "withdraw", Short: "Execute the Withdraw method on a WrappedNativeToken contract", PreRunE: func(cmd *cobra.Command, args []string) error { - if keyfile == "" { - return fmt.Errorf("--keystore not specified") - } - if contractAddressRaw == "" { return fmt.Errorf("--contract not specified") } else if !common.IsHexAddress(contractAddressRaw) { @@ -2306,6 +2861,48 @@ func CreateWithdrawCommand() *cobra.Command { } contractAddress = common.HexToAddress(contractAddressRaw) + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if safeAddress != "" { + if !common.IsHexAddress(safeAddress) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } + if safeApi == "" { + client, clientErr := NewClient(rpc) + if clientErr != nil { + return clientErr + } + chainIDCtx, cancelChainIDCtx := NewChainContext(timeout) + defer cancelChainIDCtx() + chainID, chainIDErr := client.ChainID(chainIDCtx) + if chainIDErr != nil { + return chainIDErr + } + safeApi = fmt.Sprintf("https://safe-client.safe.global/v1/chains/%s/transactions/%s/propose", chainID.String(), safeAddress) + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if SafeOperationType(safeOperationType).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw == "" { + fmt.Println("--safe-nonce not specified, fetching nonce from Safe contract") + } else { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } + } + if amountRaw == "" { return fmt.Errorf("--amount argument not specified") } @@ -2349,11 +2946,47 @@ func CreateWithdrawCommand() *cobra.Command { TransactOpts: *transactionOpts, } - transaction, transactionErr := session.Withdraw( + if safeAddress != "" { + abi, err := WrappedNativeTokenMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + // Generate transaction data (override method name if safe function is specified) + methodName := "withdraw" + if safeFunction != "" { + methodName = safeFunction + } + + transaction, err := abi.Pack( + methodName, + amount, + ) + + if err != nil { + return err + } + + // Create Safe proposal for transaction + value := transactionOpts.Value + if value == nil { + value = big.NewInt(0) + } + + err = CreateSafeProposal(client, key, common.HexToAddress(safeAddress), contractAddress, transaction, value, safeApi, SafeOperationType(safeOperationType), safeNonce) + if err != nil { + return fmt.Errorf("failed to create Safe proposal: %v", err) + } + + return nil + } + + transaction, err := session.Withdraw( + amount, ) - if transactionErr != nil { - return transactionErr + if err != nil { + return err } cmd.Printf("Transaction hash: %s\n", transaction.Hash().Hex()) @@ -2399,6 +3032,11 @@ func CreateWithdrawCommand() *cobra.Command { cmd.Flags().BoolVar(&simulate, "simulate", false, "Simulate the transaction without sending it") cmd.Flags().UintVar(&timeout, "timeout", 60, "Timeout (in seconds) for interactions with the JSONRPC API") cmd.Flags().StringVar(&contractAddressRaw, "contract", "", "Address of the contract to interact with") + cmd.Flags().StringVar(&safeAddress, "safe", "", "Address of the Safe contract") + cmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + cmd.Flags().Uint8Var(&safeOperationType, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + cmd.Flags().StringVar(&safeFunction, "safe-function", "", "Safe function overrider to use for the transaction (optional)") + cmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce overrider for the transaction (optional)") cmd.Flags().StringVar(&amountRaw, "amount", "", "amount argument") @@ -2579,3 +3217,220 @@ func CreateWrappedNativeTokenCommand() *cobra.Command { return cmd } + +// SafeOperationType represents the type of operation for a Safe transaction +type SafeOperationType uint8 + +const ( + Call SafeOperationType = 0 + DelegateCall SafeOperationType = 1 +) + +// String returns the string representation of the SafeOperationType +func (o SafeOperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation SafeOperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func DeployWithSafe(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, factoryAddress common.Address, value *big.Int, safeApi string, deployBytecode []byte, safeOperationType SafeOperationType, salt [32]byte, safeNonce *big.Int) error { + abi, err := CreateCall.CreateCallMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %v", err) + } + + safeCreateCallTxData, err := abi.Pack("performCreate2", value, deployBytecode, salt) + if err != nil { + return fmt.Errorf("failed to pack performCreate2 transaction: %v", err) + } + + return CreateSafeProposal(client, key, safeAddress, factoryAddress, safeCreateCallTxData, value, safeApi, SafeOperationType(safeOperationType), safeNonce) +} + +func PredictDeploymentAddressSafe(from common.Address, salt [32]byte, deployBytecode []byte) (common.Address, error) { + // Calculate the hash of the init code (deployment bytecode) + initCodeHash := crypto.Keccak256(deployBytecode) + + // Calculate the CREATE2 address + deployedAddress := crypto.CreateAddress2(from, salt, initCodeHash) + + return deployedAddress, nil +} + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperationType SafeOperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := safeNonce + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchedNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchedNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperationType, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/bridge/bridge.go b/bridge/bridge.go index ea8dfe0d..59f4aeb1 100644 --- a/bridge/bridge.go +++ b/bridge/bridge.go @@ -7,36 +7,24 @@ import ( "os" "strings" + "github.com/G7DAO/protocol/bindings/ArbitrumL1OrbitCustomGateway" "github.com/G7DAO/protocol/bindings/ERC20Inbox" + "github.com/G7DAO/protocol/bindings/L1GatewayRouter" "github.com/G7DAO/protocol/bindings/NodeInterface" "github.com/ethereum/go-ethereum/accounts/abi" "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/ethclient" ) -func Bridge(inboxAddress common.Address, keyFile string, password string, l1Rpc string, l2Rpc string, to common.Address, l2CallValue *big.Int, l2Calldata []byte) (*types.Transaction, error) { - key, keyErr := NodeInterface.KeyFromFile(keyFile, password) - if keyErr != nil { - return nil, keyErr - } - - l1Client, l1ClientErr := ethclient.DialContext(context.Background(), l1Rpc) - if l1ClientErr != nil { - return nil, l1ClientErr - } - +func GetNativeTokenBridgeCalldata(key *keystore.Key, l1Client *ethclient.Client, l2Client *ethclient.Client, to common.Address, l2CallValue *big.Int, l2Calldata []byte) ([]byte, error) { l1BaseFee, l1BaseFeeErr := l1Client.SuggestGasPrice(context.Background()) if l1BaseFeeErr != nil { return nil, l1BaseFeeErr } - l2Client, l2ClientErr := ethclient.DialContext(context.Background(), l2Rpc) - if l2ClientErr != nil { - return nil, l2ClientErr - } - l2BaseFee, l2BaseFeeErr := l2Client.SuggestGasPrice(context.Background()) if l2BaseFeeErr != nil { return nil, l2BaseFeeErr @@ -69,6 +57,30 @@ func Bridge(inboxAddress common.Address, keyFile string, password string, l1Rpc fmt.Fprintln(os.Stderr, createRetryableTicketDataErr.Error()) return nil, createRetryableTicketDataErr } + return createRetryableTicketData, nil +} + +func NativeTokenBridgeCall(inboxAddress common.Address, keyFile string, password string, l1Rpc string, l2Rpc string, to common.Address, l2CallValue *big.Int, l2Calldata []byte) (*types.Transaction, error) { + l1Client, l1ClientErr := ethclient.DialContext(context.Background(), l1Rpc) + if l1ClientErr != nil { + return nil, l1ClientErr + } + + l2Client, l2ClientErr := ethclient.DialContext(context.Background(), l2Rpc) + if l2ClientErr != nil { + return nil, l2ClientErr + } + + key, keyErr := NodeInterface.KeyFromFile(keyFile, password) + if keyErr != nil { + return nil, keyErr + } + + createRetryableTicketData, createRetryableTicketDataErr := GetNativeTokenBridgeCalldata(key, l1Client, l2Client, to, l2CallValue, l2Calldata) + if createRetryableTicketDataErr != nil { + return nil, createRetryableTicketDataErr + } + fmt.Println("Sending transaction...") transaction, transactionErr := SendTransaction(l1Client, key, password, createRetryableTicketData, inboxAddress.Hex(), big.NewInt(0)) if transactionErr != nil { @@ -87,3 +99,185 @@ func Bridge(inboxAddress common.Address, keyFile string, password string, l1Rpc return transaction, nil } + +func NativeTokenBridgePropose(inboxAddress common.Address, keyFile string, password string, l1Rpc string, l2Rpc string, to common.Address, l2CallValue *big.Int, l2Calldata []byte, safeAddress common.Address, safeApi string, safeOperation uint8, safeNonce *big.Int) error { + l1Client, l1ClientErr := ethclient.DialContext(context.Background(), l1Rpc) + if l1ClientErr != nil { + return l1ClientErr + } + + l2Client, l2ClientErr := ethclient.DialContext(context.Background(), l2Rpc) + if l2ClientErr != nil { + return l2ClientErr + } + + key, keyErr := NodeInterface.KeyFromFile(keyFile, password) + if keyErr != nil { + return keyErr + } + + createRetryableTicketData, createRetryableTicketDataErr := GetNativeTokenBridgeCalldata(key, l1Client, l2Client, to, l2CallValue, l2Calldata) + if createRetryableTicketDataErr != nil { + return createRetryableTicketDataErr + } + + return CreateSafeProposal(l1Client, key, safeAddress, inboxAddress, createRetryableTicketData, big.NewInt(0), safeApi, OperationType(safeOperation), safeNonce) +} + +func GetERC20BridgeCalldataAndValue(routerAddress common.Address, keyFile string, password string, l1Rpc string, l2Rpc string, tokenAddress common.Address, to common.Address, amount *big.Int) ([]byte, *big.Int, error) { + key, keyErr := NodeInterface.KeyFromFile(keyFile, password) + if keyErr != nil { + fmt.Fprintln(os.Stderr, "keyErr", keyErr.Error()) + return nil, nil, keyErr + } + + l1Client, l1ClientErr := ethclient.DialContext(context.Background(), l1Rpc) + if l1ClientErr != nil { + fmt.Fprintln(os.Stderr, "l1ClientErr", l1ClientErr.Error()) + return nil, nil, l1ClientErr + } + + l2Client, l2ClientErr := ethclient.DialContext(context.Background(), l2Rpc) + if l2ClientErr != nil { + fmt.Fprintln(os.Stderr, "l2ClientErr", l2ClientErr.Error()) + return nil, nil, l2ClientErr + } + + gasPriceBid, gasPriceBidErr := l1Client.SuggestGasPrice(context.Background()) + if gasPriceBidErr != nil { + fmt.Fprintln(os.Stderr, "gasPriceBidErr", gasPriceBidErr.Error()) + return nil, nil, gasPriceBidErr + } + + router, routerErr := L1GatewayRouter.NewL1GatewayRouter(routerAddress, l1Client) + if routerErr != nil { + fmt.Fprintln(os.Stderr, "routerErr", routerErr.Error()) + return nil, nil, routerErr + } + + outboundCalldata, outboundCalldataErr := router.GetOutboundCalldata(nil, tokenAddress, key.Address, to, amount, []byte{}) + if outboundCalldataErr != nil { + fmt.Fprintln(os.Stderr, "outboundCalldataErr", outboundCalldataErr.Error()) + return nil, nil, outboundCalldataErr + } + + gatewayAddress, gatewayAddressErr := router.GetGateway(nil, tokenAddress) + if gatewayAddressErr != nil { + return nil, nil, gatewayAddressErr + } + + gateway, gatewayErr := ArbitrumL1OrbitCustomGateway.NewL1OrbitCustomGateway(gatewayAddress, l1Client) + if gatewayErr != nil { + return nil, nil, gatewayErr + } + + // Source: https://github.com/OffchainLabs/arbitrum-sdk/blob/0da65020438fc3e46728ea182f1b4dcf04e3cb7f/src/lib/message/L1ToL2MessageGasEstimator.ts#L154 + senderDeposit := big.NewInt(0).Add(big.NewInt(0), ONE_ETHER) + counterpartGatewayAddress, counterpartGatewayAddressErr := gateway.CounterpartGateway(nil) + if counterpartGatewayAddressErr != nil { + return nil, nil, counterpartGatewayAddressErr + } + + gasLimit, gasLimitErr := CalculateRetryableGasLimit(l2Client, gatewayAddress, senderDeposit, counterpartGatewayAddress, big.NewInt(0), to, RemapL1Address(key.Address), outboundCalldata) + if gasLimitErr != nil { + fmt.Fprintln(os.Stderr, "gasLimitErr", gasLimitErr.Error()) + return nil, nil, gasLimitErr + } + maxGas := big.NewInt(0).SetUint64(gasLimit) + + maxSubmissionCost, maxSubmissionCostErr := CalculateRetryableSubmissionFee(outboundCalldata, gasPriceBid) + if maxSubmissionCostErr != nil { + fmt.Fprintln(os.Stderr, "maxSubmissionCostErr", maxSubmissionCostErr.Error()) + return nil, nil, maxSubmissionCostErr + } + + executionCost := big.NewInt(0).Mul(maxGas, gasPriceBid) + tokenTotalFeeAmount := big.NewInt(0).Add(maxSubmissionCost, executionCost) + tokenTotalFeeAmount.Add(tokenTotalFeeAmount, big.NewInt(0)) + + // Encode (uint256 maxSubmissionCost, bytes callHookData, uint256 tokenTotalFeeAmount) + arguments := abi.Arguments{ + {Type: abi.Type{T: abi.UintTy, Size: 256}}, + {Type: abi.Type{T: abi.BytesTy}}, + {Type: abi.Type{T: abi.UintTy, Size: 256}}, + } + data, dataErr := arguments.Pack(maxSubmissionCost, []byte{}, tokenTotalFeeAmount) + if dataErr != nil { + fmt.Fprintln(os.Stderr, "dataErr", dataErr.Error()) + return nil, nil, dataErr + } + + routerAbi, routerAbiErr := abi.JSON(strings.NewReader(L1GatewayRouter.L1GatewayRouterABI)) + if routerAbiErr != nil { + fmt.Fprintln(os.Stderr, "routerAbiErr", routerAbiErr.Error()) + return nil, nil, routerAbiErr + } + + callData, callDataErr := routerAbi.Pack("outboundTransfer", tokenAddress, to, amount, maxGas, gasPriceBid, data) + if callDataErr != nil { + fmt.Fprintln(os.Stderr, "callDataErr", callDataErr.Error()) + return nil, nil, callDataErr + } + + return callData, tokenTotalFeeAmount, nil +} + +func ERC20BridgeCall(routerAddress common.Address, keyFile string, password string, l1Rpc string, l2Rpc string, tokenAddress common.Address, to common.Address, amount *big.Int) (*types.Transaction, error) { + callData, tokenTotalFeeAmount, callDataErr := GetERC20BridgeCalldataAndValue(routerAddress, keyFile, password, l1Rpc, l2Rpc, tokenAddress, to, amount) + if callDataErr != nil { + fmt.Fprintln(os.Stderr, "callDataErr", callDataErr.Error()) + return nil, callDataErr + } + + l1Client, l1ClientErr := ethclient.DialContext(context.Background(), l1Rpc) + if l1ClientErr != nil { + fmt.Fprintln(os.Stderr, "l1ClientErr", l1ClientErr.Error()) + return nil, l1ClientErr + } + + key, keyErr := NodeInterface.KeyFromFile(keyFile, password) + if keyErr != nil { + fmt.Fprintln(os.Stderr, "keyErr", keyErr.Error()) + return nil, keyErr + } + + fmt.Println("Sending transaction...") + transaction, transactionErr := SendTransaction(l1Client, key, password, callData, routerAddress.Hex(), tokenTotalFeeAmount) + if transactionErr != nil { + fmt.Fprintln(os.Stderr, "transactionErr", transactionErr.Error()) + return nil, transactionErr + } + fmt.Println("Transaction sent! Transaction hash:", transaction.Hash().Hex()) + + fmt.Println("Waiting for transaction to be mined...") + _, receiptErr := bind.WaitMined(context.Background(), l1Client, transaction) + if receiptErr != nil { + fmt.Fprintln(os.Stderr, "receiptErr", receiptErr.Error()) + return nil, receiptErr + } + fmt.Println("Transaction mined!") + + return transaction, nil +} + +func ERC20BridgePropose(routerAddress common.Address, keyFile string, password string, l1Rpc string, l2Rpc string, tokenAddress common.Address, to common.Address, amount *big.Int, safeAddress common.Address, safeApi string, safeOperation uint8, safeNonce *big.Int) error { + callData, tokenTotalFeeAmount, callDataErr := GetERC20BridgeCalldataAndValue(routerAddress, keyFile, password, l1Rpc, l2Rpc, tokenAddress, to, amount) + if callDataErr != nil { + fmt.Fprintln(os.Stderr, "callDataErr", callDataErr.Error()) + return callDataErr + } + + l1Client, l1ClientErr := ethclient.DialContext(context.Background(), l1Rpc) + if l1ClientErr != nil { + fmt.Fprintln(os.Stderr, "l1ClientErr", l1ClientErr.Error()) + return l1ClientErr + } + + key, keyErr := NodeInterface.KeyFromFile(keyFile, password) + if keyErr != nil { + fmt.Fprintln(os.Stderr, "keyErr", keyErr.Error()) + return keyErr + } + + return CreateSafeProposal(l1Client, key, safeAddress, routerAddress, callData, tokenTotalFeeAmount, safeApi, OperationType(safeOperation), safeNonce) +} diff --git a/bridge/cmd.go b/bridge/cmd.go index 292556ae..9c4071f0 100644 --- a/bridge/cmd.go +++ b/bridge/cmd.go @@ -1,17 +1,19 @@ package bridge import ( + "context" "encoding/hex" "errors" "fmt" "math/big" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" "github.com/spf13/cobra" ) func CreateBridgeCommand() *cobra.Command { - crossChainCmd := &cobra.Command{ + bridgeCmd := &cobra.Command{ Use: "bridge", Short: "Bridge tokens between chains", Run: func(cmd *cobra.Command, args []string) { @@ -19,20 +21,34 @@ func CreateBridgeCommand() *cobra.Command { }, } - bridgeL1ToL2Cmd := CreateBridgeL1ToL2Command() - bridgeL1ToL3Cmd := CreateBridgeL1ToL3Command() + bridgeCmd.AddCommand(CreateBridgeNativeTokenCommand()) + bridgeCmd.AddCommand(CreateBridgeERC20Command()) - crossChainCmd.AddCommand(bridgeL1ToL2Cmd) - crossChainCmd.AddCommand(bridgeL1ToL3Cmd) + return bridgeCmd +} + +func CreateBridgeNativeTokenCommand() *cobra.Command { + nativeTokenCmd := &cobra.Command{ + Use: "native-token", + Short: "Bridge native tokens between chains", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } - return crossChainCmd + nativeTokenCmd.AddCommand(CreateBridgeNativeTokenL1ToL2Command()) + nativeTokenCmd.AddCommand(CreateBridgeNativeTokenL1ToL3Command()) + + return nativeTokenCmd } -func CreateBridgeL1ToL2Command() *cobra.Command { - var keyFile, password, l1Rpc, l2Rpc, inboxRaw, toRaw, l2CallValueRaw, l2CalldataRaw string - var inboxAddress, to common.Address +func CreateBridgeNativeTokenL1ToL2Command() *cobra.Command { + var keyFile, password, l1Rpc, l2Rpc, inboxRaw, toRaw, l2CallValueRaw, l2CalldataRaw, safeAddressRaw, safeApi, safeNonceRaw string + var inboxAddress, to, safeAddress common.Address var l2CallValue *big.Int var l2Calldata []byte + var safeOperation uint8 + var safeNonce *big.Int createCmd := &cobra.Command{ Use: "l1-to-l2", @@ -73,17 +89,62 @@ func CreateBridgeL1ToL2Command() *cobra.Command { return errors.New("keyfile is required") } + if safeAddressRaw != "" { + if !common.IsHexAddress(safeAddressRaw) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } else { + safeAddress = common.HexToAddress(safeAddressRaw) + } + + if safeApi == "" { + client, clientErr := ethclient.DialContext(context.Background(), l1Rpc) + if clientErr != nil { + return clientErr + } + + chainID, chainIDErr := client.ChainID(context.Background()) + if chainIDErr != nil { + return chainIDErr + } + safeApi = "https://safe-client.safe.global/v1/chains/" + chainID.String() + "/transactions/" + safeAddress.Hex() + "/propose" + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if OperationType(safeOperation).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw != "" { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } else { + fmt.Println("--safe-nonce not specified, fetching from Safe") + safeNonce = big.NewInt(0) + } + } + return nil }, RunE: func(cmd *cobra.Command, args []string) error { - fmt.Println("Bridging from", inboxAddress.Hex(), "to", to.Hex()) - transaction, transactionErr := Bridge(inboxAddress, keyFile, password, l1Rpc, l2Rpc, to, l2CallValue, l2Calldata) - if transactionErr != nil { - fmt.Fprintln(cmd.ErrOrStderr(), transactionErr.Error()) - return transactionErr - } + fmt.Println("Bridging to", to.Hex()) + if safeAddressRaw != "" { + err := NativeTokenBridgePropose(inboxAddress, keyFile, password, l1Rpc, l2Rpc, to, l2CallValue, l2Calldata, safeAddress, safeApi, safeOperation, safeNonce) + if err != nil { + fmt.Fprintln(cmd.ErrOrStderr(), err.Error()) + return err + } + } else { + transaction, transactionErr := NativeTokenBridgeCall(inboxAddress, keyFile, password, l1Rpc, l2Rpc, to, l2CallValue, l2Calldata) + if transactionErr != nil { + fmt.Fprintln(cmd.ErrOrStderr(), transactionErr.Error()) + return transactionErr + } - fmt.Println("Transaction sent:", transaction.Hash().Hex()) + fmt.Println("Transaction sent:", transaction.Hash().Hex()) + } return nil }, @@ -97,11 +158,15 @@ func CreateBridgeL1ToL2Command() *cobra.Command { createCmd.Flags().StringVar(&toRaw, "to", "", "Recipient or contract address") createCmd.Flags().StringVar(&l2CallValueRaw, "amount", "", "L2 call value") createCmd.Flags().StringVar(&l2CalldataRaw, "l2-calldata", "", "Calldata to send") + createCmd.Flags().StringVar(&safeAddressRaw, "safe", "", "Address of the Safe contract") + createCmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + createCmd.Flags().Uint8Var(&safeOperation, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + createCmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce") return createCmd } -func CreateBridgeL1ToL3Command() *cobra.Command { +func CreateBridgeNativeTokenL1ToL3Command() *cobra.Command { var keyFile, password, l1TokenRaw, l3FeeTokenL1AddrRaw, l1l2RouterRaw, l2l3RouterOrInboxRaw, toRaw, amountRaw, l3CalldataRaw, l1Rpc, l2Rpc, l3Rpc, teleporterAddressRaw string teleportParams := &TeleportParams{} var teleporterAddress common.Address @@ -197,3 +262,144 @@ func CreateBridgeL1ToL3Command() *cobra.Command { return createCmd } + +func CreateBridgeERC20Command() *cobra.Command { + erc20Cmd := &cobra.Command{ + Use: "erc20", + Short: "Bridge ERC20 tokens between chains", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + + erc20Cmd.AddCommand(CreateBridgeERC20L1ToL2Command()) + + return erc20Cmd +} + +func CreateBridgeERC20L1ToL2Command() *cobra.Command { + var keyFile, password, l1Rpc, l2Rpc, routerRaw, tokenAddressRaw, toRaw, amountRaw, safeAddressRaw, safeApi, safeNonceRaw string + var routerAddress, tokenAddress, to, safeAddress common.Address + var amount *big.Int + var safeOperation uint8 + var safeNonce *big.Int + + createCmd := &cobra.Command{ + Use: "l1-to-l2", + Short: "Bridge ERC20 tokens from L1 to L2", + Long: `Bridge ERC20 tokens from L1 to L2 with a single transaction and arbitrary calldata`, + + PreRunE: func(cmd *cobra.Command, args []string) error { + if !common.IsHexAddress(routerRaw) { + return errors.New("invalid router address") + } + routerAddress = common.HexToAddress(routerRaw) + + if !common.IsHexAddress(toRaw) { + return errors.New("invalid recipient address") + } + to = common.HexToAddress(toRaw) + + if !common.IsHexAddress(tokenAddressRaw) { + return errors.New("invalid token address") + } + tokenAddress = common.HexToAddress(tokenAddressRaw) + + amount = new(big.Int) + if amountRaw != "" { + _, ok := amount.SetString(amountRaw, 10) + if !ok { + return errors.New("invalid L2 call value") + } + } else { + fmt.Println("No amount provided, defaulting to 0") + amount.SetInt64(0) + } + + if keyFile == "" { + return errors.New("keyfile is required") + } + + if safeAddressRaw != "" { + if !common.IsHexAddress(safeAddressRaw) { + return fmt.Errorf("--safe is not a valid Ethereum address") + } else { + safeAddress = common.HexToAddress(safeAddressRaw) + } + + if safeApi == "" { + client, clientErr := ethclient.DialContext(context.Background(), l1Rpc) + if clientErr != nil { + return clientErr + } + + chainID, chainIDErr := client.ChainID(context.Background()) + if chainIDErr != nil { + return chainIDErr + } + safeApi = "https://safe-client.safe.global/v1/chains/" + chainID.String() + "/transactions/" + safeAddress.Hex() + "/propose" + fmt.Println("--safe-api not specified, using default (", safeApi, ")") + } + + if OperationType(safeOperation).String() == "Unknown" { + return fmt.Errorf("--safe-operation must be 0 (Call) or 1 (DelegateCall)") + } + + if safeNonceRaw != "" { + safeNonce = new(big.Int) + _, ok := safeNonce.SetString(safeNonceRaw, 0) + if !ok { + return fmt.Errorf("--safe-nonce is not a valid big integer") + } + } else { + fmt.Println("--safe-nonce not specified, fetching from Safe") + safeNonce = big.NewInt(0) + } + + if l1Rpc == "" { + return errors.New("l1-rpc is required") + } + + if l2Rpc == "" { + return errors.New("l2-rpc is required") + } + } + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + fmt.Println("Bridging", tokenAddress.Hex(), "to", to.Hex()) + if safeAddressRaw == "" { + transaction, transactionErr := ERC20BridgeCall(routerAddress, keyFile, password, l1Rpc, l2Rpc, tokenAddress, to, amount) + if transactionErr != nil { + fmt.Fprintln(cmd.ErrOrStderr(), transactionErr.Error()) + return transactionErr + } + fmt.Println("Transaction sent:", transaction.Hash().Hex()) + } else { + proposeErr := ERC20BridgePropose(routerAddress, keyFile, password, l1Rpc, l2Rpc, tokenAddress, to, amount, safeAddress, safeApi, safeOperation, safeNonce) + if proposeErr != nil { + fmt.Fprintln(cmd.ErrOrStderr(), proposeErr.Error()) + return proposeErr + } + } + + return nil + }, + } + + createCmd.Flags().StringVar(&password, "password", "", "Password to encrypt accounts with") + createCmd.Flags().StringVar(&keyFile, "keyfile", "", "Keyfile to sign transaction with") + createCmd.Flags().StringVar(&l1Rpc, "l1-rpc", "", "L1 RPC URL") + createCmd.Flags().StringVar(&l2Rpc, "l2-rpc", "", "L2 RPC URL") + createCmd.Flags().StringVar(&routerRaw, "router", "", "Router address") + createCmd.Flags().StringVar(&toRaw, "to", "", "Recipient address") + createCmd.Flags().StringVar(&tokenAddressRaw, "token", "", "Token address") + createCmd.Flags().StringVar(&amountRaw, "amount", "", "Amount to send") + createCmd.Flags().StringVar(&safeAddressRaw, "safe", "", "Address of the Safe contract") + createCmd.Flags().StringVar(&safeApi, "safe-api", "", "Safe API for the Safe Transaction Service (optional)") + createCmd.Flags().Uint8Var(&safeOperation, "safe-operation", 0, "Safe operation type: 0 (Call) or 1 (DelegateCall)") + createCmd.Flags().StringVar(&safeNonceRaw, "safe-nonce", "", "Safe nonce") + + return createCmd +} diff --git a/bridge/safe.go b/bridge/safe.go new file mode 100644 index 00000000..05c2cbc3 --- /dev/null +++ b/bridge/safe.go @@ -0,0 +1,212 @@ +package bridge + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "math/big" + "net/http" + + "github.com/G7DAO/protocol/bindings/GnosisSafe" + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/common/math" + "github.com/ethereum/go-ethereum/crypto" + "github.com/ethereum/go-ethereum/ethclient" + "github.com/ethereum/go-ethereum/signer/core/apitypes" +) + +// OperationType represents the type of operation for a Safe transaction +type OperationType uint8 + +const ( + Call OperationType = 0 + DelegateCall OperationType = 1 +) + +// String returns the string representation of the OperationType +func (o OperationType) String() string { + switch o { + case Call: + return "Call" + case DelegateCall: + return "DelegateCall" + default: + return "Unknown" + } +} + +// SafeTransactionData represents the data for a Safe transaction +type SafeTransactionData struct { + To string `json:"to"` + Value string `json:"value"` + Data string `json:"data"` + Operation OperationType `json:"operation"` + SafeTxGas uint64 `json:"safeTxGas"` + BaseGas uint64 `json:"baseGas"` + GasPrice string `json:"gasPrice"` + GasToken string `json:"gasToken"` + RefundReceiver string `json:"refundReceiver"` + Nonce *big.Int `json:"nonce"` + SafeTxHash string `json:"safeTxHash"` + Sender string `json:"sender"` + Signature string `json:"signature"` + Origin string `json:"origin"` +} + +const ( + NativeTokenAddress = "0x0000000000000000000000000000000000000000" +) + +func CreateSafeProposal(client *ethclient.Client, key *keystore.Key, safeAddress common.Address, to common.Address, data []byte, value *big.Int, safeApi string, safeOperation OperationType, safeNonce *big.Int) error { + chainID, err := client.ChainID(context.Background()) + if err != nil { + return fmt.Errorf("failed to get chain ID: %v", err) + } + + // Create a new instance of the GnosisSafe contract + safeInstance, err := GnosisSafe.NewGnosisSafe(safeAddress, client) + if err != nil { + return fmt.Errorf("failed to create GnosisSafe instance: %v", err) + } + + nonce := big.NewInt(0) + if safeNonce == nil { + // Fetch the current nonce from the Safe contract + fetchNonce, err := safeInstance.Nonce(&bind.CallOpts{}) + if err != nil { + return fmt.Errorf("failed to fetch nonce from Safe contract: %v", err) + } + nonce = fetchNonce + } else { + nonce = safeNonce + } + + safeTransactionData := SafeTransactionData{ + To: to.Hex(), + Value: value.String(), + Data: common.Bytes2Hex(data), + Operation: safeOperation, + SafeTxGas: 0, + BaseGas: 0, + GasPrice: "0", + GasToken: NativeTokenAddress, + RefundReceiver: NativeTokenAddress, + Nonce: nonce, + } + + // Calculate SafeTxHash + safeTxHash, err := CalculateSafeTxHash(safeAddress, safeTransactionData, chainID) + if err != nil { + return fmt.Errorf("failed to calculate SafeTxHash: %v", err) + } + + // Sign the SafeTxHash + signature, err := crypto.Sign(safeTxHash.Bytes(), key.PrivateKey) + if err != nil { + return fmt.Errorf("failed to sign SafeTxHash: %v", err) + } + + // Adjust V value for Ethereum's replay protection + signature[64] += 27 + + // Convert signature to hex + senderSignature := "0x" + common.Bytes2Hex(signature) + + // Prepare the request body + requestBody := map[string]interface{}{ + "to": safeTransactionData.To, + "value": safeTransactionData.Value, + "data": "0x" + safeTransactionData.Data, + "operation": int(safeTransactionData.Operation), + "safeTxGas": fmt.Sprintf("%d", safeTransactionData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", safeTransactionData.BaseGas), + "gasPrice": safeTransactionData.GasPrice, + "gasToken": safeTransactionData.GasToken, + "refundReceiver": safeTransactionData.RefundReceiver, + "nonce": fmt.Sprintf("%d", safeTransactionData.Nonce), + "safeTxHash": safeTxHash.Hex(), + "sender": key.Address.Hex(), + "signature": senderSignature, + "origin": fmt.Sprintf("{\"url\":\"%s\",\"name\":\"TokenSender Deployment\"}", safeApi), + } + + // Marshal the request body to JSON + jsonBody, err := json.Marshal(requestBody) + if err != nil { + return fmt.Errorf("failed to marshal request body: %v", err) + } + + // Send the request to the Safe Transaction Service + req, err := http.NewRequest("POST", safeApi, bytes.NewBuffer(jsonBody)) + if err != nil { + return fmt.Errorf("failed to create request: %v", err) + } + + req.Header.Set("Content-Type", "application/json") + + httpClient := &http.Client{} + resp, err := httpClient.Do(req) + if err != nil { + return fmt.Errorf("failed to send request: %v", err) + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return fmt.Errorf("unexpected status code: %d", resp.StatusCode) + } + + fmt.Println("Safe proposal created successfully") + return nil +} + +func CalculateSafeTxHash(safeAddress common.Address, txData SafeTransactionData, chainID *big.Int) (common.Hash, error) { + domainSeparator := apitypes.TypedDataDomain{ + ChainId: (*math.HexOrDecimal256)(chainID), + VerifyingContract: safeAddress.Hex(), + } + + typedData := apitypes.TypedData{ + Types: apitypes.Types{ + "EIP712Domain": []apitypes.Type{ + {Name: "chainId", Type: "uint256"}, + {Name: "verifyingContract", Type: "address"}, + }, + "SafeTx": []apitypes.Type{ + {Name: "to", Type: "address"}, + {Name: "value", Type: "uint256"}, + {Name: "data", Type: "bytes"}, + {Name: "operation", Type: "uint8"}, + {Name: "safeTxGas", Type: "uint256"}, + {Name: "baseGas", Type: "uint256"}, + {Name: "gasPrice", Type: "uint256"}, + {Name: "gasToken", Type: "address"}, + {Name: "refundReceiver", Type: "address"}, + {Name: "nonce", Type: "uint256"}, + }, + }, + Domain: domainSeparator, + PrimaryType: "SafeTx", + Message: apitypes.TypedDataMessage{ + "to": txData.To, + "value": txData.Value, + "data": "0x" + txData.Data, + "operation": fmt.Sprintf("%d", txData.Operation), + "safeTxGas": fmt.Sprintf("%d", txData.SafeTxGas), + "baseGas": fmt.Sprintf("%d", txData.BaseGas), + "gasPrice": txData.GasPrice, + "gasToken": txData.GasToken, + "refundReceiver": txData.RefundReceiver, + "nonce": fmt.Sprintf("%d", txData.Nonce), + }, + } + + typedDataHash, _, err := apitypes.TypedDataAndHash(typedData) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to hash typed data: %v", err) + } + + return common.BytesToHash(typedDataHash), nil +} diff --git a/cmd/game7/cmd.go b/cmd/game7/cmd.go index 8ad26d44..f8fd8beb 100644 --- a/cmd/game7/cmd.go +++ b/cmd/game7/cmd.go @@ -11,18 +11,19 @@ import ( "github.com/G7DAO/protocol/bindings/ArbitrumL1OrbitGatewayRouter" "github.com/G7DAO/protocol/bindings/ArbitrumL2CustomGateway" "github.com/G7DAO/protocol/bindings/ArbitrumUpgradeExecutor" - "github.com/G7DAO/protocol/bindings/ERC20Inbox" - "github.com/G7DAO/protocol/bindings/PositionMetadata" - "github.com/G7DAO/protocol/bindings/Staker" - "github.com/G7DAO/protocol/bindings/TokenFaucet" "github.com/G7DAO/protocol/bindings/TokenSender" - "github.com/G7DAO/protocol/bridge" "github.com/G7DAO/protocol/bindings/ERC20" + "github.com/G7DAO/protocol/bindings/ERC20Inbox" + "github.com/G7DAO/protocol/bindings/Metronome" "github.com/G7DAO/protocol/bindings/MockERC1155" "github.com/G7DAO/protocol/bindings/MockERC20" "github.com/G7DAO/protocol/bindings/MockERC721" + "github.com/G7DAO/protocol/bindings/PositionMetadata" + "github.com/G7DAO/protocol/bindings/Staker" + "github.com/G7DAO/protocol/bindings/TokenFaucet" "github.com/G7DAO/protocol/bindings/WrappedNativeToken" + "github.com/G7DAO/protocol/bridge" "github.com/G7DAO/protocol/cmd/game7/version" ) @@ -81,9 +82,12 @@ func CreateRootCommand() *cobra.Command { positionMetadataCmd := PositionMetadata.CreatePositionMetadataCommand() positionMetadataCmd.Use = "staker-metadata" + metronomeCmd := Metronome.CreateMetronomeCommand() + metronomeCmd.Use = "metronome" + mockCmd := CreateMockCommand() - rootCmd.AddCommand(completionCmd, versionCmd, tokenCmd, arbitrumL1OrbitCustomGatewayCmd, arbitrumL2CustomGatewayCmd, arbitrumUpgradeExecutorCmd, arbitrumL1OrbitGatewayRouterCmd, arbSysCmd, erc20InboxCmd, bridgeCmd, faucetCmd, accountsCmd, wrappedNativeTokenCmd, stakerCmd, mockCmd, positionMetadataCmd, tokenSenderCmd) + rootCmd.AddCommand(completionCmd, versionCmd, tokenCmd, arbitrumL1OrbitCustomGatewayCmd, arbitrumL2CustomGatewayCmd, arbitrumUpgradeExecutorCmd, arbitrumL1OrbitGatewayRouterCmd, arbSysCmd, erc20InboxCmd, bridgeCmd, faucetCmd, accountsCmd, wrappedNativeTokenCmd, stakerCmd, mockCmd, positionMetadataCmd, tokenSenderCmd, metronomeCmd) // By default, cobra Command objects write to stderr. We have to forcibly set them to output to // stdout. diff --git a/cmd/game7/version/version.go b/cmd/game7/version/version.go index 1cdf9e56..11d7770c 100644 --- a/cmd/game7/version/version.go +++ b/cmd/game7/version/version.go @@ -1,3 +1,3 @@ package version -var Game7Version string = "0.0.3" +var Game7Version string = "0.1.0" diff --git a/cmd/robognome/README.md b/cmd/robognome/README.md new file mode 100644 index 00000000..65aac555 --- /dev/null +++ b/cmd/robognome/README.md @@ -0,0 +1,50 @@ + + +# robognome + +The `robognome` is a bot which automatically claims [`Metronome`](../../README.md#metronome) bounties. It is only a very simple implementation of such a bot, +intended as a reference. You are better off either forking and modifying the `robognome` or writing your own bot if you intend to farm `Metronome` bounties for profit. + +## Installing `robognome` + +To install from source, run the following command at the root of this git repository: + +```bash +make bin/robognome +``` + +This will create a binary/executable called `bin/robognome`, which you can use to run `robognome`. + +## Using `robognome` + +Currently, a single `robognome` process can farm bounties for a single [`Metronome`](../../web3/contracts/metronome/Metronome.sol) schedule. + +To use the bot, you will need: +1. `$RPC`: An RPC API URL for the blockchain you are operating on. +2. `$CLAIMANT`: A keyfile for an Ethereum account. This is a file in JSON format which, together with a password, can be used to recover the account's private key. More information at [ethereum.org](https://ethereum.org/en/developers/docs/data-structures-and-encoding/web3-secret-storage/). This is the [format used by `geth`](https://geth.ethereum.org/docs/developers/dapp-developer/native-accounts) to store accounts on disk. You can use the [`ethkey`](https://github.com/ethereum/go-ethereum/tree/master/cmd/ethkey) tool or any Ethereum-specific web3 library. +3. `$METRONOME`: The contract address for the `Metronome` contract which hosts the schedule you will farm bounties for. +4. `$SCHEDULE_ID`: The ID of the schedule you will farm bounties for. + +For example, if you want to farm bounties against the schedule with ID `0` on the official `Metronome` contract on the Game7 testnet, you could set: + +``` +export RPC="https://testnet-rpc.game7.io" METRONOME="0xF1066bAB238158eCF09b176c2F6Ae9da31291e2c" SCHEDULE_ID=0 +``` + +This schedule pays out `100000 wei` worth of the `TG7T` token to the first claimant to claim the bounty every block. + +Your `$CLAIMANT` is your responsibility. + +```bash +bin/robognome run \ + --contract $METRONOME \ + --interval 100 \ + --keyfile $CLAIMANT \ + --rpc $RPC \ + --schedule $SCHEDULE_ID \ + --resilient +``` + +An explanation of the additional flags: +1. `--interval`: This is the number of milliseconds to wait between attempts to farm the bounty. +2. `--resilient`: This specifies that the bot should ignore errors to claim the bounty if it encounters any, and just keep running. diff --git a/cmd/robognome/bot.go b/cmd/robognome/bot.go new file mode 100644 index 00000000..511523ab --- /dev/null +++ b/cmd/robognome/bot.go @@ -0,0 +1,113 @@ +package main + +import ( + "context" + "fmt" + "math/big" + "os" + "os/signal" + "syscall" + "time" + + "github.com/ethereum/go-ethereum/accounts/abi/bind" + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/ethclient" + + "github.com/G7DAO/protocol/bindings/Metronome" +) + +func isBountyAvailable(nextBlockNumber *big.Int, metronome *Metronome.Metronome, scheduleID *big.Int) (bool, error) { + opts := &bind.CallOpts{} + schedule, err := metronome.Schedules(opts, scheduleID) + if err != nil { + return false, err + } + r := new(big.Int).Mod(nextBlockNumber, schedule.Divisor) + return r.Cmp(schedule.Remainder) == 0, nil +} + +func Run(metronomeAddress common.Address, claimant *keystore.Key, client *ethclient.Client, intervalMilliseconds uint64, scheduleID *big.Int, resilient bool) error { + ctx := context.Background() + + metronome, metronomeErr := Metronome.NewMetronome(metronomeAddress, client) + if metronomeErr != nil { + return fmt.Errorf("failed to create Metronome contract binding: %s", metronomeErr.Error()) + } + + chainID, chainIDErr := client.ChainID(ctx) + if chainIDErr != nil { + return chainIDErr + } + + txOpts, txOptsErr := bind.NewKeyedTransactorWithChainID(claimant.PrivateKey, chainID) + if txOptsErr != nil { + + } + + interval := time.Duration(intervalMilliseconds) * time.Millisecond + ticker := time.NewTicker(interval) + defer ticker.Stop() + + interruptHandler := make(chan os.Signal, 1) + signal.Notify(interruptHandler, os.Interrupt, syscall.SIGTERM) + + for { + select { + case <-ticker.C: + fmt.Println("Checking bounty availability") + + blockNumber, blockNumberErr := client.BlockNumber(ctx) + if blockNumberErr != nil { + resultErr := fmt.Errorf("failed to retrieve block number from the Ethereum client: %s", blockNumberErr.Error()) + if resilient { + fmt.Fprint(os.Stderr, resultErr.Error()) + continue + } else { + return resultErr + } + } + nextBlockNumber := new(big.Int).SetUint64(blockNumber + 1) + fmt.Printf("Next block number: %s\n", nextBlockNumber.String()) + + bountyAvailable, bountyAvailableErr := isBountyAvailable(nextBlockNumber, metronome, scheduleID) + if bountyAvailableErr != nil { + resultErr := fmt.Errorf("failed to check if bounty is available: %s", bountyAvailableErr.Error()) + if resilient { + fmt.Fprint(os.Stderr, resultErr.Error()) + continue + } else { + return resultErr + } + } + + if bountyAvailable { + claimTx, claimTxErr := metronome.Claim(txOpts, scheduleID, claimant.Address) + if claimTxErr != nil { + resultErr := fmt.Errorf("could not submit claim transaction: %s", claimTxErr.Error()) + if resilient { + fmt.Fprint(os.Stderr, resultErr.Error()) + continue + } else { + return resultErr + } + } + fmt.Printf("Claim transaction: %s\n", claimTx.Hash().String()) + _, claimTxReceiptErr := bind.WaitMined(ctx, client, claimTx) + if claimTxReceiptErr != nil { + resultErr := fmt.Errorf("could not mine claim transaction: %s", claimTxReceiptErr.Error()) + if resilient { + fmt.Fprint(os.Stderr, resultErr.Error()) + continue + } else { + return resultErr + } + } + fmt.Println("Claim transaction confirmed") + } + case <-interruptHandler: + fmt.Printf("Robognome massacre") + return nil + } + } +} diff --git a/cmd/robognome/cmd.go b/cmd/robognome/cmd.go new file mode 100644 index 00000000..329061f8 --- /dev/null +++ b/cmd/robognome/cmd.go @@ -0,0 +1,167 @@ +package main + +import ( + "fmt" + "math/big" + "os" + + "github.com/ethereum/go-ethereum/common" + "github.com/spf13/cobra" + + "github.com/G7DAO/protocol/bindings/Metronome" + "github.com/G7DAO/protocol/cmd/robognome/version" +) + +func CreateRootCommand() *cobra.Command { + // rootCmd represents the base command when called without any subcommands + rootCmd := &cobra.Command{ + Use: "robognome", + Short: "robognome: A bot for Metronome bounties", + Run: func(cmd *cobra.Command, args []string) { + cmd.Help() + }, + } + + completionCmd := CreateCompletionCommand(rootCmd) + versionCmd := CreateVersionCommand() + + metronomeCmd := Metronome.CreateMetronomeCommand() + metronomeCmd.Use = "metronome" + + runCmd := CreateRunCommand() + + rootCmd.AddCommand(completionCmd, versionCmd, metronomeCmd, runCmd) + + // By default, cobra Command objects write to stderr. We have to forcibly set them to output to + // stdout. + rootCmd.SetOut(os.Stdout) + + return rootCmd +} + +func CreateCompletionCommand(rootCmd *cobra.Command) *cobra.Command { + completionCmd := &cobra.Command{ + Use: "completion", + Short: "Generate shell completion scripts for robognome", + Long: `Generate shell completion scripts for robognome. + +The command for each shell will print a completion script to stdout. You can source this script to get +completions in your current shell session. You can add this script to the completion directory for your +shell to get completions for all future sessions. + +For example, to activate bash completions in your current shell: + $ . <(robognome completion bash) + +To add robognome completions for all bash sessions: + $ robognome completion bash > /etc/bash_completion.d/robognome_completions`, + } + + bashCompletionCmd := &cobra.Command{ + Use: "bash", + Short: "bash completions for robognome", + Run: func(cmd *cobra.Command, args []string) { + rootCmd.GenBashCompletion(cmd.OutOrStdout()) + }, + } + + zshCompletionCmd := &cobra.Command{ + Use: "zsh", + Short: "zsh completions for robognome", + Run: func(cmd *cobra.Command, args []string) { + rootCmd.GenZshCompletion(cmd.OutOrStdout()) + }, + } + + fishCompletionCmd := &cobra.Command{ + Use: "fish", + Short: "fish completions for robognome", + Run: func(cmd *cobra.Command, args []string) { + rootCmd.GenFishCompletion(cmd.OutOrStdout(), true) + }, + } + + powershellCompletionCmd := &cobra.Command{ + Use: "powershell", + Short: "powershell completions for robognome", + Run: func(cmd *cobra.Command, args []string) { + rootCmd.GenPowerShellCompletion(cmd.OutOrStdout()) + }, + } + + completionCmd.AddCommand(bashCompletionCmd, zshCompletionCmd, fishCompletionCmd, powershellCompletionCmd) + + return completionCmd +} + +func CreateVersionCommand() *cobra.Command { + versionCmd := &cobra.Command{ + Use: "version", + Short: "Print the version of robognome that you are currently using", + Run: func(cmd *cobra.Command, args []string) { + cmd.Println(version.RoboGnomeVersion) + }, + } + + return versionCmd +} + +func CreateRunCommand() *cobra.Command { + var metronomeAddressRaw, rpc, keyfile, password, scheduleIDRaw string + var intervalMilliseconds uint64 + var resilient bool + + var metronomeAddress common.Address + var scheduleID *big.Int + + runCmd := &cobra.Command{ + Use: "run", + Short: "Run the robognome", + PreRunE: func(cmd *cobra.Command, args []string) error { + if metronomeAddressRaw == "" { + return fmt.Errorf("--contract not specified") + } else if !common.IsHexAddress(metronomeAddressRaw) { + return fmt.Errorf("--contract is not a valid Ethereum address") + } + metronomeAddress = common.HexToAddress(metronomeAddressRaw) + + if keyfile == "" { + return fmt.Errorf("--keystore not specified (this should be a path to an Ethereum account keystore file)") + } + + if rpc == "" { + return fmt.Errorf("--rpc not specified (this should be a URL to an Ethereum JSONRPC API)") + } + + if scheduleIDRaw == "" { + return fmt.Errorf("--schedule argument not specified") + } + scheduleID = new(big.Int) + scheduleID.SetString(scheduleIDRaw, 0) + + return nil + }, + RunE: func(cmd *cobra.Command, args []string) error { + client, clientErr := Metronome.NewClient(rpc) + if clientErr != nil { + return clientErr + } + + key, keyErr := Metronome.KeyFromFile(keyfile, password) + if keyErr != nil { + return keyErr + } + + return Run(metronomeAddress, key, client, intervalMilliseconds, scheduleID, resilient) + }, + } + + runCmd.Flags().StringVarP(&rpc, "rpc", "r", "", "RPC URL for the blockchain node") + runCmd.Flags().StringVarP(&metronomeAddressRaw, "contract", "c", "", "Metronome contract address") + runCmd.Flags().StringVarP(&keyfile, "keyfile", "k", "", "Path to the keyfile for the claimant account") + runCmd.Flags().StringVarP(&password, "password", "p", "", "Password for the claimant account (if not provided, you will be prompted for this)") + runCmd.Flags().StringVarP(&scheduleIDRaw, "schedule", "s", "", "Schedule ID of the schedule to monitor") + runCmd.Flags().Uint64VarP(&intervalMilliseconds, "interval", "i", 100, "Interval in milliseconds between bounty checks") + runCmd.Flags().BoolVar(&resilient, "resilient", false, "If set, the bot will continue running even if it encounters an error") + + return runCmd +} diff --git a/cmd/robognome/main.go b/cmd/robognome/main.go new file mode 100644 index 00000000..1e05a86f --- /dev/null +++ b/cmd/robognome/main.go @@ -0,0 +1,15 @@ +package main + +import ( + "fmt" + "os" +) + +func main() { + command := CreateRootCommand() + err := command.Execute() + if err != nil { + fmt.Println(err.Error()) + os.Exit(1) + } +} diff --git a/cmd/robognome/version/version.go b/cmd/robognome/version/version.go new file mode 100644 index 00000000..e7c55f14 --- /dev/null +++ b/cmd/robognome/version/version.go @@ -0,0 +1,3 @@ +package version + +var RoboGnomeVersion string = "0.0.1" diff --git a/go.mod b/go.mod index a9fe8ac6..b0568c46 100644 --- a/go.mod +++ b/go.mod @@ -1,44 +1,48 @@ module github.com/G7DAO/protocol -go 1.21.5 +go 1.22.0 + +toolchain go1.22.2 require ( - github.com/ethereum/go-ethereum v1.14.3 - github.com/google/uuid v1.3.0 + github.com/G7DAO/seer v0.3.0 + github.com/ethereum/go-ethereum v1.14.10 + github.com/google/uuid v1.6.0 github.com/spf13/cobra v1.8.0 golang.org/x/term v0.20.0 ) require ( - github.com/btcsuite/btcd/btcec/v2 v2.2.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.3.4 // indirect github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 // indirect ) require ( - github.com/Microsoft/go-winio v0.6.1 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect github.com/StackExchange/wmi v1.2.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/bits-and-blooms/bitset v1.13.0 // indirect github.com/consensys/bavard v0.1.13 // indirect github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c // indirect github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect + github.com/deckarep/golang-set/v2 v2.6.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 // indirect github.com/ethereum/c-kzg-4844 v1.0.0 // indirect + github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/holiman/uint256 v1.2.4 // indirect + github.com/holiman/uint256 v1.3.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.13 // indirect github.com/tklauser/go-sysconf v0.3.12 // indirect github.com/tklauser/numcpus v0.6.1 // indirect - golang.org/x/crypto v0.22.0 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/tools v0.20.0 // indirect + golang.org/x/crypto v0.23.0 // indirect + golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect + golang.org/x/sync v0.8.0 // indirect + golang.org/x/sys v0.25.0 // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/go.sum b/go.sum index 08e00c02..382d2bef 100644 --- a/go.sum +++ b/go.sum @@ -1,29 +1,33 @@ github.com/DataDog/zstd v1.4.5 h1:EndNeuB0l9syBZhut0wns3gV1hL8zX8LIu6ZiVHWLIQ= github.com/DataDog/zstd v1.4.5/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= +github.com/G7DAO/seer v0.3.0 h1:q4jbb2y8iiBdeYkkMoX/jRkMbACaJeEQ+gAQZmTSgz4= +github.com/G7DAO/seer v0.3.0/go.mod h1:JVdBWa8ma30x4xCiAVljKczYpl0To7gMWBTFsPSEA/A= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/VictoriaMetrics/fastcache v1.12.1 h1:i0mICQuojGDL3KblA7wUNlY5lOK6a4bwt3uRKnkZU40= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= -github.com/btcsuite/btcd/btcec/v2 v2.2.0 h1:fzn1qaOt32TuLjFlkzYSsBC35Q3KUjT1SwPxiMSCF5k= -github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/bits-and-blooms/bitset v1.13.0 h1:bAQ9OPNFYbGHV6Nez0tmNI0RiEu7/hxlYJRUA0wFAVE= +github.com/bits-and-blooms/bitset v1.13.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.3.4 h1:3EJjcN70HCu/mwqlUsGK8GcNVyLVxFDlWurTXGPFfiQ= +github.com/btcsuite/btcd/btcec/v2 v2.3.4/go.mod h1:zYzJ8etWJQIv1Ogk7OzpWjowwOdXY1W/17j2MW85J04= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0 h1:59Kx4K6lzOW5w6nFlA0v5+lk/6sjybR934QNHSJZPTQ= github.com/btcsuite/btcd/chaincfg/chainhash v1.1.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cockroachdb/errors v1.11.1 h1:xSEW75zKaKCWzR3OfxXUxgrk/NtT4G1MiOv5lWZazG8= -github.com/cockroachdb/errors v1.11.1/go.mod h1:8MUxA3Gi6b25tYlFEBGLf+D8aISL+M4MIpiWMSNRfxw= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cockroachdb/errors v1.11.3 h1:5bA+k2Y6r+oz/6Z/RFlNeVCesGARKuC6YymtcDrbC/I= +github.com/cockroachdb/errors v1.11.3/go.mod h1:m4UIW4CDjx+R5cybPsNrRbreomiFqt8o1h1wUVazSd8= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce h1:giXvy4KSc/6g/esnpM7Geqxka4WSqI1SZc7sMJFd3y4= +github.com/cockroachdb/fifo v0.0.0-20240606204812-0bbfbd93a7ce/go.mod h1:9/y3cnZ5GKakj/H4y9r9GTjCvAFta7KLgSHPJJYc52M= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v1.1.0 h1:pcFh8CdCIt2kmEpK0OIatq67Ln9uGDYY3d5XnE0LJG4= -github.com/cockroachdb/pebble v1.1.0/go.mod h1:sEHm5NOXxyiAoKWhoFxT8xMgd/f3RA6qUqQ1BXKrh2E= +github.com/cockroachdb/pebble v1.1.2 h1:CUh2IPtR4swHlEj48Rhfzw6l/d0qA31fItcIszQVIsA= +github.com/cockroachdb/pebble v1.1.2/go.mod h1:4exszw1r40423ZsmkG/09AFEG83I0uDgfujJdbL6kYU= github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwPJ30= github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo= @@ -34,32 +38,30 @@ github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJ github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233 h1:d28BXYi+wUpz1KBmiF9bWrjEMacUEREV6MBi2ODnrfQ= -github.com/crate-crypto/go-ipa v0.0.0-20231025140028-3c0104f4b233/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c h1:uQYC5Z1mdLRPrZhHjHxufI8+2UG/i25QG92j0Er9p6I= +github.com/crate-crypto/go-ipa v0.0.0-20240223125850-b1e8a79f509c/go.mod h1:geZJZH3SzKCqnz5VT0q/DyIG/tvu/dZk+VIfXicupJs= github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= +github.com/deckarep/golang-set/v2 v2.6.0 h1:XfcQbWM1LlMB8BsJ8N9vW5ehnnPVIw0je80NsVHagjM= +github.com/deckarep/golang-set/v2 v2.6.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/ethereum/c-kzg-4844 v1.0.0 h1:0X1LBXxaEtYD9xsyj9B9ctQEZIpnvVDeoBx8aHEwTNA= github.com/ethereum/c-kzg-4844 v1.0.0/go.mod h1:VewdlzQmpT5QSrVhbBuGoCdFJkpaJlO1aQputP83wc0= -github.com/ethereum/go-ethereum v1.14.3 h1:5zvnAqLtnCZrU9uod1JCvHWJbPMURzYFHfc2eHz4PHA= -github.com/ethereum/go-ethereum v1.14.3/go.mod h1:1STrq471D0BQbCX9He0hUj4bHxX2k6mt5nOQJhDNOJ8= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/go-ethereum v1.14.10 h1:kC24WjYeRjDy86LVo6MfF5Xs7nnUu+XG4AjaYIaZYko= +github.com/ethereum/go-ethereum v1.14.10/go.mod h1:+l/fr42Mma+xBnhefL/+z11/hcmJ2egl+ScIVPjhc7E= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9 h1:8NfxH2iXvJ60YRB8ChToFTUzl8awsc3cJ8CbLjGIl/A= +github.com/ethereum/go-verkle v0.1.1-0.20240829091221-dffa7562dbe9/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff h1:tY80oXqGNY4FhTFhk+o9oFHGINQ/+vhlm8HFzi6znCI= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46 h1:BAIP2GihuqhwdILrV+7GJel5lyPV3u1+PgzrWLc0TkE= -github.com/gballet/go-verkle v0.1.1-0.20231031103413-a67434b50f46/go.mod h1:QNpY22eby74jVhqH4WhDLDwxc/vqsern6pW+u2kbkpc= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= +github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps= +github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= @@ -76,8 +78,8 @@ github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= -github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= -github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/hashicorp/go-bexpr v0.1.10 h1:9kuI5PFotCboP3dkDYFr/wi0gg0QVbSNz5oFRpxn4uE= @@ -86,16 +88,16 @@ github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4 h1:X4egAf/gcS1zATw6w github.com/holiman/billy v0.0.0-20240216141850-2abb0c79d3c4/go.mod h1:5GuXa7vkL8u9FkFuWdVvfR5ix8hRB7DbOAaYULamFpc= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= -github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/holiman/uint256 v1.3.1 h1:JfTzmih28bittyHM8z360dCjIA9dbPIBlcTI6lmctQs= +github.com/holiman/uint256 v1.3.1/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/klauspost/compress v1.15.15 h1:EF27CXIuDsYJ6mmvtBRlEuB2UVOqHG1tAXgZ7yIO+lw= -github.com/klauspost/compress v1.15.15/go.mod h1:ZcK2JAFqKOpnBlxcLsJzYfrS9X1akm9fHZNnD9+Vo/4= +github.com/klauspost/compress v1.16.0 h1:iULayQNOReoYUe+1qtKOqw9CwJv3aNQu8ivo7lw1HU4= +github.com/klauspost/compress v1.16.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -106,8 +108,8 @@ github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7 github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 h1:I0XW9+e1XWDxdcEniV4rQAIOPUGDq67JSCiRCgGCZLI= @@ -149,10 +151,10 @@ github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/status-im/keycard-go v0.2.0 h1:QDLFswOQu1r5jsycloeQh3bVU8n/NatHHaZobtDnDzA= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.13 h1:AYeSxdOMacwu7FBmpfloBz5pbFXDmJL33RuwnKtmTjk= +github.com/supranational/blst v0.3.13/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= @@ -165,34 +167,30 @@ github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8kdjVDVAiFMtgUdTSRQ= golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= +golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= +golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= +google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/web3/.env.example b/web3/.env.example index 01255a3f..5acd298a 100644 --- a/web3/.env.example +++ b/web3/.env.example @@ -1,3 +1,10 @@ DEPLOYER_PRIVATE_KEY= # Deployer private key ETHSCAN_API_KEY= # Etherscan API key -ARB_SCAN_API_KEY= # Arbitrum scan API key \ No newline at end of file +ARB_SCAN_API_KEY= # Arbitrum scan API key + +#Metronome .env +INFURA_API_URL= #https://testnet-rpc.game7.io +PRIVATE_KEY= # +FOR_ADDRESS= # +SCHEDULE_ID= #schedule Id i.e. 1 +CONTRACT_ADDRESS= #metronome contract "0x45C681C365520958dB8dBe7550C34fB1336dfA67" \ No newline at end of file diff --git a/web3/constants/network.ts b/web3/constants/network.ts index f65235e6..e5e1212d 100644 --- a/web3/constants/network.ts +++ b/web3/constants/network.ts @@ -18,16 +18,15 @@ export enum ChainId { Ethereum = 1, Goerli = 5, Sepolia = 11155111, - ZkSync = 324, - ZkSyncSepolia = 300, ArbitrumOne = 42161, ArbitrumSepolia = 421614, OPMainnet = 10, OPSepolia = 11155420, Base = 8453, BaseSepolia = 84532, - Game7OrbitArbSepolia = 7007007, - Game7OrbitBaseSepolia = 7770007, + Game7Testnet = 13746, + Linea = 59144, + LineaSepolia = 59141, } export enum NetworkName { @@ -40,16 +39,15 @@ export enum NetworkName { Sepolia = 'sepolia', Mantle = 'mantle', MantleSepolia = 'mantleSepolia', - ZkSync = 'zkSync', - ZkSyncSepolia = 'zkSyncSepolia', ArbitrumOne = 'arbitrumOne', ArbitrumSepolia = 'arbitrumSepolia', OPMainnet = 'OPMainnet', OPSepolia = 'OPSepolia', Base = 'base', BaseSepolia = 'baseSepolia', - Game7OrbitArbSepolia = 'game7OrbitArbSepolia', - Game7OrbitBaseSepolia = 'game7OrbitBaseSepolia', + Game7Testnet = 'game7Testnet', + LineaSepolia = 'lineaSepolia', + Linea = 'linea', } export enum NetworkConfigFile { @@ -63,16 +61,15 @@ export enum NetworkConfigFile { Sepolia = 'hardhat.config.ts', Mantle = 'mantle.config.ts', MantleSepolia = 'mantle.config.ts', - ZkSync = 'zkSync.config.ts', - ZkSyncSepolia = 'zkSync.config.ts', ArbitrumOne = 'arbitrum.config.ts', ArbitrumSepolia = 'arbitrum.config.ts', OPMainnet = 'op.config.ts', OPSepolia = 'op.config.ts', Base = 'base.config.ts', BaseSepolia = 'base.config.ts', - Game7OrbitArbSepolia = 'g7.config.ts', - Game7OrbitBaseSepolia = 'g7.config.ts', + Game7Testnet = 'g7.config.ts', + Linea = 'linea.config.ts', + LineaSepolia = 'linea.config.ts', } export enum Currency { @@ -85,17 +82,15 @@ export enum Currency { Sepolia = 'ETH', Mantle = 'MNT', MantleSepolia = 'MNT', - ZkSync = 'ETH', - ZkSyncSepolia = 'ETH', ArbitrumOne = 'ETH', ArbitrumSepolia = 'ETH', OPMainnet = 'ETH', OPSepolia = 'ETH', Base = 'ETH', BaseSepolia = 'ETH', - Game7Sepolia = 'ETH', - Game7OrbitArbSepolia = 'Iron', - Game7OrbitBaseSepolia = 'Iron', + Game7Testnet = 'TG7T', + Linea = 'ETH', + LineaSepolia = 'ETH', } export enum NetworkExplorer { @@ -108,17 +103,15 @@ export enum NetworkExplorer { Sepolia = 'https://sepolia.etherscan.io', Mantle = 'https://explorer.mantle.xyz', MantleSepolia = 'https://explorer.sepolia.mantle.xyz', - ZkSync = 'https://explorer.zksync.io', - ZkSyncSepolia = 'https://zksync-sepolia.blockscout.com', ArbitrumOne = 'https://arbiscan.io', ArbitrumSepolia = 'https://sepolia.arbiscan.io', OPMainnet = 'https://optimistic.etherscan.io', OPSepolia = 'https://sepolia-optimistic.etherscan.io', Base = 'https://basescan.org', BaseSepolia = 'https://base-sepolia.blockscout.com', - // this will change to: testnet.explorer.game7.io - Game7OrbitArbSepolia = 'https://explorerl2new-game7-arb-anytrust-wcj9hysn7y.t.conduit.xyz', - Game7OrbitBaseSepolia = 'https://explorerl2new-game7-base-anytrust-zuthm7ggv0.t.conduit.xyz', + Game7Testnet = 'https://testnet.game7.io', + Linea = 'https://api.lineascan.build', + LineaSepolia = 'https://api.sepolia.lineascan.build', } export function getTransactionUrl(txHash: string, network: NetworkName): string { @@ -138,15 +131,13 @@ export const rpcUrls = { [ChainId.PolygonMumbai]: 'https://rpc.ankr.com/polygon_mumbai', [ChainId.Mantle]: 'https://rpc.mantle.xyz', [ChainId.MantleSepolia]: 'https://rpc.sepolia.mantle.xyz', - [ChainId.ZkSync]: 'https://mainnet.era.zksync.io', - [ChainId.ZkSyncSepolia]: 'https://sepolia.era.zksync.dev', [ChainId.ArbitrumOne]: 'https://arb1.arbitrum.io/rpc', [ChainId.ArbitrumSepolia]: 'https://sepolia-rollup.arbitrum.io/rpc', [ChainId.OPMainnet]: 'https://mainnet.optimism.io', [ChainId.OPSepolia]: 'https://sepolia.optimism.io', [ChainId.Base]: 'https://mainnet.base.org', [ChainId.BaseSepolia]: 'https://sepolia.base.org', - // this will change to: rpc.sepolia.game7.io - [ChainId.Game7OrbitArbSepolia]: 'https://rpc-game7-arb-anytrust-wcj9hysn7y.t.conduit.xyz', - [ChainId.Game7OrbitBaseSepolia]: 'https://rpc-game7-base-anytrust-zuthm7ggv0.t.conduit.xyz', + [ChainId.Game7Testnet]: 'https://testnet-rpc.game7.io', + [ChainId.Linea]: 'https://rpc.linea.build', + [ChainId.LineaSepolia]: 'https://rpc.sepolia.linea.build', }; diff --git a/web3/constants/time.ts b/web3/constants/time.ts index cf3cf841..96863662 100644 --- a/web3/constants/time.ts +++ b/web3/constants/time.ts @@ -1 +1 @@ -export const ONE_DAY = 86400; \ No newline at end of file +export const ONE_DAY = 86400; diff --git a/web3/contracts/deploy/ImmutableCreate2Factory.sol b/web3/contracts/deploy/ImmutableCreate2Factory.sol deleted file mode 100644 index 06a51a26..00000000 --- a/web3/contracts/deploy/ImmutableCreate2Factory.sol +++ /dev/null @@ -1,211 +0,0 @@ -/** - *Submitted for verification at Arbiscan on 2023-04-08 -*/ - -/** - *Submitted for verification at Etherscan.io on 2019-07-30 -*/ - -pragma solidity 0.5.10; // optimization enabled, 99999 runs, evm: petersburg - - -/** - * @title Immutable Create2 Contract Factory - * @author 0age - * @notice This contract provides a safeCreate2 function that takes a salt value - * and a block of initialization code as arguments and passes them into inline - * assembly. The contract prevents redeploys by maintaining a mapping of all - * contracts that have already been deployed, and prevents frontrunning or other - * collisions by requiring that the first 20 bytes of the salt are equal to the - * address of the caller (this can be bypassed by setting the first 20 bytes to - * the null address). There is also a view function that computes the address of - * the contract that will be created when submitting a given salt or nonce along - * with a given block of initialization code. - * @dev This contract has not yet been fully tested or audited - proceed with - * caution and please share any exploits or optimizations you discover. - */ -contract ImmutableCreate2Factory { - // mapping to track which addresses have already been deployed. - mapping(address => bool) private _deployed; - - /** - * @dev Create a contract using CREATE2 by submitting a given salt or nonce - * along with the initialization code for the contract. Note that the first 20 - * bytes of the salt must match those of the calling address, which prevents - * contract creation events from being submitted by unintended parties. - * @param salt bytes32 The nonce that will be passed into the CREATE2 call. - * @param initializationCode bytes The initialization code that will be passed - * into the CREATE2 call. - * @return Address of the contract that will be created, or the null address - * if a contract already exists at that address. - */ - function safeCreate2( - bytes32 salt, - bytes calldata initializationCode - ) external payable containsCaller(salt) returns (address deploymentAddress) { - // move the initialization code from calldata to memory. - bytes memory initCode = initializationCode; - - // determine the target address for contract deployment. - address targetDeploymentAddress = address( - uint160( // downcast to match the address type. - uint256( // convert to uint to truncate upper digits. - keccak256( // compute the CREATE2 hash using 4 inputs. - abi.encodePacked( // pack all inputs to the hash together. - hex"ff", // start with 0xff to distinguish from RLP. - address(this), // this contract will be the caller. - salt, // pass in the supplied salt value. - keccak256( // pass in the hash of initialization code. - abi.encodePacked( - initCode - ) - ) - ) - ) - ) - ) - ); - - // ensure that a contract hasn't been previously deployed to target address. - require( - !_deployed[targetDeploymentAddress], - "Invalid contract creation - contract has already been deployed." - ); - - // using inline assembly: load data and length of data, then call CREATE2. - assembly { // solhint-disable-line - let encoded_data := add(0x20, initCode) // load initialization code. - let encoded_size := mload(initCode) // load the init code's length. - deploymentAddress := create2( // call CREATE2 with 4 arguments. - callvalue, // forward any attached value. - encoded_data, // pass in initialization code. - encoded_size, // pass in init code's length. - salt // pass in the salt value. - ) - } - - // check address against target to ensure that deployment was successful. - require( - deploymentAddress == targetDeploymentAddress, - "Failed to deploy contract using provided salt and initialization code." - ); - - // record the deployment of the contract to prevent redeploys. - _deployed[deploymentAddress] = true; - } - - /** - * @dev Compute the address of the contract that will be created when - * submitting a given salt or nonce to the contract along with the contract's - * initialization code. The CREATE2 address is computed in accordance with - * EIP-1014, and adheres to the formula therein of - * `keccak256( 0xff ++ address ++ salt ++ keccak256(init_code)))[12:]` when - * performing the computation. The computed address is then checked for any - * existing contract code - if so, the null address will be returned instead. - * @param salt bytes32 The nonce passed into the CREATE2 address calculation. - * @param initCode bytes The contract initialization code to be used. - * that will be passed into the CREATE2 address calculation. - * @return Address of the contract that will be created, or the null address - * if a contract has already been deployed to that address. - */ - function findCreate2Address( - bytes32 salt, - bytes calldata initCode - ) external view returns (address deploymentAddress) { - // determine the address where the contract will be deployed. - deploymentAddress = address( - uint160( // downcast to match the address type. - uint256( // convert to uint to truncate upper digits. - keccak256( // compute the CREATE2 hash using 4 inputs. - abi.encodePacked( // pack all inputs to the hash together. - hex"ff", // start with 0xff to distinguish from RLP. - address(this), // this contract will be the caller. - salt, // pass in the supplied salt value. - keccak256( // pass in the hash of initialization code. - abi.encodePacked( - initCode - ) - ) - ) - ) - ) - ) - ); - - // return null address to signify failure if contract has been deployed. - if (_deployed[deploymentAddress]) { - return address(0); - } - } - - /** - * @dev Compute the address of the contract that will be created when - * submitting a given salt or nonce to the contract along with the keccak256 - * hash of the contract's initialization code. The CREATE2 address is computed - * in accordance with EIP-1014, and adheres to the formula therein of - * `keccak256( 0xff ++ address ++ salt ++ keccak256(init_code)))[12:]` when - * performing the computation. The computed address is then checked for any - * existing contract code - if so, the null address will be returned instead. - * @param salt bytes32 The nonce passed into the CREATE2 address calculation. - * @param initCodeHash bytes32 The keccak256 hash of the initialization code - * that will be passed into the CREATE2 address calculation. - * @return Address of the contract that will be created, or the null address - * if a contract has already been deployed to that address. - */ - function findCreate2AddressViaHash( - bytes32 salt, - bytes32 initCodeHash - ) external view returns (address deploymentAddress) { - // determine the address where the contract will be deployed. - deploymentAddress = address( - uint160( // downcast to match the address type. - uint256( // convert to uint to truncate upper digits. - keccak256( // compute the CREATE2 hash using 4 inputs. - abi.encodePacked( // pack all inputs to the hash together. - hex"ff", // start with 0xff to distinguish from RLP. - address(this), // this contract will be the caller. - salt, // pass in the supplied salt value. - initCodeHash // pass in the hash of initialization code. - ) - ) - ) - ) - ); - - // return null address to signify failure if contract has been deployed. - if (_deployed[deploymentAddress]) { - return address(0); - } - } - - /** - * @dev Determine if a contract has already been deployed by the factory to a - * given address. - * @param deploymentAddress address The contract address to check. - * @return True if the contract has been deployed, false otherwise. - */ - function hasBeenDeployed( - address deploymentAddress - ) external view returns (bool) { - // determine if a contract has been deployed to the provided address. - return _deployed[deploymentAddress]; - } - - /** - * @dev Modifier to ensure that the first 20 bytes of a submitted salt match - * those of the calling account. This provides protection against the salt - * being stolen by frontrunners or other attackers. The protection can also be - * bypassed if desired by setting each of the first 20 bytes to zero. - * @param salt bytes32 The salt value to check against the calling address. - */ - modifier containsCaller(bytes32 salt) { - // prevent contract submissions from being stolen from tx.pool by requiring - // that the first 20 bytes of the submitted salt match msg.sender. - require( - (address(bytes20(salt)) == msg.sender) || - (bytes20(salt) == bytes20(0)), - "Invalid salt - first 20 bytes of the salt must match calling address." - ); - _; - } -} \ No newline at end of file diff --git a/web3/contracts/faucet/TokenFaucet.sol b/web3/contracts/faucet/TokenFaucet.sol index 978b1e06..8cec77df 100644 --- a/web3/contracts/faucet/TokenFaucet.sol +++ b/web3/contracts/faucet/TokenFaucet.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import { IERC20 } from "../interfaces/IERC20.sol"; diff --git a/web3/contracts/faucet/TokenSender.sol b/web3/contracts/faucet/TokenSender.sol index 81204c62..7ba62e80 100644 --- a/web3/contracts/faucet/TokenSender.sol +++ b/web3/contracts/faucet/TokenSender.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /** diff --git a/web3/contracts/interfaces/IStaker.sol b/web3/contracts/interfaces/IStaker.sol new file mode 100644 index 00000000..77765205 --- /dev/null +++ b/web3/contracts/interfaces/IStaker.sol @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + + +import { StakingPool, Position } from "../staking/data.sol"; +import { PositionMetadata } from "../staking/PositionMetadata.sol"; + +interface IStaker { + + function positionMetadataAddress() external view returns (address); + + function TotalPools() external view returns (uint256); + + function TotalPositions() external view returns (uint256); + + function CurrentAmountInPool(uint256 poolID) external view returns (uint256); + + function CurrentPositionsInPool(uint256 poolID) external view returns (uint256); + + function Pools(uint256 poolID) external view returns ( + address administrator, + uint256 tokenType, + address tokenAddress, + uint256 tokenID, + bool transferable, + uint256 lockupSeconds, + uint256 cooldownSeconds + ); + + function Positions(uint256 positionTokenID) external view returns ( + uint256 poolID, + uint256 amountOrTokenID, + uint256 stakeTimestamp, + uint256 unstakeInitiatedAt + ); + + event StakingPoolCreated( + uint256 indexed poolID, + uint256 indexed tokenType, + address indexed tokenAddress, + uint256 tokenID + ); + + event StakingPoolConfigured( + uint256 indexed poolID, + address indexed administrator, + bool transferable, + uint256 lockupSeconds, + uint256 cooldownSeconds + ); + + event Staked( + uint256 positionTokenID, + address indexed owner, + uint256 indexed poolID, + uint256 amountOrTokenID + ); + + event UnstakeInitiated(uint256 positionTokenID, address indexed owner); + + event Unstaked( + uint256 positionTokenID, + address indexed owner, + uint256 indexed poolID, + uint256 amountOrTokenID + ); + + function createPool( + uint256 tokenType, + address tokenAddress, + uint256 tokenID, + bool transferable, + uint256 lockupSeconds, + uint256 cooldownSeconds + ) external; + + function updatePoolConfiguration( + uint256 poolID, + bool changeTransferability, + bool transferable, + bool changeLockup, + uint256 lockupSeconds, + bool changeCooldown, + uint256 cooldownSeconds + ) external; + + function transferPoolAdministration(uint256 poolID, address newAdministrator) external; + + function stakeNative(address user, uint256 poolID) external payable returns (uint256 positionTokenID); + + function stakeERC20(address user, uint256 poolID, uint256 amount) external returns (uint256 positionTokenID); + + function stakeERC721(address user, uint256 poolID, uint256 tokenID) external returns (uint256 positionTokenID); + + function stakeERC1155(address user, uint256 poolID, uint256 amount) external returns (uint256 positionTokenID); + + function initiateUnstake(uint256 positionTokenID) external; + + function unstake(uint256 positionTokenID) external; + + function tokenURI(uint256 tokenId) external view returns (string memory); +} \ No newline at end of file diff --git a/web3/contracts/metronome/Metronome.sol b/web3/contracts/metronome/Metronome.sol new file mode 100644 index 00000000..f07d47f7 --- /dev/null +++ b/web3/contracts/metronome/Metronome.sol @@ -0,0 +1,86 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.24; + +import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; + +struct Schedule { + uint256 remainder; + uint256 divisor; + uint256 bounty; +} + +contract Metronome is ReentrancyGuard { + mapping(uint256 => Schedule) public Schedules; + mapping(uint256 => uint256) public ScheduleBalances; + // scheduleID => blockNumber => true if claimed already and false if not + mapping(uint256 => mapping(uint256 => bool)) public ClaimedBounties; + uint256 public NumSchedules; + + event ScheduleCreated( + uint256 indexed scheduleID, + uint256 indexed remainder, + uint256 indexed divisor, + uint256 bounty + ); + event BalanceIncreased(uint256 indexed scheduleID, uint256 amount); + event BountyClaimed(uint256 indexed scheduleID, address indexed forAddress, uint256 payment); + + error InvalidSchedule(); + + function createSchedule( + uint256 remainder, + uint256 divisor, + uint256 bounty + ) external payable returns (uint256 scheduleID) { + if (divisor == 0) { + revert InvalidSchedule(); + } + if (bounty == 0) { + revert InvalidSchedule(); + } + if (remainder >= divisor) { + revert InvalidSchedule(); + } + scheduleID = NumSchedules; + NumSchedules++; + Schedules[scheduleID] = Schedule(remainder, divisor, bounty); + emit ScheduleCreated(scheduleID, remainder, divisor, bounty); + if (msg.value > 0) { + ScheduleBalances[scheduleID] = msg.value; + emit BalanceIncreased(scheduleID, msg.value); + } + } + + function increaseBalance(uint256 scheduleID) external payable { + ScheduleBalances[scheduleID] += msg.value; + emit BalanceIncreased(scheduleID, msg.value); + } + + function _claim(uint256 scheduleID, address forAddress) internal { + if ( + !ClaimedBounties[scheduleID][block.number] && + (block.number % Schedules[scheduleID].divisor == Schedules[scheduleID].remainder) + ) { + uint256 payment = ScheduleBalances[scheduleID]; + if (payment > Schedules[scheduleID].bounty) { + payment = Schedules[scheduleID].bounty; + } + if (payment > 0) { + ClaimedBounties[scheduleID][block.number] = true; + ScheduleBalances[scheduleID] -= payment; + payable(forAddress).transfer(payment); + emit BountyClaimed(scheduleID, forAddress, payment); + } + } + } + + function claim(uint256 scheduleID, address forAddress) external nonReentrant { + _claim(scheduleID, forAddress); + } + + function claimBatch(uint256[] memory scheduleIDs, address forAddress) external nonReentrant { + for (uint256 i = 0; i < scheduleIDs.length; i++) { + _claim(scheduleIDs[i], forAddress); + } + } +} diff --git a/web3/contracts/mock/tokens.sol b/web3/contracts/mock/tokens.sol index 6e4e675e..c2091c40 100644 --- a/web3/contracts/mock/tokens.sol +++ b/web3/contracts/mock/tokens.sol @@ -1,3 +1,6 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.24; + import { ERC20 } from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import { ERC721 } from "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import { ERC1155 } from "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; diff --git a/web3/contracts/staking/PositionMetadata.sol b/web3/contracts/staking/PositionMetadata.sol index f0049582..2562bbe3 100644 --- a/web3/contracts/staking/PositionMetadata.sol +++ b/web3/contracts/staking/PositionMetadata.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol"; diff --git a/web3/contracts/staking/Staker.sol b/web3/contracts/staking/Staker.sol index 15185898..f17b519a 100644 --- a/web3/contracts/staking/Staker.sol +++ b/web3/contracts/staking/Staker.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; @@ -136,7 +136,8 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { uint256 tokenID, bool transferable, uint256 lockupSeconds, - uint256 cooldownSeconds + uint256 cooldownSeconds, + address administrator ) external { if (tokenType == NATIVE_TOKEN_TYPE) { if (tokenAddress != address(0) || tokenID != 0) { @@ -159,7 +160,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { } Pools[TotalPools] = StakingPool({ - administrator: msg.sender, + administrator: administrator, tokenType: tokenType, tokenAddress: tokenAddress, tokenID: tokenID, @@ -169,7 +170,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { }); emit StakingPoolCreated(TotalPools, tokenType, tokenAddress, tokenID); - emit StakingPoolConfigured(TotalPools, msg.sender, transferable, lockupSeconds, cooldownSeconds); + emit StakingPoolConfigured(TotalPools, administrator, transferable, lockupSeconds, cooldownSeconds); TotalPools++; } @@ -181,7 +182,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { * * @param poolID The ID of the staking pool to update configuration of. * @param changeTransferability Specifies whether the current call is updating the transferability of the pool or not. If this is false, then the value of the `transferable` argument will be ignored. - * @param transferable Whether or not the pool should be transferable. This argument is only applied if `changeTransferabiliy` is `true`. + * @param transferable Whether or not the pool should be transferable. This argument is only applied if `changeTransferability` is `true`. * @param changeLockup Specifies whether the current call is updating the `lockupSeconds` configuration of the pool or not. If this is false, then the value of the `lockupSeconds` argument will be ignored. * @param lockupSeconds The new value for the `lockupSeconds` member of the pool. This argument is only applied if `changeLockup` is `true`. * @param changeCooldown Specifies whether the current call is updating the `cooldownSeconds` configuration of the pool or not. If this is false, then the value of the `cooldownSeconds` argument will be ignored. @@ -241,7 +242,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { /** * @notice Allows anyone to open a position under a staking pool for native tokens. */ - function stakeNative(uint256 poolID) external payable nonReentrant returns (uint256 positionTokenID) { + function stakeNative(address positionHolder, uint256 poolID) external payable nonReentrant returns (uint256 positionTokenID) { StakingPool storage pool = Pools[poolID]; if (pool.tokenType != NATIVE_TOKEN_TYPE) { revert IncorrectTokenType(poolID, pool.tokenType, NATIVE_TOKEN_TYPE); @@ -252,7 +253,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { } positionTokenID = TotalPositions++; - _mint(msg.sender, positionTokenID); + _mint(positionHolder, positionTokenID); Positions[positionTokenID] = Position({ poolID: poolID, @@ -264,7 +265,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { CurrentAmountInPool[poolID] += msg.value; CurrentPositionsInPool[poolID]++; - emit Staked(positionTokenID, msg.sender, poolID, msg.value); + emit Staked(positionTokenID, positionHolder, poolID, msg.value); } /** @@ -277,12 +278,14 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { * `amount` tokens from their account. This can typically be done by calling the `approve` method on the * ERC20 contract. */ - function stakeERC20(uint256 poolID, uint256 amount) external nonReentrant returns (uint256 positionTokenID) { + function stakeERC20(address positionHolder, uint256 poolID, uint256 amount) external nonReentrant returns (uint256 positionTokenID) { + StakingPool storage pool = Pools[poolID]; if (pool.tokenType != ERC20_TOKEN_TYPE) { revert IncorrectTokenType(poolID, pool.tokenType, ERC20_TOKEN_TYPE); } + if (amount == 0) { revert NothingToStake(); } @@ -290,7 +293,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { IERC20(pool.tokenAddress).safeTransferFrom(msg.sender, address(this), amount); positionTokenID = TotalPositions++; - _mint(msg.sender, positionTokenID); + _mint(positionHolder, positionTokenID); Positions[positionTokenID] = Position({ poolID: poolID, @@ -302,7 +305,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { CurrentAmountInPool[poolID] += amount; CurrentPositionsInPool[poolID]++; - emit Staked(positionTokenID, msg.sender, poolID, amount); + emit Staked(positionTokenID, positionHolder, poolID, amount); } /** @@ -314,7 +317,8 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { * the token with the given `tokenID` from their account. This can typically be done by calling the `approve` * or `setApprovalForAll` methods on the ERC721 contract. */ - function stakeERC721(uint256 poolID, uint256 tokenID) external nonReentrant returns (uint256 positionTokenID) { + function stakeERC721(address positionHolder, uint256 poolID, uint256 tokenID) external nonReentrant returns (uint256 positionTokenID) { + StakingPool storage pool = Pools[poolID]; if (pool.tokenType != ERC721_TOKEN_TYPE) { revert IncorrectTokenType(poolID, pool.tokenType, ERC721_TOKEN_TYPE); @@ -323,7 +327,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { IERC721(pool.tokenAddress).safeTransferFrom(msg.sender, address(this), tokenID); positionTokenID = TotalPositions++; - _mint(msg.sender, positionTokenID); + _mint(positionHolder, positionTokenID); Positions[positionTokenID] = Position({ poolID: poolID, @@ -335,7 +339,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { CurrentAmountInPool[poolID]++; CurrentPositionsInPool[poolID]++; - emit Staked(positionTokenID, msg.sender, poolID, tokenID); + emit Staked(positionTokenID, positionHolder, poolID, tokenID); } /** @@ -345,7 +349,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { * `amount` tokens with the given `tokenId` from their account. This can typically be done by calling * the `setApprovalForAll` method on the ERC1155 contract. */ - function stakeERC1155(uint256 poolID, uint256 amount) external nonReentrant returns (uint256 positionTokenID) { + function stakeERC1155(address positionHolder, uint256 poolID, uint256 amount) external nonReentrant returns (uint256 positionTokenID) { StakingPool storage pool = Pools[poolID]; if (pool.tokenType != ERC1155_TOKEN_TYPE) { revert IncorrectTokenType(poolID, pool.tokenType, ERC1155_TOKEN_TYPE); @@ -358,7 +362,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { IERC1155(pool.tokenAddress).safeTransferFrom(msg.sender, address(this), pool.tokenID, amount, ""); positionTokenID = TotalPositions++; - _mint(msg.sender, positionTokenID); + _mint(positionHolder, positionTokenID); Positions[positionTokenID] = Position({ poolID: poolID, @@ -370,7 +374,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { CurrentAmountInPool[poolID] += amount; CurrentPositionsInPool[poolID]++; - emit Staked(positionTokenID, msg.sender, poolID, amount); + emit Staked(positionTokenID, positionHolder, poolID, amount); } /** @@ -387,13 +391,14 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { */ function initiateUnstake(uint256 positionTokenID) external nonReentrant { address positionOwner = ownerOf(positionTokenID); - if (positionOwner != msg.sender) { - revert UnauthorizedForPosition(positionOwner, msg.sender); - } - Position storage position = Positions[positionTokenID]; + StakingPool storage pool = Pools[position.poolID]; + if (positionOwner != msg.sender && pool.administrator != msg.sender) { + revert UnauthorizedForPosition(positionOwner, msg.sender); + } + // Enforce lockup period if (block.timestamp < position.stakeTimestamp + pool.lockupSeconds) { revert LockupNotExpired(position.stakeTimestamp + pool.lockupSeconds); @@ -401,7 +406,7 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { if (position.unstakeInitiatedAt == 0) { position.unstakeInitiatedAt = block.timestamp; - emit UnstakeInitiated(positionTokenID, msg.sender); + emit UnstakeInitiated(positionTokenID, positionOwner); } } @@ -413,16 +418,15 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { * expire before calling this method. */ function unstake(uint256 positionTokenID) external nonReentrant { - { - address positionOwner = ownerOf(positionTokenID); - if (positionOwner != msg.sender) { - revert UnauthorizedForPosition(positionOwner, msg.sender); - } - } - Position storage position = Positions[positionTokenID]; StakingPool storage pool = Pools[position.poolID]; + address positionOwner = ownerOf(positionTokenID); + + if (positionOwner != msg.sender && pool.administrator != msg.sender) { + revert UnauthorizedForPosition(positionOwner, msg.sender); + } + // Enforce cooldown, but only if the pool has a cooldown period. if (pool.cooldownSeconds > 0) { // This branch doesn't enforce the lockup period as that has already been enforced in `initiateUnstake`. @@ -448,19 +452,19 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { // Delete position data and burn the position token uint256 amountOrTokenID = position.amountOrTokenID; - emit Unstaked(positionTokenID, msg.sender, position.poolID, amountOrTokenID); + emit Unstaked(positionTokenID, positionOwner, position.poolID, amountOrTokenID); delete Positions[positionTokenID]; _burn(positionTokenID); // Return the staked tokens. if (pool.tokenType == NATIVE_TOKEN_TYPE) { - payable(msg.sender).transfer(amountOrTokenID); + payable(positionOwner).transfer(amountOrTokenID); } else if (pool.tokenType == ERC20_TOKEN_TYPE) { - IERC20(pool.tokenAddress).safeTransfer(msg.sender, amountOrTokenID); + IERC20(pool.tokenAddress).safeTransfer(positionOwner, amountOrTokenID); } else if (pool.tokenType == ERC721_TOKEN_TYPE) { - IERC721(pool.tokenAddress).safeTransferFrom(address(this), msg.sender, amountOrTokenID); + IERC721(pool.tokenAddress).safeTransferFrom(address(this), positionOwner, amountOrTokenID); } else if (pool.tokenType == ERC1155_TOKEN_TYPE) { - IERC1155(pool.tokenAddress).safeTransferFrom(address(this), msg.sender, pool.tokenID, amountOrTokenID, ""); + IERC1155(pool.tokenAddress).safeTransferFrom(address(this), positionOwner, pool.tokenID, amountOrTokenID, ""); } } @@ -479,4 +483,4 @@ contract Staker is ERC721Enumerable, ReentrancyGuard { } return abi.decode(resultBytes, (string)); } -} +} \ No newline at end of file diff --git a/web3/contracts/staking/data.sol b/web3/contracts/staking/data.sol index 4f15efa8..44071bbc 100644 --- a/web3/contracts/staking/data.sol +++ b/web3/contracts/staking/data.sol @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; /** diff --git a/web3/contracts/token/ERC20.sol b/web3/contracts/token/ERC20.sol index 2a733b19..c3ee1775 100644 --- a/web3/contracts/token/ERC20.sol +++ b/web3/contracts/token/ERC20.sol @@ -1,11 +1,11 @@ -// SPDX-License-Identifier: UNLICENSED +// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import { IERC20 } from '../interfaces/IERC20.sol'; /** * @title ERC20 Token - * @author Game7 Engineering Team - engineering@game7.io + * @author Game7 Engineering Team - worldbuilder@game7.io * @dev Adapted from WETH9: https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code */ contract ERC20 is IERC20 { diff --git a/web3/hardhat.config.ts b/web3/hardhat.config.ts index 568134ea..0c858b10 100644 --- a/web3/hardhat.config.ts +++ b/web3/hardhat.config.ts @@ -1,93 +1,78 @@ -import { HardhatUserConfig } from "hardhat/config"; -import "@nomicfoundation/hardhat-toolbox"; -import * as dotenv from 'dotenv' -import { ChainId, NetworkExplorer, NetworkName, rpcUrls } from "./constants/network"; -import "@nomicfoundation/hardhat-foundry"; -import "./tasks/deploy-safe"; +import { HardhatUserConfig } from 'hardhat/config'; +import '@nomicfoundation/hardhat-toolbox'; +import '@nomicfoundation/hardhat-foundry'; +import * as dotenv from 'dotenv'; +import { ChainId, NetworkExplorer, NetworkName, rpcUrls } from './constants/network'; +import './tasks/deploy-safe'; -dotenv.config() +dotenv.config(); -const yes = ["true", "t", "yes", "y", "1"] -const GAS_PROFILER = yes.includes((process.env.GAS_PROFILER || "").toLowerCase()); +const yes = ['true', 't', 'yes', 'y', '1']; +const GAS_PROFILER = yes.includes((process.env.GAS_PROFILER || '').toLowerCase()); -const { - ETHSCAN_API_KEY, - ARB_SCAN_API_KEY, -} = process.env +const { ETHSCAN_API_KEY, ARB_SCAN_API_KEY } = process.env; const config: HardhatUserConfig = { - solidity: { - compilers: [ - { - version: "0.5.10", - settings: { - optimizer: { - enabled: true, - runs: 99999, - }, - }, - }, - { - version: "0.8.24", - settings: { - optimizer: { - enabled: true, - runs: 99999, - }, - }, - }, - ], - }, - gasReporter: { - enabled: GAS_PROFILER, - }, - etherscan: { - apiKey: { - [NetworkName.Ethereum]: ETHSCAN_API_KEY || '', - [NetworkName.ArbitrumOne]: ARB_SCAN_API_KEY || '', - [NetworkName.ArbitrumSepolia]: ARB_SCAN_API_KEY || '', + solidity: { + compilers: [ + { + version: '0.5.10', + settings: { + optimizer: { + enabled: true, + runs: 99999, + }, + }, + }, + { + version: '0.8.24', + settings: { + optimizer: { + enabled: true, + runs: 99999, + }, + }, + }, + ], }, - customChains: [ - { - network: NetworkName.Game7OrbitArbSepolia, - chainId: ChainId.Game7OrbitArbSepolia, - urls: { - apiURL: `${NetworkExplorer.Game7OrbitArbSepolia}/api`, - browserURL: NetworkExplorer.Game7OrbitArbSepolia, - }, - }, - { - network: NetworkName.Game7OrbitBaseSepolia, - chainId: ChainId.Game7OrbitBaseSepolia, - urls: { - apiURL: `${NetworkExplorer.Game7OrbitBaseSepolia}/api`, - browserURL: NetworkExplorer.Game7OrbitBaseSepolia, - }, - }, - ], - }, - networks: { - [NetworkName.Ethereum]: { - chainId: ChainId.Ethereum, - url: rpcUrls[ChainId.Ethereum], + gasReporter: { + enabled: GAS_PROFILER, }, - [NetworkName.ArbitrumOne]: { - chainId: ChainId.ArbitrumOne, - url: rpcUrls[ChainId.ArbitrumOne], - }, - [NetworkName.Game7OrbitArbSepolia]: { - url: rpcUrls[ChainId.Game7OrbitArbSepolia], - chainId: ChainId.Game7OrbitArbSepolia, + etherscan: { + apiKey: { + [NetworkName.Ethereum]: ETHSCAN_API_KEY || '', + [NetworkName.ArbitrumOne]: ARB_SCAN_API_KEY || '', + [NetworkName.ArbitrumSepolia]: ARB_SCAN_API_KEY || '', + }, + customChains: [ + { + network: NetworkName.Game7Testnet, + chainId: ChainId.Game7Testnet, + urls: { + apiURL: `${NetworkExplorer.Game7Testnet}/api`, + browserURL: NetworkExplorer.Game7Testnet, + }, + }, + ], }, - [NetworkName.Game7OrbitBaseSepolia]: { - url: rpcUrls[ChainId.Game7OrbitBaseSepolia], - chainId: ChainId.Game7OrbitBaseSepolia, + networks: { + [NetworkName.Ethereum]: { + chainId: ChainId.Ethereum, + url: rpcUrls[ChainId.Ethereum], + }, + [NetworkName.ArbitrumOne]: { + chainId: ChainId.ArbitrumOne, + url: rpcUrls[ChainId.ArbitrumOne], + }, + [NetworkName.Game7Testnet]: { + url: rpcUrls[ChainId.Game7Testnet], + chainId: ChainId.Game7Testnet, + }, + [NetworkName.ArbitrumSepolia]: { + url: rpcUrls[ChainId.ArbitrumSepolia], + chainId: ChainId.ArbitrumSepolia, + }, }, - [NetworkName.ArbitrumSepolia]: { - url: rpcUrls[ChainId.ArbitrumSepolia], - chainId: ChainId.ArbitrumSepolia, - } - }, }; export default config; diff --git a/web3/helpers/addresses.ts b/web3/helpers/addresses.ts index 87f6b18d..afb5492e 100644 --- a/web3/helpers/addresses.ts +++ b/web3/helpers/addresses.ts @@ -1 +1 @@ -export const IMMUTABLE_CREATE2_FACTORY_ADDRESS = "0x0000000000FFe8B47B3e2130213B802212439497"; \ No newline at end of file +export const IMMUTABLE_CREATE2_FACTORY_ADDRESS = '0x0000000000FFe8B47B3e2130213B802212439497'; diff --git a/web3/helpers/bignumber.ts b/web3/helpers/bignumber.ts index e3bf970b..305d2b9f 100644 --- a/web3/helpers/bignumber.ts +++ b/web3/helpers/bignumber.ts @@ -1,9 +1,9 @@ -import { ethers } from "hardhat"; +import { ethers } from 'hardhat'; export function toWei(value: string | number): bigint { - return ethers.parseEther(value.toString()) + return ethers.parseEther(value.toString()); } export function fromWei(value: string | number): string { - return ethers.formatEther(value.toString()) -} \ No newline at end of file + return ethers.formatEther(value.toString()); +} diff --git a/web3/helpers/type.ts b/web3/helpers/type.ts index e3ef0b80..8eda453f 100644 --- a/web3/helpers/type.ts +++ b/web3/helpers/type.ts @@ -1,24 +1,24 @@ -import { ethers } from "hardhat"; +import { ethers } from 'hardhat'; export type HardhatEthersSigner = Awaited>; export const Networks = { - SEPOLIA: "sepolia", - ARBITRUM_SEPOLIA: "arbitrum-sepolia", - BASE_SEPOLIA: "base-sepolia", - GAME7_TESTNET: "game7-testnet", -} + SEPOLIA: 'sepolia', + ARBITRUM_SEPOLIA: 'arbitrum-sepolia', + BASE_SEPOLIA: 'base-sepolia', + GAME7_TESTNET: 'game7-testnet', +}; export const ChainIds = { [Networks.SEPOLIA]: 1, [Networks.ARBITRUM_SEPOLIA]: 421611, [Networks.BASE_SEPOLIA]: 84532, [Networks.GAME7_TESTNET]: 13746, -} +}; export const TxServiceUrl = { - [ChainIds[Networks.SEPOLIA]]: "https://safe-transaction-sepolia.safe.global", - [ChainIds[Networks.ARBITRUM_SEPOLIA]]: "https://safe-transaction-arbitrum-sepolia.safe.global", - [ChainIds[Networks.BASE_SEPOLIA]]: "https://safe-transaction-base-sepolia.safe.global", - [ChainIds[Networks.GAME7_TESTNET]]: "https://safe-transaction-game7-testnet.safe.global", -} \ No newline at end of file + [ChainIds[Networks.SEPOLIA]]: 'https://safe-transaction-sepolia.safe.global', + [ChainIds[Networks.ARBITRUM_SEPOLIA]]: 'https://safe-transaction-arbitrum-sepolia.safe.global', + [ChainIds[Networks.BASE_SEPOLIA]]: 'https://safe-transaction-base-sepolia.safe.global', + [ChainIds[Networks.GAME7_TESTNET]]: 'https://safe-transaction-game7-testnet.safe.global', +}; diff --git a/web3/package.json b/web3/package.json index 8f015a73..4d4088e2 100644 --- a/web3/package.json +++ b/web3/package.json @@ -1,9 +1,11 @@ { + "name": "@game7/protocol", "scripts": { "test": "hardhat test", "compile": "hardhat compile", "extract-abis": "./extract-abis.sh", - "typechain": "hardhat typechain" + "typechain": "hardhat typechain", + "format": "prettier --write \"**/*.ts\"" }, "devDependencies": { "@nomicfoundation/hardhat-foundry": "^1.1.2", diff --git a/web3/scripts/bridge-example.md b/web3/scripts/bridge-example.md index 95780099..dd8f0083 100644 --- a/web3/scripts/bridge-example.md +++ b/web3/scripts/bridge-example.md @@ -9,7 +9,7 @@ This checklist describes how to bridge tokens ```bash export L1_RPC=https://sepolia.infura.io/v3/25531dd362e441289ebba71d0b134a6a export L2_RPC=https://sepolia-rollup.arbitrum.io/rpc -export L3_RPC=https://rpc-game7-testnet-2g3y2k9azw.t.conduit.xyz +export L3_RPC=https://testnet-rpc.game7.io export L1_TOKEN=0xac4d9E47765358f8cbD10D3C14246509E39B6251 export L1L2_ROUTER=0xce18836b233c83325cc8848ca4487e94c6288264 export L2L3_ROUTER=0xb43F7D804Ec38B74f9230128D12e1F29590cc65e diff --git a/web3/scripts/bridge.md b/web3/scripts/bridge.md index e7ee4fc7..fe74e458 100644 --- a/web3/scripts/bridge.md +++ b/web3/scripts/bridge.md @@ -23,7 +23,7 @@ This checklist describes how to bridge tokens - [ ] Teleporting tokens from L1 to L3 and calling stake function ```bash -bin/game7 bridge l1-to-l3 \ +bin/game7 bridge native-token l1-to-l3 \ --teleporter $TELEPORTER \ --l1-rpc $L1_RPC \ --l2-rpc $L2_RPC \ @@ -68,7 +68,7 @@ bin/game7 token approve \ - [ ] bridge native tokens from L1 to L2 and calling stake function (works for L2 to L3 as well) ```bash -bin/game7 bridge l1-to-l2 \ +bin/game7 bridge native-token l1-to-l2 \ --inbox $INBOX \ --l1-rpc $L1_RPC \ --l2-rpc $L2_RPC \ @@ -79,4 +79,29 @@ bin/game7 bridge l1-to-l2 \ --password $PASSWORD ``` -Output: Transaction Hash \ No newline at end of file +Output: Transaction Hash + +## Bridge ERC20 tokens from L1 to L2 + +### Environment variables + +- [ ] `export L1_RPC=` +- [ ] `export KEY=` +- [ ] `export PASSWORD=` +- [ ] `export L1_ROUTER=` +- [ ] `export L1_TOKEN=` +- [ ] `export L1_SAFE=` +- [ ] `export L2_SAFE=` + +### Bridge Tokens + +```bash +bin/game7 bridge erc20 l1-to-l2 \ + --amount $AMOUNT \ + --keyfile $KEY \ + --router $L1_ROUTER \ + --to $L2_SAFE \ + --token $L1_TOKEN \ + --l1-rpc $L1_RPC \ + --safe $L1_SAFE +``` \ No newline at end of file diff --git a/web3/scripts/metronome.md b/web3/scripts/metronome.md new file mode 100644 index 00000000..ed2fb115 --- /dev/null +++ b/web3/scripts/metronome.md @@ -0,0 +1,44 @@ + +## Environment variables + +- [ ] `export RPC=https://testnet-rpc.game7.io` +- [ ] `export KEY=.secrets/dao-dev.json` +- [ ] `export CONTRACT=0x45C681C365520958dB8dBe7550C34fB1336dfA67` +- [ ] `export BOUNTY=1` +- [ ] `export REMAINDER=0` +- [ ] `export DIVISOR=1` +- [ ] `export VALUE=100000000` + +## Deployment + +- [ ] Deploy Game7 Token Faucet contract + +```bash +bin/game7 metronome deploy \ + --rpc $RPC \ + --keyfile $KEY +``` + +## Create Schedule + +- [ ] Create a Schedule + +```bash +bin/game7 metronome create-schedule \ + --contract $CONTRACT \ + --rpc $RPC \ + --keyfile $KEY \ + --bounty $BOUNTY \ + --remainder $REMAINDER \ + --divisor $DIVISOR \ + --value $VALUE +``` +- [ ] `export ARG=0` +- [ ] `export LASTBLOCK=45921` +```bash +bin/game7 metronome schedules-balances \ + --contract $CONTRACT \ + --rpc $RPC \ + --arg-0 $ARG \ + --block $LASTBLOCK +``` \ No newline at end of file diff --git a/web3/scripts/mock.game7-testnet.md b/web3/scripts/mock.game7-testnet.md index 950c9d50..2d9cd80f 100644 --- a/web3/scripts/mock.game7-testnet.md +++ b/web3/scripts/mock.game7-testnet.md @@ -25,7 +25,7 @@ Deployment transaction: [`0x036c8cb7d159f7e3d747d2fb6031360818273a1e27d540539c2d ### Set up environment variables ```bash -export RPC="https://rpc-game7-testnet-0ilneybprf.t.conduit.xyz" +export RPC="https://testnet-rpc.game7.io" export SENDER="" export SENDER_ADDRESS="$(jq -r .address $SENDER)" # The following lines were added in the course of this script diff --git a/web3/scripts/staker.game7-testnet.md b/web3/scripts/staker.game7-testnet.md index 6fd3da5b..2c385cd5 100644 --- a/web3/scripts/staker.game7-testnet.md +++ b/web3/scripts/staker.game7-testnet.md @@ -12,7 +12,7 @@ staking pool are transferable. This pool is owned by the zero address, and canno ### Set up environment variables ```bash -export RPC="https://rpc-game7-testnet-0ilneybprf.t.conduit.xyz" +export RPC="https://testnet-rpc.game7.io" export SENDER="" # The following lines were added in the course of this script export STAKER="0xA1D917972df7E88904A2aaFd92f5c0dF16ABA77e" diff --git a/web3/test/ERC20.behavior.ts b/web3/test/ERC20.behavior.ts index a16bf77d..477c8189 100644 --- a/web3/test/ERC20.behavior.ts +++ b/web3/test/ERC20.behavior.ts @@ -3,194 +3,211 @@ import { expect } from 'chai'; import { HardhatEthersSigner } from '../helpers/type'; export function shouldBehaveLikeERC20(initialSupply: bigint) { - - beforeEach(async function () { - [this.holder, this.recipient, this.other] = this.accounts; - }); - - it('total supply: returns the total token value', async function () { - expect(await this.token.totalSupply()).to.equal(initialSupply); - }); - - describe('balanceOf', function () { - it('returns zero when the requested account has no tokens', async function () { - expect(await this.token.balanceOf(this.other)).to.equal(0n); + beforeEach(async function () { + [this.holder, this.recipient, this.other] = this.accounts; }); - it('returns the total token value when the requested account has some tokens', async function () { - expect(await this.token.balanceOf(this.holder)).to.equal(initialSupply); + it('total supply: returns the total token value', async function () { + expect(await this.token.totalSupply()).to.equal(initialSupply); }); - }); - - describe('transfer', function () { - beforeEach(function () { - this.transfer = (from: HardhatEthersSigner, to: string, value: bigint) => this.token.connect(from).transfer(to, value); - }); - - shouldBehaveLikeERC20Transfer(initialSupply); - }); - - describe('transfer from', function () { - describe('when the token owner is not the zero address', function () { - describe('when the recipient is not the zero address', function () { - describe('when the spender has enough allowance', function () { - beforeEach(async function () { - await this.token.connect(this.holder).approve(this.recipient, initialSupply); - }); - describe('when the token owner has enough balance', function () { - const value = initialSupply; + describe('balanceOf', function () { + it('returns zero when the requested account has no tokens', async function () { + expect(await this.token.balanceOf(this.other)).to.equal(0n); + }); - beforeEach(async function () { - this.tx = await this.token.connect(this.recipient).transferFrom(this.holder, this.other, value); - }); + it('returns the total token value when the requested account has some tokens', async function () { + expect(await this.token.balanceOf(this.holder)).to.equal(initialSupply); + }); + }); - it('transfers the requested value', async function () { - await expect(this.tx).to.changeTokenBalances(this.token, [this.holder, this.other], [-value, value]); - }); + describe('transfer', function () { + beforeEach(function () { + this.transfer = (from: HardhatEthersSigner, to: string, value: bigint) => + this.token.connect(from).transfer(to, value); + }); - it('decreases the spender allowance', async function () { - expect(await this.token.allowance(this.holder, this.recipient)).to.equal(0n); - }); + shouldBehaveLikeERC20Transfer(initialSupply); + }); - it('emits a transfer event', async function () { - await expect(this.tx).to.emit(this.token, 'Transfer').withArgs(this.holder, this.other, value); + describe('transfer from', function () { + describe('when the token owner is not the zero address', function () { + describe('when the recipient is not the zero address', function () { + describe('when the spender has enough allowance', function () { + beforeEach(async function () { + await this.token.connect(this.holder).approve(this.recipient, initialSupply); + }); + + describe('when the token owner has enough balance', function () { + const value = initialSupply; + + beforeEach(async function () { + this.tx = await this.token + .connect(this.recipient) + .transferFrom(this.holder, this.other, value); + }); + + it('transfers the requested value', async function () { + await expect(this.tx).to.changeTokenBalances( + this.token, + [this.holder, this.other], + [-value, value] + ); + }); + + it('decreases the spender allowance', async function () { + expect(await this.token.allowance(this.holder, this.recipient)).to.equal(0n); + }); + + it('emits a transfer event', async function () { + await expect(this.tx) + .to.emit(this.token, 'Transfer') + .withArgs(this.holder, this.other, value); + }); + + it('does not emit an approval event', async function () { + await expect(this.tx).to.not.emit(this.token, 'Approval'); + }); + }); + + it('reverts when the token owner does not have enough balance', async function () { + const value = initialSupply; + await this.token.connect(this.holder).transfer(this.other, 1n); + await expect( + this.token.connect(this.recipient).transferFrom(this.holder, this.other, value) + ).to.revertedWith('ERC20: transfer amount exceeds balance'); + }); + }); + + describe('when the spender does not have enough allowance', function () { + const allowance = initialSupply - 1n; + + beforeEach(async function () { + await this.token.connect(this.holder).approve(this.recipient, allowance); + }); + + it('reverts when the token owner has enough balance', async function () { + const value = initialSupply; + await expect( + this.token.connect(this.recipient).transferFrom(this.holder, this.other, value) + ).to.be.revertedWith('ERC20: insufficient allowance'); + }); + + it('reverts when the token owner does not have enough balance', async function () { + const value = allowance; + await this.token.connect(this.holder).transfer(this.other, 2); + await expect( + this.token.connect(this.recipient).transferFrom(this.holder, this.other, value) + ).to.be.revertedWith('ERC20: transfer amount exceeds balance'); + }); + }); }); - - it('does not emit an approval event', async function () { - await expect(this.tx).to.not.emit(this.token, 'Approval'); - }); - }); - - it('reverts when the token owner does not have enough balance', async function () { - const value = initialSupply; - await this.token.connect(this.holder).transfer(this.other, 1n); - await expect(this.token.connect(this.recipient).transferFrom(this.holder, this.other, value)) - .to.revertedWith('ERC20: transfer amount exceeds balance'); - }); }); + }); - describe('when the spender does not have enough allowance', function () { - const allowance = initialSupply - 1n; - - beforeEach(async function () { - await this.token.connect(this.holder).approve(this.recipient, allowance); - }); - - it('reverts when the token owner has enough balance', async function () { - const value = initialSupply; - await expect(this.token.connect(this.recipient).transferFrom(this.holder, this.other, value)) - .to.be.revertedWith('ERC20: insufficient allowance'); - }); - - it('reverts when the token owner does not have enough balance', async function () { - const value = allowance; - await this.token.connect(this.holder).transfer(this.other, 2); - await expect(this.token.connect(this.recipient).transferFrom(this.holder, this.other, value)) - .to.be.revertedWith('ERC20: transfer amount exceeds balance'); - }); + describe('approve', function () { + beforeEach(function () { + this.approve = (owner: HardhatEthersSigner, spender: HardhatEthersSigner, value: bigint) => + this.token.connect(owner).approve(spender.address, value); }); - }); - }); - }); - describe('approve', function () { - beforeEach(function () { - this.approve = (owner: HardhatEthersSigner, spender: HardhatEthersSigner, value: bigint) => this.token.connect(owner).approve(spender.address, value); + shouldBehaveLikeERC20Approve(initialSupply); }); - - shouldBehaveLikeERC20Approve(initialSupply); - }); } export function shouldBehaveLikeERC20Transfer(balance: bigint) { - describe('when the recipient is not the zero address', function () { - it('reverts when the sender does not have enough balance', async function () { - const value = balance + 1n; - await expect(this.transfer(this.holder, this.recipient, value)) - .to.be.revertedWith('ERC20: transfer amount exceeds balance'); - }); + describe('when the recipient is not the zero address', function () { + it('reverts when the sender does not have enough balance', async function () { + const value = balance + 1n; + await expect(this.transfer(this.holder, this.recipient, value)).to.be.revertedWith( + 'ERC20: transfer amount exceeds balance' + ); + }); - describe('when the sender transfers all balance', function () { - const value = balance; + describe('when the sender transfers all balance', function () { + const value = balance; - beforeEach(async function () { - this.tx = await this.transfer(this.holder, this.recipient, value); - }); + beforeEach(async function () { + this.tx = await this.transfer(this.holder, this.recipient, value); + }); - it('transfers the requested value', async function () { - await expect(this.tx).to.changeTokenBalances(this.token, [this.holder, this.recipient], [-value, value]); - }); + it('transfers the requested value', async function () { + await expect(this.tx).to.changeTokenBalances( + this.token, + [this.holder, this.recipient], + [-value, value] + ); + }); - it('emits a transfer event', async function () { - await expect(this.tx).to.emit(this.token, 'Transfer').withArgs(this.holder, this.recipient, value); - }); - }); + it('emits a transfer event', async function () { + await expect(this.tx).to.emit(this.token, 'Transfer').withArgs(this.holder, this.recipient, value); + }); + }); - describe('when the sender transfers zero tokens', function () { - const value = 0n; + describe('when the sender transfers zero tokens', function () { + const value = 0n; - beforeEach(async function () { - this.tx = await this.transfer(this.holder, this.recipient, value); - }); + beforeEach(async function () { + this.tx = await this.transfer(this.holder, this.recipient, value); + }); - it('transfers the requested value', async function () { - await expect(this.tx).to.changeTokenBalances(this.token, [this.holder, this.recipient], [0n, 0n]); - }); + it('transfers the requested value', async function () { + await expect(this.tx).to.changeTokenBalances(this.token, [this.holder, this.recipient], [0n, 0n]); + }); - it('emits a transfer event', async function () { - await expect(this.tx).to.emit(this.token, 'Transfer').withArgs(this.holder, this.recipient, value); - }); + it('emits a transfer event', async function () { + await expect(this.tx).to.emit(this.token, 'Transfer').withArgs(this.holder, this.recipient, value); + }); + }); }); - }); } export function shouldBehaveLikeERC20Approve(supply: bigint) { - describe('when the spender is not the zero address', function () { - describe('when the sender has enough balance', function () { - const value = supply; - - it('emits an approval event', async function () { - await expect(this.approve(this.holder, this.recipient, value)) - .to.emit(this.token, 'Approval') - .withArgs(this.holder, this.recipient, value); - }); + describe('when the spender is not the zero address', function () { + describe('when the sender has enough balance', function () { + const value = supply; + + it('emits an approval event', async function () { + await expect(this.approve(this.holder, this.recipient, value)) + .to.emit(this.token, 'Approval') + .withArgs(this.holder, this.recipient, value); + }); - it('approves the requested value when there was no approved value before', async function () { - await this.approve(this.holder, this.recipient, value); + it('approves the requested value when there was no approved value before', async function () { + await this.approve(this.holder, this.recipient, value); - expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); - }); + expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); + }); - it('approves the requested value and replaces the previous one when the spender had an approved value', async function () { - await this.approve(this.holder, this.recipient, 1n); - await this.approve(this.holder, this.recipient, value); + it('approves the requested value and replaces the previous one when the spender had an approved value', async function () { + await this.approve(this.holder, this.recipient, 1n); + await this.approve(this.holder, this.recipient, value); - expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); - }); - }); + expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); + }); + }); - describe('when the sender does not have enough balance', function () { - const value = supply + 1n; + describe('when the sender does not have enough balance', function () { + const value = supply + 1n; - it('emits an approval event', async function () { - await expect(this.approve(this.holder, this.recipient, value)) - .to.emit(this.token, 'Approval') - .withArgs(this.holder, this.recipient, value); - }); + it('emits an approval event', async function () { + await expect(this.approve(this.holder, this.recipient, value)) + .to.emit(this.token, 'Approval') + .withArgs(this.holder, this.recipient, value); + }); - it('approves the requested value when there was no approved value before', async function () { - await this.approve(this.holder, this.recipient, value); + it('approves the requested value when there was no approved value before', async function () { + await this.approve(this.holder, this.recipient, value); - expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); - }); + expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); + }); - it('approves the requested value and replaces the previous one when the spender had an approved value', async function () { - await this.approve(this.holder, this.recipient, 1n); - await this.approve(this.holder, this.recipient, value); + it('approves the requested value and replaces the previous one when the spender had an approved value', async function () { + await this.approve(this.holder, this.recipient, 1n); + await this.approve(this.holder, this.recipient, value); - expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); - }); + expect(await this.token.allowance(this.holder, this.recipient)).to.equal(value); + }); + }); }); - }); -} \ No newline at end of file +} diff --git a/web3/test/ERC20.test.ts b/web3/test/ERC20.test.ts index 656c8f4f..6cf31b4b 100644 --- a/web3/test/ERC20.test.ts +++ b/web3/test/ERC20.test.ts @@ -13,63 +13,64 @@ const decimals = 18; const initialSupply = BigInt(100n); describe('ERC20', function () { - for (const { Token } of TOKENS) { - let holder: HardhatEthersSigner; - let recipient: HardhatEthersSigner; - - describe(Token, function () { - const fixture = async () => { - // this.accounts is used by shouldBehaveLikeERC20 - [holder, recipient] = await ethers.getSigners(); - const accounts = await ethers.getSigners() - - const token = await ethers.deployContract(Token, [name, symbol, decimals, initialSupply]); - - return { accounts, holder, recipient, token }; - }; - - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - }); - - shouldBehaveLikeERC20(initialSupply); - - it('has a name', async function () { - expect(await this.token.name()).to.equal(name); - }); - - it('has a symbol', async function () { - expect(await this.token.symbol()).to.equal(symbol); - }); - - it('has 18 decimals', async function () { - expect(await this.token.decimals()).to.equal(18n); - }); - - describe('transfer', function () { - beforeEach(function () { - this.transfer = (from: HardhatEthersSigner, to: string, value: bigint) => this.token.connect(from).transfer(to, value); + for (const { Token } of TOKENS) { + let holder: HardhatEthersSigner; + let recipient: HardhatEthersSigner; + + describe(Token, function () { + const fixture = async () => { + // this.accounts is used by shouldBehaveLikeERC20 + [holder, recipient] = await ethers.getSigners(); + const accounts = await ethers.getSigners(); + + const token = await ethers.deployContract(Token, [name, symbol, decimals, initialSupply]); + + return { accounts, holder, recipient, token }; + }; + + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)); + }); + + shouldBehaveLikeERC20(initialSupply); + + it('has a name', async function () { + expect(await this.token.name()).to.equal(name); + }); + + it('has a symbol', async function () { + expect(await this.token.symbol()).to.equal(symbol); + }); + + it('has 18 decimals', async function () { + expect(await this.token.decimals()).to.equal(18n); + }); + + describe('transfer', function () { + beforeEach(function () { + this.transfer = (from: HardhatEthersSigner, to: string, value: bigint) => + this.token.connect(from).transfer(to, value); + }); + + shouldBehaveLikeERC20Transfer(initialSupply); + }); + + describe('approve', function () { + beforeEach(function () { + this.approve = (owner: HardhatEthersSigner, spender: HardhatEthersSigner, value: bigint) => + this.token.connect(owner).approve(spender.address, value); + this.other = this.accounts[2]; + }); + + shouldBehaveLikeERC20Approve(initialSupply); + + it('reverts when the spender has insufficient allowance', async function () { + const value = 1n; + await expect( + this.token.connect(this.other).transferFrom(this.holder.address, this.other.address, value) + ).to.be.revertedWith('ERC20: insufficient allowance'); + }); + }); }); - - shouldBehaveLikeERC20Transfer(initialSupply); - - }); - - describe('approve', function () { - beforeEach(function () { - this.approve = (owner: HardhatEthersSigner, spender: HardhatEthersSigner, value: bigint) => this.token.connect(owner).approve(spender.address, value); - this.other = this.accounts[2]; - }); - - shouldBehaveLikeERC20Approve(initialSupply); - - it('reverts when the spender has insufficient allowance', async function () { - const value = 1n - await expect(this.token.connect(this.other).transferFrom(this.holder.address, this.other.address, value)).to.be.revertedWith('ERC20: insufficient allowance'); - }); - }); - - - }); - } + } }); diff --git a/web3/test/Metronome.test.ts b/web3/test/Metronome.test.ts new file mode 100644 index 00000000..365579e3 --- /dev/null +++ b/web3/test/Metronome.test.ts @@ -0,0 +1,216 @@ +import { ethers } from 'hardhat'; +import { expect } from 'chai'; + +export async function setupFixture() { + const [deployer, user0, user1] = await ethers.getSigners(); + + const Metronome = await ethers.getContractFactory('Metronome'); + const metronome = await Metronome.deploy(); + + return { deployer, user0, user1, metronome }; +} + +describe('Metronome', function () { + it('Anyone should be able to deploy a Metronome contract.', async function () { + const { metronome } = await setupFixture(); + expect(await metronome.getAddress()).to.be.properAddress; + }); + + it('A fresh metronome contract should not have any schedules registered on it.', async function () { + const { metronome } = await setupFixture(); + expect(await metronome.NumSchedules()).to.equal(0n); + }); + + it('Anyone should be able to create a schedule on a Metronome contract.', async function() { + const { metronome, user0 } = await setupFixture(); + + const expectedScheduleID = await metronome.NumSchedules(); + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 7; + const divisor = 13049; + const bounty = 293; + const createScheduleTx = await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: 0}); + await expect(createScheduleTx).to.emit(metronome, 'ScheduleCreated').withArgs(expectedScheduleID, remainder, divisor, bounty); + expect(await metronome.ScheduleBalances(expectedScheduleID)).to.equal(0n); + const actualSchedule = await metronome.Schedules(expectedScheduleID); + expect(actualSchedule.remainder).to.equal(remainder); + expect(actualSchedule.divisor).to.equal(divisor); + expect(actualSchedule.bounty).to.equal(bounty); + }); + + it('Anyone should be able to create a schedule with a positive balance on a Metronome contract.', async function() { + const { metronome, user0 } = await setupFixture(); + + const expectedScheduleID = await metronome.NumSchedules(); + + const initialScheduleBalance = 1000000000000000000n; + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 13; + const divisor = 209344; + const bounty = 92485; + const createScheduleTx = await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: initialScheduleBalance}); + await expect(createScheduleTx).to.emit(metronome, 'ScheduleCreated').withArgs(expectedScheduleID, remainder, divisor, bounty); + await expect(createScheduleTx).to.emit(metronome, 'BalanceIncreased').withArgs(expectedScheduleID, initialScheduleBalance); + expect(await metronome.ScheduleBalances(expectedScheduleID)).to.equal(initialScheduleBalance); + const actualSchedule = await metronome.Schedules(expectedScheduleID); + expect(actualSchedule.remainder).to.equal(remainder); + expect(actualSchedule.divisor).to.equal(divisor); + expect(actualSchedule.bounty).to.equal(bounty); + }); + + it('Anyone should be able to increase the balance on any schedule, even one they did not create.', async function() { + const { metronome, user0, user1 } = await setupFixture(); + + const scheduleID = await metronome.NumSchedules(); + + const initialScheduleBalance = 10n; + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 239; + const divisor = 23948; + const bounty = 845845; + await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: initialScheduleBalance}); + expect(await metronomeWithUser0.ScheduleBalances(scheduleID)).to.equal(initialScheduleBalance); + + const additionalScheduleBalance = 2984590485n; + const metronomeWithUser1 = metronome.connect(user1); + const increaseBalanceTx = await metronomeWithUser1.increaseBalance(scheduleID, {value: additionalScheduleBalance}); + await expect(increaseBalanceTx).to.emit(metronome, 'BalanceIncreased').withArgs(scheduleID, additionalScheduleBalance); + expect(await metronome.ScheduleBalances(scheduleID)).to.equal(initialScheduleBalance + additionalScheduleBalance); + }); + + it('Anyone should be able to claim a bounty against a schedule.', async function() { + const { metronome, user0, user1 } = await setupFixture(); + + const scheduleID = await metronome.NumSchedules(); + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 0; + const divisor = 1; + const bounty = 845845n; + const initialScheduleBalance = bounty*1000n; + await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: initialScheduleBalance}); + + const claimantBalance0 = await ethers.provider.getBalance(user1.address); + + const metronomeWithUser1 = metronome.connect(user1); + const claimBountyTx = await metronomeWithUser1.claim(scheduleID, user1.address); + const claimBountyTxReceipt = await claimBountyTx.wait(); + expect(claimBountyTxReceipt).to.not.be.null; + await expect(claimBountyTx).to.emit(metronome, 'BountyClaimed').withArgs(scheduleID, user1.address, bounty); + + const claimantBalance1 = await ethers.provider.getBalance(user1.address); + + expect(claimantBalance1).to.equal(claimantBalance0 + bounty - claimBountyTxReceipt!.fee); + expect(await metronome.ClaimedBounties(scheduleID, claimBountyTxReceipt!.blockNumber)).to.be.true; + }); + + it('Anyone should be able to submit an off-schedule claim against a given schedule, resulting in a noop on the Metronome.', async function() { + const { metronome, user0, user1 } = await setupFixture(); + + const scheduleID = await metronome.NumSchedules(); + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 0; + const divisor = 2; + const bounty = 845845n; + const initialScheduleBalance = bounty*1000n; + await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: initialScheduleBalance}); + + let currentBlock = await ethers.provider.getBlock('latest'); + expect(currentBlock).to.not.be.null; + if ((currentBlock!.number - 1) % divisor === remainder) { + // Move to a block such that the next mined block will be off-schedule. + ethers.provider.send('evm_mine'); + } + + const claimantBalance0 = await ethers.provider.getBalance(user1.address); + + const metronomeWithUser1 = metronome.connect(user1); + const claimBountyTx = await metronomeWithUser1.claim(scheduleID, user1.address); + const claimBountyTxReceipt = await claimBountyTx.wait(); + expect(claimBountyTxReceipt).to.not.be.null; + await expect(claimBountyTx).to.not.emit(metronome, 'BountyClaimed'); + + const claimantBalance1 = await ethers.provider.getBalance(user1.address); + + expect(claimantBalance1).to.equal(claimantBalance0 - claimBountyTxReceipt!.fee); + expect(await metronome.ClaimedBounties(scheduleID, claimBountyTxReceipt!.blockNumber)).to.be.false; + }); + + it('If two users submit a claim against the same schedule in the same block, the first one receives the bounty and the second transaction is a Metronome noop.', async function() { + const { metronome, user0, user1 } = await setupFixture(); + + const scheduleID = await metronome.NumSchedules(); + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 0; + const divisor = 1; + const bounty = 845845n; + const initialScheduleBalance = bounty*1000n; + await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: initialScheduleBalance}); + + const user0Balance0 = await ethers.provider.getBalance(user0.address); + const user1Balance0 = await ethers.provider.getBalance(user1.address); + + await ethers.provider.send("evm_setAutomine", [false]); + + const metronomeWithUser1 = metronome.connect(user1); + // We need both transactions to be mined in the same block to test this behavior. To do this, we xplicitly set the gasLimit to a + // number less than half of the block gas limit for each transaction. + // We have to do this because, by default, hardhat sets a gas estimate of the block gas limit for each transaction. This has the + // side-effect of using up a full block per transaction even if we try working around it with the `evm_setAutomine` and `evm_mine` events. + // For more information: https://github.com/NomicFoundation/hardhat/issues/4090#issuecomment-1622155314 + const claimBountyTx0 = await metronomeWithUser0.claim(scheduleID, user0.address, {gasLimit: 1000000}); + const claimBountyTx1 = await metronomeWithUser1.claim(scheduleID, user1.address, {gasLimit: 1000000}); + + await ethers.provider.send("evm_mine"); + + const claimBountyTxReceipt0 = await claimBountyTx0.wait(); + expect(claimBountyTxReceipt0).to.not.be.null; + await expect(claimBountyTx0).to.emit(metronome, 'BountyClaimed').withArgs(scheduleID, user0.address, bounty); + + const claimBountyTxReceipt1 = await claimBountyTx1.wait(); + expect(claimBountyTxReceipt1).to.not.be.null; + + expect(claimBountyTxReceipt1!.blockNumber).to.equal(claimBountyTxReceipt0!.blockNumber); + + const user0Balance1 = await ethers.provider.getBalance(user0.address); + const user1Balance1 = await ethers.provider.getBalance(user1.address); + + expect(user0Balance1).to.equal(user0Balance0 + bounty - claimBountyTxReceipt0!.fee); + expect(user1Balance1).to.equal(user1Balance0 - claimBountyTxReceipt1!.fee); + + expect(await metronome.ClaimedBounties(scheduleID, claimBountyTxReceipt0!.blockNumber)).to.be.true; + + await ethers.provider.send("evm_setAutomine", [true]); + }); + + it('Anyone should be able to claim a bounty against a schedule using claimBatch.', async function() { + const { metronome, user0, user1 } = await setupFixture(); + + const scheduleID = await metronome.NumSchedules(); + + const metronomeWithUser0 = metronome.connect(user0); + const remainder = 0; + const divisor = 1; + const bounty = 845845n; + const initialScheduleBalance = bounty*1000n; + await metronomeWithUser0.createSchedule(remainder, divisor, bounty, {value: initialScheduleBalance}); + + const claimantBalance0 = await ethers.provider.getBalance(user1.address); + + const metronomeWithUser1 = metronome.connect(user1); + const claimBountyTx = await metronomeWithUser1.claimBatch([scheduleID], user1.address); + const claimBountyTxReceipt = await claimBountyTx.wait(); + expect(claimBountyTxReceipt).to.not.be.null; + await expect(claimBountyTx).to.emit(metronome, 'BountyClaimed').withArgs(scheduleID, user1.address, bounty); + + const claimantBalance1 = await ethers.provider.getBalance(user1.address); + + expect(claimantBalance1).to.equal(claimantBalance0 + bounty - claimBountyTxReceipt!.fee); + expect(await metronome.ClaimedBounties(scheduleID, claimBountyTxReceipt!.blockNumber)).to.be.true; + }); +}); diff --git a/web3/test/Staker.test.1.ts b/web3/test/Staker.test.1.ts index c11df369..96ba0e0c 100644 --- a/web3/test/Staker.test.1.ts +++ b/web3/test/Staker.test.1.ts @@ -36,7 +36,8 @@ export function setupStakingPoolsFixture(transferable: boolean, lockupSeconds: n 0, transferable, lockupSeconds, - cooldownSeconds + cooldownSeconds, + admin0 ); const nativePoolID = (await staker.TotalPools()) - BigInt(1); @@ -46,7 +47,8 @@ export function setupStakingPoolsFixture(transferable: boolean, lockupSeconds: n 0, transferable, lockupSeconds, - cooldownSeconds + cooldownSeconds, + admin0 ); const erc20PoolID = (await staker.TotalPools()) - BigInt(1); @@ -56,7 +58,8 @@ export function setupStakingPoolsFixture(transferable: boolean, lockupSeconds: n 0, transferable, lockupSeconds, - cooldownSeconds + cooldownSeconds, + admin0 ); const erc721PoolID = (await staker.TotalPools()) - BigInt(1); @@ -67,7 +70,8 @@ export function setupStakingPoolsFixture(transferable: boolean, lockupSeconds: n erc1155TokenID, transferable, lockupSeconds, - cooldownSeconds + cooldownSeconds, + admin0 ); const erc1155PoolID = (await staker.TotalPools()) - BigInt(1); @@ -129,7 +133,8 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + anyone ); await expect(tx) @@ -141,6 +146,10 @@ describe('Staker', function () { 0 ); + await expect(tx) + .to.emit(staker, 'StakingPoolConfigured') + .withArgs(0, await anyone.getAddress(), true, 0, 0); + const pool = await staker.Pools(0); expect(pool.tokenType).to.equal(await stakerWithAnyone.NATIVE_TOKEN_TYPE()); expect(pool.tokenAddress).to.equal(ethers.ZeroAddress); @@ -161,7 +170,8 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + anyone ); await expect(tx) @@ -173,6 +183,10 @@ describe('Staker', function () { 0 ); + await expect(tx) + .to.emit(staker, 'StakingPoolConfigured') + .withArgs(0, await anyone.getAddress(), true, 0, 0); + const pool = await staker.Pools(0); expect(pool.tokenType).to.equal(await stakerWithAnyone.ERC20_TOKEN_TYPE()); expect(pool.tokenAddress).to.equal(await erc20.getAddress()); @@ -193,13 +207,18 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + anyone ); await expect(tx) .to.emit(staker, 'StakingPoolCreated') .withArgs(0, await stakerWithAnyone.ERC721_TOKEN_TYPE(), await erc721.getAddress(), 0); + await expect(tx) + .to.emit(staker, 'StakingPoolConfigured') + .withArgs(0, await anyone.getAddress(), true, 0, 0); + const pool = await staker.Pools(0); expect(pool.tokenType).to.equal(await stakerWithAnyone.ERC721_TOKEN_TYPE()); expect(pool.tokenAddress).to.equal(await erc721.getAddress()); @@ -221,13 +240,18 @@ describe('Staker', function () { erc1155TokenID, true, 0, - 0 + 0, + anyone ); await expect(tx) .to.emit(staker, 'StakingPoolCreated') .withArgs(0, await stakerWithAnyone.ERC1155_TOKEN_TYPE(), await erc1155.getAddress(), erc1155TokenID); + await expect(tx) + .to.emit(staker, 'StakingPoolConfigured') + .withArgs(0, await anyone.getAddress(), true, 0, 0); + const pool = await staker.Pools(0); expect(pool.tokenType).to.equal(await stakerWithAnyone.ERC1155_TOKEN_TYPE()); expect(pool.tokenAddress).to.equal(await erc1155.getAddress()); @@ -248,7 +272,8 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + anyone ); let poolID = (await staker.TotalPools()) - 1n; expect(poolID).to.equal(0n); @@ -261,7 +286,8 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + anyone ); poolID = (await staker.TotalPools()) - 1n; expect(poolID).to.equal(1n); @@ -274,7 +300,8 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + anyone ); poolID = (await staker.TotalPools()) - 1n; expect(poolID).to.equal(2n); @@ -287,7 +314,8 @@ describe('Staker', function () { 1, true, 0, - 0 + 0, + anyone ); poolID = (await staker.TotalPools()) - 1n; expect(poolID).to.equal(3n); @@ -308,7 +336,7 @@ describe('Staker', function () { 1n; await expect( - stakerWithAnyone.createPool(invalidTokenType, ethers.ZeroAddress, 0, true, 0, 0) + stakerWithAnyone.createPool(invalidTokenType, ethers.ZeroAddress, 0, true, 0, 0, stakerWithAnyone) ).to.be.revertedWithCustomError(staker, 'InvalidTokenType'); }); @@ -319,7 +347,7 @@ describe('Staker', function () { // Non-zero token ID await expect( - stakerWithAnyone.createPool(await stakerWithAnyone.NATIVE_TOKEN_TYPE(), ethers.ZeroAddress, 1, true, 0, 0) + stakerWithAnyone.createPool(await stakerWithAnyone.NATIVE_TOKEN_TYPE(), ethers.ZeroAddress, 1, true, 0, 0, stakerWithAnyone) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); // Non-zero token address @@ -330,7 +358,8 @@ describe('Staker', function () { 0, true, 0, - 0 + 0, + stakerWithAnyone ) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); }); @@ -342,7 +371,7 @@ describe('Staker', function () { // Zero token address await expect( - stakerWithAnyone.createPool(await stakerWithAnyone.ERC20_TOKEN_TYPE(), ethers.ZeroAddress, 0, true, 0, 0) + stakerWithAnyone.createPool(await stakerWithAnyone.ERC20_TOKEN_TYPE(), ethers.ZeroAddress, 0, true, 0, 0, stakerWithAnyone) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); // Non-zero token ID @@ -353,7 +382,8 @@ describe('Staker', function () { 1, true, 0, - 0 + 0, + stakerWithAnyone ) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); }); @@ -365,7 +395,7 @@ describe('Staker', function () { // Zero token address await expect( - stakerWithAnyone.createPool(await stakerWithAnyone.ERC721_TOKEN_TYPE(), ethers.ZeroAddress, 0, true, 0, 0) + stakerWithAnyone.createPool(await stakerWithAnyone.ERC721_TOKEN_TYPE(), ethers.ZeroAddress, 0, true, 0, 0, stakerWithAnyone) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); // Non-zero token ID @@ -376,7 +406,8 @@ describe('Staker', function () { 1, true, 0, - 0 + 0, + stakerWithAnyone ) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); }); @@ -387,7 +418,7 @@ describe('Staker', function () { const stakerWithAnyone = staker.connect(anyone); await expect( - stakerWithAnyone.createPool(await stakerWithAnyone.ERC1155_TOKEN_TYPE(), ethers.ZeroAddress, 1, true, 0, 0) + stakerWithAnyone.createPool(await stakerWithAnyone.ERC1155_TOKEN_TYPE(), ethers.ZeroAddress, 1, true, 0, 0, stakerWithAnyone) ).to.be.revertedWithCustomError(staker, 'InvalidConfiguration'); }); @@ -402,7 +433,8 @@ describe('Staker', function () { 0, // Token ID is zero true, 0, - 0 + 0, + anyone ); await expect(tx) @@ -713,7 +745,7 @@ describe('Staker', function () { const user0BalanceBefore = await ethers.provider.getBalance(await user0.getAddress()); // Stake native tokens - const tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -776,7 +808,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc20.balanceOf(await user0.getAddress()); // Stake ERC20 tokens - const tx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); // Check balances after staking const stakerBalanceAfter = await erc20.balanceOf(await staker.getAddress()); @@ -838,7 +870,7 @@ describe('Staker', function () { expect(await erc721.ownerOf(tokenId)).to.equal(await user0.getAddress()); // Stake ERC721 token - const tx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); // Check ownership after staking expect(await erc721.ownerOf(tokenId)).to.equal(await staker.getAddress()); @@ -897,7 +929,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); // Stake ERC1155 tokens - const tx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); // Check balances after staking const stakerBalanceAfter = await erc1155.balanceOf(await staker.getAddress(), erc1155TokenID); @@ -953,7 +985,7 @@ describe('Staker', function () { const totalPositionsBefore = await staker.TotalPositions(); // Stake native tokens - const tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1003,7 +1035,7 @@ describe('Staker', function () { const totalPositionsBefore = await staker.TotalPositions(); // Stake native tokens - const tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1072,7 +1104,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('2.3456'); // Using a unique and distinctive stake amount // Stake native tokens - const tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1146,7 +1178,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc20.balanceOf(await user0.getAddress()); // Stake ERC20 tokens - const tx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC20(await user0.getAddress(), erc20PoolID, stakeAmount); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1220,7 +1252,7 @@ describe('Staker', function () { expect(await erc721.ownerOf(tokenId)).to.equal(await user0.getAddress()); // Stake ERC721 token - const tx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1286,7 +1318,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); // Stake ERC1155 tokens - const tx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1350,7 +1382,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('2.3456'); // Unique and distinctive stake amount // Stake native tokens - const tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1419,9 +1451,10 @@ describe('Staker', function () { // Approve staker contract to transfer ERC20 tokens await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); + await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await staker.connect(user0).stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await staker.connect(user0).stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; @@ -1490,7 +1523,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await staker.connect(user0).stakeERC721(erc721PoolID, tokenId); + const stakeTx = await staker.connect(user0).stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; @@ -1551,7 +1584,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await staker.connect(user0).stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await staker.connect(user0).stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; @@ -1615,7 +1648,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('2.3456'); // Unique and distinctive stake amount // Stake native tokens - await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); // Get the position token ID of the newly minted token const positionTokenID = (await stakerWithUser0.TotalPositions()) - 1n; @@ -1666,7 +1699,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await staker.connect(user0).stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await staker.connect(user0).stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; @@ -1720,7 +1753,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const tx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1762,7 +1795,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const tx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1809,7 +1842,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('2.3456'); // Unique and distinctive stake amount // Stake native tokens - await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); // Get the position token ID of the newly minted token const positionTokenID = (await stakerWithUser0.TotalPositions()) - 1n; @@ -1865,7 +1898,7 @@ describe('Staker', function () { // Stake ERC20 tokens const stakerWithUser0 = staker.connect(user0); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; @@ -1920,7 +1953,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const tx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -1964,7 +1997,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const tx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; @@ -2014,7 +2047,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2073,7 +2106,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2129,7 +2162,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 tokens - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2173,7 +2206,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2223,7 +2256,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('2.3456'); // Unique and distinctive stake amount // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2286,7 +2319,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2342,7 +2375,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 tokens - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2382,7 +2415,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2429,7 +2462,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2482,7 +2515,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2532,7 +2565,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 tokens - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2573,7 +2606,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2622,7 +2655,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2674,7 +2707,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2724,7 +2757,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2768,7 +2801,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2815,7 +2848,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2876,7 +2909,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2937,7 +2970,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2994,7 +3027,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); diff --git a/web3/test/Staker.test.2.ts b/web3/test/Staker.test.2.ts index ac66ea61..9bcf0e61 100644 --- a/web3/test/Staker.test.2.ts +++ b/web3/test/Staker.test.2.ts @@ -18,7 +18,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -78,7 +78,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -135,7 +135,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -186,7 +186,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -237,7 +237,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -290,7 +290,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -343,7 +343,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -390,7 +390,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -438,7 +438,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -492,7 +492,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -546,7 +546,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -603,7 +603,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -654,7 +654,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -708,7 +708,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -762,7 +762,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -811,7 +811,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -858,7 +858,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -922,7 +922,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -986,7 +986,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1044,7 +1044,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1101,7 +1101,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1165,7 +1165,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1226,7 +1226,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1287,7 +1287,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1342,7 +1342,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1413,7 +1413,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1484,7 +1484,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1555,7 +1555,7 @@ describe('Staker', function () { await erc1155.connect(user0).setApprovalForAll(await staker.getAddress(), true); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1626,7 +1626,7 @@ describe('Staker', function () { const user0BalanceBefore = await ethers.provider.getBalance(await user0.getAddress()); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1700,7 +1700,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc20.balanceOf(await user0.getAddress()); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1773,7 +1773,7 @@ describe('Staker', function () { expect(await erc721.ownerOf(tokenId)).to.equal(await user0.getAddress()); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1844,7 +1844,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1918,7 +1918,7 @@ describe('Staker', function () { const user0BalanceBefore = await ethers.provider.getBalance(await user0.getAddress()); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -1985,7 +1985,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc20.balanceOf(await user0.getAddress()); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2051,7 +2051,7 @@ describe('Staker', function () { expect(await erc721.ownerOf(tokenId)).to.equal(await user0.getAddress()); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2114,7 +2114,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2172,7 +2172,7 @@ describe('Staker', function () { // Stake native tokens const stakerBalanceBefore = await ethers.provider.getBalance(await staker.getAddress()); - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2246,7 +2246,7 @@ describe('Staker', function () { // Stake native tokens const stakerBalanceBefore = await erc20.balanceOf(await staker.getAddress()); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2317,7 +2317,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenID); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenID); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenID); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2382,7 +2382,7 @@ describe('Staker', function () { // Stake native tokens const stakerBalanceBefore = await erc1155.balanceOf(await staker.getAddress(), erc1155TokenID); - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2451,7 +2451,7 @@ describe('Staker', function () { // Stake native tokens const stakerBalanceBefore = await ethers.provider.getBalance(await staker.getAddress()); - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2525,7 +2525,7 @@ describe('Staker', function () { // Stake native tokens const stakerBalanceBefore = await erc20.balanceOf(await staker.getAddress()); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2596,7 +2596,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenID); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenID); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenID); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2661,7 +2661,7 @@ describe('Staker', function () { // Stake native tokens const stakerBalanceBefore = await erc1155.balanceOf(await staker.getAddress(), erc1155TokenID); - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2733,7 +2733,7 @@ describe('Staker', function () { const user1BalanceBefore = await ethers.provider.getBalance(await user1.getAddress()); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2811,7 +2811,7 @@ describe('Staker', function () { const user1BalanceBefore = await erc20.balanceOf(await user1.getAddress()); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2885,7 +2885,7 @@ describe('Staker', function () { expect(await erc721.ownerOf(tokenId)).to.equal(await user0.getAddress()); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -2955,7 +2955,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -3031,7 +3031,7 @@ describe('Staker', function () { const user1BalanceBefore = await ethers.provider.getBalance(await user1.getAddress()); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -3106,7 +3106,7 @@ describe('Staker', function () { const user1BalanceBefore = await erc20.balanceOf(await user1.getAddress()); // Stake ERC20 tokens - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -3176,7 +3176,7 @@ describe('Staker', function () { expect(await erc721.ownerOf(tokenId)).to.equal(await user0.getAddress()); // Stake ERC721 token - const stakeTx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const stakeTx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -3244,7 +3244,7 @@ describe('Staker', function () { const user0BalanceBefore = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); // Stake ERC1155 tokens - const stakeTx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); diff --git a/web3/test/Staker.test.3.ts b/web3/test/Staker.test.3.ts index 32566146..bc64babe 100644 --- a/web3/test/Staker.test.3.ts +++ b/web3/test/Staker.test.3.ts @@ -1,7 +1,7 @@ import { ethers } from 'hardhat'; import { expect } from 'chai'; import { loadFixture, time } from '@nomicfoundation/hardhat-network-helpers'; -import { setupStakingPoolsFixture } from './Staker.test.1'; +import { setupFixture, setupStakingPoolsFixture } from './Staker.test.1'; describe('Staker', function () { it('STAKER-113: The ERC721 representing an ERC721 staking position have as its metadata URI a data URI representing an appropriate JSON object', async function () { @@ -23,7 +23,7 @@ describe('Staker', function () { await erc721.connect(user0).approve(await staker.getAddress(), tokenId); // Stake ERC721 token - const tx = await stakerWithUser0.stakeERC721(erc721PoolID, tokenId); + const tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, tokenId); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; const block = await ethers.provider.getBlock(txReceipt!.blockNumber); @@ -82,7 +82,7 @@ describe('Staker', function () { await erc20.connect(user0).approve(await staker.getAddress(), stakeAmount); // Stake ERC20 token - const tx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const tx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const txReceipt = await tx.wait(); expect(txReceipt).to.not.be.null; const block = await ethers.provider.getBlock(txReceipt!.blockNumber); @@ -139,7 +139,7 @@ describe('Staker', function () { const amountStakedIntoPoolAtTime0 = await stakerWithUser0.CurrentAmountInPool(nativePoolID); const positionsInPoolAtTime0 = await stakerWithUser0.CurrentPositionsInPool(nativePoolID); - const stake1Tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stake1Amount }); + const stake1Tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stake1Amount }); const stake1TxReceipt = await stake1Tx.wait(); expect(stake1TxReceipt).to.not.be.null; const stake1Block = await ethers.provider.getBlock(stake1TxReceipt!.blockNumber); @@ -153,7 +153,7 @@ describe('Staker', function () { expect(amountStakedIntoPoolAtTime1).to.equal(amountStakedIntoPoolAtTime0 + stake1Amount); expect(positionsInPoolAtTime1).to.equal(positionsInPoolAtTime0 + 1n); - const stake2Tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stake2Amount }); + const stake2Tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stake2Amount }); const stake2TxReceipt = await stake2Tx.wait(); expect(stake2TxReceipt).to.not.be.null; const stake2Block = await ethers.provider.getBlock(stake2TxReceipt!.blockNumber); @@ -213,7 +213,7 @@ describe('Staker', function () { const amountStakedIntoPoolAtTime0 = await stakerWithUser0.CurrentAmountInPool(erc20PoolID); const positionsInPoolAtTime0 = await stakerWithUser0.CurrentPositionsInPool(erc20PoolID); - const stake1Tx = await stakerWithUser0.stakeERC20(erc20PoolID, stake1Amount); + const stake1Tx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stake1Amount); const stake1TxReceipt = await stake1Tx.wait(); expect(stake1TxReceipt).to.not.be.null; const stake1Block = await ethers.provider.getBlock(stake1TxReceipt!.blockNumber); @@ -227,7 +227,7 @@ describe('Staker', function () { expect(amountStakedIntoPoolAtTime1).to.equal(amountStakedIntoPoolAtTime0 + stake1Amount); expect(positionsInPoolAtTime1).to.equal(positionsInPoolAtTime0 + 1n); - const stake2Tx = await stakerWithUser0.stakeERC20(erc20PoolID, stake2Amount); + const stake2Tx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stake2Amount); const stake2TxReceipt = await stake2Tx.wait(); expect(stake2TxReceipt).to.not.be.null; const stake2Block = await ethers.provider.getBlock(stake2TxReceipt!.blockNumber); @@ -288,7 +288,7 @@ describe('Staker', function () { const amountStakedIntoPoolAtTime0 = await stakerWithUser0.CurrentAmountInPool(erc721PoolID); const positionsInPoolAtTime0 = await stakerWithUser0.CurrentPositionsInPool(erc721PoolID); - const stake1Tx = await stakerWithUser0.stakeERC721(erc721PoolID, stake1TokenID); + const stake1Tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, stake1TokenID); const stake1TxReceipt = await stake1Tx.wait(); expect(stake1TxReceipt).to.not.be.null; const stake1Block = await ethers.provider.getBlock(stake1TxReceipt!.blockNumber); @@ -302,7 +302,7 @@ describe('Staker', function () { expect(amountStakedIntoPoolAtTime1).to.equal(amountStakedIntoPoolAtTime0 + 1n); expect(positionsInPoolAtTime1).to.equal(positionsInPoolAtTime0 + 1n); - const stake2Tx = await stakerWithUser0.stakeERC721(erc721PoolID, stake2TokenID); + const stake2Tx = await stakerWithUser0.stakeERC721(user0, erc721PoolID, stake2TokenID); const stake2TxReceipt = await stake2Tx.wait(); expect(stake2TxReceipt).to.not.be.null; const stake2Block = await ethers.provider.getBlock(stake2TxReceipt!.blockNumber); @@ -362,7 +362,7 @@ describe('Staker', function () { const amountStakedIntoPoolAtTime0 = await stakerWithUser0.CurrentAmountInPool(erc1155PoolID); const positionsInPoolAtTime0 = await stakerWithUser0.CurrentPositionsInPool(erc1155PoolID); - const stake1Tx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stake1Amount); + const stake1Tx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stake1Amount); const stake1TxReceipt = await stake1Tx.wait(); expect(stake1TxReceipt).to.not.be.null; const stake1Block = await ethers.provider.getBlock(stake1TxReceipt!.blockNumber); @@ -376,7 +376,7 @@ describe('Staker', function () { expect(amountStakedIntoPoolAtTime1).to.equal(amountStakedIntoPoolAtTime0 + stake1Amount); expect(positionsInPoolAtTime1).to.equal(positionsInPoolAtTime0 + 1n); - const stake2Tx = await stakerWithUser0.stakeERC1155(erc1155PoolID, stake2Amount); + const stake2Tx = await stakerWithUser0.stakeERC1155(user0, erc1155PoolID, stake2Amount); const stake2TxReceipt = await stake2Tx.wait(); expect(stake2TxReceipt).to.not.be.null; const stake2Block = await ethers.provider.getBlock(stake2TxReceipt!.blockNumber); @@ -439,7 +439,7 @@ describe('Staker', function () { const amountStakedInERC20PoolAtTime0 = await stakerWithUser0.CurrentAmountInPool(erc20PoolID); const positionsInERC20PoolAtTime0 = await stakerWithUser0.CurrentPositionsInPool(erc20PoolID); - const stake1Tx = await stakerWithUser0.stakeNative(nativePoolID, { value: stake1Amount }); + const stake1Tx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stake1Amount }); const stake1TxReceipt = await stake1Tx.wait(); expect(stake1TxReceipt).to.not.be.null; const stake1Block = await ethers.provider.getBlock(stake1TxReceipt!.blockNumber); @@ -459,7 +459,7 @@ describe('Staker', function () { expect(amountStakedInERC20PoolAtTime1).to.equal(amountStakedInERC20PoolAtTime0); expect(positionsInERC20PoolAtTime1).to.equal(positionsInERC20PoolAtTime0); - const stake2Tx = await stakerWithUser0.stakeERC20(erc20PoolID, stake2Amount); + const stake2Tx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stake2Amount); const stake2TxReceipt = await stake2Tx.wait(); expect(stake2TxReceipt).to.not.be.null; const stake2Block = await ethers.provider.getBlock(stake2TxReceipt!.blockNumber); @@ -530,7 +530,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -568,7 +568,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -610,7 +610,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -667,7 +667,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); const stakerWithUser1 = staker.connect(user1); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -705,7 +705,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); const stakerWithUser1 = staker.connect(user1); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -742,7 +742,8 @@ describe('Staker', function () { 0, transferable, lockupSeconds, - cooldownSeconds + cooldownSeconds, + stakerWithAdmin0 ); const stakerPositionPoolID = (await staker.TotalPools()) - 1n; const stakerPositionPool = await staker.Pools(stakerPositionPoolID); @@ -761,7 +762,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - const stakeTx = await stakerWithUser0.stakeERC20(erc20PoolID, stakeAmount); + const stakeTx = await stakerWithUser0.stakeERC20(user0, erc20PoolID, stakeAmount); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -771,7 +772,7 @@ describe('Staker', function () { expect(await staker.ownerOf(stakePositionTokenID)).to.equal(await user0.getAddress()); await stakerWithUser0.approve(await staker.getAddress(), stakePositionTokenID); - await stakerWithUser0.stakeERC721(stakerPositionPoolID, stakePositionTokenID); + await stakerWithUser0.stakeERC721(user0, stakerPositionPoolID, stakePositionTokenID); expect(await staker.ownerOf(stakePositionTokenID)).to.equal(await staker.getAddress()); const newPositionTokenID = (await staker.TotalPositions()) - 1n; @@ -792,19 +793,19 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - await expect(stakerWithUser0.stakeNative(erc20PoolID, { value: 1 })) + await expect(stakerWithUser0.stakeNative(user0, erc20PoolID, { value: 1 })) .to.be.revertedWithCustomError(staker, 'IncorrectTokenType') .withArgs(erc20PoolID, 20, 1); - await expect(stakerWithUser0.stakeERC20(nativePoolID, 1)) + await expect(stakerWithUser0.stakeERC20(user0, nativePoolID, 1)) .to.be.revertedWithCustomError(staker, 'IncorrectTokenType') .withArgs(nativePoolID, 1, 20); - await expect(stakerWithUser0.stakeERC721(erc20PoolID, 1)) + await expect(stakerWithUser0.stakeERC721(user0, erc20PoolID, 1)) .to.be.revertedWithCustomError(staker, 'IncorrectTokenType') .withArgs(erc20PoolID, 20, 721); - await expect(stakerWithUser0.stakeERC1155(erc20PoolID, 1)) + await expect(stakerWithUser0.stakeERC1155(user0, erc20PoolID, 1)) .to.be.revertedWithCustomError(staker, 'IncorrectTokenType') .withArgs(erc20PoolID, 20, 1155); }); @@ -820,7 +821,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - await expect(stakerWithUser0.stakeNative(nativePoolID, { value: 0 })).to.be.revertedWithCustomError( + await expect(stakerWithUser0.stakeNative(user0, nativePoolID, { value: 0 })).to.be.revertedWithCustomError( staker, 'NothingToStake' ); @@ -837,7 +838,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - await expect(stakerWithUser0.stakeERC20(erc20PoolID, 0)).to.be.revertedWithCustomError( + await expect(stakerWithUser0.stakeERC20(user0, erc20PoolID, 0)).to.be.revertedWithCustomError( staker, 'NothingToStake' ); @@ -854,7 +855,7 @@ describe('Staker', function () { const stakerWithUser0 = staker.connect(user0); - await expect(stakerWithUser0.stakeERC1155(erc1155PoolID, 0)).to.be.revertedWithCustomError( + await expect(stakerWithUser0.stakeERC1155(user0, erc1155PoolID, 0)).to.be.revertedWithCustomError( staker, 'NothingToStake' ); @@ -887,7 +888,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -926,7 +927,7 @@ describe('Staker', function () { const stakeAmount = ethers.parseEther('1'); // Stake native tokens - const stakeTx = await stakerWithUser0.stakeNative(nativePoolID, { value: stakeAmount }); + const stakeTx = await stakerWithUser0.stakeNative(user0, nativePoolID, { value: stakeAmount }); const stakeTxReceipt = await stakeTx.wait(); expect(stakeTxReceipt).to.not.be.null; const stakeBlock = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); @@ -948,4 +949,506 @@ describe('Staker', function () { const position = await staker.Positions(positionTokenID); expect(position.unstakeInitiatedAt).to.equal(0); }); + + it('`STAKER-133`: If an admin pool who want to stake native tokens for another user should successfully stake', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, user0, nativePoolID, admin0 } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + + const stakeAmount = ethers.parseEther('1'); + const stakeTx = await stakerWithAdmin0.stakeNative(user0, nativePoolID, { value: stakeAmount }); + const stakeTxReceipt = await stakeTx.wait(); + expect(stakeTxReceipt).to.not.be.null; + + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-134`: If an admin pool who want to stake native tokens for another user should successfully stake - non transferable pool', async function () { + const transferable = false; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, user0, nativePoolID, admin0 } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + + const stakeAmount = ethers.parseEther('1'); + const stakeTx = await stakerWithAdmin0.stakeNative(user0, nativePoolID, { value: stakeAmount }); + const stakeTxReceipt = await stakeTx.wait(); + expect(stakeTxReceipt).to.not.be.null; + + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-135`: If an admin pool who want to stake erc20 tokens for another user should successfully stake', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc20, user0, admin0, erc20PoolID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + const stakeAmount = 17n; + + // Mint ERC20 token to admin0 + await erc20.mint(await admin0.getAddress(), stakeAmount); + + // Approve staker contract to transfer ERC721 token + await erc20.connect(admin0).approve(await staker.getAddress(), stakeAmount); + const stakeTx = await stakerWithAdmin0.stakeERC20(user0, erc20PoolID, stakeAmount); + + const stakeTxReceipt = await stakeTx.wait(); + expect(stakeTxReceipt).to.not.be.null; + + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-136`: If an admin pool who want to stake erc20 tokens for another user should successfully stake - non transferable pool', async function () { + const transferable = false; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc20, user0, admin0, erc20PoolID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + const stakeAmount = 17n; + + // Mint ERC20 token to admin0 + await erc20.mint(await admin0.getAddress(), stakeAmount); + + // Approve staker contract to transfer ERC721 token + await erc20.connect(admin0).approve(await staker.getAddress(), stakeAmount); + const stakeTx = await stakerWithAdmin0.stakeERC20(user0, erc20PoolID, stakeAmount); + + const stakeTxReceipt = await stakeTx.wait(); + expect(stakeTxReceipt).to.not.be.null; + + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-137`: If a staker user who want to stake erc721 tokens for another user should successfully stake', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc721, user0, admin0, erc721PoolID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const tokenId = 1n; + + // Mint ERC721 token to user0 + await erc721.mint(await admin0.getAddress(), tokenId); + + // Approve staker contract to transfer ERC721 token + await erc721.connect(admin0).approve(await staker.getAddress(), tokenId); + + const stakerWithAdmin0 = staker.connect(admin0); + const tx = await stakerWithAdmin0.stakeERC721(user0, erc721PoolID, tokenId); + const txReceipt = await tx.wait(); + expect(txReceipt).to.not.be.null; + + const user0Balance = await staker.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-138`: If a staker user who want to stake erc721 tokens for another user should successfully stake - non transferable pool', async function () { + const transferable = false; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc721, user0, admin0, erc721PoolID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const tokenId = 1n; + + // Mint ERC721 token to user0 + await erc721.mint(await admin0.getAddress(), tokenId); + + // Approve staker contract to transfer ERC721 token + await erc721.connect(admin0).approve(await staker.getAddress(), tokenId); + + const stakerWithAdmin0 = staker.connect(admin0); + const tx = await stakerWithAdmin0.stakeERC721(user0, erc721PoolID, tokenId); + const txReceipt = await tx.wait(); + expect(txReceipt).to.not.be.null; + + const user0Balance = await staker.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-139`: If a staker user who want to stake erc1155 tokens for another user should successfully stake', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc1155, user0, admin0, erc1155PoolID, erc1155TokenID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + const stakeAmount = 17n; + + await erc1155.mint(await admin0.getAddress(), erc1155TokenID, stakeAmount); + await erc1155.connect(admin0).setApprovalForAll(await staker.getAddress(), true); + + const tx = await stakerWithAdmin0.stakeERC1155(user0, erc1155PoolID, stakeAmount); + const txReceipt = await tx.wait(); + expect(txReceipt).to.not.be.null; + + const user0Balance = await staker.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-140`: If a staker user who want to stake erc1155 tokens for another user should successfully stake - non transferable', async function () { + const transferable = false; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc1155, user0, admin0, erc1155PoolID, erc1155TokenID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + const stakeAmount = 17n; + + await erc1155.mint(await admin0.getAddress(), erc1155TokenID, stakeAmount); + await erc1155.connect(admin0).setApprovalForAll(await staker.getAddress(), true); + + const tx = await stakerWithAdmin0.stakeERC1155(user0, erc1155PoolID, stakeAmount); + const txReceipt = await tx.wait(); + expect(txReceipt).to.not.be.null; + + const user0Balance = await staker.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + }); + + it('`STAKER-141`: As an admin pool I can unstake any position in the pool that still active', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, user0, nativePoolID, admin0 } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + + const stakeAmount = ethers.parseEther('1'); + const stakeTx = await stakerWithAdmin0.stakeNative(user0, nativePoolID, { value: stakeAmount }); + const stakeTxReceipt = await stakeTx.wait(); + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + + const user0BalanceOfNativeTokenBefore = await ethers.provider.getBalance(await user0.getAddress()); + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + const unstakeTx = await stakerWithAdmin0.unstake(positionTokenID); + + await expect(unstakeTx) + .to.emit(staker, 'Unstaked') + .withArgs(positionTokenID, await user0.getAddress(), nativePoolID, stakeAmount); + + await unstakeTx.wait(); + + const user0BalanceOfPositionTokenAfter = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + + + expect(user0BalanceOfPositionTokenAfter).to.equal(0n); + + const user0BalanceOfNativeTokensAfter = await ethers.provider.getBalance(await user0.getAddress()); + + expect(user0BalanceOfNativeTokensAfter).to.equal(stakeAmount + user0BalanceOfNativeTokenBefore); + }); + + it('`STAKER-142`: As an admin pool I can unstake any position in the pool that still active even if the pool - non transferable', async function () { + const transferable = false; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, user0, nativePoolID, admin0 } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + + const stakeAmount = ethers.parseEther('1'); + const stakeTx = await stakerWithAdmin0.stakeNative(user0, nativePoolID, { value: stakeAmount }); + const stakeTxReceipt = await stakeTx.wait(); + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + const unstakeTx = await stakerWithAdmin0.unstake(positionTokenID); + + await expect(unstakeTx) + .to.emit(staker, 'Unstaked') + .withArgs(positionTokenID, await user0.getAddress(), nativePoolID, stakeAmount); + const user0BalanceAfter = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + + expect(user0BalanceAfter).to.equal(0n); + }); + + it('`STAKER-143`: As an admin pool unstake should works even if the position holder were transferred', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, user0, nativePoolID, admin0, user1 } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + + const stakeAmount = ethers.parseEther('1'); + const stakeTx = await stakerWithAdmin0.stakeNative(user0, nativePoolID, { value: stakeAmount }); + const stakeTxReceipt = await stakeTx.wait(); + const user0Balance = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + + const stakerWithUser0 = staker.connect(user0); + const transferTrx = await stakerWithUser0.transferFrom( + await user0.getAddress(), + await user1.getAddress(), + positionTokenID + ); + await transferTrx.wait(); + + const user0BalanceAfter = await stakerWithAdmin0.balanceOf(await user0.getAddress()); + expect(user0BalanceAfter).to.equal(0n); + + const initiateUnstakeTx = await stakerWithAdmin0.initiateUnstake(positionTokenID); + await expect(initiateUnstakeTx) + .to.emit(staker, 'UnstakeInitiated') + .withArgs(positionTokenID, await user1.getAddress()); + + await initiateUnstakeTx.wait(); + + // the event will have the user1 address because the position was transferred + const tx = await stakerWithAdmin0.unstake(positionTokenID); + await expect(tx) + .to.emit(staker, 'Unstaked') + .withArgs(positionTokenID, await user1.getAddress(), nativePoolID, stakeAmount); + + await tx.wait(); + const user1Balance = await stakerWithAdmin0.balanceOf(await user1.getAddress()); + expect(user1Balance).to.equal(0n); + }); + + it('`STAKER-144`: As an admin pool I can unstake any position the owner of the position should recieve back the native tokens', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, user0, nativePoolID, admin0 } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + const stakerWithAdmin0 = staker.connect(admin0); + + const stakeAmount = ethers.parseEther('1'); + const stakeTx = await stakerWithAdmin0.stakeNative(user0, nativePoolID, { value: stakeAmount }); + const stakeTxReceipt = await stakeTx.wait(); + + const user0BalanceOfNativeTokenBefore = await ethers.provider.getBalance(await user0.getAddress()); + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + const unstakeTx = await stakerWithAdmin0.unstake(positionTokenID); + await unstakeTx.wait(); + + const user0BalanceOfNativeTokensAfter = await ethers.provider.getBalance(await user0.getAddress()); + expect(user0BalanceOfNativeTokensAfter).to.equal(stakeAmount + user0BalanceOfNativeTokenBefore); + }); + + it('`STAKER-145`: As an admin pool I can unstake any position the owner of the position should recieve back the erc20 tokens', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc20, user0, admin0, erc20PoolID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const stakerWithAdmin0 = staker.connect(admin0); + const stakeAmount = 17n; + const extraAmount = 15n; + + // Mint ERC20 token to admin0 + await erc20.mint(await admin0.getAddress(), stakeAmount); + + // Approve staker contract to transfer ERC721 token + await erc20.connect(admin0).approve(await staker.getAddress(), stakeAmount); + const stakeTx = await stakerWithAdmin0.stakeERC20(user0, erc20PoolID, stakeAmount); + + const stakeTxReceipt = await stakeTx.wait(); + expect(stakeTxReceipt).to.not.be.null; + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(stakeTxReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + const unstakeTx = await stakerWithAdmin0.unstake(positionTokenID); + await unstakeTx.wait(); + + const user0BalanceOfErc20After = await erc20.balanceOf(await user0.getAddress()); + expect(user0BalanceOfErc20After).to.equal(stakeAmount); + }); + + it('`STAKER-146`: As an admin pool I can unstake any position the owner of the position should recieve back the erc721 tokens', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc721, user0, admin0, erc721PoolID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + const tokenId = 1n; + + // Mint ERC721 token to user0 + await erc721.mint(await admin0.getAddress(), tokenId); + + // Approve staker contract to transfer ERC721 token + await erc721.connect(admin0).approve(await staker.getAddress(), tokenId); + + const stakerWithAdmin0 = staker.connect(admin0); + const tx = await stakerWithAdmin0.stakeERC721(user0, erc721PoolID, tokenId); + const txReceipt = await tx.wait(); + expect(txReceipt).to.not.be.null; + + const user0BalanceOfErc721AfterStake = await erc721.balanceOf(await user0.getAddress()); + expect(user0BalanceOfErc721AfterStake).to.equal(0n); + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(txReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + + const unstakeTx = await stakerWithAdmin0.unstake(positionTokenID); + await unstakeTx.wait(); + + const user0BalanceOfErc721AfterUnstake = await erc721.balanceOf(await user0.getAddress()); + expect(user0BalanceOfErc721AfterUnstake).to.equal(1n); + }); + + it('`STAKER-147`: As an admin pool I can unstake any position the owner of the position should recieve back the native erc1155 tokens', async function () { + const transferable = true; + const lockupSeconds = 3600; + const cooldownSeconds = 0; + + const { staker, erc1155, user0, admin0, erc1155PoolID, erc1155TokenID } = await loadFixture( + setupStakingPoolsFixture(transferable, lockupSeconds, cooldownSeconds) + ); + + + const stakerWithAdmin0 = staker.connect(admin0); + const stakeAmount = 17n; + + await erc1155.mint(await admin0.getAddress(), erc1155TokenID, stakeAmount); + await erc1155.connect(admin0).setApprovalForAll(await staker.getAddress(), true); + + const tx = await stakerWithAdmin0.stakeERC1155(user0, erc1155PoolID, stakeAmount); + const txReceipt = await tx.wait(); + expect(txReceipt).to.not.be.null; + + const user0BalanceOfErc1155AfterStake = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); + expect(user0BalanceOfErc1155AfterStake).to.equal(0n); + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const stake1Block = await ethers.provider.getBlock(txReceipt!.blockNumber); + await time.setNextBlockTimestamp(stake1Block!.timestamp + lockupSeconds); + + const unstakeTx = await stakerWithAdmin0.unstake(positionTokenID); + await unstakeTx.wait(); + + const user0BalanceOfErc1155AfterUnstake = await erc1155.balanceOf(await user0.getAddress(), erc1155TokenID); + expect(user0BalanceOfErc1155AfterUnstake).to.equal(stakeAmount); + }); + + it('STAKER-148: Any account should be able to create a staking pool for native tokens using 0 address', async function () { + const { staker, anyone, user0 } = await loadFixture(setupFixture); + const stakerWithAnyone = staker.connect(anyone); + + + const tx = await stakerWithAnyone.createPool( + await stakerWithAnyone.NATIVE_TOKEN_TYPE(), + ethers.ZeroAddress, + 0, + true, + 0, + 0, + ethers.ZeroAddress + ); + + await expect(tx) + .to.emit(staker, 'StakingPoolCreated') + .withArgs( + 0, // poolID should be 0 for the first pool + await stakerWithAnyone.NATIVE_TOKEN_TYPE(), + ethers.ZeroAddress, + 0 + ); + + await expect(tx) + .to.emit(staker, 'StakingPoolConfigured') + .withArgs(0, ethers.ZeroAddress, true, 0, 0); + + const pool = await staker.Pools(0); + expect(pool.tokenType).to.equal(await stakerWithAnyone.NATIVE_TOKEN_TYPE()); + expect(pool.tokenAddress).to.equal(ethers.ZeroAddress); + expect(pool.tokenID).to.equal(0); + expect(pool.transferable).to.equal(true); + expect(pool.lockupSeconds).to.equal(0); + expect(pool.cooldownSeconds).to.equal(0); + expect(pool.administrator).to.equal(ethers.ZeroAddress); + + const stakeAmount = 17n; + const positionPoolID = (await staker.TotalPools()) - 1n; + + + const stakeTrx = await stakerWithAnyone.stakeNative(user0, positionPoolID, { value: stakeAmount }); + + await expect(stakeTrx) + .to.emit(stakerWithAnyone, 'Staked') + .withArgs(0, await user0.getAddress(), positionPoolID, stakeAmount); + + await stakeTrx.wait(); + + const user0Balance = await staker.balanceOf(await user0.getAddress()); + expect(user0Balance).to.equal(1n); + + const positionTokenID = (await staker.TotalPositions()) - 1n; + const position = await staker.Positions(positionTokenID); + expect(position.poolID).to.equal(0); + + // as pool with address 0 administrator, anyone can stake or unstake for you as final user - must be reverted + await (expect(stakerWithAnyone.unstake(positionTokenID)).to.be.revertedWithCustomError(stakerWithAnyone, 'UnauthorizedForPosition') + .withArgs(await user0.getAddress(), await anyone.getAddress())); + + }); }); diff --git a/web3/test/TokenFaucet.test.ts b/web3/test/TokenFaucet.test.ts index 0486c34c..379f8186 100644 --- a/web3/test/TokenFaucet.test.ts +++ b/web3/test/TokenFaucet.test.ts @@ -1,10 +1,10 @@ -import { expect } from "chai"; -import { ethers } from "hardhat"; -import { TokenFaucet } from "../typechain-types"; -import { HardhatEthersSigner } from "../helpers/type"; -import { ERC20 } from "../typechain-types/token"; -import { ONE_DAY } from "../constants/time"; -import { time } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from 'chai'; +import { ethers } from 'hardhat'; +import { TokenFaucet } from '../typechain-types'; +import { HardhatEthersSigner } from '../helpers/type'; +import { ERC20 } from '../typechain-types/token'; +import { ONE_DAY } from '../constants/time'; +import { time } from '@nomicfoundation/hardhat-network-helpers'; const name = 'Game7 Token'; const symbol = 'G7T'; @@ -13,96 +13,116 @@ const initialSupply = BigInt(10000); const faucetAmount = 1000; const timeInterval = ONE_DAY; -describe("TokenFaucet", function () { - let tokenFaucet: TokenFaucet; - let owner: HardhatEthersSigner; - let addr1: HardhatEthersSigner; - let addr2: HardhatEthersSigner; - let token: ERC20; - let tokenAddress: string; - - beforeEach(async function () { - [owner, addr1, addr2] = await ethers.getSigners(); - - token = await ethers.deployContract("contracts/token/ERC20.sol:ERC20", [name, symbol, decimals, initialSupply]); - tokenAddress = await token.getAddress(); - await token.waitForDeployment(); - - const TokenFaucet = await ethers.getContractFactory("TokenFaucet"); - tokenFaucet = await TokenFaucet.deploy( - tokenAddress, - owner.address, - ethers.ZeroAddress, - faucetAmount, - timeInterval - ); - await tokenFaucet.waitForDeployment(); - }); - - it("Should deploy the TokenFaucet", async function () { - expect(await tokenFaucet.tokenAddress()).to.equal(tokenAddress); - expect(await tokenFaucet.owner()).to.equal(owner.address); - expect(await tokenFaucet.faucetAmount()).to.equal(faucetAmount); - expect(await tokenFaucet.faucetTimeInterval()).to.equal(timeInterval); - }); - - it("Should set and get faucet amount", async function () { - await tokenFaucet.setFaucetAmount(faucetAmount * 2); - expect(await tokenFaucet.faucetAmount()).to.equal(faucetAmount * 2); - }); - - it("Should NOT set faucet amount if not owner", async function () { - await expect(tokenFaucet.connect(addr1).setFaucetAmount(faucetAmount * 2)).to.be.revertedWithCustomError(tokenFaucet, "OwnableUnauthorizedAccount"); - }); - - it("Should set and get faucet time interval", async function () { - await tokenFaucet.setFaucetTimeInterval(timeInterval * 2); - expect(await tokenFaucet.faucetTimeInterval()).to.equal(timeInterval * 2); - }); - - it("Should NOT set faucet time interval if not owner", async function () { - await expect(tokenFaucet.connect(addr1).setFaucetTimeInterval(timeInterval * 2)).to.be.revertedWithCustomError(tokenFaucet, "OwnableUnauthorizedAccount"); - }); - - it('Should set and get token address', async function () { - await tokenFaucet.setTokenAddress(tokenAddress); - expect(await tokenFaucet.tokenAddress()).to.equal(tokenAddress); - }); - - it("Should NOT set token address if not owner", async function () { - await expect(tokenFaucet.connect(addr1).setTokenAddress(tokenAddress)).to.be.revertedWithCustomError(tokenFaucet, "OwnableUnauthorizedAccount"); - }); - - it("Should allow claiming tokens", async function () { - const tokenFaucetAddress = await tokenFaucet.getAddress(); - await token.transfer(tokenFaucetAddress, initialSupply); - const claimCallPromise = tokenFaucet.claim(); - await expect(claimCallPromise).to.emit(token, "Transfer").withArgs(tokenFaucetAddress, owner.address, faucetAmount); - const tx = await claimCallPromise; - const receipt = await tx.wait(); - const block = await receipt?.getBlock() - const claimBlockTimestamp = block?.timestamp - expect(await token.balanceOf(owner.address)).to.equal(faucetAmount); - expect(await tokenFaucet.lastClaimedL2Timestamp(owner.address)).to.equal(claimBlockTimestamp); - }); - - it("Should NOT allow claiming tokens if time interval not passed", async function () { - const tokenFaucetAddress = await tokenFaucet.getAddress(); - await token.transfer(tokenFaucetAddress, initialSupply); - await tokenFaucet.claim(); - await expect(tokenFaucet.claim()).to.be.revertedWithCustomError(tokenFaucet, "TokenFaucetClaimIntervalNotPassed"); - }); - - it("Should allow claiming tokens if time interval passed", async function () { - const tokenFaucetAddress = await tokenFaucet.getAddress(); - await token.transfer(tokenFaucetAddress, initialSupply); - await expect(tokenFaucet.claim()).to.emit(token, "Transfer").withArgs(tokenFaucetAddress, owner.address, faucetAmount); - await time.increase(timeInterval); - await expect(tokenFaucet.claim()).to.emit(token, "Transfer").withArgs(tokenFaucetAddress, owner.address, faucetAmount); - }) - - it("Should transfer ownership", async function () { - await expect(tokenFaucet.transferOwnership(addr1.address)).to.emit(tokenFaucet, "OwnershipTransferred").withArgs(owner.address, addr1.address); - expect(await tokenFaucet.owner()).to.equal(addr1.address); - }); +describe('TokenFaucet', function () { + let tokenFaucet: TokenFaucet; + let owner: HardhatEthersSigner; + let addr1: HardhatEthersSigner; + let addr2: HardhatEthersSigner; + let token: ERC20; + let tokenAddress: string; + + beforeEach(async function () { + [owner, addr1, addr2] = await ethers.getSigners(); + + token = await ethers.deployContract('contracts/token/ERC20.sol:ERC20', [name, symbol, decimals, initialSupply]); + tokenAddress = await token.getAddress(); + await token.waitForDeployment(); + + const TokenFaucet = await ethers.getContractFactory('TokenFaucet'); + tokenFaucet = await TokenFaucet.deploy( + tokenAddress, + owner.address, + ethers.ZeroAddress, + faucetAmount, + timeInterval + ); + await tokenFaucet.waitForDeployment(); + }); + + it('Should deploy the TokenFaucet', async function () { + expect(await tokenFaucet.tokenAddress()).to.equal(tokenAddress); + expect(await tokenFaucet.owner()).to.equal(owner.address); + expect(await tokenFaucet.faucetAmount()).to.equal(faucetAmount); + expect(await tokenFaucet.faucetTimeInterval()).to.equal(timeInterval); + }); + + it('Should set and get faucet amount', async function () { + await tokenFaucet.setFaucetAmount(faucetAmount * 2); + expect(await tokenFaucet.faucetAmount()).to.equal(faucetAmount * 2); + }); + + it('Should NOT set faucet amount if not owner', async function () { + await expect(tokenFaucet.connect(addr1).setFaucetAmount(faucetAmount * 2)).to.be.revertedWithCustomError( + tokenFaucet, + 'OwnableUnauthorizedAccount' + ); + }); + + it('Should set and get faucet time interval', async function () { + await tokenFaucet.setFaucetTimeInterval(timeInterval * 2); + expect(await tokenFaucet.faucetTimeInterval()).to.equal(timeInterval * 2); + }); + + it('Should NOT set faucet time interval if not owner', async function () { + await expect(tokenFaucet.connect(addr1).setFaucetTimeInterval(timeInterval * 2)).to.be.revertedWithCustomError( + tokenFaucet, + 'OwnableUnauthorizedAccount' + ); + }); + + it('Should set and get token address', async function () { + await tokenFaucet.setTokenAddress(tokenAddress); + expect(await tokenFaucet.tokenAddress()).to.equal(tokenAddress); + }); + + it('Should NOT set token address if not owner', async function () { + await expect(tokenFaucet.connect(addr1).setTokenAddress(tokenAddress)).to.be.revertedWithCustomError( + tokenFaucet, + 'OwnableUnauthorizedAccount' + ); + }); + + it('Should allow claiming tokens', async function () { + const tokenFaucetAddress = await tokenFaucet.getAddress(); + await token.transfer(tokenFaucetAddress, initialSupply); + const claimCallPromise = tokenFaucet.claim(); + await expect(claimCallPromise) + .to.emit(token, 'Transfer') + .withArgs(tokenFaucetAddress, owner.address, faucetAmount); + const tx = await claimCallPromise; + const receipt = await tx.wait(); + const block = await receipt?.getBlock(); + const claimBlockTimestamp = block?.timestamp; + expect(await token.balanceOf(owner.address)).to.equal(faucetAmount); + expect(await tokenFaucet.lastClaimedL2Timestamp(owner.address)).to.equal(claimBlockTimestamp); + }); + + it('Should NOT allow claiming tokens if time interval not passed', async function () { + const tokenFaucetAddress = await tokenFaucet.getAddress(); + await token.transfer(tokenFaucetAddress, initialSupply); + await tokenFaucet.claim(); + await expect(tokenFaucet.claim()).to.be.revertedWithCustomError( + tokenFaucet, + 'TokenFaucetClaimIntervalNotPassed' + ); + }); + + it('Should allow claiming tokens if time interval passed', async function () { + const tokenFaucetAddress = await tokenFaucet.getAddress(); + await token.transfer(tokenFaucetAddress, initialSupply); + await expect(tokenFaucet.claim()) + .to.emit(token, 'Transfer') + .withArgs(tokenFaucetAddress, owner.address, faucetAmount); + await time.increase(timeInterval); + await expect(tokenFaucet.claim()) + .to.emit(token, 'Transfer') + .withArgs(tokenFaucetAddress, owner.address, faucetAmount); + }); + + it('Should transfer ownership', async function () { + await expect(tokenFaucet.transferOwnership(addr1.address)) + .to.emit(tokenFaucet, 'OwnershipTransferred') + .withArgs(owner.address, addr1.address); + expect(await tokenFaucet.owner()).to.equal(addr1.address); + }); }); diff --git a/web3/test/WrappedNativeToken.test.ts b/web3/test/WrappedNativeToken.test.ts index f88946ba..9ffff567 100644 --- a/web3/test/WrappedNativeToken.test.ts +++ b/web3/test/WrappedNativeToken.test.ts @@ -13,108 +13,121 @@ const decimals = 18; const initialSupply = BigInt(100n); describe('WrappedNativeToken', function () { - for (const { Token } of TOKENS) { - let holder: HardhatEthersSigner; - let recipient: HardhatEthersSigner; - - describe(Token, function () { - const fixture = async () => { - // this.accounts is used by shouldBehaveLikeERC20 - [holder, recipient] = await ethers.getSigners(); - const accounts = await ethers.getSigners() - - const token = await ethers.deployContract(Token, [name, symbol]); - - // bump the native token (eth) balance of the holder - await holder.sendTransaction({ to: (await token.getAddress()), value: initialSupply }); - - return { accounts, holder, recipient, token }; - }; - - beforeEach(async function () { - Object.assign(this, await loadFixture(fixture)); - }); - - it('should not deploy with value', async function () { - await expect(ethers.deployContract(Token, [name, symbol], { value: initialSupply })).to.be.revertedWithoutReason(); - }); - - shouldBehaveLikeERC20(initialSupply); - - it('has a name', async function () { - expect(await this.token.name()).to.equal(name); - }); - - it('has a symbol', async function () { - expect(await this.token.symbol()).to.equal(symbol); - }); - - it('has 18 decimals', async function () { - expect(await this.token.decimals()).to.equal(18n); - }); - - describe('transfer', function () { - beforeEach(function () { - this.transfer = (from: HardhatEthersSigner, to: string, value: bigint) => this.token.connect(from).transfer(to, value); - }); - - shouldBehaveLikeERC20Transfer(initialSupply); - - }); - - describe('approve', function () { - beforeEach(function () { - this.approve = (owner: HardhatEthersSigner, spender: HardhatEthersSigner, value: bigint) => this.token.connect(owner).approve(spender.address, value); - this.other = this.accounts[2]; - }); - - shouldBehaveLikeERC20Approve(initialSupply); - - it('reverts when the spender has insufficient allowance', async function () { - const value = 1n - await expect(this.token.connect(this.other).transferFrom(this.holder.address, this.other.address, value)).to.be.revertedWith('ERC20: insufficient allowance'); - }); - }); - - describe('deposit', function () { - beforeEach(async function () { - this.deposit = (from: HardhatEthersSigner, value: bigint) => this.token.connect(from).deposit({ value }); - }); - - it('reverts when the value is zero', async function () { - await expect(this.deposit(this.holder, 0n)).to.be.revertedWith('zero value'); - }); - - it('should deposit', async function () { - const previousBalance = await this.token.balanceOf(this.holder.address); - const value = 1n; - await expect(this.deposit(this.holder, value)).to.emit(this.token, 'Deposit').withArgs(this.holder.address, value); - expect(await this.token.balanceOf(this.holder.address)).to.equal(previousBalance+value); - }); - - describe('withdraw', function () { - beforeEach(function () { - this.withdraw = (from: HardhatEthersSigner, value: bigint) => this.token.connect(from).withdraw(value); - }); - - it('reverts when the value is zero', async function () { - await expect(this.withdraw(this.holder, 0n)).to.be.revertedWith('zero value'); - }); - - it('reverts when the value is greater than the balance', async function () { - const previousBalance = await this.token.balanceOf(this.holder.address); - await expect(this.withdraw(this.holder, previousBalance+1n)).to.be.revertedWithoutReason(); - }); - - it('should withdraw', async function () { - const previousBalance = await this.token.balanceOf(this.holder.address); - const value = 1n; - await expect(this.deposit(this.holder, value)).to.emit(this.token, 'Deposit').withArgs(this.holder.address, value); - await expect(this.withdraw(this.holder, value)).to.emit(this.token, 'Withdrawal').withArgs(this.holder.address, value); - expect(await this.token.balanceOf(this.holder.address)).to.equal(previousBalance); - }); + for (const { Token } of TOKENS) { + let holder: HardhatEthersSigner; + let recipient: HardhatEthersSigner; + + describe(Token, function () { + const fixture = async () => { + // this.accounts is used by shouldBehaveLikeERC20 + [holder, recipient] = await ethers.getSigners(); + const accounts = await ethers.getSigners(); + + const token = await ethers.deployContract(Token, [name, symbol]); + + // bump the native token (eth) balance of the holder + await holder.sendTransaction({ to: await token.getAddress(), value: initialSupply }); + + return { accounts, holder, recipient, token }; + }; + + beforeEach(async function () { + Object.assign(this, await loadFixture(fixture)); + }); + + it('should not deploy with value', async function () { + await expect( + ethers.deployContract(Token, [name, symbol], { value: initialSupply }) + ).to.be.revertedWithoutReason(); + }); + + shouldBehaveLikeERC20(initialSupply); + + it('has a name', async function () { + expect(await this.token.name()).to.equal(name); + }); + + it('has a symbol', async function () { + expect(await this.token.symbol()).to.equal(symbol); + }); + + it('has 18 decimals', async function () { + expect(await this.token.decimals()).to.equal(18n); + }); + + describe('transfer', function () { + beforeEach(function () { + this.transfer = (from: HardhatEthersSigner, to: string, value: bigint) => + this.token.connect(from).transfer(to, value); + }); + + shouldBehaveLikeERC20Transfer(initialSupply); + }); + + describe('approve', function () { + beforeEach(function () { + this.approve = (owner: HardhatEthersSigner, spender: HardhatEthersSigner, value: bigint) => + this.token.connect(owner).approve(spender.address, value); + this.other = this.accounts[2]; + }); + + shouldBehaveLikeERC20Approve(initialSupply); + + it('reverts when the spender has insufficient allowance', async function () { + const value = 1n; + await expect( + this.token.connect(this.other).transferFrom(this.holder.address, this.other.address, value) + ).to.be.revertedWith('ERC20: insufficient allowance'); + }); + }); + + describe('deposit', function () { + beforeEach(async function () { + this.deposit = (from: HardhatEthersSigner, value: bigint) => + this.token.connect(from).deposit({ value }); + }); + + it('reverts when the value is zero', async function () { + await expect(this.deposit(this.holder, 0n)).to.be.revertedWith('zero value'); + }); + + it('should deposit', async function () { + const previousBalance = await this.token.balanceOf(this.holder.address); + const value = 1n; + await expect(this.deposit(this.holder, value)) + .to.emit(this.token, 'Deposit') + .withArgs(this.holder.address, value); + expect(await this.token.balanceOf(this.holder.address)).to.equal(previousBalance + value); + }); + + describe('withdraw', function () { + beforeEach(function () { + this.withdraw = (from: HardhatEthersSigner, value: bigint) => + this.token.connect(from).withdraw(value); + }); + + it('reverts when the value is zero', async function () { + await expect(this.withdraw(this.holder, 0n)).to.be.revertedWith('zero value'); + }); + + it('reverts when the value is greater than the balance', async function () { + const previousBalance = await this.token.balanceOf(this.holder.address); + await expect(this.withdraw(this.holder, previousBalance + 1n)).to.be.revertedWithoutReason(); + }); + + it('should withdraw', async function () { + const previousBalance = await this.token.balanceOf(this.holder.address); + const value = 1n; + await expect(this.deposit(this.holder, value)) + .to.emit(this.token, 'Deposit') + .withArgs(this.holder.address, value); + await expect(this.withdraw(this.holder, value)) + .to.emit(this.token, 'Withdrawal') + .withArgs(this.holder.address, value); + expect(await this.token.balanceOf(this.holder.address)).to.equal(previousBalance); + }); + }); + }); }); - }); - }); - } + } }); diff --git a/webapps/world-builder-dashboard/public/Logo.svg b/webapps/world-builder-dashboard/public/Logo.svg index 7c36ec3a..ebf8dd02 100644 --- a/webapps/world-builder-dashboard/public/Logo.svg +++ b/webapps/world-builder-dashboard/public/Logo.svg @@ -1,20 +1,11 @@ - - - - - - - - - - + + + + - - - - - + + diff --git a/webapps/world-builder-dashboard/src/assets/ArbitrumLogo.tsx b/webapps/world-builder-dashboard/src/assets/ArbitrumLogo.tsx new file mode 100644 index 00000000..aadec599 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/ArbitrumLogo.tsx @@ -0,0 +1,23 @@ +import React from 'react' + +const ArbitrumLogo: React.FC> = (props) => ( + + + + + + + + + + + + + + + + + +) + +export default ArbitrumLogo diff --git a/webapps/world-builder-dashboard/src/assets/ConduitLogo.tsx b/webapps/world-builder-dashboard/src/assets/ConduitLogo.tsx new file mode 100644 index 00000000..14d6a3ce --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/ConduitLogo.tsx @@ -0,0 +1,17 @@ +import React from 'react' + +const ConduitLogo: React.FC> = () => ( + + + + + + + + + + + +) + +export default ConduitLogo diff --git a/webapps/world-builder-dashboard/src/assets/G7BridgeCardDark.jpg b/webapps/world-builder-dashboard/src/assets/G7BridgeCardDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..59d37988490584f7148371f1f5794ca7874b2621 GIT binary patch literal 277693 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∈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 literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7DiscordCardDark.jpg b/webapps/world-builder-dashboard/src/assets/G7DiscordCardDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..227439c035bb2f1336ed9b2489ae1b1115276810 GIT binary patch literal 273214 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�m&t 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%0A!74RVBwPdn-!q4|izv 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≦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�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 literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7DocsCardDark.jpg b/webapps/world-builder-dashboard/src/assets/G7DocsCardDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8f30c5d392a84761feb2be0eef9846a60baceca4 GIT binary patch literal 264034 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 z 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:*pNHO72EvEIUD1dbcfao#^CqanVxn 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 z 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 Gy!d~#sRXS6 literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7ExplorerCardDark.jpg b/webapps/world-builder-dashboard/src/assets/G7ExplorerCardDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..18020e99be7aa617871435c1da86147c218f8133 GIT binary patch literal 273669 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 z%0AmHU3`|4tTy?hA5Nm2#UF+ zInU%G6wVVnX3P~B9ZmDifIWbu!HfjcG-?19cYI@l4kdN*DrjlGtk9TiZk(b=>m@jko*m65Z%$@<7f1Djo# zI1dex{w$h^fd|teqR-NB=KN9VgG>f;e}p?3HP<++?+))PWhTTBZtc1NTfsd}HCecz zqrFR$YrYW?M6n@85OE=s`^KJG_ggWodR}<$6%Yl4Gav$;P^HoIx=+|j8$|g{p_+j0 z#s7dpI~IY}G}_l6AorGZYW}K&I}Zg{m2tLV8qfTPrPFG3m7?#^WG73uU}#{uj=#W0 z*-oD3Iq1;)IN;^JPoZ^#p8=lLxRVKL?<+4+$5r`SR6Aa-a-kfw{ayUH3t%_y5i!4kBqnKn z-9yCO4VF1#+_b!weCZ=Q1VC*k?PMbJ01|S+uTpX z26oQZ)XYMUN4W{eQcxL%d*ErAu_zwp3PXqDqN&=+3WA{szfV~Hy=*>y_bm?spTLN5 z+hkZLZ~6_TPo#45jxijTyB-(^t+wTwI^nW1xu6MR^Um`LX_XbrlFk2*|vSA88 z%3SlVYhL;>vkClk`LneEpmrH7pgOE+_5QM?g^ELQuBTCQkk$$*)Y-2Qvf`E#Y2{lv zJ8aN3jkm{Lsd<_e#*;vR!2PoPwUW9Lli}kDpN||%*(j!OQS%}9e(_<2632x35FNPe zQUwXE|BtCR4~MdShb)KK|v&6MuDEh7ql>IIv!Yzx!VRr?f zGzog$&U(5R0*cZxkpA15&&^Br7D)GQ>WDRIX5`CN82i!8AOy|La;~`3RZ7D5e%9d$ zQY=g^C=h_Iujwl2BaoW)Re<6= z)mLophl?B@d;%_K@?Q0iPSf!TX}Sf!%eA6XO`TQ!oLAsUXPP7X^xG@w@liI%z5P^f zmA$C!Kf7qf!wb1@O)y`JU$Ei|dNgUz#>kQ!Fu@+P%7K-fu>0dLP_{kG+7~0x%??tzX{r>-~cyz&uGFOMmKfLgG zO$u7lF%_3&N9Et>9Ozo4r?nH|LWrN&7)#Cj3+X8XtxACI-i4>flJR`tYHgqS3;8kj z7h=g7?;!PB0;c>4LBM0}nD3GESd6D0nHl8+;1>p!%y zbuggJD6VcXM;J(KIHckf6V{(;@a5k(!Nc#f=TD>Ys%158vJHz+34N{HlWN>LqL;WJ z`b4|ks(%PT5MYL;yz1t&R?(&r1u(oh-M4tJ+~ zpZwJO?v{+PPuZV{*tg=os-MrzyCr$&0=)nt!GXQDdL;{1mVZoof};<3d6sfeT>DQ?y=F?Jz)yT zXY*11{I$yG9N+8OU(Ro`67D=zlq+hiYOZU_*_Y!}Nz!C9<<+0zb$=N3&e&TcXidsw zdG}%27oZj$_;g`@sykk_HTvo+Ytk22AB4=)OQyV+o%enHqn4a-s&P=h)Xfy6p#!Bx5UHXcfut;1G zPoB%(#~e2NPEG^pnPSE~Z0ETILHsf)yze2Rg+59a?tT;o_08rY+=S zmzN8-YH~j?3y2~6aIuy)SlYg(E-8Ap7CQus&-dcuWNdf2OXcpzl?MaV(Xe?#!BFK6 z!6#z$GO_Q?g=JFMnNTk(4pkSFP3_)-?1STzLvn4epplFX5#qb@)nHUi<{=gm9hBSQ z^IrJDyqyE+hrn}DFyI{dc{^fVk3HJYVd3aSV0({zq*2E&6HeT;b3=eDUJfm!awL6G}{)O}&=Ae;6UX)Mc%8;jZ_H z1yJ$>H`v-2?@8FmLQx}KH9?5l!i2uarb9|2U8wy;^^pARY^5JQt-+~>0;U)uDgAXJ z^xK9Acx3ziBSRMC{p?d;aGa>B?*N9>GWw-Qm6MJ_yGciwE2U+j$1$Ex;-&rBUfCT* zlZA$pe?bv~mjZKeuePDT5T+NN_>F~!@v zSIKQSe!lr&%whI;I{hAd^uS$qjkEbL*8465r7=ESBgOr|6jcQCZ}>!14&;u1sEp}H zlczpKFQ|&Xh=~_z*b1K46URnm4Xz56r_ikUyaNRn`1UOaqCIfVsALr591}1*eNXw- zODDoQ0%FqMDt%I6iRmB=8!#FSn}z0nX2VOji+Gw13*-QGPRH!tKcRz+Oh_x$1Zai6 z*M!NOqWBKsH*>p(%0mO)yUzm<;yZ&n7;rn`hV?=>U^5FWHulxW}uwE9_%p8Mh5>1+PHP%wf~Q z$MX#P?A@PG1@{b#GfaMcsid@&9w}P$p;#+NXmCq3HMZ5=BYpuI7+P$K>|0${bSGY{ ztCDgLzqemP&FJah%2W5M9EgX;VQh#(YD;g3y2@W*c>K@^KD&UAgzOQ}G^AIC9W|#w zKqs!mWTAfNCC4#vF^CgNK(S8+rCeU?4}h!$j)@$n@ynP>g0_vCLJ*fCBIp$Yf|B1s zu_?ch^M-ws82Z^=;30`GDJT|982QCFv=O?Lf?&}ngBa5$fsP5axfsV`mo+fM58Cx= zF>u*@Dz!l!S>7)I?#;jsLuxwkH>*xj%?&_ixdLQAdPmDt1}P^!Txx_IEF@^`tgH48!N+dy0D{cx;i)`E z12at`OaLKP38(2G_g;hoPQ+=%)0A)+40fD4R*w+S3Y-+iD-kauo36?nE4cI@9dA+N&qOk%-XHRU1N9>qz8q6c8!dX1m`5KzyKOXZOl3S3^tD z!pg{j_4LYuWSF$}vzB&Nrl||>F+YN`1ogE%GFKT@x3TA6 zOX~tdO?2f8S=4I}+*+r5m}R?=v3$E$P+Dv5*ZkeS#7Rrz`dwqE`swl#=LsKl=cM>E z-j_x<;B%YMxB4Pd%RpQ9*7y=jAdnkTqqC=$OXELV#^xGb;>#;@aPjkT9-KZICkGck z?U>^%DRXrPpoq6*ihfrJ6xK_)O8`jJHYF+yoi4m6ZDGG{=-fKzCldGrrFkGyMx!?Z zJn~vjL&TxtK))x%1oQ3E0ZmevIP1D3gfk(Zd@BFN?vH93Z3~D}G0^V;JqpMDHNomW zjN%gc^nriF5f|ToJC|~jVCoL=%zwB*wQdm5LehdM`ci|-j})XP${{b_B;|^N8irZ8 zlS8yNv3)`BwKskl?UMiJ(uMH8o*K^i7{nApEO2iM*`q}%sL}5|D^)6Md;wqHBKW=1 z>QTnBnMGD}+0BaKTcrx++6t8uV-xlYHc_wTP_c}g?XsN8b%`DNP%Y1PdI-5GD6z!Q z{^2(=|HudxnmM9vXvh4b7;aFI*t8Z+JpW*V+sD5W+w9DZ#2G+55hSyP!VbQr{2qtx7Xkx*2s1bjB&?*E;P|aEj#Vviu&IqwE`~Z=Omq|9sJQ}1njAvmu56W zT3(+Jy3^uPlJJn--WxQjF5s9Zle9UYaF{Q7fbvXF->y6#NQ3B&PhQ7WmMA}D$P(vQ|#;$4vPP}Np6@@tbm(I zB{@tCp1H(Ypiifuw#Dscf%924|c_Rx?gFqy1GukCvdyqGg`{d&ZzVa~0WRx)8L$98p6fsAnj};U& z(lpa2d12JXv^~ppx1!(eZI9o|Qyq*$AIY7f%_i($vtSH`J0GTX7;Kw?6aul-ya=IR zD_Zm)0aWZihU$K0z_>~*nVu%_i({+q__iU1bZ-Ah9OK+_&k6|YXS3YX zIQojJLPLqYv~^gMy-GBfAklZ}u2WDpn2XTBRABwINZDT9Gntdw=e4_f#! zIGGVsZki-XP;NaQ834o8XogVpp+fxLY|q$7*AEt)VM0Z3k{%1(1Rmmgf*>>kpLl3d z^!)XP*ChUEa%jEbO6|zPB&MP@euaI`k?BW%wt_{lW!!-cV~6L`%Qd%G0ElJNEj|s? zOq9=-DsH4#?6V87uuFQFr3J^rGX*4OlL~fU7&i3#liOO8ca6bR>wNuR$f3m8YWoyQ z=i=@k$Z5eRIe@CbglOnv8GXpx=p%l&zmRoxYW{mPGCc7wL?SD2IUBuFLK|H6{r{cP=u*Ie1=6g6v5bF_>GbAmf0d}TYeBjZH< z)CbHOJ=A2|KD0a|B7n|WXLCi5c<(I@vN!C=KgZSTE^+ccpI20hP`dXk6r2<#f|A7?03*f=d>^g04RJY_~a-D2e|;rKMc?AvZ#ZxNoqy zVh#oLw_^NfA*i|2WQDx%Pg#HNUlae1ott^;3rPeKs=@{dZP;YBJliJ$We;4-dLP=C z;XUOu?NTS+?ym_9IIqD+2KWZ$HqGp=yQ*u2|Puru*jELSj+3lZ|ts^qqu_=c<0 zk}yfL==v>r;Yix9QtZTf^WaIaBH!IxhEFNVWy=$wyo=N?xw&$Dp`pmB16{l_;Y48$ z@wR8IBZ)g&y_rQ=7EEGda5DC|6<^m5=m%M6c-V!k@>a%CComa`%yG+m3b@3!~!Rd^W;mvF34-}e^$W%{|^o2H@d?b zjLU|#bi_`Jb?@LgxNMxrXkH!OKUpQ>kz?nQ6I;1U9HdAbDjT2k;C0yiy=FoxGw^|} z(Pj9orIw!Oo;|X%^t4Mqa^V)%Zs5n;)&<^X-3l$itqQA>M{_gEUmEo4RCMMIvx2IPw*j02ZQZ~TyQFs zoKyqc+HOU4r;)w0GHR6uIanYNe+vX`&@SZ)dxVE;#KruVTQ3g%OVBISk__@$jEA0n z?}SORqX&X8p9#XfvRHMF&N#=bS8p}`+K6rji92I2mo%QR*h|CbSg}=8YKr<3f2~&?oFyZrtE{8gm_q0P@Sh*x9T~?!>Js%GR+>oba!a*)G|8SFwV)Z zd!8$%a?3X%V=aL3@ReDw0|%NPV{>|gWq_0-%!l!1Vz(Pb3}I$%a*-vL!wWG!`)QlPd;OKo*Qaqj(IIr?&h4-edlQi7U*pc6Ic6Rb+Ah?7knZ> zm&pUb(#nx-fQKn)-X@Ar@Tv^2KhLp`(o!5+ixhhm;j zKum>iU@2|wZ0WtCg-C4|5J7t|eneN#=m2BukyA^bau2uc6(NRC==Ds|6oO*Bq8aUi z?x}2KYnsrTgY(I?8K@@pmBzG`hR$))I#Ao>k4q+fxMnm3AG+<}XrXR-usr?@1l*Nx z5FvE?+3A9d%V_S)jLNuv&;kSBMQc@oY}lV}feF2ZCz4|RU-gMQ;HYBbXf=-#v zQlzH5$)e}Q3^&sxT?)45IR6sECkVc}O@ z=KDwXG*AckLxm>2@uw2I)C&17Iyo#q^%ic92D_wrD53_jQ0MIHs4*eQpy{K|hL2H4 zU8tW-X2)g^d2@5p!X=)JCz;vWb3&n6a>mHp%&hD_R}%4uX!7npfga2yPOe( z6yM{XI)s=`VPehM09qX1#d7rJCdqXy@h;t&9XNchUhjM^q(dbAqrQjBG4+F~-`ur< z?kV{O5n86sQwMFGP5nGZ9(b8z&|>lx+3XXWi0E~6_RCD=(|J$o35n}Uh@dgOXN~b3 z1+QR4P9$!2e~&gyb~yY9PG?<7&@kze3j}qyARV8aaVek&3#C09GZ=*3WSl7EpQH-z zxTFfYvU2xy3y9b2_~*dLNl3vbh^0UtLqG=WS~b|_ol6V+7Fpalmu5JS1&;roZi#Ar z-TyjZRs%;!mw;B<1E?sfJpm>h28CkN0?t4_&+eW2Qau*}_xaipmk1}mq5J*OdJA?7t;3j<{)w8z_31(Re%pVaCulH7_|?v_tI zsFHrR0YH>8HpMuM{#*#TXF`KDO`DNp8ombsd}$}>VApCrQB1H0Atn+z>s(HV@Iuh% z4rE?BS;@;Mg%KqpYneU{7e;B?NcllaE-PcVlJzI=4ytowgUL>k&&f+@^6`qY!#9kf zWKtJBiR%GWOtJ*l+ws~QOkrFW89rGU!;=c%nmf|POdff-{(h-DOwF#`tHSJe^a9IE zi6-J=&r)s^u|f}m0dwS$<0k$W&l3l)a55kC%;j5SgJv6{&u)u&=WgG8ettSOsVzx= zwGf&ysKiuiiM35z+u8B*G#QmOe^rFbt2e(}(JTK?oBGUJbxe1qEDpuagw$riF!ewe ztfCzcN=_rO8BJ9ibGQZ=3iWpE64=m{B4FnQBV^^iQ^py!xt;uW zUoE~N*wPPnX@+ju5Rn~>8OMCQwraN@yS~8cWAx5{MenxcQ`W@oCI3*d1%&ug;%5;4 zO(z^IobjXYp5|#k`q1Br9j9}?IBdPl;CS%X)rb)P8W*+a7s7qFtEk&%IWO1>OWnS4 z1*N7yAq#^HcM3FK4QzM6aln&XPLi5#R~?GaCz#ZWdD~`HKmS-BypJD`YcQ0oy{|sZ zs5z9=cuGJp*la@J|7>eSwkku?Q>_Xa>ke*>SB|ypOf40@{4I*qNS^HU+bPj>@UQl~ zdjVuj-Im;b-rOFZHl~Z~;)=E&q?s_VshWeR{-Qg`k)*q5?>JlO zvND7D(8L<}%^l9(D5EBg&S2CZInyqo*C(y3eTiR-mSfA8erd5wmDSg_cTU>#1~g^% zf!5b4giBC+EUd4aF11mTK_>0_!n-!{di2=tv$EJ?XN3wzC%-?&#Zt2l z7bfeQ#ZSk)ynkVG@p5rc$pA6Io7olNNaW<0c8;rn;Iy`Nb5ycCNb^yBjxB7?O4PkH zvQFuiCJA>V*l=kymmx>?u3k{O4P1cUf2y0eq!xVJ$FKlYJ0}hO*$yaT&O%uaRY>UiV(OJR z1r1sz<^*_N=&rb`63Z3E+x&jRjF-U&ZGv3%0a?CNvZ~hw<+=njOoFTNAUHB` z^G|*X?{8CHt}Jk5^Ua=W?-@uWFO`) zk(*?)dM4UlYSkFgen|@(~9I4ykDjb?xbqL7W*0Bm<3}4pr5t zZfx%lzH)$T<0vTMDB1$z#lj=hr<_J7)XJyDXkm8!pLL)Mn2TBN~U)s==v8TJM~~4 zdwKyrsopmVcGG}c*Xr!mjX^EEpwpQ;7(=DFo;G>-8w6iR=l{Az)b*txupJF z-l>?=muxyh!4htN2!N$o-<4w=rd=YrIgYse2Tpi>e4N$41yqE(s*NK{EM1G*;Z_j% zQh=66-elh{E6U&-Qbz1gz(>C4d(`IW#|MR=E4qJLsq3kjFuQsEFJ!zQ6ii&Y-m~Lm z&@d(L>Tf+f@#^@bemJx_+vzOxea!N3W9!O|5#5hknw8<{=A*k?QH3tv$Hh-uYM(eQ zH)Li1Ty$`FaVLFw`>WZxJjO>dx1}!oOw6d3nW@;7TbXQSq}yG;6rHHLIjGUA+8V}t z=LPP(`K#NTdwg``V_lwy&AVQ`S#!%nY2`B3kDBfoSY*rP%Mqnoj4wv#1F~-@^)s|& zE&W6$c!+{i@6^Eo25`^p2tEAd+4}K5lp3eh>`(n}XimW$*>&Qq%A?N>jj4A<<}2HQ zYWmI?NtY^ExG$~+-sv{A?~s5d&FgRlgQ_C6r39LP&&37&`fq-KJjDVAC)@6hl3&dI z1b#!8)9)w(!{*1}WvJ*c(3lgq=>C7Vx+xbqI{i*{7kxJ-e7(&<~@4#@gBVw4x^ z|E%+8e>G?E)2<)5wq!ZCTet;TyJE?^gzGKhlQrY&)%%}>JOrptgapK4s_KG<4VJF~=(Tx)jFmqmb?c8(!NE zD;jd9z)G~V;qfnOZm!R#gB8kjJ^AS9pR*5Ri`ZHa@a=9?S?n)}YZk-P2?xI`5Y*AN zww6z)VbM-H>oa%S%IB$kAlJf=EiSjXh8emb?$+!My|;PWLc{yE++WDhF(nCa`r~pv zY>z%Ku&xTe4wy`e*6o`07$#CV8(%K^>+!WpUhjcfs?(>26U*V*&57K+?9%y^gmz*L z4qL^*WQj5C&(ERT;ADcbq-bkhQ21F(Z2>op(prIx0~MEJ}7f7nqGE74giUJ#8sHJr7dM} zacdZxC9D*Wc-O`DQYH|vQLN%wJw!Er+|EQAe1vu4&{aSipeyhR7Wn{J0&nrpOJeJi z1;Y(*Tp``NWizliF{OCCrh8+gf{V@6U{pStU*k@hw|5kyZ4pMSP<xgOtiMm+a3SvikCGSe5hkBXkqWS*lURPYN%6 zkhR1u_ZL;Xa?W>xrtm=iFKk7l$7vekLtkHI9z?I|+_!nNOYVEO{M6Ru0BClrTcCM1 z9~&B*!hf@q{pm-P&VF7kt$TI7h_uEtalJ05W_>lM=1+w;ja?2cv_DNo7I=5jjB=~7GOPS&*l{s!od`bD>HuIqbgg)$1x*kiTq21bi{ zcS58qx32mnuP8E8oP!bs;}Mm-52f6;BbUzVO0d|oc7DjeE*k%3V86iGh2hGP{b+We z=h;05^JpZIMDqWmoE$9Vvry^{fQju>j+yH3v&WPZ^tJ8WTUyy-6*TwNg?=y~2?3e` zDA?H_5j@Ajf=LO~>*GM~I6J?sHDYbcdKwO@3&AWAoS&q0gM4Di!t{0(?;mSls#g!u zHIoVkj@#RFdl257MM>QI6j~gqO3Nc1=RcXpOrO|DPBtf3?_`cv?ojY^K!)0H*7v35 zQ?zB@0{81l!WY66922m52L9?#Qg`A_pF=8oWDhxs<(h8<=@sq*gvAxwgxMh)y+4zB zyfs=AIRN`C#}~gjda2Hl@^!wcpLSqSH5CieN7mf8AMy)0o$b{nQ#o9Q3UEuJF@pBV z&1S3XC*=)E0g#28Pjy2E@1+ibebSuVBEyZt80fq2K$s=bu4-`~ZTq=1LABY=gY~Qd zbE&=UQ)X=3YG7}i~@Xpvxo67*{XBq*yFa;LgsqnOHj^zZHzeqQAnn2rpSPgn3D z2_+>Uz>EX31th#GiSNznq%=6&`eJgERm|}vF62?g_Qd2qCdrC#D3sA{10_Z?2t7uh z#2LnFnFH#_?4HD@z4UW6Nt&-+ehb>gTd-_KY{kWy5m4YL811>a70d58#olIixk^4B z64&Ul=|I0R*yVwxGb%2P#d znSUZ2PK;&7zaWT-*N+Z4R`p>Fn8>)jUdWoJktFR)Hc@Tvgx7JLP}C$*y?4=MK@g12s;Fz;eezAhAeTKend2ecIak5Vd=1`8_t2V2Pdq zU#{+3()^E}Q>H2YMd%O3%UAe1Q~Hxz`Q5A-O?;-3-<(%)S-aG_2;Mb&_u2aN&DtIM zUsohy(=8BJ2G((R94!Ra!8mBTdqVI>3?ZOM_n5e(WUNP;anBhXN`F8_keUr@AB)_{ z1Rgl_@}o6Ky)ng1zgtpHwWs8^!`N{IQ1%J=jlXoPrYBHczN&i~1VB1&2N)=0lyj$j zWbn`dq4D7Ir!MokYxR>4?%nxH!L!BRMliG!u1JZ6(kTltBtb%;d0`HUSC7s+Io-4Q z3xVTz-(DX49Fu1x4&Oh(8cXYi5eKvqs;rd;`-t`(+Lq=z2~|y(96F>l;OmbmY6>%m}^BS zQD8vD`9A`psgGDx;!cXz+PL+0YyeF+B$j6hqgsdjA$nz7!V?Kvq=Fuj;?Bf+r;IW z7nT3{6_r0Z2!rBie~A#QIwa|_p>rf9(q=q*Wp-@um$zF>Qe56kKq)j+F|!kJ>o^M9 z&apnB!l5`jSYxBjMj#!Gr5KDL7pN4;NSyrg6Fgx{m3S z;J?a)9MdGPJnVmhy8HUZ+HGCs?0D^7Z9}9E zz&^?j~M9l;y=NFc1-`aFRrpIBBDZUA;_Mh`D=^aCjT3$L$8?l;j zuXh8IUr=qdzb61#Ch-{yEl_Vx;o|5Hz~Yfk>}rdE=4gV-IC z@}=AVTqYtXRMVJl8!#H*KPP`09rY!8c8o}kVth=*Z35`$;5H3;gw=+4sLuk6eYRG! zaq4p#`IIM3&+%-JGbtt&%eoyHt1lQsN@3?-CsfKxgdR(jMWM?tuG-r^)A4NY)(lYX z)(nc*0u*ZtJ^H!DT2w||EHE`_mN*SNY0j-GHhX5PY-Rev8w~z_P9Dqij$Qm%RpX?Z z_+G2Ao$jtg&^P$5g^pE#k_u9si|z8Oq{^Eh4uIGcA9;VJ(u-mBT{(|f@z}wu<;u>s z>B^`cpqdauu7tr;&bY(azMbthQ(`oDECHA^&i}?<=0Nnja{q{#Oo1YoJBR^;C~1y8 z^jP8Ux>1EqEE5!7e-n7tPBHZeEP+f0C0Ky9aoMGiMMp0wV>7ORG_ue+|KZ7fa`Xg$ z+Jb~rEs+M5{HG0aWbn|H7dD%UaR~e}k|DI*rtxL%G+M{2l+{!2Ut29ltF%L(t2bwd zGQBHp*PX|neG?Giac3~LV$w934;(d!MqxEl>+&Mz2`0|wwWmyFmu=ceKbG5Uh$9W^ zl@G^{p9m%yEorv{Ki!Vo5PDfSYrF*$uc0;|awgpvocarSSh1~hl@2E0cr3j~J}~&N zQU7LpXV5`hX)cXfY@K#0g~c7~CkADKOzBr1hExIx509EYfn5z~MELn(do%ZO zSv|suH<#<|)tbM5xYzVX(in5o=CLDZ-$UF&P@ZuIePkE%cJ#sKlCU&jwiPQAj8@Dv(yqf;DpQzy9GAja zX;x_Z(Y0S6Knn!JFS0oR_u)#b5Kj_ref}{=3w@H3o*4A*$?Kr?x@YG z?9I!vAN~yFs%8rSf;Oal*dib4~9JMrWO!|&9jy>zW z2A+HBzcD#}2;KH*M-Pq{^Ua*`%K5FYxtOe*Q;T=)&|?LmjD04iLT^RP9-P7S38$t_ zrN%zcO5+ea_uL-+WLL?mE>I`<7DeKaw+qV(QVE#Fv7{aBl8l}<2C|8Sx({5i(j#%9 zkRk`i>snmJhMLdzh9vm%!TG^laTju!noSEHJ1YF#jw`(!Bw2_}v3h!FMq(m*=SF=L<+Ia~qDWfU|bwzd2 z`Jk{;#BZ;xNkSmuwt@j+lGoqQJcITaA?C9;IKK!oi~TInZUx)^p$Exp3xTA%%eVR@=KsUtBLRE9bz#! zg9-D3*FIgJC$Cm6pb!1J9kUlAbHA9cQ*WD!(k%c3L~luYR_sFP1|4rN%tz7skIZlF z2|o1g*<+KDN03PrxGg_3VWF|<;DqAhx3T2n`BMx+F-Kd*sD-andzkB+Y%|Fz|495LfY9=5 zhs-~r6SdVRTxZD#p#H8R`PSXp%$^)ed2IayLfG7W3nW2**A}UjnipGo<#@$Y&UD?@ zVP`QG6(+`7O^++RDyQ>DI%zT)y3o${Z{a#Vd+~QLZw2f%p$ zN&|g5#Wc_I=^agn5J#~$yN2xlG;Byl*QBrQ=N(5o=fJj|V)bSm0>skPT=yKg#{fIALld+mtRS&12TMGI&hl*Vio7*&oL!%`V6I zMW@&`Q|X==!yZGr64`_!l!_8cNl^UVC6%WiWN%jFkIkNjOsxb@?%!An6usiAW+<5n z6$^58oy&_@6XglIkvI%iw(3-W*#zq643RRnS2|*U&+*+LjFV9rN3&w?zyDZ2_ZK;1 zE^IzftsXyCF!^i6mD3d0u(<>&UGhUn$0ZqB84aS$#h3G_f&xB104^&}evkK3oM<81 zt@i%zp?Gilbl=K=f;Ecl#x{$*h=s-CZ|)R>-Dm5#=P4(YAp_;c!+l1;nrtY-7a_`6^WSrKMx zwf}v_As=@4#=*>m!w@v``djMni3x#7+xd{ZsA@sAsx6_+w|jX@j?bog_tCZOfqv)S zCu&6@-QM5LwU@Mdl)rN^z0_=@_`O8SD+jbnpv!l%R(oH)?4zxW+SYT6rL1^vjqqzf zGyIDYW~d|%fqtQ=lDbZt+$Oij8RY{fH|K<(=Cgm2`4f1UJztX4DnVSMwdA|x&lDbK zy2X&;fAO|W?4qyA;)1V2EWFn{gfxA*BhB9Odq&iC_*K?_wToGPkgu3WWDqY^)ceVg zA8B416^>neVBnMX`#iULfA#ns36}%ds{DO8av6m2}d3YrBTUnWUrou&4G~`EuQhFG?Lw z^A$VozKj~5mR^2zVV>d6)Y9Fn7Z$|ReYOhsvjHt+lJd`{4Sxj3>U4qeme1!rhc}1) zpKmlbJk}BRPMeF7I~VffR@gI&#b#eQyuP0!;l6}b`nXSaYHs;9G8;DkuEbp7?Ut?D z{wUA#{O^-@AJ2XC9leE%AfR;L94h`9%e$jm@|<|h1I5a(;xFG}156|$wx~D9;>t1Y zrB_P?n%wV|gxhqEL{zq$KXs|MTRXF5{yQsq>-iTvPph$FQlxTeMd@7sfZFP^hJS4F z%^OB@n{S_bE-W`|SNw8I*b=Sxz7$TpGj`#};;Y{`KXIIWxrq2+qnuf7D->b1SSa<$ z{@c%Gt4F>td9F~qTzoibeRePFdOJlh#RHait{)}Giuw@6;r7zH+?>q2W7OE#vae`XMT7!PRpPR2$_xd0E>E~Myc+1!}c@s;!XJdyiy=f>j zj#f?Bj411Pi%*Dj+|1^0M=ak#-Y!p^zvk=X7O2u@GVXaRv2jj$+jJrRi>BdOo&p`m ze?5wiqg)K4<-q!ZZiC~P;Q_dbMy;vg`THfOnG_ZF?++>?T@UpOZj#n$P0OvjKS4(1 z(;IjET5acjq{c)B%I|J*Dt_=G1>w>L!>8byeQivYIc3I*p8{NdC)=P64!wToWGGQo zKmSUYSSZN6^Kq%7?_w2VC2g%p>DSA)a)a8#3uuYv#$*MECAQv(4kFZ{KT&+eb#4w5 z-eLXfXazksMCI5W8dvTmqcy3{Vbpr9p&RXNc@S8apL4tNDx{MO(IJaV`C=ZWN>WaZ z*gFcN=$wY_Y8_a(VTt*zN&}6gcX!$yWrZ`&W+GuQ%hYkY#cEkQe{(W^uc>Fc$2KRx z1&1*be8EcM>f>h{47XBp^a>3e;r{#qUjeAZ=*A_#WJ$yyRJV*C7+lj=4#d(BRx8xq zy(c7J+M#zQDcGkjA_-!59p53ff+6&D_&x!(`Cb8r?Fq58FlU#suY-3cl%g$+d<*JT zQXa7zFweM0(h<7G1j-EId4L9^xr^`r`hE#Hi0mb|yVq69*)WK@#H74`jWJ`hd>%&4 z_M6>2KJ5ba*c$@#vb4aI-mjJ>IuT+`emjv4srVbDNIrgu-pn^fk8~gXSUbIMtq_6R zZtNA=H24B6U0;Xx!Z#V&?msvfYdhFj2D-l`gQ7<^_5-LT-;OqHc$L`1}BmbPHw|9WAeE;#r)Sc}fC6z`IPLn(&tQ}e?B7!3Y zHa_!E|AbfU161-;yD&$U8i(|Q`m`cAM>CBDyPZgCTxu7sN$mBjmo|pRD1$hU%7jkY zHU6V3$EPe;dwMz$U9RvX6ce;ijRu+y$PEy6t@<0GORz3Ff^r%}r`0v0N>~aSs_|%+ z3f(&v#Tpokr_FX9m<`i$8Zs!yOqL1%Ce@&6xrh+l8dNh0&Y|}?FJDr5Nt>y=|C-%@ zNxS5tl$r^wn3wx#(UidXK-`fvjZ;KR+@mWJhnU;$Npj=~6r zd1>*EL=`*4tugkbCQL(#U_|qjBS9zji|+ojwyD{pO7harz7``M0G@n!RtUw+xM_Ak zVFGtfUMm<)rr$sT7_O3B-hA(0hbs3>5$u{{8V5`q8#}8+ZcNRFTT9@{&iRTf({=x( z9&4W6ZWNPFO+xh0X|kg?Dpd3!l6w@u-Tu~Fe;>CY(~q$W3hJHXLPC}{gjy+w|Hx2; zFNVxHRiB}#Q0l38+D9*s9z!>zkIY5*3e$GBDrzuP?8QNUeR?V8*-zO%uGUS;Hi}`fkW9hH&6!YZL3g1yXXm zEr)fFFWPsA)*d7gd+CXA?(Tvf;+eF6bU$a890`RiMDhutqfUWD1dP7BcuiBx^p2hg z2*@8{gN6!(AL6zg&igMPq3tM4zi`{S+?kY}k^CG1fwjC0FhmUj?V2VOObB_0*RR!Aawhg6x(kw#R3d;R3{Rukp|5wp z(3I?*s%nNp;n;YA4lN=)%}`_x_}dFjT>>-GLv(9d1Ne!~u}i{FPrhonu6IC`dmwQQ zLJw0QwA3i|ZQu^y9ox#Tnv@?#7aIt2j#{8X%#bvdFAUwZ1|vP_dbHQ-H)=GLEw8K$KVBK!=k>~d(@2Q0>&yOV17wdksB>PLue!r#Z@@nGB zq90PuA!eu_m)GhgYGz(}ZJP=DZ`yZRu>|Xk$&8`}$x&dspwN3$A?|>yL`dC(ot^PY zWcy}B9#c2Uh(LpO5nbuV3xDZ>2}_GD%D21|kw%j9U&YM&5gTZFNqZ!0a0d~g6>Am% z^Ji8o>0rvIhyHK(Yw?$DMe-U417p&l zT07XNk-Tni%b|-rpEk&q{^!z-L@vn4V}yaFr+L3P_Gqx-}(NH6_QRBU$oI=B z@e!wkljBO=S5wgxwN={oYGG*@LCFCTJh-Ybb42)tf+;TVf{uQ&@*QDn`;*e({7_r*TadUJ-DkZ!?aC>Q2kq^XshNH)HEO#O zRvCpw`&96CD!gTQ$`m41jVIP|bqyuU`~IW%4VVR{kQ=FWtIkMGgY_27Dx_Vc;$qw0 zttnz)pr6Wh#QLkS$-RxJk9Jd;H>(h=CVP@6T`Ue8o=r=OIxVk|ApB_{O&oK~P5=t{s zySBOz_MbN@ooi$7l)ij?uLvoY=Iop+M+K8aBd>vZ7@0hFydyEwIGq;oI!Rx~qKZ`& z%Wfn)G*IW3la`Q&AIqkkq4cU}iojdoYNi}1IN_Z9%pe@Ebta-iZm{!Yo{PQjpImqNVC)^xh!%Ax(P*R}92>aq` z9S-2$)Y(VbEiTkHd|n!0hoqD-(6gRx7ktvQoK#_8A3#Gthxuy9aSJEAPHlb85{Tu- z#x-Jjy9cl!8&`^?pqf`iWX=`>;q|9qGG(`uRAZ9f@timN$->Xp0`(Vta-(lOG|PwW z0KE8YEo~8rug9_840;WBp54Yz=J8=w;j@GgL$F>d$vX;!sp`pJ?-(3XTfW{0Dh5%x z*QB$LhF}T)=kv$jzU?#`fV-$Mek%@8+uGrx(ek5X%eEe52#RXTn;z+M8}nS6{Q9jS zgD&w4#+JlzWRE?6Glr$(1-m`YYtfL!CQ(|O7uc-hOOEdU>^Ah3mI|GF9rbH2lfF=B z{!l9mHi>o3@+*`U`-ENdb?M*P)i9NfrA@OB!qY=|*7_C=qq-H;-YR zP*shUq}s}p}mF@3i!N? z2hx?Xk}0!GtQBEuO3X55_MD+9dOdxqSg*GxDhtb~S5fXmd*oA>ogdzKO=I~?J4cl9 zgo?|0nTR;4!W6S$YsNBX2{fy3!XM8bFTa!6+UYuPq!`OXDS?!_Mu$^3>AVRMzEBZd z)YxgrRg21d)nlu@e<7sGQfJeep?_*HG#(HP(m7)Lb>v9|*GUrWY!}ux`wfz8>xT+E zK~ZM%3$9imd-vdxUh&qC^;6FsXgs|BuR>QNUnH&0Wu~F~G!57? z^uqudW`^un0ot!%*|WaQkzicZEaaJ07PAwC1&)2UHrYcHr^9F{2$&Vi+G3{aM8WfW z6Zk`5Hc9uscJu{3k~MTs@~xij9bp|aX0|M?;Qq7rCi$u4Z-j}T*;AAuqfM{RL$E{c z8_7)$f0{y)YK*^K;pD(UF>K?a3Zsv)#X`*HpZ4IHc<1 zXj6Ol160?aO@D6xfzA*);qf!Z>Ez8!?;mx{L644NYGWidNb1*_{pJR9O4fdR5d&@s z=I0MQwIcn9D~UPsWo#%yF8$$E8I0d~8IAh|@B7O$?#&(Vjr>>)CO_Z*Y>*xCd$@FU zZXwMnvg^<0$IHnvtuR#Gp4#mX_r}J9RR)|s2rKGI^Rt_ZX)8bHhfem7#9aBjX>y)O zZ}6M@Gj7aTtRqOBj?@=E`14Na_sA4Nit}{MUbRJQzf6+(!RiFl(kt_?3U^mNl5~AR z>AkM#yqV|pAn!~@#|vnd2>|5}XGvL_QBckM95ZA*uPhdVKUu{quX3%*(Cs za&>;){XVNaxhNblo{zX0bH3D*p?eUxLcYnndG$<3t(nBK^4Xcml~a0Z%H71qtXt+~ zm**!b zXd(Tpw8=E5zBK<=f(HhYob{Nn(P>&>%;>t~ty`C-vYbAo!Sg z*(lxg9=|~1{lE$44%=_wW`wUH=EjwJ-SXQrVF}b&;_ilsCqqExEUcKJy zo+b%jyo~?(W%pi1YTk24a)yQODN>Blo#$VbP&?dQHK|W|hjqMx|1jNHv=`U!VK_dOg=Nx$4yOT=yyf z9gV&yXt+&LvI;v`t}r?o(I=yK6EKO2kExm*#`e7EJaIY0aiPE7P15sQJLaX6lyK1klt%6~4 zjo?ATUWYb*4Z=sW#Z9+6ttROUB7>m%a;Pr|6yns>MSMm!^((keM^cRE-!WS=x`;;^ zhQ_&uVN3~~_llVjBVupV%77kXs1OvvB?1dG=)i>VoA++d1cGd=~Nrvt*w+&?tzPyxBB`aD=CyhD-=G2?A+N`7~80C1OjyN(5?`>6KuO+n` z2U=Tye*mzZ-XrVu^qVO=D(<$E!*Y>BYD6%c7Ge1)swJEhopoNH3B8>@aXvHi=iU*j z;UfbifYEarxA%%!)DN!>|0;WbIcjDw$a-qj_`99b&8|Hq4g*RWW(_wOZ_7lTemHK| zG6*LUay{TE7XzkI4~${&x9JfFk8j@zitz}3TYsGBO(dPg57=|J?xmRdxSf(ExB|!0 zMrTxZ>Zi)WfpR&5tY1(aQ;8Djkd5f|n$BaCr27$^c(4@j-iGt%!@2UUwGolQChy6aLNMw8by7atH0h zXXc)8WQb%OJ%bNt8sg92eq^#vIo&H*s|)$d9g0H0%R{iaq!fNk6E={gD0*LhsdF?l zle!p7-ErLyrJ*d9-sl-nKl62sro1Pi7MsRK97tcY-4nixH#4mgIgRy00#z?@zXS%l zV-GN?6qf1xs-iV?M)eN4Ug<(A+u^-vTzE?`Wj>mk^<~fYd-bYWv$YaoZ=Xy3W(W_C z2sTTy)3Iu7J;H$mYU9#G+Z(_jBm#u>*>IF+?xv44Ddlj8#7_o+e=ShyqFgO0vGs4J zNQx!8`)~S=1y-dQ%YWQn6bvT&Ht~tC3Q;XnaX&xS2hG{xVuye-LYQR~npKDg;e`{Z zI)vRb8%dcEkwl+o;JdD2WZwp=^>BUTqN!dUvp{j~7(1_yp3sX}7vyG1b^FB|u+HB( zAIA}mI+O%K^sTRaf$D2|Ap9Yr&2hWIIjh*0*oWDJ@iN&r!R@SSb?*v@7dd<=|EH&2w3r|aJ zT%U93f)H`Hy74EMc^OC~p-p9Gd8N^2uN=fAGzDV);q=^2>h+j!NGPsq7jk(k=Kh>j zD<-|Q&~wg;4GGY*9GUow%Kt%!KnZ6xIjU!Eu-#?ACbaXJK!2jeOhi<*nCfkj)90Ld z!I8yXX@e9<-_kn5fE+4}=uWiEFW3r?wbN|FL-fsjf5^UTPfqJh{Kz+9x#p1<6l$O2 z-P6EW&2=scg^lANFibN(FJAz2FZlDpKX$|C4(Sc9d#9%w)}QvGcskN<x%k%^RI`uOy>bq^enwNBh&?m5!|0 z`y4(F!_7I!oH#iK?$xZm>*3Evz<`>!umQkAvcpN|p6jEQ_WtUCwW9eUzV@0o*d2zU zZo=_5+YP#pC&sKPYX9u^`^Jp)_)f1|3FfOV5B~Fb2!D}!~$2I++gg!q^4!+ z;|B|)?f7>MG`$MDm%p9D8c8QC2=JIBo{j?sYSi*RwMkmG z*c!xprk3kEbaBJlG-)Uw!NKRTPMrtJi?^jhg~I$$VKSR;fc#-*_jhnuq8iIzIvA6p z)fE6NPrE~Z;Wjdn2w6)t98F1zDJw5ROUre@m13dfJ)_`Nf+kq#;m%x52{j$-Ynb2x zQd$xt14eOcksa5;;~WpB)Kg2Bdn(YLD&JK(Y-|XJz>&7XPaI7lusxHKt{#~dRD2LW zcSn|{pzqWJBOVUg7lf(tDMTvWT%$d`Fu!o%UR9>NPdm|dMio%Jjo=2V2HqPv7#a%t zmZwKLUe1#rD|lGczI!^JBCg|PCG83smlB^f@3k&F`e<-{8Eo7acXpgpXm5huL>*^y zwO%O~qEG=XquE73h3Rqmfk!7cj!Xa+3&1Sk(yCMAV)%4gd%v_SZ&6PrB1Dqb6&c`C z^SFEs)fK^NX#Ni}=>>OK{9j!pmhz(?jgpSUTB4;zWD@%4s@0^Z89K~+Ve!p&>6Ux6 ziG~>|uADjade@Mkh$wP~(C@ii?U4Q)R^I}E70U^J<%bh_{U+Nt}m zeY8Wc5Yfp|#nR(m3+1>+e9cjfSgn;;putq1v|OJ*w42~1u7;3@slVYdUE^Us`r*nQ z^Z-o{HWgeHe|AQKq z7cUI`@dVO&pD7t-q3Z#$Vt9A6>}T0NM1$g zhhs3Z5k!f`=Q$R7fU@p1;b&G~_W|*xeX5xy5`7hu*x{FAv}$9tyFF&}g0j)S_->O> zZ*4%%ezV)QG)|?{>X41X5Z8e4E)dnuw890Vq^+hl@2rmqvnbwzQ0HIg3r`0b$S_@f zWbM>sn9=h3;)A`3%Fv-Kz1=Gfnad#?vm<qX~V*9Xg8i}n2`IDUc8D+7fysc;pga4p`1f*>BFg-*=ss6b05tV(1$dsT`AGtt~ zuYY~N6+BA?k$SRd&aF95anpR>`^F}TOWkpqvU}b;aoH@`uW1|mafV<1`AW{wE=!*` zRk_A748=$3>Od1H-mS7W$>WlG^0VwB+s9hHX^BV4F4wUVGI++N}YJao4|t9fuMqJ2=Tj2G)QfFC{e z<>-Ok28I&@Zs~$wqr-b~#n&AfY2F@9-CF0*BqgjT+8rBr(Hb zsci!`fA1c>`#XKO@?8Mp)%(*F5zOW_aq+VK64HCdPj)#EldT2{!%Y+sGTC;XdjMmw zv}yA$tNGxIoZOZ~S!?jwv#YgTURuk8eKwm2}R)yU$t3kE|H@ z@(;l4_ATj$sJF|dW`-W$sbot=y%KSh7Yk1xEWdL4Z2#VK&b4J(+PkrHuJV$sX&g@@ z11%u2EpO=Ri;KO$T-6KQ@>pN)?Rc>}wsB?QF(W}XKLjx*&Ivi;z?FaOXJ)Ouqjf)^ z1E%Nnp}2rkS{?gUiUUSm5V#EJfvT5K9n0G#wr65e)2exilaU&@ln6zxyir2Af~=Oy z>LAek&;!U$lkE=Ct*ygr7Q(uIv27R}!IKnc4^}Hb27p|c(|1@SinE(kwMEU^S*y+P zu!z9oaeU?GnUj4X1~jR?Xe+e837F=3>@eEVh2I!TRIi^Il9%(ci%HI3Mn5uMX&44l z!`sLSqln|*8c~Rh#tVbYK{tBIIB%Svbh^b+wZY;Sz_L_x+{Yk1hcmQGU(~XR6__97 zr*_D7XZropXz#wTqYHIfQsv%1w~vGe@sKJbYp>hJfNIhCxOfT$PWCFt4^{z?fQtfY zXd2Ddm=R#L{i+F`F^>?zU6Q>(Aa9F8EfSlL&#&aY%lXDW{5WmvQ$cPnb_v54U`k*dtY+J!IGcmkAedQp z7<7NADRLYO_!wS{jLn-^zBYKwLdo6#?&8kXI4p~$xj)6;Y<-{qp>Eg>I3oP7FJB*z zWY?K&qUAPxsn`Mdzyx) zBwVglBgBUc61`}e)2n}s4L>Wayt@u=eUUTQ`G)W?ejZ(cXe0aCE!sS+dpBNQZvZn z`yqIUy>;Tac(Kb}|9}tpI%-f`-Sr97nfj&zErNz}B@bS;6^}LtKEE zb6;pOXOd`gA9~_w-T-qhQ@W{gOuUI`&kvMJZemKj<1$CD82pT*2g2-CdO-rXo$yya zX(5kn7|GjcQZ}V}LC5m)I<`>-%*fVu+tIgp_{KLRYZ(^^#k8tPyUhyw@*mzpL-B5E zSY~wK69-{e_)89Y>DXpJ=?-=H_9U1BfqA1wna2Hm>2PzVtiIi;!Bo}^VFqeN%$yFT zR`(9<`?KgpG^c;74`gXd)iJG15+nNBGM^<9)dtB+wEju=2(BFdHkC@>!R8^#ka+z5 zQ4OFdTFKY7he&wyX)ZsE&JshGVf}e%J`L8^20sOWGr+ldiGA`N?eNd(A!*ie1T79| z1ikSiG;#w`IF;IXeK~}rC4NVFT&w4NUaQK;`QCV=l&B6k7%f&u1}(-LFFR>H=Ohgjw3rVNxK{E0J4nJ6n}P>Wr(1f+QCxtLagnud9bp_9G@CQ*_s!A4EE z2BtrDX(&84yA@42R3MX<8ZVFl=ih97cxA45VR9oaeI#@our3L+sc~C??V3CX=9YHawRRb zqE>f|9*~97N;Fj{j= z@teX^^~E(64^O&pyc*3c>?j;wJj#pgR_Q`;rc!Y2lx~=`C_YIsoMZ`$;?W@PCCE0Vw`s`5b;-&Rx(rX<5@--`D%}m<|0A+7f`WO(qj8G4_9r5Zh2V!WQZvZ0;N?l z)Iz$>l^2KGt-%S~@MJ1R6{i5V(5_tOm2f2ntkRRaP*8Rj1NyK60;jr5FV4Y8DkPcVpy;=C8e+Y1=pO7_E z)Ja;7UL6?TSfk_|(6AHI;Qqw7^L-lQm`!#WyDh{mo~^>$qFnDMpxHR?-E4RS9^Z2K z6tskDb-t&6aLeKsCD%J2xZp{RY815|!2mUy3ah5vqBPp=`n*0Ms*kB3(%g5-5_<&^ z9y&JA%rqocbGXfKqH_+MOLv^&ZBv|=ggr#uX04@*zJAj$TS|W?t2B%4{9Xzq05 zal=GMSQqG8dq{j^E`0F)ZSS!yHeUUWY)hGOqsul|+WR`0h(thQFb(x*=r1BuPUOQO z2~zRyMZ-x0?il4RqiU7(m6=ARfb3Qv#=kyuX-0CFai_rCc;x7;bojGbsJ_R_!hr2% z6-4=b*TG`gWz_j&^vc5GQdLMRSxdyY8u4nH)Bdc|7z~y-9>;VfRFiZDTg7|ZxJ06PwAGlM?l9H;gPe^KrGsK1&~_(-)b-$>^OSpEn<^>sbgN=4apcr~99m@NJq^)VO$x zl1SvV6KX%8Mdr~WZC%wtk7tjC~bz1z@ zP<~(B<2YvakaQv<(L_N5ZpRi^8^v@my58=QJ*W3<>i|_dN+A)) zxK5`t^u>%Cn<^v57etEiJlGvt$=PFP0WH<-NrvOGm5q;&!q@|0fyYcxR_)>So?(JqLM+FsH{Q-gan@{|JEbsWRQw~f6rv@tUnRv;9RV*9bR3a}Rc zc$)Dl?dV3(mTBz3)o)RsQ}FF&=i2p~%Rpfvm)DTd)q>_P=-)HZjl3If9DQyxb8LK3 zu>zCm`(dF{To59ekgnzK&w8mbdp_2|FIAyT?_A6_h)cQ3K2vAWO^5l=ChG2sdk@X2 z+^q1HjBI`PAg8iwtb51BD!qWBOJ{SkZ>hei$T3l%Y@U4o=f<_{z-t~)e^foV$p4z1 zquElRiFcAYs&MD^9cSA-0e@lcIi8qWBa|U_4wSWM~6nzpN$?N!Bylwtkmk&umxAN&yVZ;ov!uSFZ#|l z<;A_C{X>tZSi8$Y*RFcE1FBB=rOdzs`}|!m^AS+Km+xPE{>cB+fh%{MZ{^MkNWUg)61^^Y?eZBYa5(h8hO9w{V+FDsPQ_s~>3RBNIt~cbZ zp-vLi<6q_4%PgdzLh$FZ)>Z^hwQHXx-2MVGkN+UGuI$>_xAcB@h6Ae2%*wZe6F@k1 ziX(bcf}ToKn)&jGNofEHV8oNz3|!KL*wGR}BgXHd*-h!r#(PgrS#}v+{E@!Aomo;} zHM{Pn%iob?o*pFoxTxhL0~S05H7eN$=PUo)1;8J55g@tPsFR!$mN_&jHwT-CEs~EL z&XL$1vZP+fc>r+SFOJUqufoA$c`=i$NEUN4w1t9Vdzzq-3oat#uFBP2c=2AOsv2DIveSkeDobv{zWh$lTLL|?^%-Ngw&O48PrLv2D}xQr z2Kciv!696s4)HOMl+E!g4uJJvzL+uOY` zW810tN?e$PpaC{|#miCSFC46_rHUS+>`((YVxyK}#8t%mSb7Gdwsly382_Cem@&x5 zxW{>U&0~FQhj<%2*Ocr;wgW<}`ZtgdT_PYk>CCN5g5XB?@$F;z!N?M-%fqrNNke28 z%u`XTM%suHr2StE|QR`}^=X1=LkFvsdsC!c(X(DUx^Y_(O*gsU<(M@NBUy;r?;l3633)7Gc~4|n*P z^6Z%`QJl@@8fLWI%PFL4Y*7mS#QVj?JG2pa3^7}0@9fJ76`YM4{4U?sSU|Wj*@|sG zatrr#aDh?HUPhw`;3#HDyj%YHcivC%@;W6n#s`e^GLtZ{txZj{TNsvzt903rSx{BO%4f0!L}4qdzYkv`a?b4~28p zf<#QYeiw1_4l@pL0)dU51 ze88JdUkBOpp<0=62n0%GqjncuY{C%cD`pyCiSWIjJyY>NPFssDD#Z@Y()QU0FGMNN z$=dGQ=|{$Ej89h~>t%NZBK%cq=@Bhr5YUVW61|b3PwEI%JG97&xeoBjJ_eY&_)s;od7Tg4Z{Mf7k>PSlIKF=iA0^ow>YB zCBLD5sa+8PKzvNx1k}~rieZs~C#FBfry`D1xA#upI`!+j3?7a<-DOLVLBDA*ex`LlDO0>|9=|_~l_+7HTPubrl zz|mr@T78jTyRJ00Ve=l)wi{ruF3Sle7VGMy1QZbhlO#y>_|xpg(L5|GA>I~1A8_1w zcaslQXpLRa9NGCeSwF02?{&qNuy6jQ9Sq9+J}OwGAYEPy#fv5?>`955W+E*#XTO4v zE*18qdf?Vs(lL)$fbI&aE3AtshZb5n3bvxaoM_{Q7 zj=@X)7f07t)MafAA+H1^qADympH!WiGbEiN^S{33(vbh4uki`=1ycc5npdRcjKu1G zY-{PQx-`)CIP==?&Po3CMyvz^6PI!W5ijQ83A{Gj#w|a<)}wv`-9kA#qC}Tet&jBH z!3dSNk;uLbl`EJ(kiY{Lr>k!o_++dN$$Tu*`J!AtQvIGE9<}SXMEid=S^3J3vzNSf>=NuwiNwJ<{AhtZ^ z!~$bqHGcVQX~*Wu&q*_!DUI0gKLlGN^@i|UKeRXu87~FbK%zeZUu1ctSB=F0h7dkJ z$!vb5A8ke1sxWLjnJAFTDwFW%||2MTFxXUhJ@0$<(i zDd-wnK9LaLOzZ9)mr0;=$ByRlL~So>9_)2)60B40Q&EBNB#V8Js;`7(tZ|uOmVAmx zbRXOO=IZZlR%d=k+~McDXAD_GBSy8xCBEPS>S_16;ncGpGYh{#We-B^>EWq8rCx;y z7{locu1E=pT&1JCGCOna0{mxsLE>AHUuw3d}$9{oQ0 z&-&`}!XHXXjXxdEd#1|XehbS@;F*zJ9bpC6<(ud(ZQ0Ihc*V|PNrB_9p+tB zs?5263MRL{Ful61PA>(RFnG9WsYDAo>RcBTz{|ZaE$6*3JHWPYXOURaPsfcJFc(yy zs_h=QnZ1CaSor{KiM*vRclPlY7p0RQ6=QOvnlzi>)$wvzpPBt9)ypb0LO>hXQsrF) z1oISu!&p12;JBROmw?LSeNP=Y`vLS=zYKfGh|z9Js|_oADLe8o$}H&zT#dH#z+J$n zas!CI0FQk}3za>MNu&4o1-7Y4C0%gSMVjr}S-!*N!=rk@zu(hVwKI$7}&#Y1GUs+gQoH&>8!%W^sjH5BmIdm!o2G6e(bK>f)!=GK>7}7jZ zTRP0ai)jvRa7654*XY|qM6o_PpwsxuyX;=)j`i)z1CMCQHO`s;ZZ?q) zb$z#iZT>~)r?%k_W~cW5;k*t;*RwhWMM^aYe}!OB@2wk`hLpm!H;7H~gNr{BP*=3}NEjAmo$K z!fpj{GfwyZynFr!HTKJ#xBXO?dutegFwX9#bn3&@N=%524!9)A&bC3g=9)u*SHAR# zP7T}D@ZpBO_05Co#&x%X6!FKc*a(x(0#{~%v-ylvm-zVN&Z)gC%fD5cjb{@nZkKeb zak+| zOsh07iUY)EP3%*&8hXeu%jrnVooQ<3i(2a04D%;aOvC&c)jKQW4@!g%q(-zI* zn2rk{3on#!fO<2}W#|NVscC10rBpTlI&Mj_l@Wn?rRgcssxV+eKL_T^!tU{*kGDK% zVmn-Er1UOsHLg_IdOEncHeLebc;RDmW~gvmd3C?Fy{)qGTvHky93-FB?r&?t7VZ%K!{Y55ss+QN*GZbuLagA)Wng%0kqZKG< zYqk(=xz%US{_$jKv~+pAbW`NYy>yH;XbAL++M}@goI`T$hRw>=lI73u{Gd>8cmZJy zoF4sJYW%JRyps_tAVMEois9wmf0+%^?Cl1ZKQ*-D*f|@1g9hO;5aVBt!)^6bZ;*r+&qNU?&H%xQ~IH8ML<@E3zw%^6$K+BPv z9B2E3aK0B3jCYM_jrMs9myJN$|8=$YZ169=Uw?eF%c7w7uw7c_=>@_s7yr&#APFf&96TkW1S4tULYO$CT+_+i%s1JlZ;aX9`9(3cR zl7^B8QPf_`!RPQPj`zK?^S5NK90}f{ct`Qvat0fgOMis98D5dL-kEs3Fz=osT7dUt zh(!__Ibj}0Jhm~5S{C5^tmplC1_m;jYv3UAahDqrDU@NE90`Gq7oYmAIacb0Zpg}3 z)9uYbpDg!Lu!6$w=FKX$xbn2#TdF%$fWl_G&dH$;bQOf_Qzru($DKys6cVLdQyh0A z%Y1Fa(z|*WPpP4)9-u=f`J#pEj?woe=BF|}##{6)Mcvd%0(hnUrXGWsYT^GUcM2E27MR~x$fN=NH!H@dTdIn@Vxd zbv|z#@#E?H-#N~CCg}ZorWhXfk#!P3ec|)~$^dp}Uu%%$h0x7Ba71P1x5TUl7ep$> zv5^s~G+c6FE+E;UpBeqm*C^L@1(HK_W%lx+IoGS6q@+gFH!+m7kqMZE_5DyQYlq1F z7dg=8!)REI_*(UlvyzjIs9(89*|8D*pZ=?=qu=}!L2GO`f*H-N6cdLfIhZe0*m~sw z@La?now9b?sY46V@y3-Bjart7)IPOw^|aqVY5C!qQ7z|FNSwmanXuG_gakTmR99|Z z1j_#{r)JT4SIvAbj0U+l*&{WQUvRo83q?rLZ0VF0ka~1CtX+gybmAQr<_eC7U_=Q* zKDmYnYx7M-J~>oeqhwpO&Q%qVH}!wglO{>D8kvRS-J(|T2!a~p*a1xo02S>_ApWc^ z35)B-?o6ES;lVQ|WG62~EKCmq#Fc8|97eei7R6s=$s1CFcuC+unX5kW_npyo4~lnq z^Z9M>G3;i3%#b3FAwHbe$4C1XUQo33r#3c3Y=!7@Vt4m?tTP} z#4MCND!`jF4K0UE_u0R*9dX7=r&cj)?;;`0Yi%P~*T*#4B_;^J%uSUZ_+}lg`$Sup zERvu$$h3m4pdUT;`dHCWIw|}*Vq@YjO(qCJ-nSSHBA`f(2t*0lp~-LqjOiLmwrL;e zVQDnb9H0T+f!tl;!>RF22bwKCNUG6+769ss?+&9`!m(GBZfgI2_T`B`r*^V(!&syg z+em~UH3Q*aBIcxd$62_oGP4O)S|PCl?Bc4EB^dQ%{blns&Fbe1J_m0U>E`v36^3DJ zk&q~VPF&fj7ms1>SU%A98_PesBwy(qGv9YyLS&ZvBja4fUJT45NH{aWo2gs<}}~f z=_Z^=jUR(dYP8TFj@QS_F!5{=+TJ=tu`s#q*@oGI1Q2{EoioTV6>;{wZL?iREfrd|19AOGHF{c)4~wWT_W^+37wj$m ztObBRnV+8-d#^3F#)NfC_9LIFUFL6o<1=?$0>4pr)Z*M`s{kcn5LCP#FFa-vn>1u- zkrO-q>GRI?synzjJBe2uvO{BcEC4&N*k(8=&PfSO;(Ns^Ag8u0?CWSd-khQzA-(J= zJ4p;nZ*fbd`v{Of{(o(jf62MDGW#_!{*Vc)at3w?`X=Gm;+AiD8T6D#=lIW?ODvI0 zI~Vxj!+$?x7|~xF;ASK{9Tj$1Cw1Y4>5cezd|Gsd8a<|_@pN0;F2!|lwoT~%&}K>~ zTjHfHxx0DwvOS~Mq^2Y_55F^LPoN#1IXnx&YOIr+;58UsL)oF*N5H>q%6(=TJCViF zQhE17eGbp;Az)H0o5-d+EVnE;+teb{%3XnQxM=+(6T;2GTHD=fu=2L#OQ0a@qm1?m zYpbqu{lgNf1%%@!keH<~?FLpZ8?JhGB^Dg=>wT}AxIXbHpI|dPRbtp;LI$U;zXBpa z8OQH<&y51RTAhcU{JeXZTrq+YX^(tWN<)3aGW~KrT)lu@Ct}8jk{5mc_o|J{dYIp}bN`_UIp* zfV;4bDwj}-uEL5Ee1~HGgG?DtQTvm4s$mI9e}A>;TmA{G^sK27G%M$9Gtk(JY0Hz;~t@2TyH>fP8pk z%<4Q-XkmU5a=1{h@1DY@s(c2VUIJ~;{;G_Fq0%5=e%8%tSn>Qb4;2gRYL{V@& zx+W*J>BRxz!gj+G&%4f+&7$DP40F1%JhPifA`*#$;+-%ZSzjgh#FU4@Qa;ch{(e@q=TBBea4m7xYj z`Qhf%xd~Q&UEPHXs=F=dAf#=g@Kxyg%NLDdMC|NJ*Ns@E#~Xa2-|F5uWX<$ zuP$M9$a@mHT*Y`&J$og5@z6A1(L8Wh*g6HiUJSa3qTAgU&NVB%)kjLcx3jj@C-0g@ z@RMtnv=DY;8#66%61BA4Je1L@CUrFy@J?q@W> zAQs%0$L=`#kPX`D&(gZk?4OB<+_%P~_XSl7<6yxLrYIN2jx+!lbo?v4@=cVESP$@c z)_N8t?nZNvNea|>UFRm9bN;&JI63eh_?)W2#%ZFA-`V^ zxCOS@r1!RXj>fZo>bVAPxOQC)J4WSggD#g$5|$^F)00m21VT&2S#O+H7Dl>8`+#a8 zs9999+|NhiRbNs5uJSYiaLiAG4ruj4K#RI{avNxx%q*0~t@{&eu^- z=92#5Os`YwERK-`?P{L_1J+uty8hp}fpJ;!Jy(rwEot4_ds+P4v@x?e^5VZGZ!QgrgukYzL)gsSX z_~iKy-N07u@_54!sXm|0KN3{7-rvghx`wIUZJh^-9mWl~whb2}NfQxqN{Nr>hsT14=;BU^^iU+=j1BPShvVDqyNJu|pOs07;RSMSzx2&;68 zjL}pID+kK~qBx2_x(v{#30s$4+r`x4?LA}iS=@xruOTwhGq@3vQ*tJIyK3{mc7xW` z8YY;aRHID`W02zQAqLqLYNk1zk(mJfi*;&|tOGK)8b>s!{b5!u?IdPg;yxFiN~3>h zs9T<;S}`r!qj%O48nI?^3!##h%8o`mS7{g2U!kRM){}mfNB~z+_-7_w<%)lB$aM$} z1`sR4^$E)lac$W71?C<`HD|5W zD=~b`GUNskW}(-#URif|-q6H97q*1qE4GIaWx0_ui}2J%<%Eci!4nU^uA1 z8>A-@S5Bkax?W3}-mBAvHoZ;w`0X`~fB5 z{PR`_800G5hjs1R95se@1fn6xQoWKP3ewE=h3(wy3JQmVi1x!(mw7CfKdk2pkeWA9 zPrJIl^&e!Yfp79(_S_fX3mOMaBCtlpPBw0{KOacYErV0wyt<`@zIGx=PJEqQL%N90 z8fxSF>2XXB5KdNAQ7hWt26MQeW4TuE6V|OWYJ!$x$&3H*;Kt)XEs3t#+PK9^VubDE z7CD{##4bwk!{1fdBtMFa;lonD&G)j>YAjKMEQ|;-(!Xl;pU_{DTQP5LQoy4dr zgYUP|q?Z3Z9^@?_!s}~SlZ1XM!c5LBU?<5 zYs5s%h$OV_l4w|vPoSIF^!U&qLWe?a%1~U7LNx#6PVo0ayG1n(T#3c?r!BnJAYLH? zzDR0~VM?uoNjw)xxiL8Fm&y`V%X=%14OFT|JU|?vM+l%D0AI?{m|;3J1>%DO={+ia zsZy|9xjuN&vVgQjqWh`+&^hh(mj<-gsD)a~n$st>92WY)@dP&3a1U=BSn^Rq*=+3u zhT$G!W0#X5P%Emf8u8jE1robQnWFa%umXgMw2A!tmrYMhixBAqPM3&E$NKcIBr;5Z zSm87D_f#69YkA6t_Q?TA3UMqq8lD26T9Fzk(G;apWZaNJerYCXjF_%hlMTvcoy6RE zC1I`bynBKl!rXmQH;`X!iAMC7lg)u~)mO3MXudy9ix)4pD_-ncqD2_#{JXRit8N!d zc0Q8MLqk_Iu*$7{Px*oW$Jm?3C7rf?<3B{jh1Aj#E>SQk$|X@}6mkJ;a>+*9wQ*0) zn$%dzEfd7l7IVSUns8~VF{dfDEHz6YO;HPLtjwiEK`Bi$%^m1}I@fhS_kBPAH_xkH z`03>Q9p`Z#=dpZ`@9~G1m`>Fb%yyazP|^{}6iut2L5>}G<`t3Ynr4&Mhs#m2UFmIY zl5B^a0KnI^IA!LVqe)DbO{Xa=;I$Tbv(l4Vz%O6;48rflT$BLHah?GAUxCSXZailn zvjh^jT;B$&k%5agt!hrT9oZG89w_CIljFrAn7^eyqS!5Fbrj0wQg8F`uZV*=)D{%10Y$h_wkAk^Ecl#fC5W*m zXI|6DfEnR=0z`tBc(@&s#bQibN6-<=VBZs}M|v18b2{8Z|7%p^uJi^tgPG@0{7&P( zdti)L9R|SC5Ia4z_T*_x!d8v?;})xB*FZ%9L~SpN-9v!%v`n(Bw`xeQwWl4Ra{x8(7)&ek9*^y#?YH0dZfmDHu1!4@*ja6?O0T#p7Okngcmp6vT4sbjg(b{ zc!_lU$O3hHGyddeMbSx?e4mdYvvC29QH`I`%txtKiIKTa^H%pWkE~H+&LUvI)c!F8$^(;|7tDS z>+?g7iUp7`u5Lrk(KPkrHm^;eRkL}QEQ6f0qftUc_91i^c5Jc#)#=j9irX3DmkojO zFcQv~6j!cCtHWphT6hdQrD_28_>UT$0LzSh&S!V~gl(`9F2LY64^X6me)ft(;y>eN z2SAD9;m4RjoXg4w31M+q2ac2TroDd}2StI@m^Rr&Z0~9rZ1V)nC7ixd{Zm->bshJe zf!U|SFKrUv_>AYEFn5Q<&`!Go*X?%Qd^un&D+(`v>ieqrx{fYVbJM%wy72VOL3c~v z5q19`dd9;)edx0V^IoLadIEZ`L2T^>M#6?2^l8OkjCbmBWb~o;yeCXwuQ}qkz zv;6(Rk6kEPtScCSmIp&Y1!7H!eQHz)6>ca#T-6v{SzbJFthMf2ml2K5wc|;oG`WRM z!>?(az`JgAjF5xrC ztuy|wl1@y$9VpuC`a_GQz1=i)bFVb-@z*Jtlmtbr$gb63-YZDnK zbvym87U9^52h(A|@%n3ev9Rjic;6qT<&~Ww&C(s8F1l)ysQlxRVU9-G54}U`%C zkh1!@|C@nWR;4JkDh|E#_S`*z9^~4(KSudRGTa!|!KgpK7aRT2@|{65$6bJMU3kjT ziix_&(aBaSkTT4(Q=v z(Wl|U3pj2_7ez)EqEyd8zbJu1)aNT3u-V8??#H(02tN6Y?plQ@^s*ZzqOt8 zQey>~JDb-WyW$7gndmXH{m7O-oCign{Ac@%ADsePdlZaJJ2>ld*M0Q8dw*cu%k*_# zwoimITU>gJ!(+43xBP1(Z_kI69R13ldBwXh`{e`nl5bar&aU%ehBfSf!A$R_N$1R% zF90DD`lg{|J;87KJxic!Oo^SY7VXn5#79<3ZFm>1>-gx~T+00VCbKJe7r2LSEk57!{US>e+sBs78`y4OPi(6z`JBJvoQ?+{PAMpGHsodr%fOGOhB^`v84p(6*=L zoui^ajac{ydvy&s|n2BT`Ev`NS4xCsDphcY4peN);WL{@0-flsZY~Z^>IC;bZ(ucJrRbV6)jvvmdT;; zD}2zho2n6!o$_4MGx(j9HtI?4t!oLqyIHc+k5xJoj^Wm~xbJ42Ub9c4;i9n*=}oW< zV8`<^A}QcmWUWO$?4JcB1s3!@$)y6x{ql8yyrI< zS_>RWK}|~252C)GMF;LZSqKU==oJ!MIWTy!D#oBF5I&Kh{9O@02|{-uHE@ zmMhUyoww=L)YNkKJf6!>EJ>264*-8o+`3;Q`SWJMtee9(8=m$cKU^khRJW0OVNv4kGre`A zew%a+mlGIwPZLTT*yIik8FVt6(ev>!hG(yMZLl1OfHbuz8!#jGOVspylNLPO4#J|y z>S|0r#9giz-2ooI`xE_2$|w+E{FX!J!R`8!nOy)J(qu<|N@8m8BTWy3GL4@j@g z$-+l&LfzHV4qJVmAL_?ne4QqEnkf=(C?8gruiZj)r#Plm*U+C1CqZ|&cnRcWS=>@t z4%KDcD#zZjpdkN3yPz?+QK1^OMPL5yLqHGnyNipN8i zCy?lQc)4ztKoSThi{>-MP|M$`L6^|qP)LU0!kNzZ*ef%xE&b9zyxLkNkoj&8J$rYd z#IP&Bfncha95xd%#d-c60v*(ML5rhi7muUe%g~ZrsFxJ`)5r_=Tl{W;!f>GCaaw$O zI@hj*o{imEHjCZpAA>xB+y<@%P!| zE(|(VhfD^eW;qbzRx8zkqluCgh~MIQY*L(zS0ZD;-j6+CHkj&{n=lT;nzBzhR!o?X zNF9-dZ9M>tbh}g}Gee|C2S~k_fnwC1N z8F(1z5nhg)Ad`09T=)WF;JaL&oRIs7UicAO_il>lIAP*#i8vU4dJp(pW%u77i6-e> zUx$J>7j2=c_uLmXY^7?qcR$!@O}(XoCn`t=dAGg0A-NXm?2e8QGN?K*%jJ7IwwSuL zh|TPVo$?}+g$sS;7%0gSFp}caLk?zR!(Tf(WZOOuF!LrLejkUUp>x}G>cua$o$JJY z&pp4^?U}lTS^0A6-5&SQ?u7$~T`<`g$e0m19wVETAWJShoz9=Rh^<=+Ht4dj8j|f}RJmH7ov~>v>a~B@ct*ZuNRt?VY+_>gE`ruAp z4rFm*z_H(8i&`2PQR{pbW$mtNM~yB?v1BF07R)AeReuR*g|VI z%!r|Log$~Ul-RL*)?FReSOctR`OLeERy23@&*V;1V)M7rhWosSG;OKTl^gLNfD!&p z)i~4~u&0XS@p8a%U`U)0?oEJVEI;ox(A!E}^hUv=rh}%`UNg;-7x7^%v+sq%z5IAcE-(~nRt9x=rp8A2l z`;(-^(S%h@Nhsz!0ZZ>0J+sRM|t=8lrR)iq(`oA2!! zE;n)C=G@SxoH16IL@yz?I95KR^wwn`KZa4PCCOc|^SjtHL5Z&7}FsY%Lu z@*H{IVtz3h(gtSyHVM0+JP#y#k+r~klPG;g@3R@~RN%p%7A68h=bb`l*9S!m9UK42 z3oo1R8g%r=>0ka1J>{CznfejxUBX$nN%{-Q?EkFrDsk-D?U?(SU^}@E-ywPH?$G(H zgxL*Z*5D!4>tJ`v*IyJHME1lGX}GS-mtD`vV=v7WD!D6&wUDR=dCisqj3^M&a>i%@w|GSqXtMU=^#4yBi~ zxxTJbhrdJnCb82?CSb1{Skoj{^T{EQB)(6I{?A8bDYmvQt!BOQQI_8y`wnTBKjo%A zR;+fBBl<95bkG0(0>DOcB@2*_PG?g-9%!P>Z~KikE!zb?U`q8Y3Ooaq_spkM1b4J-h`DQ&>s<3!LS(tKR37=4^4@0b{9m;ZA zIS%`;6iW+b7tr9)iGnuMPC~_X<$j>4@>wVFp*z1rBVqq6f&FGRme@p)mI6-i*2H#ZA-mBK9cC~WI zUrV2sWNZNd>6-@3`o?;H9WvOm2tI!g-H_Nw}tlugovZnv7#;k>@eXMyW z=In-o!ujH*UC}6Dh)T8ZcawnxtYv1(M6}2VY#>_=B(dLh`W@Lau$Z&;tMq)y!m)o0 z(V`p)+~vu*W1l?~PS5mvuOe`jiuD89L}n}HYotRS7!eG&AlU#(@2{dv&l!J*(q1Vy zpnO`*tO^$r^b}QBfM&V2g9|9Eug{!LhjmwEs*GE$~)B~~IAN1$AFmJ8!U825J*!|%n`&DJ}pK|x+$rVKpE`kJGSh( z=3{t%v9AJY{p*&~r!t)lGqdo&zP|Hg^6}q?U+nh3TCo4;ZK;e=lgZKXsl29be^?+5;{9&U1UE45#3Oj~=StB000c+qIWn-!lu0-Hd zXJwo@GSId7ZaB`{x>dXBQm>Jr$ijS!tkNV%#${GtxoY#uQ1n+{SLICkOxNqC;!6_d4wJsNp1GD+gAQ!s**XE1sGsf)^Qmds9DB`FXg?<8xGQR{4cBN+w+0mLlT>h~gW?J?eQ^D?#zM zVJ*ob$N9F?KA3xacw0n%19k%x##^}q7%{!2R6b=l<*GBat*vFqyPx59NSA$Uvw_}b zo|WMa5OP<#@$Kq6|4=L3;=Nx)uuw-vmY8J7@2kD=Y7YkDoqi27D=#|)r&z71|JdWa zJ?Cl~8ZW!>JPR;FsxaAM9B9y&DjILVRZtSv`Mwm~#}sgBZ8(yNw@citpx-V0rF^&( zuek1t_@JH2>Yiy(-EFGUe?$b}piM(t){LcPHmytpc z(+6qZrbZZeTFn}(dhZtB)d6I&hg)coF7*kB6J)lEpn5_&$0ssdhO~{lp<#im!hON< z?~2Y7Ot-GA_h2MqH-7xnI0G}~AcjQNeu@W6AQvN8BLZ`@IaCA!Z4vK>hrf%B8P09r zV6iyy)5lf>uDJY51TXxo*xs>FoZv_+`}!sewB~JlT71*n#Jwp3Gb4uK$Kglz;}gVE zciTnqfx&&ImOq8QFs(J7oSAnBB7Fzh|$jD++nVL2MrPSPvy|2Wns@8Z{g_QUJo%_D=rpYy{Tf~Q5R#}RMB`^# zsbF?Jiom-US~=oW;c5?}dG&8CR4~K2mC&e-=W2s}Jf1TIn1w=9Sf|S%vjI%nkzRPx zv<_q_y9fB;S=HEyidOUc>DjzO=QHYaVrJ$+T}5U=9#zUFCbjs1upZ9cTcRZWfy2k! zh?4}ENSR^5TpC%5`4(3L{hcf^98HpEPio7i#mRbGq%_=$w$D3HC6_X5*olHpf<-|I zq!HyxbN}dvlHN^NXeZQ$hL7N(7CKS+oppAo1|1eUl$fHzkGl~tNk zaTWMA2erpJbe`E|(q{ye&fW%}#<BV(mssNm~W|aAIQoA4a48llViCQ|T6U^7V z8R@ztk^qwf%MlO?x>4j&KsNO-5ufsoaF;&EhG#kmQ3#w2UUJSUqN0T7DWe0E10W%0 zQXI&?<-()qD+m<3ciQ;U#{ntNVF353y>=s6ePt#bWqsPSFlNGaXN0Tgju;*HZMJLo zQiv2gd>BIP9tFUK6r!)@P?LIi^=~?Ui?tx7u1OWb^VIHo?JRemx)Ik|fuq%7;OtBt zj{wQa3(^VMiq;h(i+FFB6Zovo4=|sZzQv_StIC8aY>6WkBd>t79lwdmqh9LBzc*a+ z#;YN4dA?d`^Z3b|mob+J7C1-P81PyvOJ`0d=LSFXBQ3ZS)QkB^XAkz6P#3J|jJ;}_ z+Wj=`ckV%Prd#;7^Cy(J(bU~_vPpVv&XuL+Oi<=d4U*~6fPEF#b__RO7s^&a{od;E zwlIB{OFH|i=gtcDWJ4?0lnxB2U_`5e68h^If;tlEXeahY^|hyEl669p*89Vc^m_yy zw~z6x;TmP2DecCs~Y0;|^ObvH*g)e|r|W zmpSKa2L{wR*BW@KV!)<3@Aea?| z37=KWho@aCJZ9Fb05(&||JIQ=DSB3GXZf788~u>u?*d%Wd-hcGhn(Num%x+T29TbdLQ_>KMN#x$jF~<3P8n!U%Zez60!L2u=+@%Ht7tv_N~78ja9p7zB5~x(_+TMG z#C^C^|M8dI7e)nljW~Dmv<{i z>LOIy;Y&8T$1YrvPd)Y> zI{qC}?vv!c{qvh&whjbFWT>(KpZ@s{xm3|OyQa&od2^!{3-ipRzFs0=cCeAx(oDGL|#$bA0B>J-o2QRM#Z z+*Vi;;oNAN#Q!8PrG=&43a5?n?uYsXlMTKedL*mNltCZ;%aQ4i4eTBtcQ+M->BF>!<5`$%M$V*iy->^uUt%(O zI)~_vbeOxMm1`~dLTaDGq`kwbukji1ocp9a^0Bl;%A8hniu|^stz$!Y$?3ShwCU(< zX6+B6DRaU#cpmXF+lXso$#9pd;Ot9W35+2A(}%l*-BoatEcr= zuKnw_lb|@-jMkV7uM)CNO}ffV7@F}@+IWfNUx$u;Q{7o$AM`?C09IF0z<#_DP&Y)= z@M^UFVc?1a9=7iOpSBt>k_33(L|=Awe;{rHDiUXqI&QD^F1wnHK!0}9#L?TQ_VRdx z3~fwg%}>8|t4vNcEb=#;$VcP=t{^pY^9 z3`(mf90`%4Esm+4d&T|*SyJEU3!BVUaBZ1kKW}A;59Hx-fVMRPc2=OSrn!;}>L-gS zbFWyzyiv=ZH@~6XM|M(Yw3~1z{mi~uc=7sXEZ27v{l>#uw zk;|~B_PJBKXBN(`hnbwQDd0uGLT$-D$9K9UzvF_cDW0R3!}-yu6aZL({oUb1xb{n@eZbx)i$Z9#FLFS+I-w}7j! zqRO&uNitrvi-dN{%XZp8&dbpR4$K6cB>JeIQbJvXw(7ZEMgi8j)>;B0$6eId1}`+% zw-S+B_mnP;@sNXQLJ$!drct%ibCmV6jh$5eT{+h+uC=yn<6wNJm^m>$Tc+%vLAAQo zi%r(DE#p;ROz#WPrg|ii$<>6)7q1JW!0Q}x<8%flo8#VTfyrpazTZjjMx$J^AvB;- zhjDvEuFSOj*D^_=s8v0CrMp+W-h>w>Pcu0J)yn0rzZkklYpVXH4BCdpvg zP|^?^vQtXaMC7rTP7nu%lHv{91Td;m*h8u;ClM`>qt&Ae$v6pUUHlpH23ef;yyV4b zd;!k@CO);e0jC$*kfS9|H0u#9Bw-9-p@R!q?=|$rP3)M}LII8l#k&+t6+hSfEK3)B zd8T1I@0`+bVrnT1$wk0jFq&<$RmlafiJt?P8GhYmCAVn0{^|3+eMsH`*$KWJp*Y*BhR>E|4MNl1Vzg?v<@7{h4WO z$!MZ;6@zS%UmzS4>uE0ukbh&BfiP!{@=Uz|@x0ifb{H2;a(0gyq>EoPOEN+Omz&Z? ze(6LoSEU|w4`Yt=T6Mrnv_Z>qLW*b^ zU-{;hJ-4nmA$HxpC!%#1qfuH6lw$(aL)l2$W(y)$<=Ws@w9v#8mklw>V*9t;4$B&a zwUSAKcHomPa>MU)1RSFiF8O&>*dm4vwE;4lzio$EexuUvJj&^DQtP3hN=P~^GAT_W z5Nuvw`~^U99;I&k>(;Io37r>-iSj?D(AXL#k*4wTe!3q3@*gkrgU{~HxENW5PoGPJ zx$pMIS0h7daPu?0^z{|ss5TYrp3xiRULP^{ptAuRO13Vuirt!Ib)o&b{foh60WRG8 z9O$9dWQVkyk{$+p3l_t2$XJ9XylmPW9{2v3(k3KSTCE3&(MB>KbaVP6hH<-CsUM&?N@v%_HaF4bm5Vv z*W;X`nG;dYrgh||f64xQ;FhKB90-z=`h6iCPP*XH%lY*K_?Hni|_m3Ay5znb~ zYc0zat4(IFnFdA+cOo$I*@SuT3j#^R$V9)I-_}s{Z~(}TBh^-z*&(->J}z93Hr%9Pe#OARalI)K@l3|U;r~^KH_!rYrfMm z42s?~s@HJktZr7=En}0?xYeFIfmmCMxc(K*Jb0H;;%Yf)ysEs?7F1k*{h`r?a+-54 ztZ|>Ez|k1unV}>bejdtQTXT0HVIg+lHcJ*R9^_pbKI6<5-~lt%;JpJ=?eX=WlYYGC zSxTP$q)cXoI=Jm$NNbmF5Y|q=HY{Esn^5C?5w81;KIXqz-xzB9DOsu9F-HOoKZ(vX zdhrboe-qk6YoTa9^+byR_;eG@7ZU}5ecy5U_ zv)`+^Yk*{N7|^DjRPpWA^!&EITFrL$ggwd=W}T{o<5J3qMs14C;JGduxl7FFQlaV< zHDPxB?`Ng&h65xyz7l&83zXp}*Tyy>>I6Y?V{2t;rC%T>m$+Gy=VLw)I`&G%|2uL; zt+_)T<6YZePO>aRU843ED()bRY>mFk0&R1w!0eAS*bHXMH3_Kp2wr9zbLsDjI*X?rGc86epBA-`iY5K~6FA?3sHHE&J3A$B5~Qw&2H+GkqD7X^yc? zT}JC<5njy@yvx8u|Co!g_Fgz^lIfVENe#QP;>O*?1x9)HOJf`fMt==yLhrfuIu$GO z^IGF*9(p5k+|^}dhU&C!XZtlOs+C^SEYD8Mz)xxFW+QdX!IDL#??GnM?rQF%{#dd_ zm6&;{%{)!QGs|+W+VUgH8;V_5_UU*}GMY&}-+*gX_moPPJ>>$6wb1a&ar74%7< zTBiQg(_+qfAV683ZvzVCaFcj10*>v#g|7tGvQE5(ed8esQ$Ph4Ysd)=pZ8LSfAr7E z!mQGi>v^jWKLSk@zzSGNkW%yNQIZHnnfP-~tOw!qGk>1zDi0l-0)M4?i~8yypE!}L zI}~Z=ZIfwxsRbs`Ok;%(_jP|YNG}1sl(3S^trm=j-fbb;{oC_Uu)?j$z?&(Zq^z}v z<`B~o(dH3-{z?~a=4Q8obo!+8*$w@S+d@DU3!STeamwJ6QXv+_MbC#K(mY(N1SAAN5W4pHj5?EJXdg0bB zW{=qjWU`FyAb`ViJuJNd(OX6tt2^)WET}9mNKU=f-XjtUFbtl(+ z)|OAmVSe;B(F-_u6)T5G`2*^Cf>T{0l1A!5no&wCdQVF-8@ZY#fA6Ac-Q z=?x^YR^OC7?Gm8M;zX=^PeE;ZMxXiH_;L?cNSi;d!PSn#m&?xmrGh@!hSvPcOHLh z$F_TmeDw}o=D;xqr_Ms%AIQFXUX+BRrqA7l_-GeLqEqyU`X)y6#%+~j*9f?D@sLwQ z!a9Eo-87z_QJ98>wZ2-uSE41_4>Ltv-S|~ZpSF{&x)A|Y?tKRDFU1*XYVB{)9%NH+ zhx&@2Wj!|{E>LGIk^4H#0`znw@nNtPZ2ks0CIY>Xq;c+F%Wqe>*Mx_bNv7##sI^3s zDSk=aQx&N{glk)U+47s%pWtE_ri;v4D1!b}G)y6OJ^j6CMwy%&!a5yJMv2`8>pV^M zE&VXpkWRUmH?jhCZhEO!wngwxh@uXKcTT{Q6I!dkK04Lfb|1aSFbDDoiQtJ z)~+n^KDHwkK8!0UeMB7v@2)vWMgS*V;ax;RM`1VtQ3*6nx2P7zGg>pNis8FwBP+xo zjL7kN0>ONkb3WDT`d2G(mJQ}3kt)^&XFD@A$3xQI(=k(4KaJYA|N_FUH494#Tt zUfQ)7bqRE{AB{Bd)m?eI_i;vytoop4Lc+|EL)FK?iGTLt@k(a{Bw)a{x;>i|FGB8} zg!MQ5%DHj_OaWxc-xTgTBOpn0XBnD0gXauew07Imt1kD2bJ4G`fqc+6{-|&J+A=*& z-B8dz!NYsA|J-jFnlv^znye~677@R5{j5N+ zb(%qJXcP9Xz8w3WHyp2_QTy9)h1p+ov3;a~@}JC(56)R?UR24#BROA81b9{6??**2hp|7rPt2xHpgeZUqL| zlw?H7K2`MyY2C*3pXu~ho(|1}N48ub?Ye0GBAWD~<3qvKhJ9;m3mz1{9Zl@XRg+zr z2oJSyIe33_V)pjyofy{?>kX9=S>;)v8Y{W|bBIydzpJs{>$!`645;)DDC_=c`I14o zm$BBgp^Rog2}I7jj#^_A{t1@ndIG zJTKcWoHz}VxF`4vNw4%Z<~>5Ei9^^zTbp280EsCK%2nw(D(?@V=RtxrXJBewN`OZ0 zEdU7UrMA+V^@g8bXu+-;(NzUWKsh$}nCkH62uTrwvT*q;wgX+5N}0?Z1%N10>uhHf zAq(YvPYOfrp_7ykN{^){wemGaLzEY)F~M69q=btuRa z;1%itz=PacslWs;9gao}vOYHmds|fo{Bx2Mm~2IyYQk5av{3)if3fp20F&^rD&0yj zI7jom-~*C1Z9nAm9eNiBLT51@pj8lSR6VWBUt`N~PP7{02TkYBKgr4n@l8FLyoqe3 zjDF6Ni-A&UbOTrorzkDOq*AewPEf6hVkzXnT~B-KH-F~#>nl&a&s*e~79Qi_%s zxH)o7a%d(dnee>5rDJYU06jrt&2IuB#1Hx^T&MppbV)`hANSD zMF3gFxC2b#^Q(&sb^~8mI*ng>sURwgrrg7>3;C<>QSli4`QQTtk|{BX{BgtbI@teS zr;IYBLHj@JRH~Rd6v+^)&njDCuPkbb&+`Ogtwr>t{>Wvfb0C4`JBtd{{SnHv90-y# z1~4a7RSX9Mj^Mb9{snyL zt~730l{!Ozrqm8#%t#c4G0^MZV2P`Rxj@l@mS)rgEhY0sAPPjRQuVO)=O0q;&HBFd zQ<(Et$IGT@ticnqoHBaBh2}5`cFZl}e`r~*3g`cCE&DG8nW@rW-pX^b1<(+FS{`dC zd;U)G`z?T||HwCyHML1ihXWD*qawyC-Mjp`u;t^8{;%WZtC%ZU&D$ss55TcVe$*== z#VI}2DxwU>b^B2gJ%Uh|LIq8+Kp_9)+5&;N{97Qk%FN}1F#(XS)u}!FZ#!5~FQJZT zpc_*TJnVu^5bWg)S(4G#3%F+g=fyWxP)h)k@LJI-V8Z^nw&9eawUvFOQ(rPe?+wJU z29fhs_F5>{Y?KL-oU*t&T%sB3{06xQvk&}qWx zUe-LRZ}wFX>sht3ke0v%=&;ad>0GD>AK0NeVq+{gnvr+01{f zAurmpdIT{`|=HQGg$YoK+&b@ir{sb4gxI3(=|s|Lx}&H z?sJCTnH&IK+PM8-2D#kSPjlYaZjJW^8d8kVN=f$Wq3Rfl2 z_h0=msqaFuDXgV!iXDHaSX@i&9Nl)6-OT}K>w%e_$H@p6~%#1zYX z)ahJ;718G5KE#HkJsDBvXP=fe*}<;IZ1S?c?&UGi{Y~t$Ejpocfb~fscAP!+m-t=p z-YRu-swWMuVM(9kR6F~=f$kh%=BApt1~?GE{HeIQw4{32DF2a8Lc|l>d(fi^)na%5 z(ehyp>WB6lD=LbA&$axkG2|5JFKn$#KH%X_s#6aD;JVu?4Q{0{1r0BKT z*)%5yCU1OGd*>5(^DCJW$82+Ti0DO#_=PN+Q#J5EU5sM%RSSAe&`58Kcw??R;%FMj zXXBo_p<6A!U;LG^@?)+K`HTwkq2cSW-1Y-n`vrLY4{P*m>Pa6{LyKu|9irbpfPQ`^MM8fAh zj0hcoB>(`If=UNbd-7{)))6 z|45cZ!~E3Kxn3{qu``Pc7xFXRVhl6k*JQ_WGM>gLJ->^PhX(rqn2QJ+gPv{3fuT(| zV+_1TVPZWa+D7gVJOesMKh?WGiICn`4#h>8UVLe_e50pV-XoeQ2SkyRbWWleFfftd zQ=Ne~q}y5XpOsBF`QA>2?9v1VKE|anGnpzM^U6O9{Qi z*RJGpA5{+pigqt0Q`&u>gq=9%>jKcGZ?@UYvmBS>4#$^1YQki+*f*JUY8|bek=dGL zGDR^mv-)AijeItQFYz-aoBJ%+DHjnPC0e+M0yYeatQNGb^XCxhUGwKQ9#N(?rk>=& zxt<+eW}oeuwHEnlt=0^OoY&{U|FTNOPD+b-*=pJVHkd@RbYv%uddsh&mdaFLroX9b z^j=&-dNA8&Ea31JHC3|V%&pOw-B#duod*<)Tn@8Nji{@M#;+lZQ@6g3wT8oU8|sSB zfJt5vh6ty^M?iFlX8Bn89bIw4L}J*N4{qn_*QZZaw?%OM zO|}=zH9;)-!a}OLK;9Qe5^-`@72fa{Y34AEc7PLMtP8)?0ncX-EZ>lvFMX#l` zqW8xYZ`N2F8IjTAXQ}67=5`2L#ebI8NrkU$=?5v>kQ=vo7<%z@Dxh1jTC)Q)c~?7V z(te=HJ(zXJ?PO}>PrR80vF60(HrcRy3sEbqHLGQdjQ2bExMAh5UROS9@0~UA6cdes zOTyKHvrXc>cJEd30aHcwKhUgDH(5G!(k>e)?-sd6)|OUMtU&hXu#bZd=mQt5+rz7N z&P?FlYSHwAlbbXx4kJ4iJ@tZUv? zA8fNQnub(opgLZ+A2t2OzTmoXLWiQwQZl5PnP|)) zDs^llBO^(cEHSq8efs=8ZH@cPT-DSHoRL4ad+^GzgF8{zV>912NfHS~uO$MPL|%Pv2D zOan6Wiiy`B>fb+)`pK*FqhBZ5z#zlhIZgQ}K`uj+Vx#@rr(Lb~*AFEUUknp-(=0zuVnmjqGx&h_TOTOfe_qj?{5X$ zcs-0(8_$455n@M%_czh!#|!goPOIz5Bme4KpKmy7>Jl|vQ?6NR78&)xK?3e+~qv+`^dQO_gBKYruc>9CpvyPkLkE(-7nxw|HvBjzzv}*RZdznnan3dY-)p+c- zSqt|U_JZ2B5pGQWAA6ECd)A% zUDTSmqIedzFfccHWNhDWmeSK2b6czu-`KX?Ara*Hqq}q$o0Y$=@_p85`R5l}X_q$^ zO!GC>$_x?1UcF|H#H;zqi$qW+fa5Ici6Vt!I_vB+R78`yCw?{oG%KnJ=uJH107z0N|uE$4_L(?VnAl?YDP7 zhnvDz5`}P-mbWOG^Se>kLtxdohF_kT9;jY5?mB#f-8C66Y^zGM5Gae3ls}-!o}p-% zh@!Ud>$+@tZhGlEIM{z(t8UQ7of<=ORK9NcY@g;hyvUqVF8b@wlEQ_>OCw?FuIa9{ zd-Ff;Xdsy_qNe3&dJLn9U~8>@-kNSDSN`+)PNQG=kC&D+4oz3xzkez`SXQtya1h3e z8I?_{`@iaf=-%mm68ZBfe$T?YYmu?fx24l6q-8c$!TBKMF?sd!{P@Af?j! z%Wo0u2@}5pPMWy6@%?VgAO%#^fS={3QYm}X4UndH5Oy;v$2h_2-|C_d}(W4@x|uuX)=smA_qiI~d|!hli4sB|=b$}J$EAUathR&ROkenGu-v}Qzu zUb^tplL&s**yTSS45X|-Nd;Qm)Q-?sxtzOE2Jc{VnR8W%b4@=%&X={gXuXuP{V$E; z{>a`i-pMlTxDfC6B}5#c>J!US*#|u_O6;VTp0|O$H|@H!E#1v;^)Zkh-Mr?^Cx!PN z=}h9XM?IU5KtNXR?H>?S=R+78n&mHy%lBAgj6J(A81SN%SSS?<0qrYi-=Z8hRdWKC z0H8k}ZkrUlUR837cG0G&5wcm1SMn*4wPT@qoGGBrhxO$CUfW<7$+aUP#!%ivxjCu= z)XN;Q9iu%kFHJ!!S#?sdoh=dyl|A5})EmMfv+EiXt7{-&8JD@(ca4|vAM|!;YQ5=Z zJlQU9c8stEX;z<^DKNS(peKspCL23}=l?syuzp7Mf5j+hKH__*!PG^U?JJ|(dzpc~ zGx&lPkG4KKTVaJ^6j#7GkYP%kHF|#ml+|f(na3|&7+nix)pkynQ}){;*asexy}MaV z4M>_S^@D&&CFMWp#~&%Fc(#Wz5u&@rZfc0xp2tZNARMLkVH;a5%@IRSN`=d*k$9h- zjqznynzGC1k9GQkz9=&tkO$BHldMP*!XxcS1df5T&tPo$BivXm0TqIEdXt)4D@GY; z=6AIn@b=yv9c*+LJ=vPy>YmI@9!zD$mF5EA&{2zsuikmEwuA$JOhH_^l0a7|mKio{dEDn~ zO?)$P-@0{KJ1z6ZtELlFy9ONO_$U&IKYRbezW_R)UqN-LWw+)ZPBC(ec$)vY7ein} zM8(cw_VT*>#TN#}r8=(|19ZL1KdE)<2}M5GgkkHFiPfR;*XM;2ce{QkI4fpaJ6PL} zk%f>ux{VX$TH_nJ3&Y~nF2vn2Vql$Sv%${kJrW^C7K1hM3vhR(RWBKy$sT>EvSThs z2Io;+wz#Sukp$*8{`Go0|5n}lliFvg=38&9R(`fWZSaVR&3dhYS8u9$KraT66ZpzS z0{f?y5l(T=8_mqhK(L*n5pdnHBcH5G#=%fRD{9V+cVQM}aC8uB7E(VnR;l+HYSwF*f^SythV_Qsmc+>5$QkP$;qU zjL!Y!*T%F@>;FMFo~5w}k;E|^#V5TlG`ST_4R(2rlw(`|gSy}UIS(*^HJj#QdbkYz zyr|2q0UtxR^@b3898%JqX@_YUW&5K&Ar4N?gh)j9ld>4D6C8s&eknIfcDA&bvLmOg zf{+92^yxst&M-GUIW_N+d~^hkvTw$ZaOEha-rN3w^AJWi{BZLUJ}OP_xC3XS;ycco z%dMyL#ugXW`2n~!q-mzu-2#V3ry8blDBcsH{!AQjyz{Iv^=J2SS`! z^5Unn-XGLVOA&dJNue0Np8=)~x-S$Ju9KAG4{jDwL`1!$N9GmVQtUWsv#B^ESCaX^ zR~paqWwu+>zRMyBEE(Oejbp3NI@#%o8@&cXtQL^aO3d?vaJGKM2XjRDSc*qvjsuf~ zkVjRwwGvi8T*z!PuO1wMULx44ko-GV3~qX%0odg0zJ{@XV6V}tzce#O`0#MRaPuR^ z-f4#kU1A6&&l)m;88GiZXsgy|w5@Ny-(-W4nt@;FNod6M7!f13qX7H%-KaD2ksAUF zl>3EZCr8pt$eCb7c4&Og%@adWa}5k$De^cL(x{7bne~uy97jgSND&Yw7Byp+D}*R6 zQD>ZHxHI;G#LU;IB(9zi!B+F=I-C)I;WIKc(wa=d=MF$`e*nvjbx$r%E@O?j#JHe? zxD0-3O~2HWIoMq#OqF6{bRj){Ow29>hqF8*B!W8 zY*)LY5+h@r3j&V}&|~ls7QozrJ13U2Rd%o}`$5!$(vDf*Ul!Mmdpam1070Qj;RRTe z1_`!x&!Rt)^Xrd=3rnELmQELGpO)Tl+*7wIkm=_3K;cnU9wutQsf!b1i1xsvEF~d9 z9xE5tJ_6oCsZ6HizhE|)$>3#KJ8+O#;kZz20sW>sE7Q5P1r$A+Q1|#}>drgpUG)du zPrH+Vk?!DiT7d#_ zT&qT>0p0>vV6}=;KE@B5Smwp41=qtuBD{)Wa!bU#mG9VX?1eV8nmE{q2FAU3GCJ7E zO%|l$?VWTUcV0e{#8~efW_yBB%71FTZc|Z=S*nSjA}8dbZK}JlZY&u&X#AB8DQygkg47KRu)fZPwZheX%$8R;#KZb%|I$BHX z8624HJ2}hKm7~+(I`YYWz}b-&*~5fH#A@Hlz}*8+!xq+$a)Yi8)l&Xduy~` z*tTnqsJJ~fyf*aa)wi!oCwl-881{ho^>|CmPg*tylIQUp3i(iA2zhGXC(K+JoT7K# zCp4zI(0@F`o2!q~vhg%2Vnsn3+P=6)XZx%iSt!F>o}u!p%JUp<&_Y3%TpA5gcqfxZf8RFi>?1k(YEa*BTw3qC1LH$Yk~KS?(fz%z@3LR z29Yr`(#YtKL5`d+*hgKj(ARoU2mQc)arg2pFaCVXdv2T@w)SGs)*vYvnC)UdT;Ek3 z;!$!m=i*2HGhnEkacD=O?%ufGp*&7v?wkVz{3~A=UX!Ne=Js&f`)FbR-o6YDlfUaoYD+PGJaQ#yTk z7mIG+2;F^zy8GRiU*+mL-3q`i!g>#$vQi78qw+(Ju8(MWcc#XI6fKRu9}DazX)hDj zqlN|$F_;&%@w@eKO2M;eReUMT*1w%TuuUdM7Fb*mhp$}>F_8=vBB!?| zh|SX{grT7(`lpzOB*JVDj$;5xmzgINO4@1Us>Pw z4!6ebpSs`E{O65+VS305O*|2~BHMw6P__X@^`7MDK3SYA2UMF5w*~;)EWRD;@t+86 zzwZVMkYB=t<81dH>cdz0xS;GpEeJaMkzWfZK+c_3mD`nX3j^O)!Q%Tw0W|6(VZux) zos)MfD2IKqXQS4nRlya0w8Dkiuf_+Hmp~IS1DvCR9RDRr#!N7)E%|2`B=NcVE^coY zeg1j--FM@&ultXu(GE`et=$K*=-O5!l}p?!0|(KOqAFi=8%)j5XEu~xmFbBf-xQS2 z!bJDSwb`9zquX=q;M^bUot%{#jUCmgWcvZtJNV_1sr9v#^{0X_ZH}wGBgnkmpLU+d zS3%0Y_-{Y$XUyjL_ko`Q1IfDb8|-_DjUTaJYfmocKBW4f?q;Y?TVf{j9(}qG6ljtA zr}g@YiP7a;$4a=K_1PM-=g8C;QaK}*vUAchyN~!&$wP3cfQ_$lXu{zHfGWk}-%}M| zy`bRwPl%j`Bd=i>kQ5=Ja;2;9nAc1Gr=A{=QwQ7odx)pAZ-2-Y&B2;V4aXNP(9@qB z=M`u6Jp^Ge&8us^r+L5#t|~AuWJNkmH#|`2>~Bp~!}O{%UK_p?AQQm^ynV^Ir{H$b z%js$G2$#&9wAy_)UTobs!7cV{j}ryksIK%uEZp?xcP{m7Eo&dgLUgY0hY`R--KHL5s8r_S8`A+UBL?4#N`L@D71;bNCi>3?lmX@}ym1#Y6wT^u8*4 zILEAhv)>U?2r%k9^RaMKcMC7hzpNwTDw2-`aa_rF$womC1>npSoVXQ%3%6U$`*#?qaP3pCZx%65KaeZsS%P z!!^QZL87+j1&RnD-4}?M&d{7PWU-1IVlgvOufX&=##@D5Ac?*fR~UFC2QJm#bDZv} zycr=hkB7(o%o<(WID3C|?DFC$X}8>IXPs@6%Hv(t@LE^ltDD91z=`hg^K%4NOiF0v z|KFPctG|p-p0G88ntJi4mOg)X4YvWXiVg(PiMdV8;7;FHtv+iXe zJ*eI^GOdT(GIDG_gxGFtijNlt*r(mNmG>UZCkr=q&tpWVfktau{9?EeQhIvj$x6-} z_V4gjw}k3>e#g1I0`pR=+fx}`DU*4N2KXs(btv3;;rY<}WfWe?XGV#t1t0y6-?E@l zS8cwOtG|8fd zgEtzL*_o$|wGXzN_(N+c7>a`c0ee@|Db;C-BZ`I!4Pg>IykIw|)Dsk<8+~EAN4Y-7 z`>pCQFC4t&ID7Z%*4ep895eB=FTMa9rXlyw&Vx2`U@L-EpUQH9-QKa z=hktE2xg+_E%2dINyEWCHZ}xUX7G%kxYhWK+cgN1CUzMVq2INbbf%iSJ4Due@qu$v zJ5?NV5*hT82|hU2r<~vkVMTOR!nZ4h>^=f2Ny=6=y!2VCYu#X(_Yo@)e~*{WE9e-Z z2l1Ym^E{zJr`uXQep<3^6VcJcr@`Yq^6ML&We9Mk?xDMqa@* zi*@vGaFIj;1jpas!~L9Gi2`D&yf(3Flxus;7e2#nTbJs;3#}cP-lt9Z7}KrU{AT+1 z|F428M>2yMEZlbt7`1GuUfV;#182X>!Kk4Niix+&?jr#4)c~U*@|}`a2wqE`S*J}j z?CR+7)=~$88~=D!JeLjU>b`@EkZ?#_ip#Oz$E2XCzU4vdPXPxh1YQ|`4qZBvG4+As ziEVZEGsjJrf-`b-iDR>araF?mj}B+L1)*x6jasdC7IIYzB6O?iPeJt7R%rjz?E4RG&z=ojI#9mZa?LCxV$L z{OaD!PEqnV1nf2?{ysi!=_KD=8b~iQCz@A^F=O%Ai{_><$Nabl%##1*=5P83MyQwS6(SN!nRwyYV*6Y zX1D>#)SwYxLpp^)u)@(8nfqDxX$t_*A?Meh#mPZpg9kLF@s4F{RgS9K%n+K7jq;*` zwt*ISVPf4Y%W>Er(%zr`xzlOO^q0~VUK?`rU;MD8i15=Uyi1u8`9{VBN*adFHnot z(vs8SO>s8_>92jqwq~uAp8A5s*D9WWRw=n%azz2amQz1@35f&>ReD~X+JGgfn9^<0 z4h^^;eob39ehV-W`fpFUC0FC|<}+i*4Krfn+asAUVyK%ZSXhPi$hLnlB_dcGo1iBo=?8zj3y3jM1yU+ISZj90Pz+1MOO7GwR+b5+k2Mx z&huB%qZemXt)zD}gh+!&HRfH+TU75*lcN!&4}TuGANG4%SXYJOZ(H8X%%+Sm2MY+C zCtT*;mpdohRr;N5adnSQKco3iP~~Wt0=>V|*>lg0atE|F>dI9;Yg>D_@0ee+-xUna z&_FWb?Q`~b=?-jZRzx{Hm`;zHlzQeB5CD<7kw30*pNMPE{ep@_2q>MZ&M+r>@tW zb3SnKg?#ceNugo+!GO3&(n&btl66n#J0FnOGyazu*k6`3hFHLcRy$KVJ>}Y_{a%x? zTe>=_nh{_~K3wv?HQRSCD|9l#Gm&L~Psano2e-n++g{}3g5@6w--u1FHIQ6J{V7hi_^M#eW+=or zR8fT74u%;4@*)7SE5Khq8~3AB2Te%kONB;}jMw?0t>B~{U`SQ1?pji9UM#myZzL`O zb@?w&NPL0WMM0N@d6TN@GDYAtdSq4%?xbo>{E)E3{1e@*+z>r-3@9&~XNxA@L8{i& zJ}Y#U#A)WVgO#?bP^M{Pz3&Prxtx z>DLA9T6qg)U=NdoqI!GAg3zC&Mc)^)C&Mq@4(3_=U*G70)8z@3+PKAFOx8c{yock3hdqP?Xbw>*0dLy1 zr(P*NuPYa&->x*W(!UnCCO@BS@;D_lPqNAtjouyQ%UQP$-FgOS`>ni=J7#l9JPK01 zQJRqw(SWzQcNaE?n@L4D#5>+p;2u@KYMNf#K2cj}HiD+MDESJ+hf1{tOkcv*%?d0t zOPnIuTn74-ieGm1Jm>fPJ@H&Jt{B~IyRGq{+5YVxkkfORFz%h8rrJWa#!I+Mn#an( zc-_oRy7#7OqcOen>up@szHoz-QCoEmrO))wT7%?hp7Nou_u7x;w(hw80Q42rO9|KQ z`&wVsa9(;^sdIJ>U!&;WrNe>*l~Phd(H}m9QQo1)<2`RSW?k=2a34=y<*a_B+NQ*v-98B6a5}-7E#Vgg z)Lr$qjyZJ^Lm;U9o+%?=0gEWl5}^TT5CY}#lXt`uj`(aA)2Xe?2FVU{H1wz4J=F_ipMNfS z;(k8F`*n+4MXs%e->TQYS+Eak3sFIbkTZ!hZXm51#q_w9IXY=;KS$R1VH# zEbhDwgIzSg8Ti_4IiutPZRrForX3X(X`Y-hMG^3*rOL4&RW{(}rK1V{WWeFRXpD6E z)?}`H!3LSgf+#I?=_%oh0x#MaNQ6ksWyydcRt=J4E4aIU$B2LLi ztTuhbcSHlQ4); zFKr4^lU1N{ZO6j;^QkAv^O!+Dm*|UX0>mUfX%5D%f0G5x*tRf{0D}hGzI$g|VzNjW zQ}ZddL%x+h*4+Y9CTyoFZ#4YN14p>Jc?`Cz(j4Q(OvQ28oOJf)ZtcTiZ*>z*NiTF% zKl_{Bk#SiuH<1`?+ZWfY69FC_uH)f+Nkqb$Yc%9IY2M#4Lj>%XKWK+@Mlfdu43;D9 zoQ&N-IFFbSyT#5r{AGbC5vxZZ&*Ov2OPO@ipsuz&d}3)NkT zS~VtQXrNGHlVCq+zep+eDh-7;w&c#WHpF02_aCl-Z{X2R`R2(k8?Ym@*poheWQUy{E zmvi8f_v|!bERy};IV6!oZXIeK(*+-5Ll+>lCz4Ipif~+nbPMDqWVPG=UCXQPc3>NW zHB`Xy6h8y9ozN7CXTxNSwX}(~Ll>Xl@DO9aB#$wjbPR4{fq|T;KZ@Z(g(q^uPfgUJ zxGWr;qlJMt4J@yDugv!R1zs;bfw}WCnbFd|vj8;@%t?AZ>$;pby6CK0r5eaSm_zX=m(HKnWhLV* z#zldMzkKE4=vQ-*MDbvr7|DUTs*N=up0Zew|6x}@D7%TVfPs0FGsb_0xM_1aZWFo; z*1R*r1vN^x>kaw=(0wPoVHZi*@m7SBS8HfwN`(ury)H_5gWvW^63kiZ|kE00@b=1TH#A>;bC!8BTOZIQimuW)-9$En&A}uIKN=194 zcR;Q{Vfl0BtT9(UZ+!R*%oIedxrLafxX50EKstZ-IW!nS&!fEkx;i~bW*2~kSc+xq zS@mD5CeuHFWB=Z|5-WTW-owfhNpn&hwT|2vINfS;7+4+YuZ1QGaNJW}H;FDK`ArsG z7;8IT?zvyqXxC{Ba|BxWFjWY#=4G3*h>%uOH|&_F^wEs7X`}yFpcn{)8;%4ApmM}4=%`>d=)dZ`gegpG% zLJS7z!buSG_z&ia)t7tYAtZ^gWu=9q4;4R4TTomeMCAH`1zh#)Pgii~3G&E0tuteZ z;=P?1ZC|mJ8a#{2J;-!Yv8Kz}TBZnX?2|~Wx??<^qYODGlT4G}LW;fyU=`SPNRZfl z>H32PrALqCl1i{O9|K=15cHv(w5+Kj^ z;cSC8N5w!f$HP73_ka+`0hV)*eHVmr1nyq`pV$}t542jRH0S!I&JZ%y9(WI#PXAaq zv6xmM#B=FtE6rf+W&)}Gq6{J-G;jU&a~P;M6N*K{+-_56O2ud_eaF~wl-i5zp(bMM zAHTibz6>(QOvblv-J+;bNz;o+uI(rF?@I+_`lL-p@7vmcCa(jGHbu-wHJWPDA3XVu zM0!y*BH5dF3|VGl`>L+quONG5`$QZ-gKiZOpi1#qTR+#dcr%HO{hm)A&544eoqK-1 zJa0oNT50S;Oj%INPy@aO$)gW@A%yAFjhDB|jQ!B4(3_`!x&bp^&@*X#p5*U5)nM&6s*KLEg4uxpU;1CBJF=g5>c z40fDaI9ZaixK8WwSUH+e;oXtg=yvey_Z?Og7&jXc(wPk-I(2i?;`)iQDb zW>9%iH0XFK;}=59zIX8#_+YX{q#d>u7(C*58HMIOreGg|W5P5U zcM86_(Pt9)Q9Q`~@eqSu&dq-2Yy1K|$F2r0RG#j3QgMrJKC(W2a&At4l5c5{`3O%U z#MI#FuLKaZGb^Zy39Gl0blr7q{uIvnpU8}=vJ44?9|}xC$@h& z@$Cnj-bn5Ubp#_AK^^c6Aw(Nf6c6=3DeAdp-``Hnude?GEhTjR+GJ8wff7`bRCiS% z$Eacm+3Mg2v*Uy`##{kg;BDT`=t9V3`rxPYH;?;Q1V=cBTN{z2Ht3z;~~mmE6sV?H~oHNVC35N zRL+-YQvil!R2{_OEIzleZ`A_ZUIHL(lT~A5mZ}SvU%&jfaIeQAlAx{PZ(4<(DmxyL zD%XZU-be7`pTYhcy9+QDo0eDFf;vf^_CAQoh+eQ?aL%HrBw_J6@Aul~`wW2ret#F| zGrdFOB+=aDiEd8QuIbj_ipkn{N8`3nBuuR4q;~O!*A9>RyVQySgR;|0UZW18?XLXv z8V#6j4%!{0@|;w1&!P9vX;%upgLI(5M}mGo7blOQrv$!PMl>ScIpr6STyt=3=)wnn z)o2Pu3u}JmY2fp~$6QP3r=jayR2=^7gNDb1BbEtk;LY&8|2FQp`dub@)>9b3Pbss1 z6rIUTT>VX&^~(uxw#l$gJr#h%r1_6RFGX)#F5P&lW<|)nF+gdlm0#Hoic5gw59Oe? z&D!S;faxqP7gyTvrJIG&PEiVTIg&#RaBs>#+V5GBFb>QNtFp+i=D{DgQq|I5E&AMv zm6f9QZO!DFo;#A;gs>qSE5KmPUrK0Ro>i)5HId6ufRGco&BGbNdkb6sR7?ibT$5D}_} zg;`&@;gPSyfgr)wZ4Ya;;r4D?Pt}@O1LXt~mO6cr2+cAB@6+P=BA1%Y8dKm5e$w(Q z15d$vlSq-dImyKh=C|#HTP2%Y{;vhE$s}xd6_4R_CL{}cU9yCD-iKI~qpKiAYFT=T zZo*`ukuy;`ek)QGW%HCMQ5yea(PQ4K`%PV2(P^kglTHe(bM!CRm1C<<+1B}16Hy12 z9^gf}{!p@Us>|}2ZlTlhaHS-X zH+gE8(ax~0<*&B&o>)`|o#~5wotc$z6>Yy+Z!qVo1W*9ie$;6(%81o2oicA6EV*78 zZo4Dg$c}3t23R(!t5vocr^O=G5z`YorFU_f)eT8EO1X}}pAPJIda49FhEGSR8tPj$ zb{@DoLTrl~^-<&ft=0tICMTEZxi+SA-XL=s=jawHXPsBK&;X}pcf}`P;p8e8Ek|dC|p$ZUUJTR^qGXWLuExm$vx~jA1fatZ4$A-&vhTBaJ`Qy&X@h-!R zAToJ`b&3#4$nUpgudmR;+-GZS2YYkrNlZ0p7TFe3G8RqXuGGOgSd3*+DEcSn0%<)dkWGzNbt|j!0J-@uJ zdLQVAo|l5km3`}y>vA}bsq)tMhw9el6>$y;P@J&%F=$@K)H0-AsEGGGp0E^?zOCwS z05xx#>i5Hr4`s{W7+N=8hpriwhReCL8HfG4wlk)jxlvI}(@=QM zjatrW7aQ`|DfyM6sHg>35A8*f--1~hO1JJxVS;O|@H3h!*%&I`KMDO!RtrUqHhfW< zpAxWr!+j?j77!o;3p@pOFd;q%wo>83R3VcjguL@@^LSYO24kv(eGaM=B5xWg%w3XL z;gMA;Z+lz!fyfh4dkm+n$Mh~;9;LmLNer@gqU!%l3#%yFRG(G@M#3wh_4?CW4Ar{6 zS&FDF>a?DP_x;dRtWkgIysp7%%5;_r5AEEKtxu1zJhOtF0L9HAHdFk>aKt7_kf#8VLV)?0 z=RDxrnkQ6F7O%!(tosB)JggP^MnBz3ek#{}SMT3p?+Eg!`z@4$;}d7)#hExc-IhXy zM&c7io^o|C?xRV91$k0yJKL7xz~Eqv(wy#;o|sv6uQqWj5@H3&%wFBr!yRfUKis@( zH9%WH(aexl^i=JL$z-9{MzWh5OhHl-{s%CZb{`6-KG$Mm&P;on#e0p)cTd!J3jYJ3@pzpw2(PIk~&!H zPPNaCf2kxXyv*J&=_Gv=&B~%5{TK|rP2qqB_ zt(yi+Z>SVC(Fv8=ovd;|lNNTzifsVT z>4P55s@QdUDBjf`R`HWaV0zutWMsC&+4nzG)^m%d`6v3CDC0dFkfW#Z=jE$=wBdlS9H=fg&ybolzaFU@KepAnJQbgZ~xeK{zO=qY;l1O$6rC}S@VD}=za}MlhRU*RW zb#-yr)Wxt1{u4VpsD{mkp*q<8Um;Dw+6Mr|Y-V;f$g+NnjRnm`Q^M@F`+rqI0)YWB zbjHJkqn+6 z8aY08jKFwz^3m1dRdfmIC!=6YQ;1BcwsbAwH1Yj;6^Ts@ByLwm~ zbpunt>hZI^-zdAoseW+^YlpnqM@CPx%u*ti8PS@VyRT-vPgz~230FnwWrXlr2{h{` z#t-jWEw_`lV!|6uE`*%@=leZA2wk0C8PUhM6l`mB?Hx^GmVaaSN%|YRTo}8r##aNY zj)Mt3{{UtKK|hp{CxO_TY>Czb{t*;g6(HX(tUP;jGNq@Ya+vyTw+fPi!PBV+@%chb z2#`6*bsDUx7r<7WQE_|Z_kTUi8qBBoMFYFQ-XjW?#HOkehxcA~UxL1T24mobiM8ZL zY~yG{-XrRMJCuD={s<@{7?j(1e|Zyj#h?6Spyn4*#!+)`F1#Ur zp?dH0$B zAi)5r%URJWY_x{9s%8VlY2@Z!Oyr!6ibgocFMPii|V2?#RC6&vTgt(2e`(x9|Nhz-cw1WMTc3;dPt4um}%0KEBfr2{BdW_iWo(Ip?!Y zfBL^hz4nk~TdT6jYpWqwvn??PB1HZ<1Ipu$nI zD5e(4SfM~g`0O{iRrjc=QYW=|yEw9IOha(I#dKwwy z#{ITfn0Q#_AhHrwm@p2gRi=O-;oJZ5%Jv@%I!*@O*d`3q9>qSRwR{8|R``l*>7TDhL8L;j{~x z?6BK6ewm(FOZ~^~DJlb54C|M|na+0zmLiXpn;TTKaatHVhk}fU5fbMjZ-$2FuC!x;Gbke4c+v?EU4dAVO=ic^qJyumO^!pfWx5ATUwJ} zZu%q;`4a*2nbC!>#2#v#A1kd`%TQIRKaKbgI-QiS@EfNi;e<^+1l_^P`SqerMwxID z;#(8bf#(A6&Th^!Ki+AJx%fO`k*4jC;}n@_?C8*nn=f0Is`hZs-1xvf(%}B$bnM!Q zK(0byMlssZux)ipzC?WVMMG#Lw~no5PGC0RmBNXxN!c&mg6xD}iSER+18IV?6J<5&;&4!cOq-K`WreUc4gGZH6xm^D&7c`kGU~Wd^OL!)cr?jSgeLD`aCKV)=@ppuFZDh| zh^!w^azUpO;GJlnu$@x*N%&?+Wqh!voy)d$Xi#dIM?}%o1jw6sUHAYlcXrLQzY&sA zrAnkOz6GtYeR=(vngK|?;VuAPBo0c&qdmXa-fbnR@E^EWcQ5EZPaGoXDetoUdfK$g zo~$}jIjT1x0s9GKJ8zH_)kn3N(R|#ofPuU8G}X=!LSdZY+5}i1GaEw;6}(D@KIpWGo-XcKh%3vY+Hs;$`=dEe*wLWQ~HN;+{rQeX~h%f&Z$mYvO|vV zucyFBGO_d52-Q{-f0Q=~SO2ff0s*PvS$Ua@A^NoOMM9?muRW#k{Zk!Kb2o+XKBevE`0IrgCfOTLD5t`)b!mCF5u2k$&mAiwEb#V8A1#xRjwJvsM3 z=+u@c!1a3usa1qyh^6MzIYH#aU+HUrEn{63!`T)b=~pYJex{&_Gh7 zhZH78d}O}|BFmEMj3*b%IVqa0r(IApeF&}Gi)dBh2x9oaB~4$z@ffe5b)*?zbuhdO zi_H}I!%K}@962yE9!^jFIPlbP2U5+iHv_Z|(;rfrjZa5H>%}Dskx)azm0MCFGK}kn!j*m-j-uXSuAxr1y0T&>Y;a@|R znwM(t7M3iGFDq6r{g2@o*KXWYe19LFU2ZG-O49{asc_7lWB=OEP4<9GtP@p~{j4|M z!|$t_Sb4B9fZB`rNiVqMYJLP55CD7FM$rg2+^0?=2}ecE{^<^bgM5h4jf)k$9cd~iT-*i4Hwno(I8_^9 z;QnRclPmgD&_S2ncaMzg4uKP{uzi+r@Ji9x1k){i$b^tTzwLsi1htbcxMRI>jlfuv zPIE6*oZ=nK)5z*-=c+)OrE_)PV=a}r@*7W4R|?MrjT%1&{p*9ZQ@WExu~fxgbt21j zThj?0Elj|!1v7i-=lkx*$A*?C72}l}|0K`)j!Xf@qbJBj&_I}*Q2a|JNXx@L=>Y54 zNC19pWP3Uk>UC?3yRWJalj(r`@yx}5QRRKh3Cms`OGM0Y>#J6StG9_)%!=fdL7r`k zp>IdEPD~7pDL^Ow(tC2qe(cT|#q_v&_*S|vCX^MWg8^S~ci58A<(X+k?&VwN=AZCj zasC!|$~7P=n(Vcy>;G|d<#9>h|Nny^co5zN6BP#ywM%V3g~Wv1JgRBgq2F~#YPr5k z11zsf0n?75B4*jbqgiRSrM8xsC6LCUOz`-8d@{uj$3;F8F$P4bylW~wq{-VLs)Q`&9nl6{oP6B>ulAnW2Ls{e zukEMVrql2=fSNFr^VUn`LbLroDFB${e$9gBX`;SemRxgmmM9qTi@}avyO-5#MAH(4Wx&w720;b7SE07OSQiX z>b65tv-%rr8;%xy6l~fxkBE=QQ%*kXa(nWh%Z-kV*C+2ZH>#YcYoa-*)eD^oGe29Xo-sp-vFSqLk&TYUso0HQ8LLM8N6YiKrHQy zmBdrYB&HYGi>5;!tHc()TB?rP$l2DQ@zCan{5H{0%hL3XJ%ECjg`;z zx&$U~|7H$wemI)Q%w=ByA)c^@0B`D|})^FQx8S)0{s zvkpm4;9bK9xXyt-JELPSBuR&6r9)lu_9;S3bi`(1RUYx`O5(@%$(YLnvW7R{Fo5&2 zjX1+eKO7QZpd~)sbodrqu6DF6(zE30Rs&gMws1_UYbIROc=GUv$k@@r?nTp~J+!ix z%1+`tL{h+|!&~an&KvTWNG-#BIZF!6bKGB)YVVa*&U#@J%zSck<(t$L2%VF!xW4t8 z^y;u*U*kcZK#)*TI^E9&X~@x@GJlN#r+;raSpq8gv99wC1EZn%yX*b(OmlDN`G#Bt zz%*cpz()Oz#hM^zu7If z0mJ%?gAPqZaZX;aN!q?JHuCc~fKfa#pO-P&#FCT0Qy?>xSQYJ8|79>9Q=NZU-vN7G z02ovLckz`vf`KAOtqrjTI!@mLzpeht)k{nGb zp>_@+@=yei&KftLf&8b%74#tR(B6N=$}C{*wJGJo*#$llVv^RV7%ILD-cIemtP1!AI z7q|}rUDom%C`K_8fnQoNScUHfZTd!OPiNcmStZLiqXX_c#n~cYg#~$QEESR49Cwi$ z-aW~Z_Ef$sDyu>WtBbgqTvoVF6nv(hs({5dRL_r?;x~)IsMtvS^lQZpnt{5z^ITgv z^f0z!q$j)MeR3#{syE=&19ML>-hs#n4w3=ccK47@;UI3h7Gfw~W&ZQQCL%_9|Kf{0 zDk6)5=ckYQURiIRLLU42-~@u^7FH!v0eKCuAq~~>}D0XBTv^cVmPJ(#p&6q@=Gn3R} zC#(`?5Up%T|^&h9D#wU5eX-vpxOSO`=`||ce!2Sl-KygJ7+{3Ko)Wh*v)dE zzfiBpTplWuG3(%1HKD96rPq#RgPm^%otX}@>z`$-k~gyuod1E8m~_@x&i zV5i;cqkv1_1v&mB4}4M(PU1BXu?s_aKHbPdAV?1i` zRKlw4+OcY5O(XtemlhMTxnw`hkl$#+V=RcdLBQQ{8t3r=L!r1}*kT>!L*zj|yZEY^ zu%%|(*27RoX1Pz>9L_it8vG-)EnPMs%D~AxqapwY*54%q0l&O*MweupKUj7|;^3@K z*tH_wYvGwwU&4G7HX^%K#A?V>?HqbG2~NV7zo_|)^d3bM+N{qYENS!;)ONVAu_MHh zd!Zjp*0aC8)Q?Xnw_!hG8ktriOei%ujZHUAUK?CKwdT`96m?JGwZ>Jd{t>P>1f=}i zY!@cMn}0CI`T9MTiV&~v*z%EEje8$T!5bYNpQMfc^U8G9xK!ID(_V!Okw`7%Lg|(I z0@P1wJDhA@X17$;$0|`iu0J%+oVVlX{Pn zNAfilC9JR`(|kH$%8V-_)&w9UcMY1HdqA{0+fWpV?Zafk@=(O#s3yMH49R{Ij^4au zPvqF`Ng$pz-(DuO2YwVTF!{#x_uh7)UxP*gJHIPi1{RRkCAjWzP!hEE1~~fOpr6Gq z@9lHyQE<6Ut}WkYX8nW~S)RO>P2gvKAd|-1a%MImAcn>gw&yd`qn?EUpc-<}Z>$gpitx^~}K+f7v|qte;ttOBaM!@1lNH-AxwN^37`#F{pGSFhjoFBB3$kt6ulY#CO8jDD%s z$n@tlb+B+VelduyB^XE(Gqo>-#TMk0vyfdum-qrC0#48VHe=plV+NVeY2{}MS$m;y zg7|2<9QD(^SFT{~U~q2La5QOLHtOpS#>>dNbPDHWVJFew%e<}hYy=T4{ zsi4M-^>!jo*e{+0=Oz98c2!vCl5r{fmrGw=AagnWH-y&Q7QR9kH{9WA+1({~+9Yo&vmxfB$^b9AqVd{pbSL1Nd{ z5b#O9K02suZr0d6F&%uql%=`aR#bN3+S)qVCQ{z+u1$o5O)94!4Bgd6z*W0_ae@+C zY9Q$wZYE!@(I!rKn+y7S>MN0w;i?GII+aoqW^WPgWI%YKxk`eXY^ zFiY6<0`+5N0~Y?@rRH2J6H;t_Kf&^!y7kRv!^~0|D49Vunm@CUczhSQ=Tv6Pu=y3V z-Y+#*EmJWhb@M=^_`rhcx>p-3q>JP0lq#9Opvnz4kAuPQg#5YwXG_Nz>f0XUz*+U# z@fOk)^n41|x1&6#?rX%6@O}~9&GX1&$P@6adf4CYM_rBY7Sa(?2)U0+ncvGSnG{d| zyfr(hdCt@v|JBQk4bzjuVKl%96WKZ;CSpr25b`wis1}2%cI=%pqY=);*C5czOm@NM zTzJ}^8T%FrI()xdfT?*Lb^XcgFyrhIHs7-E=OuA*$&iKB8uGifD<2U|BhfZ~mWmjr zt8WHY@t4MI`IYYu-x|`=FJI?&4wyh=KX3O)Lde5#+QPBzEAlaQ0SD4vioFA!33bcW z#*w+qB=+0XKlf3iWl>Js#AQ_v?Vft{SKNR_gnqPtZa5d4c2c^~J?WZgpa8Ev!>H8b z1k+s2f_C+i?~)wX2OXa?fikhy$8}FfR(#W4=e!U0R%I>U1*C1XoX_)qTEBi{7O1nI z2#!CoZDmT}(5fol^n8E8yTc(+J5*WnE%^D$G#IoVewH8eTk91L#Z8E#5gD?1$OOI$ z7IRgA!+6jy=Vv;csjKpbdBn2n6>+MBge8G zN;7{)uY_(5a}I?CZWG3w1x11u5W&h*;YTITmy|e{`g&=;Q{>y-(}`&IH=D*JjR4;S zTcb}bpSo@<*t*Ly`MUb;HlZaB?v*-4r!c-2h(WBVy{7%YVGtGM9cf2P>-*MtAuSaC z=12Hj(0|5U*aS58R@$p?Lr`hI7hb`eMZ3pvZ9kEgR7CH#jmxcpeiFfl zG+b)nXeUozLFc#8iC?NYe`K1GlME?N4yWkaWPaZ&E*0pd->{~;Pc4_c}b z`tdCg_yk+Y{((8V%Vn-5icFl`q~CtX&g}C~gRl$P+*~U835-Q?q~Yq60aIG>+MvIYFJZD^JsdXBffxpA1*n2kIt-yc;bYlC^_#-HF)tS)-g?GJp_6C6h28S&v`5t zj|Xk!c>D3CZ$T(|l3jkowvnK{N{ScK(Fb*T`%Z{$tA^JHt>o)e;^&@^I-wk@*vybgqmFd?d)GtlvixDffH=5^Ar@C2VlF>M85R6upKLV z3BtdWKrCvtVok1lfnx(nly!Jb<-z6Agg|iqR;C&8c&#{LDll><`hG$Z7+mb|=*Zgt z#q}*gV_CIc2O8ux^53JJK<~ zKfUvJ?k`0=$@!IZlT^3bP)T;lO1>||q9Nad5Ol)fwb&89Fg+qYT=7?xTN<_Hti~Rg zHVIq?H?m9QiXj2!_JyJ8{sqvjyiX~JfytahBd@ee^aat_cBoN?SSuYfIZrKpg@O{- zvvcM8DGRCrIsyMwfI?d!uWwoaRku6lgI{JvX;D!J#;Wjd!rb9jd)B>2mQEdX^*k#e zaXk!yIRK#@irV3$NSw|0gA1{Ntpi++5>8b@0${3Dr9ag-Oc4s@?a)6 zCXgx;7Yh;uU_7Jc$sDbRr={1f)wXx2Y>tRRX~36IoTRmx&{3G_YWSCyKtW0xG}9~4 zfs9T|NJQmXIi>K^X?iBKrF$)qw(FTcn^&*v^><6x*0~=jDD8jW6w2r|o41trZ635r zKN-aqXI2~pBbL8Q^TfiYtfCr5+FFOtps^u*!#5HD{7>o%_k4KrD0# z8Is=t>vzr$?`^0-o+no0bR58`_B}ulbM90CoYUs@esqa*ba{w(Is`9wjDOq(V`gZV z6hDF$XBaw#rwHq$2Kfi)T*d1igrZQ!TBGFRjiO$B{w+QWqK?X(IyjrvhBWMYi$k0@ zM*Z^Jr5V)+pn4N?wi2eS8TIuZU|FASTpJM?g^8R4C@4Y*uOZ)sKS*=iWkcj!;+gr% zijo~>^i0=KqLn{0fnzZ`fC?7Z$$~sR;-82GXRGg^Iwef}I0;^O7)8Nbp`^x7JQ?Bi zm^w*Qq_m<8@B=BRif8ndKFzTF9f6F;Kv+~-()}DkiW;jcmoa@-Rt9=%)KvH<36T#4 zd90TWH=jJKO(>{%4&()v{|mo_qA~dyIsrsiW`QX)yJzw!xFW^{NHY|6xKzPnD?(`r z4LC&@DmmcCATXn<9g|o9pRr*;8?;#Ut8<Na@LgrEB9g71uFi3xnA~r0^mkyPrbQyQT7Ewtqz8pRT1!~$;pO=!r22!{Y%ULH~YjO%77oI?0IeG{OLd2gpRsp(bhR6UzFW* zNV@89MXA;|1rXdTo~F(e&BchJpZ7kdB2GD9K59a|Q8{0PL=u^5EtjMf`mQ0dyY%+k z{#eec0y}lfCjfNsGnba~$otq();?6;hcvc&?P3@}9eN^PVti%ZBONe8(h0M@4=C}E z#!;-kto;PX0I>SG^I!r-hEEVL^?F(3^$-$?y=x%lzrK7Z&GcwyFgt3uY9Hc3+Q#VW zEC{j5J!H*sg4ei?e>wP}GP#={-JChw5fKcNKrb0ueT{0@&CEnNZLYI)3*Je#d+w6! z+rt=37;t6&a4BQHt|~{IUu`}Wt%s%N?G`V1c5LtZzvb_jPpyrTZ3M>RYY^o*q*IhA znK|A*`y#SG>^G1qfVcoH6Lj@>{6923(9PBT*}O-luLoufd@o(`Rff)PqltfdxcZhmNfWb-a z!L_wSVQB?^MUtgKuk-r=LHAm=^c5JR5QL#Sy(XUL^sM_+is7_aDUa!c#sJA@UG}&3 zIZYMU^yAz#J_aj1U$ZttKRf;$yxnY{#k|mM7P5c_w63ruB;4=$UY?SO=+gJ`o`%%yuf%x*WII28yBGy{!M0H91< zm|fbktOuecTBo4&BuXC)(h1O>SnNTEif2Fz{ABZF`!t$+J36<&@NbY0X4qwKaB>p- zk-%v6;x3>yeEMv;=k?AU*}66Z;huh7M!Lq)*4F0f)?`1?)~WrQZh*=Us2YBCv%wa* z0~iBeyAu)()g-ng(l}4?`rNq2XPK+v+%j<>*+XWMR%fiC+Df{x@?>e41r%j2+D*EgOl1r63+uqP@1Vy1DABsq@Lwu{pr z!-OJUZN9eHAF_Fl_4EI2l>$`gzvNQnj#Dm?3zy$otllp@zA8a`p z8C=`}MP=>b)4f793DynYC+Q}9r(|Y3P(j1X8RKAtDct&Ql;u)dEE#uxxW(s$`To8L zfRzrVIWgY>Nb1td>uv#Fg1SC-6BR0+!J9$j0)zWQ`yU*u=W5qw15eD>W4q-Vz*|@w zY^Jd(L47>Er^zdA^`;l=Y;H^(J_nwBTEcPEOMl3Fi&@s#RDW1MS9!co!ej)*@V?Hg zo(DJMK(??sneKK9g=-G{$Ef4lV0ePsG=>+X+$g8M$S&MlUQ=UD#oC(yHC*fr0lIi}C(BA;>eUoW>ot(oTU$b;#PN_^g86$0qhsZi|JQ&p}fep-=`fKW3J-XMjRmO54}0z$>f|f#rseH+?tS!3&`O>1XmVJjgNPh9QiG{ zPW-fW1{3Ud&6!pCcnu5JW~7}`63QKy&R->8?_U^MKKC|$$7nkth})w&`8^xoY{N{q$`^p2i1EI=io{Z=``HM#uor! z-Rywi2wiuQCPeN{6ho|u!IkSq%}8Bp2K>vVMlJ6V7vpHJ>CtfYd~m_*m7-j7aY<$*2yAV2-_2L#1v>=83iEJl}yQPdqVw)i|(V1^D=iE=|X9V#4YUjFrzyQp1*Uur;-j+OVw?lSMO+|Y7)6IBh zS>@x<5He)8S5!qP;QCme%LelHgT3qku7-{y0;>sad37?~a3>%~ctyR`18RfryN7z2 zb^~en@hF@E)mBx7P709dMa$oxLjgX+sx%*#ZzfXhapfK&1PSR;~jW|Cgd|4B5&!df~Sss8J}|- zBFCmokFhB;wp9-Ra4mJ-y33KP+OhzzDBa@#9@p4w)~4J(xQA-jR$vJ~Pyl0^2{_q5 z2rYt_fNt;L#qMr*UQ!kDohmRQ;=|DhUB?of_gVzJgiH+|ywhlvDtuY>u;L?EGnEmL zr{ju$Oc-1Mkl2Auua7{k8D1@fs~u_fz9CwM4g%XutSz>Y0N1RQ{MUGJsRa_0OH_yn z1x2QQyLIyS=estI^~?}CU~;jn4azNS7wr|bQ1=uo936_eYA`x}@bqzW)2VvbOa~1n zBFz;doL1Nj=&_br+l4GvCfCq{2t>lxpF{eZO>@#onOb;WoYdGb{BRmBW|#ZO@k0y}XV7npYwN6Xif?+V5aR`> zMmZ}vcp2lv%QcW|fWTa#=Bum`YsH!e&M3&J3ur#fASIqW92N&I8VG%#Q{Gz%qiIP8 zx&1z6RWLfO0C4nZ-6OAKyWx2X-^i1tu9UVZ`i7YV2Y#wPMPxH(vRU$mjrS15;-Wbo zMR&KIQ~ekYe^miWy#1h9axV)$4dmZ7OI7bq@KamAlB=3kHg=4+EQ5QIDG+zt~AJ{ET+xO%6A8s`NW6qk@c4d1)A6r_b=GVt-qntX{FZ*a;igB;L2 z!Pej%=E4zLff+`p#;>RWgAg>o3P-NNYJ35~UxgQoLRgGI_Fsj-;?+mTn?Sz(v_2~? zRjU(d6RA1^#|GH9EOlY@IX%g6rftYpI-_5JM%y!V#pPkKQ(3_fheAjxtaAA|l_v`O z2UVVP5?VA(eMZI3c7#)C=ym5l=61TJ9hW0cRRJxy6>;rq>*<^kVL;KJA%RcCMv@QC zQ96{fV0yfEzf3kh15=MRN%RSrHzRLIi;Jww!i6343p>(Z2u~IvM;uVP#qCB&*uYtAKAp(V@t3CY8 z(hIgc1SLZD&>n@B_1)JSma{iWcPwOm&H^6RAzPf(V+G=(`5E=!rGNF0d^)|jm@$DD z`EH$hPd!m5)1(&Xk#dB-+sd={gc^Yr>CivMu?Kyr=ailb%Z{*v?ALfStUmN@2hu`` zrRqHcfwsZ$pnm6N78Y}p|g*OEC8{z zX&d;eu73jRp#B!ar<57AKLv*)7{5RX&`XjI&JL!wyeS<`N7X}OHt23&3Jae==8Z~( zwvH^_Et&G=ShVHeLPP~i$PX&oAp;H1?qK1EIZ-mhqree~quOuMjKD}z#C zS3p7u>J_klUiUkb6PD^)g`ytBckNrqKK#`pzaXrydToqhVqroEyrsR@91D57n!Az* zy(Qm9rsIPIzrmaw3)?u8}A#BAI2URTHk zB7Uc^JjRT8tGC^;d->GHf1&KyF~fj8l0sZ;!@!w>1b^In3Bp(8qev$J`r@aPPp|m2 z<6ScsbZe0eq1NG#`dpfsr6Z`gdQ`s8IGC{hx$XL#Hr`Sw%~1O?&Fw0`c6d2yF8dI0 zaxd4~Z+U!xkW7h#k?}QTYf;!9IuMF-n>zE);*0(7BRJc%sq18YzL%xhbqL_fF1`ZV zRuKAUzc`rNf%1}I;qQVx+gZq0Z}uqG&|J^E&ChT825f?q-j+kN(66qcFMUBlguYe2 zx%^YdamObsFyQ3m_yb)UJimpaHINY-BLgl%=EQf0S$;*u-0vqqQdwCN;Ch_M3kZ+B zf;n$*2C?V6ADfwxd1v^(1Ygenk6tn7}t@hL4H`n#FXXe z))6>GYj$$U6jv^T4!komtvv&6PR!!P@tk}K0RN3H0&K5kxqHDHuVOW_g`bcbS#qAZ`>A=mD z&T~pObF;|8fJlT(>(r`&Xx5vHuJaHEwoNZQ^)zAZHvGR^=$079W;K*C&T~X z_Nz{;9=g;Q5{i4CBaA%E!Pd@Cd?{kk#tD8f1Z>*OIhi7ptEg_9PsiO{U&vOru{&Mr zR&K5)+(m^zI@9~7xsfv<6U?}Go|qkwT$MZTH7C#gph#bA!dNI+@Rc_LK)pw+rfq>e zN|9Rcx{p2H^9~_m$OtQJ`Yh<6*OEjghu0#uQgKADr#e>9I!uaW&62!8qzXOGafj-HGb!Xm3PE| zyN1qPquB6$T3En*MgP7u3A0+olS-D0BHAy#^1EPh?m0X#d&wLoU(ko)` zM_zGG7l7vv{PJvLNQ@m%@v2o&c;o6m8JY7qvpiEP)^-?rYaL$@8U-|+mMC4ml=s!| zv}JF`y8P(GN~RC#UFvuo03Pp1|oKC89 z$q4dq^MzzG7qc2Yhi+VK0;V;nJI*AxAp_Pq#Em>rJd@yO;o|!r;uAr_l0+Twkd<0L z_DJi4FUZ~d_^qc1$oj2xg{8iN8g0Yxy>;fiQEU>X9fs?f>Y=;q>wJTK^jMn?~H?c-!cxHkY1~?&I*c-M+DvC{d z3`6A16|mBEf&Umg4h+Lr8X+LAaEXf|72F2YGQnetd_(ye*Xv}8qpBH%^MTqVx9Zya zHmExpN4inYmk>anVFH>F+x2#BiX0n0I#~5OBD0=|v*xm>oltzy7*7K+?yQ>|TTYrW zJ)i+uaj5W0QCGanLDzW~WY7g3{RYsfieB}W!$R$5W)pgU*;#nfi?9gwfC)xX*)u;#F&Jf>c z6hT9EIilDQJ+Vu+Z{eYbWqpJ&UT)rW5{& zU+J-0gToZ4W*Bu$GYt$SLJ_Nh!`2?KX+5^fZkycc)E`11WAE+Q%Wj8PAP! z<;#@9s1*-^1t95vhvu5Y#vwS-tl>~Ng5!)c6bV}kY^@j2_D@eEDmrUuT)K>;dl%ai zt3uv&$xD4$4tL!mWOQudq5__w5EcJ7_ufa{RH?$5h~iliKEH)Z?fgbrjsd@Zw$7d~ z3X|#m!a8@_V(6Wy2OP(WgYKq;Dni|Rwh~b+s*ESU3zTc&>Ny}(y&`Y8{57f@AAfQH z0W0_3%*Xh969XBF|1f^p8hqhSWN&wI@*Qmv211zJ$ajq}aJ@B?577Ts-fKHOxHu1FQz zXDmKF+uP3#Uzevc5N}dog(kP@fwblQ_geBS;e?d@O0$SpY@zfyBZ^KlLXf$8b@j=y zg=eq6z*(+UoMs^)1?;G6I{^yp7AWwNemmYV| z5pXDD(=Tu_@OZoj@CQp^Nn|F>jcxUspLaMa=SMCy2 zL+>}ZN(WQ(A&})IrEb^YCkIBGrkw9=yH|r6K2%M3U`bJUg34T3ZM^G82a=Dz#Z6_c zdOOwHhmP?e9e9VV<~j@?-croP=yw;(+fQpZW}VRT16kRJZ&w3XIl$4G>|u4h^m`RH z&#Eq=VUR$h_Tz7K$f={tq6)yPznDJ$3(3Dg@VJ9M){+uHK`hhg2<7*J&)!N_Yy%*0 zFlk_VoW`+)&4D;a!^?E#n* z$Z(O7f#I1PPRtb4L0`vf5N;DEOjy{!vGQGjTm~2w*pdu5+nN2yz}hYMVtM9^4!Qhwu+^2`Re7vSbWLZIo4E}-|VAZKSAvMWFK*2^?L`C4?@OWznL z88qF3i=V5Lxh&30oAj5~K=F50u3v+5n(Ow02xlxgAX9W9ts9JlYfEke0cUJs$*)(x zktJibW>xNW2ShOmK7?J-OEzPjv!ff&pgoA5Tn6FS#IZjk3Eo&7VU_B)6(O&Mx<3Q+ zETZ>JUlB@ zE0%(c^Y&kOw^hT<50Dahd>9r7z$U~-mIVdOi7qUMrzMfnWC};UXfN|<-rqh=LMm;+ zb`$81elB6q|ctV`zI*U}kXv~X=im471vUdhQK(AA0EM0xjWSwlLxMj!%p}| zh2c~RjzywZXdGrpvN!=L=x#kg0^(#cH*)9rXyhXPta2SUoL~l^)k>zp5p-a~E1J8p z=NcTH$PiD3l?9y=C-?XAZ*fC^Z<~T{`DZH^Oid1EKINN%u!@pU4^Ib#t}%i4=0xeC-iCEc>E zSmXreZKelbgyUoovJMb|Je^cyq9G!RY!kYi|-(hjM1bOW1NK1&r!- zU0krtY6@;h-q3IyhkB=o@Vl$V9g!qrWmHNZ1F=%zpIUa6y62FRc8l?|ZtL`Re_nq4 zVKuE-aF_feW94s3?e4Xf92DoS8;AtvOeF286R@UV6Id^@K^-mmuq1KL8o@btVA(?6 z-UOy2)tnWsWW`o5`Cl`3rH)s9cW_BI{E!n)gqX!;RXC0RrUBXp*tsC>e9{V9S916| zi3@A<0E*uy61k1@4;hF|t#vKHj)vd+r*>i9WcH>HF!i zTH|1cmMS}jRdkoNRq+|J`5j0Y3q|+7-^f4=f-}CHnSYEFzuq@|u~qk}`DlxuC0JaC z5g&Jf;lbM-**!+k1%B?Ep)tVIuo|CY33rFt(~TJ?1QmblzYIg zDlgeWli}5<0vrtr@yDRrkxTXd9OU1Ps83hwa1fLEAnZi4{wfL`rm~cd0S!m#>eYDO zbWR&6(2L72l;6ulLRt|LcS#Cdi=pHe#JZg6JR)?ogg4N^G80b(@>({7=HSptfW$k6 z2YILrZhql3ej6i7ix<9m|DRt))$T#BKuvVD`DeFQr+VSOM%;TCBtUbWsVet$<;!4) zC1h~}%Rs?C7mFX(g7Z{xKny9#UFQdDjSJr|X9%y-bRe_RS#Wd`q@9o*LnMz{;*KUr zl^}>EH{iPS2Yh`xy19PBHOEzoR~b-ZiPAl&Vs`QLv;%c*$cHi|TSGx4Y2=wMx6Dx` zdh^-8+%a?k}4>zu)SV4a4#{YF#e>D}=%T$mK zp3C%YT}iT|&-{iic_~S20l}sH6M5z~a?}qY+vEg)ek>n=D>X`zpab)wr?Vs1=-F!2ZKbV%6Fo3a{`Qa%m5i zkT}G>+`~7bkE=Y}?S1$v;NiA>Zq88)-AqxD8UikJvW59Yw=t1G_%`Bt1GL$J1Zs5o19wUDmr4T!5S@Cb&a_h*Tt zsE{DfQJ*%Rx`V^Y7%%t!#@8*YdH?vmZW9tHq0uTL7u?lfNy_3 z>ZzRY1_VXh6bVe;KV9&%O}nz%%5payG#z78pGCTabwuu&))kku*jK}`B%b8Vp4F!B z7qWY5y8QMos9;mXq`hDlTw-SFDdjrcCB0;T?n_nd65mT@8Vo=~93!f*XvX zz%F8`)TmGb%RAJ)UW_kiP_)+I^yE0>d9u;wTlVL+7*T-cg$aGjWb{;`(AC4Mc(3aS zhDOK}McMlDTcd-y+C1bOCZqEk8Q&kRH_*%?QVMoipmt%97PJ`|Fy2LBgAP4SYk9wE zCG@@wE~+?~ifY^~11oZRfUMVkIRUo}%%f|M=yuxdT#YXi+N~r9T*TYGHuF8_ z(-DGL{Jbl1{Lv4E9T*DHiayq`hQ%kaWj~o0A%q z5s~zkANTiyT)1hh?qk9Eatwud$AXF?24W_VS$ou<7rzf0Yk&7e28C)}b_?ENgU=;H zNMeotZ0}Eh0fYg@(-#TQOnsV8xc#w~J&1S6QCfpZ00^Ut+_b0=Itn2uYBvK5#1zsg zJQ$DQ-Fl2Q>f+)845bqwI_~U(TlnJ9y#+jUNe19mHsNiyWyLY@92k+(-z5YTmo+1T z0_nQ)&BBx(u*Bbca}ab;n}qjLiUx^7<$YGhE{@IOq4|MF$9UCqrpI7Jd_%d*M|pn} z5nh~MP3_#N12q^d>~`&KK!BZ?TY90E$vbxo&b9(s2zK{kqk@&@APb5dGnithko7Y8 zztEW)ijqa4Vmkvk7)D$Mcn07va$h)e;ry6dgaBPT*H9l7Ceu-4uQ)UivfTb0yzUo) z)HM;U{PJH~sP~S&CdfZ9pzKqo2EBoKjVA6y# zCS9_7%(o=N9*b*;cNN1_)OY3&*T7**3SVBi#EI2NJ^?q`{E$S>C!xXQq|`aV++iEixpeMj~So4 znqvQy?%q+JiBzP^X4O!D?Pf6-Hh*Eyk6(iFck~5Nm;?U@Go&2NG~XbhQt`SS(aA9eUu{ZVah?Ew%(Eli_EzGKOuI`i4%^L?Nz4{C+fBY!&?B}PgCUT=6 z*pLcJ=O04DEl_kx+qwm?M=*5hS_$|@{d@}i?foIYdUaIB^DApWwid1Cg&dQF?*MLP9{dNE`lsjYhs}$a{JQZmw%^pTQeCzVpn_@?@ zw%yfh^*|b{;{b|R5=Gx7ND*0327r~$NmHz0ISZy2hPHE`@_L5#M-Q+lIucwm?epA4 z37@eO!l1g5GWkW4774rP;%lj*MnU@~7qX-m=8K8RaY%|T@Um|BdBrxFpkn|254M0~ zk0_?XkB|O7bLyZrcf*XmcWRB7@8&sg7-13&MxC3)a9)>Li@-cZ!Ld0A#HsAm9lMW% zyyO#%x$fKmm)LJT2HBM$lEzxna3qgmr|c#WGi`jd`dnpuM|eauoFu+GASo6)W1Uk3 zR#sqgdVCHL7tnO9dtqR6+<|v$C8~Q^bx=Fm;RxdRO1`@ohIg$NQFJactv()zg{jSd zKv#e`dICfcusc5OxY_2K;PG1g==QZorc-y*$;#t#^;$+?WlyXO=y-ZLN zQT@)!J6(=|yjkX^mARBrlTAtrw9qG{@UcvEUc8D>)a&ZxfoP?D)J$Vu=5+BHIOj0< zPr7$nZtGRAN#MPm{p~tSF*4U2m_?mV=^e3 zYHAaoR5p}Dac|%^f%h!18mdeo?@|Z(;#@nU|`N~O;k+q z>dU=@n#$om_z4vjASmK)@Qs7Ocfs`YW*YO9o5!f-Jcl0jMib^@`48IK$vj)hQp4e> z$$0ldC|_bEuRS0Do0|e=-P4u$wlHIBbOwvJNcV`Y3^^)j%6dKSQE1%lTyJZ3StDtBv*6>--zOI=o348KC`&{9_>lulYi_R! z2Nn1F&H$_uSk-=ll}sq}Xh@xlh5IGvLKIu3S~qw73Loq}1zppA-6YNt`X>?ZGxMvw zZUIRn9uCiIa+FKQRtR@~)b$qbEEuYS@xO#vAj<<97QW8lBaKO3al%wEZrtXA7zYsx z4uNs0hT}}o*42U`NG4zSlCIq8(0kWy#1R!A4xv+n*=DK=!fp5mq;gHS6jhy~p^KkF|_()Gt-?!%md#(-s z`dN&YnHS^@w(vL1a8RgWlL1c4BXi5n0u*t_*z$h>9i(uNWTs3qN*|LjE3|DQMx2Jf zlr`CILS468Ptk2?;IpU)m&ZTs6-jUarDg5EB&3C+#2E0!piBM(2F_D=Jg_P+mIhf8kx?yTr*ApQ!R%NDXL zwJ3LN#kJ}nZ!4!5yTT`&NbI6g%zu4susylzP~q?0shfMV)5x&i8ttsS1ub~TKeWQi zu6UVy34)bdKr(xM5t{*el#X;2Tp{9IuGLg|T>kIDy>moxJ`^(QoS5r|0t!J{-zk$*jb^Ox*R^RXc$FduR ziwm^uysNx9Aj4~?eHz>YvJcdbz4{kA*Ik2CVs)<7Vzdt~_9(Rz-{oFv`lwGS$UKE} zXO~wIDJsH@NOtlLL(zqVCoJ`c(!&&C2HHQrn}J*_?MX6MA;j_dhB~U=|E!(adxVs`%`SZ4L8>Jxu+S46;o z4}TqBE;eD{&*`t*Ota zHjBK&@kg%|@Ge?(1`jmq(KC-KN_BV`uc$owCNmnez~}yjUL6a>U14)wP|Qpp6ivJA zAvM-Cr!Go=UquA#!Zcko11b`Ta{~he@KgHrmJ&ZE(Jx0 za4OwZmIgdvu+Y*fid%0pMmc-$A~ki%G=xZIb8 z`r0`JhS)e6EaF}{t)r^&dT_$OOU3~$TO7gRbr<}J-&^1C-T9Sz!*D=!c?2sn!8OMb z)T)8mwbGhIoc64&yjo}(uSn^Bhjj^4cUXL#bb9{W!n38fKc1RSC)hRMur3RURBGU~ zkN9Cu*GyRL^vvX^tRMSpJ``jEF+nn(14Iw-Xn4;saLsz~795LZ_bTFRF;go_1@bhg zwetZ_yvbfM!l0q1q~$ES<$_riVm0Y#y=YrS={nIC52_;k1#AYqZn(E3e5|50B^OFS zv!cO%z5;uMe(3r>g45zk?eX@T>B6VIG~|3K0bvHw00jwx1Lv!hFhI5h`a5))X+8Y) z1TnXx%W_rG^f2oTCf(7A4fI{Y*PHQ_``n`oQeNN3*8^`dy1OIL(g$uZYB&^*5I7z? zC@>3yTZN5XwJugu0(_o(ZhZ@~O7v0%L)~?9m7F?M%FK1yZr7CzC77kJQd|51Ov++= zj?j;eBL66snCn>%CrR8?ZMkgO|MOz0@qG*6qgdx6^#9M%wFe}1_Wy$*#|wd}B}`Nr z^uz4tWmCu-*i&%{EIh zDL}jw8fvDg`#rpWd*N`-d7kI{{d_+c48)`Y>5)y&3qdm2nvmA>rmp~4p2fcGMaeoH zipzwz579%!nA3y2yz~6zXp+q~{x;0op_0;hc^ZNGwTTM4NPuf#--3egK*fzq9TCKv z8CNCq0ffkXZK}UnnQq%1d6uZ)(>ty zs4(bD=0Wss^uhpqBYm0!De1@$i^~9oF?V5P>3oy>ZQ#G)!D6}>6X*`i!GIE3<{yB) z@^EVV8TUpgC5z~95ZVn^Az1W@y~ZXjixsDFl3b5Iyl3pe;v6Lxd1T`gukWN__a6st zw$uY>b1A|Yg+@&kmxx_TN~DCw=R0?ATznN0n42Pup#i&MnliY-CaalvVyJ}Czj7Ze z`@h;LF7r{r^?2e5-5d=Q-Sa0?Ip~}BDNwdIuY6XPAoJ^=LO-gvwR6~(0qOsU`V4r1 zB9ksBJ?8CSaNaPkS=dMK1>$&VU>$qEK`&~i*w}bk?~Tm7{!W3Q&t z9hna;e>{-U`d2H$KKPzMyi_B0PFR!DKym^WbsB~UMoVe`TPjy!E);8!r{ zus1#+v~GK8)Hm(h-E#7r;CufBFa1vcs+f*#KLzl?;Au9f~>>V zg%cFDSN^?4>4^D*SPC)iQt-9#Ejf}1K+*8u2G%6- z8(OJqt(aT>dU2JS2pm3tgpp;zd#Bw)6V`S~Ra0&dAT3^AkXUcx@{vVn`#{4jl2EeO ztBlJ4#H1xf+LWJ4Bl#aw`uf=$rIPf(IdcB%nU z+DC%H@)R`Rkz&JkGwx3TudUC+>#qEn)tKh6U6`jwd9_3jTR;K;Jw;|m67T@Lvp56A zBtPrmW_7TPmE7T#cKYk={SQqCVnnyC8 zCtg?Q%&uy!X;=zaLYr-yg*huf&D?~WCd;1!%ETV4-1_t7@Fdmo$*PDeuUFl@WRg3@ z*zPEzgO!@a4`bVR&YpD10bmL^uUCHlBsUfEYmyKO*kZ(mYVnNBYg1OE>~qfou#aw? zG&>G87(uN1U>kU#r7~Q$N9=(bPfKqZ#rPSx6l+|1xS z?$F==A1m*`m-fx;Z!0PC4GI&X!ye>C(mSFUEgz&dEN6TI=p&lpyKD3`T}kN$)%zxx z2!&0o10OpL?#xS4ddbwxMySRtg~rRDe+#VZ%91swd9}g}Jh7rIzO_r*sd8t8d-rxm z0ci*0`M zBvauPz@87jc0{dpb&gRgNRYcE$Mg}UiwxZVKrIl>An z{%)rN8m7YgeWfvaU-<9xLjtgv!jctEZHtzn{uP3GUAi-qJQ{zn96>>xp`3nIPXN4O z!;r#jUCluMmZBt1^93;s_QTREu@}hF}Jby5V$fpxgLmE<`Hscj8 z^gp1JI#9(bJSgAdnnA%}ge-0l8}ovrxDD77YF@=Y6q;pVGT+zK^M&FB=S>@C{K>d$YR6XVCVdHr+jUe z{4HV1OgE83UKG1O{P)4-g5{S5Z|OY&0?`1TN)e3^dLai}@a_PY7T*i1$!6%5$^&ap z8!mqa!$)TAT}Ug3M37yl906)s2^t;n?3_(Of%ky|8?HSO_n9$ICz3m`$pJ2M6S6Xl zza^id&q4^qWdx5^0MgieH?#Ea8{xkMUj)ZM2IpXDEQ1q`3`%Q4R;Zon2zj|%9c-3V zk=*7M5Md(HF`cMX%ZGg`y^*4ZoC0DWG@PeVsz?oqvuu2t$61)4XB33L19dYH$-aJl zhT@Ftq|vEf-l|i@$-&9|r0}vLDS|{4C_`*lh!QT7+%GS0aXQjv#V9OJ7TNaf|gfdC1XpNn=Os0VcT=RD7M~F{FO*7f&MiLw%|9J%}Dw&n}7%0 z=oDf}nb(#-gscQ(6R=gCCGl;Mo|VGJ_fJh!!sLLXFt4K^)s#!9{un?DQSa~QNvCyO z#i9Brq7b4J@Pv?W4~SOo0xEy{KhWLS!(P8P1K%*`#!z3*jb`~SfIdG=u|acVBUO)E zm#fz=EXUScJ`@IW+ zn{n&Cm7G7$m(Ec$)uikL_@xK<4IO^vBGPY&hKePRaF38yCyfE;U8$H3Ob1%uUC+tyFHWrEU-1e8EQ^~w`ZH}3@zWZ8%zKvr+# zrqa`0e)F~8WCtH5@v}N|^wd#`%%2V~`4(;i-$+_>oHpiO+E?}}!WQJ+MeXW?_=k!C zmb$#-14xVJ=IBcLN|im4Sgq-yZyQ_^ojdi8rv%4K5fS^UF6rX0>{OvWSu9X_I2ial zQ@%?AGQC4zeaM9pN5vQ>r*4mUOMz3hE@Q}2aS^nG-9hL$>}r7O13tpn%L$*-UVyT!;_B&r z`}w}ntL7OBa+S?$S5Qu;fA(_$kggR>WB0yJzegvU{>x`lrTZ5fLF)+O`ELE+jD}#0 zq61B6%(}DP3BqbjsrdD#XPew+2aL<%SDFs4{6VJ({ke^pNG*Se<=61=xnrEY^~BhP z2<3vaow#-P)lOqpPk^kToT=q}+ZqMJqtgpY#k0MTtQwOt<&01}Fx?ANgua=KssDoI zZ+r*r#7Z;irYzjGB1n9p#VIm&d$ca?M-yO;Bo)s+u}@aX;)PI;4w?&Y@S{04IAk`O zO=N4kx^&%IXVtegi25-cG)$!&%u-}j)#iJd1>IZBksSXpQ56Z|Mrtu>Mp}p6puq!R z?f*bm|IchsCf*u@*$IH}SD0=H@D4#-`f__?wLxs-MzW>a{?!y7gy3tRk%g59Z);$n z!fLH6@icS8%zu-LhT0JG{6l1vLADb!r>KlyX;Gw>QAwOOB&q&Y-lS6T)lU*;2;bI9 z{Qu=X7N!y&rBLbtRw;xZgXLLqjq=tI-m-PMaO2_+%;=7c5md184c+I} zst_Sl9U@+{XNHqgamDZ=IyorqyKrFZ*9^Wu-Q;55e=_m=Nb))u4}1AeN>~M@owAtZ zRbJL&eZl%GTPM}~I+y>rq@)-&^l+QcCUVej#0GCxP6g=APGG?ay@b*@M0Mv%vKp6% z+Z<=oiXYk;^d8YZyf45*{BtW{8Un7@!s-k?FOD&f%3%L~zRekHN1&M*>*Ut6_uBF! z=g6RxCbk3a;!Q(E1*+oy)xpz>q5lo%{q{=tynjmX0?brBf)h=KX^9Qb7l5yf_3F*q zuRYIPZs0Hvf}^8Sh~@_LQ_Ea6fQn>UIwxN=Q^PmnUXEPJ2jEThW`VU z&{4AQq|o=qd7mZ)TO~~R>EIi&{5FIXJH?OJ&DD%gG?%Dz>h7TnK(zAa28Y6ZfDKlU z!DIS1uJB9)i?5S653$_H6ie<_?&?M)4Cye(;CK7iB~;X2Z+Q0gA4Rb!v_`F>L$aE$ z*HV9+(RyR-l_V;#hvI#?P~Wge0_@gd0)bA~CJ3?qtbn_h)LwOffg;OXe#vDy%#so3 z9Hs6s9!YWX58AVCcIDbS%><|YS18(JhfTCTmnkndp$mb+|1JpcM_IghMy%+ z*ceN0#$l>);~APZ_q*iD|AiiGZ8>*FPf(|v0pZ)=kfm%e2m{n)k+ib50fdc?ucD;7 zSl*O8%d_RslAAexLn48&mT`Z4%!9c;zq6cQkTIBJD49vid08ohG;v7SAY8-O8$*t- z(kwJ$+_Jda&QNm+n=Z}2ZUB9D-R>>lI7JTs%v{w_galpMbPPrIFRm|VLlr%J$~3Uz zp6Tkm_xjTg4uVwDW3Pg117GiXTFyuvp9k~o!UMTP++!i9QFC}t@kJ?vj!Mh$Z_9}Z zKVh)>AH4m2(QN{a28m1gV1vIil#jAu079^f`_=z|7btwf0Ne7_?;9y6C~~4%5gZxt zr1%PZhJU$k;l#>sfSXWc%87cuu+!6@X%L77?~JF1i2dsyUVC;5BttCDxbp20ze=i| z+{CF_GJE11QR%>K^!)qfZQ1yC&lUigFEkE@%@dtLs#kPRZqSz$>(I)|2;)xJMGf@xR0n53}w<^@B>S+Wo{v`NW_~pYhB2Dna8nc1p zk3&kM_NX{}(ctERgutMXjEn-}4A}K!CZa>>p&YDlg4^@qo~QJrW9fWi1_Svj}# z;uDE`oVa*yu2Yr_$X&)DxIRSCC}9}*k-V0+BMP0+5iuh@`9>fY^xy0hLaN>>&nx72 z4JJ(3;f+1OZ}*E8vWT&|-bAGh3z~BiFEskFVkYIDAj-_uj!y2gVEz4Mb`%iA8!zJGtKa-{w4*awXclXXL^Xl5|kR%&NjMrzlYm`)*02O6MoF)2<*$-ut_yy(FI*csX z8SS4Xj5d7W)u+2jZq&m@uiraPiX_!o+P}j=tDZC+0S<{X;{wg*ibS2xaLD(k(q0m# z9K3*CV8qh^w)$@jht6q8m<$a9 zU^zByf4FY?UZl-iQ0O3Ce-3Y3T!Q(KM%fYd)i7{1fQ>%>2)G<~3*Zo-Oaacjv<}`g zxZG6hAAS}vj`9YxhK~Uz_2rj-SU^8`WJcsIveOU1&k2eSdJl*9CAjFH2wP%|Md*BF zCHr5IQ(Z_p!En6>49>m>P!dXiy^4}X_Bhw&iCnFOoEpdZ)x!T)!`D?`a~c=!U;nw@mB9$IQ^46e6!LO+9Dk@L;UwOIOWN3iMALS8QgsrU%DzYgrg{T{`vg7U1=MjbJb zN$VITz$lv-Jo;YJ-}4PitJ}=NZK);*sp^ijsXcvOq1w(Q{rA#yPz??lo&uCgiSNl$ z!c;0!8be+mTkChXavZ=mzbt!fAn@)9DUXsA()In|PKp*vz8 z>EKs7vq~kBt=`Go8a}zpJtscIwkz${+o9t7oOnEH77}{DKg&yMo(5F5Ob^MLea~Vh z8>IgBpJ==Hhcsy;BN4g}cms3eCwWSWtppy{n|9{|X;EmAzry9WI}lJe^Y*WK2PWKg z7SDvNN3{%!tPvAS#zX|dJ-!ND3!PLS?icfl#c0dk6ciNJ%;<@Du|se{C*BQqjo9AL z&y4-f7-PL;OscgkZWUR&V}_qkfajWG7FPfZCiaCA1K0Cg=G2YnK$O<@2Fv?ZFsXX;Sf0`0>fnvq+)eUjm0H3O5hAsf`8_xrX=@ z2@}YO=lU)>+3#*5C=ZNe=M9fE9-s1TTlLLu9_YhgoDbkvQ8yLvxvsB|bzPZ0hua1G zGXnl_{kfus*F3jUOCXPusioisNvVjtH{<63>!v&zS5}zP`+Ndj_=f1` z9&f&-gh#^^pyD1LS%JTb`J=wDHNX~?4He%XD*9_r?{kz58us4$H>h)d_@)Y4n`~!$ zcK-fr%8Ro4@ADC&0#8-~fSA0x*lGvdkD?xKEDRI$kYPrAjPAh%w2ak~7+}Pwh4f+H ztU4DcsR}`ei6TBI(vu7!x5=BJuT*3?yl{DR?tLQxCOYR>ZtP?l8*B;d@)O_mt))Uz zjsoL75qL(u4rE;X!UJ1-Q%VsHm8CpZeb053^6anzN+Z+B-@(hrmkWwm(D;Q1F{TTR zV4-BCo@z2pWqub9%C{%E6atamL?8q3kFuf72G<$+c6S668S|kuu?*K~XY^ORhP*D1 zk`eKB>DMb$Zl?omdvWE;jUosMUwAfN7JO~9Kur%R8!uJ=j%$y>HHl`Sd z_+cpuxPIbi1{n_-&%OYCU*V1Bl16bZ>1MLqs*)bNp1f5Jf|3&1S>9wr^7eLtTrLtj zvqrtP>~+H7ec}aYda}N?0lJ;K*w5$Cq}N(T+}_t}RoA73v%4MvOTG)Lq8_Mq_TKvy z-rxFv6+_c*o12BF?@75ew$ZwZW+6V#ZKV!WtHx*NVpGoSJDfPD`c(aYA8Fg=7C;^o z_ql=p+&1TNDNIx>cMiBjL%ju#K=MF_h8X7tP>`XeGlz-Ou2OqrX5$>Z2``xM_!D~H zc5{>MTkwYu7sWYx4@Mhz=c?ZRcelmU?KYJuc_d7ID=1bMR#9bDp{$o}a^vMJqA^~= zjUUxn{67F806}Y8|9%k08<76Ilp^`Y8E=CPN==2T{ghJ;lAQ;OCl`~C&wQBSkLI?) zL`>@KF|ZQ(S#o_wSRzQb0r)`7gZY&!-C}We`fGDRIn=d!V!OPw(I%Qw_m2JG3?=Po zqUcGs7l)lO^`vO!jf(j3x}+&5S)e2)gNsnZUuPt$zDb-jAY_>`M)L92A6lowf3Z8S z>INNNp?MqP?o2a{=pDlGhm=sArT>=OI@Zg8Hg44W1TQ}b2fWoe%aKr}wN|f~8!*s( zQRPitzHyB4lKK5PdpBraC5ZEHB-wUeG&~3 zv3#A0GM!W2x&@8DFdQhC+@NeJJbV~WLO*(=y6O4lsj8d3NWR@d{qMlFH)()Us^y&9r=C^7y+G8w0nCrA^uA20IOl;-wL}yyZ0?( zZ?Co)ud-cP@21h%9hcRho zGNqrE@4K8g)QaD+kDXpOB;+wp3%@h6dr#EG$cuz@1fV-Gn0{o1AZ3cIZi$}A$z-#<#rVR zlZCMW&Tb-JYwUrNu7#`(HvBUfD`tyVo zS(Qf~>aD9e{FNNi&1uqY@`fxzor_3{Ab*=W($EENf$-yAl+=v_94F8zYKpWS_t1BH z-E$8nd+X5BTfhh*a|=8fZJs+Sxfxz^gt)aCS)Nos$?CJNw+EILUdipB_hLbn0qAV$r79Rkk_k(&8vWefbEhQLG z{_J`(dk;1cKL7_x?X|CskIp*X~){|8@$i9XbaEK$7u zs6C)E7!+gtEX_o;f{qN~Jfkgq3K5Xh64_4n>L+Qxrb4c>3m0eR3;65ssC&NtEyU&5 zHC5ku*2 zDU5fB717fQMpG zJMYAX`sNtx^M`tES*!xj!0AxM0w36 z=As0W7=lrPMRRw^@~gw+^srcG;?o!28GtwAKH|v}RiK>qL))3~J=>47rzyKSUiwz?-E;i?I^`x#$F>xD58@F(V!*5HSGuluj}UgqdtZs{vmj8; zDu>LGB2WtSE^eoUyymsZ_P zeX|r&3T$@kH!iMJ)Xg<{A8cX(UrVQ;z-?YrIlF;T`1aYj*kNywdU)W!6_*d2xjAns zCrt7NA3O3y^srdK1JaAS#{y$+wt9FdCzdF-4ME#sxll)*77Jd)u#wH}3yg&vkns!x z2bNOcjeJE0k`C#lc^`uj&Sc+Ra8d8Vr^9uf^aH2u@e8rt4mNF>q~$&lF-v1uvz%)U zS(t0M;l0W2h{3577yIH^jgK7&1oM1~->iWbt!WORthnR5Gs z3MM!kr(YUmEQmacI9tCPo8Xm*ZO`o4E*b#7FWFR7iA69FTKokC`wg@=MHYPOnZ~;= zR%IMm?864A#~3us5R<01jnT24THBGw^cQ!Z{sow~-ih>uh_!_o5DhxMafY|{6&8V{ z(IQ4NnYt7DMraM0e1u9EtCIwXQ@l=XII1lr+1P*nSR`~C)!jmwZs_W`c4{O4(-ClY zux$cU=>Gp23#ZAogoodDHxbl2%gtPHM_XvbdUZy%m_PJwd2Tk6Bo?BT*W0aDKWFQ- z^Awcy=Y%yR|Jy0jO4~$VB;+E64n)S#9wV~rPTvC_`z14L;qVO(j(q!FVgsK8#0LSg zz4F8S*(q>z4kR_&XFO%Ogj5NQy`Q07s> zv%Ik7@Sp7PQm_<+P_P6+rysv)!=RLzyb6SM{jCOCSfQDj&cz|Fp{8{i4hc^2KYYd4 z0Q9^SJi2b~ZIGIG$zU)@S&^|_GA`$WQU$07R=NwE$t0OO4MwKNn;BVkYLzkIz3z*qdl0Rd*5BRRwqIPe$)QL|cW>-i$s6a_@P`l+HYKHELGEuWU}^Pb7?8%nUo2--y9AdH zMDHo`@@)h4ozhzUty;kK#8c7`=Tx1A$JCCe+9iAv*{GaUlak&{S*u5!g@}JOxXr24 zZgQU04`i>WuH6O%efOryt!c}J6=$_k@(pBn{_}tb#grFWG6LTe{4hnisY&5>9Hipb zb$|XUhBnxSL1ybAk(yfiNOz1KD8950x#DG-@g!E6(4J**E+S*Ku%`P(GhuSHt*SCkGDmKdVgTPuS~M?WBSfX=?B}`vPj1I zD@3W*2?3V~e#>f$p#M zcltfy7p8T*!Whc_@9NgB#lC|+QREvG9a0|Tk#)&%N^Kt(i>yq&6LO0{>xiCgTca^# z!2HIJ{goV7F~4GR=4tVdX7a!J5S)VzTz<~f`bn@qFf4iO3=)Wef%HK_G1*ZhLGrN7o1Pb6eI6upkzmI@s^>Pbs2jPe*2?A zZo_CGc1TZ#zSp zhet#c%M56gew5;r=TkWKW8FvU)4aNw<-#|$yl<>)(@A$LT_D`1&lx3jc_o%GT7Q~a zE^xX{@dZd;B=)6m40W@GAB|dS(ND#>fkkwx^{0T`8y)7el^PRYKkBff-X}oVjUIiB z08f8m(FPowHnEgB&{9Tf8#e7rm?^&R&v69j@mUvYaFJHFcXbEQoq?q}f)w;pZecz- zR$>vS!2~e2f-|A(Z3Gsdjk|(taRwgKGa#x$$c@kkN5i3-;nw5S;ul>m4K&gPF_5u< zub*UmhgEm#pxm`I%u`e7P`x%6m_yjpzD&K>+BLIs{q?{>TvtO5mi4?{A~zVDAYoXw zcrNwc)VsOm@Vb_-xy|>*8LykEMg!zJjVIC7j^Z~`;IjE(U+YgLvdYZg_8SM${VIdOeiy0EbjA`vw?K3`JW z59OfvG&%`V)gclD1LeTRHmRmY>hdH|+Yropo<}m%J8tQNMt7L=5A}xn^+8em0zFaE9_as+Os-5! zq5kj&7{uF)Z&J@dY@$x@m3u?$Cl-iJ4Gd7`PtGhwoqi!K@VZ~1LzJI=;*{&@C+I~{ zXAnIF5>}`x*&iLnW~e-RVh#e~)F*5gKxt*yD~KGw-b1h)qeDn+1Ax4BdZmTW%m1}> z;1+@H&t(uCVs{BrcW2dfl7Sn4s|VXZ zBIQQGh?445lO$h%4C$0w z{6fd4hq&p43VtL^Jh9NE`G}YF=gM!0&e%O_uU9i_DpH1f?!f}y>Ld0P^g=b; ztM+eNiYgJJhobSRb)Q;qh1Scouu}1NW%zyQfSrjPsy@7_3P}sWZYxn#bsw#*0I|@3 zGU8Pt4Cu?&h8+&c>VGhQe2xSo0I%-PWUjZ>hbR)&*U0{El8-L+o)*d@ z^#xDde+y=$uixKcM1R$Op=OjU#yIUoE3~SHPXFOp#J8KnCx5seUfcTNu1ClVBA;NJ zy-U?HB*#~OV;$qG2euzJxc!KkO_Y}@7xLn`b}8z_+FYmKiz_`rO2Xt5bb&{cvgf&P z*Gw9WN;4qKLd1q__{A_29#c$8x&Mh>A?AfF{UT1yPAr?K zk`ps~aI77AK7eHx7XTwZ4Hd*Fd_()HrT7{tbxn#GGczA~1dN^jT#ld9#;2!2nf*wq z0(*87)ZwQjo5ew{MS#1)i+ADd4$$o8pzWv}nDAa9(m1pcI#kuZ{~JKcxwRTBbQ|l>PtJ@?Ggk`9yL+=;(k=s?V2^+ z0AzODX0eQwgz}sMC2n0P;4uInwBkM26*>slb@%lq*NQ7aUsVI@F~s(xShti>x0TDi znYz*@;WT(Sn)i)e9|{o~wJEbF67g>Uc!vWoHeN3H@Y;ttYZBzgLSVAo@ybqq zi(Gf`tdH+cZ~Eg}0go!lud@xY*Oqil)A_!B^Mgoqv;p!59x=!y%Sx+n>)gBx8cC*- zQi=?>b)^#Dy{9TuMKd|S1CU^ux2srd2SJhM=*3xLgDuzJ9&GnFz5whP+`HrNK3uDa zL*pFFwbRT^)dpMLF|~J=+?fH27qIP}fbl~mjffJZDq=qF;7K-6-Ag&2BOB+~cDsbp zyX1PaFyT;^Jk?+m8Hx5kYHKye0kVvgU+2FCGzbtXfr$?9fbb!nG&VQEwQ{TRUG{*< z@?h!bpb%^x6*TBJQKZuy=mB5tgf`-H43uzXhz})`7a`zU8soo3xeC1->g3Gg&Hl#tJBJvLAo9-(;L0 zBhg43lmxhpauapaV8X*U3|uDC)&9W<>-m8%ChNx5rSq9%xZRwYW4dTy29270)uB(?yjR?17tt9BZU6{$`a3^ z3N~U+Oft{~-ry)kPz@B!OWy?I9C2+&!Al@5+%jydR`$Y2$D41H*e8R!I$Woj_=SIM zw&KA9OoGHd(~>qy*^1cvq1^11UlfZc`~&3xU->THJJkO3#A6`>dHJ1bW;%bb_X1Nx zn$q+zVgaIs@eKm@>L#L<*TZER&r(cV(4h(cBkxb}%_t`bGUiCXzg=;S-t!z0%z{XM zk8J>VbZ0M53U~}H$i`WNv}V+&k{_8RHwWMGb&T5xCJ0}Q0qnq0t<5UWx!qPGX=dyy z&k_4BTyz3@6R?DaR`A6kw#eh|T;}eRU}feJ=sHYVCeZ;{#e+4}=$JyL3M7r|i&0W6 zIvyC|!lPq;4C_TrKMKADL9}%F2}-Gg(tv?C*$?`+n1B`!1fn-+8ISo@_^}(Uk*GVR zQdjmd+Z^KTg22k6s%<~**FereN5Or|PYwiU^*-)<@f{!7Nm?S5&>13NGkSLVM?q$C zBgz7Q-f;!|X!U{pNRl(I8z@e7wr$z^T5hyAh(TC7_YRnu%1@AQ0P45L6aA0Ba%`mC zL#Srci@3n`K}Wl>f?GpYt~)&b$lGOomU@zh6_b*WD|xqHntNiAtyn zov%webhzi$G&7VN51BQ9Ue{W8)x|lp(d5Gd(oFv#AB&G%Rl^KK&p)yi~Rg zA#6kBQLqI%pN5b$WDVnYo@Lo3DR;Jrn{O}?W&2CT(jAh_l3vKHq*q=8n86aFf=?oX zHnU!-fDAgI5=nK6baZhaF_Kb9^5SNo<;G>GYSKB7O_mV%`EV?wMNdbPie`IHSN0(j z=b*Hqhfz1WQf`k$kGEwqT6@83^x~XGX|Pnwu}q3sU(1B$=w%iJSYThZPeAaI_4koW zRAhKFN*KHAuiNE~mC15j1KUFDot9N0@8LQ#`FTpb4skYKO!}oOuffC zy$Xub%0th;_VU-}tW6q+5Nd|K4j?bsMB??I20~ujU?V0q`t+fQc#EnK@dT@8!H za$t8qd`a1n*AvP`nCt*byBzjHCyS&LhSZxIkTBm)n>ERgIwfxg+ecnoKlIk)yy>%_@4k6S6g+ z++Upanw!U=-gM+c(|8NO^=$ zYx6fgYb5kADW&BmlFi=#wlpk-8Gd`ebRS1G5`#!ibP~HZh<6{tlWq@}O16u@!k-vB z5I-71tlhT7H`1JwnpN6kkK*ejPAj}hj7{ttXGOVx3?koSn{(u!k!as6wcl6-hQF<$ zGoES}#J!5QZ3@rE6Lsm8sS^snO~_MMhm;_LL+~FPSA<#{MC1fHZRa*^F0b+O8$=@% zG*qb&8yToarGY@N#=jQM^%PDIV(pa*0?AiF6m{hu9_rf&I!@4CwZ?A^&l6l9V!3*> zdk$sw7$;nv+qZtUdu#8C*VMz-uy1~366gmILmg-+)ZLg=R)odd*cs%m!OJ5cr*a|~ zcx3K9rs!efJ0Q%@Ze__~yDF|0hyg#SVQyZ_RL{mma2XpLaTmF{&PZ&m1CDuJF}q@Y zng5(TWUtYz%jL%B2J@9VK4VK|N-*DW3<6mqV3xIbUaq?Z+6Y8W9YW z-o+NSS#55e}Dl%HC-xR4RMHC?o zd1(;Mik|quQT9Vr|0-eBuwo%T#3>RT``In{-?P@$4#sHUX8%<;?@*1k4|Nc)zJ5!Z z-?OhLZvscX`53`_N7^PGE;#+SQln64qdKv#mVVBgb%lq)8Ga6+Dk(mAgHDS6y9b$S z0XJ$!)C}%FSYn_WuDj~v(tL};W$G_?(4TTRr_U85J-iPt=d854JEz|B%~ZligYTbl z=jPE-e1}pYy6~{~PvBb4&KWSqSO^V-l>XRlr>%Z18TM+gEllR}>5;tQr#*j@%l*M_ zO%B$IjRJM}jgM>r$ok8f=d68&$yuecD27$sTSTSa%Xg1KS+VnhOk;iJi}OBs#HC%r zM(xRC&{k3tSa>`DZnZ{Hm4NM3Qmo$zjQE?h&AsrW#3xV?*NAa=^7|eF6HQHs+>CZa#v!Ai+Z8 zjcjbx7rpDxjR92+AewvvKhX!@({14bVt#f;I+gjmnT|dGDiDJ|0?+Oz8mYhr%S8~7q-+f- z=nLu*s^Gfrf8`=`g2j5dy@=q$V(n#1vF`2{5ye-KC3hjH$@7)&7Fh^PSD%Kkb(joy zhYYq?)4E&d!M7`-8~G$}4>wzuTipotM``9#f(bro-#YiO_3!2j7+*%H>T!vNa=a@= z{H9a|^N*IE2H*|Q13ed-DPrfY=A-J(cT&v8>{OYW-hK}O zZ=x+k?@}w_l1pQ*ytOZcpQ1(k>oVZwg@9siILT!h|uQxcF z{3{gU2LTsn7OODbDO$a8JuG*+LVUwG zJu)!&^yvEABC)XM=rOI6=y-?|lZsGaHNXB#h5mOzEP>`H>a`{y~9UlMP=3t`~EIh6~rKB&=H7#@96@v-cI2c{Y0@tpk zUo(z9BXfxLUb*hY$&jPaaYn{ee-UvKY_~gacIYqZjFB7{l`?)g9Pv2z2)2WQVB&a=G?0Pb%hg!)H65_6FlIj8yNdhpi#Ju-0RQKqbYj&e`} z4Z0H)lmQjwBso6~1M!yGeY4+8;>a}7zbk`hDFYO8+i=ARr~;_}M!GPBkpnRB_kJkArHG_7x0uLN*i~~wuHP6FdL)S*qXq%T9lHvT2(;OAp(Fb;} zqM0aMI$@Pyh>&>Uc@;27Rx`gmsz4tUvt1e zXW4J?^4#+NhDscPJ}#2bNVcT8;B$|Fn11!lYOM$q+I1G3#>&Rt)yax*5#}ddlQ#?- zaI7pLgGxEE0qg)31G61gPxs(|??6oThujOjgR9@vR(vHjg(OCWPk@!YFh&I?mzm>2 zEQ_{@PT0+Y;~+Asa*6j#t5b-10_upTENe}2gXfibDqwBF^Mjh9{?osW)a-hu3H1}d zX-q9MU_|`b5D~z1Q6En(7yhTV>MRXOrxQr*=|~QEh{1QzTtAKCwRlD_x% z7rrQ{NM27cP;t<_bP;u@Aa79Tc&QD|wdsCYlGv+h3?#c9j?2tr%Ur~^t<{SaVTGALvQ4>eh3|HD|0<*72jvdTfWMswtj^Ax z4a<`ZEKf^ENzRN;%RHpz#oB}%`-EJ8oc}&j)GnnT#!OL;Ena#8!HsN7W^X2*ga2GRdAsTHLDb!es9F zoOY1ze@P#ipmM`2a^=9Wo7;he>;&;^MSavWXpn<#`Ba&uCopun{n)8R^5V1Vv!7Y6 z<1Z!dZo#_Uvv5(!s1~r@i{ys?1-V4flZFX;Vgsdf^VL*r%+MP4meULl?A%ZO6}bZ)c5WTv1QzEojqp$y6`L%x5s+%IjhK*W z+#&(yS6eoNP3SvC76JgrI3rdvEv~%`Q28%nUf~p)@w8wVTm-zitj%tr^3JVNap4Qc z8J(3HOkhxy)!8afIzCk>N3lvdx{-JLCIf)qh; zw{D|o+A0iMI@$)J zSjJP>h4yo3g$5!)2%ojkh0bS%1s4`0>%IZo5@YjCCf5t+0@Pm!&&$Gs_2B}9U(-_5 zD!{K3BJKMR)! zE#)p1nI~xyxav7Wy@SLLY1n+aWxqbSvbX2Pa^lS~|iSXmM4I zoUijE;}C|C*{<{ngFo0Os0BDCWWAZt-PH;X&mXck{&;-&n6aN+XX_m1rP$zO`jo7Q z4Q?%d{P~*&mR;;P)i=-=E4#-*U`vw+?G2i*#GXN|cWlr+x1TtB>PH<|(_VWUeAmC{ zpHyZ+JO{}6XGl-zwi7|C-Lmgm;ZKDB>tvQ2$7bmn9i84TO38sWvGR6F-!~=mGwhl z{N4V`k;_hUhc35V5LOo(G(;hw%gePXR?zC(EHBGkRfgDZzP$g#(dtu+vt9LqIJ|9P z`GnpHFoRMbZezBB)qx*aYj{)o&onRP`c&dcEbA#Fj77Ho6cS?3qz1oYUYJ`7-t1DC zsU;Be$Y{dIR$5xWzROO%CIp8G8jXMNb6gOv$Xg}UYluH#EF@bMlx_4h10W6tDg5I~ zE1qtaf(vh);#h0fP&k#6-T1dI(56UUL_7FV&F{~?AlTh`f${#HL6+n2(rM7!^)32@ zeT(R(NT&x|P~wf8zwI}TkMOpbA*V76$F;JWlrO0;+X=DN^|4NBz!Ctz*5PA}up4ZM zcv@i$U|4g})v!^HF=7DlwZ(;O5*((W(c~t9UPsvFDI>l>m!6yYy{rgq&ZRzDIf3Z& z6UKV+lJ3OmH05+?1(Pp)2QSA|OrFdSN$vj73p}8} zZfTjKa8u;uo5F2+=1EN~*|gztl@cnPVCPY=8>^~8`@fu8 zZDKRIWqo2agPb|h!>PJe75Cb12ml)Nnw-UfScWm4oHg2dLIpBMtydDfckL+pzx;ah ziYZubbg#TBKl~c3w~;2pvYUP7w$Ad=YoE>9&OB9w0~u_j58W&(K4~d1#eV?L*iUBuy=u0&t z94iEha1yST0LF)S@z23Z$e7OMlYrx1eg;XTQelG?2-}8Qx`lJlNrZJX-!b~M zDa(eG*DY2c;IZ)bxXKwnCct<@NrcuVE&C|rRQefu5EeeLt7Iy+#%z6$bsq4NRBDH1YUJrh;U4{ zD*h{r2ZDAWY(((rPK~bGaEZupSOe(+Sx>1$FXaiJhT-ftDW?%yUlGc^>gNy$%AhtZ zw0^Qe4s8GOvjWEn+r${(vl8tUOQt2=UJX<5!`~M5ZTfBb z&QeV2TbYNfh49kRDl!VAnO^6soopKJSAfjB`tRkUK4Wc!zB~T(loBg>nUwRpapZ*a zx0?&X7J+x{>@10mc**8h74A1P*6@2PTd1y&Gly67b+zv}h?9&k!n0oW?(5$5z26J# zK2v(SVnyoCqF*9%7wTbHGK)Gyd6DqMN(ae|ZcLp?UKBK%83}O2@rwu^4$_g`)?a5h zZgp8dyuvOo5m9ZELBHq6S)5y<0#HJgtoB90`LpBG*^20RdIF$+l6(}ZaS}~WRfNv? zun+Hdiz9KWLYct4@t2~}hbP)3(<`g#8V9(>ZcsH?rraGP$oB=u8Uz`Q*Z{6UGm>~B+B%z?b~q>FUB z?Mkp3n=s1IOYu;dgs zEsq^Ib*Y5xme+w}fhaeYms+ozFG~WY7m!ygtE#>81N^rDjUHB>ty8V(nh78!IQ4-T zfTjKZhG((*6zgiG*TvYoik0-hD?I4SH;p*JYXa1l8s>;WP1aEMeWA8HK|w*7L^eGU z-MQKGK76OWZ?1j*J4Gy>d^yn`8cOXA33A^>BJ*o)dyrD;S(5Z@Gh)1xTKb- z(eXKuku-c`b0&o2%MlSFkv!Pt!3tvZVT+qf&hjnMR%sphsy8a|Ier8@gLry9*R12 z187V4t^h39!RGk29wZ)X76myKj9@R7E1^xp*L8#xN4ue!vEF5$f2vm1TsB33_8(Jpi zJdb&R!+_wI!UNnY9Nr?u#drP3R^@kqJ@sf)2c05mgq7Icr?c?H8=;bhgFs*3mr3BY7sDbEI7Qs+@PKSIxX_x=+rXe*-vfVAUlxuM#~~ z$&P0YYR5%lcBqZ9wpr;+yEJ*Ey9+l}Ib^kHA*-TR&ht2WNe;CE?}z0dvalgLa%k1l z)$$s=rS#mezyTUVU;?2aP-Ac1r<2bN^!lDKus1ajfTD}zSXDDg1~LlJFnten1Y};G zy_<_5p(z2Tst>mLa0lF|I8A=W?2{DMAYw3FM8J+;^ zK+}}@&E6h7kBf8)AFoCTs;fZ2DvV9?{Ktm&TAMxn%F%{Lad%DPAK5f}BXB@K?a8-r zu;W%=Pz<-_&M}8JB<7DW!K{5!OC=pNZph*)r61XWB6TY3Jyh0WQV3d9Rvcu^8D{!A zSkmRTGd(& zK{Abkk_#H`hk!}fx;OIv0U5t)Uc*|4ylzy1)axajU0 zKxaJP!0enw1%s)_lCQ(^)Ll7m3vlDQyih&&Ix+zfwVvPT2_ECsOG-M>ZgEG*r&L&3 zwR78BgqUsh-C^UN7Z=rfxbo7t&xQxN_G;=lrGKo$CBNb67V!bwtpk>yd*$r`dUNh) zkjK>A+IN#V%}y=A0%+*$T+@G+H$iB;)n|2)>q6%xlAIS(^FmFCavgn<&5Fs_k}jNsWt!@1MGlXAZS#>+pr)*sDgT_vrbhpsGg|yiD^(w zhD(}4Hgd2MwT0t8v~auhp-AYIX0vmTZ_}krDaF~+N|nDQV;uN8B2K8(8a5)b9cZ|^ zW?s`W!#(vTo**VMFK}fm47T^N|4A=WEe_4UdkI>1HZS`zhg$`afaf7DUx{-_bD2b= zMaA9WIo7&aI#4|!V<8MLhN|4n(i84VdVHP_$JtP73mLNC;QQ?ug(#v&Om-+O0_JX` z_j?_xAQ}TWsKm{ggu4wWGs@yxv3mx~XF3=*O63d?u=)pz<7UqcM8H|UKM`QEm|WG% zm05gYzZwm+Oh*C;+6OEYfX0je065Z7&KFJ3Q72bWu92`67MDi!+(Gn<@q7!SJG@K= z0=@w}MIW*SH7o_MI10rYc>?xe3u#!W-w)OJ#xX2%+nmWZqdcZEt?P-oMiGH3D-3-T z&+yueprK84e0VY4;wpB^cwfR)&EMFI{3p<+!UOyEAITtdfZj(n#yom{`8EcWYLjjDbKx^Z@M7h{HY;cP#?j>-9 zk$~Ic68v}?q5>Xz9@v(s_2^u-gj&^tQiR0RgYerwhyJWe?fbkKb;v4`)94VXDVnLt zx4_1rPmeDbJ;IIIR>bXT_Dm8KmJO!X>8`BJ4TwODRVwPv!n~&Aq3Ku(v85W~@i5`I zYKz-?*%P`~iNk!7(gM+3Rc4adLn=DsbCs`@X3N;m!CAe)^Qj!n_kKcGlej2xwTpuv z=?frK`4dqmC`<%k+2?Ms!GY=$y}>)5ONF=Ywv`D0nCzYqquCBVN1EbOf;t&6rD}=R z|I^>!7wrJ*N2k6(gr#7xrm~|7IB5=Ns~J@1OWr_cG-G=M|8VY=$77$M00nMEhuggY z$+3b)?CIHXkxE0)Qi_xy-NtfxKvZ7xBe;tDcx#aN>T|Pu@eDh@5H7lb>1^V+km~LN zbt@<-&!Pc+@7{r=8+l=KI>th)-Xc%6jpt8A+|HR9n)K6=Na^0uCJ%F+#uWOPm&^q| zLgM3vz>m6iR_J=hKnt-)q{VFOgHK&)i_WhINBVn?y#vqq$D%g9?DrPBS1XY3rM3d| zc?Sc|KIFUQrh!x-UoeY$%4Ra3GS)cgo`_j0vn+Vp^vJuk@56N8?vPwTD?Xysdm&lS zk7XF`;~y$%_P73mR;NyljozuWqbg-NW|$7~lIkDjax$9GExv$Ny4KMn5F>P85HfOI z%fWdBn-`4ymaEgy)ymrJ-7zW6pY4y}ja6x{tybgdaQC%shc!F~ps%>~o9C?Wna0h? zu=-7_d*|SminQ3U69F>zNa7_sv-qBZoou;``UuVM(nE{4aXfq6^CXnQelw>Y#~xG* z>EMn7$0o;9z&3oJPy?L>sk;NhU33a8-dyne=`ip|Eq#q?ia?F293J~ zv0aM~8>b#ivu}#Q@Xs0S`1F6?31hP;t4hfu+s9EfvwXWr>Xu!+CIAh-P58sBnU!?3 z&pP57hy9$Ykb6R62~{dTVsY7Y4SZ66oTTiY=*dKZO?9wtxsq7=gA0^d3Bm?rD(26f z-Q$OLYxHkV#VVbZ0eY3bp=EA@bn(Xo;Z_cJ1kVVJV_(9*m3P zTMc@jBQUZ3L~$6?fFM~i?6x#L{pYT3pcRig%a3L!z%%P|#^A8ybqr1N?(FFc=K!t+ z%LcP^t~b?y@8Otn`jaoKH>5>w!*`&$~w z3Skd8N~t{QgE+sE!N#8$Aiox!HG8t*r zUfO+XOSYbXMq`6)yS0@-XTnZWdIH6k0Md6^?C@rM3Q~Pi)oIh;fKUw9&(S+uUSblM zcJYubyUnj5v!*&_-KO&2Zbx6&qg!Ro?dMerZU0{9+11g5ay=-bODT}Ll2Q% zhSo)#P*J@)99aW~H)V_DOu#PNdSmDJ7&R|RBy2^mNeOyb0i*00;~^~5`sWBR*aV7h z?@cv?Zc@QuKYr&E!v0^!UgnE&&mTK|Sg>`Ozkhl|*g-roUz%_@G1;ZVF{F*%`^O17 z_AVH1ffXeuewj#8fzI8;3wdxj+-(OMJ@joFXn^W3JhGzL21(B|SSU#{!a5M39VKAHLGF;* zL2S6F7#dkRIDfF6wE>8nEjUaUQsw`$Jvia;mzu-73a4+R4lW%%QG$R$+|1Kxrp}E1 zqZA!Z8Y9e~^8~GQ-<&bWWUQLUqeQ}}<7nc_@e1lXG^xBo@?mkIi~{!@qpWHOF2+;O zq!}-x?89Zj24^2I0Q>GkbNqWa`P8j;DkqX|h&*t54A|4z3sy{?;WUbY!~eYuztxhN zpus?fkzpap;xP{Du#*rHe+?9&tuy2QRC1M71U(l0AOx>;?66kM>8s+s(o&4Y*A~XM|7WSkcb3+ zBMBK2=M{r8pSp66VA$FW(ip)p{L_@{NwMx$;#8!H@WAQgQkjF{86CB%eYEe&@^8~E zKPO2Sf9ALC+ooqQh_rj86{>4GM3;NfpUdr!2<1S_B(D8oneeouTo@B}Ix8xeO2gb) zF6w*c%P=@)zUucUUE7nEY}dUiM|Qh|M$~;##SS&rjYD4)C-Rs37VhJbIsnlZi>|tw zY$vkvN!Gdk{NaIc0YkmZ(PRSnarC`2U2VRaEh^nbtaH{tpinY8dp_Ft;q6CH^nUg1 zB+_)X*drIE07=EXXlLYv_1(dN7k@#t*GvYf1mslewSKke+KA>X*ki?qo6Um*A0D&X zjm+BN@SjG*a(s-vz2y)T;aY(FLy z#CNiZKNJrR-pJO*pN-H%7e>IPy{%Tp%jJ)XdY9@EK0y>^4h*e&4VodKceETM<5qC! zmT|2ij>L;KSH;o^#?7mMflxkxQkX%I%P_NS$Tx@Yx$#h@l;*Bw1|O@#(vn3L8kWf| z8h`Yb7}u)~H@O9z*!Pkz5<39E33Y|?SjIR4r8WWsBkJw$j(bJE z!~6Zj3suB)GEs$`l=NvPbu8S%%a>ZX%IqQFv4|CJ_l{G&v1j;Elp<*ch0H^HJopPT zIiu|S)}BUt&8GzW+2xmheygfrFX91)oD%^Wk*7PPlE+|jgjabzgm*^O56QFCcpy8@84w6TV*y|I|N?JQ-LJC6Ij0vgFWo@C*MxxZ!sb$b;E4!$FpefSsPKnoKhr$)sq67B7o#QYUEH)gcH&W;Cz@+oJ?jWr>YJf0bXfv^WM!J=bTsS-DtmGXlu_0$3KrQPwJICt;L4?lr4McWrdq zBV*rwi~VjL!SLb>4QAP8^C8`WaSq z^k2!dJ5@mqh$dNwpQKSh3o~)5^NV&Rd2gQ#v%*y^`=ur@mi5Brp`{$RzV^Aoj)wT7 zS^d?(LP?FXqrftM=Q~HB-H+F;w~G+O?k8oy*TE0ud%e@Ut2cG@L*X%D1xlhBYYA71 z5eJTzyew1(c~lkG7XAelcE#`9KXz?*-0+vJ#?)#JCZ)XUHZIJKu2Yfw_g&t%lnIL0 zYw~ajoh%n1UR523ge+Lj27cCwUUP-1HBJ91+9f%il_lKMq|Bh;AT76oq{M~bK8Fv~ z%q;%BsBd1VPRp}oiv`hJssynSxR4{J`n~o5sxRtYo%V<{ab7&!qd1g5i~^GKbU7OW z!PCok(vJeQ1Wi&_<={x10E#@;tKvYG$BJ3!PS!Vro!UmRedOdqHH28JgthpWn-K*z z;wOz0k1lV<3i5!e-K)0hl9c1~fAGJ-83$dHd)StSZQ>jLDe{oqalbxl2AUDE&u(mK zZ#YSzWnk`u_}$wyCc%JF<6(j^ulffzA=*Az7!n6T0{c9~`F(0`v9Wdj)W>Imdg5I1 zIb6poA%$TUJJ^BU(COlE#Ov5k-;527dpp2c0?_YbIaacjhaXT%ue^O;mcP6bWMJ&R z!c2@7d>h-nfX{xnWzMVQ_i~9A2*6T(Qz=eQ8e-AafyrF*TO&pjIUfAbcjzAr?b?a{ zo$pu0?OFBR(c{qWn5@ugsadMDUn|@j5T(kmpAtz=)lkiA2H0$bX2nnJFf&93v{KQo zOj$cXLO@~@P128 zbmC+z^piQm-`^OFTNUl_l83O%rva~$U<1Oh#*RKvLLiqtu2f}d-egcs5aQ!mL7wl~ zRwq&ARgn~%`AX`dRb+$l_&ZE{aKx|8bm$PE{Y+Uyzcb-#`g74cul5I6-V^Bhs#c9z z%8MTHZ7SDbsP4MWzyd+`#TmMe5g@)N)~<>-Ay9H)F7^1kcu*aUtjbGP->q{n{&a~K2`}tLgJE-n}aG?&15|VwMcQ(;F zyh>J*#RuYp-v1l(b*!VR@=b?~mg5#nE-~Ojjaa@K8tgq%v<1vhSukYshs3Ipgy~|@ z(@mEND4c+=;j7_P4Vb0%e);PCw~>PE#m{sFN&l{+8(3Yyizi2c%Vw6}`L3^Te0uTF z%P{f%)`iw^Wm&}+5-`|$_}FCKw@dZO+tK$2XD4dAS=;wC7YyE$;-Wp2;%a|Q9=gJE zISr!XDnAt7DOd*KH2sE0h~a1ql_S4+Q>w&zF4UAHI!+@8CIRrgI!?PO|GHV=8z_iO z1YY16$7(ka9uJ{ml+UXp04;w-bym?07;d=%g9hHe7I}2&=%2#A)cCV!=YBl4#{N%u zWcA0zFTsiHzW$`@_#45?+u*4$b$0`(kZ^}^hpdUvxYC}_j`eL#SN3cVdd zH*vw*4vneTVedN-&kI%F>`iAs&jkXBcBAIkGjDafHAm82_>BljSz`c-8xd#MJ_P=m z|C4ngni&jy_*;w8rgZaXq}0*jZ&5?3L9af1D6>Zh96B$P%P!pXJWmdhvCPE0$S34$ z@Bf8!6h;-F&>0WgechrX7r9XInx3%#pmW@6mDDTyNvC|}N5 z?0ZR@>?fH~0V+Ht8_8t&k+TNc2zojmp6i?RSaC*g5pOI%RqgfPLud#V1jcB?GKFI2-^5vy*0CESf&EKG5tFKz2C{XRVY)R)*{=za!ZyDsd8u zcGSmVJ?2zub!1J>qs`n^^4aCzjJz&bQasp<_Osh^nUk##ytljM4XqXBK02~g_yfts zv(;#bJpRq|Y~`$P_G3}$Suugi8P=dTsVo5_4u(e_92cg=T~vmt=+W*Z)L*qvwG<%sDE zgODS%CR@}CdrdnPet2TTt`@o*Gu*WML^qx6DrqiPmY4PQF(3fF3P1K<-vZku+gWhA z8FPdQ{V207Z)iH#ec_?*X)8Xw^ehDpc`wC~4&6ttyn?h3ei!5C7}}D*s70gXAja?0 z`vnn2!zI^u8}jy>q!ye2N23WgBBWfSxTtURuvOh5N$wuK)zqZsDTL`ldcJFk!Y#o z0O6*T-$&fJ08*Jb9B?;{GgZ26LLT&VW3Jz2u!ivpcmF)qhV2jvEVvX-P|GR|D{Pf1uA5N}t<>s_Sx2q1%?)pG M`M9Dj&|gpfAEq-yzyJUM literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7FaucetCardDark.jpg b/webapps/world-builder-dashboard/src/assets/G7FaucetCardDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5004c5d7ce743fd6147411ab09b100d06dfe65a2 GIT binary patch literal 275875 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ξ8@k)V~-k&h5Z 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 BjUNC2 literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7LandingPageBG.png b/webapps/world-builder-dashboard/src/assets/G7LandingPageBG.png new file mode 100644 index 0000000000000000000000000000000000000000..c3edfeaf0f2c5a8b5ea0b118a55e7db46ce92969 GIT binary patch literal 663421 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%0At+OF1c@cLg5VZu@? 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%0DjIFWDtFnPuA_=y#n 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 Rs8&9C)Dv7t&Nivw^-nI~)^j>`AE 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 N)92zy!9#KEfb;I~_9m!85G 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%0Agof8JapV;pHL>z_Q| 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 HI}iRJmJnoX literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7LandingPageBGDark.jpg b/webapps/world-builder-dashboard/src/assets/G7LandingPageBGDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..580bb097d9837febe4961eda86619d4454ce310f GIT binary patch literal 1213536 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�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 z�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%0AkzDu{AaExtOai`OlSeA;WtT#CFuPe)CA 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

Nt$=E9Sr&w3l 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ξ3C3Ll{$ZW488y&8C;sJA6F{giEw7XleT;VLK% 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 L{vaaflMns_vM|Mh literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7LightningQuickDark.jpg b/webapps/world-builder-dashboard/src/assets/G7LightningQuickDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..882aae403122408bf1f6bef98618e2ba1af1ad70 GIT binary patch literal 283224 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 u=)$_+72-qSB`H=57k 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�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 D@%<>X literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/G7ReachGamersDark.jpg b/webapps/world-builder-dashboard/src/assets/G7ReachGamersDark.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5390ac8b3bb2b158880e04a33c812ffdb881c364 GIT binary patch literal 437544 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

oyo^de5?!VV;WqxSxNs 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 z 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 J1$y!Ge*jxC{%`;Q literal 0 HcmV?d00001 diff --git a/webapps/world-builder-dashboard/src/assets/HyperPlayLogo.tsx b/webapps/world-builder-dashboard/src/assets/HyperPlayLogo.tsx new file mode 100644 index 00000000..de53f632 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/HyperPlayLogo.tsx @@ -0,0 +1,10 @@ +import React from 'react' + +const HyperPlayLogo: React.FC> = (props) => ( + + + + +) + +export default HyperPlayLogo diff --git a/webapps/world-builder-dashboard/src/assets/IconDark.tsx b/webapps/world-builder-dashboard/src/assets/IconDark.tsx index adc508a2..0d47868f 100644 --- a/webapps/world-builder-dashboard/src/assets/IconDark.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconDark.tsx @@ -2,7 +2,7 @@ import React from 'react' const IconDark: React.FC> = (props) => ( - + >((props) => ( +const IconDocumentation: React.FC> = ((props) => ( )) -export default IconDocumentation +export default IconDocumentation \ No newline at end of file diff --git a/webapps/world-builder-dashboard/src/assets/IconExplorer.tsx b/webapps/world-builder-dashboard/src/assets/IconExplorer.tsx index 008a3940..179a664b 100644 --- a/webapps/world-builder-dashboard/src/assets/IconExplorer.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconExplorer.tsx @@ -1,9 +1,9 @@ -import React, { forwardRef } from 'react' +import React from 'react' -const IconExplorer = forwardRef>((props) => ( +const IconExplorer: React.FC> = ((props) => ( )) -export default IconExplorer +export default IconExplorer \ No newline at end of file diff --git a/webapps/world-builder-dashboard/src/assets/IconExternalLink.tsx b/webapps/world-builder-dashboard/src/assets/IconExternalLink.tsx index 0ee170ba..925c9265 100644 --- a/webapps/world-builder-dashboard/src/assets/IconExternalLink.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconExternalLink.tsx @@ -1,6 +1,6 @@ -import React, { forwardRef } from 'react' +import React from 'react' -const IconExternalLink = forwardRef>((props) => ( +const IconExternalLink: React.FC> = ((props) => ( diff --git a/webapps/world-builder-dashboard/src/assets/IconGame7.tsx b/webapps/world-builder-dashboard/src/assets/IconGame7.tsx index 2d198158..9d0ee797 100644 --- a/webapps/world-builder-dashboard/src/assets/IconGame7.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconGame7.tsx @@ -2,11 +2,11 @@ import React from 'react' const IconGame7: React.FC> = (props) => ( - - - - - + + + + + ) diff --git a/webapps/world-builder-dashboard/src/assets/IconGame7Logo.tsx b/webapps/world-builder-dashboard/src/assets/IconGame7Logo.tsx index e3d933a6..531dfc46 100644 --- a/webapps/world-builder-dashboard/src/assets/IconGame7Logo.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconGame7Logo.tsx @@ -3,7 +3,7 @@ import React from 'react' const IconGame7Logo: React.FC> = (props) => ( - + > = (props) => ( + + + +) + +export default IconHamburgerLanding diff --git a/webapps/world-builder-dashboard/src/assets/IconLogoutLarge.tsx b/webapps/world-builder-dashboard/src/assets/IconLogoutLarge.tsx index 18215e94..9f9a5104 100644 --- a/webapps/world-builder-dashboard/src/assets/IconLogoutLarge.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconLogoutLarge.tsx @@ -4,7 +4,7 @@ const IconLogoutLarge: React.FC> = (props) => ( > = () => ( + + + + + + + + + + +) + +export default IconThemeSwitch diff --git a/webapps/world-builder-dashboard/src/assets/MarketWarsLogo.tsx b/webapps/world-builder-dashboard/src/assets/MarketWarsLogo.tsx new file mode 100644 index 00000000..5488bbe6 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/MarketWarsLogo.tsx @@ -0,0 +1,19 @@ +import React from 'react' + +const MarketWarsLogo: React.FC> = () => ( + + + + + + + + + + + + + +) + +export default MarketWarsLogo diff --git a/webapps/world-builder-dashboard/src/assets/Summon.png b/webapps/world-builder-dashboard/src/assets/Summon.png new file mode 100644 index 0000000000000000000000000000000000000000..223ee39faea5aaa4041145a00fd9a616c19ad819 GIT binary patch literal 2716 zcmV;N3S;$&P)v0=740Z|E!MTG=2X`GL9ppMlI*2>Sb>I?QLP~H6D#3p|ClS<)G9ZOrE|(ARwOZTo zjApHUaKR7wNPr-zyF2+41Ox#=pf>`S%jJ)w*8lV_SIQFv1c4nQa5}+v1^PvSzJS)h zj>qHu4#gCa1OY*y6#?wo6`T)9_VouIh5W4u%kzT3P7pXAFZbA^uZixFU%>(3{BN0{mM{b|U?B6qo;oDwJ0X z0z3pTZfCjj6R|xPKXhK{2j1J|E_fz(N23J`E%N z+#o#5C_hUba+4si4FXE(AMLR`!{rBw_qWlgyhRXTAYf8-aDE)#>nk|?e>#0gbafc|-FSAJe#gyR$KA2SES^Ny6pS&r$lUteE8 z#msdcKS`8vUCMmL|5xsPq3gab0Q7&M`%>rZ9FVyY$1=g#LqhflHa;e`^7wl^AVx~- zr&K*ku7z}N7pVVv1-~zBP|P@?dByh%vo}Kdmyw-$37nI{)xb-drY8f)U>9I@9K$nkvbT2P#C43Qm%?y8UOz|uJ)Ar#!0WhD&-B4 z{z46NbC1}E^eE4tXfJkLz_X7cTehSh?cF&IJ)88%r;t}0?q(@iY=S`k>3DQ%~YDNQb zh25gHmE8-HzqxTjy+8A2hLx~O-9W3MtbyIVs5S(2eLaLPjRYee9y6G z7xxvAJ|z$KfB^7qQTD>{^|MWx9MiL#%A>~=hN@Ox?FW$Mx- zdLsXImz8P zqu#6cEy*3UN5q&n$j2u=@xwoI21+M<8`6RlV&(A&klp~2`N=8k@^7xEGI z!w0|D_k2pEkQBa=PKKYyw@047#3<`ha+WwFNRPIfH}a)Eh+yxH^a|I#*e&RT4c&}W zfb>(($yhQQ>}h=??(v-&@1MPiBE5+2mUCTtoB?)eXfxpX^E4)~$DST>C~ov<)*r_p zrv@*F(`>kCvq13_<&2ux{OW|K~_Q6E3?2^=2+V z%Ea(O26Dc-Xq-lzR}7!@w#5$&9sxXZ2C6W%RpQ=TgTo&r&Gp3gI=Ry3xj{WW#CHnlSU@ih9Zf4_7AB-CTA(OLV5dx` z7ZQ@O|xjbT8rLaii5R6y$QZ^iuLF{tR zl2MYrxiO`?;*C|G3ilpm;)Ft2M|a?pr%V3meGbFab;7r#r+0KwIERKq`o^{E@9Bpy zc!shhR!Z67YgQ>WBh%sXBJxlwt%CHdRGGJZ*+|l}$_72n$w$KQbh&@hm&f;M(zCXq zqJbJ}c|ym{;(Y~&k;`xEQdSYtMS5v!^%2K9_l@~JWfvxKdU`h&HiTg`6f`T2?14qh z%ATInKvGs@l7|;+nH77@(~Bdzrbe1%tLf>jKFqI0hr{62y91<0L&Hyw%y`{yP=Et# zaG+EOff_nm(u^AQz8d@0a6<3zagG~5l0r+5E{@ii2jJzb;pUNkZ75j-_0p#!NsoHX zg&Z!fcz;n(Uo$CbMYecjOtNJ$1$~LxFu#LX>oQj6blw=EopQMz%wcSdX#h7PxdV(D zfgVkIb^cOHWcK|I842*-UXnjHQ%m}sk&*m#98LOM$bt1FS@2jw`eBW)T_QUzP0o|v zh8u1@=zqS9g`~HNZwHR(Rn55Z$JG5)4()qL-($zHJeT{D`%#Cn`{(oX<}GBe z^R+hJqt4yz2I7PRlCkm;QzSOw89Jhk#Ga?~A?!kBnO3oQnW7m0%>VXX@1AUQPagzG zP6`6=1%WPvWXAh^FCrcr8INGFd;eZ^EAfFR%@fW2x#j9up)FynnsH2EqB2m&J!*d*Qu zc+AZ}8d*mvTM!TgJOnmz`MpIOo(S?)5D)}zfdG;p2h`ZH`)Uv`I{3Hx^^RNAPu?jA z2m%oV`nvq$+DBlP(}KYM5b)D#B_4pJ;P$6akw_3=Ay5(TXMcm9^3va4kCJzY$g1|lyFfKptl%w>MOr70_PDF~2jlgfN W<{Q=1O5eZ$0000> = (props) => ( + + + + + + + +) + +export default SummonLogo diff --git a/webapps/world-builder-dashboard/src/assets/SummonTextLogo.tsx b/webapps/world-builder-dashboard/src/assets/SummonTextLogo.tsx new file mode 100644 index 00000000..9b4428ca --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/SummonTextLogo.tsx @@ -0,0 +1,14 @@ +import React from 'react' + +const SummonTextLogo: React.FC> = () => ( + + + + + + + + +) + +export default SummonTextLogo diff --git a/webapps/world-builder-dashboard/src/assets/cursor.svg b/webapps/world-builder-dashboard/src/assets/cursor.svg new file mode 100644 index 00000000..2d17da48 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/cursor.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/world-builder-dashboard/src/assets/hand.svg b/webapps/world-builder-dashboard/src/assets/hand.svg new file mode 100644 index 00000000..ccadda15 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/hand.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.module.css b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.module.css index 3f62ce01..5c7eb2aa 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.module.css @@ -7,8 +7,8 @@ gap: 8px; border-radius: 8px; - border: 1px solid var(--Primary-600, #ef233b); - background: var(--Primary-600, #ef233b); + border: 1px solid var(--Primary-600, #F04438); + background: var(--Primary-600, #F04438); /* Shadow/xs */ box-shadow: 0 1px 2px 0 rgba(16, 24, 40, 0.05); @@ -52,8 +52,8 @@ } .container:hover { - border: 1px solid var(--Primary-600, #ef233b); - background: var(--Primary-700, #dd1534); + border: 1px solid var(--Primary-600, #F04438); + background: var(--Primary-700, #F04438); transition: all linear 200ms; /* Shadow/xs */ @@ -62,8 +62,8 @@ .container:focus-visible { border-radius: 8px; - border: 1px solid var(--Primary-700, #dd1534); - background: var(--Primary-700, #dd1534); + border: 1px solid var(--Primary-700, #F04438); + background: var(--Primary-700, #F04438); outline: none; /* Shadow/xs focused 4px primary-100 */ diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 2249748b..30cc006d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -1,5 +1,5 @@ // External Libraries -import React, { useEffect, useState } from 'react' +import React from 'react' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' // Constants @@ -8,12 +8,9 @@ import { ALL_NETWORKS } from '../../../../constants' import styles from './ActionButton.module.css' import { ethers } from 'ethers' import { Bridger } from 'game7-bridge-sdk' -import { Modal } from 'summon-ui/mantine' // Absolute Imports -import ApproveAllowance from '@/components/bridge/allowance/ApproveAllowance' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' -import useERC20Balance from '@/hooks/useERC20Balance' import { ZERO_ADDRESS } from '@/utils/web3utils' interface ActionButtonProps { @@ -42,24 +39,10 @@ const ActionButton: React.FC = ({ getProvider, selectedBridgeToken } = useBlockchainContext() - const [isAllowanceModalOpened, setIsAllowanceModalOpened] = useState(false) - const [additionalCost, setAdditionalCost] = useState(ethers.BigNumber.from(0)) - const [feeEstimate, setFeeEstimate] = useState< - { gasLimit: ethers.BigNumber; maxFeePerGas: ethers.BigNumber } | undefined - >(undefined) + const { refetchNewNotifications } = useBridgeNotificationsContext() const navigate = useNavigate() - useEffect(() => { - setFeeEstimate(undefined) - }, [L2L3message]) - - const { data: lowNetworkBalance } = useERC20Balance({ - tokenAddress: selectedLowNetwork.g7TokenAddress, - account: connectedAccount, - rpc: selectedLowNetwork.rpcs[0] - }) - const getLabel = (): String | undefined => { if (isConnecting) { return 'Connecting wallet...' @@ -104,7 +87,8 @@ const ActionButton: React.FC = ({ const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' // approve first if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { - setIsAllowanceModalOpened(true) + const txApprove = await bridger?.approve(ethers.utils.parseEther(amount), signer) + await txApprove.wait() } } const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) @@ -152,6 +136,7 @@ const ActionButton: React.FC = ({ queryClient.refetchQueries(['nativeBalance']) queryClient.refetchQueries(['pendingNotifications']) queryClient.refetchQueries(['incomingMessages']) + refetchNewNotifications(connectedAccount ?? '') navigate('/bridge/transactions') }, onError: (e) => { @@ -177,30 +162,6 @@ const ActionButton: React.FC = ({ {getLabel() ?? 'Submit'}

@t$!eHtayBoLn{H><;yxaU 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

m!=U|aHcj~2I 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 k+uVlSj$I19q= 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¥pjyh>_@Lh0509o^MO9DRWX#e5)?3_(K`RGL;Zv1;0^ zEI`>C7Gv(la;D5B@a7BhoRt>z1xplBZ+`e)>5DbuVB06W?^;os7uN#Eq_ny;(^k{-2N0^1%Tb7QJj4jSF^bG`x;RL{4lO>zrN+4)@^F}-QPyB5!oS%mJYet)>{fB3Jxdc( zvh9S=Mlq{keh|4^W#X)M>XNK^iIz+t6d9M}@^1F5*s^SFdF0P3ui7j?v){t6g`{&R@v{3$)fcCZ^#2XMO5A=m1413eWch< z)H9pZ%^i2}f{D|uLNNgS&6(^Gj4*0u(}H+etuRDdtPPh-i88OT@;W9hI9aL725Qn& z7BFs01pE7G^T2#Qr))6g3m3Imp=5u!XfEAqjsdQK?xNqyJi@{y}aMauq_;|R^gBCS37;Z{~^i@?3J-5vQy{iO@ zt)PX+U!C_T1o+?ect2q_XV&TpH6;VY950pqRvl$TAx$3?;%Y8Op6j=NvJw@)I`@0u zUbfvFkNe{I`Hh{Q?>lwmS3W%{Q}Uljx9eEcJFlHy1oS8@E(_4qS44R}evI`;GwJ5dm0G1I=H+Cf9p@MgloyLndKY7*EVn1dPU@YjXi_+vJgt8NxtM6^y6z+6!)W|QxdhM(aetXz8Q>4SZv$P zJ~@nD>bTu9=imzWQb2e~?P|A@xx*%_QhxzDQiE_v7KsIRQmvsy<-H6gRu2mSkxARy zk#trvEKv*crYl`PtEO0)oe=abPzZb>$*4jvzxGDkmoJ1o5w+=r9PVMzZ0*W+UKFbP z`B6=I;(Fht$)AshsFo}$x?P^G%YUkhcPDspZoK~s% zZ`qQC6g)SnsB^MCEXQEVMK1frLIO9^S|(g*JSV%smRvq&kLr zmVresVTR_OZBg_jD~H(wyyp!=Y?~niXtEvn3z}9I-}~X-?@wo>?KmlEH&@|F|M1*n z$>#I!ve!PX8`$&l=omHR$l#L7wzFT_J!azUw@UrUtKSdu$E$2*l9K&cm-$(XGgr%m zOkvm2k1*FR?}xsuWv+!fXQy=0W5NP^jx^ z4Cln)LBzXA%(j@z3yi9i@}UuUU?)k<^|}DGuE*@88^g9b=dKE_*>$_#)wP z>QPZw(Mh%g%7GL9EPb7JoU-GkpX$kNcqKinooUT5b4;c0%YtGhJ*ovJ*XR456z;f9 z=ivfSM=Qpr4s%+}!!Yw2j?F@!@rmLzDq zbO{J7i?U!3K&LJ!%iWgFdg$X{jscwD{Nz9gHBBFDt`5Z>plyaEMs?~bJi}q_sF50AY*RmS zhXjqh9V#GO<2%ZNb8%XZV-Pro&%;ZDJdvJbB8HedOJgBPJJvF(PcoG3P(+)&NPH-d zegDr*g26>pT8BxXI!*tn0-Eeoa{Vl`Ki}WVWgl1vSa?~iYwfRl<@vd93aJ_`T*rxu= zYBctg=%16?Yzv{y#ZSLO5S%!tN+dn)4qLc}?jL$zL!c+AYq@37+9*5HzRRI{^C{IT zxbav+8$#9lY~YmtKbUyB^n>2hT>glJEVO z3Ab!CU`rAWYV=DL zUv>ozei)61iFqdu3*DuYnxSoK$;Gu@941@OU0@iw3-49BE7bpFnc+^+k43f7pv36^ z*AF%;v2~3(`&?Q~Qnl4cZgYZ1QyS-@%9x32;-q%4A?PgrRD%7&q#b_O^g z1hF^Da;#lB-uh}Tgx`8A%~hN2Iij-c5na|`v@el{U^bKzdd_0Wi{vh(;RX_@SL#L| ze-rlQ?`v-V_WJjGPJJj?Ewd+m<2!WHF{vuB|8Yt6`Fn4n?2I${q6?1&x#G;XB&$Da z-TIS!?e+%F(%S_|{OHwhr+%1SxhQ|%_^i)DT|E6LJe7IZa_9oO`hCP}1dT>*tR1g( zt#q51bY?H?({DnSjAQriou*MfpzQUksTLkc#Ce@NAc%`xjvEx+$lE+R+P>rGF5!cR zVR=7g53YE@56BC+HEmS(?ugvqnwdiY~=t72IKqpPF#H;dXK{+rE%HfJ2QAg{_ zs|dEchvaV*!rFWkyl{BKpW4!Hc^0zA*_T8vodk$qZ1>86N zoz};Fv+C81J-F-d#D{2ZtUTaj|NHJOzej=-Scawn+4J&WW-a7Og*kC96D`(Dv$N*v zyo#_zh?l>i*<7NPmsEu#&5{x1(dM5~dEnNP5y8J^}!ZF#ug*h5(xb z#BBGI%AW*h0Su&x4y?Ewsq!?XzVel9VVbftylbEaw-yM0&K*ha7xo|ihqqyK95p9x%~i*>mCte%w1#s+9pIJiulA<0+}mzk02#XJ2;dH2+v(0 z@Um^nGNLfMALH@*kkzNeSZ!@%>!d!A?y)+-r1D%ETAsHLjJ=`Su=i2FGw|2^1CM7| zfh)GeT-Ypqor&8(s3P5Ym6pT_k$>Wk-_rV>$Nkzr9{rNl;c!nWIe2qhXy%)rDP>E_ zpKWE&yje;9TE>PJuXz$k-!-JIu&ZN_cqPmd!LNw^cs^fmGlHxb=Q0bZRCuIVzeBvR z+qt>!`5Q+ok+rwE*{8PpLjT{g5P{pLx87*loGJKbarlY&^3Myct3OngWkvX0J2krb zc*Z}z9`4$&uH+BiY2Li%j}!M&ifJzk#iJ?5equFo=Pm4Z|7rB>i+t)NXvI4@Iznxn zn_1c2T|Y%I*04ICJ06Fob0+;P5;;yQhzEDTM!~pz(p*Px%+_B-A?Z`|Xi7_Ijcl%h z;KibM&!Lqo>s7kIyWf zi6i`y7545o?{++c$kVnP!n&?U3d)dC`O>nmzu({d5;tXvpB6GsNH z?!5CZJIY9m>X@b7%GPLW*C-(l@ct@cpq{GEPc6Pgz#5*5$_kPCw%ya$EHC8vz?>p- zZCl?PClcRjSzYk1EA7Fq(tP!fKTwA8j6L%;(pA_NS4)|Ws3B?{v5m=m3XyYZdv}p)4vh;wL#}|Vf z1pm8zjt1Ac7KYiV0!0k1^*UFw8$MdcyQIf+Ni=MhEFaHDvt=0k~*K5|H-TJn} zRqRfRg)1|giJdZ8tM6*>wz_lJuT8un^TEJx)Ivqks6g&u)NR9JK_{ptTUGRbB)D)FMFj=gM$`%F zglXD!>L^s`C;}CaRc1m%e?dpVAIP6sYu1Nr7~ObS-8T})I@9`97Gj7nKwvA7;VzsT z*ww$%uy3#Zo+_HWZpEHGC7WNd-8%1=5)%KK;_W!Xub(LQ4!m1xd-tuTEyuiW9s9$x zMfnAh?*7WFapMJg4=7A6=m@RG#CvI+eib&Y-5S`5GhqTezA8W}XDC@%z3w1BDY7&4mT-%@=kC!{DFwzuw+JK5)e7R<^(_O4)BIB3r~9+69s3D)AkWgI z+5EcrRt_;}MM%Nvq#dpQqW|n(^m8fEFQX4QGId-cW>&&r6lfr@{iYbN21IFnbHFZ6 z^=Q**)P<-EH;Vef3Y-``uA&3LYJfukVwG10 z-Z%;|09SKI2OjqMtVy4oMwGU&!WedG#HjmlUFw%#_vJ5g*oWcK^5vzE(6SFV5bo9? zdeJZMefi4D0C{)M5l!vd%RZ{1nJ*WahIh$HD*qQ`{2-RWO7lSZOUUM{k*N#QkRCZ? zGEJ}t#GC;s-CRjOi-;3#Lppa>fwDEQg%?RE&1P2;j`XClC$+TP29B%61aJ>A?qyYa zzbtz=XZ*y7p^!ILco6rXMF%h=9WP23W%XSm!6tBqkGCwnOTBj3u)FX{^6SI~*MOI! zzSPBzl@*n!>b7d)2q$gdftBOT`rnoruCBRy+(b!CvRltTmT!&<2tCj%1D|9&y&@+$ zLlb&Kgq@{8sQQ(C3w1&mJt~|QC_8wL8E(zhIG@*{NEDtn`6LpyLh)x`-~^jdwx0TFEaIjnkYI5M=6#b4yX z)^2OfE$9=6v!|SbH((k;3`uE<4bv19X!pI3g!6efaxPkH+&w|zG2rdE{@xN}ZR(7c zI{|tMu$_mrdG#iewY<$-gZy0czYtI-Y1fItQdky*>KT3hp@qg^`f;=%X%%%76`_lgCYpWOwDB}oK#UCr(Gw`Dbk=U4!xL7cCv=_)lZ)%LnPP( zn?6PyN!OO>zeDl!0-soxYJT{Up4>io5T_aSU|d?L2o_Cm$pc=V$%;wg###$h!oJW` zNXTpB*@M$8!d#t1-C4kQ&sk`?Ra@n0zAz{zy7Q?)!E-*f@nAm!*f^K!b6e3El#^Vd zEf|15cs5C8CvY+L9HThdxX%+ITlvRj;yv<7Wzg@ACZdgM|=LS-x~)!d4QW{*Z6U(0822mu$^3&E?P5 zgOvCQ+IL5lrl+xtwMQgCl~Gjla%L4U`0UIi+?Nq=%#{yhwT4I`iBIdqWaet$Np2>0 z+%T68>W{a=o#W)qdgT(c;it({4NdVp8HKpeO5)?AGL%%*ZLFsBt0t*1q_k2Op;Gz- zEltc}Qn6+Qfl$uJY0X-pyEKJy!CVvT**?PeRO{=)RkM>?31+R^gz$RTl4_&k>p=Y_ zuGxrQ(2@s;k=qoxf%+IzCY$;a+LBmuX4qZ8tj(*)8`DDQ|N2*KYb{j~$uJtEN>#=m z$d}PPZnfEfCo(o7O2BPGY~<{J2eQySC?fXsI;bMSsBkv zM2o2qk`Oay9$}Tp$ku2khm*aJb|Bt-)!PFC5$S(g*Tu$Bg8dpXBZz z=Kr^~;J5KNEaD&+)zy_5h?{30&aqvnu_hik`IgRoYh~Z1O25+cXLc+vKe_|7Cb#_~ zL(>j@bscbGJyp3pF|Xd@0OmCGtmG4`*@K?8k&coC()%biHd?=5y)z_{Y6Aaq7Mlhf z+HJ7wx`>IvDc#S7(RmrIEKt)w0b7-kH`YT`$Jc{^9>OVxnb`9d!ZPaN$~Onyo-Vur?3X#8#`eoLSnetxUutilVmK z8sVvR8X&54DR94U?)!CJ z*YkRdE_8eO924)Z@?OO^J^r1M5%`C5+aJdhRSPc^U06QwaE-UwR(A{iJ<^JYkNQ~M zZNDaL@sT>7v2?%mI1)>)>=x>i&P$Dc9TLMxA>rV9w5ylr znWr=8Tj_ZLCN-3Y_axx7b$2u4*@*&eG`Lnb)#SMrht2dW4!7^f?H?!(O?3L<%u(Ze zNe%d%i{BppY}dcra+lX=xLn6`xQDaT%*AUk7s&;XmBSL91eyc3b zRYI$f=Y;%0H0(ABI?Fi>my^8!;~)+0Z{ZVbSbtgL75LtqKMjt=SK zTOCuH-!P1A$*EfJzQ^WXOp5kyg)Mh z4lK+#Yl?Z0VU$^bZFA(3cAc7DLzD8D>L^#Cq>$^LVN|mU*%M8Jf(a=Q>~{Yd_=nGT zsmuOQ%)M7~V+*dU3XVXsxE4a0actkYef2A6cVSsqai!1SaC}&=8S`KGHLS)|CTGP= z;OWXQjAj^0O8SDe49{{t*KJ;FP^n&iNKjPh*CTxmlYN2w?j1H4#J@wf8ti5gdXlb- zuVcmW3wHHFWry%P@%zv()g=(aJYbzV`aI_+T_hgoSlC52)p{N4@YanPBr%40a5Ol) zv^x11=jR%BBBXP(Lqu28DP;~PkAC{;^(uSwjTnmFbKge|-e2Uun#=5AJ`C?^*5zF@ zpp2n%rU+T znjPNtx7e?geXUu&smUO;x>^`s0&3 z;>tj@YHs#fCy?|Rz5Wutm^oCBeuyy$=NX$QP3$D5`X-FB-HQW90|YH|gFW^iJAX+< zlb?S_E^Fg?LAdMR&-2p33f#Sbusi4Ht7{UIoS^?n`IBX5Rdb%lCJCh3M~b>2a*CDv;F!&960e-+uHiQU?$SetJH@^;>G6g= zVeDm&GZn;=hBG@mR|K^#D><-VRTzBlTHJz&^d*e6P0fqvPg~LRwiS0DFKyu+KmD1} zBwtruk9qHM3hI5J=PO+QPS;`OD+6L3U9o*+xk}&3L=riPQrE2!rm7lK$+49hfZZ-W z=!k;|YJZ!acEu9(3=(9``!PT*Fc<&ituyr~`4eKKIX_~>uBZtzeMKUKx5F9qT=hj4 zhKB*VO&W!nXVAab+`iedA&38?vr7SUN?atHL)`P7iyPs!MsWQM(j6=}+^s2o9d!(I zu4xKWFFTqTiuZ_d+J2(Hggd{H=-it*P1;}7N-r14!*r1jfCuszk^z64<0flC{5F8G zE7?L_tULg_1XWBIIZb0KiYPll089&wvOwusprF)gV~{M-zt|t@2aV7ymn%QzuD~;B zJrdz~AD58Z6)$D`;IFp4`SEOR-!^nOC5RiCv;^J}b4J)=#PR9WES`_sy6>BP(V?+5 zcP73f{74C#c^-d>J;@TUsWeLYQWv~<(M2a>M7q`yW1wBl5k-=Vxr32=%VZlpGMhtXKRXP3DmLFEB>Kwatby4oPO7mt;(v`uWM_AEGFO+zw@`Ind!kg(e zIs+yv4)!i;E#w+-P7FdL+iUQz!G!J}%FPz% zHun*IGqAvrfW(!sC~s<({N8ao4nN?pdr`Y)yMAC)@i1Jnr)ovI2YUG3@(pX2XY5Y@ zxVBtGf^8=NSP66Z{Y6b4P_@mD$bfVOQAw}XWF|E3Ag~bcfiO=viX7u*!eW6&Ae9vc zd&@@I!BB`pub}0&x?{sL0MNjrLikkB=qo5H85A7`bCtm4R??D(UakA+^7q8AZ%U+U zN7?B71APq&@{~BLjlLl;?)s7GxIayI6SHo=X!g#p(Y(UT*CeejL*%ES)O@4ev$e;A z;pJkpW+soZtwmKMNnBO8di`m0g_qP~dnr*jb-<2zs z-=HkNRZo_O9|Lcmn7KTsdz03v@xf;gJbl`IV7KP$h?l;^E}f~7r3t6g$XPY+sL`M+ zRj7iVPYiV4O!SwC@#n1a30)ek8bYN3QV;{Hm{Z;CVZS^AoUW*1xcQZ|#CCx@OIX5n zP9y}~aZyK;1kyX|;MNvo3rtmM0%E8PZ<*DyRJ`;?)xK9~`rhjZUti+d-1;uHham>v z$S-s`IJoA@kEFqujeN0(n&AGQ^X5Xo-1dt;_`vqjemldK-eirNgRhu`*F6o^RF1a7 zXrXZ4LmaD`t=_rGJfD3gl-Q(3vfLi?C7JsAAUY zD;e4ogxyKc4`DwVrI}VxlSPL5&fT%Qfk5zyJdC39zymgH0U^r*O+9bXPlNCQ)8#x) zv`jGBf|J)N4{j8+PnJG9gLXy`UW+Eitoa4eA$xJ8$!X@8wklz|7lE}czcc|12gw}! z-Qzgn6EB=RVu7HFCE8IaOx~F#OKzI6?}90+@-0dU5&TFA9ED!AGw7Gj9+*smp(p@> zl)^ixE`0@B2SGVeP@&Mig1#2=)cCmGVg};?q-6No7ZdiVoE2?Ic`-4&+N_tJf{7g* zUQhHc*r-W#N=?xve>@?}Z9S)s;Vx@>9lBhYjGr!K3`~?p0~kCWv(;kKZ28%#_s~wh z{CO9Qe(QqZkGG}2VNZ>7$_6HpXYP>pMbSIK1sDb)IogT{NN7f%VvTWjMkNom!tr(y znhKc9ecmN#o7WNpr-&1Qp;=_|oSAVayyZ&o(vblx*eU6gmg%7LNr!vjUkXP4K|nyK7Hjn?t8--j!2W_9d)^VRy&6Pe{(zfNa- zMVtx5S^e9-#TnoPg?Cu#cQ%Sm;X7}x9QtUOBcQW zQPY;v=be=^qyZU4rO)pLPd$|U7(XBPY(gFWv+b`O-mDL9{CBP9{T0uy5Amr@aUIU zr+#BNeDwR@g~6LvKXLk?sLY}6r&Wg^5B>LnrSbi@(f;KNX=IbR7I@G*>YEvz1 zPw*$VHi|Poo|ae-ycydTe)ETnnGE|vN2l=l`VYLf}U? zsOuc9BQ0pnU4pTv%EGYi#doki%~|yG^{>r4FwXpHa_0tOEy>RbhH(vMS zlI0u!5)%VnKHm|3@#fjohqF#~#mMFeFZFGaEJ%o9&hQ_qrA}N(@=@-anEa=EcKQ!VQ-<7#s(U&%~mh=f=YjN>9vms-*e9?!? zBg&<|Gp{fyLNmtvl0oxmA{_YZ+5MMyX0q4*i`p(PsQT=7?eWO=g-TEVMNu0L$Yj6r zjyD-l`U@?-Fx1hrp;MA+HNmg?08vY^Rt{DX4PB9(hJJgxePmm9Y$vp# z6;#wsNNupFm|ie1Q3B|L*i!*YX;pj*``1T{QU|VPW^4`XBKF(7vDaHYwrw80I`?v_ zYz`^*_V%nz=Y#)zh8wG<@mH~T`n@PWAVs?$FEn}4mwv{=y*8l4e2>PUx`=54o#Gpg zzdIYT+_a9PJjzI0YG0t9m0QYn*~Y|_`rIP5SAIR3_a-FN9c`{Xr|-k*lET#^v8=?v z0=UToGNM~+(bFqo1McrggOyI+}X!CS_==6!*~z9yR|`f4hfv(tDh# zLmz4~^b?iP4Jp6PFVgUP(-Be`wG4Wn--Jn)qNY<7GtnD%_HCj*5zPh9gfJ#1lCbT? z$LYQ8Q}o@-Kbd(y$-ih8=GG;NcUpNru5s4dH`(8P-bC0}Vf^3IoEs|Kjaz}a(Oa48 zPoyv$4;0!*S+1nBAr40ocEl06)U(4`vf+F9zr~56Y|TO-zwkEh3D-$)QyI<1#~Dra z&0aH|4VexNa%XiNE4S5aR3J-0iEn@cVTgg=V9Y4z)i6+0a?msbPaoFqP7+Pv0obO( zQ+y#K!f_yi6+uc`>w_u@48{Jide8Mj)2Z;+D|t)9!u^^{Z_liW3K!$RgK5@+2evfJHC~31UzOo{em1^= zicJ;ZHv0?FNZS}CFlL@Om_5AGMU&nSn*Q_Kp8fK7s3UQ(0V_jM`jSCrvj;gICdDpMb#Z~>WeLBxr=&z9xT$t?!1-0NpRb7jnk#68TF2)(ntbaxfF%0+dzd_PBlMbfjvVSZ^;iWMtkVq!3*R6v$pl$0}6&RLs? zaP{LxFzFafa{k1)hD&9`uI}F!$8Y3SK&kyq|NJ3!OK~Xl8jL21pq$%%Y%Bq~g#|qf zwpd%OAbm9~y?o~EFTLB8$t|JwqmPob34~d-gz*!HRy@L;x;b(viMueJ`d|FvVAIm| zRbFdSVgj8U7hseCU*L)ON$pBXux=#JrO_!cwmnZpa&&_fS3ulwC~I!0hsSPS8FF@> z6f}~mMu?$VBQn{Db&gALR3`B}O@`O9N&AVZ7~79aYSw$0)mdbLN=M3)3OZMz;q^DS zK+42fzt3?_h;P!$u-@wpx32$*akRPO@JaVV zl4qRHed4-Hd-l+NjY<6KxGc}v>u_%-F%gZlQ*BfPU%G6e1F2Qw8i~J!Rq)j8V0}e9 zIfeb7m>QH%D~J-$gsdL!?Cnx*7fxrkn$(rnf@sd>`-qWExCDX4U~SOtaTrIPq%eC) zm~2E+8l1Q!2NaB zprZy3X4$8qE+DnuFv6V$Q(tw?&Q>@RMdo-`Sk$eR`ZfbJ0!JtD+6s)F^fEep01aIu zQW9on-;#=j$tW_MK$no?9p^Bcu?hlSre{H{rF|GL4G|gy1v?{TXHayFEm#73EIBMkA072-N_}g<&+?)MXF4Fb`b(>}q}KJ&Whga)uc~?Di;O z8dy|-bX-QZTCh4^dualJ2?h5;>xk9vS;_=;8GcT-;!AASQbjMCpD8Sj*5j#nn)*UKU-=q}|Mp%xHELC(3=Ea;~qqe|h$A8`i|shCN%ZPikJe zGU*aD3d#o?e)dI7|Mub#XSI?OeLLRR5$V7$NH`Q1&#*DoEjqJqCR)p*h^9mM#ZYfA z53~@_Y@wxf7!>-=gaktjV?;XU}abbSqk}J_W4Dh&2!ECs&_$4V#V9PM&nyxBAiy+5<`aYub`i zI-)P4$}G+EaXeP?kk*iW_sGa#gbz*vnHD0ucC6ku(yVYcNx{o6pR}k95`JDH(O=_( zJ6GS_n8At4j4zFN)(pJzh@{lvAVrG)8b4RtHct`*HQrXwFG&%$6yrEw(lVpNb!)2W z`$hD)$a8zVXLmHZs5ya!3qS39l;~d_hks!CXfh?Rx%_wcut!!7q~%MU!;!$otpBEj}lxZnMNrxPs?Z zwSZ2Lth_N4r|(i7_f7Fn-fSE7Htg~C_wCj!TTn8cn?x0B6H z>a5{(4U`HIGt~M{&vw~Vd@E$KhHswuz3xUr=-~glKF-fQyysp%g$^35a z;zgTJzxt#^GABR($8M;Qa}ZWdee2iZaL$&|{~JvW3lLU5T2&lH<_N^%gCmVy#e~86&@q;n_Y8 z^ThmScgOrZqM#j57yBKin^xg||KQ#?t4lvNt5yyA&5s}Q2g9?gOebS0JvP-&9ml=e z{Kd!jp78t+7H^ABWj~yoNN~idA{mjZU40zHUd$nNn*(D=os|tAIZw&11i1}xLmrHw zHtGej|7d@1fyvG?)Bl3O2~9a_RBw#LllqcylmcG#?GkNv4P4L~j7^?$CS12<^K7|b zHi9e@eNs;NGUAOM?p;rkfBE!r@|gUqe_l0hO%&85`Olx}p3F^q*tpJ+-;QMw9N)pufYq)9;?@`|X+l4~H?nJbNR+=r!%pDiTd&@I) znXs7J6&k+wqEJ#n#t(Ju2G&}foeCp(`b7{`wHL!2$T^Y1F+)|9VN9itfF0fY0PXUo zyhs21NXcMoUL)HdPHCx)5ukRR8B^TaQ*0a?_~mE)Ltn;Tec+*D&%xV|W`=~$tnHZ7 zbXf(sH4co^CF2ALoe@Sn(7`AOZYcMUNX#0Bg*l|c6B%Pc4aEUT0Xh(QTT;+Q316jW zv;DOfacVGeC>)vkQI0fF=T?v%bR6|4DJ#?6hm7*lBkTYjt_EMtM9F501`S9?Gt|sg zxQ}mKu1fRU!Ce#nQA~UxVe5B|*;^tXsR=(a9A${~`Kiy9U*A{mpgO$h6s!5vA2?q| zf9byFe|eXFoauw7)M%ggYnb#zNEZwSq%ixq@6+?O8!r)xa!1D^3HX-Lq(q#;DPBn# zPWL>K#AQ(f-DI%lb~)NdewB5`m$~B2ej?Kq;QhbGJjTshwOUxW~K77SFI571+ zQgAGXFdLIHSc$j<&9m~QxSC@TM)pbXLxiC{KOwgkC*yq-JMqhxYvxWLo;%}CP3Kay zY!q(yZEIJGJ&!k6>wf$Oy>`|Y>`x}hFIXB042C0ExS4FoPu#OQ5H8|8v{M)4VYsgG zF-^djE|5E<`K%a0{v`hlItbE%d8o5pf(`$F zDqVvN$RF>DrU(r8Rk(`t#@E)~gHfHTudstdg3(6N2Hl`GaKY7Q%Mc;-Qg_Bx=Q+8q zpC!NeT8yeT9*Fp*Dz{k^26T`*N(M%6Ny4#4BZ#D`YJl-J;rnH}d98_mj}-Hk^ZNiF zQ>hWgQjgI4x}m25lN35@I4Y~Kq^O-85aSvTZP$WU!lnMw+gw8-fCHpw)8|7y!A6HI zC7MvcmjU9>l3a5mcTNmR=}4wN17R58k5r)>cb4{H=gj~a z9G)Ey*lxuuy=JSU`F+CJ;XXle01~mG5;cSg-Cc*q*G-ben*zv!a?4G!LrpR-WzViJ=FSlec`PM!FGoY7kQ!0hyw}iPt%yM`t>W`e*9kfe8BC$64R~3eJ5B0Qo0wud!rLf|o9ibJ zupdWg)g@*EOaiJj*XieAP#->3|v{! z$T3ara=@N0{>Y$#7 z5PXfq8SNr}yAbB^P*D+72iCet6gWwgpJp_9$FfqUeQ?g!DbSOKv^!13P>5$0OvWn) ztR|r21Hla6F^;v2sg2yZA@{e(7p5nW+%dZJ{D>Y34~y19KtdiG;cvF`^C6%7{&Yrv z&j@CNdF-Gtn}b!6#}qRLB*Qt&N$QHKY!^^U;mL@yf6HlrQSSe*AS@(!>8#Woc~VG7 zD048h4VM@w7jzQZ+f1D$odpWy*Ah#{Sc3kZl9Kk^c35m05ul^^wp*!MCA-%lbHmpa zE6&}l+PO0G=dG(Y=APW|dIFp2v|+W=oQ16Ska-|`)YGLmvG)YYel~6K zAGX-P4UNHfDibCw>WIYbJGDSUisH9`A}60_i+W+$!YO#?OaBJ>!G+MMHn8ic3LN~j zmEqY+YyBMwaz3^}PJs^FF;OD5^ej0^pWIxcpTyNFaRr>xzQ1 zFTT?qCx~uecK-UW<_{LjXDxM2%2gHZaNpGAv@QDxJ3l+NUlv;;?*jN&(AjE=6EQQ@ zs)v9sa*!ltz_l($p3x^_Ye;_~AJ0swEr%r>YlcEQL|_=3`a~kXJRZL0-9G3Li@Pm={ zzkhJ-nfF?>CuO<2Tgii8)meI$-pe8AhyuCVy+;P*Y%!P*)2yZ*1%rLd8Y4f?o`F11 z2usWT>^Y#~QjfHa!xk49?-l7Vn&Udmw`bTQ{EUDM7<^rM>+oQ=>cpaL8%Hnu9SQN6 zy6h4{`s)spq_UURfyfk;>e9O}=i>XU*r0mJgkT4%QKM^xXyjIUrJygn6@S;Qe zdy07zBWDoFaa^s;dDSM&CJVTzU&^sgLM0I!8hyzo^E87ks+0)fJA6>YV;>g4#DxQ; z>k!Z<_Nh1Aaaw2pIq|c!S@J~{Cw=-&A>mrb<6X=H)##F5 zZrxMu74vx_CzI;ChOjC3S|Wh}c)xy?0&gs6$5$jMtFq7T#nss>+lTGhcl8~(9t^|` zI`q*WY-laYAJTeOM2L~CuEEARX_yUVJq&%_!6=I+#NQfw1EoB7YtN~?;YJ=kaOL)% zqZp%e)}BLY>*TDf{0}j|g-!9F&BV1$l&oL4X6@@4oAxDdKnlmB-@Pgn6qGt`pP1=n z!G9ko7UZV_PjMoVNOHI8D~AcLS6A#gM9#YNO;|@#Iq?ZmrJ%yT_lsJK#q#d3Ws&mtc5Ig5ig$fj zzeR{1+`3t;d7YVYk~A;A(D$LH8Am&hznydE#;v(%39{WY<*Ue8MZ_tiEQzV50otaS z#$Yxz1BHsXlE-iNPNkngo2n)AI>;tj%)Dl^hdbwphk`%_m(xh20J`SYEwLA2bnO}O z7QyhnEly}4z7&(g-IpA_3f)tM!8!@rR_Tb~I3rFuIcMF=zvgb(H*8~EVW`=gVrp@?Zu9&qu?84!%-!Ed-ykB&_c(vpFY6u}6BtLY{#d_`J786XSC*|*Z5n1wm+mF7O~C7T+~=-mRmGIk9+KoTp{S7IYj zke$q+NmAeN$}^yQ^ew98&dTkUh7UB^KN+hT=pT|R(B|uTbsuh)+HAKgRHan`i~=T6T-)$Fof`umkBx8!c8@TrnHr#VSLQ8s93fX~rZv!*F0emxQN7 z(OX0!NE~a07Q-|bUym`}$@#605@Hudxu%Z&2L&=P$CLqyLFDVpi_R1w$14w7!mc)U z#vRN5uvty1`;R>5LFlr?^hWNdtk8?J{S8k*&!(j7bR| zS3}ZCG2_n-r!NoEYO6%Ws{Z8%>gydPZr$7Wd>gRx+DCB!`gjmc$=vYE=9^Iu-GlbW zp7^q^U%|p3_qv@i)zq1H_NCajzLzm1nbP4@-gzqnB)XzADDh*cix5aV9wzaW?p~R2 z4NdG57zcVNOtNXn{8H>4UAk7p4j>6sy+Qlu9lnn^Hw9g06~^$4=+MoRX7nK)Uslwb zKh#8XrwG)sjle36uB`om`SkNwq=(B$FE?w+1*an@%xH-VI)hp>3rPRaHmoReEe`a* zU9f8pt#-`^XHR!j?w6g|&5KU-MgQA5JMHm-f=hPI754ORCYpOA^B)xcI{lzz@6!vC z(n-ShG|%DX^VIA{Xs1KXFSJ(tf3DVjPnqsCCM%gY%&?}Q zLe7yI=mq?=OmEM9O3SUM-V^lHv3+p$w^^isPtVaE3*PjjBq$cuv!nqgpvn@QhKC_o z7P|v4BOAw};_$MB{x@N0)c+{@)=u%#e||$nK*lj{Jj?Trg#nzX)FDzF+&Sd!H#skN z#!B9zp3m$wmVtjvg_|56Kk$Al{@m(?>x!LGOi~!Q-^*avo5-5?7R~)3#=m_kKzlcU z%CJq}5mVlx`Jjxv$&BXodG670HcOANLjqG!Nf4EG_Pvf&&yi2AjsqN4c@Adi!_PfA zCc+J~c1-jWSuoTYboV$Knou^qMTP7NNAlUAhvobZtD9t;6$5SOZ_)jr#GI=i^P+O@ z-EESFQgB8Hdm_b*+3%vSUcclAaZKwU?J!}O-B+%lg5dm<>!jijeV##c}e^F z>tmdlYqrYVcFtOohr41%W4?UVZ#*0Bs%m;A(@PR7Z2(%^qF_x#$=;Q`4YPujN`VBc zq`MEa;8c6z^%Z_mQD>b|$}k7X_2=}C@1fLg0{*?P&Z#*gFZM`7TVygJ)gOAGW;{EW z^4=F^TKI8%qc4dY;Mq_In$J&W|I&$Hze%M}J8AC*V&z1E43iAcKpz&YbtJv1T`Ri0 ze9C|g+eD+G$a&Fc1pNBz6n}gEcTVA|M#6Ke1UFHPMyNk)ZR-zYc$)NkSK{g^3~QVP zHYT^dr<{Y$9#+qZfljn4> ziZ8ZG8ymHhY}q_%=;mB5an!ur^!qod_3&TxvF`xA-4_zLC(mK_;H_Cn{(Iup<4LI| z`5k}hZCT-rQ8UNt_)HfUKNSS3ez#GsD^dq{;9P|s@aF+by+3weemk4Mpq+Cxv&+z^ zd1Xz&7Yb_KuIqX;SsdKRX22D2^tyj*_;n3|v+Ei~AmtCqg9lou2*2=1!KCAVDSi7t zCNb5!T9wiMt+JzN=SQD$Of#<=$T^BDv%+vmxv z!PMprZpqKSp-(#;U~o+O?}PE)7_E$wnW}dZQ{R6qD1Gy1glPW(K<2>yN)&X;B4=oC zd^5Rr!Oz9Mzr451dvE0oPp@O^25?-R&);H%_*{>MKgn^T7quRZ5iWhWA+fO71)QP1 zmj`Zyyxcy6QV^9>+b@-2@E>vJexJX-a>wFShe4zJLdOItZM2zAJ}fwOo|Wjm>rpc9 zRo!Z4zclDdXbgafVl{L{jKz|Jq_y<9pZvBAv@?G2Wu)l=CN2 z-_)pikxnHr7-8QMmYVLPr8(NV7d@R)=9|4Z|DH)tCH3rdhOQuH*47hGo_BrzgTvs7 z`2Q41aGjbP@cxRg3m6V!_JNoq>#rQ)-DJjGsC|+2#uiRX3|m?C;Og%g39r zi*S07tMg@M$G9;7!KKowc9vgowYIn6Y*_+BxV_kUlD)c#Mx+j)gkQ)m%!jj>+oWk zYt?fY5bNTuG(|-cK6?326z_fG&3m&lH%|>HXPPQ-48}7OUlV8XJBnU*Sgli@2}z=y zij8>g?4a{iG)OUO0%UO*iz?cSb78A_o4WFw^zA(*V8ivDN~M?}E0-@5x^=|>A*?Wo zK^BQd6aDib?3&1%k51da&G0-@aW^7@#C1{ObLRRL2TGOa#`TWl&|b6eEpkm$jjJqU zP>{==?Jez|hAB;ytaP&+D@Pusie{t6iJdKrSM)LvjH)w5oOwfq8NkvAjo6F3FrrrA z6>4S^3#&WWa0B_5o`S(iuM1h8(WK1|zz9#p#NTr3J-kWLIw4db!f9XOgfaA0o23{^ zZXR@LYHEHho+r;F3)+=g#R7}FH4S?01#(+SYemG_k!CEn*9pQQN-4T)omP{L-xY`Flpl7JZe@py~koTxY2WGm3 z_U$jEA1#i#!R=*^Q$=uHCw80KuoM(GsAi?rQ#AgAzQGuQj--rt>Sj5+VBNq# zSL{WtTX0eFy(_Tjq8{42>6>KlVp?_-V7cE z?(F>_U^2CcFO#nfna#Vzdf(*STooVxBQxf{OXGHk!4tA z$!>YDV)j&LiC{_R*`qU+kr$|csX2aF(b?NE0HU16nEgm4zu2#3N!Zde8UzHz^ma$FyFP@n!N8DDA8 z-9Q%oAE!HLu9d5w6p7QF zcCV}R9&nQZ6U}YIk`tlD>uOHfy6w4%e6cU1ep3-(Ru_8VB;+(bf#ztces$Ov_y!%w zZxUM;IMPOCYH&LE_Gd!v<7dJ|k;_0k86K_tHV83*JaV>%Y?3R8lR+1#T`^G9{Ws3T zi|Qar4N}61?v6w@yr^c7yWp$tzkNQC{kRG2m6TdD_9tmQs=d@*er$JTNW;KMFLCIM z4Kqwj2@_u}a`D_)^(YwkRLmNeVcx}IH2N{XLo=|JVG<3}ZRf@aP;Jd+Pi^M#^^XbH>Q}f_2*H39|4#wApqi0G{S)(!nMNe`$6##woPaTL|w0 zdl`fZ%mTwolWVFs=JCFmLjLlLW$WgiEDqTc+{yn1>6inTD{7U7e)z5A0)tKoc0jk-`X~&Z)eFeElsb* zA9}O5Q>o&f#6+CtCd&ezgFTr(@icD|&EusOp!wIwt*A#p(x zCV6oru;5YJgY4azdExGKLuS`H$k0ZKgZGP$rc z3zNlHT>|f6Gje%+3lZ3diCjX(&TNNqMjx7!Bxnq!R7X{?hz;#z$rSRZXuWksg#p8f z!dPP`^FG>9d1KAo!I;nZSBS)n?+iZJ*=LivI@cm_eQe%#d(qrUpB#aUSImp(jk-Dy zP1l0RBz|$gOYurld(d>jYfrNjj)5b2@SMhq0ftnhAru>sfIC zN^p?5#?qH_ZmllFN6z@A|HPRu{>VwAa+%)#Xk|As^N-Q=hjEbb(0bSey@~IpIvoHP zn>r6J&9*6%L{c!-j|V3e10qjSKQmcJ)aAFf57&FgMLGye)rBDa$R~~Mve#l<&s}#B zNtqB3Po0E-QcS5JKi}dNGt7(d4TR0_@wHzb{#?F?fy-Xkv)9ulkl1=9K@uH zoG9X*Tk>veioyvhS=2ilCaqHiF$9?6+aUEOs)No+QXTX*1fba;h28T>@Mh?a>kDru z`RC1=m)jvJOiV&P&9wDz-ehR;j|D11N38q;R_Evd%^xNJ?wC}7zT?1`d0n)?{skgq z{gdN_mKahN#6Qw78^_v%-9TiEEkLfXW1HmZL)sX8h35;H5097?vsZk)i|O@XLhbdc zZr+oX8Tu0W>3`67CB?if%-d8l)DOTkCw2iDyqBb%ui8@KyqG#v5S5G(`a2=Jo}#7@ z>L!O;+n+#p@Oj^u^mYO$^R_aHMoD8X;kT{6Y5s6P2^G<1Hgf*lnfm6JwH+K{NQOR*GD+b zo1{#P+k`L0@N{#IRID>Mv!)Q8lA{TXbTAbP%|mvkO%x=XgNOQvw+I+#yTvFl)=asR zZq_P!!Cagk61jHJqN0zZ(*yQQ&$-g6(*_fD}&l0V~HM1ub$bqzTXG75WbDE@pqIMMNBt2R7 z&+pIgXC??LuZ&<0dr#R%>Ba`>X~GZ77>>DI%1(*7EM;*RFvtr0-kU!a-GWPZn#*kR z2#TYR`{zF>i+=2GN0j3bP?cFUC)fOvr1nNnvcoDkSg0O4T-CYqQecZD?TEr6^{L=4~zgyv^&*FCT;s z4!%!zQN;c{PlnQ6kCmSId}}j;(!qlZ_6u1Cz6 zzgdz$A=m5QBg-sR5uJymVQiCB<Ur zTRjgd2~cB06pdKuih+_=Hd1MSM|58FS&~VYtR=@2@*91jnS96Bc5Us{ssa0v^!ljE z$=#=P-tt_}peW^%u>T%~NsdB2-r@Y|g0jh{MtiPs<4uF8BTlpDrh$K@@NvHSgvz0D zje@xD|9+Xx(MxjVqUm%nGv+jz^%c=|N;8yO)(4Cl$Ny4BU0E3L%a7l7xXgaI>nmxZ zqd@ZcCozB188e@unwOL%*J~SIU7GSXG$&;I9e?r&U8a`%H%rd3O1SPpT~rr!Lbig~ zkYAY5xEE5FIoi_A(#&|4olDpmY!`y~)Nh0CuONA~nN^Z&frL)ZC#LpMd$nSQ#T|AY zB4a>Bkcn3A#ouljjCq>ec^1Fv0M@(<7khH_WJXM?Bj@fmPEN*2ix;W2e>buhOKpnZ5ZTFu_mZALTu6|Fb(6_Ds(|Y)Q=ja z0i(Wta_}cpZ@l&JqPCBbz9tn>bF8QX26J1X3cGhhD@y6m=W)dvf5XMLz}UHs?Q zmj^H0JawR$?!%rr{N?9O%xz!JG@Wo|Kz5&@zQiD-fSO+4=u2qfOYA6?@(=Rr@3H8L+V5tl%oGh$IgD#PXeEt&V>_WZA{e99 zC|u5`{rn`X^M}U1-oASaQV!JTvg>EH)4i#xNWzXk{`>spKh7KGmbJafO^)>4SS#?R z*-uCP==5>NtoP5w{p$Fmqh*CB1uUQ)4hHkq}pg4F+0=vq$udChf%}?z{>z@%#vDG&707Yq*FU z?4KoTceOxCpXe<@v(buRsBJaMN*ns?fl`%QIBRQ~pyS)%jD${lRZ-lrn!eCS7pP^% z8cM`U3G~7il45H|S)ms?`<`+$M$WCgNBnxdXU~qRjkmuzQ9zqZv;C3vuNPiQ29KIh z-``S|Rp?)$(xMi8%~&7tNvghL)&xGk4FDlxLT-NBxJ?>vCU_ZA*b!){coAz)CPram zbs$N-1gY(XJV(RT>8tQ`hBdw#e@Aq!oeWcUzMP2D=N?71%ILeLDU`nxmSlfDhZuKE zyj&q1{yHSlV~b5i7SoSi-*bjx>0hvU{-5r(opQnGy5!LEne{=5!ETGbe7;LTT0`gn zgdg3CbqR{NB(ht++(sUCp@D`R+}{jdeZGp8Uo_TX%)TCn|M$~h(hnXu_w;hui4XN#3(GuL9r!WaJ@v!V zWnabCI4?fF0FV){5lgO;fLSjgjhx?+7y3l}fr`+21HyBbkuE z%YS9Va?Il|Cii^yy+MZA9|c`6n)tVsE)*JIuk>Fap?}8pjU&6+#*f=W#-nN!^0`C= zdq?s(gX}3Ox$c?hBg6s*YNmOHt6@51kRszN6++n$s778$Z`iKIXe`0}CR%lbyvXDO z*bS$geMw{Mm%+&!pLrEhQY^skAL3Lb!XMLnrr7M#+tD{~Na6@#@U9cdsyfU>@ePGp zfP$JWgMKviP}p~UP@v{lK}9CBjj6j}WM9%2rPCQ$c(mYYreS^X6gh`wHfM~`yPznU zgst6UtP6CRp`pZOT2V0D&n%iN0$YMZmEb`Pu(HfchnnehKe0kIx zO9j6EYP=1v+Lz6Th^>g6i*JShz?fJ->2N(uWKa%|8Wx}}3>{8Jy^-NElBwBYGl03v z6A1h9A-OQq$9Dn$rWPjkYHhoEz#Wz**#4y*4Fhsf?(3VPZ(M;Bisv4*Qv79QS^2QW9J|qBCFl68h z_QEfT6Qd0C&e&jnq>Y($^vY)WHB#O7eu(8 z@agc@5R0eiENdoBj>lrLq&k#)DI@96eK>QJssN^bpK8)`X6W&y>kvG!!M(@`s4EEpT>t$kc6> z6)lZ4XOf*7D-4i@Rq{jRymk_qzyKeikxp+#Q7o)6BuK1I9|v^`@ad98f|3}|q<+*` z?4c@99EZ67woFb)3be3XdU#svo)+p*fKS-8NZ1Ln#__zl0&m5W4tr-+6~wa5WF=D@ z)@3QvhLR4mk6%4l-j@11rK12ri)B>x3b=6{lXL+4#Y6$MRc7+K$p|^JlYaGhj zP83wfg2qW!c2p%(OWfWEM4T`qO8}3at;!FYNE%ATg$@R5>Xr<~56zy5b{rhm{mf4J z2_MOdV0po4Z(zqDp%9lbp^xH`^ghnAep!x@-WF(`a&(tR{D3wa@ls=It>S+ultHHU z$q>F`42|#jXT~vNZ37pHPB}TlwNCr!YtbUaLC&DP%A*7k+Elbl3g}9>9B5sBtic&SXhm9W^?1O(ZOt-wU-5)qN46(1i!#w^9oG)LTVq1o4fE zP7`?o?wld!F<#Q1G3pJW)U%ivH+EBTt>l+4zF#yudtmOC>s8F^nmWvfPs%T_jvYR& ze<4`?g8wU@lTO`q(rJO+KSq8u4htP@poT`Sr!Pto8TDEi=uUTJl9 zEZ6G8%8=Z+L|#h~nFIKJ^8cajhP{|a4?KfEi0^RhO}lnpKgKGowq)^_UVJwCG<=yh z8#9m~i2o#iX%cf?yrbs7Ejkvt3_^IPBC#HKAT%XGRCVJMnBndb*H+x4HIz1dh&C%G z*-&a$&Uq8MrHx_@j33 z^k8WNWzdH;ITYrACvVVkVVSWZ8(aNmeSEs)%u_mj;YMkPF_=&rI0>oF^&L6yvR3GN zv(V>BxI^u)E**=B!+fH7DPZ96XFHP7tNM3dqPKL=6^%wZyYR_Hfkjd_65$`9Yj1qa{dUCeOZBUVtYH6=^=IBUfH-yz&wvBuDMWpZvitH`MpMBhl0LCPC*$`ho6Gm%|t+`qkpg%IHJ zm_Z<24rEP5&q45WwWIecK{VlR*CKXOX$*JS!(I1Eg)g2Bei}Q_cq@2;a=UKz@=Yl( z1+QIoG6uQ6t$Fd- z-jo%YjH6e{Jn8bNNke#KO_%g?Hi5fJlPq=)l!z=!;&!>nZJwyctjZrGMjwDq|J4FL z7EW->(cgvcLE^r#BnEugny#SOL{UCdgKg_18StC6Vcp9yU)=p~{VNL&rpped*Oc%6 z2{ZpUVdTJi0VcSTkbdV{LvPmGzy9mT-I*U(RbPDfkABYMgnfx|13j5yE?#Hu*l4{(S09+x;ru!>=Ch zYBxO07^;GfU?hq2@X5_F4gQ_Fj|xWzPDj7@7RDHGd-acj?O4d}zFt!uv>c;|3v4%T zhwb80UaFK4Yz1IGPJ#=uun}HXRIy#cm-aG7q5E{R&=y>#H-txM!}(nS1pY`NI_yca zHC%uR&^39bSw9%=Nagc6*`sJa_tOMn0*W0$eXe=}vaFeKK3-14ZqGn=gB7Et@&m1v^ zz%gu7+qjNeJ6O6WB^jF}U<4gvhXG<;+{*h9C2j3WuP9C<=M6?wdoi^kX=!hud^gF~3r3r&Z%~5MG$HS?y90;4?G7%b zUdsA)4IO&ry)6p<$P&RHlB@e z?^Y@2q7-~(d)whO!r8obNH+4$2U}+NiqZ(xo*&7Tcxtrjdp3v4^j;8ZP*xHygU~V; z8Y-Ij@AX{Z$GJ%wtAsHa)>$4dlwmuxfI9R2&x*9en<7sACp22ha&?RdP{>oshAaNv ziC1^;JVE+7yrHNA|G*uKo=!yL2HsZFjjw^^+Fo)C2TJ zkd0L&90oCvjm58+ZzJb>D)y@}({iYmlRZU~aGj#V2nU``HQa>-u+o}uqQhVxI?9eX z$t(F!l24s9_*3Er6Z=gQU1^dX$CLhjPk8x-IyOGNOeyqKMh_yiS+{3G-i2;hsjX3P zBPtC_s>S`k)&Z%JKb}HFvqk1!wf5}&4O-NY0^Ze3jV4Vt}he(n5V4@B1k?K z9ma*N;1nLhes|j>npN#1CocfIOo-}fQM%U&EZb$HZj!~t<|H!g8jN?^o0Kx)Z4HA{ zThjmkF(T&w`ugC0@nPtKp)e5Tncu_p@53i+DiSgk1a)>Ho*g+ByVs}f|N25<9Bz&^ z-_q}dFeQSS^E|bc*cmeM48zdj%PP6rsDQMhTw9;z+**uAE~TD|=J zLjZ$YHauGMJIYbMWHMZ;t2gd^N~16xnFCiFn3xbcj9SVmEuC&{PzlWP+Ex5l&LN1Q8WhN3|(}lE@;dbQ(Sh z@Se)=WfN0!9TnYj;FrzV#sQpU=i*7D^F{NehnhjT0|VM>9tj>awzdQ(fEfHZRa#y{ zw|o95##FF>cg^OmZKWq3JviJz!$$q|SQQpy$dIVQ2;s3-Gn94zD!3OHXRX+E@zLb> z?H_(};_3W7B-Lo@4JTN4UGzpiHOQu&%Ws)!MtHIv)kuZ%(6Z3`keh+%1yJ-eU z3+IUZa-k5cM0HOWNrDoD@OHA%f;yKYRYk)L z`~nB(@qhi1pbWbCXtGI}c4evHm)FlP?X8)+C)riS^IpXTT!seVqmiSYcPBKP0Z%*m zSK_EYXDtIe)u?*hAUBUe=FI=7462IVwHO1#8vwt+*e|YpaR7e^4b#hb0qmC55?a7o`O(@1I4`++p8elSD_g;)vcnGBiXn5+VhX&d5826OD8a&_ar}yxn zukca$NYeDlU2B$C%})%^d^K`N;9LBovc)i`xi3Ndn$0iY_%kN_Xf-|~H(0rOF&9?n zA6$AB2WaJdI?FYbBy_l}R34h(;@PDQwY4)qw-#jvdi_9MPidjZU{n{Tu&1OyG zw|5?Gh-^KYKKtgM;TdlSU;oM5*-I5X2#VP4y{^buGe0|k#)%F4Cn^$46Q~wYCEA*1 zjC+h-;!L!tv$Lsf#zpf=uuai@b9^0ikH@A^^afOxi5DIlAZnLL*{#nN&eeSWA1tytL%Z{K(<<6m+Ny)BKHdQ$%Y;iT=>%Ge?+ z)vui$Wz8T5KvOeO0r?gkrJ3O{WQ*Wt@QP?DLD=6wcMe5nPFGye`zRS~L)dg?B_F`C zH!yM`fRsj(CU918!v^P>%Z8%u=&wKjy|J_5rC9p2@wM+9AVpQWJ`L(WT(!oW@ucRI z3$t5$ZDl*-uV1xay|L?E?fvE7JUJSEH#F&9PWZsJ!r6;4RSQryq~hmU!XBZncrFY~ z4MRLzhfO(6w%{xj&>z4iqL7?)s;b4MsHyAHg~s?6-yLzoI}guiI%W<6&XC)cl~uKatZZsE5b&r zGuel51R}O4K;Tx z`-~Ygf=zqZ;4TZ@qA(H}vY?v9yy~>N3U0>v;qh^l~W zjhygO%rGqH7NFdXu`hg?@MGM~w50E^ZeqOAn7yWIr)BE+$Z}^pS6zN?3mRYLU|x2# zJgdj-3a&go?`Vk1cr!LH?m%RQD=UtvUZ@_6jhstL$sq7r9Gd7B4Ym=;?G<+vw(7zm zp4bc)2_j|gl2X`bmN0EK-F*@c1%}&fhBjQ>S`@G}jJv49>W8ftpUuW63c?JK*UR&x zRr6&*t=)Clt{Sb#Ik*>g7T#(Gd!ilQ?G++8Aujyl^Iz=ad#7aYKKM0FGjOx;tImP% zzNf!DEbq~q17(FBkGYHQE!us5tV7~#QZqaBY0SG#e{a^|vfoCF%5-UbBl2WQK{bi8 zOUa0}G*Q@N>nZE5#VV+WI$MH?c$RG_v@bxFSY%$(lRG8OR3TWS;np!#%!XTU&s0(B`Ch|4QF|WWc!YXDO8;97j;e5p>&s%lI#6x(7 zg-t|Cj6taV+l8E}>_T%!xgbI|Y1jG<5r0OU5OE4oLuIo|^g~G-z-lRy*<^E&n}TVJ zBN?mfDk-oH6^!-~q(FwwruD%>a;v?n`y9WYRt-G)^3XzZKH!*{x~By}-ys&U4jbL4 ztgS8~VBGpCRKT)q%3qpgzHU1qP6 z_SbGByo&;@xxqP*tyt9F!Ioy163}w8a9G+AJVmlAdGxEkLM3;3W+&b2n%^0e8oCx< zH94|_e_}4)(HW>C={Eo(PF|>^*A3UmusD-nSlOD5qP1|LJwU|3qlEf&gC`czM5ikR_d=0k6&62w4 zEKBsEtKcS;a0A?SSw_CY-i^zSnS=zze|T&;Se&!N;|&p}io~_ZtJ`O(vyoV0DX^p$ z;EKvTnaUDgO0Jfv2M#=kdcv66te+ay7P#QCwW6V}on<3eM`m%hL;qnd=5A@?4Ig4^ zZ)p!XpTZa(N@{c%8@3?+zWk}Jqchp~QsepG(atM}j7KwHrbV5Q3nD6i zDVtKrA(24(9r4Al|FvL1-&j_5<rIjZ!UPt%S|7f!1ZIdv`DqW2Zc2n~o zalvAY!ICSoP8qj%S*bCBEV(+_2bQSK`*O`PXN|mt#4sj^%ovFkm`;{%T9qV}sSBKh zBWuKHH;HVkshKt_PnZMXS@Ly7O8U7HqnlC!_&$&wo2d#J)c$|xDqu0mi8e+=yD2q#8Vu;Z-r4Y{MZcBo>7o{?WysVRD zMH{7+{wxKIN&6~&Ym_(d%t{!VKoa0w2#H9IEWH(35f#PM6AVZ1Ykata|MPmmr>!lk z*Btri;_aySdH1KWAW-w`HD$f6Wrw*aG0-KLPX-$0*5TSU?>(i<(W!{{GnaT2e09@Q@aLP5?JBVjRw1rx$2sC%*M zYt0cI%8dJ_3PtL z=i18p8E#UC&A9<}8XKbTlnZ=$tXV>ASU-gL-hHV(=Ue>sX72j>^c{~rc>31>s?qYnfHM!;YzmjM0$@`HZcST{uXj!gy5mWGK!&|IsyN4Aq4|8{IP88=Oa( zYh^&MK5@n@<~4M(C#2m~+D9k>qe~{1f-YNBo`hGsUXhTx74u{gQ1_;dJ_F}6H0OzABteS|RKr8*e3f~br=jmK4^RULsL z#7V$aHQnr6rs2H7TI@^CW<;OpO9cFNdv6Vhvz|(5mcVBMM*AQd?rsLNa+m~O)j*Qn z#n2YuyIEL;usg(O_m@K9+LYpN4^Q4D85ZC?gyh<=L!$hx)!dbl zOQeHQX2nuu+*&SDq@NR3BCGpZp_R~Vzuv15vz=4S0!AXwq5Q18sP@FAwE|qQgdCjyY4?TmRuu`eF0E)xl=V%a02=2BRCo3(&4czVrnx8P*%0T*)O7Ps~s>Ypv#mtH3_+kv`l-SAP&tJ+OTE1^H9gT z;2t&Nl&v%PT5O0saxo%xUqD4r@xYE*SUK8=GVZDm|9!am`{AXM)n!e^Jqst+2l_JG z- z$GD_UxqtN6N2V+as^1=Q0c2$acs0J0Yzg`&7QBb)2qPdSP>ES50?89K9d6@xrP;60 z=47z>rZOYTBJKPI26?MwrS3^(>yP-_;PhHjYB=Wn7gZm&zx>QXUaTJOTWrqAnXyJC zi*ogSd$B*XoErJ8@GK{yrcCiQ_UlC*PgWoW9Bs}?g0+Oi$Q%nLx=k;XmTAPyS{zuDpiur{X8*pY{ln&z83ECjAK7% z=9AWyL}mo6waEx5#95=TO8gpCskKT)b)-;Ls-s;{`$CY0TQpHAGzq)ep;0EEAZ|&! z#cs;PW0kEu9F*fF>_Udd6|Dp3NP`;T8?sJ~`y23-cxz@k`w;R|S0miV z-qUO}fU8tzR3nNY-s1Ixx;}QR{?gSY<*e>e+0wY%n}p-GFUolg8q4JSK_?j!{YKqYC*c z1{to<K@H*RNK5yCB%DP`82C&RvBKP#yVZY@`C3-S}!!4yt>4>ajv_=-U~@9 zvRGwP-UMkd=)ottXOy?SmZnlzOyNH66{dgT!sC`HX6O1c8)~<51AgF+O2luQGn+wV z)=npBo<)tL)lAH7=~Gumgxq_q=Jc1?69j=*=*0Uf;Xq=N~?QDe#ZjccM0;4oz}YH5V=Y{cQjZ{w5?!U4A+DHsQD5 z*nIQ-+4jCS9<85U{7cz_`hh;5(=W^R#o?=#CehCi#dmn)=Zi}t5l1O<4zWY=sjZPk zFqKx>`dw3QS38)#<_lf)PPH+qlkwcSX6%Bck*y+iErPE;_JocKyVYq4rD#%j!3K7A zQD&Q1f)9HBM+m;_>P2}}XkwKr<1j8yiCAT=EPS>X!{d*-4H0tP%xsYa=j9k}&`}oU z0qbbO?JX(rK(9Hf{o1da{;Db1zwORpXU8P_esqC6b$7OoQE+6!%m`VKcD8WuTI})v z<~+Roi~ZMum%k}?#+U!JclY4|@>Dw^V*J`Q!3P^KCws3l=oNL*x)%0a5*hd~?Jke7 ztC~3!o>aF1DKZrbWsF(c-H`O7QdKp`T@Ht9_|kB>*fR{fv~MxGp{Phm%RHCOFHe|fEuWL@2m#%?@ zm8$&3+l)QOUqjBBPmcS4dhory1K;rEJA2a3oPMM+y93(PR@g2oobFM(>I=jaKqoM_u?Upx)UkOx?uHrw}{&BK=Z0_pj!j;F^FMhUT zc&Qa@I7K2=J$HhCns)d7qo?l1hA*s)^}AbTD3XxflU_Dob=qvB6hQwAFHWijf1;RU zkSx!!3Ok$Xru5!I+7+}KPtlkad332sRy8P8lxewY{9<0QRjDd-xJXQgbY!j1z}L_I zT9N!%lkE%*q4Z|N-o2cN1|5|JA({CLV$_5)zdy=}G@K$HzU*xI=kTJV*!6!sx$sVz z;@!_?k7Y}BHLOhhaxi%G7Rq=3rT>PQ2JAH*he#JHMOtAP_^*b-VuMXHx+Dm_@ zb@r=^rRvlc{*~+tDdg+7!fu_Z`1`i$tG^|muuOQ8_foF}GikKjp8<}P4m>!|Y`(7T zpS>t>zHKh+OoKR_!$Plcf^Ls_XXf@|N=k`Fx8Bj|0&bEjHO5k#I?du6N+t$@+0siI z=BW?!4$opN>E{w-&!cdlEOxi23pTVN;ODE(zktp11q^T)I_ zA+n_ZOi>$i=`~DG7pANyonGT&U*t>hDNA&ZNmdhbeH3zGH@+KZ&V@Osj*^5WLp@k(s*GnxOFC36wxOlB`iIU@E^5~D^}Aj?)A8s-NyH`C zz%^9Wm}b*k=)u{~%>^ueho#J+3k;eoHp>Kvc)Lnfn);aF@2D;`)~OdbdZw7j_SDM* z;uTP&ZBC{R8vfGiNYz09a&+?q%M5_wC&sNF7$3Y@K+X)bc_U@=#261;@7=0JU+};D zFyjY`1Ejc6#$n0Ajag?41+Quou71~;M9X;_|6ukmy4&1T{a4{v1AG3C9oQL^^?un% zz2EEFolA7kjTcdipp`r|z; z6YL7f#92-F4|2Z@`sVVEZ(sZ2yV?iK7XODe+>EVT^ZFG{cJ%w%fg?+>Tq;BFysjPE z5%;*NOZH;M%Udq612?{ZsLst$BeE*1^?Ff>zoj~qy%uvDN6t_v9~w%*1XCm`gH*bn z0o>-1QlA1!qYfG)h)96}wj@jnGEK#Nutb!N6lR&N63&%fSnuRN9(vjbQDb7H=)`JnwEE}fhMbhK;l4o$1x_NT4wdS-Yi;Py@55tzT) zO8N63q2T?ho#}op==SQP$8sJG-v2qy8h&Ac$V!$&*CM758r=~SiONtcxXFCcp;oZn4v zv97gJ!{oIr6V8TEO;DbzfFM*>l{o6VptMXb#jje|)8#_rQ0 zW1{l7LG+{-mnm~r8MkXD4JEORr;_!%Qs4bJ_l3vTzxn}BxG~0yh5KgQ*Hs5&-%}pN zJX`kfn^(@Y|K}05HJ$p2jo?!CVI#0%MmlF4HSN2)zxzsyU;^tv4(Pg$Z z)LJ^5EXo_;DJhA=j$!iywJ}DTU6Co1;4^7t0XO3%bGurSNFUTu!67zhD%bKrEfvoOW;XWbMFnx$B&+t>*sW6;(`tF|FE z>}%3%UOyF|vV04bk!RGKEzT1^I~#id1q$jzcg^y8E* z5b7%DrHVEI>&gZVAUdt4x}<>3qvML;PP2m6(m^g6xgqRxKQ_`Y;3`AW6VQw7%Y;Ry z48pt7$`gZJpBjyq$Yfu`^tTvA{%M=qMlY-8 z9Fn=7g+`heqGPc!0KLeu)bmVBBvHa1Nt7~)PGJ*-G6J#rnFyrzJ~q&^c>+}XWUA~a zOQXi8JW(XF*{f=L*{%AiH4;iDy7qqh!P92Dk z!U_I{IAd0!4PN2yA?9*ScumiQkzIkSsV=}b%=)y|`MdPrC_kR|q?;edmg#!e zA9}$XS9|2Mp%`6Xg<^yma^e9h{Fps1)Fy_9ixg!YdV`=a(D6GWkwyyJ@pZIX7I=cK z!-EiirBP;uiV~*YZLKmrKcp{BDqf%?4Hhu8aTZFe1_yJNSbxWin`wv)@MI^|!^%s^ z!5Bmt3Ie-e)C83&lvrr#mctRh(pQ94B?L^Or7^gsh~IGwQ+Ms!x*Rs&vncwrbj|zg z3LhZR?^iC1-afD+o7_UG<}yDI^5JRC0^OoOG7iJ*W1wH-Sw47MZ}75FIU&XxAb%Hu zGlIq(uFz!O+}(tTn-e=R0&u zHaFI9Q3iZlUTM4b`zd3MG?>&bmoO?$8~i7OPMdSBX@Ui46O)1`>Hguh(7I;xY?Z#% z{4O`HOzv;NR{E1>Z`dS!mqMwteIw%q%PWU*pao@6e-_DlwyB#|W>;9+#B zqF4+lj#?TCGRyG2)(_8VC*n?ByC2!3rau*x@O3TM$!#DV8?DJU85hHC(jjG%>)z&_dg_Ru% z!wp~-X;>~iQ)j}qk9O!1GR9v(t2vTD&SsBn{#0z>Ka%yIUtK!%LDlYBjNBen@%R?u zqr)KJUVvYvsMD$OKYzs9VS4-HeH(R4*HjIjd3k$O;Tw{XB%1;Ge!z&HVdYt*l@UFm zj430RyHebW-xj89WwUuE=L7V%o<;SA`S#A7p~y*%j$u^eGU>FwlElbmIyxxS8PCxN zC*9UeHpeq>O+SuZr1V$&&M^&qt+3bR!*91&WL?I5X6S!#^wPx2#XFU<+m*HCuSfwR zSsLYfGqM!F{R<^_PzT7ZpL(O#eH!=rI@S1}`*lC%+!cD?l@RtS!xR(pQ(@h8mRgtD zg!Q+uBbT&$K&)p>e8_~wgDQbsBrX>3vUi`$MvGm6)^eeq0?!$9K_L9jP*!3jf_CJ2 z>I{YH#;QlqU*?iH2IYiBP6#J5*n%?v3;3J~)56raV^23%X&hse&_^z)+LiYtjN zSFWVR^6stcTb{%ZTFS5r{?iwcjE@IGbwa8?9!~F}-^CqrwsHd@OC>1Q+6&sG<$As(Y8o_G&SJzIX?Kg6_PnZq+Kg6;Q| zmUtebg55Z30acyZ5Thva$e{Z`CmAA?exp^L(EfJn#O4POS$9`v?|J>PyPujelx9o40QgiKi{`jOPa)DJ?c1#Dzpo6N&}5a@Q4$E*Ed z5vR60dK((vjHrM%L1LU9b`qV6WiwMG1_=jNE001VG?lKKvZndGmzI$RpP#K7dL16w znx?pPg_u?uy4U9weMm-;t;MZj`#MT^K?((^1Yl z&EiX?^5)S>0z-`pmYXLk>J$0e0(MS*l$}WEZ>tR0L2ER&=#s+} zWAS>t$%3cs#T<~SW^F^h0v^eWXJtMDS$fqFB&zt5uzrWCmg@^owiH|UU@YMBdD{vA zKvbMgwt^mXdu3s;Ou|bHPecSfSi?)6Wuz-ll8+m+MVV_PAx#JR;u_Cet(SziWIjdd zN{K}!mMn2}|FZn^+TDr;ex0DDT3RK)qbRJVo?X76u@W)24-ZAkDuf#2=~2B7=9!ep z*#K+0qB^3x43f!#Qx+!YdlpsLML4ANQ{z}RrD`r+K7UHmZcN>aVH4Ye-V_KsNtV;3 zc7UQ{?0sWl@;-$i$~kSjpho#da*c<7*F8vp-_#eVdQsu}O!?aJT@^T~g!!@|asik+ zshd`!p^;ttemm3H^fGtP2^S-4H-lz7Cb!5XRh^X>nE*Pi{ih8P73V|D)?6$NylLI% z&Bc!~#wW@d8hQzfRRdJ=j7+H}`x*+K`P4wf@4{2bDw73nAafJ4BFlBc+i*MFNA1yJ zSs7FAQ3V;IsQZ8^w4_rWj?o*6G8UpMU*c73`=Z~vy=iN6#sw^Py46pQ6i{{f<(E{_ z&o4RC-X`MSz*x!4RFjzTE_p<=#J3NnPX;oBRk{!lc+`k7{cJ9_NWko{z{jMovP9V3 zKmy{US0Kt3<*}RRBJ+_Sd;SzJwRw^f^rA-{-&Q-sbVxJZr}OkGtfBD4S4} z*_G^DNZ~u=Cv9qmjz(+fY~uRzrP?@Svsq;%J!b;IV2$nJE6NP<9yvZ?oD&UUo>RJ@ zq6=h89rJNbS03&Mgimatv9J9P5n=gCJt%>7epz(u|B$cENooh$)GEfY<&Wd?{*&E8 zLc;IOnO9eknE0Cu&}V&#na9rVGb`2_A8+mK%5c-+pq-G6qqOOVwVZ|qs2vbW->4<$ zlg+Az6o54K21f zy&R%Z1=gJXwQi#jl6_1#d`GuVPmL6^<)ur-myxPrpWE(jGuE%g2!}@^r|k05*ASE8 zW&u>SS3RGDIj8ry6JAC``^I2Tz`!mikYk|vbG{xQ!Kv<~*vixg9i85rdO zvHtya?YwP#*A&P|>K3#-On>`Gq&Y+GN8#O!H%)jhB0AIXa7zby^o6Si@+zv;;G(-tJ6V!Q-iQc_kI#vezf zs+FSrK=uWu*&LAmw`AGOdz@P({W-bEa5}PK5JAzXE0OW6oF^H^~ z+d~|W*W;o&}20k`)pM0_L+U|pE0+(0c5Bys9 z!)1)^+RfVN#!|M+yWzLPri{btlwY^5FSr%p)3ZQvDJ^0pdO&wsJf2)*>Zv(c$|P8> za#+q@c@#O*sm6}kXx<4)gi>K6O{%dC;ug+km<#^ug5&@f@hBx1MDjix(+uxJuBggA z>6wLvpyUm42^Z>-L31DXKawniF(TkfEvor8^#ioNG=bk++a~O$%&^xYSS3b-7bhKv zaqv2?k9YK+)}@wAz-M6oswfx!Eh`5cTTg~fux6PU#Dqk|@82M7r}5T>ud9l?5q^zw z_jV@^YfL>9T*alf7B{PiMu{{E%kjhF~V(t zb_kx89xT<X-CTQ}!ue5`H+ZlBuy zour_Xy_`1IJRp;-W?f<=yx)Xb` zpoN-4tO#c*!?}b*(;4r7rZ-D+qBs7z=GwuaB|T{D0l9QvSlQjs_sgwy9Xsr}nI}7A zw;Y@Z$2>iNnJcNNeZuv3821}%$31x#xq2ZdrgsM5Bw}cwQ$*rjfZUG0jBa3iKzU!Z z3}*eeo5mfzy<_l1@|1ACe^N2fw-P-v35^AnjOm+S~&Jb0%X|dZl~mKK@^9;wEmd83{QdDiTGm9z&I;m~p^Y=~A(!9wpJ_5< zPZ;g;sGO-0k);i;>(qW*AH07OV8y1|Gtj{wV;Xl z60~@(XubsA%_%@JP&wp9)MkxCi}@Yo+5X)Nerx~p4f3kj|GBrg@>5z1|MDG;bKo)Y zaiw@q#69zV5vuv<&)#=hGm^y*HfCJiKN-F$HlF^5|LS8m?G{trf8@H7b4h3UixL+%sUe-y`4@JZE7*bh%*?-SXbYmGTg;D}R z2y!V1ZHA!r&Y-oC+R@16|A)4BjZ6Ce|Nmczik4xgH7O1*ShjWY(5FB_ur?1{Lu+lT z<;=onZDk^AilL}0t1sbcE87t0Q}ggy%lfpXmMN|VSPj^8qtcQFg@|Xs10ME&_PhAM z{ePGKzu%QEbdtmS{d&J%kLTlYf7Bmw4XzjAXDU~2J(W22e2K?fuT#lKemG&KK9m#| zc|uqAw{!Q++?J*r&7W0rUaa_C<0qBZ*?)$6Dic`8UQup*?*sc__sA>4Rp%J+^`1l1 zyNRrsF+Y-bA>lZfHsi16D@p+o(zZz6VgX})Z8x-8t%ouF^k{6OSU_F!*Wy{pa;AOj^P%gc6Y`-fDxd` z%fQnKU(!=4GZ#9kfk?H+SP`B&ZzR`SwO!Al@p@ zTj;|cDwLQ#Z^jOO!wO!F8F@fktl79tJNn;_6@CXkTahvHQQ?!ja?Ld~hWX2$9Wq%P z{eE`}<;lliJUScW{>7tZymvD#He}<9l6B&FQxz##jXK6&mI3*o)+oC=Y6l)4jFO9s z3jCyTSgKq@a!eXL%$@XpVYV(ljF8sxQrpE96!eiBm5$^+q|9v3FUfh3W>l;e^&Qyan z$X*m?kOs$G1&9k`*I5mCC{^mN>|l=Y5LgGuBq&C`btqote>FNihDBEq@sIW3$PEVscC)>( zGeBkSo`#%kinOF(bSrg?5k!Q35r3s+S`@SO5g38s$=z%QVDhoPf<+ygd^!yRyodX~ z{pl8K=9BWGzNYu9+EwS4CGXC+ttb!xiOY+A%4*c-&VRvON#8%i?`zm&I=@m@hf7Q!s&mOZe-zZ~W2FGM)Jk+Hz;@=n3rM zu&i@<`bX^iwXQAO1uw1#5|!q1eM5a@tzA0H(9_C*J$Z>*JPD@ym~Hs45SuM!HPb!a z6wR0thYuSNbk^iiX20f7Vu49SIi4&n38Djlny=aRs$wuSe3mgWPUs8uZ_=e7#HcL! zTWcZ&Hhm2)$qA0z_xFS!Fx{*!ebhjtR^;zWRa3t!KM}1zzk%NUbN9-1m$5(pxwiGU z_0EJhsuowxEyJxN<2mg|ziu2E*?eRlhwu(KGd;%yw+rpvoJCUPFL6U@kBR@-F83L3?jcW?xi*g$xvX z4t{b_8Z~aEYs`{G9RnXAAYC*vC1c?!4ycwXi($|KCZ%sol4Yrg6``UMZa7{%Uy)27 zR_EF~sR3pK`A!BJ$+a5ol@fEK)z+H@y+yWSTjhYD!+bSdmY0CNA+Mf29aQI8w5QZa z*YKciNh**kc@1@pG|j~s2WN4yRAnZP>vHJrnmSL3)IW(s()rg@B^jbvZ2*qNF!MEE zpmgTUJz#M-G+hn@PpJ!DfS6w0Mj77vVj!%H3n-9`Fe#t2xPAzPmUbOOYwip%kqb)d zQ9)v=obzhJ8DLd1rcU}0KNtIz_c&)l@p;o$dpAi%s;um%Yl0XADo!55VzfIMNN6=; zSrPmmd{6mM2#|=18Fob)USMq7Dy^jhXo#2zWH53G=}sFwW;pXJCoPNd{#@^zp^(C< z_0b%U;&v<3+y$}lixbRLDCZ2O>#@asus}ozXD&%=1E5Y>6ca?GWQ1E=<6jt3VOXpu z<xw=4a4JIjpEi<$TT2f)S@hItkjZ$;_V3kHNA4LlR;T$d%$)f8K0vkX$Cr zVwJ!JYDsONN)Ctv%iQW^rd(#OWD6W}=6XC;JzoFXm4+>yS@+CU{uoxSKwzK0L!(OIw)XEs8^7z5O8rp@QMzo(w#cCZ#|(f_xHQzm}NA zFpp?a9JvV_B=xmUxt-ubB~ZyqNwJh+j`Qym;?*B1f|wi9y`w%aySA&cX!o_Yo&6E3x!@ne!QjBFsSX!!h?OXf*U?+!{b-3(F_*|G9+B zpND8!?$k1$Qv@fWgJL8J1(HQwnZF_I)tq7Nu(2YP6*-;}AxrS!%SLCmrVH*~Mh z-}SX*W-?H_v$E1bBKjOi1F#e-!z zEV{k3*8oKb!aTQdPV6_w^ngKqGu$b@gTs?cx<;kNaG-b=(rzV6HJ{&g|)czjO+)gs{7TF}FdLn)SS|un=_r`tLiv-ei2ACXKL9sVJ zTdw*o6q}p5sE71e;*$C)rmPb$blzjpe|s!PCoWW9s2W-uw?97U*jmAGm-%8);K)Ib z^)ryG;61|jSnzWf%(8{3ETp@U!E`4}gY%BTz(wrS-BuH(Ps+vC(AD^uL??+uWogn{ zMnO=KWr+GPZ6z<{`K>aHR?V<3MRg}*d;>ZTi^F-fJNO1Xf1;qwt6;--wZ$I^mJ;i^4U}U ztkX&#oqu4eYbY0G|oiA{DYE}dm7b&F6fh?S4MK5r4r^8b z?&JtaW-n2LYX}?H!9LIO->Npti}~jAN=1Sv&6I61QSPP8`ns=1EJWz^EqO*RsQ0nt z+0hOwr5^ncGb^ar)+HR_4-PRpl=C;8d-?ai^0DZTEHo*n50CS@t|A5Rj*daZiPJyt z6VR_W9`4?=$@rG`+((`ZgXevH>i7@+)2F7g%P{vVOCOF1Y@PB)OuRn}!6i1A(;s5& zB3FwtBK*HVhcpcr^^*WNmu2fSfHhP`2OWrkWAx>XmX4n~%JJ;Lo?t96q~{WJA)4A9 z^u9c_Dg&1mGQ=5_KAW0}ID;gLy}T~D5MK-RIw~7yg>Y3>)`~0Iwm!paxu-pGL0frq$+SJ@3AmEMb_$$p4V@lJX!Dh7K< zGbuVaYFNrI1dy?`XH5_O&TQ}#b%zCE&O_2K`F)zasvI&Q4$ zu)%9bE;~uKFb{Sy3}(t$e3NG?b%rr0=XasJY&Bhjd<635phm3BPm+xzafj|qi#N9= zJ+=+xn#c4!xf98Xhc2h5=jy_`<+TuUC8nVDd482;I079hh7=7o`P<ax z?qlO5I>@#V3l~(N6h-1((mlv^kJ~$79xZQTbYPVxhc4!Yj!xmAY(1BysR?@TLGDJ{oM`G^pn$e4M2FI2oUHOxkiWu4r;`QMUE%Gy`d5qx^HgFy~Wg-^% z*yZ7Q1+SC5gBiFc@UzPXRV<&mH)JU$sW|p@JFmShJ*XgXudP#{J{%!9fL zg(}lUXeXLU*E_E<^mQ1!3~ZWrNpyw=dj~OgYTK6{s5*hArP7W?mYlR{fFRtK8)_T> z!H*vHo1DWS&^CURBF6P>!Mz#PfBO_}T?H6=GGf&kx#n{d#0stmsOVhI-kQ8@8n1EN zi2qU~Gs~Mv5py|2Yb`U4K7f{tS}UET9CM{EFLSU^>lmmw(Pybw4sH%3VuqdVri?fzL8Zi>*>Q8zgQFC;CV*#f zoEPPs7lvG?GAyLuA8|}|mR9Ps=p4KTvM$8M%;R>Pjj%s-ha467(^`c#R=N8l# z%|!dtnbHV=W7*~Y8&Pj<-GC5N`Dix&)lg za=V9;J$-3}mb{3wxIe7$e-2LWoZp1MfR02Nzk(VsRz4iCcDrcsxNO_oF8~d`w#^Lk zraW8$BMxbgUx8xO40)I(`i6MDW6(GS)l{%UE&w5SuLIH`z+92cwdu>)#D!jg{`LV8 zdmfTMTf(feCKEEkI*X8sPLts2?bJf8*Z*{!JpPsH9rg3>42c)E=JjjpFnJe79`2mE zp?^LpI*7@^U57-;cn}OvN{+rTHa0#7(2LVuu;DJ{K@&6>8|94gS&^<_9%2lzx5SYm zt8;7$Zmx3v&Fg8aJ_&f|d7LTDVzKaE3_-$R#c9daSoYhd4Yjyo9&w2ghg%Uv_Yeop zFtng1oBXV`47I2Z*?X_X8yqmxV6pHaWoVIR?_u(#Musj2oLUS2ci*xn{C(KVG=aUp z;gwNX(Mim<4fnV-`M_FeK0=xKnSWy2;M0EG!x>k%T~Gbj|05e+gSj$tUiu+NF=Fp;gZAqwNv7!FQ7m;X=6&Hgaan$B;v zvQHo)cyMS^1-B&=Iynp;C*O`D#b8}_O%e=&6^RDVq0Lua7V%}X-AUI(el-D@>V`={ z`CP7wpa)Jl%w~*jiHeKxdH*F85_y3hf^Kr#>|q%`M}srSS7R@Z{B`EZU;i!--uETi zeYMA<;MnaKk|kqTDi>*m?tnr>79DjS={RKsVucKcN zA_+$P`TE$E^k-t`KL}E&@%qR+rBi({4t9@Li?8qriQp|G>u*?F6T>-j~sp3~t zuU+GV@X^~k8;W2?o2b(RjrCMDbhg><{Ht zaIW6pP>7M$8|RdlM_)?ZQSZIgs)3nyz;GwwW7+PnAKm zj88X}qX!-+e8cN~9Y?~yIHz3k{>$E=^JmL@w41$mwD=6+hIgJ-(aX~3y@kxUCK7Z6 zO2gChn;3TRMWlrpT>W=^_e~Z=LN62Lku}odSKM0^MY^555Fc(r0f5Br@~glR3pHu2 z%9)=K*w-8CNt&Z0W~}sb0`^Y0taOX$n!sK@D_V`cH6s0y{H9@8T=CZcT^x5GSGH(f zbH{XL(R-NEXBPi&6Aoe}qsz{&I$i(%;bSX~%?@5J3CLMN-|>{G)$#a+T0HvXQ>20~ zN--7*ABXDonelPAz^*q!7Z3dAtC^7{^3H7JohCOVt+w_-wX1(^=jiwr^u=Trbw+?)^<*hbJ}N4SRk{>25dKk5{yM|6KcIH|TvSZe)7`&(bJE(_5nfE3 z?0c^GqLPI8{wsbNUV5g3c39irn@i#bkmCa-$H;&TQ~*%vhk&`ySg*E(Zr8Bf>J~`v z2)dD&5P88(u13_Gg1%UlYQV>%^x?t?@{FLfjfl6>oFGzOn8_W$ZNp!ptJ$X&##aJH|Q*Btfo7Osy#h7IZ*rZU%R>PVI{$F&K1} z*VAyfD0FOo_s8A;x_uHG^yLrfS`+c>^7&N1f6%f|JeMKz&p*8D-B=TKb(i1YZ&>l0 zeGKI*BZJ>L_lNfxAO-qMS+pX$ zxyi$Vr*}{rws^+}VqlAu8+3x0;QiOxdQznA{mpLX^p0f4M<2>!!yN>gwI%O-Ws#Eb z>|cgozcG$~|DV$9y^&Md$A8ykKEF&`r0y=f@JSt>hWp}cPizUO9H~UGk~>W0QV<4- zVuH0EjiraUr-A+`hsc~t!_dIfRUS)aU5jd0vEVlMufcN|=GuV1^w|C|EwfGZRVwQ<0#yN2}WA=WiX2tJ)RbB;M=Z0bxwKhN>RBtT?=GxpsW5IuqM*bF2xG(2^ zMMck^__BII4}^E_nT{mi+aI_Zd*v^9S=SSDuNRMhS){A#*qQbt84lj3gV9@KlEE*~ zJzG1Y!(QGceT;q4PW6QNZZd}BExJ{yspVcW1~C^m4bVN2r&%_Js~@*2^~_O&{0_pF zY=L4hT}UU6;VDP9UZ_)StEFqAs%x7-by5Sf>m?*T+UF7-av#dw6F7z`Tk9bXuf`8C zE>*tYGXKpxzl5uQoQO?-r|cWs$&Qr1sGd;YrI?pbo>i_oTd=OaC;4dar}z2i3r|1c zhTnQ^wF%>RYv0eiQm|{f1QJnRCJ0D}vy`YT*4&m9QCQqr@0m3Ow^ys!Z&W9mHo=aU zXvOwG!nCu@pW95cqR}GUR;m2nOEJFsRbAGPI-#}Lt`>q=Wu_%N&5l>LwPg8ZN90K{ zEub$LnVI;g;Z9U8Ifj*Gy@GUAA6lf?+VY07x#!5{n_KQrIo3%zQ=h*mOIftaggF$A zHvVgV*uD(I*zaw6KN;zF8Cdl9>E203Cge`+*CO6VOi)8UD{L~^lm{EuqzLeT-0{Iu12Ou1m_#i_e`kb2i9lKmxYmtK2?ioZ z&F-d>vO*I!kxI^&zCm!zjNwwV7*^N8D_6UQ0cN6Y02_OHZ47}MNBU^ z-5*kfu^Ey@qG$-6s0E$US{7eM=7uMGgbhVApiHsVpV1%lj40$8+dyr^+^w}rCO~@xU8SR?-!M)0M$ibh}+OfCNB<=$V@OwLH!(tiI|=d1zJLiN0=c}^5TxER>+<3IsV$=Voh4E zhT6~?re*R77BthW!36-nJJ(8XEfT*D{ZKjfUTlvjo;(GVJA6c8mq`H7{3(kArWb0? zn@nB>4vXC6*^|Bj8l0TF8guOU({$esGeKqR#kCnBk+O7Ap`0(jH*PE9cMq9yxU0EH zI7et_<@7Nicz(Eyo6hGfkw_Vu4=cMenG@8D)`0$yN)ASIG||PrhkIe~txfwHr50-l z5V;Rb=4;x}ScZRs7fu=uM!qPuU=ENd7-%w*TIB+rU?_$`Rhmlcm0ko&X(vI`S%b%O zqx1o44%wHKk*mf9@<_L&xn@b8X(6sYaz^@?l>;k*qflB4Q{UO1f>O@wO5&(2pSd_@ z2Wp*h$XOY!EoKHS6%JiW&wfz^uWg$!Ih7@*=)@>@(9OF^*U(a=@%fhsN*ord5ghs? zsAo_lCL279o%-Vnt31vvfgt+?CDGb>jRyTsq9Jp|PnbYc=>sBQl5jPV`-9+%q-%bYR7$HfJJ5Gxy98M0^bRW$RIn*gzoIt| zPmrIA9C~)VatMdKW3ENYu61-+3XO7eWQz->2Q};~luXYZPvJpZ#2;dh9xDy+YqJ5= z0^qvad(f&O9M_l57zpd_yw+~(A#>J!`pf5K{?E5xU<7olqlJEj(mSUC7lwQ5?>mV- z+crMP{_W0naxRG`JAT_&vnH)=eJCblDlz&;4v}vW`Hox6GZFZI&6H0Ri=?p z9MRFmgY^$gWMzCA$mH(Dh%AP_WotwJ-L_itv+Cavi9IWVp}D!v;?f^Zz=m@3FK5BR z3kJD#G~)xjC5A;LtYA#HZIfOKk|m?GzUABh+`!IRF;KSjoJGDF6&#yamQk}mfVlAZ z&)Ex_)^k|P#JYn;+M1=A5ksbvMn^~GSz()n`J zg4rC_q$SI&RMP>h#IMBe)j>*fjcUEb%jx`87VFF0>V zpFd2m@5zW6=06Tth(9^>qPDEO`b=z;t+OIDm#5V{Xv7*8&P%H1cauw~-Lkpd;XlLy z(7p}Es-xSEQ3_|?MFdNwhJ9>=ZiS*k|3(H>%yw9dI~BFJMvXya84LsP5$4{S5IFs_ zjfH@+x-hII7Hmjrg}+oOF?bhsEc-5X(?z~~Nl3%!!k(3Hym75_Q%}mmB`*)J-mfHo zmYcP1@L}VJvIlF<(b;cHP+gep?e+H(;+{wEsSkXOtrEIeQ~GU-q)}8>=xPjJq#7Kq z5IQ~mJ0Ho)eDv5Zyg18dY<8^yd$|M!k302g!dYJ^hOPEhdQ!?-9;#^uXkI<(~MqVgb?!SdEf0{2Fr^?K%K97|` zXq^iel%`GUU{vXaLYl4A?s{lc&%?)TFVx}bC^Y7pr#v(|Hi)4PEAHciW!z)acpnPT zxB71_{|WZp$jVH>Zn;7KsAKKUWTBkybdjsM92$!IA*rUc_SDLK;}6cZ$69Km*4741 z3jX`AzQirTu8r)U0*wdyKPETmk zZ~-)8nLsANaPVgsLFefEw~Re}zUY&yaq}x5`Bneg+FwUAi#aU+2Oq5bWeq*|+jkz^ zvhuV4j@xt5v+`zS73JBJkHw)k+F@_z5Z8(s+75tnQGY~KvcO;+GG(>9GjO3Nb5vgitEWw2b5q_wc)5I6NSbRQ8NY z@`=(bo8&W4*-(V#hpx1&-x~Xf^0r@UbrY?~<7AL56IEcg-uw2{ecR2Mn8giGHkF@D zoA;|Ooocz|-0;(qZ<09->SW=hB~@vbU~H3uE{x1&g>6JI1~=v@jI{}Y`e zg$fKAMo)LyG%R0hc_)re*X5!=ItTBDB}RIt5A8em%lUZ$*NN!*DqpMDbuH$cnDN`k zv%^>aXZ^NCXUo^5exoCtW<1#BUGR9`6+{%L$g72$qsqJd_dze%9LdKc3ml%#z!4vt zI;^8V7Xr1uhU8333OUN&-8KpOvb2P1?6iSru+HoXL_yrPz5DYosPx576Q0)p?hR?he zD<%@WznRr5*1sOPGvx#c8}hu$%v|z|m5zAlk~v}A07qGR4x1bHjk&%O;NgC3jM0u$JHg{&A8Fp?&eD|WD!>d;8eCx3cV&P^KLVt3pEp69w^l~UQ z@ARjs<{-;J4GN1-C! z6H5xsA?6i@OBGk&MVlK5?DK5_)`n*;n~Djfn{AoH-J>Qlz#`#3nH()*<&a8S`Nr}| zKxjpJN6bctN%E5o-s1|7J--+QKn}jPNESq=&p9R0zn6tb&vap;4}E%Qc{CKN;_l-< zxWxVi*EEz1#YY7gd5duFvjW&6=mSi`eAd+9pnJpzn-QgsB@7no7~s6=qU=?R1Nfzh zsn=LH`UL|}+{#idneoqO5SYoB!m^midznhyf_r9yO+%COrHZJ&JPDSwT>9}Z#_Mu! zG(F;sv~55moA8u(*I_*^6?w8TPE9ajNUHe5~sS+_rUytE%o{eiCGp${foTZ>m|6dTfF|>mRk}nm?Doby% zz(HJ_n2!1UB}d5-qf2YOh2sR5CWvb1ENv?b0K?hSLNM5kSuk8*x6G-jeIf6?(EqAf zWZbN1crICv=(8-ahXq0^!ON;JvQI(*grs=p2FFKOP(sRAaG$lf6TD8XeAazx>JzCj zg!!sWO$5V_ILou%x28TREKM4m5$nm-2R&d4^NEY-=*b*n-QeK<&Jay2Y&v{Aj&;4v zQ^z0`l5P$DVXx-b1*o-H;2D! zn3El2-xn|W-wq)>4k`d&)Y&CV&#zU|QE~e)#D*(Y{bjyrIW~NM)TSZbc5oIc9L||= zp`-GNc-^~8D?643UwW|i>h)ijn{Gs0dpF9FToH?@^ea1;eO>0ia(~>L(p?pCOj%{6Ru?xEU$6fWz7CK=BdufO zY~v`yW<>L#^~i3N<`oq%U0@`ExBk4hAx$WFCSFZ(aS+^Q zmEH{ISaD33C51;!zzj-r^+w~^KhO_}=@_38F*KBuI52&)^eq3qAC?vzhn06Bwy|@p z19}l_z&Q^(iG0!yrH=VkPL+q^0n=sfEbN9G^iL>@8Kqb|K}lH-h_b}YnP&DWi`&tA zGtYpln~d2}{Bfss_Bi8~1=ode56Z_Sc_99sUcZuZul?$-rp8_;|^o^Oc`+ zeGm4YMEehx_LS%JnI{Ezy|+3%kaqzC>q+U)QNeCzEQWLfF`$riBpfC(>3NnEzWh?1 z$6PaZ#zz(8zyfF?0aF$}?xdNU^#ZNaHYh`@HO?U+zPZmop8(q$9<24?_AfIDgHv42 z?Z023MQabF>?iD6=mRP|J+K(WqwoUv+?{64UhZAet9o&GWzU?btx(gzbm+nhjm`Kd6iCXTV;nh)s#(Wyh_|%6ZBqkbDjt zV4W%RiR{AI?Q8Ql7~XmC(--HccyaR7^SG4l@;6#OT0rQl@XJ^!;E?mqUfFtJ_pXx* z+C9^w@%WvurUf|W85AWg@VA7(?75jhf`*z$mSc3QJYB?q6a7i?()2w@pa(*vG>QR@ zit!0>`d5oEI=Yn(f3oR07(4E@7zttvfJ+_Fk)lrkb zdq3T=a=$-DJe7g}>q&P83VL}Va%=Pmhc(xz* z;c}R5|9`J8OgEUxBWHEq;e6v1KuOR3M}MjJZXQ1NJGO4} z{@-F&(7lfno^{{7`Y3azvj0o%oX4iZ*2kV zx^~n)n+xRyivU;EA2wNO?`5AqoZta4NMLgvlu=dv3llx;l4!{soUm&$O7e`Mc6$KiZAw z&U-IpX|pOIhVC6snG737m)g3-$d2F(0<}LA+nYf zF5^jrqZ-7+1Y@PnK)v>sxL*K z#4Fxuo%;IMo68P+zt!bQOVt&Mb95n%2W^YAxNp7?9)I%L!1yO<_~f=VycgdDe9rjV z^dg1hOL%kFQhG86UCveKc&6UOpZ~pqW<@M4-v|%CYkQ3H@ zU-4}F^gS@8h}t{umtl6G=OtgDuVg%?85?ohER$Y#VabmtR0wBol<<^#Tp%S~l#`UJ z@_--h>&8czOmJZmP0*FRcjB}KD{nT_JR+Xo^5-J#Ml?6o!IWd5?m=to!vo1G6O`Ql zzINcv-Fx2NY5KtjhL06Q2X zL5Ds?|1JG`Ng$y|iT=IjdxFVpH)i|X6${q?P;}Osp9>?-2f+I+VoVhd#UzflZ$y`x zBJZ%*Ke9~wNx#Zoibf)98@j-X#uAVB=YsAESmK5nVCe=P0S%=aDyO-jkC`bh>$<`& zc{6iFWv&lQ@Q`F%Nnz4B{oV{*Efrg|+T+ik29LZQPk7Sz*m?>7)h5hyG3F$!88D!1 zd+kv97dL&cJl-(;f;;VeHkq2%pj?#oILuC*)A2SGDOo^3F0>9|=v_l*R z)&W^+?^V7Lx!fS7ZkGxA!(Bt+ZfSU7yIqc62V3=+o?&LD20-DI90FQ)J<~)Em%z{y zFS@SI6L9dP681xDcQ3f3&LCl7XC-iy+v-hAj8y4Y2Ct`)?jzwtD{g0d#8w4+&Rng1 zk<;T57qcay{A9x8fQVQ$9&~11+LP{t|E74qgK1Hx6~A#Q zo?}k9hp*oJzJ{4uOom^ut?13=ue~hzYfs9E_Y_9e?>oj`7*-Z0IR+^J(lbUyuacd= zw}H}Z*U|Ma? z%5>0FbBiNwG%;PPe;_kpjqlzbe6uxzG-jp`9lshaEKQP|7XO3xKee83#L?BZFmRNt zZEfR1ta|?J|G-n6wa(EEYXkisbdI)=>n%)`I?<)rTZ9PH%%=&txWIfnPTqD}?alH0 zpUa=6o=!GF>kGq_Qt%(IYhgXmsa=OX|L!fl`$0Z8r1e81t00>zl*SO~9k9}!&6=HD z(eQD8ab?j;Bq2XC6_#@rFId^PEMm|hs~~S1dG$lL`FaBM&mtFa=55SVrYHHO^?e#2 z)qUUM=%&`9{o>a$^DatSNSbGrrQb28t5up>Pe@Epue4USV)PT1LH*2_iQnldal$6% zZtSi8B(itBetmj8W$fX&PN2)N16ykOyIM;A;+%fHq*B7W-_IY2{3^jy@i^=sl#en5 zCHdUQ3HPNw`q14m_#WTw(ER2dQtn{4@=x8FB+Kw$qXnz13OPA^<`0a@_AqC-H>e+K zOup|a5F%CbfgZX1_h~?S!6RU_CNcfkU0d}Z`NV-CI!yZVMo_^4UBQ_*G*Eug=7M@| zp#x4S8^%9tr`X>hg@(?EaRqB;<%rtGHO;&Ak$&R&_=Cs-_8MGdi(CX{DewM~O1M{^ zJUVe%a}gI}viyT~gaQcb&@n`L#);crdZAU(!@6Bq4)d7df$qYY1X*(G@oGkpVneef zFC_spdp@1f>rV*inIZ+pjg0^dpXs0Yzy5t0c_BCE8NbZiKXN-Of0%)d05}VKI{bLX zXg0lPHlCS3tkii&m;>>vQTX90N=r$@mZ2yj+16WZphOjOd^SFI-2Jt8QXy}dy<55s zvMs%jZ%pJwv!5InO1B+%l3Vb(OJVyx@OWzK-)isNvV82sE)`CpB8Q7tch+LxFq`G1 zNf&Vgi$0Z?+9RePGGZtHb`o;Yc*mHgYu5j7ct>_=hQZH8D4V1Dh}=A)ln=?D&X*L; zvVv#4VcAp;b5#F8(S>=n{U70TMn1RFKx5t-)8rJ3|-}K?;SM>=~8EE^y$UWZVTy3frTRuZ0 zD@zM5ZbXmQT22t2UINtm153s0*SWjoRpyJPWbr&6)d-tTD=UVjxf%m)VDeekjh=iK z3$vn`2_+ap`CY!16;J436$JBp5h8%=2h%YWA21Qr7beS6;!=q+K*#EnxHyPYRG}~# zuagSLYc^Syeh_niJ`u&OMWh?u-7<&5vH&gDUH*2H;>Eq4dlQSwC6anInJ483Bvbq5 zo60BZun*o}#^6=Nbbs9mJe6B?1=mljEKWQl_%k2|%NvEL6VB2ViE(S2;F-b^`BZ|Br1!ULx4CQ4F z%d7!|?J6k!`2Ahln8q&_T7aqVZ14CyaD5IeVh0-ohTB!RA09ucIlGT^B}H_x{ZI;a)vxb*AOOX%aJecx&}wR3T2JK!M^&2hM>R&IBD&k2qFDCg{x`2YH85b`m#yoR*IIZ#4rh6GSJ#I?8vC&A(Zr6{2tFxc_Eed686#FLS5wl#lBg5$S zNsw@+%lpH6oam70*lakq0(UrNHa%}~2D+ez5H=rNybP9)cA|d)w7Y8~@Axn+>*I(o zZaK{t&1VqOP)ZI_wG{@}1(FI_zpiB9Ye|n32I?#SQ9Vw>st>DU*@1NJEhxP$eHU$%NAhfTJ?YMf&~Gea9)eEepf2yA(ie}2>G266U6?!UFo{5( z(-%)1Gzs$(ync9Jz`U(E_3!q>|DZ)dFZLccE$jCvt^i9+$7JP4(^>k*%Kb-vl!nq5 zKMW;In!b8L)n#nn9J5NyNPA4#wxsiBxQo<8$%N?E-A?zo4JtVSJ2lr@)feX^m&osq zK{a-{JC8VOtYypb{#!8cIlJeQdXp~9aN`5|&;@A95|-8oEoMa*GzfY_0AYBz!&+zI zS9qs~V%nY$ZWuHsW&Y=bpX)yswa1=|IvE>-c`x;48IPQ_6mEWSB5j60zfy-gPoPta zc9Hkg<7P__%P$+e3$8{pOyt>c7fs%B{0@FKCY%@OWa|Tg?GPd(n-*2Xj}fJpk`D>QG zKX>(CS~X(uRH@G_#G9NjAeMW3Gnk484C10;Zo8W$u<CZG zzx552gRG~2gtHKlH_k71>dutX2ZzHJ<&c`NxC&p0c*_bW@(d`RKpP9UGBiPip->!Y zwD2dm!8Ac#6Iz$2pz|VRK$*~C@9ZF5pUmKENWpl3#RNM#SiVra71UekBuy?w57Sf- z7zmiw$WTi%FLJKr4obS!{K4z->lwGIUOW9h)?t#A-~PHVmNzEe1xF@tG1GOS>PFb& zhreE^s%$QO7)P^MWD5AHn3CEk{m~at9$cx80Ny*nHN(a@UAArsxk$X68ya2E5IH+# zmgeeKW1_622*rnLLDv#Z8*dn}pfe=}cj4PNm&>_~e)I}u%6-O{m>n~x`UD)0HDQDA z^bBzll*8*}tG8D+pJs2!5U7DL?tZrD(yrVb$`@5bWv*HC%8D3V#=Xdo)Z4#X@Dt92 z4YUwt6@m(GEY0GItQN?>lGli-Oshm786v(mb-f*jq)R15xxc=;`t(Faeh#z3x80>@ zg+ZjrlpY~;%bzuyyX#0hp<)4Fiwl|({hjNyR%$i*Xrc5g$Oy7IP}s@>a6V?_UZpO z2Zo%UUpXXnGKE<)cY;IF>*5@+BRooNNSae@J%bLabBD_%l}2MF*hGfFau+J-bZE9= z#W9pl%7;LuDYbTXUbKucSdQUW9n1rw>qR&^!`eWl0#I_{MO|sPHJmf%&w?fbT8IiAQXaq#ZX^05nh!4> zI4i7@&S&C{1Ib8Kv&AFu$YrOQ)~x4vr{|T$z7&UDt=+u%#@NE+b(it4GgE5_*DH;c zlE1}okIxj4pY?*Bd~_yP=`|}*hvP*;{^VRW$KP5y0x4&1lM*`vLbn5U$n3p$DO)v^ z?Y)h4XnXr?gnyTFT)AM)>Tk9tKKMmB6*f3=$}Rd+#k4Aw^NuYcTwV{)AN{*Hi6XzY zH>mIoDhB_5gS}gp%hKEBax)6r*wBgF_sUhLIj4@4xJ-zgJ<8?i_uK!SCw5(hCZl~ zX_8w^9v(iXBA*$d-z;mc%5A{a4a#r!6QB7B1VVJX8Y(!Te5bE49P7wdK^(vTbD|9x(*9Wo?9~)z(HptEJYa zSvO$7@AvEVe2usrq#z5NP7t&s`g^4lMchgtX}jG ze#|ScMVIRUCT?0(H40Jl(D-gORY(!g4U4p)S?!z-b{x!r%f?4vU341ioDe`dJaWD< zpCbAeRm7#kU<4+b1{hfZE&$Y4)uLoVQ%Wyn>rh(g9I+=U4}4blUY)RXG?-}TZ6+;q{*$C=f|nV7-Hl8ov4jivv+7QgnF9VdPyK50R| z_&RB)U&Z>?Pal}x^8MvH_RpZo7#){i0_nZ=g>o~dKnf_zvT+JPPXv<)o~Q*DioK&l zhoOfWvf=$oCoLNytP`vSQVaXQNQ&aq&S9o`Hwb&LykSPH`)DJ!J#XgNyhHDn&lfEl7;pai-s{T~9}fgPZuHm@R`mQ+!u#Ls zW#$pfSNL6*aB*ja5mUo5tD8UbzY7y~tJsN5`SvGjksyr`RmII$`Lz%r?wjeuwf;(to;An!`^1-2Bx@Apg#y zO#ivTEY0pkeuEhu<^FrPl+}kyKeq@wan#ptK?Hy&rB; z;YgLSh*5DQGqA9QmZ-A*i3G4}%;Qo4+CX8N6-qkpdt|FY&ty^L%(1hcu{-oE(q6)9fs(W0*XBvvi=i7)AIt zF+Br?w+c&~Cb+E{lBqGgHTFEbv#x|g-3W;*C-LfW@{T*+f!)Oho22_G17aBB50%3@Y{k35L%Q2p})XB63FgAf!6yf=rTb_ z*s5l`z!{sy)U_@bd*qD{mE4qMo2hEpR4$3bzQ&c@6Kr<8Z&~$hi5F?tzABvXKP7E;DvS@bY!Gk;hyblpLnL7TDS_TW5Yi8jpCY*8PyT7YBGBUe{+umxkA z=rx0(&_|kdx3I7!DmL4P!7$O@L=xraC8(?JHX$k9eM=%HeA;=~G`^{pUxE zHhdUtN?l67dA7Pk=6s}ihwtZy{r3Ae4?REqbVtuSv0J~X=t>pch$Q^Lo?HGqL=vvy zt4SmcD>XCJhGlC$ajz3@La{{81woQDN|5U@ zA_^c4>1SI=?RXr+Qg+V14(abftW`yd$fEAz=#7K`x+mas+SZkSP!-jadh%3fiF}6x zE1^b^9`hx8#i5)9yP}`HyOJII7v}c0o$oH|KVyOuLO1!^+K}CnMN!WY(rRpnFjSO~ zg{#MP(cY(u#ekM==fFA6n1X5j1zCF#qiUmfrwuU7Akif+Ly}@|WyCR<&IY-+JwO78 zHI>bxA8QY)vZH-X+mKuMX|y;73#M^`CJXIFu$6IF;DBH=dqi;qT2rJkbB3V-9z3!9 z_x(NZEb>6KhHZi4jm$USs;rkRAXezOgir76T7Nr~vR9MNBZaJrJ9C}P%3KigqNgE6 zw&$D5;0=o~9e81sNM5i26#1`4*9;^=U6<$7SURQxSbPP5?VG1S@#&QFBw4E2^Ku+_ z4$*EWr_}M=oERN*NI!~vz;;mcd!Km0sIH_dt(@Nuh_YD1-p~@w6gkT@z%a&p$$vQV z&(aTr{O|So*ASjcOm9SQY&-Ux9zaho+^?CFv~1ujQufU^=Fib2{rVDnpyF6ci>-$- z_i9yHU$XhkCt}tVsNRyLm^K8fH;{0QHeIq0lB-0qayVx=CKx0W6RqSf$+2N2vl6@s z1oLKijrZ$k#=Go}G$zWVlgYqWu}=-zSQ*}GHi%=Jl{itUCpnXYkBdE9X5!)pqC$C~ ztgrUR>T28U%K2vrJHL(YTJ#)q;D?0?_bwDpzV3HrZpM4nj(Z)nP}7Q!Paw8G6CX2o zvbS|!zMFY`WL$R6iUd6fWZ=EGiv!JMkKG87UgB(}t0Tce%4;LSh$f!`;DB33fq7iA zUrdwXtMz4ZN~dr}SF7|wUGn?QIxvf=OY~`Dkp;fb#H(=B zvwSTcDo+@zOn8VlWPSbD;k8vOT=&dxrkiQ9nzded++ke}boiVFl3Y?ai22>Z0)(+p zewGt5J%%wcwQLu6iAY|;AX)Ua#P(2>wO>qTn$xNSh&p`}*;fYCx^kQcM&%Fy#8Fqs z(}N)nC%u)cg_3n!G>G~7PQja@<*-Qj`LVDsdVbIA=>4mWzwUzs)4Ru?EV+gRcLy9m z8kx#@^j&|KI`6MvbJxvD=l_eGZ;HFBk>`cq!7h{nRmQ3EXxaXA}C-bxrvX~?GcX$7N?O$ZYmj7fBoT3D~gA}ArZvl2WeEq@CXPf_C zPmTMcN0!MMQU=i38Xb-SxU4UhwP@U3T|$n@fy$YtKiq|9Z;Ds{?{a?5WZ$>z`qkg% zX=7A_eDx=YX!6c4iW#3la@N1dmS$~1nY~ml8%+l6g`*2X zQyAc+13J&K)$Y@J9qs_ z_-TSN{jh-(`A=dnXS)ig^gRFSLIl)gdzLl!(qaSOFjwfEUmZMI2 z+RS3h2b~P)o=+^^KtR*jDL~M&4Z!7`L{#Ux{V;OVtnpsa(UVpN*23+;P`^U0h025XJfBs5#1YFA&r;iK8$wP)Tf5KR(@p8q#$l`aSYiQ%MdQ+lNX478H_Frb0hd=jc^`}fE7^R6M!|i1w7mE01l>5mj*?) zMXl_-rA@Sil3U|q_Vh@o_|3n6jct7_IK~*t&u(YmYu!BFN2iDh!-ux}!-)BFth;Yb z1d5wA;ReHmF!8CYl{Ee&l8T;BnCjz3jg@?jZfjo+JSo3M7P)>B0S@%{=js+TILj}S zK*Hfl$~~7gUY3YH8zfS{ZQAuxgkB6W)JMuy@t}eHH9L{>EKSr#o0#SI$fM6_33Mye z3-BMm#+GjD@}``8uI^W#fp~(Skkx-@Zx(4_>J8s;F(DOI%nXE@Jkg5BaG4)h#|^*j zCL}fXrW#XecfjOt1u7R@wOY6g?{axE*HxhE@dH>XeTIN?WOP`#Jp;R~75ep@Zy7Vq zDi_M61XXmSBm@UnTDyL^TP3>KTktQUPg2Xz>t*7sMDnt_Y5{diWc-HH&l6KX+J5!Q z8|TG@z)GU?;US_=^P-;z4q)qUH(UKzSDVX5OgF8~RT7!7lT+#`#jp0b$XB(;Js*~~ zkcCf$`3#V=%ubn#)E5y7Q!^}+Lay$ZnhM&S`i-H~Ou>}W(*cD!`@~RRRhx|>KscS_ zMTT-At{MWc_4PfIpnXVg*}n)+S`15w_fwOtK5A0U|PUM)soi_ zLS%M4?)2vZ$@gbpHf`ItqrBl>?0@3x7bm6f}qwYv(8i^Eu?`kiB&3Z z-4+}beyh_X*U}|J!*8W=&b^{?f9A{^(h5PsH~vB#);HJkh3~tUpRD~Oa$fx1^6&0$ z#!X%5kOp%fjL=WKF5YnAo8Re74Gu{mZXMPuhl<)asdUIfSN>3u;f`P!m83DXe0>de zld0Br7pOgVcxt`4V6S+&yk-7iK9fl@7nmedj#sm_22+zCO25d&`Dc^DOV=R~FF2A1 z%$q71#6Blj4OLv9o08;mc8K(BX??sP8SO6j$)4BsSJvb=#wVL5ek=7P1v1}$vZCFp z4dzvqd*e>sl8!u#dHM3?r)RHzeCFz|D!CaYj^q)I9zhbUY`jD-4?`uDfpHh}G;q#> zC@O&@H49fHmAzVtE8IWam{L!hy6pZAWCd$n-ZEHFmJ#xgco|)X| zrfRq|SsW;Hh4Jhbol&%gr}0Q5hMJ41<>q~|>|eWnKT+O*!(3ob4; z7Sqna&LpR%j`vkaa#&_@h*VKeDH_D%3RQUM@uh(sdB%x4hP zyU`N=amz(b zNYy{Y(TYMs$}OYGz;1wWaHVq2e?Oxg*!j-AL*x=`@~r8c-vlFo5{x_%On;X1cG^6` z_1?=zexEu`FP})OODG|yrWV~g*880w74Rs!`b35ZEV z!H`hU8HdqcFlWu$nKvRfooiiQ9O&vWRLNn zw;0d|>VyjpNa^S;5II~oQjtxE55N2TkDX(0ezq#(67z9z@GcYWt&5+QG2#Uk-y^ot z7~4(%D~-<|IR7jsT~h={smEg?R0B&ERL>2@NcnQk@x>MTi_z&gCUJY^rlCp%U#izv z-+{APSDN%Lpc*rI?LyA!P;-vDb2c6uhYsuMWwH3s%rJ?m7Liyrl<3y&a*k>${E^ao zA~?^+&IHG5l?0}Nz@6Fu50lNjxRn~SO8hF-I${}I-3?k$Dx|UG0`hn0+UmQ4l9o24zR(6 zIIeGMLY?EIkk)W$`IgX=#+{x$_e-1iRGiX1I72>GRnA_@Pk|85BoSl(g7@$7k{5(E zn?5(qYse>3-S?2xg+QMtX*!r>NzPE0vG5z@siF)=q?%1O^_Vno2_noNL~wU9ne7B_ zEMK86_o8(=P;mH$pYNQ6V3z_J8K18OAfa5DgQH(HV@_&)m^K%?rK7`?YhZKNy|agV zab)jh@`^K?ET^`8vQu05-+AqP>qy%hcrN4Y_ITk&i#hD*2dw6gWd4yaa0fKKYCe>H^HnBu377*iKlbhK%lAr&qRa9tNym4}WY8kBw9 zU8<*34q$7>T*W6JON^e}-}?NAds_u56@L|)^E{WX>Gu8VfJea(CA^^We(rBd_h50s zRLb8sJ@QN*;17;5rq^SEZO|V3 zK9U{!>5q?g|2nJ+KPW!9E%>($$N-tg$w1MA+|~L73`CMsN;Jc2RtA#@=j77X`O@1{fbEs#winC-^b@V6 zHwJae(xlAaAx~K=c$IaSrS&n|RoYkqxIJ~uHoryO1zvk=F#hG2yz*z8k(AMF9NQ{K z{IRiv|J5J-Z3XQ>p|MKqWns3xy)?#=T7H*h#-2jY`J?BUT2Y|DTE-vPg7^`s)#u1S z=ej>L(WCw7=s}eHN6q(pr6x* z(hN_n0|y-|RXn#BQ)e04nqm`O9T*Fts$7ndlQ(!B~GDSb6Wu(}JcBcq3POv*IJ8260L zT@G#R^n5sPc4EMyO090%^OFB6yZo?^JpSy`QKoTEbU;1XMpYCLamdoO`!Vld7iBY& ztBWN4d4o$4x!EN1E%()TOop3HO|~f|c976|5LH+e55xq}DdytjqI(G0eVfogua8iR zjx2_|&{S<0a`30o%2)0BJlJ*b@eEGxnolB|XUa~V(D>W;XhXr!2Qpl2dki9dad`bS z=dI@-bxp0c?+rySGL~R=LzmP(ZPH6z1z#aadWl;u%XUY%u0yEJ&@q#nny>~(JVweh z^njycs1Ne!q1Xlh4)k}oyJ_axf04Hkj;?;%oFaxpd`^RTrfh0^7+<9sjH4`-IVyby z+Qlorj|-XzADC69l@%6L8G5k4B9U;h0_tI!FgGl%!Z1^qZ<|E_Hy&^m%6Q!{AbIY* zkvoaZ=CDZA2Gf!(hf<|DA|rI-TU8TA#dY(>Nw~+p7zNz!^T7^#XW)eJ-7h!UaLF* zm6_{jc3k@1ZWN*m6065aEa2W9)?dM>IT}$Jo0F7~jrf4TJ}H30QNrx+|HmC7{C^t1 zU`t**SSJ8D0=+t-8)z1(@up0%Agz}#$BB}*>cJ)QQCV6`W8)RQvh;zT=%ihx z{N6J$5(=KRq*^sCQ6LaWaa+L(P+C1fbcT#VvQ{VRv^uZZ+Wxl^N}J+P2N-?Xq})eLf&kL*un#d1Gog$GcX-?iyWvE2X*j}0-BwLqQnsH zT%r3G6^AJ5_}b8v`jz6vG}Hlw)Bu=Z2jZZE;f6>NxQTYK!Fj@@Wv#yY1&(Z2O>z3U z6wa6HbuT}SJov}^C!coLMP;r$=pHdqB&p@_6EEd3_SUS%rrf`=`pS)^|2zm+3wn;n zZhO1LdewvJ6FC2!|M;fHod5ii8C&To$yFCBDom8pB-I##y$OT)42GtSmRrjbhsYp} zD9o644w(S2K2tSCRr0y>+Bzm3R*BS@3r&KhU^X^f-KT+En91d1X&a z7;${cFvlNzzE(~2$5O>hV0dYFMaMo7y@lYKbMf8L!(*X?UmGrP zy|NgVH4IG`!V?--KjXaJy2ezaBz!ow{})Q{qUnP8l`&>%Qp3o>^hoQLg9QIz{yO6G z5AO6HjNlSK`RVA5edfl8B@>jt!a4tN^G~W7zvGF78~xvy>kfF7vWhyb?Rm5aO*;WA z{a?v(F>F#tQo}RR7`Kyl9D6%V&PA_ic~x3m;sr9MGv327##CE?e&BK_+H6s2K=Yah!pPQi2Q>FmtrJfW;2L zwVA8{#kdQ?MiT@8zbHFwC?>#g-J-W*r2=DtVhmn48po8D0P}C)vG3fM{NRJDqRUlZQrUiDfLbK(H@ zMAm^P6`hyQf0NA$ZhmlznMhm^#i>zxjm!8|ih8C-eQ?}1-2JK@ZE8v}R3mmWs+al3 zV~f;=qNy7Kb4f)H_KKRS#CyVN_Y51_(gw0slI;*3ew{)hr@Zkou@-?HLbe_`oL9g3>s|UE4KKYcd%kw9T>tz+| zB+Zd4wpR>SX5@|jBVJse=#|H$5bi`L-f4a6C5HSb9Xky5oMfo={x%qKbn4fWY&W~t zDrY-oSILJ?uS6=BTEvz<($2f}e|&WS+m&6jqU)uf;hpg81K((I0S`w0P*(ak?hAT= zF|O{Iw@`(nsNR-}7V6n8MBTZAi@SW|J<=+qF}=417@2sN;-*}PM~1nJ06W0YycFUh zM`ctP@nmw}FsB8u(At22JArC{-?Wl)gt7@qy34X!uFw+7wstV+WgEFm2k{v^6?tqE zQ$3!e4p+u|y*N?(!@QqAxYwiI_#ot7T6v{}eB`LJn={xwUjCyv(7Ep%sEMBn?>uFF zoD{~K_h5JL6|4W(bsisF`15sdL@Bf!d_l-8QZ2*8EYC8WlCOp;LlEcD!n zaQr5N-T+P74A!hKU)Lq(7ZpRWYAhicul_A`baEfsJwkJNO}xKtHzv7x-y`zvz}I8x zRkA}9=76a@CBEzv{r!`F<$ZH}&AfG~BCP25nAS)0&UU!(BJUmg98r5N)(p#?$q+7{ z*rM*|;!IVlK_S9I!=Lt&@z)W%pFHFxfvLgL97}7$FW8WBU%O46$zV6r{T6r;5^u?X z%P9{LMVm57+zr;_v&{F~XrWjMF|o-ref$XX~Y&U$uRBk@K1JbBk?s&PY=hQ;SD zTCG8uX5NrGfH4v?W%68xd_y)vm~$?K1k=FW%m5jA9oL9L8QbBe+jV1#yMC0p(S+mc zI<5~j_5`olTRt&3802eWIWNp)N{(gwFSd?h%Vbbrk1oBvP|36}CNDo72AQzbG@-2hFUouoTQ=2<<>;`q*R@g7~ zLw3uk;cSaV7s~{bk;YOa5fq5?)P`QbiMWpnqglKPiSL_(f^1Frb);WnBC;H_E(qb% z_rlC5P~>o$S~r&^D&=>I#Z)|7hpmrQw*uDytOkobLZxx((QI6JGm7)f)ny>~JT(VA z2SMdNwA1;}IJc;umu;1v_cJ{e)1Y*m?!=ZxRJ4l-k&2|P5=WM2Ji=s6vBR9bSyLLc zX>Z&*#10fh>RBHLp^!1uW!@|HPrOCQ#4#y?g$8+az1|P=AVwR~<(p$~XGfn4N9AC| zk!3-8Q`s{dVQ0=$iCxApTfy(|69S2>X}~aQ7tA^6>;Bln#hY_Y z%>!ZlK5P%WG*&fF@0_#^a)9THy{0Eu$fK3oj1Q@2oS`0h8tjZNR#4wE5H=N1-I~&c zL0Q&O1H_N9c|&ajuqX)Qx=6UB!c9t?FHk#jK$|M$yKpc(6m9~wBGb|dZMfLbaTQYK zkAfPrjysa4<-^I%slr#Y;onh-5NCiKjwQ%*N0z-EkBk--f(+}remmUYFO$ORWKLXY-2LqXLL#1yx@4)Xai&7Q9mB+Jjks;GW-AW{H8oMzFWM2p?&3WFC~n^PO+3eiG=diYz= z32^8v>TRzGZ3f3T*(wc%=Q0}H6u2ZkITb4Q3v&?-49Qs@CWfCLXFKdq$eVIbO&q= zg}33?f;H}?LrB=1rmwexM;}>2J$p=~pa{c?bcs;C$)mU1*gB}{hrx?*AJFV@(hejv zhIHFdiyDddoE+Q2U$=9tZe~@+@!QBd(E*p=s+$)?oO`+1rRP!`mIQtF`hs0;B`cDi zY8anU8eTl$b>7*ad?$u``L8+1Hk@?;cO(-Z97iuM$eQ%Sn4sw)4bB6^>Hvf%$75$u znQa75*lhI3SCb{wGv-e4?}nvG#_&OKu!YS5#@NXjgv7J#He6Hd;onJ0Y(Qn)%**KT zJ7>#oBfE;}Azw07Vc*#?aRHU0ua#=V`cTZQe{JyT7bn;BJ|lX+7ZyiYja={}7)wV3 z+57wg=i_5=OTr3|T4gCvD%xu>g?AL+R!`H$;c3=WFjQl5fibNzE-s-HD@aYV4~W!d zLwYX=K$MHZ1>@RKkkoL1L@p;pK+^aG!fqv~FNS7w>M899uu1=U*t6r-uH$cdK6d!C#6Bnm1$ zftbP!sA>;Qf#az*?)eCE#uQ*+Z=ys~t_>T`ppC-;d zUm1r?`R^CA`abFE*?#-8riF*8DUG;dy6!3c+JnOV#){vZZ5SmCx1GTufacsR`nA(B zF3Uj9fQ(mt(F-~qAlWl8AvsmpG9naOA>3z3D_G!VUTlC?%aDvb%j=Ye8q?MxrH0Nl zrA1B5oDo~mp&{2Rg%{vh4$IkS6_H-zY4cKpO1bBIETxzORUAB6Gf(46;6UL z6fcQO#2v|^MfB9V?_5XzkeFH-tP(ABl|l=Q8H_;;HG(eX+1qCC*0HbhNA)!xRij$2 zh8>!AN034yk~0d#QTI|!0nHX|Mrc_^etSsoBywD_M^8k%US*Loj4n{TwvxVT|7Z8C z;v4^cT}a6FvzL?$e}8cAEnjPeo~b0PyL0QbdvJGc$69(uOaFq!SJ&Hi8J_Eo9M(QN z;8C3}NHdi2I!GhYi3OclCMRK1ExOxk>5(76$S_sswXEg{rV8`>1V1p(&--_YZ4x2vhL$~<%(=IL}n z-0tNcb&c%s*)JjPaG6U_o>%s~(f0W6m9jKCe=d?Wv59`IDeOeR=$-1`B-K9CjDsT>aHdmu>^qgd`r?d`DmlMH3$+clubxa^;Jut= z_Q>#NSftU}*cv}n-{groYE>lonoZSE0pBhAw(K6F(MGd_DwzW~!*ok~s1Zz7y7XHq zkoW-zS#@l^Jg|!1Wk<(* zvnHar?V;JMOm8~KPu5=zf#@-vKbf3ts-^^TRsP>2d!Xz^*&DEWRzWs{(T-7ik(1My zOf0t6B;$cvA?`WX*A7hbVF~T8&z$e$Sv9f!mEP|(A0#*QM?6*grD4x0 z@%&wPW`!NAMSnf(t-$}W3G)*wCQI-Nzl7&S8m|}7iPcTe6nSxW$)cxs$@ktm%}Rb2jiw5JD`lW}HcGE!IzP`0 z`QUgIeO^mk{4V}Y+Uf^p1jF!@4If!PbHFTbYTMIeThNxqq#aI zR>-%h6P+oD7&bCHeH~^wEnP6iaOQQiXCf>YG&?N1t`x>dX6U5WM@`vbj>mK_)-ySq zrJ)l06LHKShM}B4KZyR>r{9$Y@fvuKn)j2b_k1UHo|QgGTWjTKYhHvDe@VPl4OXe= zbGg_ru(Bd6DuNq(2@d`@1(P5~Gk6N*uU>h&h(6pn3KMo2m9q?qy`4ugnzO=ZC<3Va z@|GdN;nfOtPKZry+@!^Qg0N?cWEnzmS4-8b>`A33leRg_F-y%;lQVG8F_1D@WS(UZ zu+0$Zz5J7Rc-J~sFwY=6wo6|tn$s?*n99Vg4s!K#=ikWpmq)G~J~%wjfXUk`D=NB~ zo4iRk9zQ2X>;39zKf>?_br!#;sH+nzS|cjAj7l>$u@nO2Gm?E&>NcAEczPT-8c9Z! zWwSVvA+p6efFZ<2N6NAt(zpOLD61eO1{{0Y}p3=u-b~puPN8&Ly%S;i-3E8@7h$TuD7N9sNs^BOL z<^aC_RZVP03JQ#L zn2``SZfvvyW#t^LH8&ok(&1d<_Qp#6jLktt) z>iYg^XoZKj0=&t2Q~D!p7K1#sK`vLAin`)G6z43?V;tXEFe})YFw_7?s4MUQhNJ5r z*3ZC1zzNN=Aro`b!5aoophNjc~LMfdLXYx7qgvlzySexi*~7sF|+?&GiL zs5J<^IY1`AE6rnvqTeI6diqcw14b0j#B(9r1m;(8(fqJIeK;0`m4$+sbrQ@Cs}UoN zE@WlnN*D^r06VP{C7waqH{{^}IM1QX=0dL-<^hB7ruu)r<}`P!b$W^lh8}E_6@Hmc z-ueN;7SUe{+_W-S@k4IW+QYv$53WWih1FzXzQy8ZP~J!0bWjzVlrbGBgFjrpAP0S` z@B+3E^ie$xj2B{d^!qKP_m`0!lv&ZmPwrjx+5PQm+3o~My`22${o+rs)YlA~yb5Ars)|fEm$KWeIGCA<`M`Z)di`f51E zK@8&@+t8@)xs;%He1(Mh8s!W}&H$4*BmE(VTK(!7K0xy z>24Dsio4S|3MHnmg`*2M!N-kqsptC-ZKUu&RNQ_1b&3C0+O@FcYuulXT)j|n=AgL^ zJN;vKU>jMCU*pgo3LpG}`HjyW;nAYIwa+PhC;n&B?mA-H63i}{AV=2^9*;$tAogkJ zS0cAuJWFMssg5@!kE1{ycyFeUIgNT2S{O}md6Ee@04~9ja0(U)V=#*98B?omL?}Sm z6jOEu>2%DKPbr&xrPY~NuM9*YDyfNn8xc^ym9%J^9NSND{m#I9Uom7 z8U5GJ_)EJNhI3hx;tQ9(d@t1Q)c8rg{U*HWo(p>#mLLlEwVo!x+irHiEl{9R7snTF z(pIj$16`%h&+Vl8lJ_DGH5=yWDgqa=J<)iIu4N-@tpzwLT&{W9Z~Q&IcGnfMOimUQ&K z_u8kbnPM?(tVB&@%v@8`$+RQ#v!(Ii^ie`}$242jg>utFF+RAkWq>!$v!l$8DQH|s zarF^pk@DWMdv-YZuZ1ldc)m&XEYwOB`+!vqv>l+Zo*xolwfXi}gRE2A8+SSK%Nv$= zLO@|^fOxQ4c^^5Lr``m~%C{n`o#UDllYh!ykDR#A7vBnYUIAsHIbcreI?M~#G2j&e z51A~<*7CTx888(o>gx|DD$Iq@#CL`$)COeI6_zzrj;-(SF|_V^8KTg2BBQ+uQ~_0x z0X8Dkj<(X=cSQA@k%I>W*Kce%_gZiM0o};RUYslYW;sRFx82$vx5)#2?!SN#G5&@m zB>MHH)SVv|95;RTDBSWCcPazZ?khfS#-)>2eZ&uo$5G=F_%E3Q0_k_oOzu$IpUAqg zXuhUnL|}K$eud=liX`L|#MfH3Hw1ELnkg|@tBtAVyvHz-Qw+4S7YMdOX4R3L`9tjm zRIwQb^RD2aVT%OFN9rRO$PoMXu0VOcdDb7@VEE7KUOfHOvA_9M*ZsfSWoC{4dIGZr z$#lQ@7rv|}=mc+H)+f97h8)*@)HF45=9tcrI>i+bmh!L!@LN zsf8p{9fpN9^z>lijWNd4=pr<1uZ$20S)m)8gXD(${`1d2rr9+X@%1~&^fiSsBWM51 zP48LbwVf%lNQqwoB6bEw>GeMXo zj;3Ro0e-Xbo?oj}j`0!|871eaUZrsSiNqjCW+sS%ewtp5i2Ngd6jeQ?YHP$UC`!2m~Zp4;*;{5kr62~F)5z$@!o#+H=v|c)+ zL^AVPY2^{@wl-khzY@&{A|uUoa*-k_K5mb}t}Em&am*G7V=?S}OXuVg%-~aM*Y?DR zeIML7^7NA^-}FuU^Qt`F?5f1?<+OZfuKe=jAEwj@Y4OIf55^t@`KLeVi)W}Wl`{tB zUSWH$!z`s^%ezsE=rqF_)23p8^AXp@0yR(z?D7@l4m1i>x#l0W`lQB~9Eko0u zPfh`$Xs20vzA3ik3MP{q}VQZ{8TypZOo$fbJ@!S?+3Nz&Yjm*d3TEcrEh6iY;O&qUe|hTa+)8i1 z%Nc^?EJnhDn6|_N7!hHQfszke3M^BlzVd1;Z-BHdiw!NyL<(6MJUwFsoJZB^B}%YdDrdRLYm2V0#RKEaTtttes^xikmBB044W-jh6LGglEq!X`8TI))Ik0$2a+=@ z1riZt3lMD-(CtZBF=nN0XfT?Ss3PYOhbyE9ApV0>O~hV|`nyAetA7T0RFMmeIRIt@M1OQu7k?v>0smQ1=5~W7*|(7mI1iiRMbmIFpEi`?X57>5dw%R z|B9Y-AjMN}t|6*)^$9Lq($)^jwQ@+#)%DxyigXyS5;|UnbdFc);AyAm65GW~TT^6{ zZKfF;T4B&H!K}&%k}OsuY2~C)7k}sc$doZ2tI`oCX*wC9W&mV#REB!16JpZokg5)Vxp-_d zsx&UZ3`sF6tluJpqTUQ_G0n@cS=nNJ_|X)0>k2V4E@elk%n&P!wtz*M_5qUEtR@$d z)FhyA9JLKY3%f@S>gR2QE*HZHlcH49IB=x>7XF>zPGEw)fq)~bSyERZUVxugwet-i z@ysP^g&`eUuYwXot;tfxo#TuW&REp-o6+%6gCBlSM8#2{h-Re>!06!$WPPQuxw!h+ z%=~9!YA9b?cpmZfh+0}97EBJ`hbZ;KckNjJ!Xzl9*NA8qL(vRco!Etp#fGNotM#&l zat4dnwo*(3qd}Rzk`rs>_vU~D6S|_(xEiV~1xE#6=xQb%wBWbEor2J7)p18UvB!ei zLsTr^srKjyLraI|C0v;&`s!MUt3X+b^zWd%uB+x86W&0fF`E?Ytk4z|ewra<*I*vC zGVnezF3pF->vk>kfy=X|r)01r` z36+CJv`a~KC#!?zY%v=z&}F#xWg7#7uVm!28gbxuWz{t7f5&|K zon5DyZ~VY~M`-P`GtJ}BHMTn7!%a3|(Z*v-(HZKkA|UQT?+?`ThO)#w`y}LmaB*?g zp&mNDr}Z{MVu3PW7gt?afEqfHAxK={#G$ZbR8XULnYK+Z=UzI0dT$1TUS2E?EnJ5g zJiX!TAG`hMViSHpv1(88<_pNZKvU|jZkhbc=BM|>+&Dj!$J7>7^fhKi=;&Q`c({oa zLadj!BO`xksH{u8X5BwJh4HW;K{1??R|v;9r8>zVNtKkP z;{k#JBAQz$SB#wTr!pqnhRQJ%PV8O3aV~~QXThNbJlQ0qM7TI)fZkKsP&Zd1cdw&LqBdB76=xtCPsfxI^F8vo^SW+$`7aOG z96I#i`mG~%!-}_7@}2Kzn#fUe$3EVIF^3Tj}jxLfUWSUq=YxUG?U!x~I=O=4Ljm;0!+7*0WgLE8qMb>)N$7UI?Of zFN8=oY!iG(7-|9f&#W6M8sT8v5ytgMpaRYro3kxlxt1Y^nA-g^8bnVNc4;*UoC2Q# ztX6a;TH)cw)Tz?v0GEHvGK? zp}jpX+b=cXN&XcI~h3g`{f^%8`H=h;r~tK#>b$Q1#hyXoBTamj8pWk zw3?CS3`$s)IHa@F^H7gx5R;_db{l46tkg6X$c^6vDgN?2ET^1E_6RfK=rD2Mmvk;J z6ZM;VC?7R7L2kfu29w#r810c{2I*N;Z#4;|rMKDO(9Tzxa!j%m;$Rf!nRs15^Oluu z=#k~M5i#ZV&%ED=cJU=16Pb)p&y~EU!JWO?L1$GidKk7eE#UP2H@+^Ii1RCe8pku5 zVRJ05>XUO#^3sYC3@9;eXm!6u4@!vWSQ}C*FX;wT-?WKdO~wKYYY!z{p-6{7`7|e( zfcj*)Q@YJY5W@ENkd&TwDB>t%afluI?ue5__1_T0Mq~Z39Z09sf}TEVmY;_ zpK)=YXBM@^)C&4vJys?U8!s6^hF_uCX1g#nB#q&p8&H?;H{~aRoGgt=?0p=hpMi1y z$tf-7RI)UG6z;rzv~9Rg9>sJ+_mZ;YaM*>U)P*<;>QRT;i{4Erv^L;r5J6n#0QL9HfA9tyZsH)nHUGbpGD`f{u+ z1zWutE3*+blrRW(J%9<3PftQfj-GnAH-!mVGv$DaAFXI>GYi42>8InoxEDnsI9B=n#dM=1gJn!j3LI+lT z8vAF&p2_d7*2OIU`pcOl*Q5W&j&ObBxIcm(tn?AO{F+S4CC&kxHkSlr5m*`0W^&FG zNk()sR?hFT%7tTG_2GD?=fa{Q?z|-@7yo?X?pg+J6n`@&z;l83!Nuiyeq!#N+uNR` zE0;E8ZWZO7zwF1^kn=CHD2r8eJ@>b-kQZZ2qI!>^IuU68h0)aC#J(nqC^1$5Y1I9t zbzU(ZR41&t%|;Ug$qUFK` zg-iiE1KSvyW+;-C#e1Pm4A(2+<@B&3!R&Eh)ff3YceL-A2n$x+s%9CbY^gW2Z3os= z1bn&1XkPd&k@OgYW6<)6ulc2>1dNn$NxO*Je3cO$$R8;vfp~2Ok{*60z%mURixre7 z%L*rj(=@a-qB{${f<$yK?qO%L3zA*zoAH>Eu1Tt?Xc`ZU<9>jZ&AKUJKxu>?qMp4P zM3m~PRm)ww%a>o-mggJBYd1+tC8zEq8{9n)s{VMNns94e^AXELYG3YG|13!DM{_Q>3YVq77J_E@uJZYZDvIQ8slP*hl5f@DP9#6fBGR^=S`ZIOa(pEL^aHn0mM zS!IPgkh4L3L+&Vk-%m)wb=hzI#C}?F(8*sO-JqR=5bRFe}-KJSnF{dUK|u0Hbrhg8`7?-jSc zJBpNsvW4-AiiEJQnJF}AvAMD;nYvP>al6s&@`Q3jDKi$e^#3j%qU$*EVos0aZwWC# z8xZn&!;`AAwa7W{lrT-C-tz!7O7+w*oW5aO1JGt=^q8p4m2Tk~G>Qj;L+OIg}of*h$sV8t33j4Snh2$K9m*ItMbjtrbx!615wBzg?3zrO(Ku|%Wz#{)ymYBl=}>0~ax8W3{}0IzH}3G;yn%eA*;4Da zshYaOlb{RP?F#V9p?c#|!i?Bp6oBXDDgoOKK>)Z6>Mi*bwwuDnMicWYqRuFWnp!*0 zKUM^pB0s>Mpo?XX38eBwDa;;VVEw^hmz;I_5*!U!X`q&>KTG==SqUS8r~U@hk?#?L zIH@bL!XF=5{WcNSyur#&~D>G}S~_^%1v=4c>V|VPYeF!k@O` zTZB{ZZ>nxitL^;~`LB7n+PsF`SVyZ|8hqvH?$FlXUg@r^`Cd`}uJuaTQiSOE@*w$d z&jaxyXDja_yZbVR_fc*5ov@OBeODIV@_SO3U=7ge*vJS9AU0{g&^wPQeN!Wn`1wkjO*9)5@IknA`kbf5N1qBSgkZZEBL&b(j z2b_rEq&X%A#49W@=@Y@(Kn*-bf)uq0VCxa^>iWdx*WhYNF#d@lW~hEcd97$A;+mOl zvo8||8WAF|O3oL+P(u~>8-l5QYC2Ml93{+Z+QTK&gXgwdCe z5b}~!#)#J>3E6vdp$5Pq2Pou_z(!F`4t63Y*OXk<7(X$Nu7Ow%kk+g*+8O3$s05a? zo!x?IY;Mey3ML%^5EM*cEWdXCQ`5zsDE%u>(o^zP*K%Ig_GQGmF9%jF3C6r4Su<%# zPJR5wZSu0eM`|B2n%>Q+IJ{Ys{QiT6$f6O(@EPUr2x0~Kd-o(-<8ZMddj#JK^%W*u zVi;{PXX^d1Re;;*Z4^uw_?xjE&?{Rw!&4s|he!;75dHAuiRuR~b|`CRxA^o}V3&>^ z&sy;BcmC5qm-6Des%Og$KL5G*G8+I@w!vXXjph>Fa{mw=Vd(>u`l` z=TAJ^ljRgC!8Y+Z`%z?(5#~>M&_=-lm#{;gs^{>-wJ7oG6r7EDtE9^k3ER>O>OGgl zTf(y2(e?Ujpa~5m2t^m#QSov>>!n3PEI7>#M$hWY8tjACWt9=Hlo$UxSo7b%U#@z- zd+gQ4Y@V*ILm58hR6N+sCcM{tanpr8cL-;qUioMfhgFOwp_sEh@m1%ow7a*qhD5?X z6kgCs`0`tj@TuW${vvri$nQvIMCGXmUBkcF)10FQ4H$80ehU|*$^$4T#`ICQt z^u?i?CHl3C*KWU}zps7TfC&rVs;#)cQwm)G1h=}H;R_pQ?Wrb|&OvBglRfq!GOlBt zX2|Ehwh|>!jxzxbC6DLZ`j90EOw2TdAzwC1#Vxlq9YE2c0L<&a;cN{KnYF`D@KI8XWMy0hoTZ?P3vG|Yn;?a|-t`1pH(QI$FE|!y$TjY{!>zJv7 zdb&1PiY7IXRVh(96{xo0nZJ1E!UL$sNiIW+Hn8YHt{}`t$ir9>Wr1n0{J5O!YR%+_ zaRGmEeXwe{RD6eyzTzt7DU|m1Io}oAfBp9L&p8h%!uzdgD*0=2-n*Z@+qi=a64HqAwIJ!5Jttr^mO*K&K3IwN_xi^-S_} zZpKX9A{9;8Jz!>)M}IdOh>CQy{fZ1Hg*OR$tiLv7tb!9B}fLm^9pgnkL1o z)u*>&za=t;bQvmxPDM+YIIMbCx4;(GFQB~nPvWkv4rfbq(qB;7#$s_BRR zo|m=sQZ}VwBieCX`C>*$Mr1SIxM|M(Ifa_=)c+1*PhR>`Gh0NhA}?yDb+JD&zEr&lSNewOZqp9o6Nf5W=?^9F!|C%B`hntOC--MS5B= z%E)UWL)JoSsWOHdc{m~(5GKtd~|00%%tcU0-bNo=gsY#AMF zBVZlUfaxFtOVcI9)g`maL*i?XVbArUY&4?QK-7g`w)ogLNfP^!~& zq{jkz*;!J#jQ$-`1SSvLcY&V}f6HQN4^8A;BlDbuoi(DO!^NGMN znx%Z|Ej3tPS5ru_J%11$p{+%FCMJDctAA?HlbW}}eyB2@fU1lS9Fz02Dv-zuXq1l1 zsx#MeLJ6W`2^)i%I~WshccFllfum3`b0(8x6? zn|Fv$5{JL1123co-GV9Uk?QxhLFf|C3+TWwN+)M>k{)gP452)4)o^a+{vx)gG{7Jc2P@DdZUdKeRW z*bISRFhd|-%7J_SEC#l;ZMeP^GRj0Ku#PHGW>-6eCi?PnVXdQ5nYZDWj6&LmD~enS zS%H1`yx(gz@3URB9&2tzOv@8d!*dNJ%e8+|iEQT=d-)TteoAR4RJ zUp#JWPICiNZ4IYk98Yi2!!)Wt-s-=BH288kke_IG92Q{tFt40lBZXt3Ga<>jNw^8n zDNtlVW`XHoSiTD^vv-anPulaZUwMM`iyj=gxw$eKjXDQs-Vc+5V+=E$c^9LXp!(jg z`l+mq9n2*ht4HUJ%4v78OY$*Cw;l*mB|m|lpeuO7Xr;i$-~#Y|4Xz)XoMem2!QqIv z9JTwBiPHcOzp2-*`LRTR)V};IaM9#Ki)XB$(vwl*msvP zmHU#uEtGs&8x?X8Y8awq6%hzt$x}VX5O^)R6wbMNYt9v9i`Nb(U3o|-8pkS`We}_8 zdTID^$n_N(Obwv@sFZT4OjX=Q#5iE~8axrqAMfXLhvBx{Ve=#sh|okV)GKLSfKE1J zT%F|^+QKNo$N}{2kxSqF(EP}PAa8zunQ}F(mWFppvdT+E?(nCY1#Qnixwv{0GIBwE zs*vENKp#C5rA2Bu%(lMb$HoM%e5Uz!dFC8n7*C-E&mW?t$m3DQRLvY1Gm_Eri-kU$ zN;+bqkwb)`gBIF^gXYzzV^tSX4Mx7a+aX(|DpS`K4?_RzbZKlXuS3mkn@OVKT99x1 z$C#v+p^J~qhIOs@!x`HXH##Pl92+AnDzOZ0#eDtFs;UQ3e_dz%a{Z2+S2>h-Z)Ot{ z;5qHcM)i@}TH;OOUgKh(SGbv?DytWu_TWm8nkX+A{K_6|rmWd#Mc4lh*2X+cka01^7jV`yd0=b7g>Lq+_Z- zL=p&Alqx!YVpyxMgSu^j|Oi)T=emeBM#oIW?y zbfi|iZCJ%s&9wB-O%Dsk=)Vuy_%7|{lP7WGvU_XMdkGwiSMDO_Ld!?qR( z8<~lcg%v61F*PZN*-T+M934EU`6Hpkm?7A2!vr{p4Iga7coFEK;rnRJ0s7=u?a_ySqTM^8RB$al~Sg3OG1>n zybfDwf(?xW$Yk_fCvaUH9=sonG>7AJ(Bv>`EfYiYNju=EhVB+DLp~v}_*F*)Mcr-$~=Q>;f`D%$#P;cH=$UxPg>Oj6W$u_Ek_2Q9yl z8(`-TYISTh2sUe>bh$JojoU+|x6trI30O(kks}#X2G)9Rx2<*r3RiD(3L&ER4Y&MM z79O$n@%}*Gd~R!^;XJ-V2a@Ad5@0%GC$(B?d9bCaDY6#8@qX9(x&J=P={(;yN513* z{C*m(3umuP{s`B%5#c^+(mXn0W+iTU>tbjgdyD;cVb81hOgi#f)mWJ1IFkJ@|hR3gm-aEh&18jBpAs5FWNHx#O)qj7B>AA!&woKl`HZF5YP48$uH3YGY) zcFCL9TqcZMlU*0=adhOZL>(_Nfw4*zXEB$w=m|&dl23JiI&W5HY(Xhb1+Qo4tf^F7 zK@ZcHcm0TbU;dbka3kJ{8oM#J&iQg-AqDp!(~8a2>`kW6Lofg*qv5HVKAJ(Fhay1X z2p(_3lQFepqzlbp45L{`O&rZ!Ng7u=#5JZMRh_nWX*-e{WP`EKCFU4r%c#2gDQsGx zbn8mnP!R!T1|oL90B}T%ac7sbq-6p}gXJ%xOJigfw~!iONH~zT1j);dlU8C`B=u=g za>z;)Gu-VZDV5$~Gr`Jbzj(0bk@0DE`qxjhGX{>ACPydkojBco!d|)&$v^$)sxRv* z_Fky^WFMk8NtX{Ihq@Er8?K0RZw<-06q1r?oq+Ex>B7$lHN$U{IXWhcG`svx_&rIo z;2$K^X(Gt7VFusrMIZSTDVI%`(uOSz8%3SAH5aoU2_r-p$ig%a-d2e%vcm?cjKS@y z;I%kA-F?N0XWOhn-jk-U$#TxV({f(xBKefn!@Tt-B}fwY#_|pSUbk~mSi=GB;}Zdo zs8?Lpgo7C!n$_Iyp;UDePS~nzo8eOGYxt79P{$=U-htCGr=Lrf1MI`4;*QxQbULNh z`@glXdr^Cst9g^6ciWXM>mBV?+ zoNeV|m;9owmZX}wjQY7mI)!aIcU=cZ6S^J6!U}1o%Y%BJ^FY=m_L3ig(Lg0$R6k`QK8rYQlV6bnkyXNxAMQ5LbeSKSJ z{$N0KC*L7gX)x&^OeIzWx%TV-H8rpt=D#IN;n-6rK2qJc68+wzv>SI1*?Ujz4c}2> z*sFi{<&^rNyp72ITeydcrV$;x&5lj;5=h~nA~{dX19cgbrm0y8-=${-nt=OI?)Kjv z!6ccWV;+txAX9JWPYV%LKrqdn6tWVbdgiqx49vXJ9hYsjz3gSNsG~>$vI$Qv>9$4X z8<+p!)}ztiB7cD92(sOnul;|u+IxEa&ELdS%+W&}_o$WEGiB@Q1af>PH$dtZsREZI z;d=PyDEyaE2|^*wsoy4-0;N*L4zl^}k>&=+Q~;Ux)6Of~lQ1=0A2uzqS^=Ss-33cy zFlkMw`z3vE##+bqWYQFPjkmJw;j;qs&&Zl7mcwG{f#OR+Y3wF@R#Uk6UXB--WFY^| zu=Egw29$6>FhM$=bzX02UV;<^njS;A4*(*Ps4woXdzKsb8PS-=DD;|0s{cq{sh1Jn zR+gd;OKTr9_@2Z-Bg6wI3&)vYk23@92^dD$bIm4;Tsdm)KwR=3N5>4`G4{WpgTwFR zw+C6h6XU~!o|!oan$>>PW6DrM3IySrKo7aD=75$af(y|aIdiyiR6Pdc0+vNCo;e2f zU7&{_wPK~}pAk51S^}br-f zTl_xpnx7Fe{H+C`*-ycOlrHw_MHnW0;+c(-Af66Dbc1^5aQ}gzgMta0#%m*{1v_dx zwqic9&SdX;yiT2`eYl6%oH%b|ZgR(d1Nwn-QP|nx-f!-{9)vpm>|9u%#eOfmv*xP@ z2Z~oPqTT;$WBoQix~t>N!?`bim5Kh=WXI+fJH1SCSQcXz+%f7@>+x+w-y)S?jXcA{h2$ z_#ybAc0jv=)8ZbS;y;&!iB(Tjce3EZ)Py2%2AtCzL}JhE?--A`j!|mFAMYuS zXj*mT1IlUc)QZy=cUbLN)a=HP);o>|A0o}qgiD-t;sbSCKG+?TJrCRYJ)>=|mi&_b zEDm@7@V0x0DzG`F7&PM66NHEd=A*ia_yfF1-%y`Ho^+dAN&heksL zK?xJX$^DY0K6U!+@9UNX(-~slWSdJ`UOPDt89o*xUf}&H5ZSyU_0pF~M;fj-EPr14 z!aiD2`SAIJ$LbG#UzofSZStO6EnE@!H~p8cO$WZ$1-IWUe7im>FP4~;K-?WyaR43X zcL&m73=`lNlKcb$T%%b?7R3+p%KwAghc@4#{IK!L2b-S`vWH1KW-6`+WuQviON$qO zR1tN2tPl;qJekltbLvq+_svT6x3Ao93SFGsnXO=(!Y)RXzTNcx4_0Ic%p(%@rQv%_ z7{*qpZS*zosg4A7Jb@M|7f#C`C!Y087=p4Obz$qOyR;IOAoe!5c8rPRo=6DapZe^* z*R-F_*%bCYCn-3yG@L9ymt@dj13Sxqd$e3vcyfFD;bhu&>iiQ7^*8f>-CgT{mHb%R z`wE+J;?Msam2Z4C>Y$;oHLT|1kFTQ*A7>_!H0@|nGmMkkZ7s^x{vh(J{Ff^Z?SA|BK}8XCx>IntF9(-I+deg{vmf8brWJlk(zwQ^De8xg10wm9;||)|teI6Qmh7Q7MP~VX<{uz>`PEL3a>$(99U8)}&Q) z>Rl~%z{l{*4?nK=3FEEyJkZG3PUri%T~1RiE+ARD>d4DiZ++Rnrg=H>e$iq|__^if zw;l|BP5am$h8&!{y}5kb^|E^};*P!5{3(K%5W@$d$n(v-GtZ|xWea|Pap6kz@5U6? z4!~S3Qu@Y1oxdRoqk0W8YU)+#M{!Z@L8C4+1|wH*#}?Z<^BG%_G;n5UZDz7Ug#s%9 zosJx#*3b+FuMRv-Ei``$G*b~-G2Pi-L&gR9LzlAP4+KM_US`->L-2+qP4OL)1x(5g zb!yXR<3XbJ@9k>2`$vT0xn94cu`F0*j&^+km#;mmF*CK;1{nH!1m5*4q+U69sDJ< zaaRl6uF^!+S!R<|6+g2{gKfRL%rP$f^J@Lx@z-@|p0M-q+((t_w<-?Fw~WLrSI#*o zIpT^h{^iyyF@bV=&s^&X)^9KJT6UDioin^YS)vWusVfFF7{KHSIh9F+ zdJ5|sZiz7^GX!XJ5}FockyRQ0*0$+3J+6R)VU!l?_<|!vaf$&J3F`jBpiKe<)ag;v zl%v7)iexFJwzqTCe3KOcdFuFgUMs34f4AulDSJoMSGc_oUV5;$So_+8bECghK9H5p z1HxJCe{Vd@|L)<>uRK1!?~wfw`!IA(7vIWn14sqU%4^TLlyc+>!QE9F zr$;06)eqze9=tKm1h!~FI|5692?o$BBm~qDv!O2yq}+3EkWY`&sCDUR^%iM~9Pu|6 zYcQo;J;CQ;M98wMEb0s?0YUiT)xBC~l50>ZWs|$5CXb=B(UBI`lP|+ud#^ZNL&EywGJ^ecgk^0Mq*X8jF zaH*hL$}?e#r6GQX*eW*-cH1GHSDNw+bBsh|ewmR~hi<0ID)}?X2T-<4vB1p|Rm&5m zxjMmCbn}YhL6t_$QLFOO4kJqmR?!(7np($EdJUR616*Ss+gNOa{TN|XUNq~kuLXQ+ zf1Jw$kQyQ!%hB@c28tvcucOgt_`FAwD3j%i%hGjKA0=Aw2g1n43i9<9N@QB~9-}16 zS#H8yrZlf&VLSCi5V8AB_l2R%MiJR$?}9~-IXjMWMbpxMQBF2whAVm!)$DD`8}*( zLSvoA(3yJ9N|e=VFO5@`s(jH_lAUH0CQZCyCZvT{iEiy2TJ(u7%-(=73 zn6?H<&GbPzbF^K4(F0ogs4_dNR^u{{kQH(zZ}$7+Xs}WH>1ez?lIx)|kuXQC*-{Z( zOeJIy0vKTW0MWl3e0Nj;%E-m68u6;Y8OAbr#|8W`0Y5Ac@qym4ltG%A$O5rcmML66 z3ebPIl2?g^o={sYA=JL))%(c(2pa9pZ( zISr;AcYU@V_~X6CluMX{pd`D>MbMFK8!>G#)fHkqT0)kr9aYs+rPUwfDp4&~d)UI_ z#0I1i_q}S@(=RqZpd37z^4@+xEKsPDC5wAjzk~1_f4#w9rzT!}3x6hJtz==;SxM}J zQWTOIwE;ixhuG9C_6t5ol)E%7xDW;;Gu%pn6_sR@)BU#=C&%)7WdB=3QH=%)-JvLH zq3zWPula|o-Bj27IDuDTPU5qTNDIUv-_xum~(+r=*M1Gi6X|*YwrniwegNczp zPQ&R!gvqh2bI2NS|G2P?i4v(S-_`+3(@Zi}bb;m#Cf$QQQMWwK%xcfMl6Y>a50j28 z*u6YWxP6q2-}U~#yA3g8>q9Z0P(o5@sey^#^LGA+j*!mgxt4wZ6S6A$`0gLD?LTN< z3(M(c({T$bVw35}#bUy^m!xJl-nLn44xqqhPQ}~v`-^RTF-98fL)O@fiCj3CGgBQ( zhgr^ETAmKj_#{X3c^Ic^*CKzrhCQY$!~Hy$MbQFa^kQ(IU{taEif(?DR8?KVUV4ZU ze0I0wONR3L-pyge-|BHmZB%siB?O~#eS5xR7~i43{??X4SEuacUkVBD^#!er9}ewk zZx6xyRCn?xw0)ag07-?zgIEupF%AnZ(Srcm_cG2eq~mPn_AikgB|34C__wmBU8Flu zJKN8hi}Tr}U6guqrc`F58_@g-4Bk6InVN>GXY#zb@*`%;R9?K>3|$8re-jgnQ$yweZgLo_DCgvb4aeEV$z|6zQWBNDQdf~R^Tw@S&vEf9)xJxV0-RA8-X=@*>nw+!O(fg<&oDBc{slHMY-_=!4*KU}uZyTQYj`mn)Cu!}Y z?QW2WD&xAK>j=+q;Piy@>Z|At*(96%F`w6N577FU?;tStAMx6%x*|E4%v7)-d_pHZ z^c$Jc%}_NiV&g>-+w0#Ta?v ztH=w-Z4R{Zj-HfJ6!WxU@iIj9NyaD3QW)3BSrs99h*N9IsIDw#NZx179AR(519T{j zQ#@PI+f2bjRSvlNComm3Ob&wMLziT9YFMY9N_yxhf$9+4aAlE~G3s(-9fYt*_@#>e zLGiO>j_iiuV{Y8{&Q`A_`_DxX`4mZAoys7@ZkVc8zpu~pn@a>ZS+*WO@!&Z1Xz^3q`)0OU~ohS6%fOpZ{&0P>CYq)!C@txg~L5v z@WIhWxsB`>-o5zo$tBmXpLiF2dR5m>Y#BEyERc`tTle>9-}wBcA^jQIhZ{~Gc-%%l z`1!Fb6?w(Dur7AoCYb2hCt9cp#S_5eZ)`+xP+o{pO_?r*aDkTNHbSFAY3KmBG_Wj$ zXI5rORX32kMHCA)7u<;%(V@OfenrU5@alai{kHNA7MapkClyn9)e}1Gg^s}=Exu^Er$oiprRYYNTZ`W}6eKsEoaPTSBzLD%FK z6JSW=nxvhna z%vX&uU2;KQUL1P?+!tfgK==+xoN7uhLi7kq)$JqYCdWs(!CJSGAQC*vP*TL=($?0ejf(!pb$uL<+(-rEek^yb@d?blKx^mPJgT-P9A+A=EMs{G&8_Kn+JR>VX`=ErpQryUK4EEAnmkal)h|iKrh!x zkc7a7lGzQxVep9IkqzZs*{GtDj*h%H*W2bXt&lAABISqeIguG>ynd!+xkB2aCzjPQ zqd5W*P7_R|4J4=3ayp$AG+=sOLlQ&{x+K>C9D6)EA&0#j?1TcZQqWSz~%tz<` zjw4)f+<$DQP1y{L5M6Ko{KM#PmLSt-7Th_3-IaU)Ugj?j48!&sZ7)=Mz5uQ@@s(hC z+CdMVS*%-ty!BX@kVS-s@(sDPU}fYE$;zNOU2ck%6Q{bM!D)?bo#+gtLC>4EV~%<4 zSZQrtO&Su)RXUnda8zOf>@u?CH;{Am32Nd6I{t2Lx?3uXyeoO*^#1b){vK0qksQqG zSePqY+7x#aqIWg@$n&V=FP>1RK3v!O5_8_@F zL_jQge~$sQueT9Q-5$3AJja0kAijL(ZlL|%WZZAEh@Rm&d!-e)1vMeUB7-61qgRtb z1PcB!n}jPcCMPo!a^d(?R)=xeqCk@t$gt2f(JD5I~A@LEaxG4oxt=Oip zk}r|H<1DDu;KMY$td_|$K)weak$_k|Wg>MTeUC2`6c{p-B0KW!q@>_{YkSDaj`jWB z>AyYD^a?8C8q!$&*rTg+-_EuUEkS+x|3yZ`)YaK0k2)fu3oS&<+FP+Cn)3YMz6=OKSKoXq(m=c_rA zDT&=ysrCIrQfaDWTSNBL!AO}p`VTS>NmR-o!?FVM)d?h0RSf^P4YDy)4nMH2(SFYW zbCN~}mn-OgDN}>&7ytEqY!7vafWc6!lU@JiIZxh}pua>ahsZxaubJ1d{2F8<9TX-| zkE;Hbyefv~1F_GFf#J3W1M>?#=`mO8^aH7#1q7HqjsJrbDHrksnBZ9%PwjTj2oInh z>KzK7Tu-T6f?B({IIV4J*9p22Grc=@-GmnSv)1;Y?%%EsZ#%IsnfB60tO4uZUs9b< zB(ID2I0GQFdHYZg!S~pdW^Ql}8^gizBsLLQ@yMQ9kr0mTZs;BMxTePajga?cnU16Z zMhi}w!9g8Z?7kznc(MtjD80~&qbl77&Ac&P)}d-e=Qza=>KG%2b=lb!>97#m zQG+wAHoy3;B)pnZx2Ki}up~Cdp#og(G+b)94OIWEyvj@n7h$nt6PU6U0m0TF#~6mj z@c2~CpT($P9vC<2G1+8x`An!uls2n|gAE!4N5tn1+(3rJ*m_%6O|+1uZbaTuXM|t% zYl)ob@Ql2a8g|$O&K9X+vD{sd(v8m_EvjAr-R3*onG2tOx$kVlzMY5aZbjZp=DlF( z->^6}_B=a$wQBC6OW!`pk9jcv&h`u0hZLJIontf#xdsZS*<^njV`A9li*##)j$(RB zW}_ZPVKmann%N-lc>og^(mBAs^vDGyet;=KmyekCnB9RpdB{;;Ry8~dBd~xkL<(I_ zOJo_O0~7B|O9=j_ zD@>3_vx=B8Y>Wu*LWiQ8IE5})|_z{Uxv9guNXDaW5lV5G{=s^gpuoYl;s zw_pHiX@>2htuMYJh8@bs0v*O|92A-zLe^+HUAmKDiTkKwB23zn%+8D zI=Fa|{dfADi#LT=UJ-e=l$;snBhOYJx^$!A+ei8Hqhgoj@(EdC)mKt>G~jaYC*d6A zg@sy7t(`A(n`+^^1#^WaG!hpw(up zK9-}_n4ke{^83mssn0(@RY`sSq~){Z9bZ!t%j(b=Gad0P;5=cyc;J(xhrgP+vj5^K z^qR)^WrydF%Oh4e4#z6BEW_WU#U}-d1M;Bu+hZq}mw(eAteF=#16v zuOGK*g38V6t#Ps$*6L0h;PEF_#lt-o0KZFuhr*lDJ@9BNeVHh}*jGkuK5hOM`S#JX ze}C|_p)~o+T~QxUa*N;F9?nU^TzK{V)%z9qQ#Ikc?(90Y#1L$cAk#f_s&nn6%{DQZZTt8FzNzJ zr%$Z@2YHXr>-rL*`HP+M$MHG7{m@GgOaL4wC!xSquIXq0hP>1l554wjX|3h(0tTAB z9#;Umq?%3D)E-tD7-PEI-}qwfp`_IzA3oZ$@#xY$v5Q+*g^2%77Uk3N3#-@YGv-j4c@l9cp8$4Py;8sAohpsR=}8OKpQK6Pyk=(Vz(5r#|| zna*_rI1gywnQRL~akXyECF%pZPl-TymbKV1TK-j3JX6Dm=t4@c9=pE0ZuNReX4a)*6Q@y6beo>`l+uy;dOSl!8xmwG z%sAp~({o}O!v|;}sZ60y=fP9YnPSG$KwFd9vm|lOfsF_fhH~m36C!kRZDc;7!1G)} z2xrIAhUL+0+@Mr-=YOn$p6&uilrPJ|Y-}4sbx*GOVAsdOWdlEcxci&2H!HX06rijx zm37yrBMmKQkRQ)(UO4|lmC7eH-+dF8{qoP9_HSg?GhKxoJ2hNY9G1I$2};!@Mc3^) zNLZMhN}O4$89)NbL(P(j47>jxDVc3|v*)UsI-x}ce37|xZPbdiC&)a^bUL)M67phz zv>EJf0rI)ctP;38p)eu*~7M)^k)3KHw}hm-J30dz_C4~E5$pI-NMQHt`*ub-NzUIet*Y@>8sl`yyZ10W6!PD$YSE#w-ghnJ|m#m z3-g1gkLtI|vX8%&pk zJn&mHF+|ZIvW7}VIpy%(S7yl@`eC0HGp zD+U7TnS}WfyCdRW{Ekmfb3{D{BpCW?L*lN(bIFxE)vq`r1uuQIf7=Z-DOH6jI#+mS zqoRx&)(|W~f^+e^pc|YVl8bbyk{rq^g}kgLI!>YJ8IlAW2w9aFZpZXAN>yx3E{1N> z6D=(a8#HGph_cX^Qr<>RarNmXDtd4ZofsRQ!ILC&+fkcr#IZPiOpK|jG1Be>YE^-;)P-6P&n{B1H!WA=6WPo zKZSNqmRKU6ev1?_OUPMGv=$`ma!VT?8i;6OU})M^jpbVfq=#N4Y4BlLO?)0!$XZeC zlf1K}a^s54%VRe$|50as`t_;Lw#Q;aDb1ogxooEB?`N#VpUmfy{@Yl0e{&>$@egax z{188ImR-3z)zDS>ZXbHSLLnpZfVq&MO6^ZWTVT}M<{(`lqL7@cgiLFMia#xxLpmGf z_T^i%s-Z{q6pC!3RHkLz5vGE183&8$0hHD48H!Qev$?!3U2zDkCyD~mf>f1Jawr99@eRbrMNJR^}cL`E-ee>oA*_Kt>{kycc=SnhOzI*Xv*z;7H zJl)+ZDOyC36#qFy*I#SFSpz~E4Y4WrNzk3P#4};>Hdd=Ck8Taho7;wLlR=GIj7!NM z!w|zYvzVGiI^eYXz3`b%rJJ0p#xh#lxJ|0+)XX7Ct1%1$!Iu*(qRO!cQ19Oi&l(V? zPZ;??f8C1KZ=o&F8mQDmV`8I%TTf>gp#jI8k`ciN- z`%GL{qMxVLqHDnV>_eEJ7143Vyf|4Y-vaUT0ed$Zi4Tw8c4Y| zsEY>>3x-h`93fNmC&5;PjxjeNe5Hpu9k`%eWKlxHdI3^IEE)72B?<)auZ>ou9h~MV zOS;`&njIX}ThnN|yqNYZ`~apVw#XDL?`?xE9(A_0ZIw zs4sz2e@lxg-3#4`b4(mw$2jamFc!ub(7$v2O=kvm;d?St&C z$@ZYCNvV9&Y0(UurLycG2!n1HhVZixIcIKwbPiYoMbx#3CO{N2DHMRJ;9J5tbMjocw;9zeDip`}unE^UKlRF~K! z!4ktKNstR$qX7<+Iu|oS^K*)goERh2GQ$KDiL~jH0zz@(Sp$+w(-X#ME+Yosfn2y_ zQj5wjS= zjF}|llf!aKU<8oZI0OFH$j|#Qdooj(AUs*NRlPl?MCCe2h_y&-O6RF&l0yw1dSJBe6$zof z1@S>tMT0|f`GQiEZ7rM=&N$Ff9<3uv5@Vt=<9eXy9`(xkW4BhT#zqc*KlRd{Q_r`o zi=|JkFgob1BvfkT?Scvs!Qs&1u?`b4rEir7R=jRt~;kyQ<4 z3#zjBk1ix^KAameb_2Qnh3N`(0rPkRX~#;7>^vQ^yn+Xx z$u35wu(&VIqEeP3N)-ad@)bNU*?|Ybl8e0{*g=v6NKF?7HsExkuj?@9sdztBcHIm= zQX7SuO9O?0;kas|(ukiM`cjr4DR{--Z}fNPP)fS1^z)WBags40;=X>*_n$}FZ{NLk zuafH9w8I_sR@lZCqf@@+E5+xZ&w2ZS7Nd6H94e)QPyiv43>&QvIc}2yy}_94t>RG&Q(nx$zDQ!_CG-rfJYs+Q^z*2w1K~8V2SL@nyF1eRL4Xs&{mv z;ylDqtGklt?Vsx`-vg#kMo@HUUnp)UMqbTK2wX(Pbw+sT4%Rlsq=#CYE_t(q2P4;7 z^At41@&YMO_0=9?AL^{0(__G%aWuhq#aw}?H&hv1`Xp(WLU!0+G=vCvm2jwD!EQ5# z6U(Bu21S^9yP7ZS9c_BBXtT;{)ATs6kDu>BzIpWIquZbVe17@&U*EkvfQh=!z5Ck9 zft0<9_8^qADLww zvKNss9F;_#)&xZ<4oa1JYpBnj8$T_WjhNW38V1K;csYhRE@4AW8RxF`(6!71sEdyC z(0!@{qeu_235at?wk9VyRQD9a(thF9l|h>igpK`RKe6?wDkZr5G(%aXPf}D>-LRrn zqw6lcQnBl!W*@WJH`vf>q;<)V_ZHpt%skEGU0ZWC9#36M!J(n z_d4X=6S`0z5?6ghTL@4a9S5;NC$x>`k^!a+l45kz1|ywWD2Y}@3zLO3j{|024pjq^ z_TZ-Yr72Knyb(}ScE?e-2fP9XBTEya`|6VTlilHQtdFJPxg6_Hv4tBIM(4bW;@}kx z+aoi{#II+xdF1jS+N9R7Ttdi1pUC)1u8y9r*M$8guv;qyUg($!W$;WEm1I#xjOBdd zIi4Ay)G@>G(yPvxL`j5vJ&u_o-t#>YtsJdj-AXPtrrhK^lv(8*HjWu@9XCc7w-}-d zaSm$TdiL_E02R|iC*%M)vjJ)U<%>nxx6ggO;)~sNEcCo)M%lxVp~hUU!HPcq-vUg> zVf&e(U6O}K@PvzdKZ}h`QhX5`)7HAK`)M)~TP`+NH&;LHQH!);-v`n`@&x${iMTQ#=wq zp^MH<<|`M{A@ZTl>I41wvetgoO01?64PEbFSCj;Z<*>8RZK*Q%%nMUv{B|GaVJS)tJ|GqU8igOzVx9Mq0E_kgmQ(ng89 zBm3a&=e^%uF;!PHvLe}`oAg;Ket|#533xaU5I3UfZCb|Sl$v6FdOmB%OnWf3I;$cz z@-mtX+`l^jX^jesllxWS&UUxzadXW|R2s23O5kCYyY*Z+yM@wyB61F%^!QpyCpKgw z@@BB7Eo$1)M~kwL&$g@&{dCBj`b%tE`3+O)eV)?0D~U!n@kc8cQ`HTGr zmDi#qqWuiJmjeB;{b^9SD$m>zeBUXR%0rDINKm2EFn}Ti zHjoR4=!^)MJ(`$h^l@U6K5vsBO1MK&>LZs~`Pq(YR}TS78*)J?9oM!Ev3xT?9P$ac z5WvACHfyZl5!tx!r;9JXmvM$hw&#UY$zC)O#-_LMOLtrgUby(W8`+{6`Ij@%a!u!Eo|I;*m5lN0LK5Zval1k0(8=9!o-JY; zzWinKiN81Ymf&`%&yd#H=#ThHE6+m?GF~}&{od(62~W8zTkuI0Ke78q7hRhkBrYLq zu=zfM8$Qxguw&gSiZ+`Eu`i()#>hGHsU~Q>;-sN zJF3ONP*$eeXm%7ff$Mb1K&shgFeZ2mL4t7u>;g?=6T^=rSigg{XVlMA@A*AQP^@~g zZAFgkN7;y>=woJMD)aLN@|Ebr<8OTZV*hHHraAI%?h-HgDm`4=LKs_#Ugfyj2Euoi zr9?eyN8VJObtq&6!6N-(Fq%>cB~=!x+Ak>I7vswwLCSn+^#)~SjMo%Z0C}14y)CTj zbeqbKh%Q{(h@fky9Om)|mQg)<>7muZYkrkeDy*Knb*S)qQ^r}V7q1De9lTR^U)r0R z7tOul{@P|yqI4*v;*w+~oQ+&Aj|UKRvmSBq+V9~sLyPKszb{Ydo}Bffcs&z@@&00p z4~D|<6C&|buP+Z^RG>ZsnK4M-T;g?^>Z;R3oRvYn7Xu%KcKYQ>3AaL=W{gxzw@Eml zVa4{N!qjV4I$k%=6I>GBDh2dp1?oM?(o5piXZ7i$fncE!3D5F6&D9*gwSeKMl2!iy zAsa6JxqI{Sj|`g(_Z{Y%M2)1iHj;z9n)-jScJ5(G-hbS`5%bnE=(HsTXv3n_I;i~` z2ng1uSxq}^tCllMo3)jJc*HoU+pI?5p~Gqf_^UBVPLbuu;CEVIcU!lnHGE)w6Fb&_&u z-;IfwrcCJ|$}A{oqS;%EFdwvDUO+udRo>5}k?ZQ~;KxP2q>mD%7LYq-v_SdRZJ4eG zmn%4F#0ryT#LqNhsBR$FgOsNMxzm-RVb!Ryavh*Ej90~14`E^`rV5nS1k1QEqTo7q z0fzfLJ2K$eB?(0t8X*nO^v<*v&17#kvJ*ToVSt-v%?P+E4c+4}!NG0p%*a4nBwR`as$DD7@lRrUbit7$wjYk1tGA6;K-&Laq3Xj3tcq{Ss+rlp?SeR zk*OoX)a?F8AXiOFLB1yVqsz&W? zcVnPa0@&hW(+&9cJ^NzmYOF(fR}Q@l;I#%AO?zgGp#lbD5V?U{{h_HmdPI%28(Hiy z74*9|)PRKSsaM60y8`u+g*Tk=TXrc$m*_63b1NM`|K0Q8df;Z(G*>gAe2|% zPNQr7gzwPST6&#&L|IO^_ zHzWA9B{5q1=_}Y()d&fH(ph$xKl%{HuN&_knW}l4XiZJLJNK7u%r+ab8JYPbhp4M= zh%=}*w&8Wx)iWT9WeKpiT2#6&nHD9A*iaBZRXa+#<|S6Wc-_UoT8>yWB8JmFDHPRR z!`!>!DWJhwi8*RGz*>&IIrw)Ov9jgA2{TG&eN~*e%esDWYnAPZX$=|o(HQ1jI)cqN zt-G*JxM6Sf(#rtsI<}1c_ufi|pZOqkFPmrgZkpH>j15#?f_K{_9P;D>y=BUPg^`t)*f0P)8q_i*>} zX*z#AuLU_~4tG*C-32Cc0aXp9L{e8T8^;?Am^F*2{St&Xs?6@#t02R|%pJsuSJxo3^o&V)!ZaOlz&&{50wmGtqNBv5ph4|uGZKuFW~5`yX+kH#WoPr!gMf~g{~T& zj7uZh)B}0rM=if13C0Y+TMye)&GbX6mm9~DPs^Sh5G{U@F_8wih6Y$jg&Se%TF&5aWF0GFhR|Br(Ka2(nL1|4e7bK5D6krsJkiQL4lbRf@+$J z2s;*!t=N_g9kI`O%5mhczXnd9esD8c7v#6X-;$cm4Qu(}zBEny%a|3rrYStUaYb*{ zgW11!;F-%Ol4_2uEkbbfUc@BwXz7;f>0|97a~9G*OWu`&=@r|xgEwb;S z-EA{AbgO=ogyV6&eOLBfxl(#`b$fYhash$;&JS0F;{gL`eq?dv;ueJb)sO!yUzwY_ zF_J$LcKyLI-WguYL~_8A!l6`)e=X8D8psKALXW_3cAsH0A}GopC^mK`$}r7SdVvDR zAv16d5RNfd><~acJ$xoqEDJnDx7CAI<*-_`$PPHxyDe>&ieY_PXk5@NLodxOzup_| zB+#0DUY2Ihz4(^}Kci{;N7@wx(-+JB^6gl@IBxr$z~%m2OyhXLrlZRyE^iY(j7a`9 zRed$;04uU&86!4!Pi9Dyc{vt;jWp6lp0JX$wOVaYHqDCY+0gE*ActwK!)paH^E@mB z-{sgr^B@nZ4mTs&Q*qw-o#QD)TcDEuQnDcMXq`^O8We^(DY7TXOkca|IUJCc{3r4% z=$w50c~#c|lC|FhcC`SokB{5s@yUsJBb`+@S%l7?aDkTA^gNm?$Us`Xy4nF!Cc$|`95UB}p zly;En0I-H+G(VRFqtXnU#zfG0TMPR1+4dp?V7254a>0#Wu#|eI9l}I1GkQ?2*q=XP z(@<#8$Qzv~%nmSU0%eThY-%Y7Z)vDF_K<{!6~l?V^3V(sccuJS7z)6Hd@;J9!L@MK zq)3Z|;Ym!H7VkZcX=K#_45x}?U}dXO`H0bNF_CiTJCSTK!k0Ro#FT<&sFko{c-l(v=0qvB`2an8h^Ng%qi!99L zw3=rk@z%^yOHU3ddsGVtb`BEEAArrLuAu@2be{``PFpQg!o~>6BBT`Th~s99T`#;1 z$&}pWB;&9-7ncL&t7?RpoYKHzH5z6+jLgjDW_bHuON~RxH)@!;i6)pB-InFfb+i>Lyl|m@PTOmG zTiM~GKP3E@_SQ51Eoq&WhkEavfW3SE*Bub zX8rx()S{Oke|T!uqfcdTY|h_ONkypFh$$Kv*i}{j5TVH)e(~kolRsv+OjhOxRK{Bw zstblc(=x&Tn3d9LotGw1K0&0y9BMrpghPwyjlG*elq{^^DH0Pip-;F9=EtR~_*?-l zZ0fyJ$cFzdA>^mox@w}-R)k%p+gd^c^E=BB&(ozs)6Fb|qm5y$Ec=nwL=lw)QRMhXx;R4v7vD+K${~c*3)bapgJmbuc`baa5?+4wFIk&V5u-FLx7;b9wZ8cxwvR> zb~UQKQ4#=6h_;&;Q=0&GF_8mOTXpcIXN7^?Qkd|!&A}fNZ^d?8^_zmSPtLO1JMvAH z=lYKjPTb$_{H(aJ|GBvY6Ljm_e?CI#D*=3Zy*yZXc-h%+9#YO{9(nOi;^37*^nL7C z0azKwn?-|UOEvaduYkQ2hE&DW+NUsX-Am-uWp6(;-gVl#6@| zM9pf-2n_Ts02ZGX$S#TF{Y5lwfXj-hwf97!3DJ=q)ht8nA_UyMFLklmjZOW$>1;hz zZ+K(#V{D{o%2hf`Km^l4@HQ+)S07ejs33x4IJ>VH%n3NZV{wm0ZNWrH`vA3O>o6oD zrXs$jHIr@#doY((afZr)slu0ObP%;T0-L5PDvlM6rPyU*oVn2GVa{+;Va9ri0VZoJ z87jJAh?s*6a)knG5gIhBhc#g-mQCX$F2mG9?c)|JRD2IMuoWZavWD?SmtOR(!?X_5 zl`U#KvIf+gX84MOkv< zAaYNUq=xYOxFx8x)iwkMcLIs;f*IM|;y!5_dK}xL26cbj6=g!JRS)$;u> znxg;d_xrGM#+l;DmK^WCZ}I{>%P8fGBuo=8xUwao}K&OMU84uvgG7PlF3 zep@DwHeRmUaP@iI#c1rnrjFw}B%izB%WpvFw$Ro7^>zH>(w6C1#3~q()%J7dC^Gcx zCE*qVr7OTdXOf?&edhVZZGCY&!^z6gZPc~S1>g*&i_qii4!m!Y&U@ zzxXx;d1y|ub<`r)K#M6Uw9&QrR)K2y{;OQ%ttAg<=%Z}f51HMv%F25DQ|GqL zE`IL^>5sp4BToYQhVw?eqG{g8Z(&NrJDV*PyqY8+oJV#c65znggmK4?&zC6%=~kjA zadrzSW}pBnrUtZ)ecB+f416KTYKo{~CX?v~imV1=5zMRrs{lx2Ep`+8DbWHh_CAj( z$Sk`;F1yWZ5(*$M^v=BR(IhXlfd(2%O*#QcG*RZf{@g8cAIL)jFLW^Kj7JW{olta?av4wQ0GQl+*LP2vmQ*Lb$mf!`h3+0YeM82d9tJ<{e(J3_N;A-Ugt=a84`I^6$y^?c36n~tlhA8c%$YrvO~5MS zG?B`+vC-vWe@hk#ikr!G<2{jZH*#6fymmYV8IIz$5y=SZ4FoT`!CT_pNX;`;L>9El z&@{xF1s8o?x8MH5t6u$!2TPqzN%TS=)HWj_Y8?4_R;@DT%0uRtC1KkB z1^y*S!1j`e?aw4Zj;^9;@phxsHe_hP7I`}Z*r$eR)?r+l(2ZlvM4*|&jLT_^xMze` zZ1{}>N6HNPQTV8ne3_-4uVfiEI%EZLTEOK+HHZbnELXe>%Az~QXf9oSRNwZ+Uk{TDdFd{i+gcGKf~6! z9JIO$We#c0$}p8J4_v1suBmC3Fb%Z-Gl&G#EwKF+7^Of?e`ni_rxATW+4hJIoF0Bq zLr*?3-6?r@by^)hsZl+9viZZl+OMjEPx*Bii@)S%n_a0PcS=h-C7)IHbtwjY!m+JY zq5Mv6RMa6aiej!4OK-7U^@AS1Fl`gYD)Ax8!exSj-nA&Ut)PjH5Vv`mZ7OlBBBe89 zK;dt;ZbO7Q6JPr_nt4rr#M52-5}ZJ(2Qw5l(0bHHBPuMYRB~vy;nufH8&7v2bJh|n z&(6x{1yPJIZD65qZn(Mr<{b9p`cEi5>ftZV$D7ka!{7e67sA#fQkj;EkI(B7q>%na zzDGzcR`Ehj>u`?K?gSJRF-i51>4|PQKBNF~$=<;nn?^0bXfX!K!SQ?vL8nH*C<{vi zNT=*2vRvmVyO32&$Etm*E~LG2`exCN10A!HXItmq8qtbEjLIjeoO!*0%Qjp-o4T_z zgHpY+b!0&QKJuYusF?)>r?KcjRYGj8gj|5uhla_fb@YB8;hk+*XlnKGGeB~6i4Ln6 zM1B+Nsw10t%66OPS_?p`Su9cgGiU|xg<85D*`!b*2V_~Ms1RAi{pG3l?_uGK?YC?t zJ~MAP&g~qorUY4fF!Hz79r?57-rLS8z7rB2GLd>N95*3CS#Oyd9RvUUzd+0nha2E$ zXao*4nMx-t?thUL2x>F5LR!}eg8=xynfO?X>KMNh8%v+@X!b1CrKm`q@e3D~a+$Bs zp(k+&KYbri7I2Uj~@OYmEPH)ENy$wI(bqf#~?qxQm3}=c#!qnQ`E!0AlEH_$W+g4|zG&@f&_w^DI*8U#k14M{H(}ba)qY z7BD<@ub1dyH}4N5Fy3VqeQP&0O#F_J?^VSL#cQsLfj2ebNvKPMENEct1^a{ol21>k zp>7N$F{e9AcMbA{b%j^sK;as3+6~tz1mulVMcQFpv>ndl5qAMvo%Ycl%e>WFWc76s z2iY4-!rE--Gg$*TzG=+3|^NakbvBw)9R8s*W zWzjUy9S}D7f4)XwB^FA^mwplJ!}Ny`uo!z9HUh^5nD`H;oHo$i5kU%YngVT1C?8gP z|Nm25sdhyc)5Dt1L5A{5rL72kDlS#ww5UW=uHFxjHG#${cHl#xcao~V{Lfd_mz>}I z^7G;2n{_Yu7pD|wP8?O4YXdfD$@r~l!q$l+3 zn14ECFE_|Ia9Xp;CoHZhVZ&LdoVYt3o(p(i7ko~r8k_X&)AZ&_2!>X?h>>Nu2Da|0 z6eH}1fzvW6Pt?NP;vu}9jxpYo9nq`u}3`p>2idvu_zn5?Q)Z3h5_yla>Iskv29h*oGc7Pam6HKk{nV*7wgkzG9s0 znBDkW^pfTviu8Rd=Uqzm+*a>;%Afl4IrU3H`mJ5Fv=%u)dHiz|esS0tm-Jf8iZ+ZM zjL|J*PpvLe8PWoFXF{-3Cw}CgPNREv+o3B$*-jy*JNw+8uK{rdYI&=uUU?S`ocQsS zU?*Cv!!{fr8J8f5E*Hqv*q~gXNGJ$CVq}V1QBxlA>{kc|BIp024S^MwJ_ydhHMH4{ohk4Ow}SymJDnc1|2;i}=C3xkqe^pCPnarMDh_-jSJ7`exUe6P>N-f3gn$ z=k%khoBr#zMh$eQ_sYUc%4_!96?1FmAS+#Cx{3sar9Ej-4TL6Jrw52uRC|X}Y4)H~ zFtqYCh@P}e-B!Us2pv*Bt<%MiKp}UhbQ|{1f0pgq@X_OfCT-url@D&vmu@av8|AA@ zfTLzzr{D9s`Dv2>FqRAtt0&4t*+bg7pI&=l{o$wYVuGWrk{rs)m2V_|czwl#G{WwA zz7b!hQ>1ept;ql5ZG(h$W)0Z2{rE`vRVc~EJ}=pnEIV}RatU=0C4(IrzTUbYnxDmM z?qmOcuXy~&_qKeSe>$q|XtB?NlOJN=;mnIWAD$OXCCvV6wQq@p)>xzqf~_*l565b&)2kUsH+ooJFzO{cL3{YU&9Uetig2Uqei9w3W5kr1*U!5|kU)aKoVs zvegDg!UF@RLrMH6H*$#cb^9Cz7m+)fXAk#hknZoH@a8S2&3muCv#_A0S2NkTx3YQ0 zz{114r;%^g9eB6!!@V~yFS$%P!Y?k_7{&89r}_LA-ER%X>LC+pZ*h^I3T1x%F>0vB z@auc6Fw+fbtV-C`d3&gYX@&x;e1c*ZAX!9iPBY@{GiIf>_Z6l2Aqia)yKaY{H8+!y zMsHEi7%*5PlvkXF)N%JkzjbgnB8aH{V)p&*pO5ZM{yO>e_bYG#>(_rEJs7>oik>-eMcTg( z^N1|WrV(0t@w{RMFHc8{xPp*)oiF&1iN>MN(cqMt-z3<)VtJimN0?N#Z|l3*G8^@^ z|9dT34UYf=H`|Gp5kNEJ`lP|kq}i~zE~K$f0bUULSa4#74O>yx`>c~V3@G)&$Tra* zA=PL8MJ~q|;rJ)4$Ik9nB;hnkIP~cO?o|mLMiH7#^=oFTDnEVmT-UKp`m|A-aet7m z^wCnJv-x)py-fCHo{mbzvg)E^LyZ4O76!JB7>)~|Kfw-Z035$1I1$H4x2SgDcPeey zkW4P$unoGsblCE!Y<=!F$X?{<&I`%w4H+0O%|C?UNo~dQM=99A_@oF}ZF&)^JZao% zHz^NcZw-om9bI`@(^>z{z+P)g>8W* zqFdV?J>$QI__AZdmi(BdJ=nGLa-Diy^nndFP24?}53L!i+h`y$iu3vx@Z=)T1cKMc ziFD2v(Pa@0CxTMdGwgQ=?DO2{czzKc!NHjY@%JPQO3f z&;Fz{X9a@~+foYsuMBY(;3FoeL^0SA4G^m5_J%_ z)*ZL}j0o6Y{`z6<$y-~RRt;A_nKk?O%M|`^i@kG-;n8!#!pQRPp3eour1G!sKC5Tm zhIeO@7BAf^1JnZ*r6>}S4Kzc2T*UoSov~Qw;LO8HlL&TYmn@Fp>Sg(=QK=|J>iIO1 zW=<50jw0+(K?aNA&Y})N)m*ceR8>Z9I3JXOOlHtVkxXD{NfXHtDh)-NQiX)$`({VH ze74-h*q=7!3f)Nj(?+C?EMD=bA$KMn{S}E;;l}+3Lvj|r?n!SErBc3g~l zmTu$Xr)odRq#m=1LpcFW%Q5`!{)Q*O3tqfZq*L`v=l0~Pt|8oikuTH#MINp2x2FG6 zWnpLI1gf3VGy%|oo~sDZkMdE2@zuvqtQjt*SGfNiKT80zZ5>uVes=G$;2XyAbSh3wFr_NnD+NC5Q|OTsufBy0-bS~7-_d6a>?z8m*}O{~$`B(k^A;iY?>o%! z2Udd^nR*3BbC@W|FmfjyHek)6_@)P)%IFF@4Vr65x`Jlij5Lcs+iN=u6PzvkO-!D` zJ*M0DIkLWo!XA33n&54DRh0Q~ew(;XCl(#TG^UgPIan_c>lEHeJuzC_b-Qw0jh=7@ zx_$Phg~5R39E{TLk94$yk|91{mi1TPFpc`ED5biFG?+us3lAYr$})|swAz1>^P6x! zaZFqdwROI73PF#yHuMmVsv=X4_Vp>#*cfTDKf-v}nrp8zgFWQE0#ew3-AIO{@$oue zmvPm<$l@)cODrKnMEf1_S~W{Pey(E}4NNYm#CCO2OBH+$e%Kje7|o~;EA^aA4N;=R z40>Q$M?T_p!Wrv6f+hZo=&l5AO=s0Yi$o&o>x^(8tVg$gvUjYTXIDligh788^ZozM z&%3%;(H-p$CbZ~cZPi%CP%#`%9G5p6-+5w;t6aD<|6K3UpWA<2yZ9>Q@Q$}W*3)M^ zczbb-8c!qWVbOd=r}YbpRT>zBEu;>SzwPxyGIeGQ>o&9ci9Mt`x>c(Ug)+4#O&##k%&cJmmal>Xm*rdM2d(? z2#A&o!#X%k}~jhk(6 z9nSV9D-iEs|H=Hg?TUH2L0Ha4O45)8b65;Pahq!2eUNh?lGseTsVt<}+vdMwq{G?$ z0;>`9ztqCkEEh>QYaYTMFqX#zB}=V1HMyODHXsncGF{VQiHS+FySTcwGp$(8B0+-E zeb)N%gU#hxoiU{+$^uqLC+zN~1iX0g^^%xGjJ_LE>+7n5J)+XJP66-Sb8%(%1r zVQp66o!GblZ%Hf=H#P;27!}rwi1|O$dwyN{3xz+rSJ>j~{YF~A*WVdeb2>cQ_@f6R zkwz-P);=63YWOY0G&0tVY%Or}$CKsPsUwgx5SYhayCMO?*A8g4+)3b`8QqiCQjYIh zmVpwX+NsoOfGC8#61(r2y5#%HTrUB66B?dnwiMV4^iiNnc5`MAwDOfKkf&Ju_U96R zML}12HjC{xgIg$HGT-f=F@{#*yLfG?isI|)P-2hR= z0GziAO~R3`-Z-&NO#n=@|Ck$B2t5{aJClbR)mTau%O{QN#?ufeRla?7&hj~zH~m-+71OTHzx%r(U1i_3RGCHf7 zN;Oh%c+Hn81y&gwe=I(!oHN0bAo|<_U0a^9Ji013PldijPOIab(SKF#mA|IhairtXJ# zScUESjhn+-QrN*sL1$VP0|@a=%>_;IizE{*@M*%Pg!ZO1L2^l4@I|D6TAdI_R&n6T zdGi&7KdkfrMTCiomJTWOqmVlx4xKWU%Z+wgf_U=yghjjA*c2K#n^QJ4&%+wj+8voy(6CAqURMwCqc$#r^;5`8(u<#XW0kH zI>?1@dPVnqiXZNSC`j1Av>)~QD4GWq(a7Rf890H405fd*!4|-Tw~cKZHIOQMdBBai zdjO^x^E)bNQ*qZD-KtNJL;ltoJNBHIxqw&_>w|cg@TFOOib0?hWjZeJPBcF?6qW{d z>HHkOEInpm9{d^!>nPuI@<7aIEjD(DtvpUmuq#pkO2UBqD>o&enR>0+HUxVkRl*g7 z?nZc}Fa)v$w<2-$F>l$kOA)nAalw{TND5q1ss@ghBp)G$iTzvhmX#b0Paq05l?4JJ z+utgQSpMv=cg*9e{QKq=wwIu4FYvd#gd|u#@`qsjlizM<)ZW{4;oJOoeZNgPyn=UI zeD^8T@Rt3K@RGp<(G-r4g#j_YKry@t7*3iRi?=ix7vgpXJeMpI$A*_=8(4^L-*yvp zgqSML0#Oox#!%Q_p;C)VlMqR;cgpS+w3wmlBR@Q=Ct8!Lb2PS)4q<$dF@0D^;Q3>* zp&<(BVPnLsSq*rHS&Ew$#vK2f%1da_ywFYC^V=~0e0n#t_50H`zCWA_c$?rS;cjXg zD_yEkylGX{aR{@e;Gflkud_=M8=hf4n6wz6AYU^VD8DS$p+HAF+(K(&WC9)AdliywVt9q6(t^CbJ_$`nlSwN@^C(1JGE1;`*?0J8wKwA13U zcdFjEBG?ouR8+!*#wJPANxK+%ZEy(3Z_)RS9bL!mK?&Y zjWK6Xy+s=k?S1FNGicap#=MnaD3xT)FN@*P7j>`=iRk7RlJC1 z*k0-}ZEp({AU<)%0#kK4hwhk~P|vXS@|!|D{0TwQDMUa&`S@O9fg(9inu4M<$~B_P zNpBX$*5demrwFlTCldr?JAHL6>3@-gIr z;_m0;!AG|>aodcJZ~y*q?}-WRM4|AqRDpzQzHS^dEWlji%yM)oc^1}~AbBQ><3jO*O=|jUizwHF+v?K(+mM2wxjC zcEk8KudGoQd-{kw<#oY<9)~yv>L0b|Pnx`nm}lOf$^j1{dW}2c1ojYZ8ud ze4<~EP~cc+xd_v)>00WCn5#H763$wdm7VyLHyY&2z`Q8={hfI+ z{>^_roPR5g;vX6wvg>1KkW@gl^71(Z`-JjRi1O|TL>~}RrKvuajbl>`@C0SY9SBj5 zzY-f#mm@k;he=_nk8}$>iM~9it*bV`?jD*>d)-jr$+m#00TH{WX`V~s^PeF2xDj0} zPj~F9kO#OOsJVbK<955tjI41P96FNNAV3nHxXHPrRM`X*PMlT=m2H6wVRG3Zrpq== zK!AOsm*w{CyWj?1kms(ACHxoh2m5YG9Iw=&a+G8f?6Ax`-9xZDUM5-SfO*>Aq)@Q| zuB^o_zXq3sA_F>Y`N^DxCvWAXfA{yl$OpehzG$}bZ!f?9Zjf@%tWy~(8`&x|x&!%^fE{#0BR4U*)NUZCvE`gbvrU#wC5`L0O4HGGm;-)Ss+9CH z;Vq}`hMk~AQ>WyjE>HR0JR?a9$$%cQ#>Cz#S)+L=NN*BA z&(J^`(Axv-a!Wr>8#f{wDYcD=Ir^?b1D> z=fbqOiA4A>9pu4_WR} zH;{?3Y+D{8p5Erd}2CBFPQWY92_)QX`!0f zreHW!IyioIm&M_M@u0~F8fJJhxOO%pY@IQ1yWJB_yolhdu~oup*!yaJMUG`>?GY}T zUV7kzE86!nCI2E1Lt~$C(COshbNimJ_!P5vghM)iBK<|Qe8;btpZoLgoS7)vd{5Bq z+q^P-N}Io+o+~;CsC!QVi5p$*)G-VCnvugSVWmNIxt`$)+=@Acpxcc!?1{sb=gcxUlMmMo|(>+2wKs&?x&G& zT=}a!^X|euyZ_z_Ti1CTw1XdWHzA6g0^+R;YTTNAe|Ej!kd3T5w))_&rGGC=`tmdC z`4gvQp?;tKGIvso_^gg)C?;(h;_)YzDzutl#?;+3X)O7XRH~ArMU6ya5d=|k%VTJi ztEec4RcOwBEN+H_tRI7#${fXpxPBWP z6|!t?mZf!77Vk-Ap^|kC+j^YzW5vL_EmgB;G>dQgP(N?Bglc05D_5Lb9_m%YRo|)! z!nOUB@SDAx9#Ry1vYC)wO-!LrKev66_gJF+CkMH#z>PcF5;LFbL!_Qy91vE5io#lS z^f3fHA?Z`u^nbu}A89Hu*-ccUJIx1AReRZF=ruxfi=IxOd}7UVHKlQI%ITO!M-!$; zVCGF^twZX+G+Py9hEy3o;wUwkB)DJZE7RE9Q3&(u^Jjbayr{ag`2*~kVn2d^Xv7X$(6sqp&~6$W)ve7AY)K{zI)6b)&tnwbjejf;D#JwP5A(HhR!p$qa;Xos>%y zSjn3D&>Sa8$eG_jp2jB`Y0SCG+GfKi(2^vbOrm5seTgLAIm!Y<~sLm83Bg<%|^N@*ekDU!;$aWG}i zMr+kGrs+EIcA3iNT7V3V3$mug{!n3|e4_R%JGUk0zcnW>(hsDcC1Pq5*3Yg<;WjfZ z0dy<*OYGl&9h!=~@_z1|Sy@QOJ745~{1Nt%oRoRve$k7Y5At`dlK3yRn66uhuAq6e zCWHn}?{W@$-H`_lj}{`CXJr11{F0+ay#&zzPOzY~fsznl)WWX3uUAm2m|rY~VPKxt zPy>%KW0^y~u?ylUvRs>N3ZW%|1z;T7NA2>zC1f@}m7C*DOlR^+!ZU*u64YGU>C_So zh%hatDWtI}_7FxBSZv1Vm`*1ZDDV;_%|)P*gy;qzL9ryFFfb};J}%ONQq(=!&BV0m zh%5erVh)a}3>Ty~H^m(%&f_=Xe?|yaOREw9`%}~WE&%EfEUmIGSete>p|vn?P1uA6 zC6c4#lf|)9R^=_s^1e2I80wH{G+W-(?WAB#6wQs%(q1uSnUgl+5N9UbUCeo#;I0}N z=T$T3L8&&c1Y@Z9pl(-rT4Y40jf8q*rjksWjRtT3+fWV2G{phzpNf zyyyRcY{F}(!{DVK4h_*=Gmjz|7M<=^UN9$*I+S&{6%sfUjGA*Z=+xREr_Q9=<`;d; zP!%F|R|gL>GW+r|LEcGivM*gsWwy;>EY{Q2Xi6=5H7a{-YApwqZ?&yM1`O>oP1XiF zZPaZkm2gO%L~F8(stK^`MVEjw#sC_MW(T7{nZr!ZFlcJ9H(y0@s8_jo7QdjtX>WQT z{2YeFaObNy4i`)WGZC)gfB@Jj7n*3S>{otfvIM`l77EwQ>E_WX0awVy1RcBQw9z6a zY^^xSa4csbm7vcKHcPFOfaC_NKm1LCdwuS7^!BbEzAn~@bQgtnshLC(Rq2z<*Zn04 zEQ+fz7L@9)5qYK1L=9c_DV_4vIz~nd>ox=#y@uQh8OtxgMx#2qV6ibUErEqw=k{kq zhgmD2V-!Q3bKNOKqQX`iB>VtjU+;-Fjpylwm_}+P*f`c5xzBAHyLn^NfzzFD(vam# zFMXY}vNa=ENuR|b^M3ez$LHte+{Sb4T5sWdJnV2mdsy0lY}Wh&Shco+MOU{|HH?P? zx*GM+bURy%I|7LEV`^+ILW7c8*FYP;(ZHhH!JA?&Hsy=o%64?LOU+P%SeVa&9dKZ* zZCD4Lo9n3KbU2<8vhOLsfEftmQjT6dT zUdPX{tt*evkmTJeEA$i&$-d7`>7_FV8Io`zzqknHcTtS!sXdFN3YZr1!(o&o{!RtM*~yk0T>B}Ts-L5*!=tZ@8Ra^0O#I)Zq+`m^mF zG_wM#1h=&uF4RsHQCgTOmNUju`?BC@H#%PM!i)Bz)ar(p-LNPgp^JwAym>37SJ5k1UJL zh8RJz0Cs>%o;-e=7cM+wO2#)5TJ+&O=Q7FsV4Ox3Kh(xEJjb)bQ`BC$DpN1NR97vs zRE0t((kRR><}hB|9u2fgmiKws24ad6;tv-rG#2~(A8^2wjH)qm)9VFgqp6^MPBzMf z(1B{Fql?xjO>`&QNZDYPSG{Oq>C@6!G*=UN;tw-Db#&Hbic;+E+=kt4Cf6}CU9?g1 zG!WbBe03x2JiBhA*8VCQLCeFO(=>*h*LA}{Q~L#dz2(B?{5Mtw|8%W@N}vXYyuvU} zzKTeCef-(1BcDA;QUottv88$K_fK^L%l1qA)7C1iZ+%6W#UVWD&1RceI&v4lI1-)! zkJva)oD`)%S!-N^tsI*Ot!}Sk}2eYL+4i`VyTjJzz%3gch*E=fbU<99KIO z8~yg(N>nhveek<(#(w?Y(hCUc6SN6k6pOEB;e7C0&EQ#T%Y0p6m&Fu}*}A&ylH4q< z7tuzlR45h6xq=L)6-Y?1Z+{MWd>mVKEcO;=E;1+Lf)0|3E~vh9HCrIVQ!aqhr?G;I z5WS+eq45$HPq}G|?Y@uQvdJj>KE1L?WFS9TO(dW2^;-M%;>Vpo#72Dj>fIx6Nf>*d zXgj{}-A>%Q>vQw+6*IpI_^poYP3FF%hj+hN4pYe2%1FXkNfy|*+gG4$dSqj zMM@Cn0xkHp`>eFH*c50vhiomD4s|+-i5cv7sdVgc|8mS-YleXpm!R=Z8gvqfV`|@% z{X&*6b-WfOIt?UFOUnXGS;|a_X=md5Z|-IgS95na-&dW9qN6kd8Z6z0&i?81+1H+} zyUfiG-SKqyjgCN6#9&@oxIaJYBix2z%z3xKMT$*}v6bn7-El$fO>M9hMO+zCq%ad< zT%}zUHyjB0Aps;5K0#89_O70=JRMIKKFUHC8`@MxD)C(wZ|XMmqNq}9T)Hv?D=mth za96U{M!uUo($Y*EW4Z!#EJiE(LH8fbkfWP3?(-Jzei!qr0)H_fdS$?jNczNB(#xHk zMZ3Z-SXXCbUqA(G-A&J*jjI}4C;`Y!J2J%o(T}2vgxM3X_XKm&d5vUxXwIvMfbyh|$2bNqJ3zB3du~)h3b; za6y(ijPi|BdkD-iEY%^a>%nq1U;OmDXItbUXC@9``u-byaY#{QXIAaxgS#piPL50* zEP4L1^5b`gLo#X9mkx+}6qRw+iT)PE3!Vv;C7YaKdq1>y&Rpr=tOq?`R=vU}GZZQHOosF2n}9@A>(xwJu`TaXL9 z6+GPporPWl!guH4bC);&^2NyyXIDW(3%7yyAH8>&vh^bwO4I(OO_?D4QW6xZH{)P2fOUt``r2?OL^uB#MWU`pseNft)ji`_CTym~#B5Y{qxrTKa$R+d1sTq3I`VYAQu( z>vXbX74zFL8aHk_d^jpxbb(;@Z^h=mwq4Uu4av6&-6n7%vAHQM{7a5a#R>lxIRSGz zStx6|aiB#XG7e<99GGwoNrXa%1jg(D$+9_G8v8@TM-0ad4heFJT^5{Fy(6b5L^~m8 za={=2zc52WjyJSo4E2WkBFFZ{XISW#E~a9-lh>4X2y-{7CmZ3yqYE0#q3H_oYs%?~ zZWZt(;^qNphihi5jLI-quW(bd7V2wq69e}{>Wt+scEVGpjxov_f?^3)TpSc7*kpBd zC?wi<6*KiaLJzq7p40KltPiF4TVJ0vt)aZ$Ky ztdHZ%aa%{tLlV9;G4MOO*$rjt`ACpL<~!PAP2|hiPi-Z$5hQV_rI+8>(i2B#@+2JV z@j5Q%ov?Md@>1)!Qv^Gp*w7wkSgqzJ|2WO5)k7E$~CZ2RKyn~}{u4&@I|vuQnR zqa$l@JkBCh@ya|teuX(TC~>adWacT3QV^$paV8QLm7`^wj0O7eG=L8|k*&(hQn{#8 z;DS43UNm$lvJ-HEQcpaT4BGJ{p{YygV9S^EDPiC!j1@5~Y%{t_TmGDfmcHlCx zJq^tg(rtXggvBmnPw#0~dk5O4E+X4OJO;C0<}}?siZHUQxualY&VYKOe&jW9XXA84 ztvlIk3b*wCu=eg@N#A|^{|7P2a?oi@7N^3^wzlS>dx3)By7RC#u-aB_PAzPxDa1*WLV45R`BXuGOYWkJ8 zc+81@*a{7%pyW+0O?1tn3YXifUShH9J98rqZi~l?f{})I0=B6?f&T9H@aJP3V8SA) zY%+yKX4>L;ELlDQn(JBrIfFxubSw_$MYcTbMvb*l0)qW^HPoxM_by1>cD|fW6q=z) zshzJ6w1iWhvw2I3-5!6trQ?6y&TuLQZ8EVl{f?6b+MLR$ur)!)(^Vulc{Hj-;LGKr znQ_q95g}ZX8+R48|8XYf_{|n{RYW2|QnbzmFHZa5*ua-x%-f~LF~QhX|E8{ zAeAPA(HrY4UV-o&V5d)ztSE2|mrN*CcfcovWu-R|M1=(TWKuv1${}}}ym0iTVTeT| z(t`QKp2K?-HBjdsQ^uVFsrzqG7vlY;VDKgTO8qSd4XUOLbc;B#^B^>Lq_OQXGicZ@ zmcgN_XRkCknK3+Ov29?s7m4LH9a4x1;zX5Z1uCx8Cx+G7MU``nRp;$N@ieLJ-NvF+1)8;W77jket7{#K@HKR^Dt~`3xn@srg+{gR3-+uG&V;1tmO-Hi=Gm*n(zy5&~gRb5y0!tZT0>sfa z_sFd5+*uMtWghuUaq!tYkXPnQaG_fKT_n8epjt{Qny-4`+ejv#xI)f>%H~A~FbD*i z89B$44v2Usgg(AU*0admG-3Xjj6-{dTO&beq|?w;KO#3)>pw$ic9X1?obJ>Rg^T`I zaSU2K%YO+jw7XQ*^n@LhBUb4>`7l1&GLAGrQ+y1T36a1?RHxDI@}HTn{KHL_>L>B@ z_lCoz-#%iPge=2?kr@AhsHw&M3r&m5dum?TsmCpM&t`JJ8c(9_c3xy-zMDCwdoJz9 zb7FP2ulG~++#d_gCl>$p(Fb>PWt^_*%gbs|YN3mua3exNS*_v1G)ay17g>d++_b@7 zlq*y}%k(!?IA$c6*$jxY+Mb%rx{Dy%Gm4Csc(Q6h%~1%!Wx}`HrOs*%-bJV|mT5?* zk%!|`Kl)A=p;fMrYAz23aF%0U*_bLG`SQ6Q-=F&fy7mQ-R}Pimc$Pk}c8=(L;l|{p z!8dnR<=@y6{aR5N`Y8ojV?_h{oZ1?vO4q3R`0T}Y<*fIbm5{?MVFp1>x_(9^66e7z zsxyAfgbLaTDItZOT4pU@T6Q8pg4H6Ahqm9b{!UOdgzMa&xq0A zgZ*W|u51YHiaYb06E0|+N)Im@r3-0g6uR6t38yp-(#-%6G4y+I93fwI2Q5p|vB9rI zidJQFIG8OYha#6|MPDBGxpq{&`&~LJY+LtZqODvST!Y-QF5!L~OsM$n(^cCkq|zVl zwV$qZ?z$cPer#Rs)!xXsREaE#y^exkOvxu8P~1#oac#aBRcU<@vR!$;fQTVgcwro8 za=1LDkcxuh5hy{Qg>drxiz@5Flzmp*u@+%oD`9EI;r?-c1Cc71YT@wK^bhaUrB|_c z%&p$DaYN$ENoABzl0KTgoOuU}1hbYxL=-x5w_55;9BovVQO>iH_otnqHmx{#=-Dtywq$&vlm zc|0#uYYTLZX~aU&_(GVz=8?S14cCh(E+T5E7%FF^0>fb5vq*J#y+QSu2yij4pf9Ud zgJIap=>%vsk-SX9tJS_Dt%o;U)CHGTdEUxXM$YiBg0-PD6?t1abZ1SCOorc;98$CH z(BY-p448J6qoxs3%jW{}u?>4!Yy0;5cdf`EM+77zlWTrsCz11#&Ide9TZ=xiy6@4E zzbc<@d)sTutI*D!U(jXEV+rS@ki^pUs*P_6q(WIF8%H`LR0^F6QW2BACpHUHEm<&9 zt?eNQrJ$vy3dL6u{y-BxoC>?YsCW-V09GL9OiX#4=4*1qaI&T;{&!^8mEUS^KaM?m zt@~!K>e^5a9vfX{S34@ogNo}G`_}=M=XI*_wb{I*B^MGlCL^=|mSN)d{`Nw0Om%4Z ztJFZG_&U8O)UIM5@o*Thf+!j655ox5xDT5k@W&& zum6Cl(NoU60%6w%MHaDjh()qAM{4Nv78VW`VuPGp1?o_1O2C{jYkVlSthNT1u1yI# zak`OPpVn236_5fi+ZJ!w!mfF9I6}P)8@%KF{d+ef!XpiYnB(VTI!^qPyyk=2&?mX^ zpKOaaEnSd_JmC*yQ3zmnj#g|=6Hgm*b=gdTv?^L~ZsfMB3)Y=GW_Hr6UzOUi+Rp;ybq&vv|i zVvyCZ3fgQfqf`;=y4RwmLv*Hw5Hc~EfbvWO?v}(XnM}xGUIQDbQC2P?(0nC6tVp_4 z7g2({fE0E%3wg?Rx7y;;fWJYZs-sz8kPmTVn4X^y=5^8CLo{@t$VEr6bhE8rb=MW% zik8>mb!*Xe<5QPBn0v#Oc8dc;?7%~#K2ScjH^y%pnv=O=NC49)R?nd z^?79K2sU9vEiM1$$l&$auC5OeF#1_16D=^Z{?+)DQYFj;ZVoo5v@+B}OuU3$m`Ed;6C zp{<)B%N3~Z`X0`J6TIT$K9oR_FOI>$z-1SoyYI&rlK4LQx+eAdd zMA!;gdfRgoiU5i>p6u^PJd`!inMyic7mOm^Y^aZ(tr(4zmhh`Ew#m@&nnWgM8xtT2 zAZMeQh`Yz3rz|(3jnz6#2eKtbjOnx(>*$QRoOw+&CyE~Erc_1H!y7Ge?Vf@3uN~j;=V$j$qwf;{F^%Q!vYr}2TtzYv7opy2=bF zxoWT+2_w>}En9fIcU>9$NUBS926hx6pg?$IaGHcvu}mc69p1!q(Y&h2zv?%rnp?pc*|KP z>y(a0d=6RF!3R)Nwi<6C7VGgyZ=l3xYU&JcK+2$nxsLt^@?p#2!K4d{wUp+V1^95f z+q`x(DkoAM6n^a2_^Sg3UPi)G#C!TUyf$0KV`hn5PrMeAQZyW=}6!pm2W7-nmyJ4)hON5J5%Ie0f@ z%EqudS z;3U-Gp~bBpS!*aml&OrCe~1K|MYd|?;+!ayhSbTamn^>+Z75F=H>jZb0*+7(#JN&c z`dO=x_YHC-Y~s^`+=n_kdf}OS-;z>4E0ASo@3cOOr#)&!-^tE?>6-GRFTc&JX)6qy z=(!;YroF%YS7hjiAE1*%Qmsd_@Yej%$f}ai40Dz&DGY@zr3CAedWK?rh2RR;)&&NdJJf1i4dQWl|}?InGm99EoDFF@dykiW|6H-(?kQuz9mphts__K z*u?7@C9M=pTh}lRZ;^?{6RFe&%pmH#42$8M8tYCpz%Bz*QI7lt4N(>Xd4CSgrGwLG zWq1=D{GEOT<%>a9)73pN)^}$SEBmHKBtZ(dT{dX0)ug&S^NNz{F0aqlLe~|?orwWM zpkl)GU*uvEMu`i3FwjD;!#Zz%BfK}z+>jeFd13NB`RUc>Q8e0iYP^lIP;0~HqCWXF zdlltA{4k8PbCyx2^UU;EoruKe;q>86K8Ft3d*!yZ5u4C3#63CWo!D! zleWt*#8onpuqBA0Jf2Eqh47j}tu zWW_@K>EU6j&2k}3|ySJ_o@9wmY z(!-jIdpwiLw7P{Hp_ob6x70^OdXKC{;m%rW6;sngD25F>JOOWo6)VrNsz-r$E|3A9 zofU8B#E%V<=32+J;ZkT5c)<1+vt(FYS|o_9pmQ*RRxz7`{`$j&oqra_Rvr7H__YU! z7FOYd#wy&uTbkb`bx~4RUASJHT39W4?Sa_JvvP_lOHg}&%Aw@Yq4Qf;%-UX4Ok+jr z>BC4R-sS%|CR5OBR;6ZuA$0eMvfbsV&?Vl^fp)YMbg(Aez{Ks(a4IV$lX4q;n{6o|e|Lbr@nqFe3xD3(!Xs6H5B@dCY|cm#cp4`h=0Ep)83HTVLFR zeE;~}_}#~t>jx!o{+Rmp@X8}QVOtE#(@QiA>b)8wSjsWR>ohMD*{ZR!)~rPZGiUHa z(OqnJQm(NwsoP~U4oKZ* zC=MQu*Odq~n^fSXwZM6Wt0%b3)?5)5XAO#RvR`n`t?UC&`IavpJ+1W@-#UMAzvaYW zPMu}_9Yw&qNWpYXV#ud^kpaTnbrSBP&H~1Xz}lKWlslElFC9nrX5qVql445>3}o*y zz$W;qjt`LH3quV=QOos&#IOuhWeq2S896XXHVdI$^+t{WPP8Oj*-S<`zt;?n+;#;I zwm1YUuMy;D^4G|^T>2=mJD5=z@|K)f+XmEUw+G*)RD;rz5Kpm$+^qUp$wttl%&2#f zT+itDQ*%Eznuh+FJ3-ax?%llO$_^~aIks@o-FwJQ#zZgL)SMIZH9kD9T>+?9B%D6d zjV%#nwGicL5yfjHOQxs0h9hB|UppMBb_@X=2PifsnON0y5PaR@>y>BSh>ea2lq$%5 z_&cDdsRM?z$(SOEU(YuYjVYv^*DAQCEr{yQZ}ZA zj5jRdn-sQQ+qi|vYScxJ0h35onRZhdTe5;6hFYH-pyFo9Wpd|AbH`f$9Z26MJ<0VAW3Va=k#8RKPSR3reSO~LJ)#UI^{stFpXuC58N zD9RU_abxIe?FQ8GlF$CRvH}i8`wP2E-m^Ukn@&RwC9Q6~-MfI*&<81NY?0ODDPu2| z*^Exz!eLyf&3Ji!s(M7^^z-|8h6XV0+2;+k`<1ijVz1@9v901s9Z+w5gN{@^6|lo}eick}fG=_H*yqB@Mh45|+KgCs8|=0>WapPX(jq@W#M$p+r;LiDEaWt2ctusMT9)06Wi z6a@4iNaioUL?)Okj*vM;&jbU?($^&6Fo&%dsrC~Nj7>x1TxKA0@{U{g&2cl#_5qk&swyJbuzU= zhG}Z3`{RFdH}2p;o#gqQKL%j}3G#6dsj|O!!MzplE;)_4+ZK*C)U*@4tzm+h+~<(3 z({UZ0k$rhofW>&BUKbwr>AD3hhz(*vhYoa)%q*?YL&GwbVHtp5qnB?t*bQX>3aT3g z33sV|0Fo*Iisw3Ab(mMyc2%Ynd2=J;9bdB|hT^G=V@S)IFL}FmT(X8_EuJn@6Pm&b z1`PcHDq`$}5e=%er73>?zk5u!d82oyzX_OLjff6s0J8(9!DLq=D{L2tmGPQ7(00E@ zHhO$(dcc6>0(Qpwe=1jiNkebYHLdcOGi|UkA7Hz7~kZ(&U|FI3-xaiOLb; za&m!kYoz+>;OM>Zv)dOv{~8TzZhzS92w(fsS4+m13>FunDLnbcC+Mgegnp(pv1C<> z=ul)!ZPfjw!O<_joK3breM_*)6^^&*^VLqYZQR@p+Kp$_M%LKg-~PV9&^JD@3N6P zo0?{Q`w)v)=IgAombx2JB_$mqe;aJBVDmr>Ym??01_rcVM zWnDVfCxZXmqhprvJ>WHet#|$_AMqDMGahV%RgXMycNqKqUm>OLP8D5~J>&L9AZ_*m zAZd!+G=CjbRKqs)XQV)h`{(yFJ%;S0&tq*jFkL$@?%W@E#FA-V*iYJ6d|q3A3Su^%}vgUShP!cZu<(Dm(uEP5hL*{`ni@7l8_h*fm!eBj!2^7UVHeyT*TT}k;uh&Vr* zd*!O5?I&Ak4Tf5PHEzG1bb7dE^^R0oWnjQ_$om!oB>WClz$McdC;|z*Yn3XW03c#E zxSwA|()b>kH_wZ)!i)=p*FVw4fXSD&b+#AfFY$ORO)v{1Tc;g{0n*I;AyQZgRn5k{ z3wa+I{M84SOhTzg`>X6@@9BbT?j1WPe=MzkHY!A(T>Sa_E3GH)^P6|7KF4ZW_tKtx zoU}I_ADG8TnV%fOX8?1;CWGOk$TKG^T`JupS;1538^j&lM_LcWpMR5y%3w{7c9Hg z_V2#G`|7!ESGFHc8%3f9CQ+|M+^Sk$b&;*TTQ6bMS(ly9uv$qAsf}S4e^db_k)`Rly@6oph}yG8k69Cfxn zJ?>0C!G1ey|83T>HT`>S_}!D&Y~&bO1ZRA)IP$ORznBGgshgv^*H2{x4Zit%POi!dLXjY$H*@*^=YcdImkIF`OviYn%g1c_vV`=>m!W~+y<)h^bn5NrmaIam5S9K zQUq$4KR8~p7QWiEH!Ka!iHv+alyd~Iqhj-DBYhcJwKF1IV;$CT<3;_w@R*P9;C^|y z?D7k&*LH-wDG?PHA_w*kk+aZ(Uy=QveelU`^AGX|$)_pde6un|`TaSqF8Q@LGZj@x z^e=*LOb#ww!psqwvHcdNBupn1);h|Qy{*$|WyiY++5pz@<#JA>B115ygYFcAT#T{E zgbEdyhjG~tJWKnKXqj-i!LGlH_+yqu6?bXQ1};~fC37mOkeGMll73xBzxu67v0?9? z@Ua!$=9S^TOziW2wjt{y0`^E4nv_f5ZfXDKFTOLuw9eW5Uf5UFIoyy|ZTJ)VrXxX; zSJ0{nYk}I<%)$wgqOmHW6kDVvwGMOQ)!?@`$2XuDOXVgL=8cbpn3DUwYv!Kr`qfe2bN@A_cthy0aQhlVaY8Q5|ZI(M$m1S>Vi+=>4XWjwmUH} zt0}yR)GZ-*M~RmAhSav2bLnBqbM@T%wMZZ^oCBdwfn9>(2(!UEx`@8jE*~E%N#w9# z7>9-Scz*>HP3eRgyuTzww;pqmZMkgMqg(2jFaQVz{!$mUjZ&V#NhqcgU}}I11v3&h zY1$2M_)`w{;ws@%iOA9%Y_BP1$jqXGpojKoxY3nj?m4Tnf7|2YkwVk2*72MG+0LAQ5O1f%=p zx&=KWWl|n>d=xf%P_8_^+&~nVq)LohwcEva@E%Eojgj0?2J=K2k%xG|MbTxyf76<0?5Fv%9~OPKvhpa zKCtz5^Na6a*?m4G`|awl|Fhum7L>MF?3E~HMMbwH670gfo*@_??1z44W}E_On;=PD zwlvhoRbH@M6m%hJgA?*Ca=VTW);>6};;2r2YN3SykLYWBnK?+Ts-h6`_4|3$0ct;j zC*2GsH?oc}V`S|q@H@@w8Pg#9S1L=%DT}|!|LU9Lg9VoZHfCzgFHAm8@1$mqugpoo zqH_Q98z71>kpr8EXF7Wb`+n?>K%VTVc1F(K<=56|PHsTGM@kwMIyFr#%p5EXsvzAK zA(~t2Fg1M$o;XETv$%r~p%F3OtqmY350A%dXrwyxGVUD9ir_J!?y!tyrM^w!1|^-k z0x|SvRV&Di)CnujAx~NS!R6WGZIxPuQaqtYW28I=VCo^AcVq(lv+u0n$y+y{HQ)Ma zCv91>x@P+Tes+6PPpt}Sl32>%xJpB-I-Goj8QBB+WK<5u7+8X(qX(FR0X#Tj6*%!Z zO0AwFsx~smgLdX1Axf^eU0U5Ms8#yrP*t*ERd@Xmn5DFSE7}IFukEdi-R0OR23l1s&?o@K~Blu4sK2 z0klu@rO;8`YHOm-N`OH4=GAvM4DTp~vE$~-{Qz@lh1e*q%yN36E%4AWD{&wm8EFc~ z-UyvK`W*!;Sr&nf5Qe`RM6)TD>G4GxT0TRfE4sQE zS&bu(E)Awk*=hygwvDK@wQ5pH3WWlfU7{an#>V0GwA8S>gE zx6WJIP_lPo(RYaFC@40*vJTqh-l7vd*b-0KU_kVU8!TkZ9Ne$SYMP7qrqY{_Y3$}# z8;EOBF|xt((nwiC^1S-jMn^a~bbGZYlOV6>yTIcY0Xz8F9)=4JIoIb~q#b>{KHhA# z1B%X4Q!uXqOa+*V;rOTS$*wnuQSi9}oQ$rjxP!^SL?4cJ8}?J>?#~iBkJsdXXBF%CUV79torf|7pLT$yGDmy8XrTRXvtVKta1S&#l%a0o@~!{HP{KP|FUX zscrJDib5vN)?=BKL|-f>%oP$R6B}Tv(*um*osxD402bKl5XhEVUG}aztmj7mr!Tyu z3L3SX4i0>NPjFHf@dL{5syW?9jq18ZA*@Eki~=37G*q5gBiCdrUQ}HQyR3?%rnVv<+4b( zP#wk34G94nN+VWg3uI>^P-|A7`1f(l`Vt+@TB{6@);z30hwYKzFFt(ziyuB6k8pmn z?InuzeBxLQcXj;}zE3?EQo$y~TZPja{Mdk9A+*egjrQpPkt39El_hQkvRTD3$fj7T zVA~5^%yA*#*aV_ZEPp5=ku+Yr$=iz35m`g_lSlQEloiw zTxwhYG($|4abbVAFW{rki`Uy^4I&5~VdUQ; z3yUb@-1u&Rip{U>UG6XvCDb_IT=m#9E=A;0!-umClHZE45CpP&`fLHrR3+w`;-RAO za^dot=pKi$HSDqE^<4wL@7Oy(p^g8QfvO4pg8L)v&k3`*`-U znd*7jWRGc*(K=UsdU>eURy)wJ1rDz4B||Ou9xYdS_O)9TFzDAC5X{uS{)>dlB7};h z4knk`Ha6cQ_UWGoyMwf_W!Asv^3IXRiR$HZFZ>t5FRbkJ{7vfQZYnd$I>1kPxv6se z-!Z7U-)Z)$QbMLUO}*H6ytHgGoI5*wW-_SQYz^T9=Ax8m!kM?^Munv*+t8tEYrzmk zh}^q;qm|LNdzF+rG9`*Uri!axqj% z(6V9>79Fx&43lQ5)i*Vwx%JUA%OS@tixo~esut=5y|`O8JZuz|4=|)w@We*2mPB5K z#_kD;NF*OaUa`F>gxYS%gIl3MZn?C}ya_;xY8|mYWEcCdJZdFE(9Ru_9(oq(=7py&z zGH-7{K>P=oPq!;%=ZH8+ia{4;@vi*EyxuJpEeH*5oY}k8SY0ixfgbno=$h#y!i0NF z0oJvdx*%mMh8dq-1jkyqV;hKUl!=IRjdBmwD$g)+ViA;NSz5RU?+T>jiJRsr+H`6g zIbGbIX=^!@7bICuoUut=wkD!*+J#{#GEiIZhkvjwDtagg5TNC4Y0BBqS;_hbx32uV zWvg5LkUn>=;y3izYAv-^o)LjM`Ts66VMzBZvn)D-sN3rCf8yNv5k;fYh zctZI;Gz;yW^2LgxO)ZJS(2#?(Fr_hq zqzV6GvTpI4llynqPHsHpdbX+`qL`%C0LkK`-j?uB7tMg^$k*yI6*V*~e_#VD{r^|V zIN;W@{rj^P-NJ$!L_N+oQgYeBmi~L>{4cv~Xu6iHEb+x0LnhT$(f}jNe_aE*J)G^lv%1(qP17UE;;ppZ zPZS}!F_W>fj>NFcxq<)*C2#HTTwa%(*y-ikHKK*mT`-GN zK~)$eADm>bROFfETk@vI3@jgjTv>0x&sUU)!QtZa$RQl4@8i$HGSh*Xjq{)RZRr58 zb|P5%gV4;`30YD=%rLT=i~XHH&kML7|Gatq|AWG-$eel`1E7W@}uWrFKOBLSq zM4xuu0*=xD_4ca%i@cAJWiSO(n*2ZYq7;)jHos>?pN0vw)C)5qOupwQeDVj|7X4DQ zaJTl=cr9fT7r3;4f=xPceaC;UQkQ@A;?E}^gst_>q^`5EhO>L0ubugTowWVQMKrmEpAL*3jC*W`e8*)Wwj#_*Vh1a(ABHfe5UALM?fOXz z8%3>;S>DU@CeGx+n9b!cwGF{JxKss1-zl<0;1Bf~NFM zT&Gw5D-t@NLICCajkq(Ssz?nXOTJ|e#s@J@CG#37Hj}UE6kkO|E>FH2Gh4!U{DBCS zCj~2y-K?3@Dt>erenp3BcNA<^&!fIYQnOPl6Jv;nU zLtxff>#~JrYlbCALiI-KODFLDM3@6_*ZPFQoJeJdD4znjPc)f(2pbjkVAeHeQpQMF z$_K4_gkKdQFf0-bG=NO(h3X+AlLq5!;i3KwDCV!Xnp>6*-WUiw5+9aD%*lDbGT{UK z2WispD+O%giO#){&}jTs^!$I3cbXHNRPAdMFMs%vV6X>uw_4yld*H{@OAy=}-V$*g zHj!24@*YQ4o8jhm`bBv#bW+G%NT*JqWc1Wb&nr-pNIGXJHaUl63&eSK6+zwiLg{m55C>u+#>6w zC|4kVtBC28LQZ_njn@*HF%z=(0zy7fO^T6{Q^X20R>+^tjkmLj*%czFc0T`Lq-OEq z>ODKcq!DqMfmVdDw<=@zbVm8@wb1RHcVWYSW)H}oesSfcpAMJ)blCS$aD2ko6NCy0 z4#l=1-CdYIt1pU6Bh*A1;pk?hpv0BN>e}Agibf-%pNg z3p|oQ-)^`xn|>+dCXIl+N2-uLm@J8>;{hcwoB$vi*$hPtCH8GZy4F#B3`qqONnn=K zZYqy<5i-WXKh^#4L69iVUW03>Phhqo-1-Fm$WZKBvyAC9&^Lg-TGltA@$u6ri|2zmUxBvG2r@;BX7SWHbc@PT^ueREl7iIYX(_jDnnXU0ot+hu1k zXuQXwjOj&6N(8e7;Y~2OCct7&Qrb+Rp;MlvY#hE@l;0gA&@hu-U^99V$E*Q?Ju@4t|-_vq}Y@4hZSMB0_Q_vQOI9bUVtDkX@jSreN` z=^xtlaZ-kin{?3XI&r6 zu(Z;M`bT4I#4+h{8mjw4e6j9Ph-2vZz>Z8F(M3f>MHH#MsJh^q4~}d;L9I*(IgdRo zP&UZ-=e;CUqy*Ks?YTDk&B^AQ8=H@5_LQAW5&Wz3$HE#CHu*l{43*#_TpD6=*9fGP ztpthCDJgm^AuQBvA@BFm;D)oSQlYgryt644dnRVi&1ysk!LF+`opaC9V4JTu@Jz*> zVLFvS&SPXL&&+gnF~RjoQ#-2Ji=rW~z-_bO)dXJn^&6Vz zv|vI8bcVoGR{Kn3tA%}GVUxfFE{Hj{K#AKwJ$DuQmfJiT;{Zfq9@P%x*eGD#o5D$L zqp?!OL>E8~CaQv?p=nRZs~cW8lv^}R2d`Q}u`RT#8=*Ew&{idrDwX&CK#0Z6$%UHq zw}duE7BKMu*mFJ6a8~~o2ZL@5?Xvugyp6*%aV%|_ThED^22PT0Wj$o3Dl{~GCrwMp zm_`c2GF`gd_z^=3vxq`ae1ixpX0vFPs!%A6N(e#`a)c>?=a{nC<=r$|C|y5ZQ&O}7 z$y6rmjbT>Xb!K#zT^9`XPkOPs1_Mecsl#^#8a-{YTe1gq&9)eU$-5RctHU(|X-l8R zLJfK#6FwQl_JVz0p(y241VWjo1`Cb)vL(r+;3I@;2FLc<0XV{8J+4G zE=kCxIg}3@s-Q0(l*ehB-B9N+NmBwP6;do1ycF13kF%^=pM%M2XzMQa2uYHVkW5}@ z4w@ld78Pm05Tn%uVU`h=7z}#A4q~I8Ibmwl(Se6=#3*TFGJ%pk%8CQWQPFU)LnCH! z8<_$-WDH3_M5-^1RykzeCC|mu{(OGawtCIc=z!V#Z|2v&w(tg4n5%ZZx(~eRCCR_W zYQCj?i8*-yA3Cr^AC`yJJQY_iNGRIQ#(xYe(NaU4O~#2-ZHt9zF9Z-YZv7TjQ=AL+ zvdAjX!H1M<2BgmUcu;{WP@avAm0J2OW#G4I)SPwM%F2uvY~|6)WZ0Eg&kDTy^qZY- zExL?ukVp{%OC zoAp&^Y-yQrcTuQ@Q+m{ly0s}m2Sq-5U+4ZjwvJ9tR0g#qOZ&fg{qtqTnhoWiM_Z-7uR5NNMf9DqNzj2K?lGiBO0w#kTf8oJ);c; z`$1{+i3c+feHy2vgxjl9XTS}Wf^Nx@7HY^cgy6QDE=KG_|K<7|b$;jUm9;BR#(v07 zjFcX#3aOaJ{P8koedw~TB~`)iya4U2-(GNsH?e8mMYbl+Rj5}!Bg_pRg0gdm+TsMi ziqukTxGt>84UE!IG zv0Pk8;4$*SDwMm9zOX}}iJxy%Kfv%`ucWWhb9 zPyzu;M+3~xFc&bYvpg^lvoZD982`txSN4L67%Rp!i})I&?BQT=etN`YY#y=qrYGo<8=D z=q`GA#bI+6(W!W&v#zTyP76%f3bq~|ywmFO}&J5%-Dovd{lftD7Vsf_# zpcpl*Or^mLFSHrQ@z&ah60GT@(a_{`12Ni~g2r+0&Zo$&`BY^eO0>mb?aTgaY4wZp zsKU@23GL0n{*7T_r6bGkE?Sp@DK4bE|Itn)>AOXT-&hpzT%*MHMap^AHpF}kxy>^f zjp4OYH@dlqdVv|C0rVLy*i5^L*2v?IfbG&;J@dri)PSIKD@SMX;h49c5v zeJDJWKj^1O<`2IfD6hpeP`6#Miy^z1gxN0B6(mEKU$Nz87w!DbnniGFDnZ2U-?PuKFenrWS6t zgg+zv1nQS*gr)YGEUK(j$ytl8ANMO?5|px*3|Kd{ni)68=)^a>TWwdW)ZW7>LBBuH z+$U7~f99;f-Za+aq+hU(JStXegG2-#Ae@~&bQ{_rErHSqdxg;;&yI-6CqtGJrQvkY z2^mPVqb9~e)2={nnlP`IIh3<{stjbfrq7Vw_K^W%4BxIE##z)|bwPPL?jGS>g$DCf zZBbeXk0l%av>1M}URNA?*0z~;CxHLr`h@7!_cbykgncswgW@wzMkh0VJ{`74BSj6> z6}%VvKCz&zb{MsDI^3wzoMq%DlFrH6>Vj%b%y@=RRDKJNYG{PiRu|ZVj%%;tX5`XA zDBWFK3nJw18S%e)CKIW`xJD9MOg;@QGZQ#7C3XqX~Oa-HlQDduRwH_ z#H4UlY88t#3tH_k@?rvi#--_n;2 zB@&OHpv;XsT)I92Iqm52A67P~4r)4AAgJ~qzB}<68&&*TvU(9%F(Qq%P<-k5?s(ph z5$z@QsRs}4poaDYetkG&eeU;PHKX>YEMPScx|VNb3$a8<|SpU3eS_jqCq;Y7G}sWMiUq;Ex+@YUAL5G*a!1{VqJl(;4;B_Hq7AKWsf z35UUWC}dEmb>Wjx&C(9@`aH@j-O)xu6V2>na^OI{0wE=)RdlxOpD-~carbBlkJpm+ zKv$#}3{2W5m1_f%Ui!Qkoy!i3c(#M}CY?^my1r0zs2A;iC#Ng>QP(cSxv0XmgSFOC z)zn>hKp$pCuWVpUlTU8RQpOZ$vNwamXJZz}wTBdX=W;>fqrm2>aLhG@aoUHFdFA9L z=zsv1=0cR>A2)hF-vQyn|0#Z&2?*rL9j0;CNqcu}4(gMC1P5QeG*|f~C-$skFhusF zp%<)%e|8+sNKHsiT=bDLO1;~ETtjMQPO$NV1$MtMf5Z)lhKiOas+%NVq&sw8oMknD zDD3DB$g>PZyR0x0;Xe8X*<>O#vq~NXy=hC%QKt ztcf=T1~Kw`=G44~=dSwLYpzMUR;zsjUaioaw@z!p6HBh>_61!0zx6_LdO9HG^>(+W z3AQ5>wF85N9u?OHAQX$ggcS!`=jctZBF_N@q80rq0R`~s#Oby+=p76wt!1zLd2d(b zn{T!(5@o|7Gr_Lmk3y`0kq}NLzw(5e7HrKzhY5`Rw(pU6?-fmxg$?-L3AaZ=C-^aj z$qh(l#e6LQ_>-4=a$|v@AJ=(=W|NB__MyZpcYPO0o0X`UoY)BPZ;(z~YMmJYwLh+l z$o?Ux6a`dW%*B$fQAmB|d4)bPeCB^7%ivHv;TZ6)MI5T^(v#aF;p*9_9SFtW@m~Zz zD^~DY5X>dWXxRqHHUqNQPwKQydiMo9Uds3+dirFitvtqu+d8IO8*nb5;khmh**0!} z76Yx&`Wa|U#yMr&*(n%zG$%GrIUvLX#WI~3$cu`yj19B?#QTzv(rUjD4(?HO(*Ggt z-Q$wHmLfI&BEH zTG|fUX{nW`YNFM|g&Q_4DX3c{kAMdR_I>&J=lAFDd-$(MZ60p!`+dI-*Y&*gp@c9! z$zp^bYXM?*Hk^6HuGV3nsW{8ljdsAJH}%KsshI zRinJX|HCVtk{x0tc*Y@322ajQzNMHKU07ioP~mGi`TgSWkxc`3pHv6U1Z+xoRJ$Ot z`np3a(xg$Yz(X#}0iXiXaLU8U`wGO}XZ}Dw-{aO?fB(hixR1}=+7`=wb}lG(n6;xU zu9wt0`FAF-Cjh_RGHW^Oqcbky@gK&mVfN#0@~36KcXoFv2zZYyqEqgw zXAN~EVJ2V!(1?z>tQc4Yg!x47RH3E=X zhd_A)>k}CERstVp(qNl}Otoxu#3RQV^|}t`o~Gh%TMN;6 z2$2N>j~2e~9%x`1b$yw@eKA2AD8-$c&9q`lwE^T5$50h) zCrPWQw5yXJe}|k^%RycWU*juXf`TE~27l7+cy<(N{HZ_UvjZ0&uPYJmjm(;R=T0C! z{p@q{g^(8+)k=`WPTl!v!{;ww{Nf*OWc;Gj7m-hu&pz69mT{0jC$ZxAE$5uy5fMcq zQs$8*5*VSn!Qs*AwgeANW)dQyXs1^;`3Y5Kf;1@Y8c-nY`if8mn=068H?pvx%@!Fe z$I7t`CG4sj^YrSq=dcP1^(q3l5Z0!`j7RJ4m1>gk>z_Q@Iu&hiJAUc2th<*>GU%m0 zzOQYfomi)DeUJRzHe|y{^0(d}WMiimzPzUD6L!$A^HQ!}H2e9-hp)Yf94?NTQ^I3K zL*R2Sr`e(#21|^u5e0W3*rz1fV{pb9VO1j68##Q?v>UbF83;{13HT{mGH+hBgND-1 z$Fjf`U@%rxZ?n+U4STTF!zXIIKY$T!vDbg((4}2(H?uIplZ?Zgn^c>c{#|ftK&5zd zqToHB;YROV-Q}K>IY(@Z3#M8V!;YQ%S};by>{9N*Vm;%u!pF{`LC!MhWtuJBy+HfJ zzuBS5CXWvo3+%mQ8IRHpNUjJ?2A4ghG@CO%QOqvk;Ll(yy-{Xovs(mbVlSA-Tn3gs zUps*etd6S9Ud*~0_2fCd#U2=1@|Q689mAi`dA;@D!^(waL7mYgn;l+{CHYE~%X;nz@`2NdVdfxkT73rJn=EK?SU&_hH zvu~?TSuG<)Eq7QGc2zoZtN#7H)h9hpK zI9l$qpf9;P1q+mexS zcjRJ9(^yIu{ZM#>3vuOqs=jl5ZBNLDjn^hqd0|r>{u521zQNsIE1&)L{E`io*i+58 zLjf37WTfavf zjba1Wpx(Es*8xQ3U6Fvqd^?m2Wr{&KIoX1?t%v;(4y_pp>jT znB-Sb+>%RY08`zN&Lzky{dl>->@+fnvVubh6^t`YddTib&S{Zxy}7~tk~xqHt?BST z0qhr-D|R$qD?o!BvRT~vBng78^< zMyh%rO%{uMf;{t=SI_}@%3?sW`~icXf*j$?i0IJ>d&y)tQ*Vk*+#Hu}g3y%5gVJRF zbn0NYCTPS&A8DH2VGJ3B>MACBDcG(D(D8w5i4ub5u*K)6uSu7|E(e@}XKOZS@(MKC zT(UD1duI4~wfDFLSLh`?IkBR+;P=QEI*OQTxj}k^loGwG78!7DjR|Vpb0qJ%{M5kI zFZ7@h{Y(p*+?0yUpNZU~>VX^&q?9uTw4nD@1vwsQIRScsk#huI+b~HQr}g*tq7RfJ=|N1qI$^&AGhk;x+It&t9AtG*NS z_>`ey?^t^d9Fv9QG{~A7vnvFNoI*hY${r=aGUNq363{-e+U!Phk=Tixj;AGR>vNk! z(Q?#gDhFk`3k|k)9%#wCsXa}t15Wc^?P)z{n7@9EqDP)9$i!=cT3ef8lfFtO>A)2@ ztpLu3cP3n3s%9!prEnO}a1(ROvHkMuno+a{W_`D-!dk?}ZgN`Z?8qW16>@GVQZHoZ zmB2}bV~e} zdey=@$axEPL(O<^B=&seFXy^7$bu?S%R-FhEA#l|?ouXhKJ77rJ&JEkW>V^9vRVtf zxIG+MSg|7+pZw4x*ijL~!$V*JIth7?9a#N@6U*{k>7_Kn^RdBLlX#mV84eGC9xeJS zOeQgdPsxP^lcl19?L{zZ`38+hds`c?m+O15o8pbV8|&ZOy;O)lIEa~iW#bxh+6>jR z^@fi^EH5?T&u(uc$5YB`KRCK{=7*A%e;rOp&1z*K8f{|yYRr2|?QNqn%U#-CIcBxO zEkMWR)wLw%TGKk^Y6+4QA0o9B-yn;d@VXyt#c%@|&P$1T4_oPE_nZz#KCErr*)1}C zB?Xewi8b?)mr-nKu@lRr+jT+{%v>Z7I0Mhy)GN6|!V@hSA3Kx$w?eA3=Ba|YUHoC> z@rQFRO})OjgciRlcJhdRGjpcAmJ=U}4bsRY+Qur3UXa`s;(~NFiDXKGGMOZl6kW(f z4vaScPiH1*g|krQdvu-9xXvqv;gDn8@I>_}TBnAGe9Yx*X!L@Me1oaf1!Zuz4$5H4 zj;~jr&1N-}iT3Rk1#?Fqhz^}gJ9Kea|MwwPh7!0?LVjnh9Gzf5hYMGhzY zO!m8@E8bjkAg&1!9p9uG=;7f{Zr}c1uIP>X_Y*GH36)Rym<^fnGmrW$Gt9)ls#q~k z+Zf~JzVx_<~9F4CI>S+l>{Fv7sa;SA<}0ressROnP^T zfFr1W3P+XIoSJ2T=Yj_4UO2mqhPCqOLT&vG<($$2QxU-ST_lJQ&$77;>5sgsWr(4o z3N|$u4%4IGaZ9m~3(0RaG{MbGnS}To#D-GjRS@gS9&`TBTwV4b(#}l==Msd3a@=Hi zFQuvVAhwbRxd}v=q0tgqsGnkX8i>A{#+mjPfrj6ZHB5@5+393IiF+ZZYcytzR$p2q z8<{9papYv70?R$=dJ&;ItI{g6`jFoHW1faGqRa3Tvi~vJ_|=@Zfu8e+;9)cVnR566 zlDH-=yfSApzCSq0|EtTZ+uLsg*qTRH_)8IyW;7SBen`7O-0A2S&~AxL-7o#CSQL-q zRP_|Aqp@@`6?~lGyL2`ttdHdfXpv-0l;(rqs1C*X3Vx<8NMy0rmQ=IdAb|yL$5X=Pa6qc zF9gO=cTjPM<-&9T>lwpd)y+H^d^E}CIn)UI_zkBAGvEfZ*Jn%%9tH?ZmaT~*nn*EY zpi+Kf2vnq*#t;8II0 zlfg8LOu^i5(5i6WlFS%OL6_6X#F?Q^E6|7@D1s9s40(}Mc=^n+mv+N?C8CIjvZ?2? zz|GSJ-Be->@xy^|@ZNUm)`Y^A0PW(=|V4A}`(JZO?#&2X(gz1!P>@V8^^(_@X244_rT^oFxq*$T!^`>mrbr8oFg_Mqw*ux(T}Zu7i>evy3h)|<~2^Fi~vF+2;6lI4SC$4{2?@) zCCg*l!=}|YnaaRhN{H3T zg&GA8Wm~7RtQJ+7KAq_StmR*ON8fk$E)UrmNG4a$3bBv#QX0;^?Z0_7V!!Zj?t8M{ zC(8YSotXaks4E?%DoxUiZByfxGj11yWZ>l0^&x4Otr|1D)yNprwAs?pj1aj+Wq+#&`TWdOhjEJDs3|#5|Bqh ztdkMQ@rMBV_BaDp;U8f*V?Y2onr|$^*~%WWN7`D#plDnhVZ>#^W>)oxAN|l9VKkM3 zSO?IlDtM)LSF=2ZbRLo%Fv!A_NA%o;f@ajHH3urBhy0m(3ahD=*_V+Ko(Q%2SE*8L zKR(GH&(_szb3BP={DJ7xG-Gv4kEr(nxW0lzMU(Ti+$4Vt(_O%uQ^P_=+*xj4L#-8^ zkMtZ`MLdXtvs=_-ai?9xUN4FnQpJjzE&1cBTv*{actLwdI;oJTI6D*Hm|jRuHDgXU zncZ1qFIasnw2|H6e^_&-=99KV>asJJYBXQ3)83C?j?ltFGjAio;~x!t`I^#N6?5!T zS!)bsO1bmvNY(8xk&i;Aol^fHghs;%z}kIfSGu)j%og}%I5$w+qz`185K~hn6;H^c zPnTo4<}f|Qn<1D0RhZOAt1wPZYi1oVll&9;!Zwa6_~dT?6gB z_vfvnFJTLp^KloLIBG@=m_G15MFC=iK##Q>-Ij`V1+ADDfxbo)R0q63ZMhhNckyx~ zqbP^e4&htzHd6(Xs_HUq%Ls!I7F~)z)nBkp)g;vYFp(MMBC*T`9hmwE4GK9R`s66I zplPgpR$Obn;;j6)b%Px%Jf_x}w9 z1tY$j5OF>w6DiX;^`LZjjWxlUg_@Kjz=C7;@jHvX#70wbb2)ARW}&)gK9HpZP2~@` zY3sTxV282iwS`FojPVP--e1Yoo;BA*orJFy5l2FbVgs1;o(w(kWSxn!_J_Npg+J5Ug^ zJzv=99OGQy4@#5s@+QZ?P_Ya2Lpbh9Bg7N@pI(0azNdeZxAat<*^9YS|K*=o7VoOv zS+AfUD^=d3MkgKo1GBcuOyD!g8R8+AAy^M$2?q~f4r57=dzf1^ZCFVFC>U*%fdlTu zd>bzyV8E!&>0{ZHX^kSKwxDRn7&>X`O+_y-YMGl z>$m%!r|ogfpS2J2o&lZmUd(AS(J8%_rv^D#q0z-*q#5M*k zH=g#|HpT7~ko#;)&0`G;jG%x9Lxjy!M}rDy9Hze*7}O1yV?nmzgu$x|+dW#2&uSNY zywWVLE)NQeQ@(n(DZQ}jdf6wK&X;!T~d7QRJm^@1&*G3oN@?iEAoHBG*6 znA%V~eYKbdfglEmR!N-3<&cy+bCf&V7H->I_5QP;E01+Q|MXbwl3Eh$Q>CvzJvTNe zKD?Mm)(pS5Z}r7@e@gx4At|>Xk4u%c1n=J2jGLo1&ykGS++}%JSP-LX>Q-6Js4>OCQaMjtsAMq>S7O$RVcr{|GwRXne4M`0X5R(B+<@o$Nh1l^^p(npP3@ON! z%`TEX-w;ZTiPn9BM5a}VY~9flgE?q%3rq*-6&t0RtkARu8H?Jx4Ov5lnt7Xy8SImN z1NrJicrX9$Q4s_%Ul|(A^<-eCA!<}`T0pQ>0nF6#B}7y??_b5+&RJWoe(OB_?ORtH zZ(LWVPyWau6QcLX|5=G)_GtF4#`M@vynAj(_mkfS_b*(wZduym6EWkewhvO*aHF3_ zPc-4#f$i~5`g61+6JNn$y5|+)v)HPLdt}1HF#yyi^OIr&{PvGEM|(;n^SbHfq*iPQ z6tif7%52p}44E#DGstNn1iaBf8jKP(adHh8fW&X_u%aC)zFYa58Nei(i3;YbXQ*- z=w^YdLUpr1i`d$u>mY|#RL~z2LL{}q{1P*un$%B1vMS4r2KR}F`elWbQT)B5$iPAR zuK`QHTyAUptEzi^>B#R4(N(>Jytj5E#&9?ECH?*T$XnTq>AP7QN?-B}hqb)xN(~j& zMb3HjZbNiRzznMPEWUzKov`1qp*>cxiHA3`MLxzgX2_IA*ua}3E8HbbQ#(dgxvXYD zFL>NiM@t5;>c*r1r5ruYFA?*>ZFED>~oyv}S z?dmT#FYdW}Mt^@^$k*yn->84c`HX;3&e>TcO?fJ?n`&N5#7Ha6vOao{8J&w?40 zxSc&O|JxOE6!}emO)@tMKyLZ)K)zWCQBvJCBs5e!q*D0jl1sa7u=;aZs~aQ|gq@Ko zDG9WhR59ihvtx3259T&!Tq3NBFwjHAT9iDvxDtX$9X9n?Y%G%u_>OWsaTuh^z{Rs> z<{(b>Oa1YcpG24L@BZm1GnM^&0kzcB2J%3%)GR9#J-pu5uqoACjdB4q( z-d1lPDlIm?8hx6jXT!8P~_nqJI04K7ChFf&%5nTLRSB9R=dlb-tts-WjrcXEvPKV|A(Y*NAY+6 zLmCVrX%($+JKZS-kk@;C{qrX$3QHfhHjhnm@D6(q#u9&nxp7x?`3;Aupjg$TmOs&l z5PWSnta&fy72GQ>%3w_*ww^Jw(_caHmL4#L2@8BzaOPA;O+%06V!CD&`44&VLwV#K zt~p(rcK&f)56h5z0LqTk?PpAhH^n@&ct`o?^M>eH9NHm;3wAQQ>kqB95l56YOfnI3 z61L@dww*@Dqv?_ID{cB}hZSLdc5=IzD&Xc8;#^bZLYQi3EN99C2`9xxYu*uvYYU7V z(W0FeOo&6HUZjW@bcPW-G+HUyu zol;!`Foz~3*U*r4=OdsMnmbyoLXN(%N5g#MZ1 z$EX|cEZ{Mo?@bYVABgkS8wK}x3owjQ7l~s?m>uOXF}gc3OU&3#Lx

- setIsAllowanceModalOpened(false)} - withCloseButton={false} - padding={'23px'} - size={'400px'} - radius={'12px'} - classNames={{ body: styles.body }} - > - { - setIsAllowanceModalOpened(false) - transfer.mutate(String(amount)) - }} - onClose={() => setIsAllowanceModalOpened(false)} - allowanceProps={{ - tokenAddress: selectedLowNetwork.g7TokenAddress, - network: selectedLowNetwork, - spender: selectedLowNetwork.routerSpender - }} - /> - ) } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index a94113fa..8b3ac2a3 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -20,10 +20,10 @@ import { useUISettings } from '@/contexts/UISettingsContext' import useERC20Balance from '@/hooks/useERC20Balance' import useEthUsdRate from '@/hooks/useEthUsdRate' import useNativeBalance from '@/hooks/useNativeBalance' -import useTokenBalance from '@/hooks/useTokenBalance' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' +import useTokenBalance from '@/hooks/useTokenBalance' const BridgeView = ({ direction, @@ -57,7 +57,7 @@ const BridgeView = ({ account: connectedAccount, rpc: selectedLowNetwork.rpcs[0] }) - const { isFetching: isFetchingHighNetworkBalance } = useERC20Balance({ + const {isFetching: isFetchingHighNetworkBalance } = useERC20Balance({ tokenAddress: selectedHighNetwork.g7TokenAddress, account: connectedAccount, rpc: selectedHighNetwork.rpcs[0] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.module.css b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.module.css index d49c5be5..3f768463 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.module.css @@ -30,7 +30,7 @@ } .errorMessage { - color: var(--Error-600, #d92d20); + color: var(--Error-600, #D92D20); text-align: right; /* Text xs/Medium */ @@ -67,8 +67,7 @@ line-height: 18px; /* 150% */ } -.inputGroup, -.inputWithError { +.inputGroup, .inputWithError { display: flex; padding-left: 12px; align-items: center; @@ -102,7 +101,7 @@ } .inputWithError { - border: 1px solid var(--Error-500, #f04438); + border: 1px solid var(--Error-500, #F04438); } .maxButton { @@ -131,15 +130,14 @@ } .tokenGroup { - cursor: pointer; display: flex; - padding: var(--20px, 20px) 16px; + padding: 19px 16px; justify-content: center; align-items: center; gap: 8px; - border-radius: 0px 8px 8px 0px; - border-left: 1px solid var(--Gray-100, #F2F4F7); - background: #fff; + + border-radius: 0 8px 8px 0; + border-left: 1px solid var(--Gray-100, #f2f4f7); } .tokenSymbol { @@ -152,6 +150,7 @@ line-height: 20px; /* 142.857% */ } + @media (max-width: 1199px) { .input { font-size: 18px; diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index edf69804..7d47cece 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -49,7 +49,7 @@ const Deposit: React.FC = ({ deposit }) => { {status.data && status.data.l2Result?.complete ? (
Completed - +
) : (
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css index fcf9df23..796ec080 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css @@ -5,65 +5,63 @@ align-items: flex-start; align-self: stretch; - border-radius: 12px; - border: 1px solid var(--Gray-200, #eaecf0); - background: var(--Base-White, #fff); - box-shadow: - 0 1px 3px 0 rgba(16, 24, 40, 0.1), - 0 1px 2px 0 rgba(16, 24, 40, 0.06); + border-radius: 12px; + border: 1px solid var(--Gray-200, #EAECF0); + background: var(--Base-White, #FFF); + box-shadow: 0 1px 3px 0 rgba(16, 24, 40, 0.10), 0 1px 2px 0 rgba(16, 24, 40, 0.06); } .header { - width: 100%; + width: 100%; - display: flex; - justify-content: space-between; - border-radius: 12px 12px 0 0; + display: flex; + justify-content: space-between; + border-radius: 12px 12px 0 0; - padding: 16px 12px 12px 12px; - align-items: center; - gap: 12px; - align-self: stretch; + padding: 16px 12px 12px 12px; + align-items: center; + gap: 12px; + align-self: stretch; - background: var(--Gray-50, #f9fafb); + background: var(--Gray-50, #F9FAFB); } .title { - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 1; - - overflow: hidden; - color: var(--Gray-700, #344054); - text-overflow: ellipsis; - - /* Text md/Medium */ - font-size: 16px; - font-style: normal; - font-weight: 500; - line-height: 24px; /* 150% */ + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + + overflow: hidden; + color: var(--Gray-700, #344054); + text-overflow: ellipsis; + + /* Text md/Medium */ + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 24px; /* 150% */ } .amount { - color: var(--Gray-700, #344054); - text-align: right; - - /* Text md/Medium */ - font-size: 16px; - font-style: normal; - font-weight: 500; - line-height: 24px; /* 150% */ + color: var(--Gray-700, #344054); + text-align: right; + + /* Text md/Medium */ + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: 24px; /* 150% */ } .dataRow { - display: flex; - justify-content: space-between; - padding: 12px; - align-items: center; - gap: 12px; - align-self: stretch; - - border-top: 1px solid var(--Gray-200, #eaecf0); + display: flex; + justify-content: space-between; + padding: 12px; + align-items: center; + gap: 12px; + align-self: stretch; + + border-top: 1px solid var(--Gray-200, #EAECF0); } .dataRowCompleted { @@ -77,42 +75,41 @@ border-top: 1px solid var(--Gray-200, #eaecf0); } -.dataText, -.dataTextBold { - overflow: hidden; - color: var(--Gray-700, #344054); - text-overflow: ellipsis; - - /* Text sm/Regular */ - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 20px; /* 142.857% */ +.dataText, .dataTextBold { + overflow: hidden; + color: var(--Gray-700, #344054); + text-overflow: ellipsis; + + /* Text sm/Regular */ + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 20px; /* 142.857% */ } .dataTextBold { - font-weight: 600; + font-weight: 600; } .button { - display: flex; - padding: 12px 16px; - justify-content: center; - align-items: center; - gap: 12px; - align-self: stretch; - color: var(--Gray-700, #344054); - text-align: center; - - /* Text sm/Semibold */ - font-size: 14px; - font-style: normal; - font-weight: 600; - line-height: 20px; /* 142.857% */ - border: none; - border-top: 1px solid var(--Gray-200, #eaecf0); - background: var(--Base-White, #ffffff); - border-radius: 0 0 12px 12px; + display: flex; + padding: 12px 16px; + justify-content: center; + align-items: center; + gap: 12px; + align-self: stretch; + color: var(--Gray-700, #344054); + text-align: center; + + /* Text sm/Semibold */ + font-size: 14px; + font-style: normal; + font-weight: 600; + line-height: 20px; /* 142.857% */ + border: none; + border-top: 1px solid var(--Gray-200, #EAECF0); + background: var(--Base-White, #ffffff); + border-radius: 0 0 12px 12px; } .nodeCompleted { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index 49610303..f3fd1f47 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -295,7 +295,7 @@ } .settled { - background: var(--Success-50, #ecfdf3); + background: var(--Success-100, #ecfdf3); color: var(--Success-700, #027a48); } @@ -308,7 +308,7 @@ } .settled:hover { - background: var(--Success-100, #ecfdf3); + background: var(--Success-50, #ecfdf3); } .claimButton { @@ -371,4 +371,4 @@ .arrowUp { stroke: var(--Arrow-Up, #fff); -} \ No newline at end of file +} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index f1ce5858..0f2f18d6 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useEffect, useState } from 'react' import { useMutation, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' @@ -65,6 +65,18 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const smallView = useMediaQuery('(max-width: 1199px)') const [bridgeTransfer, setBridgeTransfer] = useState() + useEffect(() => { + if (!withdrawal) return + const _bridgeTransfer = new BridgeTransfer({ + txHash: withdrawal.highNetworkHash || '', + destinationNetworkChainId: selectedLowNetwork.chainId, + originNetworkChainId: selectedLowNetwork.chainId, + originSignerOrProviderOrRpc: selectedHighNetwork.rpcs[0], + destinationSignerOrProviderOrRpc: selectedLowNetwork.rpcs[0] + }) + setBridgeTransfer(_bridgeTransfer) + }, [withdrawal]) + // Mutate function const execute = useMutation( @@ -173,8 +185,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { className={styles.explorerLink} >
- Completed - + Settled +
@@ -194,9 +206,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => { target={'_blank'} className={styles.explorerLink} > -
- Completed - +
+ Claimable +
@@ -212,13 +224,13 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status.data?.to ?? ''}
- diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenRow/TokenRow.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenRow/TokenRow.tsx index 941252b6..0f7267c3 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenRow/TokenRow.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenRow/TokenRow.tsx @@ -1,7 +1,9 @@ import React from 'react' import styles from './TokenRow.module.css' +import { ZERO_ADDRESS } from '@/utils/web3utils' +import useNativeBalance from '@/hooks/useNativeBalance' +import useERC20Balance from '@/hooks/useERC20Balance' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import useTokenBalance from '@/hooks/useTokenBalance' interface TokenRowProps { name: string @@ -11,6 +13,25 @@ interface TokenRowProps { Icon: React.FC> } +const useTokenBalance = (address: string, rpc: string, connectedAccount: string | undefined) => { + if (address === ZERO_ADDRESS) { + const { data: balance, isFetching } = useNativeBalance({ + account: connectedAccount, + rpc, + }); + return { balance, isFetching }; + } else { + const { data: balance, isFetching } = useERC20Balance({ + tokenAddress: address, + account: connectedAccount, + rpc, + }); + const formattedBalance = balance?.formatted + return { balance: formattedBalance, isFetching }; + } +}; + + const TokenRow: React.FC = ({ name, address, symbol, rpc, Icon }) => { const { connectedAccount } = useBlockchainContext() const { balance } = useTokenBalance(address, rpc, connectedAccount); diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.module.css deleted file mode 100644 index 6c78f70c..00000000 --- a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.module.css +++ /dev/null @@ -1,129 +0,0 @@ -.walletButtonContainer { - display: flex; - padding: 8px; - justify-content: space-between; - align-items: center; - align-self: stretch; - border-radius: 8px; - border: 1px solid var(--Gray-200, #eaecf0); - cursor: pointer; -} - -.iconWalletBalance { - display: flex; - width: 172px; - align-items: center; - gap: 12px; -} - -.balance { - display: flex; - align-items: center; - gap: 12px; - flex: 1 0 0; - color: var(--Gray-600, #475467); - font-family: Inter; - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 20px; /* 142.857% */ -} - -.iconContainer { - display: flex; - padding: 8px; - justify-content: center; - align-items: center; - gap: 8px; -} - -.iconButton { - stroke: #667085; -} - -.modalTitle { - color: var(--Gray-900, #101828); - font-family: Inter; - font-size: 18px !important; - font-style: normal !important; - font-weight: 600 !important; - line-height: 28px !important; -} - -.modalHeader { - align-items: flex-start; - align-self: stretch; - padding-right: 24px !important; - padding-bottom: 19px !important; -} - -.modalClose { - color: var(--Gray-500, #667085) !important; -} -.modalClose:focus-visible { - outline: none !important; -} -.modalClose:hover { - background-color: transparent !important; - color: var(--Gray-600, #475467) !important; -} - -.modalContent { - display: flex; - padding-bottom: 16px; - flex-direction: column; - align-items: center; - gap: 16px; - align-self: stretch; -} - -.tokensContainer { - display: flex; - flex-direction: column; - gap: 16px; - align-self: stretch; -} - -.footerContainer { - display: flex; - padding: 12px 0px 0px 0px; - justify-content: space-between; - align-items: flex-start; - align-self: stretch; -} - -.gap { - height: 1px; - align-self: stretch; - background: var(--Gray-200, #eaecf0); -} - -.border { - border: 1px solid var(--Gray-100, #f2f4f7); - width: calc(100% + 48px); - margin-left: -24px; -} - -.closeButton { - cursor: pointer; - display: flex; - width: 100px; - padding: 10px 16px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - border: 1px solid var(--Gray-300, #d0d5dd); - background: var(--Base-White, #fff); - - /* Shadow/xs */ - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - color: var(--Gray-700, #344054); - - /* Text sm/Semibold */ - font-family: Inter; - font-size: 14px; - font-style: normal; - font-weight: 600; - line-height: 20px; /* 142.857% */ -} diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx deleted file mode 100644 index 8d292151..00000000 --- a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx +++ /dev/null @@ -1,95 +0,0 @@ -import React, { useEffect, useState } from 'react' -import { ALL_NETWORKS, L3_NETWORK } from '../../../../constants' -import TokenRow from '../tokenRow/TokenRow' -import styles from './WalletButton.module.css' -import { Modal } from 'summon-ui/mantine' -import IconFullScreen from '@/assets/IconFullScreen' -import IconWallet04 from '@/assets/IconWallet04' -import { useBlockchainContext } from '@/contexts/BlockchainContext' -import useNativeBalance from '@/hooks/useNativeBalance' -import { getTokensForNetwork, Token } from '@/utils/tokens' - -interface WalletButtonProps { } - -const WalletButton: React.FC = () => { - const [isModalOpen, setIsModalOpen] = useState(false) - const [tokens, setTokens] = useState([]) - const { connectedAccount, chainId } = useBlockchainContext() - const handleModalClose = () => { - setIsModalOpen(false) - } - - const { data: nativeBalance } = useNativeBalance({ - account: connectedAccount, - rpc: ALL_NETWORKS.find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] - }) - - const getTokens = async () => { - const _tokens = getTokensForNetwork(chainId, connectedAccount) - setTokens(_tokens) - } - - useEffect(() => { - getTokens() - }, [chainId]) - - return ( - <> -
{ - setIsModalOpen(true) - }} - > -
- -
- {nativeBalance - ? `${Number(nativeBalance).toFixed(4)} ${ALL_NETWORKS.find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` - : 'Fetching...'} -
-
-
- -
-
- -
-
- {tokens.map((token, index) => { - return ( - - - {index !== tokens.length - 1 &&
} - - ) - })} -
-
-
-
-
- Close -
-
- - - ) -} - -export default WalletButton diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.module.css b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.module.css index 701ca32c..40a9177f 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.module.css +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.module.css @@ -198,8 +198,8 @@ align-items: center; gap: 8px; border-radius: 8px; - border: 1px solid var(--Primary-600, #ef233b); - background: var(--Primary-600, #ef233b); + border: 1px solid var(--Primary-600, #F04438); + background: var(--Primary-600, #F04438); box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); } @@ -462,7 +462,7 @@ } .bar { - width: 137px; + width: 100%; height: 1px; background: #d0d5dd; } diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index e3e8153c..fa118eb2 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -1,25 +1,20 @@ import React, { useEffect, useState } from 'react' import { useMutation, useQuery, useQueryClient } from 'react-query' -import { - ALL_NETWORKS, - FAUCET_CHAIN, - L3_NATIVE_TOKEN_SYMBOL, - L3_NETWORK -} from '../../../constants' +import { ALL_NETWORKS, FAUCET_CHAIN, L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../constants' +import { AccountType } from '../commonComponents/accountSelector/AccountSelector' +import AccountSelector from '../commonComponents/accountSelector/AccountSelector' import styles from './FaucetView.module.css' +import { ethers } from 'ethers' +import { useMediaQuery } from 'summon-ui/mantine' import { NetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' import { useUISettings } from '@/contexts/UISettingsContext' import { useFaucetAPI } from '@/hooks/useFaucetAPI' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { timeDifferenceInHoursAndMinutes, timeDifferenceInHoursMinutesAndSeconds } from '@/utils/timeFormat' -import { AccountType } from '../commonComponents/accountSelector/AccountSelector' -import { useMediaQuery } from 'summon-ui/mantine' -import { ethers } from 'ethers' -import AccountSelector from '../commonComponents/accountSelector/AccountSelector' -interface FaucetViewProps { } -const FaucetView: React.FC = ({ }) => { +interface FaucetViewProps {} +const FaucetView: React.FC = ({}) => { const [address, setAddress] = useState('') const [isValidAddress, setIsValidAddress] = useState(false) const [selectedNetwork, setSelectedNetwork] = useState(L3_NETWORK) @@ -29,15 +24,12 @@ const FaucetView: React.FC = ({ }) => { const [nextClaimTimestamp, setNextClaimTimestamp] = useState(0) const [networkError, setNetworkError] = useState('') const [selectedAccountType, setSelectedAccountType] = useState('Connected Account') - + const [requestDisabled, setRequestDisabled] = useState(true) const { faucetTargetChainId } = useUISettings() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') - const values: AccountType[] = [ - `External Address`, - `Connected Account`, - ] + const values: AccountType[] = [`External Address`, `Connected Account`] useEffect(() => { const targetNetwork = ALL_NETWORKS.find((n) => n.chainId === faucetTargetChainId) @@ -46,14 +38,14 @@ const FaucetView: React.FC = ({ }) => { } if (connectedAccount) { - if (selectedAccountType === "External Address") { + if (selectedAccountType === 'External Address') { setSelectedAccountType('Connected Account') } if (address !== connectedAccount) { setAddress(connectedAccount) } - } else if (selectedAccountType === "External Address" || !connectedAccount) { + } else if (selectedAccountType === 'External Address' || !connectedAccount) { if (address !== '') { setAddress('') } @@ -62,6 +54,7 @@ const FaucetView: React.FC = ({ }) => { useEffect(() => { setNetworkError('') + if (!connectedAccount) setSelectedAccountType('External Address') }, [connectedAccount]) const handleConnect = async () => { @@ -69,7 +62,7 @@ const FaucetView: React.FC = ({ }) => { } const handleSelectAccountType = (selectedAccountType: AccountType) => { - if (selectedAccountType === "External Address") setAddress('') + if (selectedAccountType === 'External Address') setAddress('') else setAddress(connectedAccount) setSelectedAccountType(selectedAccountType) setNetworkError('') @@ -81,8 +74,8 @@ const FaucetView: React.FC = ({ }) => { const res = await fetch(`https://api.game7.build/faucet/request/${address}`, { method: 'POST', headers: { - 'Content-Type': 'application/json', - }, + 'Content-Type': 'application/json' + } }) if (!res.ok) { throw new Error(`Error: ${res.statusText}`) @@ -125,13 +118,14 @@ const FaucetView: React.FC = ({ }) => { const updatedL3 = { interval: intervalL3, nextClaimTimestamp: nextClaimL3Timestamp, - isAvailable: isAvailableL3, + isAvailable: isAvailableL3 } + queryClient.setQueryData(['nextFaucetClaimTimestamp', address], (oldData: any) => { if (oldData) { return { ...oldData, - L3: updatedL3, // Update the L3 data + L3: updatedL3 // Update the L3 data } } return { faucetTimeInterval: faucetInterval, L3: updatedL3 } @@ -147,8 +141,8 @@ const FaucetView: React.FC = ({ }) => { onError: (error) => { setNetworkError('Something went wrong') console.log(error) - console.error("Error requesting tokens:", error) - }, + console.error('Error requesting tokens:', error) + } } ) @@ -165,21 +159,49 @@ const FaucetView: React.FC = ({ }) => { const nextClaimAvailable = useQuery( ['nextFaucetClaimTimestamp', address], async () => { - const lastClaimedL3Timestamp = Number(lastClaimedTimestampQuery.data) + const lastClaimedL3Timestamp = lastClaimedTimestampQuery.data ? Number(lastClaimedTimestampQuery.data) : 0 const faucetTimeInterval = Number(faucetIntervalQuery.data) const nextClaimL3Timestamp = lastClaimedL3Timestamp + faucetTimeInterval const intervalL3 = timeDifferenceInHoursAndMinutes(Date.now() / 1000, nextClaimL3Timestamp) - const isAvailableL3 = compareTimestampWithCurrentMoment(nextClaimL3Timestamp) + const isAvailableL3 = lastClaimedL3Timestamp === 0 || compareTimestampWithCurrentMoment(nextClaimL3Timestamp) const L3 = { interval: intervalL3, nextClaimTimestamp: nextClaimL3Timestamp, isAvailable: isAvailableL3 } return { faucetTimeInterval, L3 } }, { - enabled: !!address && - !!lastClaimedTimestampQuery.data && - !!faucetIntervalQuery.data + enabled: !!address && !!faucetIntervalQuery.data && !!lastClaimedTimestampQuery.data } ) + useEffect(() => { + let isButtonDisabled = true + + const isNewAccount = nextClaimAvailable.status === 'idle' && lastClaimedTimestampQuery.data === 0 + + if (isNewAccount) { + isButtonDisabled = false + } else { + if (!nextClaimAvailable.data) { + isButtonDisabled = true + } else { + isButtonDisabled = + (selectedNetwork.chainId === L3_NETWORK.chainId && + nextClaimAvailable.data && + !nextClaimAvailable.data.L3.isAvailable) || + ((!isValidAddress || address === '') && selectedAccountType === 'External Address') || + claim.isLoading + } + } + setRequestDisabled(isButtonDisabled) + }, [ + selectedNetwork.chainId, + nextClaimAvailable.data, + nextClaimAvailable.status, + isValidAddress, + address, + selectedAccountType, + claim.isLoading, + lastClaimedTimestampQuery.status + ]) useEffect(() => { if (!nextClaimAvailable.data) return @@ -207,9 +229,10 @@ const FaucetView: React.FC = ({ }) => { return (
-
Testnet Faucet
+
G7 Sepolia Faucet
- Request and get 1 {L3_NATIVE_TOKEN_SYMBOL} testnet token to your connected wallet or an external address on G7 network. + Request and get 1 {L3_NATIVE_TOKEN_SYMBOL} token to your connected wallet or an external + address on G7 Sepolia.
@@ -220,7 +243,7 @@ const FaucetView: React.FC = ({ }) => { placeholder='Wallet address' className={styles.address} value={address} - disabled={!!connectedAccount && selectedAccountType === "Connected Account"} + disabled={!!connectedAccount && selectedAccountType === 'Connected Account'} onChange={(e) => { setAddress(e.target.value) if (ethers.utils.isAddress(e.target.value)) setIsValidAddress(true) @@ -237,18 +260,27 @@ const FaucetView: React.FC = ({ }) => { Or
- ) : 'Or'} + ) : ( + 'Or' + )}
-
{ handleConnect() }}> -
- Connect Wallet -
+
{ + handleConnect() + }} + > +
Connect Wallet
) : (
Account
- selectedAccountType === value)!} onChange={handleSelectAccountType} /> + selectedAccountType === value)!} + onChange={handleSelectAccountType} + />
)}
@@ -265,23 +297,13 @@ const FaucetView: React.FC = ({ }) => {
)}
diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css index ea4aed79..bf19dabe 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css @@ -1,237 +1,249 @@ .container { - display: flex; - width: 268px; - flex-direction: column; - align-items: flex-start; + display: flex; + width: 268px; + flex-direction: column; + align-items: flex-start; - border-radius: 8px; - /*border: 1px solid var(--Gray-300, #D0D5DD);*/ - background: var(--Base-White, #FFF); + border-radius: 8px; + /*border: 1px solid var(--Gray-300, #D0D5DD);*/ + background: var(--Base-White, #fff); - /* Shadow/xs */ - /*box-shadow: 0 1px 2px 0 rgba(16, 24, 40, 0.05);*/ + /* Shadow/xs */ + /*box-shadow: 0 1px 2px 0 rgba(16, 24, 40, 0.05);*/ } -.item, .itemWithoutBorder { - display: flex; - padding: 16px; - flex-direction: column; - align-items: start; - gap: 8px; - align-self: stretch; - width: 300px; - margin-left: -16px; +.item, +.itemWithoutBorder { + display: flex; + padding: 16px; + flex-direction: column; + align-items: start; + gap: 8px; + align-self: stretch; + width: 300px; + margin-left: -16px; - border-bottom: 1px solid var(--Gray-200, #EAECF0); + border-bottom: 1px solid var(--Gray-200, #eaecf0); } .itemWithoutBorder { - border: none; + border: none; } - .itemHeader { - display: flex; - justify-content: space-between; - align-items: center; - align-self: stretch; - text-transform: capitalize; + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; + text-transform: capitalize; } .itemHeaderLeft { - display: flex; - align-items: center; - gap: 8px; + display: flex; + align-items: center; + gap: 8px; } .itemHeaderTitle { - color: var(--Gray-700, #344054); + color: var(--Gray-700, #344054); - /* Text md/Semibold */ - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; /* 150% */ + /* Text md/Semibold */ + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; /* 150% */ } -.badgeCompleted, .badgeClaimable, .badgePending, .badgeFailed { - display: flex; - padding: 2px 8px; - align-items: center; +.badgeCompleted, +.badgeClaimable, +.badgePending, +.badgeFailed { + display: flex; + padding: 2px 8px; + align-items: center; - border-radius: 16px; - mix-blend-mode: var(--mix-blend, multiply); - text-align: center; + border-radius: 16px; + mix-blend-mode: var(--mix-blend, multiply); + text-align: center; - /* Text xs/Medium */ - font-size: 12px; - font-style: normal; - font-weight: 500; - line-height: 18px; /* 150% */ - text-transform: capitalize; - gap: 4px; + /* Text xs/Medium */ + font-size: 12px; + font-style: normal; + font-weight: 500; + line-height: 18px; /* 150% */ + text-transform: capitalize; + gap: 4px; } -.badgeClaimable, .toastClaimable { - color: var(--Warning-700, #B54708); - background: var(--Warning-50, #FFFAEB); +.badgeClaimable, +.toastClaimable { + color: var(--Warning-700, #b54708); + background: var(--Warning-50, #fffaeb); } -.badgeClaimable:hover, .toastClaimable:hover { - background: var(--Warning-100, #FEF0C7); +.badgeClaimable:hover, +.toastClaimable:hover { + background: var(--Warning-100, #fef0c7); } .iconCloseClaimable { - color: var(--Warning-700, #B54708); + color: var(--Warning-700, #b54708); } .iconCloseClaimable:hover { - color: var(--Warning-800, #B54708); + color: var(--Warning-800, #b54708); } -.badgeCompleted, .toastCompleted { - color: var(--Success-700, #027a48); - background: var(--Success-50, #ecfdf3); +.badgeCompleted, +.toastCompleted { + color: var(--Success-700, #027a48); + background: var(--Success-50, #ecfdf3); } -.badgeCompleted:hover, .toastCompleted:hover { - background: var(--Success-100, #D1FADF); +.badgeCompleted:hover, +.toastCompleted:hover { + background: var(--Success-100, #d1fadf); } .iconCloseCompleted { - stroke: var(--Success-700, #027a48); + stroke: var(--Success-700, #027a48); } .iconCloseCompleted:hover { - stroke: var(--Success-800, #027a48); + stroke: var(--Success-800, #027a48); } .badgePending { - color: var(--Blue-700, #175cd3); - background: var(--Blue-50, #eff8ff); + color: var(--Blue-700, #175cd3); + background: var(--Blue-50, #eff8ff); } .badgePending:hover { - background: var(--Blue-100, #d1e9ff); + background: var(--Blue-100, #d1e9ff); } .iconClosePending { - stroke: var(--Blue-700, #175cd3); + stroke: var(--Blue-700, #175cd3); } .iconClosePending:hover { - stroke: var(--Blue-800, #175cd3); + stroke: var(--Blue-800, #175cd3); } -.badgeError, .toastError { - color: var(--Error-700, #FEF3F2); - background: var(--Error-50, #B42318); +.badgeError, +.toastError { + color: var(--Error-700, #fef3f2); + background: var(--Error-50, #b42318); } -.badgeError:hover, .toastError:hover { - background: var(--Error-100, #FEE4E2); +.badgeError:hover, +.toastError:hover { + background: var(--Error-100, #fee4e2); } .iconCloseError { - stroke: var(--Error-700, #FEF3F2); + stroke: var(--Error-700, #fef3f2); } .iconCloseError { - stroke: var(--Error-800, #FEF3F2); + stroke: var(--Error-800, #fef3f2); } .headerTime { - color: var(--Gray-500, #667085); + color: var(--Gray-500, #667085); - /* Text sm/Regular */ - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 20px; /* 142.857% */ - text-transform: none; + /* Text sm/Regular */ + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 20px; /* 142.857% */ + text-transform: none; } .content { - color: var(--Gray-600, #475467); + padding: 10px 0px; + color: var(--Gray-600, #475467); - /* Text sm/Regular */ - font-size: 14px; - font-style: normal; - font-weight: 400; - line-height: 20px; /* 142.857% */ + /* Text sm/Regular */ + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 20px; /* 142.857% */ } .button { - display: flex; - padding: 8px; - justify-content: center; - align-items: center; - gap: 10px; - align-self: stretch; - background: var(--Base-White, #ffffff); - cursor: pointer; - border: none; - width: calc(100% + 16px + 16px - 2px); - height: calc(100% + 30px); - margin-left: -16px; - margin-bottom: -12px; - border-radius: 0 0 8px 8px; - color: var(--Gray-700, #344054); - - /* Text md/Regular */ - font-size: 16px; - font-style: normal; - font-weight: 400; - line-height: 24px; /* 150% */ + display: flex; + padding: 8px; + justify-content: center; + align-items: center; + gap: 10px; + align-self: stretch; + background: var(--Base-White, #ffffff); + cursor: pointer; + border: none; + width: calc(100% + 16px + 16px - 2px); + height: calc(100% + 30px); + margin-left: -16px; + margin-bottom: -12px; + border-radius: 0 0 8px 8px; + color: var(--Gray-700, #344054); + + /* Text md/Regular */ + font-size: 16px; + font-style: normal; + font-weight: 400; + line-height: 24px; /* 150% */ } .button:hover { - background: var(--Gray-25, #FCFCFD); -} - -.toastCompleted, .toastMultiple, .toastClaimable, .toastError { - display: flex; - width: 100%; - padding: 8px 12px; - align-items: center; - justify-content: space-between; - gap: 8px; - position: absolute; - z-index: 3; - left: 0; - /*bottom: 10vh;*/ - border-radius: 8px; - transform: translateY(calc(100vh - 32px - 32px - 40.8px)); - cursor: pointer; - font-weight: 600; + background: var(--Gray-25, #fcfcfd); +} + +.toastCompleted, +.toastMultiple, +.toastClaimable, +.toastError { + display: flex; + width: 100%; + padding: 8px 12px; + align-items: center; + justify-content: space-between; + gap: 8px; + position: absolute; + z-index: 3; + left: 0; + /*bottom: 10vh;*/ + border-radius: 8px; + transform: translateY(calc(100vh - 32px - 32px - 40.8px)); + cursor: pointer; } .toastClaimable { - border: 1px solid var(--Warning-200, #FEDF89); + border: 1px solid var(--Warning-200, #fedf89); } .toastError { - border: 1px solid var(--Error-200, #FECDCA); + border: 1px solid var(--Error-200, #fecdca); } .toastCompleted { - border: 1px solid var(--Success-200, #A6F4C5); + border: 1px solid var(--Success-200, #a6f4c5); } .toastMultiple { - border: 1px solid var(--Purple-200, #D9D6FE); - background: var(--Purple-50, #F4F3FF); - color: var(--Purple-700, #5925DC); + border: 1px solid var(--Purple-200, #d9d6fe); + background: var(--Purple-50, #f4f3ff); + color: var(--Purple-700, #5925dc); } .toastMultiple:hover { - background: var(--Purple-100, #EBE9FE); + background: var(--Purple-100, #ebe9fe); } .closeIconMultiple { - stroke: var(--Purple-700, #5925DC); + stroke: var(--Purple-700, #5925dc); } .closeIconMultiple:hover { - stroke: var(--Purple-800, #5925DC); + stroke: var(--Purple-800, #5925dc); } @media (max-width: 1199px) { - - .toastCompleted, .toastMultiple, .toastClaimable, .toastError { - position: fixed; - width: calc(100% - 16px); - left: 8px; - transform: translateY(calc(100vh - 64px - 48px - 41px - 20px)); - } + .toastCompleted, + .toastMultiple, + .toastClaimable, + .toastError { + position: fixed; + width: calc(100% - 16px); + left: 8px; + transform: translateY(calc(100vh - 64px - 48px - 41px - 20px)); + } } - - diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index ade11e36..a3662427 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -63,14 +63,26 @@ const NotificationsDropModal: React.FC = ({ notific return (
- {!notifications || (notifications.length === 0 &&
No notifications yet
)} + {!notifications || (notifications.length === 0 && +
+ No notifications yet +
)} {notifications && notifications.slice(0, 3).map((n, idx) => (
{n.type.toLowerCase()}
-
{n.status.toLowerCase()}
+ {getTransactionUrl(n) ? ( + +
+ {n.status.toLowerCase()} + +
+
+ ) : ( +
{n.status.toLowerCase()}
+ )}
{timeAgo(n.timestamp, true)}
@@ -212,7 +224,7 @@ export const NotificationsModal: React.FC = ({ noti
{n.status.toLowerCase()} - +
) : ( diff --git a/webapps/world-builder-dashboard/src/hooks/useERC20Balance.ts b/webapps/world-builder-dashboard/src/hooks/useERC20Balance.ts index 5dbfdb51..195c36fd 100644 --- a/webapps/world-builder-dashboard/src/hooks/useERC20Balance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useERC20Balance.ts @@ -31,31 +31,6 @@ const useERC20Balance = ({ tokenAddress, account, rpc }: UseERC20BalanceProps) = ) } -interface UseERC20SymbolProps { - tokenAddress: string - rpc: string | undefined -} - -export const useERC20Symbol = ({ tokenAddress, rpc }: UseERC20SymbolProps) => { - return useQuery( - ['ERC20Symbol', tokenAddress, rpc], - async () => { - if (!tokenAddress || !rpc) { - return { symbol: '' } - } - const provider = new ethers.providers.JsonRpcProvider(rpc) - const ERC20Contract = new ethers.Contract(tokenAddress, ERC20_ABI, provider) - - const symbol = await ERC20Contract.symbol() - return { - symbol: symbol - } - }, - { enabled: !!tokenAddress } - ) -} - - interface UseERC20AllowanceProps { tokenAddress: string owner: string | undefined diff --git a/webapps/world-builder-dashboard/src/hooks/useFaucetAPI.ts b/webapps/world-builder-dashboard/src/hooks/useFaucetAPI.ts index fed68c63..e958a782 100644 --- a/webapps/world-builder-dashboard/src/hooks/useFaucetAPI.ts +++ b/webapps/world-builder-dashboard/src/hooks/useFaucetAPI.ts @@ -4,6 +4,7 @@ import { ethers } from 'ethers'; const BASE_URL = 'https://api.game7.build' export const useFaucetAPI = () => { + const useFaucetTimestamp = (address: string | undefined) => { const isValidAddress = ethers.utils.isAddress(address ?? ""); return useQuery( @@ -13,17 +14,18 @@ export const useFaucetAPI = () => { method: 'GET', }); if (!res.ok) { - throw new Error(`Error: ${res.statusText}`) + throw new Error(`Error: ${res.statusText}`); } - const data = await res.json() - return data.result + const data = await res.json(); + return data.result; }, { enabled: !!address && isValidAddress, retry: false, } - ) - } + ); + }; + const useFaucetInterval = () => { return useQuery( @@ -33,16 +35,16 @@ export const useFaucetAPI = () => { method: 'GET', }); if (!res.ok) { - throw new Error(`Error: ${res.statusText}`) + throw new Error(`Error: ${res.statusText}`); } - const data = await res.json() - return data.result + const data = await res.json(); + return data.result; }, { - retry: false + retry: false, } - ) - } + ); + }; const useFaucetCountdown = (address: string) => { return useQuery( @@ -52,21 +54,21 @@ export const useFaucetAPI = () => { method: 'GET', }); if (!res.ok) { - throw new Error(`Error: ${res.statusText}`) + throw new Error(`Error: ${res.statusText}`); } - const data = await res.json() - return data.result + const data = await res.json(); + return data.result; }, { enabled: !!address, - retry: false + retry: false, } - ) - } + ); + }; return { useFaucetTimestamp, useFaucetInterval, - useFaucetCountdown + useFaucetCountdown, } } diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index 5b38dda1..f845424c 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -47,15 +47,6 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => {
- {/* May uncomment later. */} - {/*
-
- Dark -
-
- Light -
-
*/} {connectedAccount ? (
diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/Game7Logo.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/Game7Logo.tsx index 68f9946f..253b9c3f 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/Game7Logo.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/Game7Logo.tsx @@ -1,12 +1,14 @@ import React from 'react' +import { useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' import IconGame7 from '@/assets/IconGame7' import IconGame7Logo from '@/assets/IconGame7Logo' interface LogoProps {} const Game7Logo: React.FC = ({}) => { + const navigate = useNavigate() return ( -
+
navigate('/')}>
diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css index b04d277a..481b9f1d 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css @@ -30,6 +30,7 @@ } .logoContainer { + cursor: pointer; display: flex; padding: 0 20px 0 24px; align-items: center; @@ -42,6 +43,13 @@ gap: 12px; } +.navBeginning { + display: flex; + align-items: center; + gap: 12px; + flex: 1 0 0; +} + .navigation { display: flex; padding: 0 16px; @@ -52,24 +60,16 @@ background: var(--Base-White, #fff); } -.navBeginning { - display: flex; - align-items: center; - gap: 12px; - flex: 1 0 0; -} - .navButton, .selectedNavButton { display: flex; padding: 8px 12px; align-items: center; - gap: 8px; + gap: 12px; align-self: stretch; border-radius: 6px; - background: var(--Gray-60, #f9fafb); - color: var(--Gray-900, #101828); + color: #9c9c9c; /* Text md/Semibold */ font-size: 16px; @@ -80,6 +80,11 @@ text-transform: capitalize; } +.selectedNavButton { + background: #393939; + color: var(--Gray-900, #101828); +} + .navButton { background: var(--Base-White, #fff); cursor: pointer; @@ -118,7 +123,7 @@ .iconButton { cursor: pointer; - stroke: #fff; + stroke: var(--Gray-600, #475467); margin-right: 8px; } @@ -146,8 +151,8 @@ gap: 8px; flex: 1 0 0; border-radius: 8px; - border: 1px solid var(--Primary-600, #ef233b); - background: var(--Primary-600, #ef233b); + border: 1px solid var(--Primary-600, #F04438); + background: var(--Primary-600, #F04438); /* Shadow/xs */ box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index 02e8da32..58b165db 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -1,14 +1,12 @@ // React and related libraries import React from 'react' -import { Outlet } from 'react-router-dom' - +import { Outlet, useLocation } from 'react-router-dom' // Styles import styles from './MainLayout.module.css' import IconDocumentation from '@/assets/IconDocumentation' import IconDroplets02 from '@/assets/IconDroplets02' import IconExplorer from '@/assets/IconExplorer' import IconWallet04 from '@/assets/IconWallet04' - // Local components and assets import DesktopSidebar from '@/layouts/MainLayout/DesktopSidebar' import MobileSidebar from '@/layouts/MainLayout/MobileSidebar' @@ -16,14 +14,32 @@ import { useMediaQuery } from '@mantine/hooks' interface MainLayoutProps {} -const NAVIGATION_ITEMS = [ - { name: 'bridge', navigateTo: '/bridge', icon: }, - { name: 'faucet', navigateTo: '/faucet', icon: }, - { name: 'explorer', navigateTo: 'https://testnet.game7.io/', icon: }, - { name: 'documentation', navigateTo: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/', icon: }, -] - const MainLayout: React.FC = ({}) => { + const location = useLocation() + + const NAVIGATION_ITEMS = [ + { + name: 'faucet', + navigateTo: '/faucet', + icon: + }, + { + name: 'bridge', + navigateTo: '/bridge', + icon: + }, + { + name: 'explorer', + navigateTo: 'https://testnet.game7.io/', + icon: + }, + { + name: 'documentation', + navigateTo: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/', + icon: + } + ] + const smallView = useMediaQuery('(max-width: 1199px)') return (
diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index 98c4f09f..0f77d3fa 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -3,10 +3,10 @@ import { useLocation, useNavigate } from 'react-router-dom' import parentStyles from './MainLayout.module.css' import styles from './MobileSidebar.module.css' import IconLogoutLarge from '@/assets/IconLogoutLarge' -import IconMenu02 from '@/assets/IconMenu02' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' import IconExternalLink from '@/assets/IconExternalLink' +import IconHamburgerLanding from '@/assets/IconHamburgerLanding' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -22,7 +22,7 @@ const MobileSidebar: React.FC = ({ navigationItems }) => {
- setIsExpanded(!isExpanded)} /> + setIsExpanded(!isExpanded)} />
{isExpanded && ( diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.module.css b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.module.css index 582e4d3b..cd9f4ae1 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.module.css +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.module.css @@ -107,6 +107,7 @@ } .top { padding: 0 16px 16px 16px; + } .viewContainer { padding: 0 16px; diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css new file mode 100644 index 00000000..e47aa6a7 --- /dev/null +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -0,0 +1,850 @@ +html, +body { + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.layout { + display: flex; + width: 100vw; + height: 100svh; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + background: #171717; + cursor: url('../../assets/cursor.svg'), auto; + overflow: hidden; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.layout.darkened { + background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent dark overlay */ + pointer-events: none; /* Prevent interactions with the background */ +} + +.navbarContainer { + display: flex; + max-width: 1920px; + padding: 4px 0px; + flex-direction: column; + align-items: center; + align-self: stretch; +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; +} + +.navbarItemsContainer { + display: flex; + align-items: center; + gap: 12px; +} + +.navbarItems { + display: flex; + align-items: center; + gap: 4px; +} + +.navbarItem { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + border-radius: 6px; + color: #d5d5d5; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.navbarItemHome { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + border-radius: 6px; + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; /* 150% */ +} + +.navbarCTA { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 16px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #f04438; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 600; + line-height: 20px; +} + +.logoWrapper { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + align-items: center; + gap: 12px; +} + +.themeSwitchButton { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + width: 40px; + height: 40px; + padding: 8px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid var(--Gray-300, #d0d5dd); +} + +.mainLayout { + position: relative; + display: flex; + padding: 40px; + flex-direction: column; + justify-content: start; + align-items: center; + gap: 200px; + flex: 1 0 0; + align-self: stretch; + border-radius: 12px; + border: 1px solid #727272; + background: url('../../assets/G7LandingPageBGDark.jpg') lightgray 50% / cover no-repeat; + overflow-y: scroll; + padding: 40px; + scrollbar-width: none; + -ms-overflow-style: none; + transition: justify-content 0.3s ease; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.mainLayoutStart { + justify-content: start; +} + +.titleContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; +} + +.titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 120px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -4px; + text-transform: uppercase; +} + +.subtitleText { + color: #b9b9b9; + text-align: center; + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; + align-self: stretch; +} + +.ctaContainer { + display: flex; + justify-content: center; + align-items: flex-start; + gap: 16px; +} + +.learnMoreCTA { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #393939; + background: rgba(11, 11, 11, 0.7); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #b9b9b9; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.learnMoreCTA:hover { + display: inline-flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #0b0b0b; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + background: linear-gradient(173deg, #f04438 -3.52%, #fff 129.23%); + background-clip: text; +} + +.startBuildingCTA { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #f04438; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.startBuildingCTA:hover { + display: inline-flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + background: linear-gradient(147deg, #f04438 11.16%, #fff 142.48%); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.scrollbarContainer { + display: flex; + height: calc(100% - 16px); + /* max-width: 940px; */ + padding: 8px 6px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 16px; + border-radius: 100px; + background: #171717; + position: absolute; + right: 6px; +} + +.scrollBar { + height: 100px; + width: 6px; + background-color: #393939; + border-radius: 100px; + position: relative; + overflow: hidden; + flex: 1 0 0; +} + +.scrollBarFill { + width: 100%; /* Full width */ + height: 0%; /* Start at 0% height */ + background-color: #f04438; + border-radius: 100px; + transition: height 0.25s ease-in-out; + flex: 1 0 0; +} + +.scrollBarsContainer { + display: flex; + flex-direction: column; + gap: 10px; +} + +.pill { + display: flex; + height: 28px; + padding: var(--4px, 4px) var(--8px, 8px); + justify-content: center; + align-items: center; + gap: var(--4px, 4px); + border-radius: 16px; + border: 1px solid #b9b9b9; + background: rgba(23, 23, 23, 0.8); + color: #b9b9b9; + text-align: center; + + /* Body 2/Medium */ + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 20px; /* 142.857% */ +} + +.contentContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + align-self: stretch; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.sectionTitle { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 48px; + font-style: normal; + font-weight: 700; + line-height: 60px; /* 125% */ + letter-spacing: -0.96px; +} + +.cards { + display: flex; + justify-content: center; + align-items: flex-start; + align-content: flex-start; + gap: 24px; + flex-wrap: wrap; +} + +.card { + display: flex; + width: 100%; + max-width: 400px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + border-radius: 24px; + border: 1px solid #727272; + background: #171717; + height: 100%; + max-height: 426px; + flex: 1 0 0; +} + +.cardTitle { + color: #f9fafb; + + /* Display xs Medium */ + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; /* 133.333% */ +} + +.cardImage { + height: 178px; + align-self: stretch; + border-radius: 12px; + border: 1px solid #393939; +} + +.cardImageGamers { + background: url('../../assets/G7ReachGamersDark.jpg') lightgray 50% / cover no-repeat; +} + +.cardImageLightningQuick { + background: url('../../assets/G7LightningQuickDark.jpg') lightgray 50% / cover no-repeat; +} + +.cardImageSpecialEcon { + background: url('../../assets/G7SpecialEconZoneDark.jpg') lightgray 50% / cover no-repeat; +} + +.cardDescription { + display: flex; + padding: 24px; + flex-direction: column; + align-items: center; + gap: var(--20px, 20px); + align-self: stretch; + color: #b9b9b9; + text-align: center; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: 28px; /* 155.556% */ + border-radius: 12px; + border: 1px solid #727272; + flex-grow: 1; + justify-content: center; +} + +.sponsorCards { + display: flex; + justify-content: center; + align-items: center; + align-content: center; + gap: 24px; + flex-wrap: wrap; +} + +.sponsorCard { + display: flex; + height: 120px; + width: 220px; + padding: 31.231px 37.218px 31.257px 37.75px; + justify-content: center; + align-items: center; + border-radius: 12px; + border: 1px solid #727272; + background: #171717; + backdrop-filter: blur(0.6990200281143188px); +} + +.sponsorCardImage { + display: flex; + padding: 8.627px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 4.313px; +} + +.summonLogoContainer { + display: flex; + height: 28px; + padding: 0px 5.637px 0px 0.734px; + align-items: flex-start; + gap: 14.826px; + flex-shrink: 0; +} + +.networkEssentialCards { + display: flex; + align-items: flex-start; + gap: 24px; + align-self: stretch; + justify-content: center; + scrollbar-width: none; + flex-wrap: wrap; +} + +.networkEssentialCards::-webkit-scrollbar { + display: none; +} + +.networkEssentialCard { + display: flex; + width: 100%; + max-width: 340px; + height: 422px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + border-radius: 24px; + background: #0b0b0b; + border: 1px solid #727272; +} + +.networkEssentialCard:hover { + cursor: url('../../assets/hand.svg'), pointer; + border: 1px solid #f04438; +} + +.networkEssentialCardImage { + width: 292px; + height: 178px; + cursor: url('../../assets/hand.svg'), pointer; + border-radius: 12px; + border: 1px solid #393939; + height: 178px; + align-self: stretch; + width: 100%; +} + +.networkEssentialFaucet { + background: url('../../assets/G7FaucetCardDark.jpg') 50% / cover no-repeat; + background-size: contain; +} + +.networkEssentialBridge { + background: url('../../assets/G7BridgeCardDark.jpg') 50% / cover no-repeat;; + background-size: contain; +} + +.networkEssentialExplorer { + background: url('../../assets/G7ExplorerCardDark.jpg') 50% / cover no-repeat;; + background-size: contain; +} + +.networkEssentialDocs { + background: url('../../assets/G7DocsCardDark.jpg') 50% / cover no-repeat;; + background-size: contain; +} + +.networkEssentialDiscord { + background: url('../../assets/G7DiscordCardDark.jpg') 50% / cover no-repeat; + background-size: contain; +} + +.networkEssentialCardText { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + align-self: stretch; + cursor: url('../../assets/hand.svg'), pointer; +} + +.networkEssentialCardTitle { + color: #f9fafb; + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; /* 133.333% */ + cursor: url('../../assets/hand.svg'), pointer; +} + +.networkEssentialCardDescription { + color: #b9b9b9; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: 28px; + cursor: url('../../assets/hand.svg'), pointer; +} + +.firstSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + height: var(--Landing-Page-First-Section-Height-Tablet); + flex: 1 0 auto; +} + +.secondSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + flex: 1 0 auto; +} + +.thirdSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + flex: 1 0 auto; +} + + + +@media (max-width: 1199px) { + .layout { + display: flex; + padding: 16px; + flex-direction: column; + align-items: center; + gap: 16px; + } + + .mainLayout { + display: flex; + height: fit-content; + padding: 30px 24px; + flex-direction: column; + align-items: center; + flex: 1 0 0; + justify-content: start; + } + + .contentContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + } + + .titleContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + padding: 0px; + } + + .titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 72px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -2px; + text-transform: uppercase; + } + + .firstSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + height: var(--Landing-Page-First-Section-Height-Tablet); + flex: 1 0 auto; + } + + .secondSection { + display: flex; + flex-direction: column; + /* justify-content: center; */ + align-items: center; + align-self: stretch; + /* height: var(--Landing-Page-First-Section-Height-Tablet); */ + flex: 1 0 auto; + } + + .thirdSection { + display: flex; + flex-direction: column; + align-items: center; + align-self: stretch; + } + .fourthSection { + display: flex; + flex-direction: column; + align-items: center; + align-self: stretch; + } + + .card { + display: flex; + width: 340px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + width: 100%; + min-width: 300px; + } +} + +@media (max-width: 750px) { + .sectionTitle { + font-size: 30px; + line-height: 38px; + } + + .card { + width: 100%; + max-width: 340px; + display: flex; + padding: 16px; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + height: inherit; + } + + .navbarItem { + display: flex; + padding: 8px; + justify-content: center; + align-items: center; + gap: 8px; + } + + .titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 48px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -2px; + text-transform: uppercase; + } + + .startBuildingCTA { + width: 100%; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + /* flex: 1 0 0; */ + border-radius: 8px; + border: 1px solid var(--color-error-Error-500, #f04438); + background: var(--color-error-Error-500, #f04438); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + } + + .navbarContainer { + z-index: 1000; + } + + .navContainer { + padding-top: 100px; + position: fixed; /* Make the menu overlay the entire screen */ + top: 72px; + left: 0; + width: 100vw; /* Full width */ + background-color: rgba(0, 0, 0, 0.75); + z-index: 1000; /* Ensure it's on top */ + padding: 24px 24px 24px 24px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + } + + .navItem { + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + color: #d5d5d5; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + } + + .navItemHome { + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + } + + .ctaContainer { + display: flex; + padding-top: 32px; + flex-direction: column; + align-items: flex-start; + gap: 4px; + align-self: stretch; + } + + .layoutBlur::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.75); + z-index: 999; + } + + .layout { + padding: 16px; + } + + .networkEssentialCards { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + justify-content: center; + flex-wrap: wrap; + } + + .networkEssentialCard { + max-width: 340px; + } + + .contentContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + justify-content: space-between; + } + + .mainLayout { + display: flex; + gap: 80px; + padding: 24px; + flex-direction: column; + align-items: center; + flex: 1 0 0; + align-self: stretch; + justify-content: start; + } + + .scrollbarContainer { + position: fixed; + right: 23px; + height: calc(100% - 180px); + } + + .firstSection { + height: var(--Landing-Page-First-Section-Height-Phone); + } +} diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx new file mode 100644 index 00000000..f5c81973 --- /dev/null +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -0,0 +1,309 @@ +import React, { useState } from 'react' +import { useNavigate } from 'react-router-dom' +import styles from './LandingPage.module.css' +import { useMediaQuery } from 'summon-ui/mantine' +import ArbitrumLogo from '@/assets/ArbitrumLogo' +import ConduitLogo from '@/assets/ConduitLogo' +import HyperPlayLogo from '@/assets/HyperPlayLogo' +import IconGame7 from '@/assets/IconGame7' +import IconGame7Logo from '@/assets/IconGame7Logo' +import IconHamburgerLanding from '@/assets/IconHamburgerLanding' +import MarketWarsLogo from '@/assets/MarketWarsLogo' +import SummonLogo from '@/assets/SummonLogo' +import SummonTextLogo from '@/assets/SummonTextLogo' + +interface LandingPageProps {} + +const LandingPage: React.FC = () => { + const NAVBAR_ITEMS = [ + { name: 'Home', link: '/' }, + { name: 'Faucet', link: 'faucet' }, + { name: 'Bridge', link: 'bridge' }, + { name: 'Community', link: 'https://discord.com/invite/g7dao' }, + { + name: 'Docs', + link: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder' + } + ] + const navigate = useNavigate() + const [navbarOpen, setNavBarOpen] = useState(false) + const smallView = useMediaQuery('(max-width: 750px)') + const startBuilding = () => { + navigate('/faucet') + } + + const navigateLink = (item: any) => { + item.name !== 'Docs' && item.name !== 'Community' ? navigate(`/${item.link}`) : window.open(item.link, '_blank') + } + + return ( + <> +
+ {/* NAVBAR */} + {!navbarOpen && ( +
+
+
navigate('/')}> + + +
+
+ {!smallView ? ( +
+ {NAVBAR_ITEMS.map((item, index) => ( +
navigateLink(item)} + > + {item.name} +
+ ))} +
+ Start building +
+
+ ) : ( + <> +
+ setNavBarOpen(!navbarOpen)} /> +
+ + )} +
+
+
+ )} + + {navbarOpen && smallView && ( + <> +
+
+
navigate('/')}> + + +
+
+ {!smallView ? ( +
+ {NAVBAR_ITEMS.map((item, index) => ( +
navigateLink(item)} + > + {item.name} +
+ ))} +
+ Start building +
+
+ ) : ( + <> +
+ setNavBarOpen(!navbarOpen)} /> +
+ + )} +
+
+
+
+ {NAVBAR_ITEMS.map((item, index) => ( +
navigateLink(item)} + > + {item.name} +
+ ))} +
+
+ Start building +
+
+
+ + )} + { +
+ {/* Main */} +
+
+
+
DEVHUB
+
+
Build Your Game
+
Be a part of the future of gaming
+
+ {!smallView && ( +
+
+ window.open( + 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder', + '_blank' + ) + } + > + Learn more +
+
+ Start building +
+
+ )} +
+
+
+ {/* G7 Benefits */} +
+
+
Get all benefits of the G7 Network
+
+
+
Build for gamers
+
+
+ Bootstrap your game with access to 250k+ citizens and counting +
+
+
+
Fast and efficient
+
+
Lighting-quick transactions and low cost fees
+
+
+
Special economic zone
+
+
Access World Builder’s powerful developer tools
+
+
+
+
+ {/* Nation Allies */} +
+
+
G7 Network allies
+
+
+
+ +
+
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ + {/* Network Essential Cards */} +
+
Start building with the network essentials
+
+
navigate('/faucet')}> +
+
+
Faucet
+
+ Get testnet tokens to start building on G7 Sepolia +
+
+
+
navigate('/bridge')}> +
+
+
Bridge
+
+ Bridge tokens between Ethereum, Arbitrum and the G7 network +
+
+
+
window.open('https://testnet.game7.io/', '_blank')} + > +
+
+
Block explorer
+
+ Track and interact directly with your smart contracts +
+
+
+
+ window.open( + 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder', + '_blank' + ) + } + > +
+
+
Docs
+
+ Get more information about building in the G7 Network +
+
+
+
window.open('https://discord.com/invite/g7dao', '_blank')} + > +
+
+
Discord
+
+ Join our community of builders on Discord +
+
+
+
+ {!smallView && ( +
+ Start building +
+ )} +
+
+ } + + {smallView ? ( +
+ Start building +
+ ) : ( + <> + )} +
+ + ) +} + +export default LandingPage diff --git a/webapps/world-builder-dashboard/src/router.tsx b/webapps/world-builder-dashboard/src/router.tsx index 7e74df64..af1f639b 100644 --- a/webapps/world-builder-dashboard/src/router.tsx +++ b/webapps/world-builder-dashboard/src/router.tsx @@ -1,4 +1,4 @@ -import { Navigate, createBrowserRouter } from 'react-router-dom' +import { createBrowserRouter } from 'react-router-dom' import ErrorBoundary from '@/components/ErrorBoundry' //Layouts import MainLayout from '@/layouts/MainLayout/MainLayout' @@ -6,18 +6,13 @@ import BridgePage from '@/pages/BridgePage/BridgePage' import FaucetPage from '@/pages/FaucetPage/FaucetPage' //Pages import NotFoundPage from '@/pages/NotFoundPage/NotFoundPage' +import LandingPage from './pages/LandingPage/LandingPage' const router = createBrowserRouter([ { - element: , + element: , path: '/', - children: [ - { - path: '/', - element: , - errorElement: - } - ] + errorElement: }, { element: , diff --git a/webapps/world-builder-dashboard/src/styles/global.css b/webapps/world-builder-dashboard/src/styles/global.css index 2666e2fb..afbfddcc 100644 --- a/webapps/world-builder-dashboard/src/styles/global.css +++ b/webapps/world-builder-dashboard/src/styles/global.css @@ -38,7 +38,7 @@ button { --Gray-300: #d0d5dd; --Gray-600: #475467; --Gray-700: #344054; - --Primary-600: #ef233b; + --Primary-600: #F04438; --Primary-700: #dd1534; --Base-White: #fff; --Base-Container: #fff; @@ -77,15 +77,16 @@ button { --Selected-Theme-Text: #101828; --Theme-Text: #475467; --Connect-Wallet-Button-Faucet: #ffebef; - --Connect-Wallet-Text-Faucet: #912018; + --Connect-Wallet-Text-Faucet: #912018; --Disabled-Button: #475467; } [data-theme='dark'] { + --Landing-Page-First-Section-Height-Phone: calc(100svh - 196px); + --Landing-Page-First-Section-Height-Tablet: calc(100svh - 186px); --mix-blend: normal; - - --Blue-50: #175CD3; /* Adjusted from #eff8ff */ - --Blue-100: #1849A9; /* Adjusted from #d1e9ff */ + --Blue-50: #175cd3; /* Adjusted from #eff8ff */ + --Blue-100: #1849a9; /* Adjusted from #d1e9ff */ --Blue-200: #8abfff; /* Adjusted from #b3d8ff */ --Blue-700: #164bbf; /* Adjusted from #175cd3 */ --Blue-800: #12399f; /* New: Darker blue shade */ @@ -99,7 +100,7 @@ button { --Warning-800: #703205; /* New: Darker warning shade */ --Success-50: #054f31; /* Adjusted from #ecfdf3 */ - --Success-100: #027A48; /* Adjusted from #D1FADF */ + --Success-100: #027a48; /* Adjusted from #D1FADF */ --Success-200: #79ddab; /* Adjusted from #A6F4C5 */ --Success-700: #ecfdf3; /* Adjusted from #027a48 */ --Success-800: #024e2b; /* New: Darker success shade */ @@ -112,7 +113,7 @@ button { --Error-600: #c62c1a; /* Adjusted from #d92d20 */ --Error-700: #fbeae8; /* Adjusted from #FEF3F2 */ --Error-800: #aa2714; /* New: Darker error shade */ - --Error-900: #B42318; + --Error-900: #b42318; --Gray-50: #0b0b0b; --Gray-60: #393939; @@ -125,7 +126,7 @@ button { --Primary-25: #fffafb; --Primary-50: #3d2b2f; --Primary-100: #5a3d43; - --Primary-600: #ef233b; + --Primary-600: #F04438; --Primary-700: #ff4455; --Base-White: #0b0b0b; diff --git a/webapps/world-builder-dashboard/src/utils/bridge/l3Networks.ts b/webapps/world-builder-dashboard/src/utils/bridge/l3Networks.ts index 86c930af..53f0316f 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/l3Networks.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/l3Networks.ts @@ -149,7 +149,7 @@ export const L3_NETWORKS = [ chainId: 13746, parentChainId: 421614, nativeToken: '0x10adBf84548F923577Be12146eAc104C899D1E75', - rpcs: ['https://testnet-rpc.game7.io/'] + rpcs: ['https://rpc-game7-testnet-0ilneybprf.t.conduit.xyz'] }, coreContracts: { rollup: '0x6cf5bFffc54cDd13B4747e8DF2C72ce8A95043c0', From 4168edc0786e9a700b226488a79c43a0e106c374 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 16:52:12 +0100 Subject: [PATCH 050/266] remove retryable ticket --- .../src/utils/bridge/createRetryableTicket.ts | 105 ------------------ 1 file changed, 105 deletions(-) delete mode 100644 webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts diff --git a/webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts b/webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts deleted file mode 100644 index 7ac10a76..00000000 --- a/webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { MAX_ALLOWANCE_ACCOUNT } from '../../../constants' -import { ethers, providers } from 'ethers' -import { NetworkInterface } from '@/contexts/BlockchainContext' -import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { calculateGasValues } from '@/utils/bridge/depositERC20ToNative' -import { convertToBigNumber } from '@/utils/web3utils' -import { ERC20_INBOX_ABI } from '@/web3/ABI/erc20_inbox_abi' -import { NodeInterface__factory } from '@arbitrum/sdk/dist/lib/abi/factories/NodeInterface__factory' -import { NODE_INTERFACE_ADDRESS } from '@arbitrum/sdk/dist/lib/dataEntities/constants' -import { Signer } from '@ethersproject/abstract-signer' - -const MIN_GAS_LIMIT = ethers.BigNumber.from(300000) - -const estimateGasComponents = async ( - account: string, - network: NetworkInterface, - destinationAddress: string, - data: string -) => { - const provider = new providers.JsonRpcProvider(network.rpcs[0]) - if (data) { - const nodeInterface = NodeInterface__factory.connect(NODE_INTERFACE_ADDRESS, provider) - try { - return await nodeInterface.callStatic.gasEstimateComponents(destinationAddress, false, data, { - from: account - }) - } catch (e: any) { - console.log("Can't estimate gas: ", e.message) - } - } -} - -export const estimateCreateRetryableTicketFee = async ( - _account: string, - network: NetworkInterface, - destinationAddress: string, - data: string -) => { - let account = _account - if (!_account) { - account = MAX_ALLOWANCE_ACCOUNT - } - const gasEstimateComponents = await estimateGasComponents(account, network, destinationAddress, data) - if (gasEstimateComponents) { - const { TXFEES, G } = calculateGasValues(gasEstimateComponents) - const gasLimit = G.add(G).lt(MIN_GAS_LIMIT) ? MIN_GAS_LIMIT : G.add(G) //adding 100% buffer - const maxFeePerGas = TXFEES.div(G) - - return { gasLimit, maxFeePerGas } - } -} - -export const sendL2ToL3Message = async ( - lowNetwork: NetworkInterface, - highNetwork: NetworkInterface, - amount: string, - l2Signer: Signer, - account: string, - callAddress: string, - callData: string, - _feeEstimation: { gasLimit: ethers.BigNumber; maxFeePerGas: ethers.BigNumber } | undefined -): Promise => { - const destinationAddress = highNetwork.inbox - if (!destinationAddress) { - throw new Error('inbox contract address is undefined') - } - const ethAmount = convertToBigNumber(amount) - const ERC20InboxContract = new ethers.Contract(destinationAddress, ERC20_INBOX_ABI, l2Signer) - - const feeEstimation = - _feeEstimation ?? (await estimateCreateRetryableTicketFee(account, lowNetwork, callAddress, callData)) - if (!feeEstimation) { - throw new Error('sendL2->L3MessageError: fee estimation error') - } - const { gasLimit, maxFeePerGas } = feeEstimation - - const to = callAddress - const l2CallValue = ethAmount - const maxSubmissionCost = 0 - const excessFeeRefundAddress = account - const callValueRefundAddress = account - const tokenTotalFeeAmount = maxFeePerGas.mul(gasLimit).add(l2CallValue) - const txResponse = await ERC20InboxContract.createRetryableTicket( - to, - l2CallValue, - maxSubmissionCost, - excessFeeRefundAddress, - callValueRefundAddress, - gasLimit, - maxFeePerGas, - tokenTotalFeeAmount, - callData - ) - await txResponse.wait() - return { - type: 'DEPOSIT', - amount, - lowNetworkChainId: lowNetwork.chainId, - highNetworkChainId: highNetwork.chainId, - lowNetworkHash: txResponse.hash, - lowNetworkTimestamp: Date.now() / 1000, - completionTimestamp: Date.now() / 1000, - newTransaction: true - } -} From 5953ee9806e8ecd7ae6ea12fe0ad2a11789cb7a7 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 17:06:41 +0100 Subject: [PATCH 051/266] cp --- .../components/bridge/bridge/ActionButton.tsx | 2 +- .../components/bridge/history/Withdrawal.tsx | 2 +- .../src/utils/bridge/createRetryableTicket.ts | 105 +++++++++++++++ .../src/utils/bridge/depositERC20ToNative | 122 ++++++++++++++++++ 4 files changed, 229 insertions(+), 2 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts create mode 100644 webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 30cc006d..9e6afe1f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -69,7 +69,7 @@ const ActionButton: React.FC = ({ return } setErrorMessage('') - transfer.mutate(String(amount)) + transfer.mutateAsync(String(amount)) return } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 0f2f18d6..b17ec187 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -268,7 +268,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
diff --git a/webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts b/webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts new file mode 100644 index 00000000..95b6933d --- /dev/null +++ b/webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts @@ -0,0 +1,105 @@ +import { MAX_ALLOWANCE_ACCOUNT } from '../../../constants' +import { ethers, providers } from 'ethers' +import { NetworkInterface } from '@/contexts/BlockchainContext' +import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' +import { calculateGasValues } from '@/utils/bridge/depositERC20ArbitrumSDK' +import { convertToBigNumber } from '@/utils/web3utils' +import { ERC20_INBOX_ABI } from '@/web3/ABI/erc20_inbox_abi' +import { NodeInterface__factory } from '@arbitrum/sdk/dist/lib/abi/factories/NodeInterface__factory' +import { NODE_INTERFACE_ADDRESS } from '@arbitrum/sdk/dist/lib/dataEntities/constants' +import { Signer } from '@ethersproject/abstract-signer' + +const MIN_GAS_LIMIT = ethers.BigNumber.from(300000) + +const estimateGasComponents = async ( + account: string, + network: NetworkInterface, + destinationAddress: string, + data: string +) => { + const provider = new providers.JsonRpcProvider(network.rpcs[0]) + if (data) { + const nodeInterface = NodeInterface__factory.connect(NODE_INTERFACE_ADDRESS, provider) + try { + return await nodeInterface.callStatic.gasEstimateComponents(destinationAddress, false, data, { + from: account + }) + } catch (e: any) { + console.log("Can't estimate gas: ", e.message) + } + } +} + +export const estimateCreateRetryableTicketFee = async ( + _account: string, + network: NetworkInterface, + destinationAddress: string, + data: string +) => { + let account = _account + if (!_account) { + account = MAX_ALLOWANCE_ACCOUNT + } + const gasEstimateComponents = await estimateGasComponents(account, network, destinationAddress, data) + if (gasEstimateComponents) { + const { TXFEES, G } = calculateGasValues(gasEstimateComponents) + const gasLimit = G.add(G).lt(MIN_GAS_LIMIT) ? MIN_GAS_LIMIT : G.add(G) //adding 100% buffer + const maxFeePerGas = TXFEES.div(G) + + return { gasLimit, maxFeePerGas } + } +} + +export const sendL2ToL3Message = async ( + lowNetwork: NetworkInterface, + highNetwork: NetworkInterface, + amount: string, + l2Signer: Signer, + account: string, + callAddress: string, + callData: string, + _feeEstimation: { gasLimit: ethers.BigNumber; maxFeePerGas: ethers.BigNumber } | undefined +): Promise => { + const destinationAddress = highNetwork.inbox + if (!destinationAddress) { + throw new Error('inbox contract address is undefined') + } + const ethAmount = convertToBigNumber(amount) + const ERC20InboxContract = new ethers.Contract(destinationAddress, ERC20_INBOX_ABI, l2Signer) + + const feeEstimation = + _feeEstimation ?? (await estimateCreateRetryableTicketFee(account, lowNetwork, callAddress, callData)) + if (!feeEstimation) { + throw new Error('sendL2->L3MessageError: fee estimation error') + } + const { gasLimit, maxFeePerGas } = feeEstimation + + const to = callAddress + const l2CallValue = ethAmount + const maxSubmissionCost = 0 + const excessFeeRefundAddress = account + const callValueRefundAddress = account + const tokenTotalFeeAmount = maxFeePerGas.mul(gasLimit).add(l2CallValue) + const txResponse = await ERC20InboxContract.createRetryableTicket( + to, + l2CallValue, + maxSubmissionCost, + excessFeeRefundAddress, + callValueRefundAddress, + gasLimit, + maxFeePerGas, + tokenTotalFeeAmount, + callData + ) + await txResponse.wait() + return { + type: 'DEPOSIT', + amount, + lowNetworkChainId: lowNetwork.chainId, + highNetworkChainId: highNetwork.chainId, + lowNetworkHash: txResponse.hash, + lowNetworkTimestamp: Date.now() / 1000, + completionTimestamp: Date.now() / 1000, + newTransaction: true + } +} diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative new file mode 100644 index 00000000..bae1b68f --- /dev/null +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ToNative @@ -0,0 +1,122 @@ +import { ethers, providers, utils } from 'ethers' +import { HighNetworkInterface, NetworkInterface } from '@/contexts/BlockchainContext' +import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' +import { convertToBigNumber } from '@/utils/web3utils' +import { ERC20_INBOX_ABI } from '@/web3/ABI/erc20_inbox_abi' +import { NodeInterface__factory } from '@arbitrum/sdk/dist/lib/abi/factories/NodeInterface__factory' +import { NODE_INTERFACE_ADDRESS } from '@arbitrum/sdk/dist/lib/dataEntities/constants' +import { Signer } from '@ethersproject/abstract-signer' + +const estimateGasComponents = async ( + amount: string, + account: string, + lowNetwork: NetworkInterface, + highNetwork: HighNetworkInterface +) => { + if (!highNetwork.inbox) { + console.log('inbox contract is undefined') + return + } + + const destinationAddress = highNetwork.inbox + const ethAmount = convertToBigNumber(amount) + const lowNetworkProvider = new providers.JsonRpcProvider(lowNetwork.rpcs[0]) + + const ERC20InboxContract = new ethers.Contract(highNetwork.inbox, ERC20_INBOX_ABI, lowNetworkProvider) + const tx = await ERC20InboxContract.populateTransaction.depositERC20(ethAmount) + const data = tx.data + + if (data) { + const nodeInterface = NodeInterface__factory.connect(NODE_INTERFACE_ADDRESS, lowNetworkProvider) + try { + return await nodeInterface.callStatic.gasEstimateComponents(destinationAddress, false, data, { + from: account + }) + } catch (e: any) { + console.log("Can't estimate gas: ", e.message) + } + } +} + +export const calculateGasValues = (gasEstimateComponents: any) => { + const l1GasEstimated = gasEstimateComponents.gasEstimateForL1 + const l2GasUsed = gasEstimateComponents.gasEstimate.sub(gasEstimateComponents.gasEstimateForL1) + const l2EstimatedPrice = gasEstimateComponents.baseFee + const l1EstimatedPrice = gasEstimateComponents.l1BaseFeeEstimate.mul(16) + const P = l2EstimatedPrice + const L2G = l2GasUsed + let B: ethers.BigNumber + if (l1EstimatedPrice.toNumber() !== 0 && l1GasEstimated.toNumber() !== 0) { + const L1P = l1EstimatedPrice + const l1Cost = l1GasEstimated.mul(l2EstimatedPrice) + const L1S = l1Cost.div(l1EstimatedPrice) + const L1C = L1P.mul(L1S) + B = L1C.div(P) + } else { + B = L2G.mul(ethers.BigNumber.from(8)) + } + + const G = L2G.add(B) + const TXFEES = P.mul(G) + + return { TXFEES, gasLimit: G, L2G, l2EstimatedPrice, G } +} + +export const estimateDepositERC20ToNativeFee = async ( + amount: string, + account: string, + lowNetwork: NetworkInterface, + highNetwork: HighNetworkInterface +) => { + const gasEstimateComponents = await estimateGasComponents(amount, account, lowNetwork, highNetwork) + if (gasEstimateComponents) { + const { TXFEES } = calculateGasValues(gasEstimateComponents) + return utils.formatEther(TXFEES) + } +} + +export const estimateDepositERC20ToNativeGas = async ( + amount: string, + account: string, + lowNetwork: NetworkInterface, + highNetwork: HighNetworkInterface +) => { + const gasEstimateComponents = await estimateGasComponents(amount, account, lowNetwork, highNetwork) + if (gasEstimateComponents) { + const { gasLimit } = calculateGasValues(gasEstimateComponents) + return gasLimit + } +} + +export const sendDepositERC20ToNativeTransaction = async ( + lowNetwork: NetworkInterface, + highNetwork: HighNetworkInterface, + amount: string, + l2Signer: Signer, + account: string +): Promise => { + const destinationAddress = highNetwork.inbox + const ethAmount = convertToBigNumber(amount) + const ERC20InboxContract = new ethers.Contract(destinationAddress, ERC20_INBOX_ABI, l2Signer) + const gasEstimate = await estimateDepositERC20ToNativeGas(amount, account, lowNetwork, highNetwork) + + const txRequest = await ERC20InboxContract.populateTransaction.depositERC20(ethAmount, { + gasLimit: gasEstimate + }) + + const txResponse = await l2Signer.sendTransaction(txRequest) + + // Wait for the transaction to be mined + await txResponse.wait() + + return { + type: 'DEPOSIT', + amount, + lowNetworkChainId: lowNetwork.chainId, + highNetworkChainId: highNetwork.chainId, + lowNetworkHash: txResponse.hash, + lowNetworkTimestamp: Date.now() / 1000, + completionTimestamp: Date.now() / 1000, + newTransaction: true + } +} From e5ed1dca8f3336566151322fa71e3b13b456ad0f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 18:34:55 +0100 Subject: [PATCH 052/266] relative --- .../components/bridge/history/WithdrawTransactions.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index af1e82ab..f3fd1f47 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -118,6 +118,7 @@ .gridItem, .gridItemImportant { + position: relative; display: flex; height: 72px; padding: 16px 24px; From 0ffc1f3171fe53032f9933d2118f51e510af2f17 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 25 Oct 2024 18:57:56 +0100 Subject: [PATCH 053/266] clear build errors --- webapps/world-builder-dashboard/package.json | 1 - .../bridge/allowance/ApproveAllowance.tsx | 2 +- .../src/components/faucet/FaucetView.tsx | 2 +- .../components/stake/ActionButtonStake.tsx | 4 +- .../src/utils/bridge/createRetryableTicket.ts | 105 ------------------ 5 files changed, 4 insertions(+), 110 deletions(-) delete mode 100644 webapps/world-builder-dashboard/src/utils/bridge/createRetryableTicket.ts diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index f4afee0e..470dc2d2 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -44,7 +44,6 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "eslint-plugin-tailwindcss": "^3.15.1", - "patch-package": "^8.0.0", "postcss": "^8.4.38", "postcss-preset-mantine": "^1.15.0", "postcss-simple-vars": "^7.0.1", diff --git a/webapps/world-builder-dashboard/src/components/bridge/allowance/ApproveAllowance.tsx b/webapps/world-builder-dashboard/src/components/bridge/allowance/ApproveAllowance.tsx index a1f03c04..2121153b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/allowance/ApproveAllowance.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/allowance/ApproveAllowance.tsx @@ -46,7 +46,7 @@ const ApproveAllowance: React.FC = ({ amount, balance, on if (approveAllowance.isSuccess) { onSuccess() } else { - approveAllowance.mutate({ newAllowance, allowanceProps }) + approveAllowance.mutateAsync({ newAllowance, allowanceProps }) } } diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index fa118eb2..75e4c4ff 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -299,7 +299,7 @@ const FaucetView: React.FC = ({}) => { )} - {status.data?.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus?.status === ChildToParentMessageStatus.EXECUTED && (
{timeAgo(status.data.lowNetworkTimeStamp)}
)} - {status.data?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && (
{ETA(status.data?.timestamp, withdrawal.challengePeriod)}
)}
From f4eb5a6dc66f99116e93ce75c0fe9fb98e4a62d0 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 28 Oct 2024 17:09:17 +0000 Subject: [PATCH 061/266] cache items better --- .../src/components/bridge/history/Deposit.tsx | 49 ++++++++++++------- .../bridge/history/DepositMobile.tsx | 4 +- .../components/bridge/history/Withdrawal.tsx | 49 ++++++++++++------- .../utils/bridge/depositERC20ArbitrumSDK.ts | 1 + .../src/utils/web3utils.ts | 1 + 5 files changed, 67 insertions(+), 37 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 5a355e5b..e8502a5e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -5,6 +5,7 @@ import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -14,29 +15,43 @@ interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { - const depositDrilled = useRef(false) const depositInfo = { from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const status = useDepositStatus(deposit) - const [transferStatus, setTransferStatus] = useState(undefined) + const [transferStatus, setTransferStatus] = useState(deposit?.status) const smallView = useMediaQuery('(max-width: 1199px)') + const { connectedAccount } = useBlockchainContext() useEffect(() => { - if (!deposit || depositDrilled.current) return - const _bridgeTransfer = new BridgeTransfer({ - txHash: deposit.lowNetworkHash || '', - destinationNetworkChainId: deposit.highNetworkChainId ?? 0, - originNetworkChainId: deposit.lowNetworkChainId ?? 0 - }) - const getTransferData = async () => { - const _status = await _bridgeTransfer.getStatus() - setTransferStatus(_status) + if (!deposit) return + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + let transactions: TransactionRecord[] = [] + if (transactionsString) { + transactions = JSON.parse(transactionsString) } - getTransferData() - depositDrilled.current = true - }, [deposit]) + const savedTransaction = transactions.find((t) => t.highNetworkHash === deposit.highNetworkHash) + if (savedTransaction && savedTransaction.status !== undefined) { + setTransferStatus(savedTransaction.status) + } else { + const _bridgeTransfer = new BridgeTransfer({ + txHash: deposit.lowNetworkHash || '', + destinationNetworkChainId: deposit.highNetworkChainId ?? 0, + originNetworkChainId: deposit.lowNetworkChainId ?? 0 + }) + + const getStatus = async () => { + const _status = await _bridgeTransfer.getStatus() + setTransferStatus(_status) + const updatedTransactions = transactions.map((t) => + t.highNetworkHash === deposit.highNetworkHash ? { ...t, status: _status } : t + ) + localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(updatedTransactions)) + } + getStatus() + } + }, [deposit, connectedAccount]) return ( <> @@ -44,15 +59,15 @@ const Deposit: React.FC = ({ deposit }) => { !smallView ? ( Array.from(Array(7)).map((_, idx) => (
- +
)) ) : (
- +
) - ): ( + ) : ( <>
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index 279ab9e4..a57b8151 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -46,12 +46,12 @@ const DepositMobile: React.FC = ({ deposit }) => { !smallView ? ( Array.from(Array(7)).map((_, idx) => (
- +
)) ) : (
- +
) ): ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 45c65dd1..25c60478 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -57,7 +57,6 @@ export const getStatus = (withdrawal: TransactionRecord) => { } } const Withdrawal: React.FC = ({ withdrawal }) => { - const withdrawDrilled = useRef(false) const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK const status = getStatus(withdrawal) const { switchChain, connectedAccount } = useBlockchainContext() @@ -65,23 +64,37 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') const [bridgeTransfer, setBridgeTransfer] = useState() - const [transferStatus, setTransferStatus] = useState(undefined) + const [transferStatus, setTransferStatus] = useState(withdrawal?.status) useEffect(() => { - if (!withdrawal || withdrawDrilled.current) return - const _bridgeTransfer = new BridgeTransfer({ - txHash: withdrawal.highNetworkHash || '', - destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, - originNetworkChainId: withdrawal.highNetworkChainId ?? 0 - }) - setBridgeTransfer(_bridgeTransfer) - const getStatus = async () => { - const _status = await _bridgeTransfer.getStatus() - setTransferStatus(_status) + if (!withdrawal) return + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + let transactions: TransactionRecord[] = [] + if (transactionsString) { + transactions = JSON.parse(transactionsString) } - getStatus() - withdrawDrilled.current = true - }, [withdrawal]) + const savedTransaction = transactions.find((t) => t.highNetworkHash === withdrawal.highNetworkHash) + if (savedTransaction && savedTransaction.status !== undefined) { + setTransferStatus(savedTransaction.status) + } else { + const _bridgeTransfer = new BridgeTransfer({ + txHash: withdrawal.highNetworkHash || '', + destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, + originNetworkChainId: withdrawal.highNetworkChainId ?? 0 + }) + setBridgeTransfer(_bridgeTransfer) + + const getStatus = async () => { + const _status = await _bridgeTransfer.getStatus() + setTransferStatus(_status) + const updatedTransactions = transactions.map((t) => + t.highNetworkHash === withdrawal.highNetworkHash ? { ...t, status: _status } : t + ) + localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(updatedTransactions)) + } + getStatus() + } + }, [withdrawal, connectedAccount]) // Mutate function const execute = useMutation( @@ -155,16 +168,16 @@ const Withdrawal: React.FC = ({ withdrawal }) => { return ( <> - {!transferStatus?.status ? ( + {!transferStatus ? ( !smallView ? ( Array.from(Array(7)).map((_, idx) => (
- +
)) ) : (
- +
) ) : ( diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts index 949e8db8..f4e2e4ad 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts @@ -37,6 +37,7 @@ export interface TransactionRecord { newTransaction?: boolean isFailed?: boolean symbol?: string + status?: number } export const depositERC20ArbitrumSDK = async ( diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index a21f122b..366122a8 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -13,6 +13,7 @@ export const getBlockExplorerUrl = (chainId: number | undefined) => { if (network?.blockExplorerUrls) { return network.blockExplorerUrls[0] } + console.log(network) } export const getNetwork = (chainId: number) => { From ceec325268b20945228efa085c751ed6d3338751 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 28 Oct 2024 17:56:18 +0000 Subject: [PATCH 062/266] adding --- .../src/components/bridge/history/Deposit.tsx | 2 +- .../components/bridge/history/Withdrawal.tsx | 2 +- .../bridge/history/WithdrawalMobile.tsx | 3 +- .../tokenSelector/TokenSelector.tsx | 78 +++++++++---------- 4 files changed, 42 insertions(+), 43 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index e8502a5e..aca9d95c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react' +import React, { useEffect, useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 25c60478..9a38036a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useRef } from 'react' +import React, { useEffect, useState } from 'react' import { useMutation, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 20cee4bd..df3e901d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react' +import React, { useState } from 'react' import styles from './DepositMobile.module.css' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompletedMobile from '@/assets/IconWithdrawalNodeCompletedMobile' @@ -17,7 +17,6 @@ interface WithdrawalMobileProps { const WithdrawalMobile: React.FC = ({ withdrawal, execute, status, transferStatus }) => { const [isCollapsed, setIsCollapsed] = useState(true) - return (
diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index c220bdc2..860e69ea 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -22,48 +22,48 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected onDropdownClose: () => combobox.resetSelectedOption() }) - const [tokenAddress, setTokenAddress] = useState('') - const [error, setError] = useState('') - const { connectedAccount, selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() + // const [tokenAddress, setTokenAddress] = useState('') + // const [error, setError] = useState('') + const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() - const handleTokenInput = (tokenAddress: string) => { - setTokenAddress(tokenAddress) + // const handleTokenInput = (tokenAddress: string) => { + // setTokenAddress(tokenAddress) - let web3Provider - if (window.ethereum) web3Provider = new ethers.providers.Web3Provider(window.ethereum) - else throw new Error('Wallet is not installed') + // let web3Provider + // if (window.ethereum) web3Provider = new ethers.providers.Web3Provider(window.ethereum) + // else throw new Error('Wallet is not installed') - if (!ethers.utils.isAddress(tokenAddress)) setError('Not an address!') - else if (!doesContractExist(tokenAddress, web3Provider)) setError(`Contract doesn't exist!`) - else if (tokens.find((token) => token.address === tokenAddress)) setError('Token already exists') - else setError('') - } + // if (!ethers.utils.isAddress(tokenAddress)) setError('Not an address!') + // else if (!doesContractExist(tokenAddress, web3Provider)) setError(`Contract doesn't exist!`) + // else if (tokens.find((token) => token.address === tokenAddress)) setError('Token already exists') + // else setError('') + // } - const addToken = (tokenAddress: string) => { - try { - if (error !== '') return - const storageKey = `${connectedAccount}-${selectedChainId}` - const existingTokens = JSON.parse(localStorage.getItem(storageKey) || '[]') - const rpc = ALL_NETWORKS.find((network) => network.chainId === selectedChainId)?.rpcs[0] - const token = { - name: `${tokenAddress.slice(0, 6)}`, - symbol: `${tokenAddress.slice(0, 6)}`, - address: tokenAddress, - rpc: rpc - } + // const addToken = (tokenAddress: string) => { + // try { + // if (error !== '') return + // const storageKey = `${connectedAccount}-${selectedChainId}` + // const existingTokens = JSON.parse(localStorage.getItem(storageKey) || '[]') + // const rpc = ALL_NETWORKS.find((network) => network.chainId === selectedChainId)?.rpcs[0] + // const token = { + // name: `${tokenAddress.slice(0, 6)}`, + // symbol: `${tokenAddress.slice(0, 6)}`, + // address: tokenAddress, + // rpc: rpc + // } - if (tokens.find((token: Token) => token.address === tokenAddress)) { - setError("Can't add the same token!") - return - } - const updatedTokens = [...existingTokens, token] - localStorage.setItem(storageKey, JSON.stringify(updatedTokens)) - onTokenAdded() - } catch (err) { - console.log(err) - setError(`` + err) - } - } + // if (tokens.find((token: Token) => token.address === tokenAddress)) { + // setError("Can't add the same token!") + // return + // } + // const updatedTokens = [...existingTokens, token] + // localStorage.setItem(storageKey, JSON.stringify(updatedTokens)) + // onTokenAdded() + // } catch (err) { + // console.log(err) + // setError(`` + err) + // } + // } return ( {error}
)} -
+ {/*
0 ? styles.error : ''}`} value={tokenAddress} @@ -138,7 +138,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selected
addToken(tokenAddress)}>
Import
-
+
*/}
From ad1d9e5662511561745cf7cb12b45c91193adc4d Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 28 Oct 2024 18:48:43 +0000 Subject: [PATCH 063/266] tokenSelector remove --- .../tokenSelector/TokenSelector.tsx | 69 +------------------ 1 file changed, 1 insertion(+), 68 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index 860e69ea..a9472402 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -1,13 +1,9 @@ -import { useState } from 'react' -import { ALL_NETWORKS } from '../../../../constants' import styles from './TokenSelector.module.css' -import { ethers } from 'ethers' import { Combobox, Group, InputBase, InputBaseProps, useCombobox } from 'summon-ui/mantine' import IconCheck from '@/assets/IconCheck' import IconChevronDown from '@/assets/IconChevronDown' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { Token } from '@/utils/tokens' -import { doesContractExist } from '@/utils/web3utils' type TokenSelectorProps = { tokens: Token[] @@ -17,54 +13,13 @@ type TokenSelectorProps = { selectedChainId: number } & InputBaseProps -const TokenSelector = ({ tokens, onChange, selectedToken, onTokenAdded, selectedChainId }: TokenSelectorProps) => { +const TokenSelector = ({ tokens, onChange, selectedToken }: TokenSelectorProps) => { const combobox = useCombobox({ onDropdownClose: () => combobox.resetSelectedOption() }) - // const [tokenAddress, setTokenAddress] = useState('') - // const [error, setError] = useState('') const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() - // const handleTokenInput = (tokenAddress: string) => { - // setTokenAddress(tokenAddress) - - // let web3Provider - // if (window.ethereum) web3Provider = new ethers.providers.Web3Provider(window.ethereum) - // else throw new Error('Wallet is not installed') - - // if (!ethers.utils.isAddress(tokenAddress)) setError('Not an address!') - // else if (!doesContractExist(tokenAddress, web3Provider)) setError(`Contract doesn't exist!`) - // else if (tokens.find((token) => token.address === tokenAddress)) setError('Token already exists') - // else setError('') - // } - - // const addToken = (tokenAddress: string) => { - // try { - // if (error !== '') return - // const storageKey = `${connectedAccount}-${selectedChainId}` - // const existingTokens = JSON.parse(localStorage.getItem(storageKey) || '[]') - // const rpc = ALL_NETWORKS.find((network) => network.chainId === selectedChainId)?.rpcs[0] - // const token = { - // name: `${tokenAddress.slice(0, 6)}`, - // symbol: `${tokenAddress.slice(0, 6)}`, - // address: tokenAddress, - // rpc: rpc - // } - - // if (tokens.find((token: Token) => token.address === tokenAddress)) { - // setError("Can't add the same token!") - // return - // } - // const updatedTokens = [...existingTokens, token] - // localStorage.setItem(storageKey, JSON.stringify(updatedTokens)) - // onTokenAdded() - // } catch (err) { - // console.log(err) - // setError(`` + err) - // } - // } - return ( -
-
- {error && error.length > 0 && ( -
-
{error}
-
- )} - {/*
- 0 ? styles.error : ''}`} - value={tokenAddress} - placeholder='Import token address' - onChange={(e) => { - handleTokenInput(e.target.value) - }} - /> -
addToken(tokenAddress)}> -
Import
-
-
*/} -
-
) From 5709c48b448294d956e7c381c90865c486a624fa Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 29 Oct 2024 13:38:53 +0000 Subject: [PATCH 064/266] useQuery --- webapps/world-builder-dashboard/package.json | 2 +- .../components/bridge/bridge/BridgeView.tsx | 56 ++++++++-------- .../bridge/bridge/NetworkSelector.tsx | 1 + .../src/components/bridge/history/Deposit.tsx | 44 +++++-------- .../components/bridge/history/Withdrawal.tsx | 64 +++++++++---------- .../tokenSelector/TokenSelector.tsx | 2 +- .../src/components/faucet/FaucetView.tsx | 1 + .../notifications/NotificationsDropModal.tsx | 14 ++-- .../src/hooks/useTokenBalance.ts | 2 + .../src/utils/tokens.ts | 16 +++-- 10 files changed, 101 insertions(+), 101 deletions(-) diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 470dc2d2..69d26f7c 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,7 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.49", + "game7-bridge-sdk": "^0.0.51", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 97639bc3..b0eb18de 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -6,7 +6,7 @@ import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from import styles from './BridgeView.module.css' import { ethers } from 'ethers' // G7 SDK -import { Bridger } from 'game7-bridge-sdk' +import { Bridger, BridgeToken } from 'game7-bridge-sdk' // Components import ActionButton from '@/components/bridge/bridge/ActionButton' import BridgeMessage from '@/components/bridge/bridge/BridgeMessage' @@ -23,7 +23,6 @@ import useNativeBalance from '@/hooks/useNativeBalance' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' -import useTokenBalance from '@/hooks/useTokenBalance' const BridgeView = ({ direction, @@ -32,8 +31,12 @@ const BridgeView = ({ direction: DepositDirection setDirection: (arg0: DepositDirection) => void }) => { + let chainId + let address + let tokenAddresses const [bridger, setBridger] = useState() - const [balance, setBalance] = useState(null) + const [balance, setBalance] = useState("") + const [symbol, setSymbol] = useState("") const [value, setValue] = useState('0') const [message, setMessage] = useState<{ destination: string; data: string }>({ destination: '', data: '' }) const [isMessageExpanded, setIsMessageExpanded] = useState(false) @@ -52,12 +55,13 @@ const BridgeView = ({ selectedBridgeToken } = useBlockchainContext() + const { isFetching: isFetchingLowNetworkBalance } = useERC20Balance({ tokenAddress: selectedLowNetwork.g7TokenAddress, account: connectedAccount, rpc: selectedLowNetwork.rpcs[0] }) - const {isFetching: isFetchingHighNetworkBalance } = useERC20Balance({ + const { isFetching: isFetchingHighNetworkBalance } = useERC20Balance({ tokenAddress: selectedHighNetwork.g7TokenAddress, account: connectedAccount, rpc: selectedHighNetwork.rpcs[0] @@ -76,14 +80,20 @@ const BridgeView = ({ rpc: selectedHighNetwork.rpcs[0] }) - const { balance: tokenBalance } = useTokenBalance( - selectedBridgeToken?.address || '', - selectedBridgeToken?.rpc || '', - connectedAccount - ) - - const handleTokenChange = (token: Token) => { + const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) + tokenAddresses = token.tokenAddressMap; + chainId = token.chainId; + address = token.tokenAddressMap[chainId]; + tokenAddresses = token.tokenAddressMap + console.log({chainId, address, tokenAddresses}) + const bridgeToken = new BridgeToken(tokenAddresses, chainId) + console.log(bridgeToken) + // const tokenBalance = String(await bridgeToken.getBalance(token.rpc, token.address)) + // setBalance(tokenBalance) + // const symbol = await bridgeToken.getSymbol(token.rpc) + // setSymbol(symbol) + // console.log(symbol) } const estimatedFee = useQuery( @@ -108,22 +118,10 @@ const BridgeView = ({ useEffect(() => { if (selectedBridgeToken && connectedAccount && selectedHighNetwork && selectedLowNetwork) { - setBalance(Number(tokenBalance)) const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) - // TODO: get predicted address - // const getPredictedAddress = async () => { - // const arbitrumBridger = new Erc20Bridger(networks[13746]) - // const childAddress = await arbitrumBridger.getChildErc20Address( - // selectedBridgeToken.tokenAddressMap[selectedLowNetwork.chainId], - // getProvider(selectedBridgeToken.rpc[0]) - // ) - // console.log(childAddress) - // return childAddress - // } - if (!chainIds.includes(String(destinationChainId))) { return } @@ -210,11 +208,11 @@ const BridgeView = ({
{networkErrorMessage &&
{networkErrorMessage}
}
) } -export default BridgeView \ No newline at end of file +export default BridgeView diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 3db94b2d..05f890de 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -65,6 +65,7 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: {networks.map((n) => { + // can create token address map here const chainIds = Object.keys(selectedToken.tokenAddressMap) const isDisabled = chainIds.includes(String(n.chainId)) return ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index aca9d95c..a21ae9c5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,11 +1,10 @@ -import React, { useEffect, useState } from 'react' +import React, { useEffect, useRef, useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' -import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -15,6 +14,7 @@ interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { + const depositDrilled = useRef(false) const depositInfo = { from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' @@ -22,36 +22,24 @@ const Deposit: React.FC = ({ deposit }) => { const status = useDepositStatus(deposit) const [transferStatus, setTransferStatus] = useState(deposit?.status) const smallView = useMediaQuery('(max-width: 1199px)') - const { connectedAccount } = useBlockchainContext() useEffect(() => { - if (!deposit) return - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions: TransactionRecord[] = [] - if (transactionsString) { - transactions = JSON.parse(transactionsString) + if (!deposit || depositDrilled.current) return + const _bridgeTransfer = new BridgeTransfer({ + txHash: deposit.lowNetworkHash || '', + destinationNetworkChainId: deposit.highNetworkChainId ?? 0, + originNetworkChainId: deposit.lowNetworkChainId ?? 0 + }) + const getTransferData = async () => { + const _status = await _bridgeTransfer.getStatus() + setTransferStatus(_status) } - const savedTransaction = transactions.find((t) => t.highNetworkHash === deposit.highNetworkHash) - if (savedTransaction && savedTransaction.status !== undefined) { - setTransferStatus(savedTransaction.status) - } else { - const _bridgeTransfer = new BridgeTransfer({ - txHash: deposit.lowNetworkHash || '', - destinationNetworkChainId: deposit.highNetworkChainId ?? 0, - originNetworkChainId: deposit.lowNetworkChainId ?? 0 - }) + getTransferData() + depositDrilled.current = true + }, [deposit]) + + - const getStatus = async () => { - const _status = await _bridgeTransfer.getStatus() - setTransferStatus(_status) - const updatedTransactions = transactions.map((t) => - t.highNetworkHash === deposit.highNetworkHash ? { ...t, status: _status } : t - ) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(updatedTransactions)) - } - getStatus() - } - }, [deposit, connectedAccount]) return ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 9a38036a..f352d539 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useState } from 'react' -import { useMutation, useQueryClient } from 'react-query' +import React, { useEffect, useRef, useState } from 'react' +import { useMutation, useQuery, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' @@ -57,44 +57,39 @@ export const getStatus = (withdrawal: TransactionRecord) => { } } const Withdrawal: React.FC = ({ withdrawal }) => { + const withdrawDrilled = useRef(false) const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK const status = getStatus(withdrawal) const { switchChain, connectedAccount } = useBlockchainContext() const queryClient = useQueryClient() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') - const [bridgeTransfer, setBridgeTransfer] = useState() - const [transferStatus, setTransferStatus] = useState(withdrawal?.status) + const [transferStatus, setTransferStatus] = useState() - useEffect(() => { - if (!withdrawal) return - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions: TransactionRecord[] = [] - if (transactionsString) { - transactions = JSON.parse(transactionsString) - } - const savedTransaction = transactions.find((t) => t.highNetworkHash === withdrawal.highNetworkHash) - if (savedTransaction && savedTransaction.status !== undefined) { - setTransferStatus(savedTransaction.status) - } else { - const _bridgeTransfer = new BridgeTransfer({ - txHash: withdrawal.highNetworkHash || '', - destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, - originNetworkChainId: withdrawal.highNetworkChainId ?? 0 - }) - setBridgeTransfer(_bridgeTransfer) + const fetchStatus = async (withdrawal: TransactionRecord) => { + const _bridgeTransfer = new BridgeTransfer({ + txHash: withdrawal.highNetworkHash || '', + destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, + originNetworkChainId: withdrawal.highNetworkChainId ?? 0 + }) + const status = await _bridgeTransfer.getStatus() + setTransferStatus(status) + return status + } - const getStatus = async () => { - const _status = await _bridgeTransfer.getStatus() - setTransferStatus(_status) - const updatedTransactions = transactions.map((t) => - t.highNetworkHash === withdrawal.highNetworkHash ? { ...t, status: _status } : t - ) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(updatedTransactions)) - } - getStatus() + useQuery(['withdrawalStatus', withdrawal], () => fetchStatus(withdrawal), { + enabled: !!withdrawal && !withdrawDrilled.current, + onSuccess: (newStatus) => { + queryClient.setQueryData(['withdrawalStatus', withdrawal], (oldData: any) => ({ + ...oldData, + status: newStatus + })) + withdrawDrilled.current = true + }, + onError: (error) => { + console.error('Error fetching status:', error) } - }, [withdrawal, connectedAccount]) + }) // Mutate function const execute = useMutation( @@ -117,7 +112,12 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const signer = provider.getSigner() // Bridge Transfer execute - const res = await bridgeTransfer?.execute(signer) + const _bridgeTransfer = new BridgeTransfer({ + txHash: withdrawal.highNetworkHash || '', + destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, + originNetworkChainId: withdrawal.highNetworkChainId ?? 0 + }) + const res = await _bridgeTransfer?.execute(signer) return res }, { diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index a9472402..7cdb6677 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -4,7 +4,6 @@ import IconCheck from '@/assets/IconCheck' import IconChevronDown from '@/assets/IconChevronDown' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { Token } from '@/utils/tokens' - type TokenSelectorProps = { tokens: Token[] selectedToken: Token @@ -53,6 +52,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken }: TokenSelectorProps) {tokens.map((n: Token) => { const highNetworkChainId = String(selectedHighNetwork.chainId) const lowNetworkChainId = String(selectedLowNetwork.chainId) + // can create token address map here const chainIds = Object.keys(n.tokenAddressMap ?? []) const isChainIdValid = chainIds.includes(highNetworkChainId) && chainIds.includes(lowNetworkChainId) return ( diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 75e4c4ff..e54655dd 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -172,6 +172,7 @@ const FaucetView: React.FC = ({}) => { enabled: !!address && !!faucetIntervalQuery.data && !!lastClaimedTimestampQuery.data } ) + useEffect(() => { let isButtonDisabled = true diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index a3662427..984cd80f 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -63,10 +63,7 @@ const NotificationsDropModal: React.FC = ({ notific return (
- {!notifications || (notifications.length === 0 && -
- No notifications yet -
)} + {!notifications || (notifications.length === 0 &&
No notifications yet
)} {notifications && notifications.slice(0, 3).map((n, idx) => (
@@ -77,7 +74,7 @@ const NotificationsDropModal: React.FC = ({ notific
{n.status.toLowerCase()} - +
) : ( @@ -167,6 +164,13 @@ const getTransactionUrl = (notification: BridgeNotification): string | undefined case 'WITHDRAWAL': chainId = status === 'COMPLETED' ? tx.lowNetworkChainId : tx.highNetworkChainId txHash = status === 'COMPLETED' ? tx.lowNetworkHash : tx.highNetworkHash + if (status === 'COMPLETED') { + console.log(tx) + console.log(chainId) + console.log(txHash) + const explorerUrl = getBlockExplorerUrl(chainId) + console.log(explorerUrl) + } break case 'CLAIM': chainId = tx.highNetworkChainId diff --git a/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts b/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts index 300a803f..7fd51c83 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts @@ -9,6 +9,8 @@ const useTokenBalance = (tokenAddress: string, rpc: string, connectedAccount: st account: connectedAccount, rpc, }); + console.log({tokenAddress, rpc, connectedAccount}) + console.log(balance) return { balance, isFetching }; } else { const { data: balance, isFetching } = useERC20Balance({ diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 0069188d..8660a63c 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -12,6 +12,7 @@ export interface Token { Icon: React.FC> rpc: string tokenAddressMap: TokenAddressMap + chainId: number } export const getTokensForNetwork = (chainId: number | undefined, userAddress: string | undefined): Token[] => { @@ -30,7 +31,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st address: L1_NETWORK.g7TokenAddress, Icon: IconG7T, tokenAddressMap: TG7T, - rpc: L1_NETWORK.rpcs[0] + rpc: L1_NETWORK.rpcs[0], + chainId: L1_NETWORK.chainId }, { name: 'Ethereum', @@ -38,7 +40,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st address: ZERO_ADDRESS, Icon: IconEthereum, rpc: L1_NETWORK.rpcs[0], - tokenAddressMap: ETH + tokenAddressMap: ETH, + chainId: L1_NETWORK.chainId }, ...storedTokensWithItems ] @@ -50,7 +53,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st address: L2_NETWORK.g7TokenAddress, Icon: IconG7T, rpc: L2_NETWORK.rpcs[0], - tokenAddressMap: TG7T + tokenAddressMap: TG7T, + chainId: L2_NETWORK.chainId }, { name: 'Ethereum', @@ -58,7 +62,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st address: ZERO_ADDRESS, Icon: IconEthereum, rpc: L2_NETWORK.rpcs[0], - tokenAddressMap: ETH + tokenAddressMap: ETH, + chainId: L2_NETWORK.chainId }, ...storedTokensWithItems ] @@ -70,7 +75,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st address: L3_NETWORK.g7TokenAddress, Icon: IconG7T, rpc: L3_NETWORK.rpcs[0], - tokenAddressMap: TG7T + tokenAddressMap: TG7T, + chainId: L3_NETWORK.chainId }, ...storedTokensWithItems ] From 005741f635412a143b4aebdeae72c9db922ac68b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 29 Oct 2024 15:41:19 +0000 Subject: [PATCH 065/266] balance and est. gas fee :thumbs-up: --- .../world-builder-dashboard/package-lock.json | 9 +++--- .../components/bridge/bridge/BridgeView.tsx | 30 ++++++++----------- .../src/components/bridge/history/Deposit.tsx | 3 -- .../components/bridge/history/Withdrawal.tsx | 2 +- 4 files changed, 17 insertions(+), 27 deletions(-) diff --git a/webapps/world-builder-dashboard/package-lock.json b/webapps/world-builder-dashboard/package-lock.json index 6f75f0ad..c967c82e 100644 --- a/webapps/world-builder-dashboard/package-lock.json +++ b/webapps/world-builder-dashboard/package-lock.json @@ -15,7 +15,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.49", + "game7-bridge-sdk": "^0.0.51", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", @@ -41,7 +41,6 @@ "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.4.6", "eslint-plugin-tailwindcss": "^3.15.1", - "patch-package": "^8.0.0", "postcss": "^8.4.38", "postcss-preset-mantine": "^1.15.0", "postcss-simple-vars": "^7.0.1", @@ -6880,9 +6879,9 @@ } }, "node_modules/game7-bridge-sdk": { - "version": "0.0.49", - "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.49.tgz", - "integrity": "sha512-epMLzZ6ZqR0ADy/re+ZvwZcphl8+3l1vxhHtXX4cf5hI7EnoonxhZ6W8mJiP3LpQmcZwLZlfG9bkguf5etEIdw==", + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.51.tgz", + "integrity": "sha512-7xZ5rOLhMh0IBwtJI27nyIt90GymEEc/QBCKPxL2H7I8Fu7YgmV/EyS5QuFPhJhlHTskSy99cwboGT9FhruPqA==", "hasInstallScript": true, "dependencies": { "@arbitrum/sdk": "4.0.1", diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index b0eb18de..755ade54 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -6,7 +6,7 @@ import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from import styles from './BridgeView.module.css' import { ethers } from 'ethers' // G7 SDK -import { Bridger, BridgeToken } from 'game7-bridge-sdk' +import { BridgeNetwork, Bridger, BridgeToken } from 'game7-bridge-sdk' // Components import ActionButton from '@/components/bridge/bridge/ActionButton' import BridgeMessage from '@/components/bridge/bridge/BridgeMessage' @@ -33,10 +33,11 @@ const BridgeView = ({ }) => { let chainId let address - let tokenAddresses + let tokenAddresses const [bridger, setBridger] = useState() - const [balance, setBalance] = useState("") - const [symbol, setSymbol] = useState("") + + const [balance, setBalance] = useState('') + const [symbol, setSymbol] = useState('') const [value, setValue] = useState('0') const [message, setMessage] = useState<{ destination: string; data: string }>({ destination: '', data: '' }) const [isMessageExpanded, setIsMessageExpanded] = useState(false) @@ -55,7 +56,6 @@ const BridgeView = ({ selectedBridgeToken } = useBlockchainContext() - const { isFetching: isFetchingLowNetworkBalance } = useERC20Balance({ tokenAddress: selectedLowNetwork.g7TokenAddress, account: connectedAccount, @@ -82,18 +82,12 @@ const BridgeView = ({ const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) - tokenAddresses = token.tokenAddressMap; - chainId = token.chainId; - address = token.tokenAddressMap[chainId]; - tokenAddresses = token.tokenAddressMap - console.log({chainId, address, tokenAddresses}) - const bridgeToken = new BridgeToken(tokenAddresses, chainId) - console.log(bridgeToken) - // const tokenBalance = String(await bridgeToken.getBalance(token.rpc, token.address)) - // setBalance(tokenBalance) - // const symbol = await bridgeToken.getSymbol(token.rpc) - // setSymbol(symbol) - // console.log(symbol) + const bridgeToken: BridgeToken = new BridgeToken(token.tokenAddressMap, token.chainId) + const tokenBalance = String(await bridgeToken.getBalance(token.rpc, connectedAccount ?? "")) + console.log(token) + setBalance(String(ethers.utils.formatEther(tokenBalance))) + const symbol = await bridgeToken.getSymbol(token.rpc) + setSymbol(symbol) } const estimatedFee = useQuery( @@ -102,7 +96,7 @@ const BridgeView = ({ try { const fee = await bridger?.getGasAndFeeEstimation( value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0.0'), - selectedLowNetwork.rpcs[0], + direction==='DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], connectedAccount! ) const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '') diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index a21ae9c5..e91bac14 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -38,9 +38,6 @@ const Deposit: React.FC = ({ deposit }) => { depositDrilled.current = true }, [deposit]) - - - return ( <> {!transferStatus?.status ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index f352d539..7da907aa 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef, useState } from 'react' +import React, { useRef, useState } from 'react' import { useMutation, useQuery, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' From b35a9accbd6b8444e08500836004ae6614d66b4c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 29 Oct 2024 16:01:59 +0000 Subject: [PATCH 066/266] usequery for balance --- .../components/bridge/bridge/BridgeView.tsx | 63 ++++--------------- .../src/hooks/useBalance.ts | 30 +++++++++ 2 files changed, 43 insertions(+), 50 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/hooks/useBalance.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 755ade54..251c0554 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -6,7 +6,7 @@ import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from import styles from './BridgeView.module.css' import { ethers } from 'ethers' // G7 SDK -import { BridgeNetwork, Bridger, BridgeToken } from 'game7-bridge-sdk' +import { Bridger } from 'game7-bridge-sdk' // Components import ActionButton from '@/components/bridge/bridge/ActionButton' import BridgeMessage from '@/components/bridge/bridge/BridgeMessage' @@ -16,10 +16,9 @@ import ValueToBridge from '@/components/bridge/bridge/ValueToBridge' // Blockchain Context and Utility Functions import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useUISettings } from '@/contexts/UISettingsContext' +import useBalance from '@/hooks/useBalance' // Hooks and Constants -import useERC20Balance from '@/hooks/useERC20Balance' import useEthUsdRate from '@/hooks/useEthUsdRate' -import useNativeBalance from '@/hooks/useNativeBalance' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' @@ -31,13 +30,8 @@ const BridgeView = ({ direction: DepositDirection setDirection: (arg0: DepositDirection) => void }) => { - let chainId - let address - let tokenAddresses const [bridger, setBridger] = useState() - const [balance, setBalance] = useState('') - const [symbol, setSymbol] = useState('') const [value, setValue] = useState('0') const [message, setMessage] = useState<{ destination: string; data: string }>({ destination: '', data: '' }) const [isMessageExpanded, setIsMessageExpanded] = useState(false) @@ -56,38 +50,13 @@ const BridgeView = ({ selectedBridgeToken } = useBlockchainContext() - const { isFetching: isFetchingLowNetworkBalance } = useERC20Balance({ - tokenAddress: selectedLowNetwork.g7TokenAddress, + const { isFetching: isFetchingTokenInformation, data: tokenInformation } = useBalance({ account: connectedAccount, - rpc: selectedLowNetwork.rpcs[0] - }) - const { isFetching: isFetchingHighNetworkBalance } = useERC20Balance({ - tokenAddress: selectedHighNetwork.g7TokenAddress, - account: connectedAccount, - rpc: selectedHighNetwork.rpcs[0] - }) - const { isFetching: isFetchingL3NativeBalance } = useNativeBalance({ - account: connectedAccount, - rpc: L3_NETWORK.rpcs[0] - }) - const { data: lowNetworkNativeBalance } = useNativeBalance({ - account: connectedAccount, - rpc: selectedLowNetwork.rpcs[0] - }) - - const { data: highNetworkNativeBalance } = useNativeBalance({ - account: connectedAccount, - rpc: selectedHighNetwork.rpcs[0] + token: selectedBridgeToken }) const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) - const bridgeToken: BridgeToken = new BridgeToken(token.tokenAddressMap, token.chainId) - const tokenBalance = String(await bridgeToken.getBalance(token.rpc, connectedAccount ?? "")) - console.log(token) - setBalance(String(ethers.utils.formatEther(tokenBalance))) - const symbol = await bridgeToken.getSymbol(token.rpc) - setSymbol(symbol) } const estimatedFee = useQuery( @@ -96,7 +65,7 @@ const BridgeView = ({ try { const fee = await bridger?.getGasAndFeeEstimation( value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0.0'), - direction==='DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], + direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], connectedAccount! ) const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '') @@ -122,7 +91,7 @@ const BridgeView = ({ const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) setBridger(bridger) } - }, [selectedBridgeToken, balance, connectedAccount, selectedHighNetwork, selectedLowNetwork]) + }, [selectedBridgeToken, connectedAccount, selectedHighNetwork, selectedLowNetwork]) useEffect(() => { setNetworkErrorMessage('') @@ -202,19 +171,13 @@ const BridgeView = ({
setInputErrorMessages((prev) => ({ ...prev, value: msg }))} selectedChainId={direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId} @@ -235,7 +198,7 @@ const BridgeView = ({ )} {networkErrorMessage &&
{networkErrorMessage}
}
) diff --git a/webapps/world-builder-dashboard/src/hooks/useBalance.ts b/webapps/world-builder-dashboard/src/hooks/useBalance.ts new file mode 100644 index 00000000..1775d920 --- /dev/null +++ b/webapps/world-builder-dashboard/src/hooks/useBalance.ts @@ -0,0 +1,30 @@ +import { useQuery } from 'react-query' +import { ethers } from 'ethers' +import { BridgeToken } from 'game7-bridge-sdk' +import { Token } from '@/utils/tokens' + +interface UseBalanceProps { + account: string | undefined + token: Token +} + +const useBalance = ({ account, token }: UseBalanceProps) => { + return useQuery( + ['balance', account, token], + async () => { + if (!account) { + return { tokenBalance: '0', symbol: '' } + } + const bridgeToken: BridgeToken = new BridgeToken(token.tokenAddressMap, token.chainId) + const tokenBalance = String(ethers.utils.formatEther(await bridgeToken.getBalance(token.rpc, account ?? ''))) + const symbol = await bridgeToken.getSymbol(token.rpc) + return { tokenBalance, symbol } + }, + { + refetchInterval: 50000, + enabled: !!account && !!token + } + ) +} + +export default useBalance From e2c3ab2376b85723e97f03365899cc21e6a0fec5 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 29 Oct 2024 22:03:14 +0000 Subject: [PATCH 067/266] useTransferData --- .../src/components/bridge/history/Deposit.tsx | 25 ++-------- .../components/bridge/history/Withdrawal.tsx | 50 ++++--------------- .../src/hooks/useTransferData.ts | 34 +++++++++++++ 3 files changed, 50 insertions(+), 59 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/hooks/useTransferData.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index e91bac14..cc7e50d2 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,11 +1,12 @@ -import React, { useEffect, useRef, useState } from 'react' +import React from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' -import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' +import { BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' +import useTransferData from '@/hooks/useTransferData' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' @@ -14,33 +15,17 @@ interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { - const depositDrilled = useRef(false) const depositInfo = { from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const status = useDepositStatus(deposit) - const [transferStatus, setTransferStatus] = useState(deposit?.status) const smallView = useMediaQuery('(max-width: 1199px)') - - useEffect(() => { - if (!deposit || depositDrilled.current) return - const _bridgeTransfer = new BridgeTransfer({ - txHash: deposit.lowNetworkHash || '', - destinationNetworkChainId: deposit.highNetworkChainId ?? 0, - originNetworkChainId: deposit.lowNetworkChainId ?? 0 - }) - const getTransferData = async () => { - const _status = await _bridgeTransfer.getStatus() - setTransferStatus(_status) - } - getTransferData() - depositDrilled.current = true - }, [deposit]) + const { data: transferStatus, isLoading } = useTransferData({ txRecord: deposit }) return ( <> - {!transferStatus?.status ? ( + {isLoading ? ( !smallView ? ( Array.from(Array(7)).map((_, idx) => (
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 7da907aa..054880f3 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,5 +1,5 @@ -import React, { useRef, useState } from 'react' -import { useMutation, useQuery, useQueryClient } from 'react-query' +import React from 'react' +import { useMutation, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' @@ -11,6 +11,7 @@ import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' import WithdrawalMobile from '@/components/bridge/history/WithdrawalMobile' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' +import useTransferData from '@/hooks/useTransferData' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' @@ -57,40 +58,13 @@ export const getStatus = (withdrawal: TransactionRecord) => { } } const Withdrawal: React.FC = ({ withdrawal }) => { - const withdrawDrilled = useRef(false) const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK const status = getStatus(withdrawal) const { switchChain, connectedAccount } = useBlockchainContext() const queryClient = useQueryClient() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') - const [transferStatus, setTransferStatus] = useState() - - const fetchStatus = async (withdrawal: TransactionRecord) => { - const _bridgeTransfer = new BridgeTransfer({ - txHash: withdrawal.highNetworkHash || '', - destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, - originNetworkChainId: withdrawal.highNetworkChainId ?? 0 - }) - const status = await _bridgeTransfer.getStatus() - setTransferStatus(status) - return status - } - - useQuery(['withdrawalStatus', withdrawal], () => fetchStatus(withdrawal), { - enabled: !!withdrawal && !withdrawDrilled.current, - onSuccess: (newStatus) => { - queryClient.setQueryData(['withdrawalStatus', withdrawal], (oldData: any) => ({ - ...oldData, - status: newStatus - })) - withdrawDrilled.current = true - }, - onError: (error) => { - console.error('Error fetching status:', error) - } - }) - + const { data: transferStatus, isLoading } = useTransferData({ txRecord: withdrawal }) // Mutate function const execute = useMutation( async (highNetworkHash: string | undefined) => { @@ -146,12 +120,10 @@ const Withdrawal: React.FC = ({ withdrawal }) => { console.log(e) } refetchNewNotifications(connectedAccount ?? '') + queryClient.refetchQueries(['transferData']) queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) - queryClient.setQueryData(['withdrawalStatus', withdrawal], (oldData: any) => { - return { ...oldData, status: ChildToParentMessageStatus.EXECUTED } - }) // status.refetch() queryClient.refetchQueries(['pendingTransactions']) @@ -168,7 +140,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { return ( <> - {!transferStatus ? ( + {isLoading ? ( !smallView ? ( Array.from(Array(7)).map((_, idx) => (
@@ -191,7 +163,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <>
@@ -265,7 +237,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
)} - {transferStatus?.status != ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus.status != ChildToParentMessageStatus.EXECUTED && ( <>
@@ -277,7 +249,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{`${status.data?.amount} ${withdrawal.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
- {transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( <>
= ({ withdrawal }) => {
)} - {transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus && transferStatus.status === ChildToParentMessageStatus.UNCONFIRMED && ( <>
{ + return useQuery( + ['transferData', txRecord], + async () => { + if (!txRecord) { + return { ETA: 0, status: 0 } + } + const _bridgeTransfer = new BridgeTransfer({ + txHash: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkHash : txRecord.highNetworkHash) ?? '', + destinationNetworkChainId: + (txRecord.type === 'DEPOSIT' ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId) ?? 0, + originNetworkChainId: + (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 + }) + + const status = await _bridgeTransfer.getStatus() + return status + }, + { + refetchInterval: 50000, + enabled: !!txRecord + } + ) +} + +export default useTransferData From dd75478b1e5e716cad965d3f298bb53773c026b9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 30 Oct 2024 09:29:18 +0000 Subject: [PATCH 068/266] remove logs l --- .../components/notifications/NotificationsDropModal.tsx | 7 ------- 1 file changed, 7 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 984cd80f..89a2e303 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -164,13 +164,6 @@ const getTransactionUrl = (notification: BridgeNotification): string | undefined case 'WITHDRAWAL': chainId = status === 'COMPLETED' ? tx.lowNetworkChainId : tx.highNetworkChainId txHash = status === 'COMPLETED' ? tx.lowNetworkHash : tx.highNetworkHash - if (status === 'COMPLETED') { - console.log(tx) - console.log(chainId) - console.log(txHash) - const explorerUrl = getBlockExplorerUrl(chainId) - console.log(explorerUrl) - } break case 'CLAIM': chainId = tx.highNetworkChainId From e7613d4a8616c3b0179077d6c8d6627d1845abc7 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 30 Oct 2024 11:15:02 +0000 Subject: [PATCH 069/266] fix mobile view arrangements --- .../src/components/bridge/history/Deposit.tsx | 75 +++++----- .../bridge/history/DepositMobile.tsx | 134 ++++++++---------- .../bridge/history/HistoryMobile.tsx | 4 +- 3 files changed, 101 insertions(+), 112 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index cc7e50d2..edd41ffa 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,5 +1,6 @@ import React from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' +import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' @@ -39,45 +40,49 @@ const Deposit: React.FC = ({ deposit }) => { ) ) : ( <> -
-
- Deposit - -
-
-
{timeAgo(deposit.lowNetworkTimestamp)}
-
{`${deposit.amount} ${deposit.symbol}`}
-
{depositInfo.from}
-
{depositInfo.to}
- <> -
+ {smallView ? ( + + ) : ( + <>
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( -
- Completed - -
+
+ Deposit + +
+
+
{timeAgo(deposit.lowNetworkTimestamp)}
+
{`${deposit.amount} ${deposit.symbol}`}
+
{depositInfo.from}
+
{depositInfo.to}
+
+
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( +
+ Completed + +
+ ) : ( +
+ Pending + +
+ )} +
+
+
+ {status.data && status.data.highNetworkTimestamp ? ( +
{timeAgo(status.data.highNetworkTimestamp)}
) : ( -
- Pending - -
+
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
)}
- -
- {status.data && status.data.highNetworkTimestamp ? ( -
{timeAgo(status.data.highNetworkTimestamp)}
- ) : ( -
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
- )} -
- + + )} )} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index a57b8151..e0101aaf 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -1,112 +1,96 @@ -import React, { useEffect, useRef, useState } from 'react' +import React, { useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './DepositMobile.module.css' import parentStyles from './WithdrawTransactions.module.css' -import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' +import { BridgeTransferStatus } from 'game7-bridge-sdk' +import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' -import { Skeleton, useMediaQuery } from 'summon-ui/mantine' interface DepositMobileProps { deposit: TransactionRecord + transferStatus: any + isLoading: boolean } -const DepositMobile: React.FC = ({ deposit }) => { - const depositDrilled = useRef(false) +const DepositMobile: React.FC = ({ deposit, transferStatus, isLoading }) => { const [isCollapsed, setIsCollapsed] = useState(true) const status = useDepositStatus(deposit) - const [transferStatus, setTransferStatus] = useState(undefined) const depositInfo = { from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const smallView = useMediaQuery('(max-width: 1199px)') - - useEffect(() => { - if (!deposit || depositDrilled.current) return - const _bridgeTransfer = new BridgeTransfer({ - txHash: deposit.lowNetworkHash || '', - destinationNetworkChainId: deposit.highNetworkChainId ?? 0, - originNetworkChainId: deposit.lowNetworkChainId ?? 0 - }) - const getTransferData = async () => { - const _status = await _bridgeTransfer.getStatus() - setTransferStatus(_status) - } - getTransferData() - depositDrilled.current = true - }, [deposit]) - return ( <> - {!transferStatus?.status ? ( + {isLoading ? ( !smallView ? ( Array.from(Array(7)).map((_, idx) => (
- +
)) ) : (
- +
) - ): ( -
-
-
Deposit
-
{`${deposit.amount} ${deposit.symbol}`}
-
- {!isCollapsed && ( - <> - -
-
From
-
{depositInfo.from}
-
-
-
To
-
{depositInfo.to}
+ ) : ( +
+
+
Deposit
+
{`${deposit.amount} ${deposit.symbol}`}
+
+ {!isCollapsed && ( + <> + +
+
From
+
{depositInfo.from}
+
+
+
To
+
{depositInfo.to}
+
+ + )} +
+
Status
+
+ {status.data && status.data.highNetworkTimestamp ? ( +
{timeAgo(status.data.highNetworkTimestamp)}
+ ) : ( +
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
+ )}
- - )} -
-
Status
-
- {status.data && status.data.highNetworkTimestamp ? ( -
{timeAgo(status.data.highNetworkTimestamp)}
- ) : ( -
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
- )} +
+
setIsCollapsed(!isCollapsed)}> + {isCollapsed ? 'View more' : 'View less'}
-
setIsCollapsed(!isCollapsed)}> - {isCollapsed ? 'View more' : 'View less'} -
-
)} ) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx index d80ebb57..d1a61ded 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx @@ -1,10 +1,10 @@ import React from 'react' import styles from './HistoryMobile.module.css' -import DepositMobile from '@/components/bridge/history/DepositMobile' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' +import Deposit from './Deposit' interface HistoryMobileProps {} const HistoryMobile: React.FC = ({}) => { @@ -15,7 +15,7 @@ const HistoryMobile: React.FC = ({}) => {
{messages.data && messages.data.map((tx: TransactionRecord, idx: number) => - tx.type === 'DEPOSIT' ? : + tx.type === 'DEPOSIT' ? : )}
) From 978d384e0b2ff0f75846c5cfbf812eff59c0ec2a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 30 Oct 2024 11:52:54 +0000 Subject: [PATCH 070/266] Changed loading states --- .../src/components/bridge/history/Deposit.tsx | 81 ++++--- .../components/bridge/history/Withdrawal.tsx | 228 ++++++++++-------- 2 files changed, 165 insertions(+), 144 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index edd41ffa..fd3f2c0b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -26,18 +26,10 @@ const Deposit: React.FC = ({ deposit }) => { return ( <> - {isLoading ? ( - !smallView ? ( - Array.from(Array(7)).map((_, idx) => ( -
- -
- )) - ) : ( -
- -
- ) + {isLoading && smallView ? ( +
+ +
) : ( <> {smallView ? ( @@ -54,33 +46,46 @@ const Deposit: React.FC = ({ deposit }) => {
{`${deposit.amount} ${deposit.symbol}`}
{depositInfo.from}
{depositInfo.to}
- -
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( - - -
- {status.data && status.data.highNetworkTimestamp ? ( -
{timeAgo(status.data.highNetworkTimestamp)}
- ) : ( -
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
- )} -
+ +
+ {status.data && status.data.highNetworkTimestamp ? ( +
{timeAgo(status.data.highNetworkTimestamp)}
+ ) : ( +
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
+ )} +
+ + )} )} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 054880f3..d1c0b82a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -140,18 +140,10 @@ const Withdrawal: React.FC = ({ withdrawal }) => { return ( <> - {isLoading ? ( - !smallView ? ( - Array.from(Array(7)).map((_, idx) => ( -
- -
- )) - ) : ( -
- -
- ) + {isLoading && smallView ? ( +
+ +
) : ( <> {smallView ? ( @@ -163,10 +155,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + {isLoading ? ( <>
-
Withdraw @@ -177,122 +168,147 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status.data?.from ?? ''}
{status.data?.to ?? ''}
-
-
{timeAgo(status.data.lowNetworkTimeStamp)}
-
-
-
Initiate
-
-
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
- -
-
{timeAgo(status.data.lowNetworkTimeStamp)}
-
-
-
Finalize
-
-
{timeAgo(withdrawal?.completionTimestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
- -
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+ +
{' '} +
+
- )} - {transferStatus && transferStatus.status != ChildToParentMessageStatus.EXECUTED && ( + ) : ( <> -
-
- - Withdraw -
-
-
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
- {transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( + {' '} + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <> +
+ +
+ + Withdraw +
+
+
{timeAgo(status.data?.timestamp)}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{status.data?.from ?? ''}
+
{status.data?.to ?? ''}
- -
- +
+
{timeAgo(status.data.lowNetworkTimeStamp)}
- - )} - {transferStatus && transferStatus.status === ChildToParentMessageStatus.UNCONFIRMED && ( - <> -
+
+
Initiate
+
+
{timeAgo(status.data?.timestamp)}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{status.data?.from ?? ''}
+
{status.data?.to ?? ''}
+
- - -
-
{ETA(status.data?.timestamp, withdrawal.challengePeriod)} left
+
+
{timeAgo(status.data.lowNetworkTimeStamp)}
+
+
+
Finalize
+
+
{timeAgo(withdrawal?.completionTimestamp)}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{status.data?.from ?? ''}
+
{status.data?.to ?? ''}
+ +
+
{timeAgo(status.data.lowNetworkTimeStamp)}
)} + {transferStatus && transferStatus.status != ChildToParentMessageStatus.EXECUTED && ( + <> +
+
+ + Withdraw +
+
+
{timeAgo(status.data?.timestamp)}
+
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{status.data?.from ?? ''}
+
{status.data?.to ?? ''}
+ {transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( + <> + +
+ +
+ + )} + {transferStatus && transferStatus.status === ChildToParentMessageStatus.UNCONFIRMED && ( + <> + + +
+
{ETA(status.data?.timestamp, withdrawal.challengePeriod)} left
+
+ + )} + + )} )} From 44746ed9667d54744a12af72761ba295f5199fed Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 30 Oct 2024 12:19:18 +0000 Subject: [PATCH 071/266] loading --- .../src/components/bridge/history/Deposit.tsx | 8 +++---- .../history/WithdrawTransactions.module.css | 22 ++++++++++++++++++- .../components/bridge/history/Withdrawal.tsx | 9 ++++---- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index fd3f2c0b..e44645b3 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -3,7 +3,7 @@ import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' -import { Skeleton, useMediaQuery } from 'summon-ui/mantine' +import { useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' @@ -28,7 +28,7 @@ const Deposit: React.FC = ({ deposit }) => { <> {isLoading && smallView ? (
- +
Loading
) : ( <> @@ -49,10 +49,10 @@ const Deposit: React.FC = ({ deposit }) => { {isLoading ? ( <>
- +
Loading
{' '}
- +
Loading
) : ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index f3fd1f47..bd10bab4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -266,7 +266,8 @@ .pending, .claimable, -.settled { +.settled, +.loading { display: inline-flex; padding: 2px 6px 2px 8px; align-items: center; @@ -299,6 +300,25 @@ color: var(--Success-700, #027a48); } +@keyframes blink { + 0% { + background-color: #393939; + } + 50% { + background-color: #4f4f4f; + } + 100% { + background-color: #393939; + } +} + +.loading { + background: #393939; + gap: 4px; + padding: 2px 10px 2px 10px; + animation: blink 1s infinite; +} + .pending:hover { background: var(--Blue-100, #eff8ff); } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index d1c0b82a..e49ae20d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -4,7 +4,6 @@ import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' import { BridgeTransfer } from 'game7-bridge-sdk' -import { Skeleton } from 'summon-ui/mantine' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' @@ -142,7 +141,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { <> {isLoading && smallView ? (
- +
Loading
) : ( <> @@ -168,10 +167,10 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status.data?.from ?? ''}
{status.data?.to ?? ''}
- -
{' '} +
Loading
+
- +
Loading
) : ( From d9d26d8f68a4144b67cbed0d62152583572f306a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 31 Oct 2024 11:50:28 +0000 Subject: [PATCH 072/266] use History Transactions --- .../bridge/history/HistoryDesktop.tsx | 4 +++ .../components/bridge/history/Withdrawal.tsx | 2 ++ .../src/hooks/useBridgeAPI.ts | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 35a8876e..5445da23 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -6,6 +6,7 @@ import styles from './WithdrawTransactions.module.css' import Deposit from '@/components/bridge/history/Deposit' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBridgeAPI } from '@/hooks/useBridgeAPI' import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' @@ -14,6 +15,9 @@ const HistoryDesktop: React.FC = () => { const { connectedAccount } = useBlockchainContext() const messages = useMessages(connectedAccount) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] + + const { useHistoryTransactions } = useBridgeAPI() + return (
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index e49ae20d..3cf6c1f4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -10,6 +10,7 @@ import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' import WithdrawalMobile from '@/components/bridge/history/WithdrawalMobile' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' +import { useBridgeAPI } from '@/hooks/useBridgeAPI' import useTransferData from '@/hooks/useTransferData' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -64,6 +65,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') const { data: transferStatus, isLoading } = useTransferData({ txRecord: withdrawal }) + // Mutate function const execute = useMutation( async (highNetworkHash: string | undefined) => { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts new file mode 100644 index 00000000..2be04912 --- /dev/null +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts @@ -0,0 +1,33 @@ +import { useQuery } from 'react-query' +import { ethers } from 'ethers'; + +const BASE_URL = 'https://api.game7.build' + +export const useBridgeAPI = () => { + + const useHistoryTransactions = (address: string | undefined) => { + const isValidAddress = ethers.utils.isAddress(address ?? ""); + return useQuery( + ['historyTransactions', address], + async () => { + const res = await fetch(`https://api.game7.build/bridge/${address}/transactions?limit=30&offset=0`, { + method: 'GET', + }); + if (!res.ok) { + throw new Error(`Error: ${res.statusText}`); + } + const data = await res.json(); + return data; + }, + { + enabled: !!address && isValidAddress, + retry: false, + } + ); + }; + + + return { + useHistoryTransactions, + } +} From 8e06ae62d40b280a04cb7efdf6b9d4251b1b5ebd Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 31 Oct 2024 18:31:20 +0000 Subject: [PATCH 073/266] Catch bridger error --- .../components/bridge/bridge/BridgeView.tsx | 9 +++-- .../components/bridge/history/Withdrawal.tsx | 2 -- .../src/hooks/useTransferData.ts | 35 ++++++++++++++++++- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 251c0554..028b5d82 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -88,8 +88,13 @@ const BridgeView = ({ if (!chainIds.includes(String(destinationChainId))) { return } - const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) - setBridger(bridger) + try { + const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) + setBridger(bridger) + } catch (e) { + console.log(e) + setNetworkErrorMessage('Cannot bridge between these 2 networks') + } } }, [selectedBridgeToken, connectedAccount, selectedHighNetwork, selectedLowNetwork]) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 3cf6c1f4..e11bb5fc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -10,7 +10,6 @@ import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' import WithdrawalMobile from '@/components/bridge/history/WithdrawalMobile' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' -import { useBridgeAPI } from '@/hooks/useBridgeAPI' import useTransferData from '@/hooks/useTransferData' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -99,7 +98,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onSuccess: (data, highNetworkHash) => { try { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions = [] if (transactionsString) { transactions = JSON.parse(transactionsString) diff --git a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts index d4d76112..a8fe440b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts @@ -1,5 +1,6 @@ import { useQuery } from 'react-query' import { BridgeTransfer } from 'game7-bridge-sdk' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' interface UseTransferDataProps { @@ -7,12 +8,14 @@ interface UseTransferDataProps { } const useTransferData = ({ txRecord }: UseTransferDataProps) => { + const { connectedAccount } = useBlockchainContext() return useQuery( ['transferData', txRecord], async () => { if (!txRecord) { return { ETA: 0, status: 0 } } + const _bridgeTransfer = new BridgeTransfer({ txHash: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkHash : txRecord.highNetworkHash) ?? '', destinationNetworkChainId: @@ -20,12 +23,42 @@ const useTransferData = ({ txRecord }: UseTransferDataProps) => { originNetworkChainId: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 }) - const status = await _bridgeTransfer.getStatus() + + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactions = transactionsString ? JSON.parse(transactionsString) : [] + + const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + const hashComparison: boolean = + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + + if (hashComparison) { + return { ...t, status: status?.status } + } + return { ...t } + }) + localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) return status }, { + initialData: () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + if (transactionsString) { + const transactions = JSON.parse(transactionsString) + const cachedTransaction = transactions.find((t: TransactionRecord) => + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + ) + return cachedTransaction?.status ? { status: cachedTransaction.status } : { ETA: 0, status: 0 } + } + return { ETA: 0, status: 0 } + }, refetchInterval: 50000, + staleTime: 60 * 1000, + refetchOnWindowFocus: false, enabled: !!txRecord } ) From f8933a86e046a700c834e7e6519e383fbfc062d2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 31 Oct 2024 19:33:49 +0000 Subject: [PATCH 074/266] use correct gas symbol --- .../src/components/bridge/bridge/BridgeView.tsx | 16 ++++++++++------ .../src/hooks/useBalance.ts | 4 ++-- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 028b5d82..10c2fa6c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -16,7 +16,7 @@ import ValueToBridge from '@/components/bridge/bridge/ValueToBridge' // Blockchain Context and Utility Functions import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useUISettings } from '@/contexts/UISettingsContext' -import useBalance from '@/hooks/useBalance' +import useTokenInformation from '@/hooks/useBalance' // Hooks and Constants import useEthUsdRate from '@/hooks/useEthUsdRate' import { DepositDirection } from '@/pages/BridgePage/BridgePage' @@ -50,7 +50,7 @@ const BridgeView = ({ selectedBridgeToken } = useBlockchainContext() - const { isFetching: isFetchingTokenInformation, data: tokenInformation } = useBalance({ + const { isFetching: isFetchingTokenInformation, data: tokenInformation } = useTokenInformation({ account: connectedAccount, token: selectedBridgeToken }) @@ -176,7 +176,7 @@ const BridgeView = ({
{networkErrorMessage &&
{networkErrorMessage}
}
) diff --git a/webapps/world-builder-dashboard/src/hooks/useBalance.ts b/webapps/world-builder-dashboard/src/hooks/useBalance.ts index 1775d920..600fec48 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBalance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBalance.ts @@ -8,7 +8,7 @@ interface UseBalanceProps { token: Token } -const useBalance = ({ account, token }: UseBalanceProps) => { +const useTokenInformation = ({ account, token }: UseBalanceProps) => { return useQuery( ['balance', account, token], async () => { @@ -27,4 +27,4 @@ const useBalance = ({ account, token }: UseBalanceProps) => { ) } -export default useBalance +export default useTokenInformation From b2071ae4ba3ef1d463c84b3cb5f8458fc4398dd2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 31 Oct 2024 20:29:35 +0000 Subject: [PATCH 075/266] checkpoint on caching transfer data --- .../src/components/bridge/bridge/BridgeView.tsx | 11 ++++++----- .../src/components/bridge/history/Withdrawal.tsx | 3 ++- .../src/hooks/useTransferData.ts | 4 +++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 10c2fa6c..6fa0df06 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -60,14 +60,15 @@ const BridgeView = ({ } const estimatedFee = useQuery( - ['estimatedFee', bridger, connectedAccount], + ['estimatedFee', bridger, connectedAccount, value], async () => { try { const fee = await bridger?.getGasAndFeeEstimation( value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0.0'), direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], - connectedAccount! + connectedAccount ?? '' ) + console.log(fee) const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '') return feeFormatted } catch (e) { @@ -75,7 +76,7 @@ const BridgeView = ({ } }, { - enabled: !!connectedAccount && !!selectedLowNetwork && !!bridger + enabled: !!connectedAccount && !!selectedLowNetwork && !!selectedHighNetwork } ) @@ -218,8 +219,8 @@ const BridgeView = ({ tokenRate={g7tUsdRate.data ?? 0} gasTokenSymbol={ direction === 'DEPOSIT' - ? selectedLowNetwork?.nativeCurrency?.symbol ?? "" - : selectedHighNetwork?.nativeCurrency?.symbol ?? "" + ? (selectedLowNetwork?.nativeCurrency?.symbol ?? '') + : (selectedHighNetwork?.nativeCurrency?.symbol ?? '') } /> {networkErrorMessage &&
{networkErrorMessage}
} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index e11bb5fc..9392c44f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -109,7 +109,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { completionTimestamp: Date.now() / 1000, lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, - lowNetworkHash: data?.transactionHash + lowNetworkHash: data?.transactionHash, + status: data?.status || t.status } } return { ...t } diff --git a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts index a8fe440b..4f677e4e 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts @@ -52,7 +52,9 @@ const useTransferData = ({ txRecord }: UseTransferDataProps) => { ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) - return cachedTransaction?.status ? { status: cachedTransaction.status } : { ETA: 0, status: 0 } + if (cachedTransaction && cachedTransaction.status) { + return { ETA: 0, status: cachedTransaction.status } + } } return { ETA: 0, status: 0 } }, From 7733addb07a4c3a905be3afebc1c9e2c56673de9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 31 Oct 2024 20:55:22 +0000 Subject: [PATCH 076/266] return txRecord --- .../components/bridge/bridge/BridgeView.tsx | 1 - .../bridge/history/HistoryDesktop.tsx | 3 --- .../components/bridge/history/Withdrawal.tsx | 15 +++++------ .../src/hooks/useBridgeAPI.ts | 26 +++++++++---------- 4 files changed, 18 insertions(+), 27 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 6fa0df06..e8a74434 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -68,7 +68,6 @@ const BridgeView = ({ direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], connectedAccount ?? '' ) - console.log(fee) const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '') return feeFormatted } catch (e) { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5445da23..b7e9df95 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -6,7 +6,6 @@ import styles from './WithdrawTransactions.module.css' import Deposit from '@/components/bridge/history/Deposit' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { useBridgeAPI } from '@/hooks/useBridgeAPI' import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' @@ -16,8 +15,6 @@ const HistoryDesktop: React.FC = () => { const messages = useMessages(connectedAccount) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - const { useHistoryTransactions } = useBridgeAPI() - return (
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 9392c44f..a86dca6f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -92,16 +92,13 @@ const Withdrawal: React.FC = ({ withdrawal }) => { originNetworkChainId: withdrawal.highNetworkChainId ?? 0 }) const res = await _bridgeTransfer?.execute(signer) - return res + return {res, withdrawal} }, { - onSuccess: (data, highNetworkHash) => { + onSuccess: ({res, withdrawal}, highNetworkHash) => { try { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions = [] - if (transactionsString) { - transactions = JSON.parse(transactionsString) - } + let transactions = transactionsString ? JSON.parse(transactionsString) : [] const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { if (t.highNetworkHash === highNetworkHash) { return { @@ -109,8 +106,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { completionTimestamp: Date.now() / 1000, lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, - lowNetworkHash: data?.transactionHash, - status: data?.status || t.status + lowNetworkHash: res?.transactionHash, + status: res?.status || t.status } } return { ...t } @@ -120,7 +117,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { console.log(e) } refetchNewNotifications(connectedAccount ?? '') - queryClient.refetchQueries(['transferData']) + queryClient.refetchQueries(['transferData', withdrawal]) queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts index 2be04912..bd515b4e 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts @@ -1,33 +1,31 @@ import { useQuery } from 'react-query' -import { ethers } from 'ethers'; +import { ethers } from 'ethers' const BASE_URL = 'https://api.game7.build' export const useBridgeAPI = () => { - const useHistoryTransactions = (address: string | undefined) => { - const isValidAddress = ethers.utils.isAddress(address ?? ""); + const isValidAddress = ethers.utils.isAddress(address ?? '') return useQuery( ['historyTransactions', address], async () => { - const res = await fetch(`https://api.game7.build/bridge/${address}/transactions?limit=30&offset=0`, { - method: 'GET', - }); + const res = await fetch(`${BASE_URL}/bridge/${address}/transactions?limit=50&offset=0`, { + method: 'GET' + }) if (!res.ok) { - throw new Error(`Error: ${res.statusText}`); + throw new Error(`Error: ${res.statusText}`) } - const data = await res.json(); - return data; + const data = await res.json() + return data }, { enabled: !!address && isValidAddress, - retry: false, + retry: false } - ); - }; - + ) + } return { - useHistoryTransactions, + useHistoryTransactions } } From 73799dd7541cac4fa4241f01099994d95e096ed6 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Fri, 1 Nov 2024 14:18:01 +0300 Subject: [PATCH 077/266] feat: add index file for streamlined logo exports --- webapps/world-builder-dashboard/src/assets/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 webapps/world-builder-dashboard/src/assets/index.ts diff --git a/webapps/world-builder-dashboard/src/assets/index.ts b/webapps/world-builder-dashboard/src/assets/index.ts new file mode 100644 index 00000000..aa6c7a05 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/index.ts @@ -0,0 +1,6 @@ +export { default as HyperPlayLogo } from './HyperPlayLogo'; +export { default as SummonLogo } from './SummonLogo'; +export { default as ArbitrumLogo } from './ArbitrumLogo'; +export { default as ConduitLogo } from './ConduitLogo'; +export { default as MarketWarsLogo } from './MarketWarsLogo'; +export { default as SummonTextLogo } from './SummonTextLogo'; From e8e13c96f43f02281d8b860cd3ca1820ce1f6b9f Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Fri, 1 Nov 2024 14:21:37 +0300 Subject: [PATCH 078/266] refactor: landing - extract Navbar, MainSection, BenefitsSection, and AlliesSection into standalone components --- .../src/components/landing/AlliesSection.tsx | 22 + .../components/landing/BenefitsSection.tsx | 41 + .../src/components/landing/Landing.module.css | 850 ++++++++++++++++++ .../src/components/landing/MainSection.tsx | 41 + .../src/components/landing/Navbar.tsx | 88 ++ .../components/landing/NetworksEssentials.tsx | 73 ++ .../src/pages/LandingPage/LandingPage.tsx | 342 +------ 7 files changed, 1159 insertions(+), 298 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx create mode 100644 webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx create mode 100644 webapps/world-builder-dashboard/src/components/landing/Landing.module.css create mode 100644 webapps/world-builder-dashboard/src/components/landing/MainSection.tsx create mode 100644 webapps/world-builder-dashboard/src/components/landing/Navbar.tsx create mode 100644 webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx diff --git a/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx b/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx new file mode 100644 index 00000000..fc0e6a64 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import styles from './Landing.module.css'; +import { HyperPlayLogo, SummonLogo, SummonTextLogo, ArbitrumLogo, ConduitLogo, MarketWarsLogo } from '../../assets'; + +const AlliesSection: React.FC = () => { + return ( +
+
+
G7 Network allies
+
+
+
+
+
+
+
+
+
+ ); +}; + +export default AlliesSection; diff --git a/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx b/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx new file mode 100644 index 00000000..b25ea246 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import styles from './Landing.module.css'; + +const benefits = [ + { + title: "Build for gamers", + imageClass: styles.cardImageGamers, + description: "Bootstrap your game with access to 250k+ citizens and counting", + }, + { + title: "Fast and efficient", + imageClass: styles.cardImageLightningQuick, + description: "Lighting-quick transactions and low cost fees", + }, + { + title: "Special economic zone", + imageClass: styles.cardImageSpecialEcon, + description: "Access World Builder’s powerful developer tools", + }, +]; + +const BenefitsSection: React.FC = () => { + return ( +
+
+
Get all benefits of the G7 Network
+
+ {benefits.map((benefit, index) => ( +
+
{benefit.title}
+
+
{benefit.description}
+
+ ))} +
+
+
+ ); +}; + +export default BenefitsSection; diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css new file mode 100644 index 00000000..9c2e5861 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -0,0 +1,850 @@ +html, +body { + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.layout { + display: flex; + width: 100vw; + height: 100svh; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + background: #171717; + cursor: url('../../assets/cursor.svg'), auto; + overflow: hidden; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.layout.darkened { + background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent dark overlay */ + pointer-events: none; /* Prevent interactions with the background */ +} + +.navbarContainer { + display: flex; + max-width: 1920px; + padding: 4px 0px; + flex-direction: column; + align-items: center; + align-self: stretch; +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; +} + +.navbarItemsContainer { + display: flex; + align-items: center; + gap: 12px; +} + +.navbarItems { + display: flex; + align-items: center; + gap: 4px; +} + +.navbarItem { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + border-radius: 6px; + color: #d5d5d5; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.navbarItemHome { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + border-radius: 6px; + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; /* 150% */ +} + +.navbarCTA { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 16px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #f04438; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 600; + line-height: 20px; +} + +.logoWrapper { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + align-items: center; + gap: 12px; +} + +.themeSwitchButton { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + width: 40px; + height: 40px; + padding: 8px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid var(--Gray-300, #d0d5dd); +} + +.mainLayout { + position: relative; + display: flex; + padding: 40px; + flex-direction: column; + justify-content: start; + align-items: center; + gap: 200px; + flex: 1 0 0; + align-self: stretch; + border-radius: 12px; + border: 1px solid #727272; + background: url('../../assets/G7LandingPageBGDark.jpg') lightgray 50% / cover no-repeat; + overflow-y: scroll; + padding: 40px; + scrollbar-width: none; + -ms-overflow-style: none; + transition: justify-content 0.3s ease; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.mainLayoutStart { + justify-content: start; +} + +.titleContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; +} + +.titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 120px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -4px; + text-transform: uppercase; +} + +.subtitleText { + color: #b9b9b9; + text-align: center; + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; + align-self: stretch; +} + +.ctaContainer { + display: flex; + justify-content: center; + align-items: flex-start; + gap: 16px; +} + +.learnMoreCTA { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #393939; + background: rgba(11, 11, 11, 0.7); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #b9b9b9; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.learnMoreCTA:hover { + display: inline-flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #0b0b0b; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + background: linear-gradient(173deg, #f04438 -3.52%, #fff 129.23%); + background-clip: text; +} + +.startBuildingCTA { + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #f04438; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.startBuildingCTA:hover { + display: inline-flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + background: linear-gradient(147deg, #f04438 11.16%, #fff 142.48%); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + +.scrollbarContainer { + display: flex; + height: calc(100% - 16px); + /* max-width: 940px; */ + padding: 8px 6px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 16px; + border-radius: 100px; + background: #171717; + position: absolute; + right: 6px; +} + +.scrollBar { + height: 100px; + width: 6px; + background-color: #393939; + border-radius: 100px; + position: relative; + overflow: hidden; + flex: 1 0 0; +} + +.scrollBarFill { + width: 100%; /* Full width */ + height: 0%; /* Start at 0% height */ + background-color: #f04438; + border-radius: 100px; + transition: height 0.25s ease-in-out; + flex: 1 0 0; +} + +.scrollBarsContainer { + display: flex; + flex-direction: column; + gap: 10px; +} + +.pill { + display: flex; + height: 28px; + padding: var(--4px, 4px) var(--8px, 8px); + justify-content: center; + align-items: center; + gap: var(--4px, 4px); + border-radius: 16px; + border: 1px solid #b9b9b9; + background: rgba(23, 23, 23, 0.8); + color: #b9b9b9; + text-align: center; + + /* Body 2/Medium */ + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 20px; /* 142.857% */ +} + +.contentContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + align-self: stretch; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; +} + +.sectionTitle { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 48px; + font-style: normal; + font-weight: 700; + line-height: 60px; /* 125% */ + letter-spacing: -0.96px; +} + +.cards { + display: flex; + justify-content: center; + align-items: flex-start; + align-content: flex-start; + gap: 24px; + flex-wrap: wrap; +} + +.card { + display: flex; + width: 100%; + max-width: 400px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + border-radius: 24px; + border: 1px solid #727272; + background: #171717; + height: 100%; + max-height: 426px; + flex: 1 0 0; +} + +.cardTitle { + color: #f9fafb; + + /* Display xs Medium */ + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; /* 133.333% */ +} + +.cardImage { + height: 178px; + align-self: stretch; + border-radius: 12px; + border: 1px solid #393939; +} + +.cardImageGamers { + background: url('../../assets/G7ReachGamersDark.jpg') lightgray 50% / cover no-repeat; +} + +.cardImageLightningQuick { + background: url('../../assets/G7LightningQuickDark.jpg') lightgray 50% / cover no-repeat; +} + +.cardImageSpecialEcon { + background: url('../../assets/G7SpecialEconZoneDark.jpg') lightgray 50% / cover no-repeat; +} + +.cardDescription { + display: flex; + padding: 24px; + flex-direction: column; + align-items: center; + gap: var(--20px, 20px); + align-self: stretch; + color: #b9b9b9; + text-align: center; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: 28px; /* 155.556% */ + border-radius: 12px; + border: 1px solid #727272; + flex-grow: 1; + justify-content: center; +} + +.sponsorCards { + display: flex; + justify-content: center; + align-items: center; + align-content: center; + gap: 24px; + flex-wrap: wrap; +} + +.sponsorCard { + display: flex; + height: 120px; + width: 220px; + padding: 31.231px 37.218px 31.257px 37.75px; + justify-content: center; + align-items: center; + border-radius: 12px; + border: 1px solid #727272; + background: #171717; + backdrop-filter: blur(0.6990200281143188px); +} + +.sponsorCardImage { + display: flex; + padding: 8.627px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 4.313px; +} + +.summonLogoContainer { + display: flex; + height: 28px; + padding: 0px 5.637px 0px 0.734px; + align-items: flex-start; + gap: 14.826px; + flex-shrink: 0; +} + +.networkEssentialCards { + display: flex; + align-items: flex-start; + gap: 24px; + align-self: stretch; + justify-content: center; + scrollbar-width: none; + flex-wrap: wrap; +} + +.networkEssentialCards::-webkit-scrollbar { + display: none; +} + +.networkEssentialCard { + display: flex; + width: 100%; + max-width: 340px; + height: 422px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + border-radius: 24px; + background: #0b0b0b; + border: 1px solid #727272; +} + +.networkEssentialCard:hover { + cursor: url('../../assets/hand.svg'), pointer; + border: 1px solid #f04438; +} + +.networkEssentialCardImage { + width: 292px; + height: 178px; + cursor: url('../../assets/hand.svg'), pointer; + border-radius: 12px; + border: 1px solid #393939; + height: 178px; + align-self: stretch; + width: 100%; +} + +.networkEssentialFaucet { + background: url('../../assets/G7FaucetCardDark.jpg') 50% / cover no-repeat; + background-size: contain; +} + +.networkEssentialBridge { + background: url('../../assets/G7BridgeCardDark.jpg') 50% / cover no-repeat;; + background-size: contain; +} + +.networkEssentialExplorer { + background: url('../../assets/G7ExplorerCardDark.jpg') 50% / cover no-repeat;; + background-size: contain; +} + +.networkEssentialDocs { + background: url('../../assets/G7DocsCardDark.jpg') 50% / cover no-repeat;; + background-size: contain; +} + +.networkEssentialDiscord { + background: url('../../assets/G7DiscordCardDark.jpg') 50% / cover no-repeat; + background-size: contain; +} + +.networkEssentialCardText { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + align-self: stretch; + cursor: url('../../assets/hand.svg'), pointer; +} + +.networkEssentialCardTitle { + color: #f9fafb; + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; /* 133.333% */ + cursor: url('../../assets/hand.svg'), pointer; +} + +.networkEssentialCardDescription { + color: #b9b9b9; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: 28px; + cursor: url('../../assets/hand.svg'), pointer; +} + +.firstSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + height: var(--Landing-Page-First-Section-Height-Tablet); + flex: 1 0 auto; +} + +.secondSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + flex: 1 0 auto; +} + +.thirdSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + flex: 1 0 auto; +} + + + +@media (max-width: 1199px) { + .layout { + display: flex; + padding: 16px; + flex-direction: column; + align-items: center; + gap: 16px; + } + + .mainLayout { + display: flex; + height: fit-content; + padding: 30px 24px; + flex-direction: column; + align-items: center; + flex: 1 0 0; + justify-content: start; + } + + .contentContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + } + + .titleContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + padding: 0px; + } + + .titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 72px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -2px; + text-transform: uppercase; + } + + .firstSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + height: var(--Landing-Page-First-Section-Height-Tablet); + flex: 1 0 auto; + } + + .secondSection { + display: flex; + flex-direction: column; + /* justify-content: center; */ + align-items: center; + align-self: stretch; + /* height: var(--Landing-Page-First-Section-Height-Tablet); */ + flex: 1 0 auto; + } + + .thirdSection { + display: flex; + flex-direction: column; + align-items: center; + align-self: stretch; + } + .fourthSection { + display: flex; + flex-direction: column; + align-items: center; + align-self: stretch; + } + + .card { + display: flex; + width: 340px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + width: 100%; + min-width: 300px; + } +} + +@media (max-width: 750px) { + .sectionTitle { + font-size: 30px; + line-height: 38px; + } + + .card { + width: 100%; + max-width: 340px; + display: flex; + padding: 16px; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + height: inherit; + } + + .navbarItem { + display: flex; + padding: 8px; + justify-content: center; + align-items: center; + gap: 8px; + } + + .titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 48px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -2px; + text-transform: uppercase; + } + + .startBuildingCTA { + width: 100%; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + /* flex: 1 0 0; */ + border-radius: 8px; + border: 1px solid var(--color-error-Error-500, #f04438); + background: var(--color-error-Error-500, #f04438); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + } + + .navbarContainer { + z-index: 1000; + } + + .navContainer { + padding-top: 100px; + position: fixed; /* Make the menu overlay the entire screen */ + top: 72px; + left: 0; + width: 100vw; /* Full width */ + background-color: rgba(0, 0, 0, 0.75); + z-index: 1000; /* Ensure it's on top */ + padding: 24px 24px 24px 24px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + } + + .navItem { + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + color: #d5d5d5; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + } + + .navItemHome { + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + } + + .ctaContainer { + display: flex; + padding-top: 32px; + flex-direction: column; + align-items: flex-start; + gap: 4px; + align-self: stretch; + } + + .layoutBlur::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.75); + z-index: 999; + } + + .layout { + padding: 16px; + } + + .networkEssentialCards { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + justify-content: center; + flex-wrap: wrap; + } + + .networkEssentialCard { + max-width: 340px; + } + + .contentContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + justify-content: space-between; + } + + .mainLayout { + display: flex; + gap: 80px; + padding: 24px; + flex-direction: column; + align-items: center; + flex: 1 0 0; + align-self: stretch; + justify-content: start; + } + + .scrollbarContainer { + position: fixed; + right: 23px; + height: calc(100% - 180px); + } + + .firstSection { + height: var(--Landing-Page-First-Section-Height-Phone); + } +} diff --git a/webapps/world-builder-dashboard/src/components/landing/MainSection.tsx b/webapps/world-builder-dashboard/src/components/landing/MainSection.tsx new file mode 100644 index 00000000..30efec54 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/MainSection.tsx @@ -0,0 +1,41 @@ +import React from 'react'; +import styles from './Landing.module.css'; + +interface MainSectionProps { + smallView: boolean; + startBuilding: () => void; +} + +const MainSection: React.FC = ({ smallView, startBuilding }) => { + return ( +
+
+
DEVHUB
+
+
Build Your Game
+
Be a part of the future of gaming
+
+ {!smallView && ( +
+
+ window.open( + 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder', + '_blank' + ) + } + > + Learn more +
+
+ Start building +
+
+ )} +
+
+ ); +}; + +export default MainSection; diff --git a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx new file mode 100644 index 00000000..e1dbb0b4 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx @@ -0,0 +1,88 @@ +// Navbar.tsx +import React from 'react'; +import { useNavigate } from 'react-router-dom'; +import styles from './Landing.module.css'; +import IconGame7Logo from '@/assets/IconGame7Logo'; +import IconGame7 from '@/assets/IconGame7'; +import IconHamburgerLanding from '@/assets/IconHamburgerLanding'; + +interface NavbarProps { + navbarOpen: boolean; + smallView: boolean; + setNavBarOpen: React.Dispatch>; + startBuilding: () => void; + navigateLink: (item: any) => void; +} + +const NAVBAR_ITEMS = [ + { name: 'Home', link: '/' }, + { name: 'Faucet', link: 'faucet' }, + { name: 'Bridge', link: 'bridge' }, + { name: 'Community', link: 'https://discord.com/invite/g7dao' }, + { + name: 'Docs', + link: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder' + } +]; + +const Navbar: React.FC = ({ navbarOpen, smallView, setNavBarOpen, startBuilding, navigateLink }) => { + const navigate = useNavigate(); + + return ( + <> + {/* Main Navbar */} +
+
+
navigate('/')}> + + +
+
+ {!smallView ? ( +
+ {NAVBAR_ITEMS.map((item, index) => ( +
navigateLink(item)} + > + {item.name} +
+ ))} +
+ Start building +
+
+ ) : ( +
+ setNavBarOpen(!navbarOpen)} /> +
+ )} +
+
+
+ + {/* Expanded Navbar for small view */} + {navbarOpen && smallView && ( +
+ {NAVBAR_ITEMS.map((item, index) => ( +
navigateLink(item)} + > + {item.name} +
+ ))} +
+
+ Start building +
+
+
+ )} + + ); +}; + +export default Navbar; diff --git a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx new file mode 100644 index 00000000..78366b56 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx @@ -0,0 +1,73 @@ +import React from 'react'; +import styles from './Landing.module.css'; +import { useNavigate } from 'react-router-dom'; + +interface NetworkEssentialsProps { + smallView: boolean; + startBuilding: () => void; +} + +const essentials = [ + { + title: "Faucet", + description: "Get testnet tokens to start building on G7 Sepolia", + imageClass: styles.networkEssentialFaucet, + onClick: (navigate: (path: string) => void) => navigate('/faucet'), + }, + { + title: "Bridge", + description: "Bridge tokens between Ethereum, Arbitrum and the G7 network", + imageClass: styles.networkEssentialBridge, + onClick: (navigate: (path: string) => void) => navigate('/bridge'), + }, + { + title: "Block explorer", + description: "Track and interact directly with your smart contracts", + imageClass: styles.networkEssentialExplorer, + onClick: () => window.open('https://testnet.game7.io/', '_blank'), + }, + { + title: "Docs", + description: "Get more information about building in the G7 Network", + imageClass: styles.networkEssentialDocs, + onClick: () => window.open('https://wiki.game7.io/g7-developer-resource/', '_blank'), + }, + { + title: "Discord", + description: "Join our community of builders on Discord", + imageClass: styles.networkEssentialDiscord, + onClick: () => window.open('https://discord.com/invite/g7dao', '_blank'), + }, +]; + +const NetworkEssentials: React.FC = ({ smallView, startBuilding }) => { + const navigate = useNavigate(); + + return ( +
+
Start building with the network essentials
+
+ {essentials.map((essential, index) => ( +
essential.onClick(navigate)} + key={index} + > +
+
+
{essential.title}
+
{essential.description}
+
+
+ ))} +
+ {!smallView && ( +
+ Start building +
+ )} +
+ ); +}; + +export default NetworkEssentials; diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index f5c81973..3151caa1 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -1,309 +1,55 @@ -import React, { useState } from 'react' -import { useNavigate } from 'react-router-dom' -import styles from './LandingPage.module.css' -import { useMediaQuery } from 'summon-ui/mantine' -import ArbitrumLogo from '@/assets/ArbitrumLogo' -import ConduitLogo from '@/assets/ConduitLogo' -import HyperPlayLogo from '@/assets/HyperPlayLogo' -import IconGame7 from '@/assets/IconGame7' -import IconGame7Logo from '@/assets/IconGame7Logo' -import IconHamburgerLanding from '@/assets/IconHamburgerLanding' -import MarketWarsLogo from '@/assets/MarketWarsLogo' -import SummonLogo from '@/assets/SummonLogo' -import SummonTextLogo from '@/assets/SummonTextLogo' +// LandingPage.tsx +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import styles from './LandingPage.module.css'; +import { useMediaQuery } from 'summon-ui/mantine'; +import MainSection from "@/components/landing/MainSection"; +import BenefitsSection from "@/components/landing/BenefitsSection"; +import AlliesSection from "@/components/landing/AlliesSection"; +import NetworkEssentials from "@/components/landing/NetworksEssentials"; +import Navbar from "@/components/landing/Navbar"; + +const LandingPage: React.FC = () => { + const navigate = useNavigate(); + const [navbarOpen, setNavBarOpen] = useState(false); + const smallView = useMediaQuery('(max-width: 750px)'); -interface LandingPageProps {} - -const LandingPage: React.FC = () => { - const NAVBAR_ITEMS = [ - { name: 'Home', link: '/' }, - { name: 'Faucet', link: 'faucet' }, - { name: 'Bridge', link: 'bridge' }, - { name: 'Community', link: 'https://discord.com/invite/g7dao' }, - { - name: 'Docs', - link: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder' - } - ] - const navigate = useNavigate() - const [navbarOpen, setNavBarOpen] = useState(false) - const smallView = useMediaQuery('(max-width: 750px)') const startBuilding = () => { - navigate('/faucet') - } + navigate('/faucet'); + }; const navigateLink = (item: any) => { - item.name !== 'Docs' && item.name !== 'Community' ? navigate(`/${item.link}`) : window.open(item.link, '_blank') - } + item.name !== 'Docs' && item.name !== 'Community' + ? navigate(`/${item.link}`) + : window.open(item.link, '_blank'); + }; return ( - <> -
- {/* NAVBAR */} - {!navbarOpen && ( -
-
-
navigate('/')}> - - -
-
- {!smallView ? ( -
- {NAVBAR_ITEMS.map((item, index) => ( -
navigateLink(item)} - > - {item.name} -
- ))} -
- Start building -
-
- ) : ( - <> -
- setNavBarOpen(!navbarOpen)} /> -
- - )} -
-
-
- )} + <> +
+ - {navbarOpen && smallView && ( - <> -
-
-
navigate('/')}> - - -
-
- {!smallView ? ( -
- {NAVBAR_ITEMS.map((item, index) => ( -
navigateLink(item)} - > - {item.name} -
- ))} -
- Start building -
-
- ) : ( - <> -
- setNavBarOpen(!navbarOpen)} /> -
- - )} -
-
-
-
- {NAVBAR_ITEMS.map((item, index) => ( -
navigateLink(item)} - > - {item.name} -
- ))} -
-
- Start building -
-
-
- - )} - {
- {/* Main */} -
-
-
-
DEVHUB
-
-
Build Your Game
-
Be a part of the future of gaming
-
- {!smallView && ( -
-
- window.open( - 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder', - '_blank' - ) - } - > - Learn more -
-
- Start building -
-
- )} -
-
-
- {/* G7 Benefits */} -
-
-
Get all benefits of the G7 Network
-
-
-
Build for gamers
-
-
- Bootstrap your game with access to 250k+ citizens and counting -
-
-
-
Fast and efficient
-
-
Lighting-quick transactions and low cost fees
-
-
-
Special economic zone
-
-
Access World Builder’s powerful developer tools
-
-
-
-
- {/* Nation Allies */} -
-
-
G7 Network allies
-
-
-
- -
-
-
-
-
- - -
-
-
-
-
- -
-
-
-
- -
-
-
-
- -
-
-
-
-
- - {/* Network Essential Cards */} -
-
Start building with the network essentials
-
-
navigate('/faucet')}> -
-
-
Faucet
-
- Get testnet tokens to start building on G7 Sepolia -
-
-
-
navigate('/bridge')}> -
-
-
Bridge
-
- Bridge tokens between Ethereum, Arbitrum and the G7 network -
-
-
-
window.open('https://testnet.game7.io/', '_blank')} - > -
-
-
Block explorer
-
- Track and interact directly with your smart contracts -
-
-
-
- window.open( - 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder', - '_blank' - ) - } - > -
-
-
Docs
-
- Get more information about building in the G7 Network -
-
-
-
window.open('https://discord.com/invite/g7dao', '_blank')} - > -
-
-
Discord
-
- Join our community of builders on Discord -
-
-
-
- {!smallView && ( -
- Start building -
- )} -
+ + + +
- } - {smallView ? ( -
- Start building -
- ) : ( - <> - )} -
- - ) -} + {smallView && ( +
+ Start building +
+ )} +
+ + ); +}; -export default LandingPage +export default LandingPage; From e7714ee1c3eceaa89f909b4004fb87aa19d1f683 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 1 Nov 2024 12:30:46 +0000 Subject: [PATCH 079/266] API data ingest --- .../bridge/history/HistoryDesktop.tsx | 43 +++++++++++++++---- .../components/bridge/history/Withdrawal.tsx | 5 ++- .../src/hooks/useTransferData.ts | 1 + 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index b7e9df95..24b2f641 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -2,10 +2,12 @@ import React, { Fragment } from 'react' // Styles import styles from './WithdrawTransactions.module.css' +import { ethers } from 'ethers' // Absolute Imports import Deposit from '@/components/bridge/history/Deposit' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBridgeAPI } from '@/hooks/useBridgeAPI' import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' @@ -15,6 +17,27 @@ const HistoryDesktop: React.FC = () => { const messages = useMessages(connectedAccount) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] + const { useHistoryTransactions } = useBridgeAPI() + const { data: apiTransactions } = useHistoryTransactions(connectedAccount) + const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { + const amountFormatted = apiData?.amount ? ethers.utils.formatEther(apiData.amount) : '0.0' + return { + type: apiData.type, + amount: amountFormatted, + lowNetworkChainId: apiData.parentNetworkChainId, + highNetworkChainId: apiData.childNetworkChainId, + lowNetworkHash: apiData.parentNetworkHash, + highNetworkHash: apiData.childNetworkHash, + lowNetworkTimestamp: apiData.parentNetworkTimestamp, + highNetworkTimestamp: apiData.childNetworkTimestamp, + completionTimestamp: apiData.completionTimestamp, + claimableTimestamp: apiData.claimableTimestamp, + challengePeriod: apiData.challengePeriod + } + } + + // Transform API transactions into TransactionRecord format + const transactions = apiTransactions?.map((apiTx: any) => mapAPIDataToTransactionRecord(apiTx)) || [] return (
@@ -26,15 +49,19 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {messages.data - .filter((tx) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') - .map((tx: TransactionRecord, idx: number) => - tx.type === 'WITHDRAWAL' ? ( - - ) : ( - {tx.lowNetworkHash && } + {transactions ? ( + transactions + .filter((tx: any) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + .map((tx: TransactionRecord, idx: number) => + tx.type === 'WITHDRAWAL' ? ( + + ) : ( + {tx.lowNetworkHash && } + ) ) - )} + ) : ( + <> + )} {messages.data.filter((tx) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL').length === 0 && (
No transactions yet
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index a86dca6f..eb01bbdc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -43,6 +43,10 @@ export const getStatus = (withdrawal: TransactionRecord) => { : ChildToParentMessageStatus.UNCONFIRMED const lowNetwork = LOW_NETWORKS.find((n) => n.chainId === lowNetworkChainId) const highNetwork = HIGH_NETWORKS.find((n) => n.chainId === highNetworkChainId) + console.log(lowNetworkChainId) + console.log(highNetworkChainId) + console.log(LOW_NETWORKS) + console.log(HIGH_NETWORKS) if (lowNetwork && highNetwork) { const data = { status, @@ -121,7 +125,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) - // status.refetch() queryClient.refetchQueries(['pendingTransactions']) }, diff --git a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts index 4f677e4e..14864a16 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts @@ -23,6 +23,7 @@ const useTransferData = ({ txRecord }: UseTransferDataProps) => { originNetworkChainId: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 }) + console.log(_bridgeTransfer) const status = await _bridgeTransfer.getStatus() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) From f5557687ea93546b220654e713bcf20b9a049a03 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 1 Nov 2024 13:21:51 +0000 Subject: [PATCH 080/266] Get symbol --- .../src/components/bridge/history/Deposit.tsx | 11 +++++++- .../components/bridge/history/Withdrawal.tsx | 25 ++++++++++--------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index e44645b3..9a34fe4d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -11,6 +11,7 @@ import useTransferData from '@/hooks/useTransferData' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' +import { useBlockchainContext } from '@/contexts/BlockchainContext' interface DepositProps { deposit: TransactionRecord @@ -23,6 +24,14 @@ const Deposit: React.FC = ({ deposit }) => { const status = useDepositStatus(deposit) const smallView = useMediaQuery('(max-width: 1199px)') const { data: transferStatus, isLoading } = useTransferData({ txRecord: deposit }) + const {connectedAccount} = useBlockchainContext() + + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + let transactions = transactionsString ? JSON.parse(transactionsString) : [] + const localStorageTransaction = transactions.find( + (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash + ) + console.log(localStorageTransaction) return ( <> @@ -43,7 +52,7 @@ const Deposit: React.FC = ({ deposit }) => {
{timeAgo(deposit.lowNetworkTimestamp)}
-
{`${deposit.amount} ${deposit.symbol}`}
+
{`${deposit.amount} ${localStorageTransaction?.symbol}`}
{depositInfo.from}
{depositInfo.to}
{isLoading ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index eb01bbdc..f7fc4e8d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -43,10 +43,6 @@ export const getStatus = (withdrawal: TransactionRecord) => { : ChildToParentMessageStatus.UNCONFIRMED const lowNetwork = LOW_NETWORKS.find((n) => n.chainId === lowNetworkChainId) const highNetwork = HIGH_NETWORKS.find((n) => n.chainId === highNetworkChainId) - console.log(lowNetworkChainId) - console.log(highNetworkChainId) - console.log(LOW_NETWORKS) - console.log(HIGH_NETWORKS) if (lowNetwork && highNetwork) { const data = { status, @@ -69,6 +65,12 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const smallView = useMediaQuery('(max-width: 1199px)') const { data: transferStatus, isLoading } = useTransferData({ txRecord: withdrawal }) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + let transactions = transactionsString ? JSON.parse(transactionsString) : [] + const localStorageTransaction = transactions.find( + (t: any) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash + ) + // Mutate function const execute = useMutation( async (highNetworkHash: string | undefined) => { @@ -96,10 +98,10 @@ const Withdrawal: React.FC = ({ withdrawal }) => { originNetworkChainId: withdrawal.highNetworkChainId ?? 0 }) const res = await _bridgeTransfer?.execute(signer) - return {res, withdrawal} + return { res, withdrawal } }, { - onSuccess: ({res, withdrawal}, highNetworkHash) => { + onSuccess: ({ res, withdrawal }, highNetworkHash) => { try { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -125,7 +127,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) - // status.refetch() queryClient.refetchQueries(['pendingTransactions']) }, onError: (error: Error) => { @@ -164,7 +165,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -187,7 +188,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -209,7 +210,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
Initiate
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -231,7 +232,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
Finalize
{timeAgo(withdrawal?.completionTimestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -260,7 +261,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${withdrawal.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
{transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( From 3ebb6b2bbb091e2a924e67ebf94b24999e3916e9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 1 Nov 2024 19:30:10 +0000 Subject: [PATCH 081/266] caching successful --- .../src/components/bridge/bridge/BridgeView.tsx | 2 +- .../src/components/bridge/history/Deposit.tsx | 1 - .../src/components/bridge/history/HistoryDesktop.tsx | 5 ++--- .../src/components/bridge/history/Withdrawal.tsx | 7 ++++--- .../src/hooks/useL2ToL1MessageStatus.ts | 8 +++++--- .../world-builder-dashboard/src/hooks/useTransferData.ts | 4 ++-- 6 files changed, 14 insertions(+), 13 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index e8a74434..19b44e73 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -75,7 +75,7 @@ const BridgeView = ({ } }, { - enabled: !!connectedAccount && !!selectedLowNetwork && !!selectedHighNetwork + enabled: !!connectedAccount && !!selectedLowNetwork && !!selectedHighNetwork && !!value } ) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 9a34fe4d..4119a18d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -31,7 +31,6 @@ const Deposit: React.FC = ({ deposit }) => { const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) - console.log(localStorageTransaction) return ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 24b2f641..91baf6fd 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -35,7 +35,6 @@ const HistoryDesktop: React.FC = () => { challengePeriod: apiData.challengePeriod } } - // Transform API transactions into TransactionRecord format const transactions = apiTransactions?.map((apiTx: any) => mapAPIDataToTransactionRecord(apiTx)) || [] return ( @@ -49,8 +48,8 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {transactions ? ( - transactions + {messages.data ? ( + messages.data .filter((tx: any) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .map((tx: TransactionRecord, idx: number) => tx.type === 'WITHDRAWAL' ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index f7fc4e8d..d112fb80 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -3,7 +3,7 @@ import { useMutation, useQueryClient } from 'react-query' import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' -import { BridgeTransfer } from 'game7-bridge-sdk' +import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' @@ -68,7 +68,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( - (t: any) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash + (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) // Mutate function @@ -113,7 +113,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, lowNetworkHash: res?.transactionHash, - status: res?.status || t.status + status: BridgeTransferStatus.WITHDRAW_EXECUTED } } return { ...t } @@ -123,6 +123,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { console.log(e) } refetchNewNotifications(connectedAccount ?? '') + console.log('refetching transfer data queries') queryClient.refetchQueries(['transferData', withdrawal]) queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 37b9b90b..54aba7bb 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -1,6 +1,7 @@ import { useQueries, useQuery, UseQueryResult } from 'react-query' import { HIGH_NETWORKS, L2_NETWORK, LOW_NETWORKS } from '../../constants' import { ethers, providers } from 'ethers' +import { Transaction } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { @@ -10,7 +11,6 @@ import { ChildTransactionReceipt } from '@arbitrum/sdk' import { ParentContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/ParentTransaction' -import { Transaction } from 'ethers' const eventABI = [ { @@ -144,10 +144,12 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { const l2Provider = new providers.JsonRpcProvider(highNetwork.rpcs[0]) let l2Result + try { - l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, 3, 1000) + l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, 5, 3000) + console.log('L2 Transaction Receipt:', l2Result) } catch (e) { - console.log(e) + console.error('Error waiting for child transaction receipt:', e) } if (!l2Result) { diff --git a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts index 14864a16..4d8edb82 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts @@ -25,7 +25,7 @@ const useTransferData = ({ txRecord }: UseTransferDataProps) => { }) console.log(_bridgeTransfer) const status = await _bridgeTransfer.getStatus() - + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) const transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -36,7 +36,7 @@ const useTransferData = ({ txRecord }: UseTransferDataProps) => { : t.highNetworkHash === txRecord.highNetworkHash if (hashComparison) { - return { ...t, status: status?.status } + return { ...t, status: status?.status} } return { ...t } }) From e2ed51a8403d59ac7b02d2991e59033c7441cba2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 1 Nov 2024 22:51:51 +0000 Subject: [PATCH 082/266] refactored claim --- .../components/bridge/history/Withdrawal.tsx | 112 +++---------- .../bridge/history/WithdrawalMobile.tsx | 8 +- .../src/hooks/useBridgeTransfer.ts | 149 ++++++++++++++++++ 3 files changed, 173 insertions(+), 96 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index d112fb80..149cb8be 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,16 +1,12 @@ import React from 'react' -import { useMutation, useQueryClient } from 'react-query' -import { HIGH_NETWORKS, L1_NETWORK, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' +import { HIGH_NETWORKS, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' -import { ethers } from 'ethers' -import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' import WithdrawalMobile from '@/components/bridge/history/WithdrawalMobile' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' -import useTransferData from '@/hooks/useTransferData' +import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' @@ -57,85 +53,17 @@ export const getStatus = (withdrawal: TransactionRecord) => { } } const Withdrawal: React.FC = ({ withdrawal }) => { - const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK const status = getStatus(withdrawal) - const { switchChain, connectedAccount } = useBlockchainContext() - const queryClient = useQueryClient() - const { refetchNewNotifications } = useBridgeNotificationsContext() + const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { data: transferStatus, isLoading } = useTransferData({ txRecord: withdrawal }) - + const { claim, returnTransferData } = useBridgeTransfer() + const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - // Mutate function - const execute = useMutation( - async (highNetworkHash: string | undefined) => { - if (!highNetworkHash) { - throw new Error('transaction hash is undefined') - } - - let provider - if (window.ethereum) { - provider = new ethers.providers.Web3Provider(window.ethereum) - const currentChain = await provider.getNetwork() - if (currentChain.chainId !== targetChain.chainId) { - await switchChain(targetChain) - provider = new ethers.providers.Web3Provider(window.ethereum) //refresh provider - } - } else { - throw new Error('Wallet is not installed!') - } - const signer = provider.getSigner() - - // Bridge Transfer execute - const _bridgeTransfer = new BridgeTransfer({ - txHash: withdrawal.highNetworkHash || '', - destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, - originNetworkChainId: withdrawal.highNetworkChainId ?? 0 - }) - const res = await _bridgeTransfer?.execute(signer) - return { res, withdrawal } - }, - { - onSuccess: ({ res, withdrawal }, highNetworkHash) => { - try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions = transactionsString ? JSON.parse(transactionsString) : [] - const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { - if (t.highNetworkHash === highNetworkHash) { - return { - ...t, - completionTimestamp: Date.now() / 1000, - lowNetworkTimestamp: Date.now() / 1000, - newTransaction: true, - lowNetworkHash: res?.transactionHash, - status: BridgeTransferStatus.WITHDRAW_EXECUTED - } - } - return { ...t } - }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) - } catch (e) { - console.log(e) - } - refetchNewNotifications(connectedAccount ?? '') - console.log('refetching transfer data queries') - queryClient.refetchQueries(['transferData', withdrawal]) - queryClient.refetchQueries(['incomingMessages']) - queryClient.refetchQueries(['ERC20Balance']) - queryClient.refetchQueries(['nativeBalance']) - queryClient.refetchQueries(['pendingTransactions']) - }, - onError: (error: Error) => { - console.log(error) - } - } - ) - if (!status) { return <> } @@ -149,12 +77,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> {smallView ? ( - + ) : ( <> {isLoading ? ( @@ -189,7 +112,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -211,7 +136,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
Initiate
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -233,7 +160,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
Finalize
{timeAgo(withdrawal?.completionTimestamp)}
-
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -262,7 +191,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
-
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
{transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( @@ -280,11 +211,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index df3e901d..fa165a75 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -10,11 +10,11 @@ import { ChildToParentMessageStatus } from '@arbitrum/sdk' interface WithdrawalMobileProps { withdrawal: TransactionRecord - execute: any + claim: any status: any transferStatus: any } -const WithdrawalMobile: React.FC = ({ withdrawal, execute, status, transferStatus }) => { +const WithdrawalMobile: React.FC = ({ withdrawal, claim, status, transferStatus }) => { const [isCollapsed, setIsCollapsed] = useState(true) return ( @@ -108,8 +108,8 @@ const WithdrawalMobile: React.FC = ({ withdrawal, execute
Status
{transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( - )} diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts new file mode 100644 index 00000000..933755de --- /dev/null +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -0,0 +1,149 @@ +import { useMutation, useQueryClient } from 'react-query' +import { useQuery } from 'react-query' +import { L1_NETWORK, L2_NETWORK } from '../../constants' +import { ethers } from 'ethers' +import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' +import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' +import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' + +interface UseTransferDataProps { + txRecord: TransactionRecord +} + +export const useBridgeTransfer = () => { + const returnTransferData = ({ txRecord }: UseTransferDataProps) => { + const { connectedAccount } = useBlockchainContext() + return useQuery( + ['transferData', txRecord], + async () => { + if (!txRecord) { + return { ETA: 0, status: 0 } + } + + const _bridgeTransfer = new BridgeTransfer({ + txHash: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkHash : txRecord.highNetworkHash) ?? '', + destinationNetworkChainId: + (txRecord.type === 'DEPOSIT' ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId) ?? 0, + originNetworkChainId: + (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 + }) + console.log(_bridgeTransfer) + const status = await _bridgeTransfer.getStatus() + + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactions = transactionsString ? JSON.parse(transactionsString) : [] + + const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + const hashComparison: boolean = + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + + if (hashComparison) { + return { ...t, status: status?.status } + } + return { ...t } + }) + localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + return status + }, + { + initialData: () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + if (transactionsString) { + const transactions = JSON.parse(transactionsString) + const cachedTransaction = transactions.find((t: TransactionRecord) => + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + ) + if (cachedTransaction && cachedTransaction.status) { + return { ETA: 0, status: cachedTransaction.status } + } + } + return { ETA: 0, status: 0 } + }, + refetchInterval: 50000, + staleTime: 60 * 1000, + refetchOnWindowFocus: false, + enabled: !!txRecord + } + ) + } + + // Mutate function + + const { refetchNewNotifications } = useBridgeNotificationsContext() + const queryClient = useQueryClient() + const { switchChain, connectedAccount } = useBlockchainContext() + + const claim = useMutation( + async (withdrawal: TransactionRecord | undefined) => { + if (!withdrawal) { + throw new Error('transaction hash is undefined') + } + const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK + + let provider + if (window.ethereum) { + provider = new ethers.providers.Web3Provider(window.ethereum) + const currentChain = await provider.getNetwork() + if (currentChain.chainId !== targetChain.chainId) { + await switchChain(targetChain) + provider = new ethers.providers.Web3Provider(window.ethereum) //refresh provider + } + } else { + throw new Error('Wallet is not installed!') + } + const signer = provider.getSigner() + + // Bridge Transfer execute + const _bridgeTransfer = new BridgeTransfer({ + txHash: withdrawal.highNetworkHash || '', + destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, + originNetworkChainId: withdrawal.highNetworkChainId ?? 0 + }) + const res = await _bridgeTransfer?.execute(signer) + return { res, withdrawal } + }, + { + onSuccess: ({ res, withdrawal }, highNetworkHash) => { + try { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + let transactions = transactionsString ? JSON.parse(transactionsString) : [] + const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + if (t.highNetworkHash === highNetworkHash) { + return { + ...t, + completionTimestamp: Date.now() / 1000, + lowNetworkTimestamp: Date.now() / 1000, + newTransaction: true, + lowNetworkHash: res?.transactionHash, + status: BridgeTransferStatus.WITHDRAW_EXECUTED + } + } + return { ...t } + }) + localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + } catch (e) { + console.log(e) + } + refetchNewNotifications(connectedAccount ?? '') + console.log('refetching transfer data queries') + queryClient.refetchQueries(['transferData', withdrawal]) + queryClient.refetchQueries(['incomingMessages']) + queryClient.refetchQueries(['ERC20Balance']) + queryClient.refetchQueries(['nativeBalance']) + queryClient.refetchQueries(['pendingTransactions']) + }, + onError: (error: Error) => { + console.log(error) + } + } + ) + return { + returnTransferData, + claim + } +} From 034e55a645ab42d9ed6c3123076c8d36b8eff8f5 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Sat, 2 Nov 2024 11:56:02 +0300 Subject: [PATCH 083/266] feat: segmented progress bar for custom scrolling --- .../landing/SegmentedProgressBar.module.css | 26 +++++++++++++ .../landing/SegmentedProgressBar.tsx | 39 +++++++++++++++++++ 2 files changed, 65 insertions(+) create mode 100644 webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css create mode 100644 webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.tsx diff --git a/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css b/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css new file mode 100644 index 00000000..d8ecab1d --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css @@ -0,0 +1,26 @@ +.container { + display: flex; + flex-direction: column; + gap: 4px; + width: 6px; + z-index: 1002; + height: 100%; +} + +.segment { + /*height: 60px;*/ + /*height: 100%;*/ + flex: 1; + width: 100%; + background-color: #393939; + z-index: 1002; + border-radius: 100px; +} + + +.fill { + border-radius: 100px; + height: 100%; + background-color: #F04438; + z-index: 1003; +} diff --git a/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.tsx b/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.tsx new file mode 100644 index 00000000..91f1dc58 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import styles from './SegmentedProgressBar.module.css'; + +interface SegmentedProgressBarProps { + numberOfSegments: number; + progress: number; // Percentage (0-100) +} + +const SegmentedProgressBar: React.FC = ({ numberOfSegments, progress }) => { + const percentPerSegment = 100 / numberOfSegments; + return ( +
+ {Array.from({ length: numberOfSegments }, (_, index) => { + const segmentStart = index * percentPerSegment; + const segmentEnd = segmentStart + percentPerSegment; + let fillPercentage + if (progress > segmentEnd) { + fillPercentage = 100; + } else { + fillPercentage = progress < segmentStart ? 0 : (progress - segmentStart) / percentPerSegment * 100 + } + + return ( +
+
+
+ ); + })} +
+ ); +}; + +export default SegmentedProgressBar; From 0c0552397356e8653d36e6b1febfb5f5c0767721 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Sat, 2 Nov 2024 11:56:18 +0300 Subject: [PATCH 084/266] feat: container with custom scrolling --- .../components/landing/Container.module.css | 27 ++++++++ .../src/components/landing/Container.tsx | 67 +++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 webapps/world-builder-dashboard/src/components/landing/Container.module.css create mode 100644 webapps/world-builder-dashboard/src/components/landing/Container.tsx diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.module.css b/webapps/world-builder-dashboard/src/components/landing/Container.module.css new file mode 100644 index 00000000..8ff8c33f --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/Container.module.css @@ -0,0 +1,27 @@ +.container { + width: 100%; + height: 100%; +} + +.viewContainer { + position: relative; + /*width: 100vw;*/ + height: 8000px; +} + +.sticky { + position: sticky; + width: 100vw; + height: 100vh; + top: 0; + z-index: 1000; + /*background-color: #101828;*/ +} + +.progressBar { + position: absolute; + right: 34px; + top: 102px; + z-index: 1001; + height: calc(100% - 102px - 16px - 20px); +} diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.tsx b/webapps/world-builder-dashboard/src/components/landing/Container.tsx new file mode 100644 index 00000000..fece6341 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/landing/Container.tsx @@ -0,0 +1,67 @@ +import React, {useEffect, useState} from 'react'; +import styles from "./Container.module.css"; +import parentStyles from "./Landing.module.css" +import SegmentedProgressBar from "./SegmentedProgressBar"; +import Navbar from "@/components/landing/Navbar"; + +interface ContainerProps { + components: Element[] + isNavbarOpen: boolean + setIsNavbarOpen: (arg0: boolean) => void + isSmallView: boolean + navigateLink: (item: {name: string, link: string}) => void + startBuilding: () => void +} + + + +const Container: React.FC = ({components, isNavbarOpen, setIsNavbarOpen, isSmallView, navigateLink, startBuilding}) => { + const [progress, setProgress] = useState(0); + const [page, setPage] = useState(0) + + + useEffect(() => { + const handleScroll = () => { + const progress = window.scrollY / (8000 - window.innerHeight) + setProgress(progress * 100) + setPage(Math.min(Math.floor(progress * components.length), components.length - 1)); + }; + + window.addEventListener('scroll', handleScroll); + return () => { + window.removeEventListener('scroll', handleScroll); + }; + }, []); + + return ( +
+
+
+
+ + +
+ {components[page]} +
+ {isSmallView && ( +
+ Start building +
+ )} +
+
+ +
+
+
+
+ ); +}; + +export default Container; From c593586f34b17366ffe4e3db23ee01e5809e06d2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 09:21:30 +0000 Subject: [PATCH 085/266] cp --- .../components/bridge/bridge/ActionButton.tsx | 7 +-- .../components/bridge/bridge/BridgeView.tsx | 2 +- .../bridge/history/WithdrawalMobile.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 45 +++++++++---------- .../src/hooks/useL2ToL1MessageStatus.ts | 3 +- 5 files changed, 29 insertions(+), 30 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 9e6afe1f..44e736be 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -6,7 +6,7 @@ import { useNavigate } from 'react-router-dom' import { ALL_NETWORKS } from '../../../../constants' // Styles import styles from './ActionButton.module.css' -import { ethers } from 'ethers' +import { BigNumber, ethers } from 'ethers' import { Bridger } from 'game7-bridge-sdk' // Absolute Imports import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -81,6 +81,7 @@ const ActionButton: React.FC = ({ const signer = provider.getSigner() const destinationRPC = selectedHighNetwork.rpcs[0] const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider + // If deposit if (bridger?.isDeposit) { if (selectedBridgeToken.address != ZERO_ADDRESS) { @@ -95,7 +96,7 @@ const ActionButton: React.FC = ({ await tx.wait() return { type: 'DEPOSIT', - amount, + amount: amount, lowNetworkChainId: selectedLowNetwork.chainId, highNetworkChainId: selectedHighNetwork.chainId, lowNetworkHash: tx.hash, @@ -105,7 +106,7 @@ const ActionButton: React.FC = ({ symbol } } else { - const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) + const tx = await bridger?.transfer({amount: ethers.utils.parseUnits(amount), signer, destinationProvider}) await tx?.wait() return { type: 'WITHDRAWAL', diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 19b44e73..d9267918 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -68,7 +68,7 @@ const BridgeView = ({ direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], connectedAccount ?? '' ) - const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '') + const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '0.0') return feeFormatted } catch (e) { console.error(e) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index fa165a75..3c4ab7dc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -65,7 +65,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim, )}
{transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( - <> + <>
Initiate
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 933755de..a8aadecf 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -28,8 +28,8 @@ export const useBridgeTransfer = () => { originNetworkChainId: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 }) - console.log(_bridgeTransfer) const status = await _bridgeTransfer.getStatus() + console.log(status) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) const transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -48,27 +48,27 @@ export const useBridgeTransfer = () => { localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) return status }, - { - initialData: () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - if (transactionsString) { - const transactions = JSON.parse(transactionsString) - const cachedTransaction = transactions.find((t: TransactionRecord) => - txRecord.type === 'DEPOSIT' - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - ) - if (cachedTransaction && cachedTransaction.status) { - return { ETA: 0, status: cachedTransaction.status } - } - } - return { ETA: 0, status: 0 } - }, - refetchInterval: 50000, - staleTime: 60 * 1000, - refetchOnWindowFocus: false, - enabled: !!txRecord - } + // { + // initialData: () => { + // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + // if (transactionsString) { + // const transactions = JSON.parse(transactionsString) + // const cachedTransaction = transactions.find((t: TransactionRecord) => + // txRecord.type === 'DEPOSIT' + // ? t.lowNetworkHash === txRecord.lowNetworkHash + // : t.highNetworkHash === txRecord.highNetworkHash + // ) + // if (cachedTransaction && cachedTransaction.status) { + // return { ETA: 0, status: cachedTransaction.status } + // } + // } + // return { ETA: 0, status: 0 } + // }, + // refetchInterval: 50000, + // staleTime: 60 * 1000, + // refetchOnWindowFocus: false, + // enabled: !!txRecord + // } ) } @@ -130,7 +130,6 @@ export const useBridgeTransfer = () => { console.log(e) } refetchNewNotifications(connectedAccount ?? '') - console.log('refetching transfer data queries') queryClient.refetchQueries(['transferData', withdrawal]) queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 54aba7bb..ab8f27a6 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -146,8 +146,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { let l2Result try { - l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, 5, 3000) - console.log('L2 Transaction Receipt:', l2Result) + l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations) } catch (e) { console.error('Error waiting for child transaction receipt:', e) } From 69344db8683af8e77fe55e9638d5fbf5cc3100a9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 09:32:16 +0000 Subject: [PATCH 086/266] decimal places fixed. --- .../src/components/bridge/bridge/ActionButton.tsx | 7 ++++--- .../src/components/bridge/bridge/BridgeView.tsx | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 44e736be..1c86826f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -15,7 +15,7 @@ import { ZERO_ADDRESS } from '@/utils/web3utils' interface ActionButtonProps { direction: 'DEPOSIT' | 'WITHDRAW' - amount: number + amount: string isDisabled: boolean L2L3message?: { destination: string; data: string } setErrorMessage: (arg0: string) => void @@ -69,7 +69,7 @@ const ActionButton: React.FC = ({ return } setErrorMessage('') - transfer.mutateAsync(String(amount)) + transfer.mutateAsync(amount) return } @@ -88,7 +88,7 @@ const ActionButton: React.FC = ({ const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' // approve first if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { - const txApprove = await bridger?.approve(ethers.utils.parseEther(amount), signer) + const txApprove = await bridger?.approve(ethers.utils.parseUnits(amount), signer) await txApprove.wait() } } @@ -106,6 +106,7 @@ const ActionButton: React.FC = ({ symbol } } else { + console.log(ethers.utils.parseUnits(amount)) const tx = await bridger?.transfer({amount: ethers.utils.parseUnits(amount), signer, destinationProvider}) await tx?.wait() return { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index d9267918..9c01c74d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -225,7 +225,7 @@ const BridgeView = ({ {networkErrorMessage &&
{networkErrorMessage}
} Date: Mon, 4 Nov 2024 10:21:39 +0000 Subject: [PATCH 087/266] updated ETA format --- .../src/components/bridge/bridge/ActionButton.tsx | 3 +-- .../src/components/bridge/history/Withdrawal.tsx | 9 +++++---- .../world-builder-dashboard/src/hooks/useTransferData.ts | 3 +-- webapps/world-builder-dashboard/src/utils/timeFormat.ts | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 1c86826f..cc8641bd 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -106,7 +106,6 @@ const ActionButton: React.FC = ({ symbol } } else { - console.log(ethers.utils.parseUnits(amount)) const tx = await bridger?.transfer({amount: ethers.utils.parseUnits(amount), signer, destinationProvider}) await tx?.wait() return { @@ -143,7 +142,7 @@ const ActionButton: React.FC = ({ }, onError: (e) => { console.log(e) - setErrorMessage('Something went wrong. Try again, please') + setErrorMessage('Transaction failed. Try again, please') } } ) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 149cb8be..9c6e2814 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -54,6 +54,7 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) + console.log(status) const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() @@ -88,7 +89,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { Withdraw
-
{timeAgo(status.data?.timestamp)}
+
{timeAgo(withdrawal.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -111,7 +112,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { Withdraw
-
{timeAgo(status.data?.timestamp)}
+
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
@@ -135,7 +136,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
Initiate
-
{timeAgo(status.data?.timestamp)}
+
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
@@ -233,7 +234,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
{ETA(status.data?.timestamp, withdrawal.challengePeriod)} left
+
{ETA(transferStatus?.ETA, withdrawal.challengePeriod)} left
)} diff --git a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts index 4d8edb82..6717cd6d 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts @@ -23,9 +23,8 @@ const useTransferData = ({ txRecord }: UseTransferDataProps) => { originNetworkChainId: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 }) - console.log(_bridgeTransfer) const status = await _bridgeTransfer.getStatus() - + console.log(status) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) const transactions = transactionsString ? JSON.parse(transactionsString) : [] diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index e8f209f2..d114800c 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -29,7 +29,7 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde return 'N/A' } const now = new Date().getTime() - const date = new Date(Number(timestamp) * 1000 + delayInSeconds * 1000).getTime() + const date = new Date(Number(timestamp) + (delayInSeconds * 1000)).getTime() const timeDifference = Math.floor((date - now) / 1000) if (timeDifference < 0) { return '~now' From 381a0f6c3dab98e758fb2062be390679ba04b660 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 10:53:06 +0000 Subject: [PATCH 088/266] remove useTransferData --- .../src/components/bridge/history/Deposit.tsx | 9 +-- .../src/hooks/useBridgeTransfer.ts | 42 +++++------ .../src/hooks/useTransferData.ts | 69 ------------------- .../src/utils/timeFormat.ts | 4 +- 4 files changed, 28 insertions(+), 96 deletions(-) delete mode 100644 webapps/world-builder-dashboard/src/hooks/useTransferData.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 4119a18d..56937ac9 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -6,12 +6,12 @@ import { BridgeTransferStatus } from 'game7-bridge-sdk' import { useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' -import useTransferData from '@/hooks/useTransferData' +import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' -import { useBlockchainContext } from '@/contexts/BlockchainContext' interface DepositProps { deposit: TransactionRecord @@ -23,8 +23,9 @@ const Deposit: React.FC = ({ deposit }) => { } const status = useDepositStatus(deposit) const smallView = useMediaQuery('(max-width: 1199px)') - const { data: transferStatus, isLoading } = useTransferData({ txRecord: deposit }) - const {connectedAccount} = useBlockchainContext() + const { returnTransferData } = useBridgeTransfer() + const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) + const { connectedAccount } = useBlockchainContext() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index a8aadecf..e593a490 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -48,27 +48,27 @@ export const useBridgeTransfer = () => { localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) return status }, - // { - // initialData: () => { - // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - // if (transactionsString) { - // const transactions = JSON.parse(transactionsString) - // const cachedTransaction = transactions.find((t: TransactionRecord) => - // txRecord.type === 'DEPOSIT' - // ? t.lowNetworkHash === txRecord.lowNetworkHash - // : t.highNetworkHash === txRecord.highNetworkHash - // ) - // if (cachedTransaction && cachedTransaction.status) { - // return { ETA: 0, status: cachedTransaction.status } - // } - // } - // return { ETA: 0, status: 0 } - // }, - // refetchInterval: 50000, - // staleTime: 60 * 1000, - // refetchOnWindowFocus: false, - // enabled: !!txRecord - // } + { + initialData: () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + if (transactionsString) { + const transactions = JSON.parse(transactionsString) + const cachedTransaction = transactions.find((t: TransactionRecord) => + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + ) + if (cachedTransaction && cachedTransaction.status) { + return { ETA: 0, status: cachedTransaction.status } + } + } + return { ETA: 0, status: 0 } + }, + refetchInterval: 50000, + staleTime: 60 * 1000, + refetchOnWindowFocus: false, + enabled: !!txRecord + } ) } diff --git a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts b/webapps/world-builder-dashboard/src/hooks/useTransferData.ts deleted file mode 100644 index 6717cd6d..00000000 --- a/webapps/world-builder-dashboard/src/hooks/useTransferData.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { useQuery } from 'react-query' -import { BridgeTransfer } from 'game7-bridge-sdk' -import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' - -interface UseTransferDataProps { - txRecord: TransactionRecord -} - -const useTransferData = ({ txRecord }: UseTransferDataProps) => { - const { connectedAccount } = useBlockchainContext() - return useQuery( - ['transferData', txRecord], - async () => { - if (!txRecord) { - return { ETA: 0, status: 0 } - } - - const _bridgeTransfer = new BridgeTransfer({ - txHash: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkHash : txRecord.highNetworkHash) ?? '', - destinationNetworkChainId: - (txRecord.type === 'DEPOSIT' ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId) ?? 0, - originNetworkChainId: - (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 - }) - const status = await _bridgeTransfer.getStatus() - console.log(status) - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - const transactions = transactionsString ? JSON.parse(transactionsString) : [] - - const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { - const hashComparison: boolean = - txRecord.type === 'DEPOSIT' - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - - if (hashComparison) { - return { ...t, status: status?.status} - } - return { ...t } - }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) - return status - }, - { - initialData: () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - if (transactionsString) { - const transactions = JSON.parse(transactionsString) - const cachedTransaction = transactions.find((t: TransactionRecord) => - txRecord.type === 'DEPOSIT' - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - ) - if (cachedTransaction && cachedTransaction.status) { - return { ETA: 0, status: cachedTransaction.status } - } - } - return { ETA: 0, status: 0 } - }, - refetchInterval: 50000, - staleTime: 60 * 1000, - refetchOnWindowFocus: false, - enabled: !!txRecord - } - ) -} - -export default useTransferData diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index d114800c..b3fa3ce3 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -29,8 +29,8 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde return 'N/A' } const now = new Date().getTime() - const date = new Date(Number(timestamp) + (delayInSeconds * 1000)).getTime() - const timeDifference = Math.floor((date - now) / 1000) + const date = new Date(Number(timestamp) + delayInSeconds).getTime() + const timeDifference = date - now if (timeDifference < 0) { return '~now' } From 63f0aa5ffa6d573c41203ac0f6526d38c55d21ab Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 12:04:10 +0000 Subject: [PATCH 089/266] Withdrawal ETA looking good --- .../components/bridge/bridge/ActionButton.tsx | 2 +- .../components/bridge/history/Withdrawal.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 43 +++++++++---------- .../src/utils/timeFormat.ts | 5 ++- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index cc8641bd..b2524392 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -106,7 +106,7 @@ const ActionButton: React.FC = ({ symbol } } else { - const tx = await bridger?.transfer({amount: ethers.utils.parseUnits(amount), signer, destinationProvider}) + const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) await tx?.wait() return { type: 'WITHDRAWAL', diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 9c6e2814..513b874b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -54,7 +54,6 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) - console.log(status) const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() @@ -64,6 +63,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) + console.log(transferStatus?.ETA) if (!status) { return <> diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index e593a490..fc3988fe 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -29,7 +29,6 @@ export const useBridgeTransfer = () => { (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 }) const status = await _bridgeTransfer.getStatus() - console.log(status) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) const transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -48,27 +47,27 @@ export const useBridgeTransfer = () => { localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) return status }, - { - initialData: () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - if (transactionsString) { - const transactions = JSON.parse(transactionsString) - const cachedTransaction = transactions.find((t: TransactionRecord) => - txRecord.type === 'DEPOSIT' - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - ) - if (cachedTransaction && cachedTransaction.status) { - return { ETA: 0, status: cachedTransaction.status } - } - } - return { ETA: 0, status: 0 } - }, - refetchInterval: 50000, - staleTime: 60 * 1000, - refetchOnWindowFocus: false, - enabled: !!txRecord - } + // { + // initialData: () => { + // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + // if (transactionsString) { + // const transactions = JSON.parse(transactionsString) + // const cachedTransaction = transactions.find((t: TransactionRecord) => + // txRecord.type === 'DEPOSIT' + // ? t.lowNetworkHash === txRecord.lowNetworkHash + // : t.highNetworkHash === txRecord.highNetworkHash + // ) + // if (cachedTransaction && cachedTransaction.status) { + // return { ETA: 0, status: cachedTransaction.status } + // } + // } + // return { ETA: 0, status: 0 } + // }, + // refetchInterval: 50000, + // staleTime: 60 * 1000, + // refetchOnWindowFocus: false, + // enabled: !!txRecord + // } ) } diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index b3fa3ce3..9ea81e98 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -29,8 +29,8 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde return 'N/A' } const now = new Date().getTime() - const date = new Date(Number(timestamp) + delayInSeconds).getTime() - const timeDifference = date - now + const date = new Date(Number(timestamp) + delayInSeconds * 1000).getTime() + const timeDifference = Math.floor((date - now) / 1000) if (timeDifference < 0) { return '~now' } @@ -52,6 +52,7 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde return 'just now' } + export const timeDifferenceInHoursAndMinutes = (start: number, end: number): string => { // Convert Unix timestamps to Date objects const startDate = new Date(start * 1000) From 1526899163f124946465cc635d63bc73cffd0db6 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 12:10:07 +0000 Subject: [PATCH 090/266] change delay in seconds --- .../src/components/bridge/bridge/ActionButton.tsx | 2 +- webapps/world-builder-dashboard/src/utils/timeFormat.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index b2524392..64a7ae55 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -115,7 +115,7 @@ const ActionButton: React.FC = ({ highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: 60 * 60, + challengePeriod: 60 * 40, symbol } } diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index 9ea81e98..c079d6f6 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -31,9 +31,11 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde const now = new Date().getTime() const date = new Date(Number(timestamp) + delayInSeconds * 1000).getTime() const timeDifference = Math.floor((date - now) / 1000) + console.log(timeDifference) if (timeDifference < 0) { return '~now' } + const units = [ { name: 'year', inSeconds: 60 * 60 * 24 * 365 }, { name: 'month', inSeconds: 60 * 60 * 24 * 30 }, From 549ea2a35c40f0324df557b04fea0d86b1fee44d Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Mon, 4 Nov 2024 15:43:00 +0300 Subject: [PATCH 091/266] feat: slides transition animation --- .../components/landing/Container.module.css | 19 +++++ .../src/components/landing/Container.tsx | 79 ++++++++++++------- 2 files changed, 71 insertions(+), 27 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.module.css b/webapps/world-builder-dashboard/src/components/landing/Container.module.css index 8ff8c33f..81550f56 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Container.module.css @@ -25,3 +25,22 @@ z-index: 1001; height: calc(100% - 102px - 16px - 20px); } + + +.fadeOut, .fadeIn { + width: 100%; + margin-top: auto; + margin-bottom: auto; +} + +.fadeIn { + opacity: 1; + scale: 1; + transition: all 0.250s ease-out; +} + +.fadeOut { + opacity: 0; + scale: 0.95; + transition: all 0.250s ease-in-out; +} diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.tsx b/webapps/world-builder-dashboard/src/components/landing/Container.tsx index fece6341..2c843ca8 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Container.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useState} from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import styles from "./Container.module.css"; import parentStyles from "./Landing.module.css" import SegmentedProgressBar from "./SegmentedProgressBar"; @@ -19,6 +19,11 @@ const Container: React.FC = ({components, isNavbarOpen, setIsNav const [progress, setProgress] = useState(0); const [page, setPage] = useState(0) + const [pageToRender, setPageToRender] = useState(0) //delay for fadeOut animation + const [isFadingOut, setIsFadingOut] = useState(false) + const hasRunOnce = useRef(false) //to not fade out at first render + + useEffect(() => { const handleScroll = () => { @@ -33,33 +38,53 @@ const Container: React.FC = ({components, isNavbarOpen, setIsNav }; }, []); - return ( + + + + useEffect(() => { + if (!hasRunOnce.current) { + hasRunOnce.current = true; + return + } + setIsFadingOut(true) + setTimeout(() => { + setIsFadingOut(false) + setPageToRender(page); + }, 250) + }, [page]); + + + + + return (
-
-
-
- - -
- {components[page]} -
- {isSmallView && ( -
- Start building -
- )} -
-
- -
-
-
+
+
+
+ + +
+
+ {components[pageToRender]} +
+
+ {isSmallView && ( +
+ Start building +
+ )} +
+
+ +
+
+
); }; From 57ab5695d7861031cf07e20f5555ac901f80b76e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 12:10:07 +0000 Subject: [PATCH 092/266] change delay in seconds --- .../src/components/bridge/bridge/ActionButton.tsx | 2 +- .../src/components/bridge/history/Deposit.tsx | 9 +++++---- .../src/components/bridge/history/HistoryDesktop.tsx | 2 +- .../src/components/bridge/history/Withdrawal.tsx | 5 ++--- webapps/world-builder-dashboard/src/utils/timeFormat.ts | 1 + 5 files changed, 10 insertions(+), 9 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index b2524392..64a7ae55 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -115,7 +115,7 @@ const ActionButton: React.FC = ({ highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: 60 * 60, + challengePeriod: 60 * 40, symbol } } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 56937ac9..98f17d62 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -7,8 +7,8 @@ import { useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' +import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' @@ -26,7 +26,6 @@ const Deposit: React.FC = ({ deposit }) => { const { returnTransferData } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { connectedAccount } = useBlockchainContext() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( @@ -87,8 +86,10 @@ const Deposit: React.FC = ({ deposit }) => {
- {status.data && status.data.highNetworkTimestamp ? ( -
{timeAgo(status.data.highNetworkTimestamp)}
+ {transferStatus?.status && + (transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED) ? ( +
{timeAgo(deposit.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
) : (
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 91baf6fd..6a0755f6 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -49,7 +49,7 @@ const HistoryDesktop: React.FC = () => {
))} {messages.data ? ( - messages.data + transactions .filter((tx: any) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .map((tx: TransactionRecord, idx: number) => tx.type === 'WITHDRAWAL' ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 513b874b..9c6a3f54 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -54,6 +54,7 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) + console.log(withdrawal) const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() @@ -63,8 +64,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - console.log(transferStatus?.ETA) - + if (!status) { return <> } @@ -102,7 +102,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {' '} {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <>
diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index 9ea81e98..5bd885c2 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -34,6 +34,7 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde if (timeDifference < 0) { return '~now' } + const units = [ { name: 'year', inSeconds: 60 * 60 * 24 * 365 }, { name: 'month', inSeconds: 60 * 60 * 24 * 30 }, From 3ceb704c335881f92633234a60403de4acf4cc06 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 14:47:35 +0000 Subject: [PATCH 093/266] change node and re-do symbol --- webapps/world-builder-dashboard/constants.ts | 51 +------------------ .../components/bridge/bridge/ActionButton.tsx | 1 + .../components/bridge/bridge/BridgeView.tsx | 2 + .../src/components/bridge/history/Deposit.tsx | 2 - .../bridge/history/HistoryDesktop.tsx | 3 +- .../components/bridge/history/Withdrawal.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 3 +- 7 files changed, 9 insertions(+), 55 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index dc600e6f..510fabb0 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], + rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -87,52 +87,3 @@ export const ETH: TokenAddressMap = { // ETH, ARBITRUM, USDC, MANTLE, USDT, export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] -const SEVEN_DAYS_IN_SECONDS = 7 * 24 * 60 * 60 - -export const networks = { - 13746: { - chainId: 13746, - confirmPeriodBlocks: 20, - ethBridge: { - bridge: '0xC7EEB897bA9bc3fA071C3871e7F4Cf1Ae7570f16', - inbox: '0xE6470bb72291c39073AEd67a30ff93B69c1f47De', - outbox: '0x64105c6C3D494469D5F21323F0E917563489d9f5', - rollup: '0x6cf5bFffc54cDd13B4747e8DF2C72ce8A95043c0', - sequencerInbox: '0xAe2caC32b0eF386Ab683459648eDFC78F7FF8F1e' - }, - arbSys: '0x0000000000000000000000000000000000000064', - explorerUrl: 'https://testnet.game7.io', - rpcs: ['https://testnet-rpc.game7.io'], - isArbitrum: true, - isCustom: true, - name: 'Game7 Testnet', - nativeCurrency: { - decimals: 18, - name: 'Testnet Game7 Token', - symbol: 'TG7T' - }, - parentChainId: 421614, - retryableLifetimeSeconds: SEVEN_DAYS_IN_SECONDS, - tokenBridge: { - parentCustomGateway: '0x81aCB22000A2A81D26E7e1ed5a8f51930A31598E', - parentErc20Gateway: '0x4A24f98D6fB62Ce8eA8f6C2D5AF9c8BF1c853fD7', - parentGatewayRouter: '0x73EeAEEC11473534a2249c851e4b245E61Da8732', - parentMultiCall: '0xce1CAd780c529e66e3aa6D952a1ED9A6447791c1', - parentProxyAdmin: '0x8767Ea2Ce21ac4e624F8a36948BD5EA23A3288D9', - parentWeth: '0x0000000000000000000000000000000000000000', - parentWethGateway: '0x0000000000000000000000000000000000000000', - childCustomGateway: '0xe6c5Ab297E022A592a3fF26984cc6352C7cD0f92', - childErc20Gateway: '0x9b43912709756DcFd34A64D4362b579928fDcC26', - childGatewayRouter: '0xDA379C01a484fB9F0875730430a418eB8AAFdca2', - childMultiCall: '0x27c4a2f1B1685F0AD1ea2227F56606066Aa95Bd0', - childProxyAdmin: '0x07424574dbF6508D1c79755ab8f1ba3883cc38f3', - childWeth: '0x0000000000000000000000000000000000000000', - childWethGateway: '0x0000000000000000000000000000000000000000', - depositTimeout: 2 * 60 - }, - nitroGenesisBlock: 0, - nitroGenesisL1Block: 0, - depositTimeout: 900000, - isTestnet: true - } -} diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 64a7ae55..065413d0 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -92,6 +92,7 @@ const ActionButton: React.FC = ({ await txApprove.wait() } } + console.log(symbol) const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) await tx.wait() return { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 9c01c74d..573ec6ac 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -55,6 +55,8 @@ const BridgeView = ({ token: selectedBridgeToken }) + console.log(tokenInformation) + const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 98f17d62..54506f29 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -8,7 +8,6 @@ import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' -import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' @@ -21,7 +20,6 @@ const Deposit: React.FC = ({ deposit }) => { from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } - const status = useDepositStatus(deposit) const smallView = useMediaQuery('(max-width: 1199px)') const { returnTransferData } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 6a0755f6..5f4369e8 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -21,6 +21,7 @@ const HistoryDesktop: React.FC = () => { const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const amountFormatted = apiData?.amount ? ethers.utils.formatEther(apiData.amount) : '0.0' + return { type: apiData.type, amount: amountFormatted, @@ -48,7 +49,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {messages.data ? ( + {transactions ? ( transactions .filter((tx: any) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .map((tx: TransactionRecord, idx: number) => diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 9c6a3f54..ad688e58 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -54,7 +54,6 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) - console.log(withdrawal) const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() @@ -64,6 +63,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) + console.log(localStorageTransaction?.symbol) if (!status) { return <> diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index fc3988fe..68876ece 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -101,7 +101,8 @@ export const useBridgeTransfer = () => { const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, - originNetworkChainId: withdrawal.highNetworkChainId ?? 0 + originNetworkChainId: withdrawal.highNetworkChainId ?? 0, + destinationSignerOrProviderOrRpc: withdrawal.lowNetworkChainId === 11155111 ? L1_NETWORK.rpcs[0] : "" }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } From 11f55260669ddc1b57910939f9b32ddfe1320c6f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 17:57:34 +0000 Subject: [PATCH 094/266] parse symbol correctly --- .../bridge/history/HistoryDesktop.tsx | 67 ++++++++++++------- .../components/bridge/history/Withdrawal.tsx | 13 ++-- 2 files changed, 51 insertions(+), 29 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5f4369e8..4d547720 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -1,5 +1,5 @@ // External Libraries -import React, { Fragment } from 'react' +import React, { Fragment, useEffect, useState } from 'react' // Styles import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' @@ -12,32 +12,53 @@ import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' interface WithdrawTransactionsProps {} + +const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { + const combinedData = new Map() + + localData.forEach((tx) => combinedData.set(tx.lowNetworkHash || tx.highNetworkHash || '', tx)) + apiData.forEach((tx) => combinedData.set(tx.lowNetworkHash || tx.highNetworkHash || '', tx)) + + return Array.from(combinedData.values()) +} + +// Maps API data to the TransactionRecord format +const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { + const amountFormatted = apiData?.amount ? ethers.utils.formatEther(apiData.amount) : '0.0' + return { + type: apiData.type, + amount: amountFormatted, + lowNetworkChainId: apiData.parentNetworkChainId, + highNetworkChainId: apiData.childNetworkChainId, + lowNetworkHash: apiData.parentNetworkHash, + highNetworkHash: apiData.childNetworkHash, + lowNetworkTimestamp: apiData.parentNetworkTimestamp, + highNetworkTimestamp: apiData.childNetworkTimestamp, + completionTimestamp: apiData.completionTimestamp, + claimableTimestamp: apiData.claimableTimestamp, + challengePeriod: apiData.challengePeriod + } +} + const HistoryDesktop: React.FC = () => { const { connectedAccount } = useBlockchainContext() const messages = useMessages(connectedAccount) - const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) - const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { - const amountFormatted = apiData?.amount ? ethers.utils.formatEther(apiData.amount) : '0.0' + const [mergedTransactions, setMergedTransactions] = useState([]) + const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] + + + // Merge transactions only when API data is updated with new data + useEffect(() => { + const localTransactions = messages.data || [] + const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] - return { - type: apiData.type, - amount: amountFormatted, - lowNetworkChainId: apiData.parentNetworkChainId, - highNetworkChainId: apiData.childNetworkChainId, - lowNetworkHash: apiData.parentNetworkHash, - highNetworkHash: apiData.childNetworkHash, - lowNetworkTimestamp: apiData.parentNetworkTimestamp, - highNetworkTimestamp: apiData.childNetworkTimestamp, - completionTimestamp: apiData.completionTimestamp, - claimableTimestamp: apiData.claimableTimestamp, - challengePeriod: apiData.challengePeriod - } - } - // Transform API transactions into TransactionRecord format - const transactions = apiTransactions?.map((apiTx: any) => mapAPIDataToTransactionRecord(apiTx)) || [] + const combinedTransactions = mergeTransactions(localTransactions, formattedApiTransactions) + setMergedTransactions(combinedTransactions) + }, [messages.data, apiTransactions]) + + return (
@@ -49,8 +70,8 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {transactions ? ( - transactions + {mergedTransactions ? ( + mergedTransactions .filter((tx: any) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .map((tx: TransactionRecord, idx: number) => tx.type === 'WITHDRAWAL' ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index ad688e58..0b508e63 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -63,8 +63,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - console.log(localStorageTransaction?.symbol) + console.log(localStorageTransaction) + if (!status) { return <> } @@ -90,7 +91,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
-
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -114,7 +115,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+ >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -138,7 +139,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+ >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -162,7 +163,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.completionTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+ >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -193,7 +194,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol}`}
+ >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
{transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( From d3d74a5152ac1d2f9705e5bf8cbb90776aa7e9d4 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 18:41:38 +0000 Subject: [PATCH 095/266] return ETA --- .../components/bridge/bridge/ActionButton.tsx | 3 +- .../components/bridge/history/Withdrawal.tsx | 2 - .../src/hooks/useBridgeTransfer.ts | 44 +++++++++---------- .../utils/bridge/depositERC20ArbitrumSDK.ts | 3 +- .../src/utils/timeFormat.ts | 1 - 5 files changed, 26 insertions(+), 27 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 065413d0..ecfa28f4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -92,7 +92,6 @@ const ActionButton: React.FC = ({ await txApprove.wait() } } - console.log(symbol) const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) await tx.wait() return { @@ -104,6 +103,7 @@ const ActionButton: React.FC = ({ lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, newTransaction: true, + ETA: Date.now() / 1000 + 60 * 15, symbol } } else { @@ -117,6 +117,7 @@ const ActionButton: React.FC = ({ highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, challengePeriod: 60 * 40, + ETA: Date.now() / 1000 + 60 * 60, symbol } } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 0b508e63..de2f19fa 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -63,9 +63,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - console.log(localStorageTransaction) - if (!status) { return <> } diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 68876ece..86290a7d 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -47,27 +47,27 @@ export const useBridgeTransfer = () => { localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) return status }, - // { - // initialData: () => { - // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - // if (transactionsString) { - // const transactions = JSON.parse(transactionsString) - // const cachedTransaction = transactions.find((t: TransactionRecord) => - // txRecord.type === 'DEPOSIT' - // ? t.lowNetworkHash === txRecord.lowNetworkHash - // : t.highNetworkHash === txRecord.highNetworkHash - // ) - // if (cachedTransaction && cachedTransaction.status) { - // return { ETA: 0, status: cachedTransaction.status } - // } - // } - // return { ETA: 0, status: 0 } - // }, - // refetchInterval: 50000, - // staleTime: 60 * 1000, - // refetchOnWindowFocus: false, - // enabled: !!txRecord - // } + { + initialData: () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + if (transactionsString) { + const transactions = JSON.parse(transactionsString) + const cachedTransaction = transactions.find((t: TransactionRecord) => + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + ) + if (cachedTransaction && cachedTransaction.status) { + return { ETA: 0, status: cachedTransaction.status } + } + } + return { ETA: 0, status: 0 } + }, + refetchInterval: 50000, + staleTime: 60 * 1000, + refetchOnWindowFocus: false, + enabled: !!txRecord + } ) } @@ -120,7 +120,7 @@ export const useBridgeTransfer = () => { lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, lowNetworkHash: res?.transactionHash, - status: BridgeTransferStatus.WITHDRAW_EXECUTED + status: BridgeTransferStatus.WITHDRAW_EXECUTED, } } return { ...t } diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts index f4e2e4ad..0a9cd018 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts @@ -38,6 +38,7 @@ export interface TransactionRecord { isFailed?: boolean symbol?: string status?: number + ETA?: number } export const depositERC20ArbitrumSDK = async ( @@ -45,7 +46,7 @@ export const depositERC20ArbitrumSDK = async ( highNetwork: NetworkInterface, amount: string, l1Signer: Signer -): Promise => { +): Promise => { const l2Provider = new providers.JsonRpcProvider(highNetwork.rpcs[0]) const l2Network = await getArbitrumNetwork(l2Provider) diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index c079d6f6..5bd885c2 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -31,7 +31,6 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde const now = new Date().getTime() const date = new Date(Number(timestamp) + delayInSeconds * 1000).getTime() const timeDifference = Math.floor((date - now) / 1000) - console.log(timeDifference) if (timeDifference < 0) { return '~now' } From f0888da7a5c244a70061785346233b0e1d5a7c11 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 23:50:33 +0000 Subject: [PATCH 096/266] ready for testing --- webapps/world-builder-dashboard/constants.ts | 5 ++--- .../src/components/bridge/bridge/ActionButton.tsx | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 510fabb0..7246bd01 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], + rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -85,5 +85,4 @@ export const ETH: TokenAddressMap = { } // ETH, ARBITRUM, USDC, MANTLE, USDT, -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] - +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] \ No newline at end of file diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index ecfa28f4..773625f5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -103,7 +103,7 @@ const ActionButton: React.FC = ({ lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, newTransaction: true, - ETA: Date.now() / 1000 + 60 * 15, + ETA: Date.now() + 60 * 15, symbol } } else { @@ -117,7 +117,7 @@ const ActionButton: React.FC = ({ highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, challengePeriod: 60 * 40, - ETA: Date.now() / 1000 + 60 * 60, + ETA: Date.now() + 60 * 60, symbol } } From 9a96d37d10c8d7f8743daaba096f141c5feafc13 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 4 Nov 2024 23:52:07 +0000 Subject: [PATCH 097/266] build fix --- .../src/components/bridge/bridge/ActionButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 773625f5..4377ef3a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -6,7 +6,7 @@ import { useNavigate } from 'react-router-dom' import { ALL_NETWORKS } from '../../../../constants' // Styles import styles from './ActionButton.module.css' -import { BigNumber, ethers } from 'ethers' +import { ethers } from 'ethers' import { Bridger } from 'game7-bridge-sdk' // Absolute Imports import { useBlockchainContext } from '@/contexts/BlockchainContext' From bf6ec10b3a2458733894b551d9db74e8cec2f78c Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Tue, 5 Nov 2024 10:56:50 +0300 Subject: [PATCH 098/266] feat: custom scrolling for large view --- .../components/landing/Container.module.css | 1 - .../src/components/landing/Landing.module.css | 25 +++++++++++++++++++ .../src/pages/LandingPage/LandingPage.tsx | 15 +++++++++-- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.module.css b/webapps/world-builder-dashboard/src/components/landing/Container.module.css index 81550f56..a6262650 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Container.module.css @@ -5,7 +5,6 @@ .viewContainer { position: relative; - /*width: 100vw;*/ height: 8000px; } diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css index 9c2e5861..e1dc3e2d 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -329,6 +329,8 @@ body { align-self: stretch; overscroll-behavior: none; -webkit-overflow-scrolling: auto; + margin-top: auto; + margin-bottom: auto; } .sectionTitle { @@ -848,3 +850,26 @@ body { height: var(--Landing-Page-First-Section-Height-Phone); } } + +@media (min-width: 1440px) { + + + .networkEssentialCards { + display: flex; + gap: 24px; + align-self: stretch; + justify-content: flex-start; + overflow-x: auto; + flex-wrap: nowrap; + margin: 0 -40px; + padding: 0 40px; + } + + .firstSection { + height: auto; + } + + .networkEssentialCard { + min-width: 340px; + } +} diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index 3151caa1..09b4623c 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -8,11 +8,13 @@ import BenefitsSection from "@/components/landing/BenefitsSection"; import AlliesSection from "@/components/landing/AlliesSection"; import NetworkEssentials from "@/components/landing/NetworksEssentials"; import Navbar from "@/components/landing/Navbar"; +import Container from "@/components/landing/Container"; const LandingPage: React.FC = () => { const navigate = useNavigate(); const [navbarOpen, setNavBarOpen] = useState(false); const smallView = useMediaQuery('(max-width: 750px)'); + const isLargeView = useMediaQuery('(min-width: 1440px)'); const startBuilding = () => { navigate('/faucet'); @@ -24,9 +26,18 @@ const LandingPage: React.FC = () => { : window.open(item.link, '_blank'); }; + const slides = [ + , + , + , + + ]; + return ( <> -
+ {isLargeView ? : ( + +
{ Start building
)} -
+
)} ); }; From 4345a862f588e5f9f3f4b5411ea2dc81b8928c76 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Tue, 5 Nov 2024 11:10:29 +0300 Subject: [PATCH 099/266] fix: TS errors and warnings --- .../src/components/landing/Container.tsx | 8 ++++---- .../src/components/landing/Navbar.tsx | 8 ++++---- .../src/pages/LandingPage/LandingPage.tsx | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.tsx b/webapps/world-builder-dashboard/src/components/landing/Container.tsx index 2c843ca8..09f1e104 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Container.tsx @@ -1,13 +1,13 @@ -import React, {useEffect, useRef, useState} from 'react'; +import React, {ReactNode, useEffect, useRef, useState} from 'react'; import styles from "./Container.module.css"; import parentStyles from "./Landing.module.css" import SegmentedProgressBar from "./SegmentedProgressBar"; import Navbar from "@/components/landing/Navbar"; interface ContainerProps { - components: Element[] + components: ReactNode[] isNavbarOpen: boolean - setIsNavbarOpen: (arg0: boolean) => void + setIsNavbarOpen: React.Dispatch>; isSmallView: boolean navigateLink: (item: {name: string, link: string}) => void startBuilding: () => void @@ -64,7 +64,7 @@ const Container: React.FC = ({components, isNavbarOpen, setIsNav diff --git a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx index e1dbb0b4..41ad51d7 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx @@ -9,9 +9,9 @@ import IconHamburgerLanding from '@/assets/IconHamburgerLanding'; interface NavbarProps { navbarOpen: boolean; smallView: boolean; - setNavBarOpen: React.Dispatch>; + setIsNavbarOpen: React.Dispatch>; startBuilding: () => void; - navigateLink: (item: any) => void; + navigateLink: (item: {name: string, link: string}) => void; } const NAVBAR_ITEMS = [ @@ -25,7 +25,7 @@ const NAVBAR_ITEMS = [ } ]; -const Navbar: React.FC = ({ navbarOpen, smallView, setNavBarOpen, startBuilding, navigateLink }) => { +const Navbar: React.FC = ({ navbarOpen, smallView, setIsNavbarOpen, startBuilding, navigateLink }) => { const navigate = useNavigate(); return ( @@ -55,7 +55,7 @@ const Navbar: React.FC = ({ navbarOpen, smallView, setNavBarOpen, s
) : (
- setNavBarOpen(!navbarOpen)} /> + setIsNavbarOpen(!navbarOpen)} />
)}
diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index 09b4623c..fdac4aef 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -35,13 +35,13 @@ const LandingPage: React.FC = () => { return ( <> - {isLargeView ? : ( + {isLargeView ? : (
From e8bd0d81be59838e15c5192b2a1a78591c824167 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Tue, 5 Nov 2024 11:14:35 +0300 Subject: [PATCH 100/266] chore: remove commented lines --- .../src/components/landing/Container.module.css | 1 - .../src/components/landing/SegmentedProgressBar.module.css | 2 -- 2 files changed, 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.module.css b/webapps/world-builder-dashboard/src/components/landing/Container.module.css index a6262650..014ac6dc 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Container.module.css @@ -14,7 +14,6 @@ height: 100vh; top: 0; z-index: 1000; - /*background-color: #101828;*/ } .progressBar { diff --git a/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css b/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css index d8ecab1d..b046a3a9 100644 --- a/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/SegmentedProgressBar.module.css @@ -8,8 +8,6 @@ } .segment { - /*height: 60px;*/ - /*height: 100%;*/ flex: 1; width: 100%; background-color: #393939; From b62b59ae7db44cde924e4be7b1817291dc1c15cc Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 5 Nov 2024 10:15:37 +0000 Subject: [PATCH 101/266] collapsible --- .../components/bridge/bridge/BridgeView.tsx | 1 - .../history/WithdrawTransactions.module.css | 8 +- .../components/bridge/history/Withdrawal.tsx | 158 +++++++++++------- 3 files changed, 105 insertions(+), 62 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 573ec6ac..4f3a99a2 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -55,7 +55,6 @@ const BridgeView = ({ token: selectedBridgeToken }) - console.log(tokenInformation) const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index bd10bab4..db610b31 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -134,6 +134,10 @@ border-bottom: 1px solid var(--Gray-200, #eaecf0); } +.clickable { + cursor: pointer; +} + .gridItemImportant { color: var(--Gray-700, #344054); text-align: center; @@ -148,7 +152,7 @@ .gridItemChild { display: flex; height: 72px; - padding: 16px 40px; + padding-left: 40px; align-items: center; align-self: stretch; color: var(--Gray-700, #344054); @@ -166,7 +170,7 @@ position: relative; display: flex; height: 72px; - padding: 16px 24px; + padding: 16px 24px !important; align-items: center; align-self: stretch; color: var(--Gray-700, #344054); diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index de2f19fa..253f4226 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useState } from 'react' import { HIGH_NETWORKS, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' @@ -57,13 +57,14 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() - const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) + const [collapseExecuted, setCollapseExecuted] = useState(false) + const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - + if (!status) { return <> } @@ -89,7 +90,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
-
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
@@ -103,82 +106,119 @@ const Withdrawal: React.FC = ({ withdrawal }) => { <> {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <> -
- -
+
setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + > + {collapseExecuted && } +
setCollapseExecuted(!collapseExecuted)}> Withdraw
-
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
- -
-
{timeAgo(status.data.lowNetworkTimeStamp)}
-
-
-
Initiate
+ onClick={() => setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + > + {timeAgo(withdrawal?.highNetworkTimestamp)}
-
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
- -
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+ className={styles.gridItem} + onClick={() => setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + > + {status.data?.from ?? ''}
-
-
Finalize
+
setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + > + {status.data?.to ?? ''}
-
{timeAgo(withdrawal?.completionTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
-
+ className={styles.gridItem} + onClick={() => setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + > - -
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+
setCollapseExecuted(!collapseExecuted)} + style={{ cursor: 'pointer' }} + > +
{timeAgo(status.data.lowNetworkTimeStamp)}
+ {collapseExecuted && ( + <> +
+
Initiate
+
+
{timeAgo(withdrawal?.highNetworkTimestamp)}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
{status.data?.from ?? ''}
+
{status.data?.to ?? ''}
+ +
+
{timeAgo(status.data.lowNetworkTimeStamp)}
+
+
+
Finalize
+
+
{timeAgo(withdrawal?.completionTimestamp)}
+
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
{status.data?.from ?? ''}
+
{status.data?.to ?? ''}
+ +
+
{timeAgo(status.data.lowNetworkTimeStamp)}
+
+ + )} )} {transferStatus && transferStatus.status != ChildToParentMessageStatus.EXECUTED && ( @@ -192,7 +232,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status.data?.timestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ""}`}
+ >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
{transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( From 56c9120fac8b327340ee2e6a92150c8cbb0a7a67 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 5 Nov 2024 11:46:32 +0000 Subject: [PATCH 102/266] sort by l8st transactions --- webapps/world-builder-dashboard/constants.ts | 4 ++-- .../src/components/bridge/history/HistoryDesktop.tsx | 12 ++++++++---- .../src/hooks/useBridgeTransfer.ts | 10 +++++----- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 7246bd01..bf7fc66b 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], + rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -85,4 +85,4 @@ export const ETH: TokenAddressMap = { } // ETH, ARBITRUM, USDC, MANTLE, USDT, -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] \ No newline at end of file +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 4d547720..16f3d1f5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -48,17 +48,15 @@ const HistoryDesktop: React.FC = () => { const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - // Merge transactions only when API data is updated with new data useEffect(() => { const localTransactions = messages.data || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] - + const combinedTransactions = mergeTransactions(localTransactions, formattedApiTransactions) setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) - return (
@@ -72,7 +70,13 @@ const HistoryDesktop: React.FC = () => { ))} {mergedTransactions ? ( mergedTransactions - .filter((tx: any) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + .sort((x: TransactionRecord, y: TransactionRecord) => { + const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp + const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp + + return yTimestamp - xTimestamp + }) + .filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .map((tx: TransactionRecord, idx: number) => tx.type === 'WITHDRAWAL' ? ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 86290a7d..edf39f52 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -26,7 +26,8 @@ export const useBridgeTransfer = () => { destinationNetworkChainId: (txRecord.type === 'DEPOSIT' ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId) ?? 0, originNetworkChainId: - (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0 + (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0, + destinationSignerOrProviderOrRpc: txRecord.lowNetworkChainId === 11155111 ? L1_NETWORK.rpcs[0] : '' }) const status = await _bridgeTransfer.getStatus() @@ -58,10 +59,9 @@ export const useBridgeTransfer = () => { : t.highNetworkHash === txRecord.highNetworkHash ) if (cachedTransaction && cachedTransaction.status) { - return { ETA: 0, status: cachedTransaction.status } + return { ETA: cachedTransaction.ETA, status: cachedTransaction.status } } } - return { ETA: 0, status: 0 } }, refetchInterval: 50000, staleTime: 60 * 1000, @@ -102,7 +102,7 @@ export const useBridgeTransfer = () => { txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: withdrawal.lowNetworkChainId === 11155111 ? L1_NETWORK.rpcs[0] : "" + destinationSignerOrProviderOrRpc: withdrawal.lowNetworkChainId === 11155111 ? L1_NETWORK.rpcs[0] : '' }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } @@ -120,7 +120,7 @@ export const useBridgeTransfer = () => { lowNetworkTimestamp: Date.now() / 1000, newTransaction: true, lowNetworkHash: res?.transactionHash, - status: BridgeTransferStatus.WITHDRAW_EXECUTED, + status: BridgeTransferStatus.WITHDRAW_EXECUTED } } return { ...t } From ad371d3ec5bcffdc562cf1574fe60dbc44430cf1 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Tue, 5 Nov 2024 21:13:50 +0300 Subject: [PATCH 103/266] style: scroll bar width --- .../src/pages/LandingPage/LandingPage.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css index e47aa6a7..56dde405 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -1,6 +1,7 @@ html, body { overscroll-behavior: none; + scrollbar-width: none; -webkit-overflow-scrolling: auto; } From 39a524249c0e5ad5a82ff0f1534124bf0c1a9aaf Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 5 Nov 2024 19:21:49 +0000 Subject: [PATCH 104/266] returning all values --- webapps/world-builder-dashboard/constants.ts | 4 +- .../components/bridge/bridge/ActionButton.tsx | 8 ++-- .../src/components/bridge/history/Deposit.tsx | 2 +- .../bridge/history/HistoryDesktop.tsx | 48 +++++++++---------- .../src/hooks/useBridgeTransfer.ts | 13 ++++- 5 files changed, 42 insertions(+), 33 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index bf7fc66b..7246bd01 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], + rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -85,4 +85,4 @@ export const ETH: TokenAddressMap = { } // ETH, ARBITRUM, USDC, MANTLE, USDT, -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] \ No newline at end of file diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 4377ef3a..6de7d672 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -93,17 +93,17 @@ const ActionButton: React.FC = ({ } } const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) - await tx.wait() + await tx?.wait() return { type: 'DEPOSIT', amount: amount, lowNetworkChainId: selectedLowNetwork.chainId, highNetworkChainId: selectedHighNetwork.chainId, - lowNetworkHash: tx.hash, + lowNetworkHash: tx?.hash, lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, newTransaction: true, - ETA: Date.now() + 60 * 15, + ETA: Date.now() * 1000 + (60 * 15), symbol } } else { @@ -117,7 +117,7 @@ const ActionButton: React.FC = ({ highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, challengePeriod: 60 * 40, - ETA: Date.now() + 60 * 60, + ETA: Date.now() * 1000 + (60 * 60), symbol } } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 54506f29..abd82e19 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -85,7 +85,7 @@ const Deposit: React.FC = ({ deposit }) => {
{transferStatus?.status && - (transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + (transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED) ? (
{timeAgo(deposit.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
) : ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 16f3d1f5..f2e20ec4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -16,9 +16,12 @@ interface WithdrawTransactionsProps {} const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { const combinedData = new Map() - localData.forEach((tx) => combinedData.set(tx.lowNetworkHash || tx.highNetworkHash || '', tx)) - apiData.forEach((tx) => combinedData.set(tx.lowNetworkHash || tx.highNetworkHash || '', tx)) - + localData.forEach((tx) => + combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) + ) + apiData.forEach((tx) => + combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) + ) return Array.from(combinedData.values()) } @@ -47,20 +50,22 @@ const HistoryDesktop: React.FC = () => { const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] + const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] // Merge transactions only when API data is updated with new data useEffect(() => { const localTransactions = messages.data || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] - - const combinedTransactions = mergeTransactions(localTransactions, formattedApiTransactions) + const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) + console.log(formattedApiTransactions) + console.log(messages.data) setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) return (
- {messages.data && ( + {mergedTransactions && (
{headers.map((h) => ( @@ -68,26 +73,21 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {mergedTransactions ? ( - mergedTransactions - .sort((x: TransactionRecord, y: TransactionRecord) => { - const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp - const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp + {mergedTransactions + .sort((x: TransactionRecord, y: TransactionRecord) => { + const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp + const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp - return yTimestamp - xTimestamp - }) - .filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') - .map((tx: TransactionRecord, idx: number) => - tx.type === 'WITHDRAWAL' ? ( - - ) : ( - {tx.lowNetworkHash && } - ) + return yTimestamp - xTimestamp + }) + .map((tx: TransactionRecord, idx: number) => + tx.type === 'WITHDRAWAL' ? ( + + ) : ( + {tx.lowNetworkHash && } ) - ) : ( - <> - )} - {messages.data.filter((tx) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL').length === 0 && ( + )} + {formattedApiTransactions.filter((tx) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL').length === 0 && (
No transactions yet
)}
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index edf39f52..08f957c0 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' -import { L1_NETWORK, L2_NETWORK } from '../../constants' +import { ALL_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -27,8 +27,16 @@ export const useBridgeTransfer = () => { (txRecord.type === 'DEPOSIT' ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId) ?? 0, originNetworkChainId: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0, - destinationSignerOrProviderOrRpc: txRecord.lowNetworkChainId === 11155111 ? L1_NETWORK.rpcs[0] : '' + destinationSignerOrProviderOrRpc: + txRecord.type === 'DEPOSIT' + ? ALL_NETWORKS.find((n) => n.chainId === txRecord.highNetworkChainId)?.rpcs[0] + : ALL_NETWORKS.find((n) => n.chainId === txRecord.lowNetworkChainId)?.rpcs[0], + originSignerOrProviderOrRpc: + txRecord.type === 'DEPOSIT' + ? ALL_NETWORKS.find((n) => n.chainId === txRecord.lowNetworkChainId)?.rpcs[0] + : ALL_NETWORKS.find((n) => n.chainId === txRecord.highNetworkChainId)?.rpcs[0] }) + const status = await _bridgeTransfer.getStatus() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) @@ -59,6 +67,7 @@ export const useBridgeTransfer = () => { : t.highNetworkHash === txRecord.highNetworkHash ) if (cachedTransaction && cachedTransaction.status) { + console return { ETA: cachedTransaction.ETA, status: cachedTransaction.status } } } From 25df5b570445d1d097777b4961cd206285efb72b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 5 Nov 2024 19:47:29 +0000 Subject: [PATCH 105/266] hover collapsible highlight color --- .../components/bridge/bridge/ActionButton.tsx | 14 +++--- .../history/WithdrawTransactions.module.css | 1 + .../components/bridge/history/Withdrawal.tsx | 50 ++++++++++++++++--- 3 files changed, 51 insertions(+), 14 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 6de7d672..bd777663 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -100,11 +100,11 @@ const ActionButton: React.FC = ({ lowNetworkChainId: selectedLowNetwork.chainId, highNetworkChainId: selectedHighNetwork.chainId, lowNetworkHash: tx?.hash, - lowNetworkTimestamp: Date.now() / 1000, - completionTimestamp: Date.now() / 1000, + lowNetworkTimestamp: Date.now(), + completionTimestamp: Date.now(), newTransaction: true, - ETA: Date.now() * 1000 + (60 * 15), - symbol + ETA: Date.now() + (60 * 15), + symbol: symbol } } else { const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) @@ -115,10 +115,10 @@ const ActionButton: React.FC = ({ lowNetworkChainId: selectedLowNetwork.chainId, highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, - highNetworkTimestamp: Date.now() / 1000, + highNetworkTimestamp: Date.now(), challengePeriod: 60 * 40, - ETA: Date.now() * 1000 + (60 * 60), - symbol + ETA: Date.now() + (60 * 60), + symbol: symbol } } }, diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index db610b31..86457728 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -134,6 +134,7 @@ border-bottom: 1px solid var(--Gray-200, #eaecf0); } + .clickable { cursor: pointer; } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 253f4226..758db9c6 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -58,6 +58,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) + const [hovered, setHovered] = useState(false) const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -110,7 +111,12 @@ const Withdrawal: React.FC = ({ withdrawal }) => { className={styles.gridItem} title={withdrawal.highNetworkHash} onClick={() => setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} > {collapseExecuted && }
setCollapseExecuted(!collapseExecuted)}> @@ -121,33 +127,58 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} > {timeAgo(withdrawal?.highNetworkTimestamp)}
setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} > {status.data?.from ?? ''}
setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} > {status.data?.to ?? ''}
setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} > = ({ withdrawal }) => {
setCollapseExecuted(!collapseExecuted)} - style={{ cursor: 'pointer' }} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} >
{timeAgo(status.data.lowNetworkTimeStamp)}
From c72795fecff745b6f0f613d5e47e3d048ea3b345 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 5 Nov 2024 19:48:36 +0000 Subject: [PATCH 106/266] fix build --- .../src/components/bridge/history/HistoryDesktop.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index f2e20ec4..7b3e8152 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -78,7 +78,7 @@ const HistoryDesktop: React.FC = () => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp - return yTimestamp - xTimestamp + return (yTimestamp ?? 0) - (xTimestamp ?? 0) }) .map((tx: TransactionRecord, idx: number) => tx.type === 'WITHDRAWAL' ? ( @@ -87,9 +87,9 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {formattedApiTransactions.filter((tx) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL').length === 0 && ( -
No transactions yet
- )} + {formattedApiTransactions.filter( + (tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL' + ).length === 0 &&
No transactions yet
}
)} From 70f18210bfccabc92d7dca9ec0204e3903e3c819 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 6 Nov 2024 11:33:45 +0000 Subject: [PATCH 107/266] checking if ETA match --- webapps/world-builder-dashboard/package.json | 2 +- .../src/components/bridge/bridge/ActionButton.tsx | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 69d26f7c..b64eac87 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,7 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.51", + "game7-bridge-sdk": "^0.0.52", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index bd777663..05fb7443 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -100,10 +100,10 @@ const ActionButton: React.FC = ({ lowNetworkChainId: selectedLowNetwork.chainId, highNetworkChainId: selectedHighNetwork.chainId, lowNetworkHash: tx?.hash, - lowNetworkTimestamp: Date.now(), - completionTimestamp: Date.now(), + lowNetworkTimestamp: Date.now() / 1000, + completionTimestamp: Date.now() / 1000, newTransaction: true, - ETA: Date.now() + (60 * 15), + ETA: Date.now() / 1000 + (60 * 15), symbol: symbol } } else { @@ -115,9 +115,9 @@ const ActionButton: React.FC = ({ lowNetworkChainId: selectedLowNetwork.chainId, highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, - highNetworkTimestamp: Date.now(), + highNetworkTimestamp: Date.now() / 1000, challengePeriod: 60 * 40, - ETA: Date.now() + (60 * 60), + ETA: Date.now() / 1000 + (60 * 60), symbol: symbol } } From b60a8eea9b4f6181f007159bfbacdf5049c778e3 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 6 Nov 2024 11:37:08 +0000 Subject: [PATCH 108/266] nb rpc --- webapps/world-builder-dashboard/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 7246bd01..bf7fc66b 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], + rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -85,4 +85,4 @@ export const ETH: TokenAddressMap = { } // ETH, ARBITRUM, USDC, MANTLE, USDT, -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] \ No newline at end of file +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] From e30a99d78659c0cb0b156c4782ec5cc1140f82b7 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 6 Nov 2024 11:43:42 +0000 Subject: [PATCH 109/266] added usdc --- webapps/world-builder-dashboard/constants.ts | 6 ++++ .../src/utils/tokens.ts | 34 +++++++++++++++++-- 2 files changed, 37 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index bf7fc66b..d13e8a64 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -84,5 +84,11 @@ export const ETH: TokenAddressMap = { 11155111: '0x0000000000000000000000000000000000000000' } +export const USDC: TokenAddressMap = { + 13746: '0x6a0D75EF95d21f1Ba5e2619fBc9D15F424d130BF', + 421614: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + 11155111: '0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8' +} + // ETH, ARBITRUM, USDC, MANTLE, USDT, export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 8660a63c..da029422 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -1,9 +1,10 @@ -import { ETH, L1_NETWORK, L2_NETWORK, L3_NETWORK, TG7T } from '../../constants' +import { ETH, L1_NETWORK, L2_NETWORK, L3_NETWORK, TG7T, USDC } from '../../constants' import { ZERO_ADDRESS } from './web3utils' +import { TokenAddressMap } from 'game7-bridge-sdk' import IconEthereum from '@/assets/IconEthereum' import IconG7T from '@/assets/IconG7T' import IconTokenNoSynbol from '@/assets/IconTokenNoSymbol' -import { TokenAddressMap } from 'game7-bridge-sdk' +import IconUSDC from '@/assets/IconUSDC' export interface Token { name: string @@ -43,6 +44,15 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: ETH, chainId: L1_NETWORK.chainId }, + { + name: 'USDC', + symbol: 'USDC', + address: '0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8', + Icon: IconUSDC, + rpc: L1_NETWORK.rpcs[0], + tokenAddressMap: USDC, + chainId: L1_NETWORK.chainId + }, ...storedTokensWithItems ] case L2_NETWORK.chainId: @@ -65,6 +75,15 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: ETH, chainId: L2_NETWORK.chainId }, + { + name: 'USDC', + symbol: 'USDC', + address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + Icon: IconUSDC, + rpc: L2_NETWORK.rpcs[0], + tokenAddressMap: USDC, + chainId: L2_NETWORK.chainId + }, ...storedTokensWithItems ] case L3_NETWORK.chainId: @@ -78,9 +97,18 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: TG7T, chainId: L3_NETWORK.chainId }, + { + name: 'USDC', + symbol: 'USDC', + address: '0x6a0D75EF95d21f1Ba5e2619fBc9D15F424d130BF', + Icon: IconUSDC, + rpc: L3_NETWORK.rpcs[0], + tokenAddressMap: USDC, + chainId: L3_NETWORK.chainId + }, ...storedTokensWithItems ] default: return [] // Return an empty array or handle unsupported networks } -} \ No newline at end of file +} From b7f6cfb5393249cf88f2ef03ecb36bb17132b2b8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 6 Nov 2024 13:21:20 +0000 Subject: [PATCH 110/266] added sepolia node --- webapps/world-builder-dashboard/constants.ts | 2 +- .../src/components/bridge/history/HistoryDesktop.tsx | 5 ++--- .../src/utils/bridge/depositERC20ArbitrumSDK.ts | 1 + 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index d13e8a64..5f1670ab 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], + rpcs: ['https://eth-sepolia.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 7b3e8152..5a2623e7 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -39,7 +39,8 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { highNetworkTimestamp: apiData.childNetworkTimestamp, completionTimestamp: apiData.completionTimestamp, claimableTimestamp: apiData.claimableTimestamp, - challengePeriod: apiData.challengePeriod + challengePeriod: apiData.challengePeriod, + tokenAddress: apiData.token } } @@ -57,8 +58,6 @@ const HistoryDesktop: React.FC = () => { const localTransactions = messages.data || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) - console.log(formattedApiTransactions) - console.log(messages.data) setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts index 0a9cd018..87807591 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts @@ -39,6 +39,7 @@ export interface TransactionRecord { symbol?: string status?: number ETA?: number + tokenAddress?: string } export const depositERC20ArbitrumSDK = async ( From 0eff025002f2f7fa90d4c15981666aa7b83c847b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 6 Nov 2024 13:59:47 +0000 Subject: [PATCH 111/266] change token address --- .../bridge/history/HistoryDesktop.tsx | 7 +-- .../bridge/history/HistoryMobile.tsx | 61 +++++++++++++++++-- .../src/utils/tokens.ts | 2 +- 3 files changed, 59 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5a2623e7..a175b4e1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -11,7 +11,7 @@ import { useBridgeAPI } from '@/hooks/useBridgeAPI' import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -interface WithdrawTransactionsProps {} +interface HistoryDesktopProps {} const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { const combinedData = new Map() @@ -44,14 +44,13 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { } } -const HistoryDesktop: React.FC = () => { +const HistoryDesktop: React.FC = () => { const { connectedAccount } = useBlockchainContext() const messages = useMessages(connectedAccount) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] // Merge transactions only when API data is updated with new data useEffect(() => { @@ -86,7 +85,7 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {formattedApiTransactions.filter( + {mergedTransactions.filter( (tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL' ).length === 0 &&
No transactions yet
}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx index d1a61ded..1fb86bee 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx @@ -1,22 +1,71 @@ -import React from 'react' +import React, { useEffect, useState } from 'react' +import Deposit from './Deposit' import styles from './HistoryMobile.module.css' +import { ethers } from 'ethers' import Withdrawal from '@/components/bridge/history/Withdrawal' import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBridgeAPI } from '@/hooks/useBridgeAPI' import { useMessages } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import Deposit from './Deposit' interface HistoryMobileProps {} + +const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { + const combinedData = new Map() + + localData.forEach((tx) => + combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) + ) + apiData.forEach((tx) => + combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) + ) + return Array.from(combinedData.values()) +} + +const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { + const amountFormatted = apiData?.amount ? ethers.utils.formatEther(apiData.amount) : '0.0' + return { + type: apiData.type, + amount: amountFormatted, + lowNetworkChainId: apiData.parentNetworkChainId, + highNetworkChainId: apiData.childNetworkChainId, + lowNetworkHash: apiData.parentNetworkHash, + highNetworkHash: apiData.childNetworkHash, + lowNetworkTimestamp: apiData.parentNetworkTimestamp, + highNetworkTimestamp: apiData.childNetworkTimestamp, + completionTimestamp: apiData.completionTimestamp, + claimableTimestamp: apiData.claimableTimestamp, + challengePeriod: apiData.challengePeriod, + tokenAddress: apiData.token + } +} const HistoryMobile: React.FC = ({}) => { const { connectedAccount } = useBlockchainContext() const messages = useMessages(connectedAccount) + const { useHistoryTransactions } = useBridgeAPI() + const { data: apiTransactions } = useHistoryTransactions(connectedAccount) + const [mergedTransactions, setMergedTransactions] = useState([]) + + useEffect(() => { + const localTransactions = messages.data || [] + const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] + const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) + setMergedTransactions(combinedTransactions) + }, [messages.data, apiTransactions]) return (
- {messages.data && - messages.data.map((tx: TransactionRecord, idx: number) => - tx.type === 'DEPOSIT' ? : - )} + {mergedTransactions && + mergedTransactions + .sort((x: TransactionRecord, y: TransactionRecord) => { + const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp + const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp + + return (yTimestamp ?? 0) - (xTimestamp ?? 0) + }) + .map((tx: TransactionRecord, idx: number) => + tx.type === 'DEPOSIT' ? : + )}
) } diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index da029422..52eae2b7 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -47,7 +47,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st { name: 'USDC', symbol: 'USDC', - address: '0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8', + address: '0x746d7b1dfcD1Cc2f4b7d09F3F1B9A21764FBeB33', Icon: IconUSDC, rpc: L1_NETWORK.rpcs[0], tokenAddressMap: USDC, From 70f3a245f6af45870f36ca5450c6391ee3b3250b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 6 Nov 2024 20:34:06 +0000 Subject: [PATCH 112/266] usdc --- webapps/world-builder-dashboard/constants.ts | 6 +-- .../components/bridge/bridge/ActionButton.tsx | 38 +++++++++++++------ .../bridge/bridge/ValueToBridge.tsx | 6 --- .../src/components/bridge/history/Deposit.tsx | 2 +- .../history/WithdrawTransactions.module.css | 1 - .../src/hooks/useBalance.ts | 9 ++++- .../src/hooks/useBridgeTransfer.ts | 1 - .../src/utils/tokens.ts | 14 ++++--- 8 files changed, 48 insertions(+), 29 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 5f1670ab..b2d8ce5f 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -85,9 +85,9 @@ export const ETH: TokenAddressMap = { } export const USDC: TokenAddressMap = { - 13746: '0x6a0D75EF95d21f1Ba5e2619fBc9D15F424d130BF', - 421614: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', - 11155111: '0x94a9D9AC8a22534E3FaCa9F4e7F2E2cf85d5E4C8' + 13746: '0xf2B58E3519C5b977a254993A4A6EaD581A8989A0', + 421614: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', + 11155111: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' } // ETH, ARBITRUM, USDC, MANTLE, USDT, diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 05fb7443..9aa033bf 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -3,11 +3,11 @@ import React from 'react' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' // Constants -import { ALL_NETWORKS } from '../../../../constants' +import { ALL_NETWORKS, USDC } from '../../../../constants' // Styles import styles from './ActionButton.module.css' import { ethers } from 'ethers' -import { Bridger } from 'game7-bridge-sdk' +import { Bridger, BridgeTransferStatus } from 'game7-bridge-sdk' // Absolute Imports import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' @@ -23,6 +23,7 @@ interface ActionButtonProps { symbol?: string } const ActionButton: React.FC = ({ + direction, amount, isDisabled, setErrorMessage, @@ -76,23 +77,38 @@ const ActionButton: React.FC = ({ const queryClient = useQueryClient() const transfer = useMutation( async (amount: string) => { - const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) - const provider = await getProvider(network!) + const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId)! + const provider = await getProvider(network) const signer = provider.getSigner() - const destinationRPC = selectedHighNetwork.rpcs[0] + + const destinationRPC = direction === 'DEPOSIT' ? selectedHighNetwork.rpcs[0] : selectedLowNetwork.rpcs[0] const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider + // Amount to send variable parsed to correct decimal places depending on the token + let amountToSend + const bridgeToken = bridger?.token + + // if usdc, parse to 6 decimal places + if (bridgeToken === USDC) amountToSend = ethers.utils.parseUnits(amount, 6) + else amountToSend = ethers.utils.parseUnits(amount) + // If deposit if (bridger?.isDeposit) { if (selectedBridgeToken.address != ZERO_ADDRESS) { const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' + let allowanceToCheck + + if (bridgeToken === USDC) allowanceToCheck = ethers.utils.formatUnits(allowance, 6) + else allowanceToCheck = ethers.utils.formatEther(allowance) + // approve first - if (Number(ethers.utils.formatEther(allowance)) < Number(amount)) { - const txApprove = await bridger?.approve(ethers.utils.parseUnits(amount), signer) + if (Number(allowanceToCheck) < Number(amount)) { + const txApprove = await bridger?.approve(amountToSend, signer) await txApprove.wait() } } - const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) + + const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) await tx?.wait() return { type: 'DEPOSIT', @@ -103,11 +119,11 @@ const ActionButton: React.FC = ({ lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, newTransaction: true, - ETA: Date.now() / 1000 + (60 * 15), + ETA: Date.now() / 1000 + 60 * 15, symbol: symbol } } else { - const tx = await bridger?.transfer({ amount: ethers.utils.parseUnits(amount), signer, destinationProvider }) + const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) await tx?.wait() return { type: 'WITHDRAWAL', @@ -117,7 +133,7 @@ const ActionButton: React.FC = ({ highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, challengePeriod: 60 * 40, - ETA: Date.now() / 1000 + (60 * 60), + ETA: Date.now() / 1000 + 60 * 60, symbol: symbol } } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 44408228..00837824 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -103,17 +103,11 @@ const ValueToBridge: React.FC = ({ selectedChainId={selectedChainId} /> )} - {/*
- -
{L3_NATIVE_TOKEN_SYMBOL}
- -
*/}
{rate > 0 ? formatCurrency(Number(value) * rate) : ' '}
{balance ?? '0'}
{' '} - {/*TODO how to display undefined balance */}
{`${symbol} Available`}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index abd82e19..624b63bb 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -29,7 +29,7 @@ const Deposit: React.FC = ({ deposit }) => { const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) - + return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css index 86457728..7b685162 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawTransactions.module.css @@ -205,7 +205,6 @@ align-items: center; gap: 12px; align-self: stretch; - border-bottom: 1px solid var(--Gray-200, #eaecf0); background: var(--Gray-60, #f9fafb); color: var(--Gray-600, #475467); font-family: Inter, sans-serif; diff --git a/webapps/world-builder-dashboard/src/hooks/useBalance.ts b/webapps/world-builder-dashboard/src/hooks/useBalance.ts index 600fec48..ef98113c 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBalance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBalance.ts @@ -16,7 +16,14 @@ const useTokenInformation = ({ account, token }: UseBalanceProps) => { return { tokenBalance: '0', symbol: '' } } const bridgeToken: BridgeToken = new BridgeToken(token.tokenAddressMap, token.chainId) - const tokenBalance = String(ethers.utils.formatEther(await bridgeToken.getBalance(token.rpc, account ?? ''))) + let tokenBalance + if (token.decimals) { + tokenBalance = String( + ethers.utils.formatUnits(await bridgeToken.getBalance(token.rpc, account ?? ''), token.decimals) + ) + } else { + tokenBalance = String(ethers.utils.formatEther(await bridgeToken.getBalance(token.rpc, account ?? ''))) + } const symbol = await bridgeToken.getSymbol(token.rpc) return { tokenBalance, symbol } }, diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 08f957c0..4b63115e 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -67,7 +67,6 @@ export const useBridgeTransfer = () => { : t.highNetworkHash === txRecord.highNetworkHash ) if (cachedTransaction && cachedTransaction.status) { - console return { ETA: cachedTransaction.ETA, status: cachedTransaction.status } } } diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 52eae2b7..f9609a70 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -14,6 +14,7 @@ export interface Token { rpc: string tokenAddressMap: TokenAddressMap chainId: number + decimals?: number } export const getTokensForNetwork = (chainId: number | undefined, userAddress: string | undefined): Token[] => { @@ -47,11 +48,12 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st { name: 'USDC', symbol: 'USDC', - address: '0x746d7b1dfcD1Cc2f4b7d09F3F1B9A21764FBeB33', + address: '0xf2B58E3519C5b977a254993A4A6EaD581A8989A0', Icon: IconUSDC, rpc: L1_NETWORK.rpcs[0], tokenAddressMap: USDC, - chainId: L1_NETWORK.chainId + chainId: L1_NETWORK.chainId, + decimals: 6 }, ...storedTokensWithItems ] @@ -78,11 +80,12 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st { name: 'USDC', symbol: 'USDC', - address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + address: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', Icon: IconUSDC, rpc: L2_NETWORK.rpcs[0], tokenAddressMap: USDC, - chainId: L2_NETWORK.chainId + chainId: L2_NETWORK.chainId, + decimals: 6 }, ...storedTokensWithItems ] @@ -104,7 +107,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconUSDC, rpc: L3_NETWORK.rpcs[0], tokenAddressMap: USDC, - chainId: L3_NETWORK.chainId + chainId: L3_NETWORK.chainId, + decimals: 6 }, ...storedTokensWithItems ] From f575ddce9af51464c73c21a768ecd78c4204a96c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 7 Nov 2024 00:50:03 +0000 Subject: [PATCH 113/266] updates --- webapps/world-builder-dashboard/constants.ts | 4 ++-- .../src/components/bridge/bridge/ActionButton.tsx | 3 ++- .../src/components/bridge/bridge/BridgeView.tsx | 1 + .../src/components/bridge/history/HistoryDesktop.tsx | 6 ++++-- webapps/world-builder-dashboard/src/utils/tokens.ts | 4 ++-- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index b2d8ce5f..568ad16f 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -86,9 +86,9 @@ export const ETH: TokenAddressMap = { export const USDC: TokenAddressMap = { 13746: '0xf2B58E3519C5b977a254993A4A6EaD581A8989A0', - 421614: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', + 421614: '0x119f0E6303BEc7021B295EcaB27A4a1A5b37ECf0', 11155111: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' } // ETH, ARBITRUM, USDC, MANTLE, USDT, -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH] +export const ALL_TOKEN_MAPPINGS = [TG7T, ETH, USDC] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 9aa033bf..08d2a7c1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -80,8 +80,9 @@ const ActionButton: React.FC = ({ const network = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId)! const provider = await getProvider(network) const signer = provider.getSigner() - const destinationRPC = direction === 'DEPOSIT' ? selectedHighNetwork.rpcs[0] : selectedLowNetwork.rpcs[0] + + console.log(destinationRPC) const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider // Amount to send variable parsed to correct decimal places depending on the token diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 4f3a99a2..ad3a9f66 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -58,6 +58,7 @@ const BridgeView = ({ const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) + console.log(token) } const estimatedFee = useQuery( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index a175b4e1..1fed6a72 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -16,10 +16,10 @@ interface HistoryDesktopProps {} const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { const combinedData = new Map() - localData.forEach((tx) => + apiData.forEach((tx) => combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) ) - apiData.forEach((tx) => + localData.forEach((tx) => combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) ) return Array.from(combinedData.values()) @@ -51,6 +51,8 @@ const HistoryDesktop: React.FC = () => { const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] + const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] + // Merge transactions only when API data is updated with new data useEffect(() => { diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index f9609a70..4ce385eb 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -80,7 +80,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st { name: 'USDC', symbol: 'USDC', - address: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', + address: '0x119f0E6303BEc7021B295EcaB27A4a1A5b37ECf0', Icon: IconUSDC, rpc: L2_NETWORK.rpcs[0], tokenAddressMap: USDC, @@ -103,7 +103,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st { name: 'USDC', symbol: 'USDC', - address: '0x6a0D75EF95d21f1Ba5e2619fBc9D15F424d130BF', + address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', Icon: IconUSDC, rpc: L3_NETWORK.rpcs[0], tokenAddressMap: USDC, From cc1e67982bef3f67699949cadfe0bdfd778c7ddd Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 7 Nov 2024 12:33:06 +0000 Subject: [PATCH 114/266] correct ETA --- .../src/components/bridge/bridge/ActionButton.tsx | 10 +++++----- .../src/components/bridge/history/Deposit.tsx | 10 +++++----- .../src/components/bridge/history/HistoryDesktop.tsx | 4 ++-- .../src/hooks/useBridgeTransfer.ts | 2 +- .../world-builder-dashboard/src/utils/timeFormat.ts | 11 +++++++---- 5 files changed, 20 insertions(+), 17 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 08d2a7c1..dca58160 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -81,8 +81,6 @@ const ActionButton: React.FC = ({ const provider = await getProvider(network) const signer = provider.getSigner() const destinationRPC = direction === 'DEPOSIT' ? selectedHighNetwork.rpcs[0] : selectedLowNetwork.rpcs[0] - - console.log(destinationRPC) const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider // Amount to send variable parsed to correct decimal places depending on the token @@ -120,8 +118,9 @@ const ActionButton: React.FC = ({ lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, newTransaction: true, - ETA: Date.now() / 1000 + 60 * 15, - symbol: symbol + ETA: (Date.now() / 1000) + 60 * 15, + symbol: symbol, + status: BridgeTransferStatus.DEPOSIT_GAS_PENDING } } else { const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) @@ -135,7 +134,8 @@ const ActionButton: React.FC = ({ highNetworkTimestamp: Date.now() / 1000, challengePeriod: 60 * 40, ETA: Date.now() / 1000 + 60 * 60, - symbol: symbol + symbol: symbol, + status: BridgeTransferStatus.WITHDRAW_UNCONFIRMED } } }, diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 624b63bb..aed9b172 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -11,6 +11,7 @@ import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' +import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' interface DepositProps { deposit: TransactionRecord @@ -29,7 +30,7 @@ const Deposit: React.FC = ({ deposit }) => { const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) - + const status = useDepositStatus(deposit) return ( <> {isLoading && smallView ? ( @@ -84,10 +85,9 @@ const Deposit: React.FC = ({ deposit }) => {
- {transferStatus?.status && - (transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED) ? ( -
{timeAgo(deposit.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( +
{timeAgo(status?.data?.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
) : (
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 1fed6a72..ba1cbb9c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -65,7 +65,7 @@ const HistoryDesktop: React.FC = () => { return (
- {mergedTransactions && ( + {messages.data && (
{headers.map((h) => ( @@ -73,7 +73,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {mergedTransactions + {messages.data .sort((x: TransactionRecord, y: TransactionRecord) => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 4b63115e..84ca8194 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -67,7 +67,7 @@ export const useBridgeTransfer = () => { : t.highNetworkHash === txRecord.highNetworkHash ) if (cachedTransaction && cachedTransaction.status) { - return { ETA: cachedTransaction.ETA, status: cachedTransaction.status } + return { status: cachedTransaction.status } } } }, diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index 5bd885c2..2aa72d4f 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -28,11 +28,14 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde if (!timestamp || !delayInSeconds) { return 'N/A' } - const now = new Date().getTime() - const date = new Date(Number(timestamp) + delayInSeconds * 1000).getTime() - const timeDifference = Math.floor((date - now) / 1000) + const now = Math.floor(new Date().getTime() / 1000) + const date = Math.floor(Number(timestamp) + delayInSeconds) + const timeDifference = ((date - now)) + console.log(now) + console.log(date) + console.log(timeDifference) if (timeDifference < 0) { - return '~now' + return '~now' } const units = [ From 8834d155949906130b1a7d04d526460fc6619f26 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 7 Nov 2024 14:29:17 +0000 Subject: [PATCH 115/266] testing for demo --- .../components/bridge/bridge/ActionButton.tsx | 4 +- .../src/components/bridge/history/Deposit.tsx | 8 ++- .../bridge/history/HistoryDesktop.tsx | 6 +- .../components/bridge/history/Withdrawal.tsx | 17 +++--- .../notifications/NotificationsDropModal.tsx | 4 +- .../src/hooks/useBridgeTransfer.ts | 57 ++++++++++++------- .../src/utils/timeFormat.ts | 3 - 7 files changed, 59 insertions(+), 40 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index dca58160..5a6b6267 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -118,7 +118,6 @@ const ActionButton: React.FC = ({ lowNetworkTimestamp: Date.now() / 1000, completionTimestamp: Date.now() / 1000, newTransaction: true, - ETA: (Date.now() / 1000) + 60 * 15, symbol: symbol, status: BridgeTransferStatus.DEPOSIT_GAS_PENDING } @@ -132,8 +131,7 @@ const ActionButton: React.FC = ({ highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: 60 * 40, - ETA: Date.now() / 1000 + 60 * 60, + challengePeriod: 60 * 60, symbol: symbol, status: BridgeTransferStatus.WITHDRAW_UNCONFIRMED } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index aed9b172..7114b922 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -8,10 +8,10 @@ import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' +import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' -import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' interface DepositProps { deposit: TransactionRecord @@ -31,6 +31,12 @@ const Deposit: React.FC = ({ deposit }) => { (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) const status = useDepositStatus(deposit) + console.log( + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED + ? transferStatus?.status + : transferStatus?.status + ) return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index ba1cbb9c..58327edf 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -52,7 +52,7 @@ const HistoryDesktop: React.FC = () => { const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] - + console.log(formattedApiTransactions) // Merge transactions only when API data is updated with new data useEffect(() => { @@ -65,7 +65,7 @@ const HistoryDesktop: React.FC = () => { return (
- {messages.data && ( + {mergedTransactions && (
{headers.map((h) => ( @@ -73,7 +73,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {messages.data + {mergedTransactions .sort((x: TransactionRecord, y: TransactionRecord) => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 758db9c6..0e27d0bb 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -12,6 +12,7 @@ import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' import { useMediaQuery } from '@mantine/hooks' +import { BridgeTransferStatus } from 'game7-bridge-sdk' export const networkRPC = (chainId: number | undefined) => { const network = [L3_NETWORK, L2_NETWORK].find((n) => n.chainId === chainId) @@ -70,6 +71,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { return <> } + console.log(transferStatus?.status) + return ( <> {isLoading && smallView ? ( @@ -105,7 +108,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus?.status === BridgeTransferStatus.WITHDRAW_EXECUTED && ( <>
= ({ withdrawal }) => {
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+
{timeAgo(withdrawal?.lowNetworkTimestamp)}
Finalize
@@ -251,13 +254,13 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
{timeAgo(status.data.lowNetworkTimeStamp)}
+
{timeAgo(withdrawal?.lowNetworkTimestamp)}
)} )} - {transferStatus && transferStatus.status != ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus.status != BridgeTransferStatus.WITHDRAW_EXECUTED && ( <>
@@ -271,7 +274,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
{status.data?.from ?? ''}
{status.data?.to ?? ''}
- {transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus.status === BridgeTransferStatus.WITHDRAW_CONFIRMED && ( <> )} - {transferStatus && transferStatus.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus && transferStatus.status === BridgeTransferStatus.WITHDRAW_UNCONFIRMED && ( <>
-
{ETA(transferStatus?.ETA, withdrawal.challengePeriod)} left
+
{ETA(withdrawal?.highNetworkTimestamp, withdrawal.challengePeriod)} left
)} diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 89a2e303..97fe1bb1 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -29,12 +29,12 @@ const copy = (notification: BridgeNotification) => { } if (notification.status === 'COMPLETED') { if (notification.type === 'DEPOSIT') { - return `${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL} deposited to ${targetNetwork}` + return `${notification.amount} ${notification.tx.symbol} deposited to ${targetNetwork}` } if (notification.type === 'CLAIM') { return `You requested ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL}` } - return `Your ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL} withdrawal is complete` + return `Your ${notification.amount} ${notification.tx.symbol} withdrawal is complete` } } diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 84ca8194..39617283 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -17,10 +17,6 @@ export const useBridgeTransfer = () => { return useQuery( ['transferData', txRecord], async () => { - if (!txRecord) { - return { ETA: 0, status: 0 } - } - const _bridgeTransfer = new BridgeTransfer({ txHash: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkHash : txRecord.highNetworkHash) ?? '', destinationNetworkChainId: @@ -57,24 +53,42 @@ export const useBridgeTransfer = () => { return status }, { - initialData: () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - if (transactionsString) { - const transactions = JSON.parse(transactionsString) - const cachedTransaction = transactions.find((t: TransactionRecord) => - txRecord.type === 'DEPOSIT' - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - ) - if (cachedTransaction && cachedTransaction.status) { - return { status: cachedTransaction.status } - } - } - }, - refetchInterval: 50000, + // initialData: () => { + // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + // if (transactionsString) { + // const transactions = JSON.parse(transactionsString) + // const cachedTransaction = transactions.find((t: TransactionRecord) => + // txRecord.type === 'DEPOSIT' + // ? t.lowNetworkHash === txRecord.lowNetworkHash + // : t.highNetworkHash === txRecord.highNetworkHash + // ) + // if (cachedTransaction && cachedTransaction.status) { + // return { status: cachedTransaction.status } + // } + // } + // }, + refetchInterval: 60 * 15 * 1000, staleTime: 60 * 1000, refetchOnWindowFocus: false, - enabled: !!txRecord + enabled: !!txRecord, + // onSuccess: (status) => { + // console.log("checking...") + // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + // const transactions = transactionsString ? JSON.parse(transactionsString) : [] + + // const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + // const hashComparison: boolean = + // txRecord.type === 'DEPOSIT' + // ? t.lowNetworkHash === txRecord.lowNetworkHash + // : t.highNetworkHash === txRecord.highNetworkHash + + // if (hashComparison && t.status !== status?.status) { + // return { ...t, status: status?.status } + // } + // return { ...t } + // }) + // localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + // } } ) } @@ -110,7 +124,8 @@ export const useBridgeTransfer = () => { txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: withdrawal.lowNetworkChainId === 11155111 ? L1_NETWORK.rpcs[0] : '' + destinationSignerOrProviderOrRpc: ALL_NETWORKS.find((n) => n.chainId === withdrawal.lowNetworkChainId)?.rpcs[0], + originSignerOrProviderOrRpc: ALL_NETWORKS.find((n) => n.chainId === withdrawal.highNetworkChainId)?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } diff --git a/webapps/world-builder-dashboard/src/utils/timeFormat.ts b/webapps/world-builder-dashboard/src/utils/timeFormat.ts index 2aa72d4f..92195148 100644 --- a/webapps/world-builder-dashboard/src/utils/timeFormat.ts +++ b/webapps/world-builder-dashboard/src/utils/timeFormat.ts @@ -31,9 +31,6 @@ export const ETA = (timestamp: number | undefined, delayInSeconds: number | unde const now = Math.floor(new Date().getTime() / 1000) const date = Math.floor(Number(timestamp) + delayInSeconds) const timeDifference = ((date - now)) - console.log(now) - console.log(date) - console.log(timeDifference) if (timeDifference < 0) { return '~now' } From fda7a4dccbf67d65065db9f3ffae69fb902157e0 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 7 Nov 2024 20:52:29 +0000 Subject: [PATCH 116/266] deposit caching looking .. ok? --- .../src/components/bridge/history/Deposit.tsx | 34 ++++++----- .../bridge/history/HistoryDesktop.tsx | 1 - .../components/bridge/history/Withdrawal.tsx | 2 - .../src/hooks/useBridgeTransfer.ts | 60 ++++++++----------- 4 files changed, 43 insertions(+), 54 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 7114b922..49ee9922 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -30,13 +30,7 @@ const Deposit: React.FC = ({ deposit }) => { const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) - const status = useDepositStatus(deposit) - console.log( - transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED - ? transferStatus?.status - : transferStatus?.status - ) + const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) return ( <> {isLoading && smallView ? ( @@ -90,14 +84,24 @@ const Deposit: React.FC = ({ deposit }) => { )}
-
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( -
{timeAgo(status?.data?.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
- ) : ( -
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
- )} -
+ {isLoadingStatus ? ( +
+
Loading
+
+ ) : ( +
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( + <> + {status?.highNetworkTimestamp === undefined + ? 'No status found' + : timeAgo(status?.highNetworkTimestamp)} + + ) : ( + <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} + )} +
+ )} )} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 58327edf..eb77f09b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -52,7 +52,6 @@ const HistoryDesktop: React.FC = () => { const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] - console.log(formattedApiTransactions) // Merge transactions only when API data is updated with new data useEffect(() => { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 0e27d0bb..1c5296da 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -71,8 +71,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { return <> } - console.log(transferStatus?.status) - return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 39617283..86a2c366 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -6,6 +6,7 @@ import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' +import { useNavigate } from 'react-router-dom' interface UseTransferDataProps { txRecord: TransactionRecord @@ -14,6 +15,7 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const { connectedAccount } = useBlockchainContext() + let status: any return useQuery( ['transferData', txRecord], async () => { @@ -33,7 +35,7 @@ export const useBridgeTransfer = () => { : ALL_NETWORKS.find((n) => n.chainId === txRecord.highNetworkChainId)?.rpcs[0] }) - const status = await _bridgeTransfer.getStatus() + status = await _bridgeTransfer.getStatus() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) const transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -53,48 +55,33 @@ export const useBridgeTransfer = () => { return status }, { - // initialData: () => { - // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - // if (transactionsString) { - // const transactions = JSON.parse(transactionsString) - // const cachedTransaction = transactions.find((t: TransactionRecord) => - // txRecord.type === 'DEPOSIT' - // ? t.lowNetworkHash === txRecord.lowNetworkHash - // : t.highNetworkHash === txRecord.highNetworkHash - // ) - // if (cachedTransaction && cachedTransaction.status) { - // return { status: cachedTransaction.status } - // } - // } - // }, - refetchInterval: 60 * 15 * 1000, + placeholderData: () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + if (transactionsString) { + const transactions = JSON.parse(transactionsString) + const cachedTransaction = transactions.find((t: TransactionRecord) => + txRecord.type === 'DEPOSIT' + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + ) + if (cachedTransaction && cachedTransaction.status) { + return { status: cachedTransaction.status } + } else { + console.log('no tx found', txRecord.highNetworkHash) + } + } + }, + // if status is completed, no need to refetch again. if pending, refetch every 1-2 minuites + refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 1000, staleTime: 60 * 1000, refetchOnWindowFocus: false, - enabled: !!txRecord, - // onSuccess: (status) => { - // console.log("checking...") - // const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - // const transactions = transactionsString ? JSON.parse(transactionsString) : [] - - // const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { - // const hashComparison: boolean = - // txRecord.type === 'DEPOSIT' - // ? t.lowNetworkHash === txRecord.lowNetworkHash - // : t.highNetworkHash === txRecord.highNetworkHash - - // if (hashComparison && t.status !== status?.status) { - // return { ...t, status: status?.status } - // } - // return { ...t } - // }) - // localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) - // } + enabled: !!txRecord } ) } // Mutate function - + const navigate = useNavigate() const { refetchNewNotifications } = useBridgeNotificationsContext() const queryClient = useQueryClient() const { switchChain, connectedAccount } = useBlockchainContext() @@ -158,6 +145,7 @@ export const useBridgeTransfer = () => { queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) queryClient.refetchQueries(['pendingTransactions']) + navigate('/bridge/transactions') }, onError: (error: Error) => { console.log(error) From e93ac5a1fa7b34dfcbea9787d6ee615b28f68434 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 09:35:33 +0000 Subject: [PATCH 117/266] localStorageCaching for withdrawal if api data doesn't contain --- .../components/bridge/history/Withdrawal.tsx | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 1c5296da..3d725798 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react' import { HIGH_NETWORKS, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' +import { BridgeTransferStatus } from 'game7-bridge-sdk' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' @@ -12,7 +13,6 @@ import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' import { useMediaQuery } from '@mantine/hooks' -import { BridgeTransferStatus } from 'game7-bridge-sdk' export const networkRPC = (chainId: number | undefined) => { const network = [L3_NETWORK, L2_NETWORK].find((n) => n.chainId === chainId) @@ -67,6 +67,13 @@ const Withdrawal: React.FC = ({ withdrawal }) => { (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) + const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction + console.log( + withdrawalCompletedData?.highNetworkHash === '0x4446ccf6102cf62aa4c65198b854e30f2e8d5eb273441f0c2f860b60d63b99c4' + ? withdrawalCompletedData + : withdrawal + ) + if (!status) { return <> } @@ -182,7 +189,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onMouseLeave={() => setHovered(false)} > @@ -202,7 +209,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} > -
{timeAgo(status.data.lowNetworkTimeStamp)}
+
{timeAgo(withdrawalCompletedData?.completionTimestamp)}
{collapseExecuted && ( <> @@ -228,12 +235,16 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
{timeAgo(withdrawal?.lowNetworkTimestamp)}
+
+ {timeAgo(withdrawalCompletedData?.completionTimestamp)} +
Finalize
-
{timeAgo(withdrawal?.completionTimestamp)}
+
+ {timeAgo(withdrawalCompletedData?.completionTimestamp)} +
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
@@ -241,7 +252,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status.data?.to ?? ''}
-
{timeAgo(withdrawal?.lowNetworkTimestamp)}
+
+ {timeAgo(withdrawalCompletedData?.completionTimestamp)} +
)} From 2d1a77516c8832ac5534024510e108d8580a4b52 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 13:58:34 +0000 Subject: [PATCH 118/266] withdrawal caching looking greeeeaat! RPC nodes left. testing on staging --- .../src/components/bridge/bridge/ActionButton.tsx | 2 +- .../src/components/bridge/history/Withdrawal.tsx | 6 +++--- .../src/components/faucet/FaucetView.tsx | 1 - .../src/hooks/useBridgeTransfer.ts | 10 ++++++---- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 5a6b6267..54e6ba54 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -107,7 +107,7 @@ const ActionButton: React.FC = ({ } } - const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) + const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) await tx?.wait() return { type: 'DEPOSIT', diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 3d725798..75f33286 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -69,9 +69,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction console.log( - withdrawalCompletedData?.highNetworkHash === '0x4446ccf6102cf62aa4c65198b854e30f2e8d5eb273441f0c2f860b60d63b99c4' - ? withdrawalCompletedData - : withdrawal + withdrawal?.highNetworkHash === '0x6604642ea8d288e5d1a3c94f5b156009eac96415ae71b1602a148293a4e0840f' + ? { status: transferStatus?.status, localStorageTransaction } + : undefined ) if (!status) { diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index e54655dd..35391a05 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -132,7 +132,6 @@ const FaucetView: React.FC = ({}) => { }) queryClient.invalidateQueries(['faucetTimestamp', address]) - queryClient.refetchQueries('pendingTransactions') queryClient.refetchQueries(['notifications']) queryClient.refetchQueries(['nativeBalance']) queryClient.refetchQueries(['ERC20balance']) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 86a2c366..03d28d53 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,12 +1,12 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' +import { useNavigate } from 'react-router-dom' import { ALL_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { useNavigate } from 'react-router-dom' interface UseTransferDataProps { txRecord: TransactionRecord @@ -118,12 +118,14 @@ export const useBridgeTransfer = () => { return { res, withdrawal } }, { - onSuccess: ({ res, withdrawal }, highNetworkHash) => { + onSuccess: ({ res, withdrawal }) => { + console.log('done .. ?') try { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { - if (t.highNetworkHash === highNetworkHash) { + if (t.highNetworkHash === withdrawal.highNetworkHash) { + console.log("found it, changing it, loving it") return { ...t, completionTimestamp: Date.now() / 1000, @@ -133,6 +135,7 @@ export const useBridgeTransfer = () => { status: BridgeTransferStatus.WITHDRAW_EXECUTED } } + console.log('no find, break heart') return { ...t } }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) @@ -144,7 +147,6 @@ export const useBridgeTransfer = () => { queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) - queryClient.refetchQueries(['pendingTransactions']) navigate('/bridge/transactions') }, onError: (error: Error) => { From 163e78d516355bbc12a2b338444eacf457c8ace3 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 14:06:37 +0000 Subject: [PATCH 119/266] checking staging with node --- webapps/world-builder-dashboard/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 568ad16f..0fc07a66 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://eth-sepolia.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -21,7 +21,7 @@ export const L2_NETWORK: HighNetworkInterface = { chainId: 421614, name: 'arbitrumSepolia', displayName: 'Arbitrum Sepolia', - rpcs: ['https://sepolia-rollup.arbitrum.io/rpc'], + rpcs: ['https://nb.moonstream.to/nb/arbitrum-sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], blockExplorerUrls: ['https://sepolia.arbiscan.io'], nativeCurrency: { decimals: 18, From f0edbbf5c3bd566537c785394bd901688ba916d2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 14:10:29 +0000 Subject: [PATCH 120/266] fix build error --- .../src/components/bridge/history/HistoryDesktop.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index eb77f09b..f7717f60 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -51,8 +51,7 @@ const HistoryDesktop: React.FC = () => { const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] - + // Merge transactions only when API data is updated with new data useEffect(() => { const localTransactions = messages.data || [] From 6a33a92c5449b9df6d8612f9817557fd0d16b917 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 14:14:01 +0000 Subject: [PATCH 121/266] old rpc nodes --- webapps/world-builder-dashboard/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 0fc07a66..568ad16f 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -5,7 +5,7 @@ export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://nb.moonstream.to/nb/sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], + rpcs: ['https://eth-sepolia.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -21,7 +21,7 @@ export const L2_NETWORK: HighNetworkInterface = { chainId: 421614, name: 'arbitrumSepolia', displayName: 'Arbitrum Sepolia', - rpcs: ['https://nb.moonstream.to/nb/arbitrum-sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], + rpcs: ['https://sepolia-rollup.arbitrum.io/rpc'], blockExplorerUrls: ['https://sepolia.arbiscan.io'], nativeCurrency: { decimals: 18, From 33aea890cf2695bccf1a3500990ad36ffb7c76fe Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 14:56:56 +0000 Subject: [PATCH 122/266] coingeckoapi checkpoint --- .../components/bridge/bridge/BridgeView.tsx | 6 ++-- .../bridge/bridge/TransactionSummary.tsx | 6 ++-- .../components/bridge/history/Withdrawal.tsx | 4 --- .../src/hooks/useBridgeTransfer.ts | 3 +- .../src/hooks/useCoinGeckoAPI.ts | 28 +++++++++++++++++++ .../src/utils/tokens.ts | 27 ++++++++++++------ 6 files changed, 53 insertions(+), 21 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index ad3a9f66..484f2e5f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -22,6 +22,7 @@ import useEthUsdRate from '@/hooks/useEthUsdRate' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' +import { useCoinGeckoAPI } from '@/hooks/useCoinGeckoAPI' const BridgeView = ({ direction, @@ -38,8 +39,8 @@ const BridgeView = ({ const [inputErrorMessages, setInputErrorMessages] = useState({ value: '', data: '', destination: '' }) const [networkErrorMessage, setNetworkErrorMessage] = useState('') const { isMessagingEnabled } = useUISettings() + const { useUSDPriceOfToken } = useCoinGeckoAPI() const g7tUsdRate = useQuery(['rate'], () => 2501.32) - const { data: ethUsdRate } = useEthUsdRate() const { connectedAccount, selectedLowNetwork, @@ -55,6 +56,7 @@ const BridgeView = ({ token: selectedBridgeToken }) + const {data: coinUSDRate} = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? "") const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) @@ -215,7 +217,7 @@ const BridgeView = ({ fee={Number(estimatedFee.data ?? 0)} isEstimatingFee={estimatedFee.isFetching} value={Number(value)} - ethRate={ethUsdRate ?? 0} + ethRate={coinUSDRate ?? 0} tokenSymbol={tokenInformation?.symbol ?? ''} tokenRate={g7tUsdRate.data ?? 0} gasTokenSymbol={ diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx index d14995ec..c7497ce5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx @@ -21,7 +21,6 @@ interface TransactionSummaryProps { isEstimatingFee: boolean value: number gasBalance: number - ethRate: number tokenSymbol: string gasTokenSymbol: string tokenRate: number @@ -34,7 +33,6 @@ const TransactionSummary: React.FC = ({ transferTime, fee, isEstimatingFee, - ethRate, tokenRate, tokenSymbol, gasTokenSymbol, @@ -89,9 +87,9 @@ const TransactionSummary: React.FC = ({ className={styles.value} title={`balance: ${String(gasBalance)}`} >{`${fee.toFixed(18).replace(/\.?0+$/, '')} ${gasTokenSymbol}`}
- {!!(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate)) && ( + {!!(fee * tokenRate) && (
- {formatCurrency(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate))} + {formatCurrency(fee *tokenRate)}
)}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 75f33286..830274e8 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -14,10 +14,6 @@ import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' import { useMediaQuery } from '@mantine/hooks' -export const networkRPC = (chainId: number | undefined) => { - const network = [L3_NETWORK, L2_NETWORK].find((n) => n.chainId === chainId) - return network?.rpcs[0] -} interface WithdrawalProps { withdrawal: TransactionRecord diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 03d28d53..d69cdc3a 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -72,8 +72,7 @@ export const useBridgeTransfer = () => { } }, // if status is completed, no need to refetch again. if pending, refetch every 1-2 minuites - refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 1000, - staleTime: 60 * 1000, + refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 5 * 1000, refetchOnWindowFocus: false, enabled: !!txRecord } diff --git a/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts b/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts new file mode 100644 index 00000000..6de88623 --- /dev/null +++ b/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts @@ -0,0 +1,28 @@ +import { useQuery } from 'react-query' +const BASE_URL = 'https://api.coingecko.com/api/v3/simple/price' + +export const useCoinGeckoAPI = () => { + const useUSDPriceOfToken = (coin: string) => { + return useQuery( + ['priceCrypto', coin], + async () => { + const res = await fetch(`${BASE_URL}?ids=${coin}&vs_currencies=usd`, { + method: 'GET' + }) + if (!res.ok) { + throw new Error(`Error: ${res.statusText}`) + } + const data = await res.json() + return data + }, + { + enabled: !!coin, + retry: false + } + ) + } + + return { + useUSDPriceOfToken + } +} diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 4ce385eb..21362485 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -15,6 +15,7 @@ export interface Token { tokenAddressMap: TokenAddressMap chainId: number decimals?: number + geckoId?: string } export const getTokensForNetwork = (chainId: number | undefined, userAddress: string | undefined): Token[] => { @@ -34,7 +35,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconG7T, tokenAddressMap: TG7T, rpc: L1_NETWORK.rpcs[0], - chainId: L1_NETWORK.chainId + chainId: L1_NETWORK.chainId, + geckoId: 'G7T' }, { name: 'Ethereum', @@ -43,7 +45,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconEthereum, rpc: L1_NETWORK.rpcs[0], tokenAddressMap: ETH, - chainId: L1_NETWORK.chainId + chainId: L1_NETWORK.chainId, + geckoId: 'ethereum' }, { name: 'USDC', @@ -53,7 +56,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st rpc: L1_NETWORK.rpcs[0], tokenAddressMap: USDC, chainId: L1_NETWORK.chainId, - decimals: 6 + decimals: 6, + geckoId: 'usdc' }, ...storedTokensWithItems ] @@ -66,7 +70,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconG7T, rpc: L2_NETWORK.rpcs[0], tokenAddressMap: TG7T, - chainId: L2_NETWORK.chainId + chainId: L2_NETWORK.chainId, + geckoId: 'G7T' }, { name: 'Ethereum', @@ -75,7 +80,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconEthereum, rpc: L2_NETWORK.rpcs[0], tokenAddressMap: ETH, - chainId: L2_NETWORK.chainId + chainId: L2_NETWORK.chainId, + geckoId: 'ethereum' }, { name: 'USDC', @@ -85,9 +91,10 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st rpc: L2_NETWORK.rpcs[0], tokenAddressMap: USDC, chainId: L2_NETWORK.chainId, - decimals: 6 + decimals: 6, + geckoId: 'usdc' }, - ...storedTokensWithItems + ...storedTokensWithItems ] case L3_NETWORK.chainId: return [ @@ -98,7 +105,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st Icon: IconG7T, rpc: L3_NETWORK.rpcs[0], tokenAddressMap: TG7T, - chainId: L3_NETWORK.chainId + chainId: L3_NETWORK.chainId, + geckoId: 'G7T' }, { name: 'USDC', @@ -108,7 +116,8 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st rpc: L3_NETWORK.rpcs[0], tokenAddressMap: USDC, chainId: L3_NETWORK.chainId, - decimals: 6 + decimals: 6, + geckoId: 'USDC' }, ...storedTokensWithItems ] From 9d312f15502d6906ab8dd46b79cac31854decb6b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 8 Nov 2024 18:59:48 +0000 Subject: [PATCH 123/266] looking good --- .../src/assets/G7LogoBlue.tsx | 11 ++ .../src/assets/G7LogoRed.tsx | 11 ++ .../src/assets/IconAlertCircle copy.tsx | 21 ++++ .../src/assets/IconAlertCircle.tsx | 22 +--- .../networkToggle/NetworkToggle.module.css | 106 ++++++++++++++++++ .../networkToggle/NetworkToggle.tsx | 79 +++++++++++++ .../src/hooks/useL2ToL1MessageStatus.ts | 33 +++--- .../src/layouts/MainLayout/DesktopSidebar.tsx | 2 + 8 files changed, 251 insertions(+), 34 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/assets/G7LogoBlue.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/G7LogoRed.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx create mode 100644 webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css create mode 100644 webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx diff --git a/webapps/world-builder-dashboard/src/assets/G7LogoBlue.tsx b/webapps/world-builder-dashboard/src/assets/G7LogoBlue.tsx new file mode 100644 index 00000000..942a32ca --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/G7LogoBlue.tsx @@ -0,0 +1,11 @@ +import React, { forwardRef } from 'react' + +const G7LogoBlue = forwardRef>((props) => ( + + + + + +)) + +export default G7LogoBlue diff --git a/webapps/world-builder-dashboard/src/assets/G7LogoRed.tsx b/webapps/world-builder-dashboard/src/assets/G7LogoRed.tsx new file mode 100644 index 00000000..37da1eee --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/G7LogoRed.tsx @@ -0,0 +1,11 @@ +import React, { forwardRef } from 'react' + +const G7LogoRed = forwardRef>((props) => ( + + + + + +)) + +export default G7LogoRed diff --git a/webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx b/webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx new file mode 100644 index 00000000..8a2da44b --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx @@ -0,0 +1,21 @@ +import React, { forwardRef } from 'react' + +const IconAlertCircle = forwardRef>((props, ref) => ( + + + + + + + + + + +)) + +export default IconAlertCircle diff --git a/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx b/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx index 8a2da44b..3a61c188 100644 --- a/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx @@ -1,21 +1,9 @@ import React, { forwardRef } from 'react' -const IconAlertCircle = forwardRef>((props, ref) => ( - - - - - - - - - - +const IconChevronDownToggle = forwardRef>((props) => ( + + + )) -export default IconAlertCircle +export default IconChevronDownToggle diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css new file mode 100644 index 00000000..fc3b2679 --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css @@ -0,0 +1,106 @@ +.container { + cursor: pointer; + display: flex; + width: 280px; + padding: 0px 24px; + flex-direction: column; + align-items: flex-start; + gap: 8px; +} + +.toggle { + display: flex; + padding: 10px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + border-radius: 8px; + border: 1px solid var(--Gray-true-700, #393939); + background: var(--Gray-true-800, #171717); +} + +.testnet { + box-shadow: 0px 0px 10px 2px rgba(179, 184, 219, 0.6) inset; +} + +.mainnet { + box-shadow: 0px 0px 10px 2px rgba(253, 162, 155, 0.6) inset; +} + +.testnetContainer { + display: flex; + justify-content: space-between; + align-items: center; + flex: 1 0 0; +} + +.testnetName { + color: #fff; + /* Text sm/Medium */ + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 20px; /* 142.857% */ +} + +.testnetType { + /* Text sm/Regular */ + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 20px; /* 142.857% */ +} + +.testnetTypeColor { + color: #b3b8db; +} + +.mainnetTypeColor { + color: #fe7071; +} + +.dropdownContainer { + display: flex; + padding: 4px 0px; + flex-direction: column; + align-items: flex-start; + flex: 1 0 0; + width: 100%; + align-self: stretch; + border-radius: 8px; + border: 1px solid var(--Gray-true-700, #393939); + background: #171717; +} + +.dropdownOption { + display: flex; + padding: 2px 6px; + align-items: center; + align-self: stretch; +} + +.dropdownNetworkContainer { + display: flex; + padding: 10px 10px 10px 8px; + flex-direction: column; + align-items: flex-start; + gap: 8px; + flex: 1 0 0; + border-radius: 6px; +} + +.dropdownNetworkInformation { + display: flex; + align-items: center; + gap: 8px; + align-self: stretch; +} + +.dropdownTestnetContainer { + display: flex; + justify-content: space-between; + align-items: center; + flex: 1 0 0; +} diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx new file mode 100644 index 00000000..977966bf --- /dev/null +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -0,0 +1,79 @@ +import React, { useState } from 'react' +import styles from './NetworkToggle.module.css' +import G7LogoBlue from '@/assets/G7LogoBlue' +import G7LogoRed from '@/assets/G7LogoRed' +import IconChevronDownToggle from '@/assets/IconAlertCircle' + +interface NetworkToggleOption { + name: string + type: string + logo: React.FC +} + +const NETWORK_OPTIONS: NetworkToggleOption[] = [ + { + name: 'G7 Sepolia', + type: 'Testnet', + logo: G7LogoBlue + }, + { + name: 'G7 Mainnet', + type: 'Mainnet', + logo: G7LogoRed + } +] + +interface NetworkToggleProps {} + +const NetworkToggle: React.FC = () => { + const [selectedNetwork, setSelectedNetwork] = useState(NETWORK_OPTIONS[0]) + const [isDropdownOpen, setDropdownOpen] = useState(false) + + const toggleDropdown = () => setDropdownOpen(!isDropdownOpen) + + const handleNetworkSelect = (network: NetworkToggleOption) => { + setSelectedNetwork(network) + setDropdownOpen(false) + } + return ( +
+
+ +
+
{selectedNetwork.name}
+
+ {selectedNetwork.type} +
+
+ +
+ {isDropdownOpen && ( +
+ {NETWORK_OPTIONS.filter((network: NetworkToggleOption) => network.name !== selectedNetwork.name).map( + (network: NetworkToggleOption) => ( +
handleNetworkSelect(network)}> +
+
+ +
+
{network.name}
+
+ {network.type} +
+
+
+
+
+ ) + )} +
+ )} +
+ ) +} + +export default NetworkToggle diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index b1dcf7df..4e92431f 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -3,8 +3,7 @@ import { HIGH_NETWORKS, L2_NETWORK, LOW_NETWORKS } from '../../constants' import { ethers, providers } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { L1TransactionReceipt, L2ToL1MessageReader, L2ToL1MessageStatus, L2TransactionReceipt } from '@arbitrum/sdk' -import { L1ContractCallTransactionReceipt } from '@arbitrum/sdk/dist/lib/message/L1Transaction' +import { ParentTransactionReceipt, ParentToChildMessageReader, ParentToChildMessageStatus, ChildTransactionReceipt, ChildToParentMessageReader, ChildToParentMessage, ChildToParentMessageStatus, ParentContractCallTransactionReceipt } from '@arbitrum/sdk' const eventABI = [ { @@ -31,8 +30,8 @@ export interface L2ToL1MessageStatusResult { value?: string timestamp?: number confirmations?: number - status?: L2ToL1MessageStatus - l2Receipt?: L2TransactionReceipt + status?: ChildToParentMessageStatus + l2Receipt?: ChildTransactionReceipt } const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { @@ -48,10 +47,10 @@ const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { const l2Provider = new providers.JsonRpcProvider(lowNetwork.rpcs[0]) const receipt = await l3Provider.getTransactionReceipt(highNetworkHash) - const l2Receipt = new L2TransactionReceipt(receipt) - const messages: L2ToL1MessageReader[] = (await l2Receipt.getL2ToL1Messages(l2Provider)) as L2ToL1MessageReader[] - const l2ToL1Msg: L2ToL1MessageReader = messages[0] - const status: L2ToL1MessageStatus = await l2ToL1Msg.status(l3Provider) + const l2Receipt = new ChildTransactionReceipt(receipt) + const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages(l2Provider)) as ChildToParentMessageReader[] + const l2ToL1Msg: ChildToParentMessageReader = messages[0] + const status: ChildToParentMessageStatus = await l2ToL1Msg.status(l3Provider) return { status, @@ -99,8 +98,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { return } - const l1Receipt = new L1TransactionReceipt(receipt) - const l1ContractCallReceipt = new L1ContractCallTransactionReceipt(l1Receipt) + const l1Receipt = new ParentTransactionReceipt(receipt) + const l1ContractCallReceipt = new ParentContractCallTransactionReceipt(l1Receipt) if (!highNetwork) { return { l1Receipt } @@ -109,7 +108,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { const l2Provider = new providers.JsonRpcProvider(highNetwork.rpcs[0]) let l2Result try { - l2Result = await l1ContractCallReceipt.waitForL2(l2Provider, 3, 1000) + l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, 3, 1000) } catch (e) { console.log(e) } @@ -151,7 +150,7 @@ export const useL2ToL1MessagesStatus = (transactions: Transaction[] | undefined) const l3Provider = new ethers.providers.JsonRpcProvider(l3RPC) const l2Provider = new ethers.providers.JsonRpcProvider(l2RPC) const receipt = await l3Provider.getTransactionReceipt(txHash) - const l2Receipt = new L2TransactionReceipt(receipt) + const l2Receipt = new ChildTransactionReceipt(receipt) const log = receipt.logs.find((l) => l.data !== '0x') let decodedLog @@ -164,9 +163,9 @@ export const useL2ToL1MessagesStatus = (transactions: Transaction[] | undefined) } } - const messages: L2ToL1MessageReader[] = (await l2Receipt.getL2ToL1Messages(l2Provider)) as L2ToL1MessageReader[] - const l2ToL1Msg: L2ToL1MessageReader = messages[0] - const status: L2ToL1MessageStatus = await l2ToL1Msg.status(l3Provider) + const messages: ChildToParentMessageReader[] = (await l2Receipt.getChildToParentMessages(l2Provider)) as ChildToParentMessageReader[] + const l2ToL1Msg: ChildToParentMessageReader = messages[0] + const status: ChildToParentMessageStatus = await l2ToL1Msg.status(l3Provider) return { from: decodedLog?.args?.caller, @@ -307,12 +306,12 @@ export const usePendingTransactions = (connectedAccount: string | undefined): Us } if (t.type === 'WITHDRAWAL') { const status = await fetchL2ToL1MessageStatus(t as TransactionRecord) - if (status?.status === L2ToL1MessageStatus.CONFIRMED) { + if (status?.status === ChildToParentMessageStatus.CONFIRMED) { if (!t.claimableTimestamp) { newCompletedTransactions.push({ ...t, claimableTimestamp: Date.now() / 1000, newTransaction: true }) } } - if (status?.status === L2ToL1MessageStatus.EXECUTED) { + if (status?.status === ChildToParentMessageStatus.EXECUTED) { newCompletedTransactions.push({ ...t, completionTimestamp: Date.now() / 1000, newTransaction: true }) } } diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index f845424c..779fd17d 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -3,6 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' import IconExternalLink from '@/assets/IconExternalLink' import IconLogout from '@/assets/IconLogout' +import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' @@ -18,6 +19,7 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => {
+
{navigationItems.map((item) => (
Date: Sat, 9 Nov 2024 18:29:33 +0000 Subject: [PATCH 124/266] price return --- .../src/components/bridge/bridge/BridgeView.tsx | 11 ++++------- .../components/bridge/bridge/TransactionSummary.tsx | 6 ++++-- .../src/components/bridge/bridge/ValueToBridge.tsx | 2 +- .../src/hooks/useCoinGeckoAPI.ts | 4 +++- webapps/world-builder-dashboard/src/utils/tokens.ts | 6 +++--- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 484f2e5f..a06f529f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -17,12 +17,11 @@ import ValueToBridge from '@/components/bridge/bridge/ValueToBridge' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useUISettings } from '@/contexts/UISettingsContext' import useTokenInformation from '@/hooks/useBalance' +import { useCoinGeckoAPI } from '@/hooks/useCoinGeckoAPI' // Hooks and Constants -import useEthUsdRate from '@/hooks/useEthUsdRate' import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' import { Token } from '@/utils/tokens' -import { useCoinGeckoAPI } from '@/hooks/useCoinGeckoAPI' const BridgeView = ({ direction, @@ -56,11 +55,9 @@ const BridgeView = ({ token: selectedBridgeToken }) - const {data: coinUSDRate} = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? "") - + const { data: coinUSDRate, isFetching: isCoinFetching } = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? '') const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) - console.log(token) } const estimatedFee = useQuery( @@ -185,7 +182,7 @@ const BridgeView = ({ setValue={setValue} onTokenChange={handleTokenChange} balance={tokenInformation?.tokenBalance} - rate={g7tUsdRate.data ?? 0} + rate={selectedBridgeToken.symbol === 'TG7T' ? 1 : isCoinFetching ? 0.00 : coinUSDRate[selectedBridgeToken?.geckoId ?? ''].usd} isFetchingBalance={isFetchingTokenInformation} errorMessage={inputErrorMessages.value} setErrorMessage={(msg) => setInputErrorMessages((prev) => ({ ...prev, value: msg }))} @@ -229,7 +226,7 @@ const BridgeView = ({ {networkErrorMessage &&
{networkErrorMessage}
} = ({ transferTime, fee, isEstimatingFee, + ethRate, tokenRate, tokenSymbol, gasTokenSymbol, @@ -87,9 +89,9 @@ const TransactionSummary: React.FC = ({ className={styles.value} title={`balance: ${String(gasBalance)}`} >{`${fee.toFixed(18).replace(/\.?0+$/, '')} ${gasTokenSymbol}`}
- {!!(fee * tokenRate) && ( + {!!(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate)) && (
- {formatCurrency(fee *tokenRate)} + {formatCurrency(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate))}
)}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 00837824..02e6256a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -115,4 +115,4 @@ const ValueToBridge: React.FC = ({ ) } -export default ValueToBridge \ No newline at end of file +export default ValueToBridge diff --git a/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts b/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts index 6de88623..dd1bc4a3 100644 --- a/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts +++ b/webapps/world-builder-dashboard/src/hooks/useCoinGeckoAPI.ts @@ -17,7 +17,9 @@ export const useCoinGeckoAPI = () => { }, { enabled: !!coin, - retry: false + retry: false, + staleTime: Infinity, + cacheTime: Infinity } ) } diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 21362485..2eeb1389 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -57,7 +57,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: USDC, chainId: L1_NETWORK.chainId, decimals: 6, - geckoId: 'usdc' + geckoId: 'usd-coin' }, ...storedTokensWithItems ] @@ -92,7 +92,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: USDC, chainId: L2_NETWORK.chainId, decimals: 6, - geckoId: 'usdc' + geckoId: 'usd-coin' }, ...storedTokensWithItems ] @@ -117,7 +117,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st tokenAddressMap: USDC, chainId: L3_NETWORK.chainId, decimals: 6, - geckoId: 'USDC' + geckoId: 'usd-coin' }, ...storedTokensWithItems ] From 298b831aecfed8724510d146682fb03d39ed3d5c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 11:50:01 +0000 Subject: [PATCH 125/266] fix caching --- .../components/bridge/history/Withdrawal.tsx | 7 ------- .../src/hooks/useBridgeTransfer.ts | 19 +++++++++++++------ .../src/hooks/useTokenBalance.ts | 2 -- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 830274e8..6cce9ebf 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -14,7 +14,6 @@ import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' import { useMediaQuery } from '@mantine/hooks' - interface WithdrawalProps { withdrawal: TransactionRecord } @@ -62,13 +61,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction - console.log( - withdrawal?.highNetworkHash === '0x6604642ea8d288e5d1a3c94f5b156009eac96415ae71b1602a148293a4e0840f' - ? { status: transferStatus?.status, localStorageTransaction } - : undefined - ) if (!status) { return <> diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index d69cdc3a..cf570084 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -64,10 +64,14 @@ export const useBridgeTransfer = () => { ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) - if (cachedTransaction && cachedTransaction.status) { + console.log( + txRecord.highNetworkHash === '0x3d705cc553ebf546c6626bd26d625b6f3cad306efb72ddf03dd52c7b3dac1871' + ? {cachedTransaction} + : {} + ) + if (cachedTransaction && cachedTransaction.status !== undefined) { + console.log("existing") return { status: cachedTransaction.status } - } else { - console.log('no tx found', txRecord.highNetworkHash) } } }, @@ -75,6 +79,12 @@ export const useBridgeTransfer = () => { refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 5 * 1000, refetchOnWindowFocus: false, enabled: !!txRecord + // retry: (failureCount, error) => { + // if ((error as { status?: number }).status === 429) { + // return Math.min(2 ** failureCount * 1000, 30000) + // } + // return false + // } } ) } @@ -118,13 +128,11 @@ export const useBridgeTransfer = () => { }, { onSuccess: ({ res, withdrawal }) => { - console.log('done .. ?') try { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { if (t.highNetworkHash === withdrawal.highNetworkHash) { - console.log("found it, changing it, loving it") return { ...t, completionTimestamp: Date.now() / 1000, @@ -134,7 +142,6 @@ export const useBridgeTransfer = () => { status: BridgeTransferStatus.WITHDRAW_EXECUTED } } - console.log('no find, break heart') return { ...t } }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) diff --git a/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts b/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts index 7fd51c83..300a803f 100644 --- a/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useTokenBalance.ts @@ -9,8 +9,6 @@ const useTokenBalance = (tokenAddress: string, rpc: string, connectedAccount: st account: connectedAccount, rpc, }); - console.log({tokenAddress, rpc, connectedAccount}) - console.log(balance) return { balance, isFetching }; } else { const { data: balance, isFetching } = useERC20Balance({ From b11795528f223dc53ba13c07c9ccdcc937d7cd04 Mon Sep 17 00:00:00 2001 From: kompotkot Date: Mon, 11 Nov 2024 12:24:13 +0000 Subject: [PATCH 126/266] Robots workflow for staging --- .github/workflows/staging_deploy_wb-dashboard.yml | 5 +++++ webapps/world-builder-dashboard/public/robots.txt | 3 +++ 2 files changed, 8 insertions(+) create mode 100644 webapps/world-builder-dashboard/public/robots.txt diff --git a/.github/workflows/staging_deploy_wb-dashboard.yml b/.github/workflows/staging_deploy_wb-dashboard.yml index 70d013dd..727bad76 100644 --- a/.github/workflows/staging_deploy_wb-dashboard.yml +++ b/.github/workflows/staging_deploy_wb-dashboard.yml @@ -27,6 +27,11 @@ jobs: npm install npm run build + - name: Update robots.txt, block alpha for crawlers + working-directory: ./webapps/world-builder-dashboard/dist + run: | + sed -i "s/Disallow:.*/Disallow: \//" robots.txt + - name: Publish to CloudFlare Page uses: cloudflare/pages-action@v1 with: diff --git a/webapps/world-builder-dashboard/public/robots.txt b/webapps/world-builder-dashboard/public/robots.txt new file mode 100644 index 00000000..5537f073 --- /dev/null +++ b/webapps/world-builder-dashboard/public/robots.txt @@ -0,0 +1,3 @@ +# https://www.robotstxt.org/robotstxt.html +User-agent: * +Disallow: \ No newline at end of file From 5fc687afda547301fd4b4b91e99014e301e6557e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 12:52:40 +0000 Subject: [PATCH 127/266] amazing stuff --- .../src/components/bridge/history/Deposit.tsx | 28 +++++---------- .../bridge/history/HistoryDesktop.tsx | 36 ++++++++++++++++--- .../components/bridge/history/Withdrawal.tsx | 18 ++++------ .../src/hooks/useBridgeTransfer.ts | 25 ++++++------- 4 files changed, 59 insertions(+), 48 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 49ee9922..42ad121f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -30,7 +30,7 @@ const Deposit: React.FC = ({ deposit }) => { const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) - const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) + const { data: status } = useDepositStatus(deposit) return ( <> {isLoading && smallView ? ( @@ -84,24 +84,14 @@ const Deposit: React.FC = ({ deposit }) => { )}
- {isLoadingStatus ? ( -
-
Loading
-
- ) : ( -
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( - <> - {status?.highNetworkTimestamp === undefined - ? 'No status found' - : timeAgo(status?.highNetworkTimestamp)} - - ) : ( - <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} - )} -
- )} +
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( +
{timeAgo(status?.data?.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
+ ) : ( +
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
+ )} +
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index f7717f60..5f621978 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -51,12 +51,41 @@ const HistoryDesktop: React.FC = () => { const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - + // Merge transactions only when API data is updated with new data useEffect(() => { const localTransactions = messages.data || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) + // Retrieve existing transactions from localStorage + const storedTransactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const storedTransactions = storedTransactionsString ? JSON.parse(storedTransactionsString) : [] + + // Check if the combined transactions are different from those in localStorage + if ( + combinedTransactions.length !== storedTransactions.length || + !combinedTransactions.every((tx, index) => + tx.type === 'DEPOSIT' + ? tx.lowNetworkHash === storedTransactions[index]?.lowNetworkHash + : tx.highNetworkHash === storedTransactions[index]?.highNetworkHash + ) + ) { + // Determine new transactions that aren’t in storedTransactions + const newTransactions = combinedTransactions.filter( + (newTx) => + !storedTransactions.some((storedTx: TransactionRecord) => + storedTx.type === 'DEPOSIT' + ? storedTx.lowNetworkHash === newTx.lowNetworkHash + : storedTx.highNetworkHash === newTx.highNetworkHash + ) + ) + + localStorage.setItem( + `bridge-${connectedAccount}-transactions`, + JSON.stringify([...storedTransactions, ...newTransactions]) + ) + } + setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) @@ -85,9 +114,8 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {mergedTransactions.filter( - (tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL' - ).length === 0 &&
No transactions yet
} + {mergedTransactions.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + .length === 0 &&
No transactions yet
}
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 6cce9ebf..e0041e93 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -63,10 +63,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction - if (!status) { - return <> - } - return ( <> {isLoading && smallView ? ( @@ -90,9 +86,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
+ >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
Loading
@@ -268,12 +264,12 @@ const Withdrawal: React.FC = ({ withdrawal }) => { Withdraw
-
{timeAgo(status.data?.timestamp)}
+
{timeAgo(status?.data?.timestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
+ >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
{transferStatus && transferStatus.status === BridgeTransferStatus.WITHDRAW_CONFIRMED && ( <>
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index cf570084..97fa00e4 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -52,6 +52,7 @@ export const useBridgeTransfer = () => { return { ...t } }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + console.log(status) return status }, { @@ -64,27 +65,23 @@ export const useBridgeTransfer = () => { ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) - console.log( - txRecord.highNetworkHash === '0x3d705cc553ebf546c6626bd26d625b6f3cad306efb72ddf03dd52c7b3dac1871' - ? {cachedTransaction} - : {} - ) if (cachedTransaction && cachedTransaction.status !== undefined) { - console.log("existing") return { status: cachedTransaction.status } } + } else { + console.log('nada') } }, - // if status is completed, no need to refetch again. if pending, refetch every 1-2 minuites + // if status is completed, no need to refetch again. if pending, refetch every 1-2 minutes refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 5 * 1000, refetchOnWindowFocus: false, - enabled: !!txRecord - // retry: (failureCount, error) => { - // if ((error as { status?: number }).status === 429) { - // return Math.min(2 ** failureCount * 1000, 30000) - // } - // return false - // } + enabled: !!txRecord, + retry: (failureCount, error) => { + if ((error as { status?: number }).status === 429) { + return Math.min(2 ** failureCount * 1000, 30000) + } + return false + } } ) } From 96af7c02c23fe9814555271a9eb746cf9c5fb04c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 13:08:43 +0000 Subject: [PATCH 128/266] caching happens right after getting end point data to elaborate on the previous commit, we now cache endpoint data --- webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 97fa00e4..c4216edf 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -52,7 +52,6 @@ export const useBridgeTransfer = () => { return { ...t } }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) - console.log(status) return status }, { From a6c5c6b7024db970c20489d43548693ae3ccf056 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 13:08:58 +0000 Subject: [PATCH 129/266] fix build --- .../src/components/bridge/history/Deposit.tsx | 28 +++++++++++++------ .../components/bridge/history/Withdrawal.tsx | 20 ++++++------- .../src/hooks/useBridgeTransfer.ts | 10 +++---- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 42ad121f..49ee9922 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -30,7 +30,7 @@ const Deposit: React.FC = ({ deposit }) => { const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) - const { data: status } = useDepositStatus(deposit) + const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) return ( <> {isLoading && smallView ? ( @@ -84,14 +84,24 @@ const Deposit: React.FC = ({ deposit }) => { )}
-
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( -
{timeAgo(status?.data?.highNetworkTimestamp ?? deposit.lowNetworkTimestamp)}
- ) : ( -
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
- )} -
+ {isLoadingStatus ? ( +
+
Loading
+
+ ) : ( +
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( + <> + {status?.highNetworkTimestamp === undefined + ? 'No status found' + : timeAgo(status?.highNetworkTimestamp)} + + ) : ( + <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} + )} +
+ )} )} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index e0041e93..b1c83206 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { HIGH_NETWORKS, L2_NETWORK, L3_NETWORK, LOW_NETWORKS } from '../../../../constants' +import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' @@ -138,7 +138,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { }} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} - >{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+ >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
setCollapseExecuted(!collapseExecuted)} @@ -149,7 +149,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} > - {status.data?.from ?? ''} + {status?.data?.from ?? ''}
= ({ withdrawal }) => { onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} > - {status.data?.to ?? ''} + {status?.data?.to ?? ''}
= ({ withdrawal }) => {
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
+ >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
{`${status.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
-
{status.data?.from ?? ''}
-
{status.data?.to ?? ''}
+ >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
{ refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 5 * 1000, refetchOnWindowFocus: false, enabled: !!txRecord, - retry: (failureCount, error) => { - if ((error as { status?: number }).status === 429) { - return Math.min(2 ** failureCount * 1000, 30000) - } - return false + retry: (error) => { + return (error as { status?: number }).status === 429 + }, + retryDelay: (failureCount) => { + return Math.min(2 ** failureCount * 1000, 30000) } } ) From 58c7f1b349a778eea89082aaadeff6ba99e2b046 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 17:41:12 +0000 Subject: [PATCH 130/266] try catch block for 429 error --- .../components/bridge/history/Withdrawal.tsx | 8 +- .../src/hooks/useBridgeTransfer.ts | 94 ++++++++++--------- .../src/pages/BridgePage/BridgePage.tsx | 5 +- 3 files changed, 56 insertions(+), 51 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index b1c83206..95c27b26 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useCallback, useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' @@ -55,14 +55,14 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) - const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) + const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal, returnTransferData]) + const { data: transferStatus, isLoading } = transferData() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction - return ( <> {isLoading && smallView ? ( @@ -75,7 +75,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {isLoading ? ( + {isLoading || transferStatus?.status === undefined ? ( <>
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index cc6e3bd5..c8321a72 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' -import { useNavigate } from 'react-router-dom' +import { ErrorResponse, useNavigate } from 'react-router-dom' import { ALL_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' @@ -15,71 +15,77 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const { connectedAccount } = useBlockchainContext() + // Pre-compute properties for cleaner instantiation + const isDeposit = txRecord.type === 'DEPOSIT' + const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash + const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId + const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId + const destinationRpc = ALL_NETWORKS.find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = ALL_NETWORKS.find((n) => n.chainId === originChainId)?.rpcs[0] + + const getCachedTransactions = () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + return transactionsString ? JSON.parse(transactionsString) : [] + } + let status: any return useQuery( ['transferData', txRecord], async () => { const _bridgeTransfer = new BridgeTransfer({ - txHash: (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkHash : txRecord.highNetworkHash) ?? '', - destinationNetworkChainId: - (txRecord.type === 'DEPOSIT' ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId) ?? 0, - originNetworkChainId: - (txRecord.type === 'DEPOSIT' ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId) ?? 0, - destinationSignerOrProviderOrRpc: - txRecord.type === 'DEPOSIT' - ? ALL_NETWORKS.find((n) => n.chainId === txRecord.highNetworkChainId)?.rpcs[0] - : ALL_NETWORKS.find((n) => n.chainId === txRecord.lowNetworkChainId)?.rpcs[0], - originSignerOrProviderOrRpc: - txRecord.type === 'DEPOSIT' - ? ALL_NETWORKS.find((n) => n.chainId === txRecord.lowNetworkChainId)?.rpcs[0] - : ALL_NETWORKS.find((n) => n.chainId === txRecord.highNetworkChainId)?.rpcs[0] + txHash: txHash ?? '', + destinationNetworkChainId: destinationChainId ?? 0, + originNetworkChainId: originChainId ?? 0, + destinationSignerOrProviderOrRpc: destinationRpc, + originSignerOrProviderOrRpc: originRpc }) + try { + status = await _bridgeTransfer.getStatus() + const transactions = getCachedTransactions() - status = await _bridgeTransfer.getStatus() - - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - const transactions = transactionsString ? JSON.parse(transactionsString) : [] - - const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { - const hashComparison: boolean = - txRecord.type === 'DEPOSIT' + const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + const isSameHash = isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + return isSameHash ? { ...t, status: status?.status === undefined ? 0 : status?.status } : t + }) - if (hashComparison) { - return { ...t, status: status?.status } + localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + + return status + } catch (error: any) { + const transactions = getCachedTransactions() + const cachedTransaction = transactions.find((t: TransactionRecord) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + if (cachedTransaction && cachedTransaction.status !== undefined) { + status = cachedTransaction.status + return { status } } - return { ...t } - }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) - return status + } }, { placeholderData: () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - if (transactionsString) { - const transactions = JSON.parse(transactionsString) - const cachedTransaction = transactions.find((t: TransactionRecord) => - txRecord.type === 'DEPOSIT' - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - ) - if (cachedTransaction && cachedTransaction.status !== undefined) { - return { status: cachedTransaction.status } - } - } else { - console.log('nada') + const transactions = getCachedTransactions() + const cachedTransaction = transactions.find((t: TransactionRecord) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + if (cachedTransaction && cachedTransaction.status !== undefined) { + status = cachedTransaction.status + return { status } } }, // if status is completed, no need to refetch again. if pending, refetch every 1-2 minutes - refetchInterval: status?.status === 2 || 6 || 9 ? false : 60 * 5 * 1000, + refetchInterval: [2, 6, 9].includes(status?.status) ? false : 60 * 5 * 1000, refetchOnWindowFocus: false, - enabled: !!txRecord, + enabled: !!txRecord && ![2, 6, 9].includes(status?.status), retry: (error) => { return (error as { status?: number }).status === 429 }, retryDelay: (failureCount) => { - return Math.min(2 ** failureCount * 1000, 30000) + return Math.min(2 ** failureCount * 2000, 30000) } } ) diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index a3cb42c3..ecbb90a4 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -24,7 +24,6 @@ const BridgePage = () => { const location = useLocation() const navigate = useNavigate() const { connectedAccount } = useBlockchainContext() - const pendingTransacions = usePendingTransactions(connectedAccount) const [notificationsOffset] = useState(0) const [notificationsLimit] = useState(10) const [direction, setDirection] = useState('DEPOSIT') @@ -35,11 +34,11 @@ const BridgePage = () => { const queryClient = useQueryClient() useEffect(() => { - if (pendingTransacions.data && connectedAccount) { + if (connectedAccount) { queryClient.refetchQueries(['incomingMessages']) refetchNewNotifications(connectedAccount) } - }, [pendingTransacions.data, connectedAccount]) + }, [connectedAccount]) return (
From 970d46e1ebd6c62d94793cac998de0afa28a604f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 18:24:12 +0000 Subject: [PATCH 131/266] staging --- .../src/components/bridge/history/Deposit.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 49ee9922..d5cd47a0 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -31,6 +31,7 @@ const Deposit: React.FC = ({ deposit }) => { (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) + console.log(transferStatus) return ( <> {isLoading && smallView ? ( From 53cf427881cc6a29d9a68e44d70cdc1a3bd8d22d Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 18:33:56 +0000 Subject: [PATCH 132/266] throw error --- .../src/components/bridge/history/Deposit.tsx | 1 - .../src/hooks/useBridgeTransfer.ts | 8 +++++--- .../src/pages/BridgePage/BridgePage.tsx | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index d5cd47a0..49ee9922 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -31,7 +31,6 @@ const Deposit: React.FC = ({ deposit }) => { (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) - console.log(transferStatus) return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index c8321a72..b0a21b8c 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' -import { ErrorResponse, useNavigate } from 'react-router-dom' +import { useNavigate } from 'react-router-dom' import { ALL_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' @@ -47,7 +47,7 @@ export const useBridgeTransfer = () => { const isSameHash = isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - return isSameHash ? { ...t, status: status?.status === undefined ? 0 : status?.status } : t + return isSameHash ? { ...t, status: status?.status } : t }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) @@ -82,10 +82,12 @@ export const useBridgeTransfer = () => { refetchOnWindowFocus: false, enabled: !!txRecord && ![2, 6, 9].includes(status?.status), retry: (error) => { + console.log(error) return (error as { status?: number }).status === 429 }, retryDelay: (failureCount) => { - return Math.min(2 ** failureCount * 2000, 30000) + console.log(failureCount) + return Math.min(2 ** failureCount * 1000, 60000) } } ) diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index ecbb90a4..880a9e46 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -15,7 +15,7 @@ import { FloatingNotification } from '@/components/notifications/NotificationsDr import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' // Hooks -import { useNotifications, usePendingTransactions } from '@/hooks/useL2ToL1MessageStatus' +import { useNotifications } from '@/hooks/useL2ToL1MessageStatus' import { useMediaQuery } from '@mantine/hooks' export type DepositDirection = 'DEPOSIT' | 'WITHDRAW' From 1390c7c41603b7668b99674ca1db01340095f4b1 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 19:09:52 +0000 Subject: [PATCH 133/266] make sticky --- .../networkToggle/NetworkToggle.module.css | 7 +- .../networkToggle/NetworkToggle.tsx | 64 +++++++++---------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css index fc3b2679..4fbe5e50 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css @@ -9,6 +9,7 @@ } .toggle { + position: relative; display: flex; padding: 10px 12px; align-items: center; @@ -62,16 +63,20 @@ } .dropdownContainer { + position: absolute; + top: calc(100% + 8px); + left: 0; + width: 100%; display: flex; padding: 4px 0px; flex-direction: column; align-items: flex-start; flex: 1 0 0; - width: 100%; align-self: stretch; border-radius: 8px; border: 1px solid var(--Gray-true-700, #393939); background: #171717; + z-index: 1; } .dropdownOption { diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 977966bf..e5cb542c 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -6,20 +6,20 @@ import IconChevronDownToggle from '@/assets/IconAlertCircle' interface NetworkToggleOption { name: string - type: string - logo: React.FC + // type: string + // logo: React.FC } const NETWORK_OPTIONS: NetworkToggleOption[] = [ { - name: 'G7 Sepolia', - type: 'Testnet', - logo: G7LogoBlue + name: 'Testnet' + // type: 'Testnet', + // logo: G7LogoBlue }, { - name: 'G7 Mainnet', - type: 'Mainnet', - logo: G7LogoRed + name: 'Mainnet' + // type: 'Mainnet', + // logo: G7LogoRed } ] @@ -37,41 +37,39 @@ const NetworkToggle: React.FC = () => { } return (
-
- +
+ {/* */}
-
{selectedNetwork.name}
- {selectedNetwork.type} + {selectedNetwork.name}
-
- {isDropdownOpen && ( -
- {NETWORK_OPTIONS.filter((network: NetworkToggleOption) => network.name !== selectedNetwork.name).map( - (network: NetworkToggleOption) => ( -
handleNetworkSelect(network)}> -
-
- -
-
{network.name}
-
- {network.type} + {isDropdownOpen && ( +
+ {NETWORK_OPTIONS.filter((network: NetworkToggleOption) => network.name !== selectedNetwork.name).map( + (network: NetworkToggleOption) => ( +
handleNetworkSelect(network)}> +
+
+ {/* */} +
+
+ {network.name} +
-
- ) - )} -
- )} + ) + )} +
+ )} +
) } From 30d57d0500b39e31474d516dbe4a190e0d0c33c8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 19:30:25 +0000 Subject: [PATCH 134/266] disable bridge on mainnet --- .../networkToggle/NetworkToggle.tsx | 45 ++++++------------- .../src/contexts/BlockchainContext.tsx | 9 +++- .../src/pages/BridgePage/BridgePage.tsx | 24 +++++----- 3 files changed, 35 insertions(+), 43 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index e5cb542c..1385784e 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -1,65 +1,48 @@ import React, { useState } from 'react' import styles from './NetworkToggle.module.css' -import G7LogoBlue from '@/assets/G7LogoBlue' -import G7LogoRed from '@/assets/G7LogoRed' import IconChevronDownToggle from '@/assets/IconAlertCircle' +import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' -interface NetworkToggleOption { - name: string - // type: string - // logo: React.FC -} - -const NETWORK_OPTIONS: NetworkToggleOption[] = [ - { - name: 'Testnet' - // type: 'Testnet', - // logo: G7LogoBlue - }, - { - name: 'Mainnet' - // type: 'Mainnet', - // logo: G7LogoRed - } -] +const NETWORK_OPTIONS: NetworkType[] = ['Testnet', 'Mainnet'] interface NetworkToggleProps {} const NetworkToggle: React.FC = () => { - const [selectedNetwork, setSelectedNetwork] = useState(NETWORK_OPTIONS[0]) + const { selectedNetworkType, setSelectedNetworkType } = useBlockchainContext() const [isDropdownOpen, setDropdownOpen] = useState(false) const toggleDropdown = () => setDropdownOpen(!isDropdownOpen) - const handleNetworkSelect = (network: NetworkToggleOption) => { - setSelectedNetwork(network) + const handleNetworkSelect = (network: NetworkType) => { + console.log(network) + setSelectedNetworkType(network as NetworkType) setDropdownOpen(false) } return (
-
+
{/* */}
- {selectedNetwork.name} + {selectedNetworkType}
{isDropdownOpen && (
- {NETWORK_OPTIONS.filter((network: NetworkToggleOption) => network.name !== selectedNetwork.name).map( - (network: NetworkToggleOption) => ( -
handleNetworkSelect(network)}> + {NETWORK_OPTIONS.filter((network: NetworkType) => network !== selectedNetworkType).map( + (network: NetworkType) => ( +
handleNetworkSelect(network)}>
{/* */}
- {network.name} + {network}
diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index ca9b001e..231a88b2 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -20,6 +20,8 @@ interface BlockchainContextType { setAccounts: (accounts: string[]) => void chainId: number | undefined isConnecting: boolean + selectedNetworkType: NetworkType + setSelectedNetworkType: (networkType: NetworkType) => void } export interface NetworkInterface { @@ -44,6 +46,8 @@ export interface NetworkInterface { inbox?: string } +export type NetworkType = 'Testnet' | 'Mainnet' + export interface HighNetworkInterface extends NetworkInterface { inbox: string } @@ -58,6 +62,7 @@ export const BlockchainProvider: React.FC = ({ children const [walletProvider, setWalletProvider] = useState() const [selectedLowNetwork, _setSelectedLowNetwork] = useState(DEFAULT_LOW_NETWORK) const [selectedHighNetwork, _setSelectedHighNetwork] = useState(DEFAULT_HIGH_NETWORK) + const [selectedNetworkType, setSelectedNetworkType] = useState('Testnet') const [isMetaMask, setIsMetaMask] = useState(false) const [isConnecting, setIsConnecting] = useState(false) const [chainId, setChainId] = useState(undefined) @@ -255,7 +260,9 @@ export const BlockchainProvider: React.FC = ({ children getProvider, isConnecting, accounts, - setAccounts + setAccounts, + selectedNetworkType, + setSelectedNetworkType, }} > {children} diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index a3cb42c3..5a106a32 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -23,7 +23,7 @@ export type DepositDirection = 'DEPOSIT' | 'WITHDRAW' const BridgePage = () => { const location = useLocation() const navigate = useNavigate() - const { connectedAccount } = useBlockchainContext() + const { connectedAccount, selectedNetworkType } = useBlockchainContext() const pendingTransacions = usePendingTransactions(connectedAccount) const [notificationsOffset] = useState(0) const [notificationsLimit] = useState(10) @@ -68,16 +68,18 @@ const BridgePage = () => { > History - + {selectedNetworkType === 'Testnet' && ( + + )}
From 50810a75a41209eacf92d5d8fcbef859f18d27a3 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 11 Nov 2024 20:03:39 +0000 Subject: [PATCH 135/266] disable buttons and sidebar if mainnet --- .../src/layouts/MainLayout/DesktopSidebar.tsx | 11 +++++++++-- .../src/layouts/MainLayout/MainLayout.tsx | 6 +++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index 779fd17d..b4561e65 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -1,7 +1,9 @@ import React, { ReactNode } from 'react' import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' +import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' +import IconInfoCircle from '@/assets/IconInfoCircle' import IconLogout from '@/assets/IconLogout' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -13,7 +15,8 @@ interface DesktopSidebarProps { const DesktopSidebar: React.FC = ({ navigationItems }) => { const location = useLocation() const navigate = useNavigate() - const { connectedAccount, isMetaMask, connectWallet, disconnectWallet, isConnecting } = useBlockchainContext() + const { connectedAccount, isMetaMask, connectWallet, disconnectWallet, isConnecting, selectedNetworkType } = + useBlockchainContext() return (
@@ -40,8 +43,12 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => {
{item.name === 'documentation' || item.name === 'explorer' ? ( + ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( + + + ) : ( - '' + <> )}
diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index 03356ff4..5ca56cde 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -10,13 +10,15 @@ import IconExplorer from '@/assets/IconExplorer' import DesktopSidebar from '@/layouts/MainLayout/DesktopSidebar' import MobileSidebar from '@/layouts/MainLayout/MobileSidebar' import { useMediaQuery } from '@mantine/hooks' +import { useBlockchainContext } from '@/contexts/BlockchainContext' interface MainLayoutProps {} const MainLayout: React.FC = ({}) => { const location = useLocation() + const {selectedNetworkType} = useBlockchainContext() - const NAVIGATION_ITEMS = [ + const TESTNET_NAVIGATION_ITEMS = [ { name: 'faucet', navigateTo: '/faucet', @@ -34,6 +36,8 @@ const MainLayout: React.FC = ({}) => { } ] + const MAINNET_NAVIGATION_ITEMS = TESTNET_NAVIGATION_ITEMS.slice(1, TESTNET_NAVIGATION_ITEMS.length) + const NAVIGATION_ITEMS = selectedNetworkType === "Mainnet" ? MAINNET_NAVIGATION_ITEMS : TESTNET_NAVIGATION_ITEMS const smallView = useMediaQuery('(max-width: 1199px)') return (
From 4adf7afcbe01d10e6ff61362242ed36518ae7e20 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 12 Nov 2024 11:42:05 +0000 Subject: [PATCH 136/266] added estimation approval --- .../world-builder-dashboard/package-lock.json | 8 ++--- webapps/world-builder-dashboard/package.json | 2 +- .../components/bridge/bridge/BridgeView.tsx | 33 ++++++++++++++++--- .../src/hooks/useBalance.ts | 3 +- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/package-lock.json b/webapps/world-builder-dashboard/package-lock.json index c967c82e..1f8dd2f9 100644 --- a/webapps/world-builder-dashboard/package-lock.json +++ b/webapps/world-builder-dashboard/package-lock.json @@ -15,7 +15,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.51", + "game7-bridge-sdk": "^0.0.54", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", @@ -6879,9 +6879,9 @@ } }, "node_modules/game7-bridge-sdk": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.51.tgz", - "integrity": "sha512-7xZ5rOLhMh0IBwtJI27nyIt90GymEEc/QBCKPxL2H7I8Fu7YgmV/EyS5QuFPhJhlHTskSy99cwboGT9FhruPqA==", + "version": "0.0.54", + "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.54.tgz", + "integrity": "sha512-Rf1nlrsIsIaG0/DGQmOFqjuGWfzKgnfqSB6bWglCtohz0dPIKRDR3Ap3xC5fvvQpqSnz6/6jm2ctjPTFOeOUpA==", "hasInstallScript": true, "dependencies": { "@arbitrum/sdk": "4.0.1", diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index b64eac87..0988d27c 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,7 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.52", + "game7-bridge-sdk": "^0.0.54", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index a06f529f..888601ca 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -64,19 +64,36 @@ const BridgeView = ({ ['estimatedFee', bridger, connectedAccount, value], async () => { try { - const fee = await bridger?.getGasAndFeeEstimation( - value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0.0'), + const approvalFee = await bridger?.getApprovalGasAndFeeEstimation( + value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0'), direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], connectedAccount ?? '' ) - const feeFormatted = ethers.utils.formatEther(fee?.estimatedFee || '0.0') + + const fee = approvalFee?.estimatedFee + ? { estimatedFee: ethers.utils.parseEther('0') } + : await bridger?.getGasAndFeeEstimation( + value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0'), + direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], + connectedAccount ?? '' + ) + + const finalFee = fee?.estimatedFee.add(approvalFee?.estimatedFee ?? ethers.utils.parseEther('0')) + console.log(ethers.utils.formatEther(finalFee ?? ethers.utils.parseEther('0'))) + console.log(ethers.utils.formatEther(fee?.estimatedFee ?? ethers.utils.parseEther('0'))) + console.log(ethers.utils.formatEther(approvalFee?.estimatedFee ?? ethers.utils.parseEther('0'))) + const feeFormatted = ethers.utils.formatEther(finalFee ?? ethers.utils.parseEther('0')) return feeFormatted } catch (e) { console.error(e) } }, { - enabled: !!connectedAccount && !!selectedLowNetwork && !!selectedHighNetwork && !!value + enabled: !!connectedAccount && !!selectedLowNetwork && !!selectedHighNetwork && !!value, + onError: (error) => { + console.error('Error refetching fee:', error) + estimatedFee.refetch() + } } ) @@ -182,7 +199,13 @@ const BridgeView = ({ setValue={setValue} onTokenChange={handleTokenChange} balance={tokenInformation?.tokenBalance} - rate={selectedBridgeToken.symbol === 'TG7T' ? 1 : isCoinFetching ? 0.00 : coinUSDRate[selectedBridgeToken?.geckoId ?? ''].usd} + rate={ + selectedBridgeToken.symbol === 'TG7T' + ? 1 + : isCoinFetching + ? 0.0 + : coinUSDRate[selectedBridgeToken?.geckoId ?? ''].usd + } isFetchingBalance={isFetchingTokenInformation} errorMessage={inputErrorMessages.value} setErrorMessage={(msg) => setInputErrorMessages((prev) => ({ ...prev, value: msg }))} diff --git a/webapps/world-builder-dashboard/src/hooks/useBalance.ts b/webapps/world-builder-dashboard/src/hooks/useBalance.ts index ef98113c..065eca72 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBalance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBalance.ts @@ -25,7 +25,8 @@ const useTokenInformation = ({ account, token }: UseBalanceProps) => { tokenBalance = String(ethers.utils.formatEther(await bridgeToken.getBalance(token.rpc, account ?? ''))) } const symbol = await bridgeToken.getSymbol(token.rpc) - return { tokenBalance, symbol } + const decimalPlaces = await bridgeToken.getDecimals(token.rpc) + return { tokenBalance, symbol, decimalPlaces } }, { refetchInterval: 50000, From 6d85d32b73eccc1a578b42845cba96bbe910ff50 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 12 Nov 2024 13:24:39 +0000 Subject: [PATCH 137/266] approval fix --- .../components/bridge/bridge/ActionButton.tsx | 1 + .../components/bridge/bridge/BridgeView.tsx | 43 +++++++++++-------- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 54e6ba54..7a59277d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -104,6 +104,7 @@ const ActionButton: React.FC = ({ if (Number(allowanceToCheck) < Number(amount)) { const txApprove = await bridger?.approve(amountToSend, signer) await txApprove.wait() + queryClient.refetchQueries(['estimatedFee']) } } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 888601ca..72b0491b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -1,7 +1,7 @@ // Libraries import { useEffect, useState } from 'react' import { useQuery } from 'react-query' -import { DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' +import { ALL_NETWORKS, DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' @@ -64,35 +64,42 @@ const BridgeView = ({ ['estimatedFee', bridger, connectedAccount, value], async () => { try { - const approvalFee = await bridger?.getApprovalGasAndFeeEstimation( - value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0'), + const originNetwork = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) + if (!originNetwork) throw new Error("Can't find network!") + + const allowance = await bridger?.getAllowance(originNetwork.rpcs[0], connectedAccount ?? '') + const parsedValue = value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0') + + let approvalFee = ethers.utils.parseEther('0') // Default to zero if no approval needed + let transferFee = ethers.utils.parseEther('0') // Default to zero + + if (allowance?.lt(parsedValue)) { + const approvalEstimate = await bridger?.getApprovalGasAndFeeEstimation( + parsedValue, + originNetwork.rpcs[0], + connectedAccount ?? '' + ) + approvalFee = approvalEstimate?.estimatedFee ?? ethers.utils.parseEther('0') + } + + const transferEstimate = await bridger?.getGasAndFeeEstimation( + ethers.utils.parseEther('0.0'), direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], connectedAccount ?? '' ) - const fee = approvalFee?.estimatedFee - ? { estimatedFee: ethers.utils.parseEther('0') } - : await bridger?.getGasAndFeeEstimation( - value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0'), - direction === 'DEPOSIT' ? selectedLowNetwork.rpcs[0] : selectedHighNetwork.rpcs[0], - connectedAccount ?? '' - ) - - const finalFee = fee?.estimatedFee.add(approvalFee?.estimatedFee ?? ethers.utils.parseEther('0')) - console.log(ethers.utils.formatEther(finalFee ?? ethers.utils.parseEther('0'))) - console.log(ethers.utils.formatEther(fee?.estimatedFee ?? ethers.utils.parseEther('0'))) - console.log(ethers.utils.formatEther(approvalFee?.estimatedFee ?? ethers.utils.parseEther('0'))) - const feeFormatted = ethers.utils.formatEther(finalFee ?? ethers.utils.parseEther('0')) - return feeFormatted + transferFee = transferEstimate?.estimatedFee ?? ethers.utils.parseEther('0') + const finalFee = approvalFee.add(transferFee) + return ethers.utils.formatEther(finalFee) } catch (e) { console.error(e) + throw e } }, { enabled: !!connectedAccount && !!selectedLowNetwork && !!selectedHighNetwork && !!value, onError: (error) => { console.error('Error refetching fee:', error) - estimatedFee.refetch() } } ) From c66b10dcb743673855e9ba02e0e2b8cbf907c247 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 12 Nov 2024 13:44:48 +0000 Subject: [PATCH 138/266] mobile view --- .../networkToggle/NetworkToggle.module.css | 3 ++- .../networkToggle/NetworkToggle.tsx | 1 - .../src/layouts/MainLayout/MobileSidebar.tsx | 25 +++++++++++++------ 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css index 4fbe5e50..753dcac0 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css @@ -1,11 +1,12 @@ .container { cursor: pointer; display: flex; - width: 280px; + width: 100%; padding: 0px 24px; flex-direction: column; align-items: flex-start; gap: 8px; + background-color: var(--Base-White, #fff); } .toggle { diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 1385784e..bd98a230 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -14,7 +14,6 @@ const NetworkToggle: React.FC = () => { const toggleDropdown = () => setDropdownOpen(!isDropdownOpen) const handleNetworkSelect = (network: NetworkType) => { - console.log(network) setSelectedNetworkType(network as NetworkType) setDropdownOpen(false) } diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index 0f77d3fa..9153abeb 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -2,11 +2,14 @@ import React, { ReactNode, useState } from 'react' import { useLocation, useNavigate } from 'react-router-dom' import parentStyles from './MainLayout.module.css' import styles from './MobileSidebar.module.css' +import IconExternalLink from '@/assets/IconExternalLink' +import IconHamburgerLanding from '@/assets/IconHamburgerLanding' import IconLogoutLarge from '@/assets/IconLogoutLarge' +import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' -import IconExternalLink from '@/assets/IconExternalLink' -import IconHamburgerLanding from '@/assets/IconHamburgerLanding' +import { Tooltip } from 'summon-ui/mantine' +import IconInfoCircle from '@/assets/IconInfoCircle' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -14,7 +17,7 @@ interface MobileSidebarProps { const MobileSidebar: React.FC = ({ navigationItems }) => { const location = useLocation() const navigate = useNavigate() - const { connectedAccount, isMetaMask, disconnectWallet, connectWallet, isConnecting } = useBlockchainContext() + const { connectedAccount, isMetaMask, disconnectWallet, connectWallet, isConnecting, selectedNetworkType } = useBlockchainContext() const [isExpanded, setIsExpanded] = useState(false) return ( @@ -28,7 +31,7 @@ const MobileSidebar: React.FC = ({ navigationItems }) => { {isExpanded && (
- +
{navigationItems.map((item) => (
= ({ navigationItems }) => {
{item.name === 'documentation' || item.name === 'explorer' ? ( + ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( + + + ) : ( - '' + <> )}
))}
{isMetaMask && connectedAccount ? ( -
- - Disconnect +
+
+ {`${connectedAccount.slice(0, 6)}...${connectedAccount.slice(-4)}`} +
+ {isMetaMask && }
) : (
From 4672f42463d4bfd74c77a438740eb31d156d79b8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 12 Nov 2024 19:12:00 +0000 Subject: [PATCH 139/266] caching improvements --- .../src/components/bridge/bridge/ActionButton.tsx | 4 ++-- .../src/components/bridge/bridge/BridgeView.tsx | 4 ++-- .../src/components/bridge/history/Deposit.tsx | 1 + .../world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 7a59277d..304cdeff 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -70,7 +70,7 @@ const ActionButton: React.FC = ({ return } setErrorMessage('') - transfer.mutateAsync(amount) + transfer.mutate(amount) return } @@ -107,7 +107,7 @@ const ActionButton: React.FC = ({ queryClient.refetchQueries(['estimatedFee']) } } - + console.log('about to transferinoz?') const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) await tx?.wait() return { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 72b0491b..2db9f4af 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -114,8 +114,8 @@ const BridgeView = ({ return } try { - const bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) - setBridger(bridger) + const _bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) + setBridger(_bridger) } catch (e) { console.log(e) setNetworkErrorMessage('Cannot bridge between these 2 networks') diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 49ee9922..fa07a769 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -31,6 +31,7 @@ const Deposit: React.FC = ({ deposit }) => { (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) + console.log(transferStatus?.status) return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index b0a21b8c..8e88ffb9 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -87,7 +87,7 @@ export const useBridgeTransfer = () => { }, retryDelay: (failureCount) => { console.log(failureCount) - return Math.min(2 ** failureCount * 1000, 60000) + return Math.min(10 ** failureCount * 1000, 60000) } } ) From 3718ef6b566e806061f1308295751101a74ded89 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 11:17:01 +0000 Subject: [PATCH 140/266] changed local storage keys and added networks --- webapps/world-builder-dashboard/constants.ts | 68 +++++++++++++++++-- .../components/bridge/bridge/ActionButton.tsx | 10 +-- .../components/bridge/history/Withdrawal.tsx | 6 +- .../src/components/faucet/FaucetView.tsx | 10 +-- .../src/contexts/BlockchainContext.tsx | 1 + .../contexts/BridgeNotificationsContext.tsx | 4 +- 6 files changed, 80 insertions(+), 19 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 175c3d7e..d33a96d0 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,4 +1,4 @@ -import { NetworkInterface, HighNetworkInterface } from '@/contexts/BlockchainContext' +import { NetworkInterface, HighNetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' export const L1_NETWORK: NetworkInterface = { chainId: 11155111, @@ -37,8 +37,8 @@ export const L2_NETWORK: HighNetworkInterface = { export const L3_NETWORK: HighNetworkInterface = { chainId: 13746, - name: 'conduit-orbit-deployer', - displayName: 'Game7 Testnet', + name: 'game7Testnet', + displayName: 'Game7 Testnet', rpcs: ['https://testnet-rpc.game7.io'], blockExplorerUrls: ['https://testnet.game7.io'], nativeCurrency: { @@ -52,7 +52,57 @@ export const L3_NETWORK: HighNetworkInterface = { staker: '0xa6B0461b7E54Fa342Be6320D4938295A81f82Cd3' } -export const ALL_NETWORKS = [L1_NETWORK, L2_NETWORK, L3_NETWORK] +export const L1_MAIN_NETWORK: NetworkInterface = { + chainId: 1, + name: 'ethereum', + displayName: 'Ethereum', + rpcs: ['https://eth-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + blockExplorerUrls: ['https://etherscan.io'], + nativeCurrency: { + decimals: 18, + name: 'ETH', + symbol: 'ETH' + }, + g7TokenAddress: '0x12c88a3C30A7AaBC1dd7f2c08a97145F5DCcD830', + routerSpender: '0x902b3e5f8f19571859f4ab1003b960a5df693aff', + retryableCreationTimeout: 15 * 60 +} + +export const L2_MAIN_NETWORK: NetworkInterface = { + chainId: 42161, + name: 'arbitrumOne', + displayName: 'Arbitrum One', + rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], + blockExplorerUrls: ['https://arbiscan.io/'], + nativeCurrency: { + decimals: 18, + name: 'ETH', + symbol: 'ETH' + }, + g7TokenAddress: '0xF18e4466F26B4cA55bbAb890b314a54976E45B17', + routerSpender: '0x902b3e5f8f19571859f4ab1003b960a5df693aff', + retryableCreationTimeout: 15 * 60 +} + +export const L3_MAIN_NETWORK: NetworkInterface = { + chainId: 2187, + name: 'game7', + displayName: 'Game7 Mainnet', + rpcs: ['https://mainnet-rpc.game7.io'], + blockExplorerUrls: ['https://mainnet.game7.io'], + nativeCurrency: { + decimals: 18, + name: 'Game7 Token', + symbol: 'G7T' + }, + g7TokenAddress: '0x0000000000000000000000000000000000000000', + routerSpender: '0x902b3e5f8f19571859f4ab1003b960a5df693aff', + retryableCreationTimeout: 15 * 60, + wrappedG7TokenAddress: '0xfa3ed70386b9255fC04aA008A8ad1B0CDa816Fac' +} + +export const ALL_TESTNET_NETWORKS = [L1_NETWORK, L2_NETWORK, L3_NETWORK] +export const ALL_MAINNET_NETWORKS = [L1_MAIN_NETWORK, L2_MAIN_NETWORK, L3_MAIN_NETWORK] export const L3_NATIVE_TOKEN_SYMBOL = 'TG7T' export const DEFAULT_LOW_NETWORK = L1_NETWORK @@ -71,3 +121,13 @@ export const FIVE_MINUTES = 1000 * 60 * 5 export const DEFAULT_STAKE_NATIVE_POOL_ID = '1' export const MAX_ALLOWANCE_ACCOUNT = '0x9ed191DB1829371F116Deb9748c26B49467a592A' + +export const getNetworks = () => { + const { selectedNetworkType } = useBlockchainContext() + switch (selectedNetworkType) { + case 'Mainnet': + return ALL_MAINNET_NETWORKS + case 'Testnet': + return ALL_TESTNET_NETWORKS + } +} diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 01e1e6bb..383740b8 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -28,7 +28,7 @@ interface ActionButtonProps { setErrorMessage: (arg0: string) => void } const ActionButton: React.FC = ({ direction, amount, isDisabled, setErrorMessage, L2L3message }) => { - const { connectedAccount, isConnecting, selectedHighNetwork, selectedLowNetwork, connectWallet, getProvider } = + const { connectedAccount, isConnecting, selectedHighNetwork, selectedLowNetwork, connectWallet, getProvider, selectedNetworkType } = useBlockchainContext() const [isAllowanceModalOpened, setIsAllowanceModalOpened] = useState(false) const [additionalCost, setAdditionalCost] = useState(ethers.BigNumber.from(0)) @@ -152,14 +152,14 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl return } try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = [] if (transactionsString) { transactions = JSON.parse(transactionsString) } transactions.push({ ...deposit, isDeposit: true }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(transactions)) + localStorage.setItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(transactions)) } catch (e) { console.log(e) } @@ -195,13 +195,13 @@ const ActionButton: React.FC = ({ direction, amount, isDisabl { onSuccess: async (record: TransactionRecord) => { try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = [] if (transactionsString) { transactions = JSON.parse(transactionsString) } transactions.push(record) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(transactions)) + localStorage.setItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(transactions)) } catch (e) { console.log(e) } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index b742f5a2..5b051800 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -65,7 +65,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK const status = getStatus(withdrawal) - const { switchChain, connectedAccount } = useBlockchainContext() + const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() const queryClient = useQueryClient() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') @@ -100,7 +100,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { { onSuccess: (data, highNetworkHash) => { try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = [] if (transactionsString) { @@ -118,7 +118,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { } return { ...t } }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + localStorage.setItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(newTransactions)) } catch (e) { console.log(e) } diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 9ae5255e..1381f65c 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react' import { useMutation, useQuery, useQueryClient } from 'react-query' -import { ALL_NETWORKS, FAUCET_CHAIN, L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../constants' +import { ALL_TESTNET_NETWORKS, FAUCET_CHAIN, L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../constants' import { AccountType } from '../commonComponents/accountSelector/AccountSelector' import AccountSelector from '../commonComponents/accountSelector/AccountSelector' import styles from './FaucetView.module.css' @@ -19,7 +19,7 @@ const FaucetView: React.FC = ({}) => { const [isValidAddress, setIsValidAddress] = useState(false) const [selectedNetwork, setSelectedNetwork] = useState(L3_NETWORK) const { useFaucetInterval, useFaucetTimestamp } = useFaucetAPI() - const { connectedAccount, connectWallet, chainId } = useBlockchainContext() + const { connectedAccount, connectWallet, chainId, selectedNetworkType } = useBlockchainContext() const [animatedInterval, setAnimatedInterval] = useState('') const [nextClaimTimestamp, setNextClaimTimestamp] = useState(0) const [networkError, setNetworkError] = useState('') @@ -32,7 +32,7 @@ const FaucetView: React.FC = ({}) => { const values: AccountType[] = [`External Address`, `Connected Account`] useEffect(() => { - const targetNetwork = ALL_NETWORKS.find((n) => n.chainId === faucetTargetChainId) + const targetNetwork = ALL_TESTNET_NETWORKS.find((n) => n.chainId === faucetTargetChainId) if (targetNetwork) { setSelectedNetwork(targetNetwork) } @@ -97,14 +97,14 @@ const FaucetView: React.FC = ({}) => { { onSuccess: (data: TransactionRecord | undefined, { address }) => { try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = [] if (transactionsString) { transactions = JSON.parse(transactionsString) } transactions.push({ ...data }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(transactions)) + localStorage.setItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(transactions)) } catch (e) { console.log(e) } diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 231a88b2..e3c6bd4a 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -44,6 +44,7 @@ export interface NetworkInterface { challengePeriod?: number //seconds staker?: string inbox?: string + wrappedG7TokenAddress?: string } export type NetworkType = 'Testnet' | 'Mainnet' diff --git a/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx b/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx index d2528398..5dd79f5e 100644 --- a/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx @@ -21,7 +21,7 @@ interface BridgeNotificationsProviderProps { export const BridgeNotificationsProvider: React.FC = ({ children }) => { const [newNotifications, setNewNotifications] = useState([]) - const { connectedAccount } = useBlockchainContext() + const { connectedAccount, selectedNetworkType } = useBlockchainContext() const [isDropdownOpened, setIsDropdownOpened] = useState(false) const [isModalOpened, setIsModalOpened] = useState(false) @@ -44,7 +44,7 @@ export const BridgeNotificationsProvider: React.FC { - const storageKey = `bridge-${connectedAccount}-transactions` + const storageKey = `bridge-${connectedAccount}-transactions-${selectedNetworkType}` const transactionsString = localStorage.getItem(storageKey) let transactions if (transactionsString) { From 83914535dbd2aeb71f91222b61a14ef766c52c28 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 12:06:25 +0000 Subject: [PATCH 141/266] storageKey upd8s --- webapps/world-builder-dashboard/constants.ts | 1 + .../components/bridge/bridge/BridgeView.tsx | 4 +- .../src/components/bridge/history/Deposit.tsx | 4 +- .../bridge/history/HistoryDesktop.tsx | 12 +++--- .../components/bridge/history/Withdrawal.tsx | 6 +-- .../src/contexts/BlockchainContext.tsx | 2 +- .../contexts/BridgeNotificationsContext.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 38 +++++++++++-------- .../src/hooks/useL2ToL1MessageStatus.ts | 10 +++-- 9 files changed, 44 insertions(+), 35 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 45e6af5f..27001c9e 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,4 +1,5 @@ import { NetworkInterface, HighNetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' +import { TokenAddressMap } from 'game7-bridge-sdk' export const L1_NETWORK: NetworkInterface = { chainId: 11155111, diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 2db9f4af..9b4be8a5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -1,7 +1,7 @@ // Libraries import { useEffect, useState } from 'react' import { useQuery } from 'react-query' -import { ALL_NETWORKS, DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' +import { ALL_TESTNET_NETWORKS, DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' @@ -64,7 +64,7 @@ const BridgeView = ({ ['estimatedFee', bridger, connectedAccount, value], async () => { try { - const originNetwork = ALL_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) + const originNetwork = ALL_TESTNET_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) if (!originNetwork) throw new Error("Can't find network!") const allowance = await bridger?.getAllowance(originNetwork.rpcs[0], connectedAccount ?? '') diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index fa07a769..e31fe2e1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -24,8 +24,8 @@ const Deposit: React.FC = ({ deposit }) => { const smallView = useMediaQuery('(max-width: 1199px)') const { returnTransferData } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) - const { connectedAccount } = useBlockchainContext() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const { connectedAccount, selectedNetworkType } = useBlockchainContext() + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5f621978..2078f9b7 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -45,7 +45,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { } const HistoryDesktop: React.FC = () => { - const { connectedAccount } = useBlockchainContext() + const { connectedAccount, selectedNetworkType } = useBlockchainContext() const messages = useMessages(connectedAccount) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) @@ -58,7 +58,7 @@ const HistoryDesktop: React.FC = () => { const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) // Retrieve existing transactions from localStorage - const storedTransactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const storedTransactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) const storedTransactions = storedTransactionsString ? JSON.parse(storedTransactionsString) : [] // Check if the combined transactions are different from those in localStorage @@ -81,7 +81,7 @@ const HistoryDesktop: React.FC = () => { ) localStorage.setItem( - `bridge-${connectedAccount}-transactions`, + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify([...storedTransactions, ...newTransactions]) ) } @@ -92,7 +92,7 @@ const HistoryDesktop: React.FC = () => { return (
- {mergedTransactions && ( + {messages.data && (
{headers.map((h) => ( @@ -100,7 +100,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {mergedTransactions + {messages.data .sort((x: TransactionRecord, y: TransactionRecord) => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp @@ -114,7 +114,7 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {mergedTransactions.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + {messages.data.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .length === 0 &&
No transactions yet
}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 37ae8c0c..62528a4a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -50,16 +50,14 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) - const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() - const queryClient = useQueryClient() - const { refetchNewNotifications } = useBridgeNotificationsContext() + const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal, returnTransferData]) const { data: transferStatus, isLoading } = transferData() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 151d8538..33b59d27 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -269,7 +269,7 @@ export const BlockchainProvider: React.FC = ({ children accounts, setAccounts, setSelectedBridgeToken, - selectedBridgeToken + selectedBridgeToken, selectedNetworkType, setSelectedNetworkType, }} diff --git a/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx b/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx index 5dd79f5e..1c1ac6df 100644 --- a/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BridgeNotificationsContext.tsx @@ -26,7 +26,7 @@ export const BridgeNotificationsProvider: React.FC { - const storageKey = `bridge-${connectedAccount}-transactions` + const storageKey = `bridge-${connectedAccount}-transactions-${selectedNetworkType}` const transactionsString = localStorage.getItem(storageKey) let transactions if (transactionsString) { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 8e88ffb9..631bb556 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' -import { ALL_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' +import { ALL_TESTNET_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -13,18 +13,22 @@ interface UseTransferDataProps { } export const useBridgeTransfer = () => { + const navigate = useNavigate() + const { refetchNewNotifications } = useBridgeNotificationsContext() + const queryClient = useQueryClient() + const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() + const returnTransferData = ({ txRecord }: UseTransferDataProps) => { - const { connectedAccount } = useBlockchainContext() // Pre-compute properties for cleaner instantiation const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId - const destinationRpc = ALL_NETWORKS.find((n) => n.chainId === destinationChainId)?.rpcs[0] - const originRpc = ALL_NETWORKS.find((n) => n.chainId === originChainId)?.rpcs[0] + const destinationRpc = ALL_TESTNET_NETWORKS.find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = ALL_TESTNET_NETWORKS.find((n) => n.chainId === originChainId)?.rpcs[0] const getCachedTransactions = () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) return transactionsString ? JSON.parse(transactionsString) : [] } @@ -50,7 +54,10 @@ export const useBridgeTransfer = () => { return isSameHash ? { ...t, status: status?.status } : t }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(newTransactions) + ) return status } catch (error: any) { @@ -93,17 +100,12 @@ export const useBridgeTransfer = () => { ) } - // Mutate function - const navigate = useNavigate() - const { refetchNewNotifications } = useBridgeNotificationsContext() - const queryClient = useQueryClient() - const { switchChain, connectedAccount } = useBlockchainContext() - const claim = useMutation( async (withdrawal: TransactionRecord | undefined) => { if (!withdrawal) { throw new Error('transaction hash is undefined') } + const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK let provider @@ -124,8 +126,10 @@ export const useBridgeTransfer = () => { txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: ALL_NETWORKS.find((n) => n.chainId === withdrawal.lowNetworkChainId)?.rpcs[0], - originSignerOrProviderOrRpc: ALL_NETWORKS.find((n) => n.chainId === withdrawal.highNetworkChainId)?.rpcs[0] + destinationSignerOrProviderOrRpc: ALL_TESTNET_NETWORKS.find((n) => n.chainId === withdrawal.lowNetworkChainId) + ?.rpcs[0], + originSignerOrProviderOrRpc: ALL_TESTNET_NETWORKS.find((n) => n.chainId === withdrawal.highNetworkChainId) + ?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } @@ -133,7 +137,9 @@ export const useBridgeTransfer = () => { { onSuccess: ({ res, withdrawal }) => { try { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}` + ) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { if (t.highNetworkHash === withdrawal.highNetworkHash) { @@ -148,7 +154,7 @@ export const useBridgeTransfer = () => { } return { ...t } }) - localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) + localStorage.setItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(newTransactions)) } catch (e) { console.log(e) } diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index ab8f27a6..e4e7440d 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -3,6 +3,7 @@ import { HIGH_NETWORKS, L2_NETWORK, LOW_NETWORKS } from '../../constants' import { ethers, providers } from 'ethers' import { Transaction } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' +import { useBlockchainContext } from '@/contexts/BlockchainContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ParentTransactionReceipt, @@ -249,7 +250,8 @@ export const useMessages = (connectedAccount: string | undefined): UseQueryResul if (!connectedAccount) { return [] } - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const { selectedNetworkType } = useBlockchainContext() + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) if (transactionsString) { return JSON.parse(transactionsString).sort(sortTransactions) } else { @@ -288,7 +290,8 @@ export const useNotifications = ( if (!connectedAccount) { return [] } - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const { selectedNetworkType } = useBlockchainContext() + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions if (!transactionsString) { return [] @@ -311,13 +314,14 @@ export const useNotifications = ( } export const usePendingTransactions = (connectedAccount: string | undefined): UseQueryResult => { + const { selectedNetworkType } = useBlockchainContext() return useQuery( ['pendingTransactions', connectedAccount], async () => { if (!connectedAccount) { return false } - const storageKey = `bridge-${connectedAccount}-transactions` + const storageKey = `bridge-${connectedAccount}-transactions-${selectedNetworkType}` const transactionsString = localStorage.getItem(storageKey) let transactions if (!transactionsString) { From 75b24219dfb6d57703a9ca3d6b6ba85727bf0b74 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 18:01:49 +0000 Subject: [PATCH 142/266] caching looking SICK --- .../src/assets/IconChevronDownToggle.tsx | 15 +++++++++ .../bridge/allowance/AllowanceSelector.tsx | 2 +- .../components/bridge/bridge/ActionButton.tsx | 3 +- .../src/components/bridge/history/Deposit.tsx | 1 - .../bridge/history/HistoryDesktop.tsx | 33 ++++++++++++------- .../src/hooks/useBridgeTransfer.ts | 1 + .../src/hooks/useL2ToL1MessageStatus.ts | 2 +- 7 files changed, 40 insertions(+), 17 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx diff --git a/webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx b/webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx new file mode 100644 index 00000000..e52db3af --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx @@ -0,0 +1,15 @@ +import React from 'react' + +const IconChevronDownToggle: React.FC> = (props) => ( + + + +) + +export default IconChevronDownToggle diff --git a/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx index 5bc70e0c..4f4b190e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx @@ -1,7 +1,7 @@ import styles from './AllowanceSelector.module.css' import { ethers } from 'ethers' import { Combobox, Tooltip, useCombobox } from 'summon-ui/mantine' -import IconAlertCircle from '@/assets/IconAlertCircle' +import IconAlertCircle from '@/assets/IconChevronDownToggle' import IconCheck from '@/assets/IconCheck' import IconChevronDown from '@/assets/IconChevronDown' import { formatBigNumber } from '@/utils/web3utils' diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 304cdeff..9fd99794 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -107,8 +107,7 @@ const ActionButton: React.FC = ({ queryClient.refetchQueries(['estimatedFee']) } } - console.log('about to transferinoz?') - const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) + const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) await tx?.wait() return { type: 'DEPOSIT', diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index fa07a769..49ee9922 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -31,7 +31,6 @@ const Deposit: React.FC = ({ deposit }) => { (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) - console.log(transferStatus?.status) return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5f621978..bb0d0096 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -16,12 +16,22 @@ interface HistoryDesktopProps {} const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { const combinedData = new Map() - apiData.forEach((tx) => - combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) - ) - localData.forEach((tx) => - combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) - ) + localData.forEach((localTx) => { + const hashKey = localTx.type === 'DEPOSIT' ? (localTx.lowNetworkHash ?? '') : (localTx.highNetworkHash ?? '') + combinedData.set(hashKey, localTx) + }) + + apiData.forEach((tx) => { + const hashKey = tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? '') + if (combinedData.has(hashKey)) { + const localTx = combinedData.get(hashKey) + if (localTx) { + tx.status = localTx.status + combinedData.set(hashKey, tx) + } + } + }) + return Array.from(combinedData.values()) } @@ -52,7 +62,7 @@ const HistoryDesktop: React.FC = () => { const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - // Merge transactions only when API data is updated with new data + // Merge transations only when API data is updated with new data useEffect(() => { const localTransactions = messages.data || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] @@ -80,12 +90,11 @@ const HistoryDesktop: React.FC = () => { ) ) - localStorage.setItem( - `bridge-${connectedAccount}-transactions`, - JSON.stringify([...storedTransactions, ...newTransactions]) - ) + // localStorage.setItem( + // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + // JSON.stringify([...storedTransactions, ...newTransactions]) + // ) } - setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 8e88ffb9..313fb20b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -92,6 +92,7 @@ export const useBridgeTransfer = () => { } ) } + const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() // Mutate function const navigate = useNavigate() diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index ab8f27a6..549ec7a0 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -244,7 +244,7 @@ const sortTransactions = (a: TransactionRecord, b: TransactionRecord) => { return getTimestamp(b) - getTimestamp(a) } -export const useMessages = (connectedAccount: string | undefined): UseQueryResult => { +export const useMessages = (connectedAccount: string | undefined, networkType: string): UseQueryResult => { return useQuery(['incomingMessages', connectedAccount], () => { if (!connectedAccount) { return [] From 8e2825661cb2e7cbd81c9641eca09236e4fb0d7e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 18:05:12 +0000 Subject: [PATCH 143/266] yarn build --- .../src/components/bridge/history/HistoryDesktop.tsx | 8 ++++---- .../src/hooks/useBridgeTransfer.ts | 2 -- .../src/hooks/useL2ToL1MessageStatus.ts | 2 +- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index bb0d0096..6e987fcb 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -90,10 +90,10 @@ const HistoryDesktop: React.FC = () => { ) ) - // localStorage.setItem( - // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - // JSON.stringify([...storedTransactions, ...newTransactions]) - // ) + localStorage.setItem( + `bridge-${connectedAccount}-transactions`, + JSON.stringify([...storedTransactions, ...newTransactions]) + ) } setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 313fb20b..1eded066 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -92,8 +92,6 @@ export const useBridgeTransfer = () => { } ) } - const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() - // Mutate function const navigate = useNavigate() const { refetchNewNotifications } = useBridgeNotificationsContext() diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 549ec7a0..ab8f27a6 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -244,7 +244,7 @@ const sortTransactions = (a: TransactionRecord, b: TransactionRecord) => { return getTimestamp(b) - getTimestamp(a) } -export const useMessages = (connectedAccount: string | undefined, networkType: string): UseQueryResult => { +export const useMessages = (connectedAccount: string | undefined): UseQueryResult => { return useQuery(['incomingMessages', connectedAccount], () => { if (!connectedAccount) { return [] From 14a34a45610ecd58a85a0dbc08748d48f41b417f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 18:07:29 +0000 Subject: [PATCH 144/266] storageKey updates --- .../src/assets/IconAlertCircle copy.tsx | 21 --------- .../src/assets/IconAlertCircle.tsx | 22 ++++++--- .../src/assets/IconChevronDownToggle.tsx | 15 +++++++ .../bridge/allowance/AllowanceSelector.tsx | 2 +- .../components/bridge/bridge/ActionButton.tsx | 1 - .../src/components/bridge/history/Deposit.tsx | 1 - .../bridge/history/HistoryDesktop.tsx | 45 ++++++++++++------- .../networkToggle/NetworkToggle.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 7 ++- .../src/hooks/useL2ToL1MessageStatus.ts | 9 ++-- 10 files changed, 71 insertions(+), 54 deletions(-) delete mode 100644 webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx create mode 100644 webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx diff --git a/webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx b/webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx deleted file mode 100644 index 8a2da44b..00000000 --- a/webapps/world-builder-dashboard/src/assets/IconAlertCircle copy.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import React, { forwardRef } from 'react' - -const IconAlertCircle = forwardRef>((props, ref) => ( - - - - - - - - - - -)) - -export default IconAlertCircle diff --git a/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx b/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx index 3a61c188..8a2da44b 100644 --- a/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconAlertCircle.tsx @@ -1,9 +1,21 @@ import React, { forwardRef } from 'react' -const IconChevronDownToggle = forwardRef>((props) => ( - - - +const IconAlertCircle = forwardRef>((props, ref) => ( + + + + + + + + + + )) -export default IconChevronDownToggle +export default IconAlertCircle diff --git a/webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx b/webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx new file mode 100644 index 00000000..e52db3af --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/IconChevronDownToggle.tsx @@ -0,0 +1,15 @@ +import React from 'react' + +const IconChevronDownToggle: React.FC> = (props) => ( + + + +) + +export default IconChevronDownToggle diff --git a/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx index 5bc70e0c..4f4b190e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/allowance/AllowanceSelector.tsx @@ -1,7 +1,7 @@ import styles from './AllowanceSelector.module.css' import { ethers } from 'ethers' import { Combobox, Tooltip, useCombobox } from 'summon-ui/mantine' -import IconAlertCircle from '@/assets/IconAlertCircle' +import IconAlertCircle from '@/assets/IconChevronDownToggle' import IconCheck from '@/assets/IconCheck' import IconChevronDown from '@/assets/IconChevronDown' import { formatBigNumber } from '@/utils/web3utils' diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 7a6ad2e0..1e09e8b8 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -108,7 +108,6 @@ const ActionButton: React.FC = ({ queryClient.refetchQueries(['estimatedFee']) } } - console.log('about to transferinoz?') const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) await tx?.wait() return { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index e31fe2e1..869440f4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -31,7 +31,6 @@ const Deposit: React.FC = ({ deposit }) => { (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) - console.log(transferStatus?.status) return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 2078f9b7..f7f1c500 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -16,12 +16,22 @@ interface HistoryDesktopProps {} const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { const combinedData = new Map() - apiData.forEach((tx) => - combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) - ) - localData.forEach((tx) => - combinedData.set(tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? ''), tx) - ) + localData.forEach((localTx) => { + const hashKey = localTx.type === 'DEPOSIT' ? (localTx.lowNetworkHash ?? '') : (localTx.highNetworkHash ?? '') + combinedData.set(hashKey, localTx) + }) + + apiData.forEach((tx) => { + const hashKey = tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? '') + if (combinedData.has(hashKey)) { + const localTx = combinedData.get(hashKey) + if (localTx) { + tx.status = localTx.status + combinedData.set(hashKey, tx) + } + } + }) + return Array.from(combinedData.values()) } @@ -46,19 +56,21 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() - const messages = useMessages(connectedAccount) + const messages = useMessages(connectedAccount, selectedNetworkType) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) const headers = ['Type', 'Submitted', 'Token', 'From', 'To', 'Transaction', 'Status'] - // Merge transactions only when API data is updated with new data + // Merge transations only when API data is updated with new data useEffect(() => { const localTransactions = messages.data || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) // Retrieve existing transactions from localStorage - const storedTransactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) + const storedTransactionsString = localStorage.getItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}` + ) const storedTransactions = storedTransactionsString ? JSON.parse(storedTransactionsString) : [] // Check if the combined transactions are different from those in localStorage @@ -80,19 +92,18 @@ const HistoryDesktop: React.FC = () => { ) ) - localStorage.setItem( - `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - JSON.stringify([...storedTransactions, ...newTransactions]) - ) + // localStorage.setItem( + // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + // JSON.stringify([...storedTransactions, ...newTransactions]) + // ) } - setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) return (
- {messages.data && ( + {mergedTransactions && (
{headers.map((h) => ( @@ -100,7 +111,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {messages.data + {mergedTransactions .sort((x: TransactionRecord, y: TransactionRecord) => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp @@ -114,7 +125,7 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {messages.data.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + {mergedTransactions.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .length === 0 &&
No transactions yet
}
diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index bd98a230..b1a017b3 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -1,6 +1,6 @@ import React, { useState } from 'react' import styles from './NetworkToggle.module.css' -import IconChevronDownToggle from '@/assets/IconAlertCircle' +import IconChevronDownToggle from '@/assets/IconChevronDownToggle' import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' const NETWORK_OPTIONS: NetworkType[] = ['Testnet', 'Mainnet'] diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 631bb556..d37807d6 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -16,7 +16,6 @@ export const useBridgeTransfer = () => { const navigate = useNavigate() const { refetchNewNotifications } = useBridgeNotificationsContext() const queryClient = useQueryClient() - const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() const returnTransferData = ({ txRecord }: UseTransferDataProps) => { // Pre-compute properties for cleaner instantiation @@ -99,6 +98,7 @@ export const useBridgeTransfer = () => { } ) } + const { switchChain, connectedAccount, selectedNetworkType } = useBlockchainContext() const claim = useMutation( async (withdrawal: TransactionRecord | undefined) => { @@ -154,7 +154,10 @@ export const useBridgeTransfer = () => { } return { ...t } }) - localStorage.setItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(newTransactions)) + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(newTransactions) + ) } catch (e) { console.log(e) } diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index e4e7440d..501279f7 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -245,13 +245,12 @@ const sortTransactions = (a: TransactionRecord, b: TransactionRecord) => { return getTimestamp(b) - getTimestamp(a) } -export const useMessages = (connectedAccount: string | undefined): UseQueryResult => { +export const useMessages = (connectedAccount: string | undefined, networkType: string): UseQueryResult => { return useQuery(['incomingMessages', connectedAccount], () => { if (!connectedAccount) { return [] } - const { selectedNetworkType } = useBlockchainContext() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${networkType}`) if (transactionsString) { return JSON.parse(transactionsString).sort(sortTransactions) } else { @@ -290,8 +289,8 @@ export const useNotifications = ( if (!connectedAccount) { return [] } - const { selectedNetworkType } = useBlockchainContext() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) + // const { selectedNetworkType } = useBlockchainContext() + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions if (!transactionsString) { return [] From 95d97eed98954ef18bb27af4e9059043074c61fa Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 18:41:06 +0000 Subject: [PATCH 145/266] toggling between transactions let's fkn goo --- .../bridge/history/HistoryDesktop.tsx | 26 +++++++++------- .../src/hooks/useL2ToL1MessageStatus.ts | 31 ++++++++++++------- 2 files changed, 34 insertions(+), 23 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index f7f1c500..89a664c5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -56,7 +56,9 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() + console.log(selectedNetworkType) const messages = useMessages(connectedAccount, selectedNetworkType) + console.log(messages.data) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) @@ -82,15 +84,15 @@ const HistoryDesktop: React.FC = () => { : tx.highNetworkHash === storedTransactions[index]?.highNetworkHash ) ) { - // Determine new transactions that aren’t in storedTransactions - const newTransactions = combinedTransactions.filter( - (newTx) => - !storedTransactions.some((storedTx: TransactionRecord) => - storedTx.type === 'DEPOSIT' - ? storedTx.lowNetworkHash === newTx.lowNetworkHash - : storedTx.highNetworkHash === newTx.highNetworkHash - ) - ) + // // Determine new transactions that aren’t in storedTransactions + // const newTransactions = combinedTransactions.filter( + // (newTx) => + // !storedTransactions.some((storedTx: TransactionRecord) => + // storedTx.type === 'DEPOSIT' + // ? storedTx.lowNetworkHash === newTx.lowNetworkHash + // : storedTx.highNetworkHash === newTx.highNetworkHash + // ) + // ) // localStorage.setItem( // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, @@ -103,7 +105,7 @@ const HistoryDesktop: React.FC = () => { return (
- {mergedTransactions && ( + {messages.data && (
{headers.map((h) => ( @@ -111,7 +113,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {mergedTransactions + {messages.data .sort((x: TransactionRecord, y: TransactionRecord) => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp @@ -125,7 +127,7 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {mergedTransactions.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + {messages.data.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .length === 0 &&
No transactions yet
}
diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 501279f7..97f67d46 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -245,18 +245,27 @@ const sortTransactions = (a: TransactionRecord, b: TransactionRecord) => { return getTimestamp(b) - getTimestamp(a) } -export const useMessages = (connectedAccount: string | undefined, networkType: string): UseQueryResult => { - return useQuery(['incomingMessages', connectedAccount], () => { - if (!connectedAccount) { - return [] - } - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${networkType}`) - if (transactionsString) { - return JSON.parse(transactionsString).sort(sortTransactions) - } else { - return [] +export const useMessages = ( + connectedAccount: string | undefined, + networkType: string +): UseQueryResult => { + return useQuery( + ['incomingMessages', connectedAccount, networkType], + () => { + if (!connectedAccount) { + return [] + } + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${networkType}`) + if (transactionsString) { + return JSON.parse(transactionsString).sort(sortTransactions) + } else { + return [] + } + }, + { + enabled: !!networkType && !!connectedAccount } - }) + ) } export const getNotifications = (transactions: TransactionRecord[]) => { From 7caa00b183c80b1b71a8b4f4619d2fc58049a67d Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 19:50:49 +0000 Subject: [PATCH 146/266] tokens showing in network selector --- webapps/world-builder-dashboard/constants.ts | 43 +++++-- .../components/bridge/bridge/BridgeView.tsx | 56 ++++++--- .../bridge/bridge/NetworkSelector.tsx | 10 +- .../src/contexts/BlockchainContext.tsx | 37 ++++-- .../src/utils/tokens.ts | 112 +++++++++++++++++- 5 files changed, 210 insertions(+), 48 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 27001c9e..12699f48 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -73,7 +73,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { chainId: 42161, name: 'arbitrumOne', displayName: 'Arbitrum One', - rpcs: ['https://ethereum-sepolia-rpc.publicnode.com'], + rpcs: ['https://arb-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], blockExplorerUrls: ['https://arbiscan.io/'], nativeCurrency: { decimals: 18, @@ -108,6 +108,8 @@ export const ALL_MAINNET_NETWORKS = [L1_MAIN_NETWORK, L2_MAIN_NETWORK, L3_MAIN_N export const L3_NATIVE_TOKEN_SYMBOL = 'TG7T' export const DEFAULT_LOW_NETWORK = L1_NETWORK export const DEFAULT_HIGH_NETWORK = L2_NETWORK +export const DEFAULT_LOW_MAINNET_NETWORK = L1_MAIN_NETWORK +export const DEFAULT_HIGH_MAINNET_NETWORK = L2_MAIN_NETWORK export const LOW_NETWORKS = [L1_NETWORK, L2_NETWORK] export const HIGH_NETWORKS = [L2_NETWORK, L3_NETWORK] @@ -123,16 +125,6 @@ export const DEFAULT_STAKE_NATIVE_POOL_ID = '1' export const MAX_ALLOWANCE_ACCOUNT = '0x9ed191DB1829371F116Deb9748c26B49467a592A' -export const getNetworks = () => { - const { selectedNetworkType } = useBlockchainContext() - switch (selectedNetworkType) { - case 'Mainnet': - return ALL_MAINNET_NETWORKS - case 'Testnet': - return ALL_TESTNET_NETWORKS - } -} - export const TG7T: TokenAddressMap = { 13746: '0x0000000000000000000000000000000000000000', 421614: '0x10adbf84548f923577be12146eac104c899d1e75', @@ -150,5 +142,34 @@ export const USDC: TokenAddressMap = { 11155111: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' } +export const G7T_MAINNET: TokenAddressMap = { + 2187: '0x0000000000000000000000000000000000000000', + 42161: '0xF18e4466F26B4cA55bbAb890b314a54976E45B17', + 1: '0x12c88a3C30A7AaBC1dd7f2c08a97145F5DCcD830' +} + +export const ETH_MAINNET: TokenAddressMap = { + 42161: '0x0000000000000000000000000000000000000000', + 1: '0x0000000000000000000000000000000000000000' +} + +export const USDC_MAINNET: TokenAddressMap = { + 2187: '0x401eCb1D350407f13ba348573E5630B83638E30D', + 42161: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + 1: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' +} + + + +export const getNetworks = () => { + const { selectedNetworkType } = useBlockchainContext() + switch (selectedNetworkType) { + case 'Mainnet': + return ALL_MAINNET_NETWORKS + case 'Testnet': + return ALL_TESTNET_NETWORKS + } +} + // ETH, ARBITRUM, USDC, MANTLE, USDT, export const ALL_TOKEN_MAPPINGS = [TG7T, ETH, USDC] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 9b4be8a5..820a6041 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -1,7 +1,16 @@ // Libraries import { useEffect, useState } from 'react' import { useQuery } from 'react-query' -import { ALL_TESTNET_NETWORKS, DEFAULT_STAKE_NATIVE_POOL_ID, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../../../constants' +import { + ALL_TESTNET_NETWORKS, + DEFAULT_STAKE_NATIVE_POOL_ID, + L1_MAIN_NETWORK, + L1_NETWORK, + L2_MAIN_NETWORK, + L2_NETWORK, + L3_MAIN_NETWORK, + L3_NETWORK +} from '../../../../constants' // Styles and Icons import styles from './BridgeView.module.css' import { ethers } from 'ethers' @@ -47,7 +56,8 @@ const BridgeView = ({ selectedHighNetwork, setSelectedHighNetwork, setSelectedBridgeToken, - selectedBridgeToken + selectedBridgeToken, + selectedNetworkType } = useBlockchainContext() const { isFetching: isFetchingTokenInformation, data: tokenInformation } = useTokenInformation({ @@ -55,6 +65,9 @@ const BridgeView = ({ token: selectedBridgeToken }) + console.log(selectedLowNetwork) + console.log(selectedHighNetwork) + const { data: coinUSDRate, isFetching: isCoinFetching } = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? '') const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) @@ -148,7 +161,7 @@ const BridgeView = ({ if ((isSource && direction === 'DEPOSIT') || (!isSource && direction === 'WITHDRAW')) { return ( setInputErrorMessages((prev) => ({ ...prev, value: msg }))} selectedChainId={direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId} /> - {direction === 'DEPOSIT' && selectedLowNetwork.chainId === L2_NETWORK.chainId && isMessagingEnabled && ( - { - setMessage((prev) => ({ ...prev, ...newMessage })) - }} - errors={inputErrorMessages} - setErrors={(newErrors) => { - setInputErrorMessages((prev) => ({ ...prev, ...newErrors })) - }} - /> - )} + {direction === 'DEPOSIT' && + selectedLowNetwork.chainId === L2_NETWORK.chainId && + isMessagingEnabled && + selectedNetworkType === 'Testnet' && ( + { + setMessage((prev) => ({ ...prev, ...newMessage })) + }} + errors={inputErrorMessages} + setErrors={(newErrors) => { + setInputErrorMessages((prev) => ({ ...prev, ...newErrors })) + }} + /> + )} { + console.log(chainId) switch (chainId) { - case L1_NETWORK.chainId: + case chainId === L1_NETWORK.chainId || L1_MAIN_NETWORK.chainId: return - case L2_NETWORK.chainId: + case chainId === L2_NETWORK.chainId || L2_MAIN_NETWORK.chainId: return - case L3_NETWORK.chainId: + case chainId === L3_NETWORK.chainId || L3_MAIN_NETWORK.chainId: return default: return <> @@ -65,7 +66,6 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: {networks.map((n) => { - // can create token address map here const chainIds = Object.keys(selectedToken.tokenAddressMap) const isDisabled = chainIds.includes(String(n.chainId)) return ( diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 33b59d27..09887acf 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -1,6 +1,17 @@ // BlockchainContext.tsx import React, { createContext, useContext, ReactNode, useState, useEffect } from 'react' -import { DEFAULT_HIGH_NETWORK, DEFAULT_LOW_NETWORK, L1_NETWORK, L2_NETWORK, L3_NETWORK } from '../../constants' +import { + DEFAULT_HIGH_MAINNET_NETWORK, + DEFAULT_HIGH_NETWORK, + DEFAULT_LOW_MAINNET_NETWORK, + DEFAULT_LOW_NETWORK, + L1_MAIN_NETWORK, + L1_NETWORK, + L2_MAIN_NETWORK, + L2_NETWORK, + L3_MAIN_NETWORK, + L3_NETWORK +} from '../../constants' import { ethers } from 'ethers' import { getTokensForNetwork, Token } from '@/utils/tokens' @@ -64,9 +75,13 @@ interface BlockchainProviderProps { export const BlockchainProvider: React.FC = ({ children }) => { const [walletProvider, setWalletProvider] = useState() - const [selectedLowNetwork, _setSelectedLowNetwork] = useState(DEFAULT_LOW_NETWORK) - const [selectedHighNetwork, _setSelectedHighNetwork] = useState(DEFAULT_HIGH_NETWORK) - const [selectedNetworkType, setSelectedNetworkType] = useState('Testnet') + const [selectedNetworkType, setSelectedNetworkType] = useState('Mainnet') + const [selectedLowNetwork, _setSelectedLowNetwork] = useState( + selectedNetworkType === 'Testnet' ? DEFAULT_LOW_NETWORK : DEFAULT_LOW_MAINNET_NETWORK + ) + const [selectedHighNetwork, _setSelectedHighNetwork] = useState( + selectedNetworkType === 'Testnet' ? DEFAULT_HIGH_NETWORK : DEFAULT_HIGH_MAINNET_NETWORK + ) const [isMetaMask, setIsMetaMask] = useState(false) const [isConnecting, setIsConnecting] = useState(false) const [chainId, setChainId] = useState(undefined) @@ -78,19 +93,19 @@ export const BlockchainProvider: React.FC = ({ children const tokenAddress = '0x5f88d811246222F6CB54266C42cc1310510b9feA' const setSelectedLowNetwork = (network: NetworkInterface) => { - if (network === L1_NETWORK) { - _setSelectedHighNetwork(L2_NETWORK) + if (network === L1_NETWORK || network === L1_MAIN_NETWORK) { + _setSelectedHighNetwork(selectedNetworkType === 'Testnet' ? L2_NETWORK : L2_MAIN_NETWORK) } else { - _setSelectedHighNetwork(L3_NETWORK) + _setSelectedHighNetwork(selectedNetworkType === 'Testnet' ? L3_NETWORK : L3_MAIN_NETWORK) } _setSelectedLowNetwork(network) } const setSelectedHighNetwork = (network: NetworkInterface) => { - if (network === L2_NETWORK) { - _setSelectedLowNetwork(L1_NETWORK) + if (network === L2_NETWORK || network === L2_MAIN_NETWORK) { + _setSelectedLowNetwork(selectedNetworkType === 'Testnet' ? L1_NETWORK : L1_MAIN_NETWORK) } else { - _setSelectedLowNetwork(L2_NETWORK) + _setSelectedLowNetwork(selectedNetworkType === 'Testnet' ? L2_NETWORK : L2_MAIN_NETWORK) } _setSelectedHighNetwork(network) } @@ -271,7 +286,7 @@ export const BlockchainProvider: React.FC = ({ children setSelectedBridgeToken, selectedBridgeToken, selectedNetworkType, - setSelectedNetworkType, + setSelectedNetworkType }} > {children} diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 2eeb1389..2843d674 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -1,4 +1,17 @@ -import { ETH, L1_NETWORK, L2_NETWORK, L3_NETWORK, TG7T, USDC } from '../../constants' +import { + ETH, + ETH_MAINNET, + G7T_MAINNET, + L1_MAIN_NETWORK, + L1_NETWORK, + L2_MAIN_NETWORK, + L2_NETWORK, + L3_MAIN_NETWORK, + L3_NETWORK, + TG7T, + USDC, + USDC_MAINNET +} from '../../constants' import { ZERO_ADDRESS } from './web3utils' import { TokenAddressMap } from 'game7-bridge-sdk' import IconEthereum from '@/assets/IconEthereum' @@ -94,7 +107,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st decimals: 6, geckoId: 'usd-coin' }, - ...storedTokensWithItems + ...storedTokensWithItems ] case L3_NETWORK.chainId: return [ @@ -121,6 +134,101 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st }, ...storedTokensWithItems ] + case L1_MAIN_NETWORK.chainId: + return [ + { + name: 'Game7DAO', + symbol: 'G7T', + address: L1_MAIN_NETWORK.g7TokenAddress, + Icon: IconG7T, + tokenAddressMap: G7T_MAINNET, + rpc: L1_MAIN_NETWORK.rpcs[0], + chainId: L1_MAIN_NETWORK.chainId, + geckoId: 'G7T' + }, + { + name: 'Ethereum', + symbol: 'ETH', + address: ZERO_ADDRESS, + Icon: IconEthereum, + rpc: L1_MAIN_NETWORK.rpcs[0], + tokenAddressMap: ETH_MAINNET, + chainId: L1_MAIN_NETWORK.chainId, + geckoId: 'ethereum' + }, + { + name: 'USDC', + symbol: 'USDC', + address: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48', + Icon: IconUSDC, + rpc: L1_MAIN_NETWORK.rpcs[0], + tokenAddressMap: USDC_MAINNET, + chainId: L1_MAIN_NETWORK.chainId, + decimals: 6, + geckoId: 'usd-coin' + }, + ...storedTokensWithItems + ] + case L2_MAIN_NETWORK.chainId: + return [ + { + name: 'Game7DAO', + symbol: 'G7T', + address: L2_MAIN_NETWORK.g7TokenAddress, + Icon: IconG7T, + tokenAddressMap: G7T_MAINNET, + rpc: L2_MAIN_NETWORK.rpcs[0], + chainId: L2_MAIN_NETWORK.chainId, + geckoId: 'G7T' + }, + { + name: 'Ethereum', + symbol: 'ETH', + address: ZERO_ADDRESS, + Icon: IconEthereum, + rpc: L2_MAIN_NETWORK.rpcs[0], + tokenAddressMap: ETH_MAINNET, + chainId: L2_MAIN_NETWORK.chainId, + geckoId: 'ethereum' + }, + { + name: 'USDC', + symbol: 'USDC', + address: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831', + Icon: IconUSDC, + rpc: L2_MAIN_NETWORK.rpcs[0], + tokenAddressMap: USDC_MAINNET, + chainId: L2_MAIN_NETWORK.chainId, + decimals: 6, + geckoId: 'usd-coin' + }, + ...storedTokensWithItems + ] + case L3_MAIN_NETWORK.chainId: + return [ + { + name: 'Game7DAO', + symbol: 'G7T', + address: L3_MAIN_NETWORK.g7TokenAddress, + Icon: IconG7T, + tokenAddressMap: G7T_MAINNET, + rpc: L3_MAIN_NETWORK.rpcs[0], + chainId: L3_MAIN_NETWORK.chainId, + geckoId: 'G7T' + }, + { + name: 'USDC', + symbol: 'USDC', + address: '0x401eCb1D350407f13ba348573E5630B83638E30D', + Icon: IconUSDC, + rpc: L3_MAIN_NETWORK.rpcs[0], + tokenAddressMap: USDC_MAINNET, + chainId: L3_MAIN_NETWORK.chainId, + decimals: 6, + geckoId: 'usd-coin' + }, + ...storedTokensWithItems + ] default: return [] // Return an empty array or handle unsupported networks } From eb8f566361b6dfbde30aab347515b5c82879e924 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 13 Nov 2024 20:01:18 +0000 Subject: [PATCH 147/266] networks now showing.. nice --- .../bridge/bridge/NetworkSelector.tsx | 18 +++++++--- .../src/contexts/BlockchainContext.tsx | 34 ++++++++++++------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 745a7841..2bc2b527 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -1,4 +1,11 @@ -import { L1_MAIN_NETWORK, L1_NETWORK, L2_MAIN_NETWORK, L2_NETWORK, L3_MAIN_NETWORK, L3_NETWORK } from '../../../../constants' +import { + L1_MAIN_NETWORK, + L1_NETWORK, + L2_MAIN_NETWORK, + L2_NETWORK, + L3_MAIN_NETWORK, + L3_NETWORK +} from '../../../../constants' import styles from './NetworkSelector.module.css' import { Combobox, Group, InputBase, InputBaseProps, useCombobox } from 'summon-ui/mantine' import IconArbitrumOne from '@/assets/IconArbitrumOne' @@ -24,11 +31,14 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: const networkLogo = (chainId: number) => { console.log(chainId) switch (chainId) { - case chainId === L1_NETWORK.chainId || L1_MAIN_NETWORK.chainId: + case L1_NETWORK.chainId: + case L1_MAIN_NETWORK.chainId: return - case chainId === L2_NETWORK.chainId || L2_MAIN_NETWORK.chainId: + case L2_NETWORK.chainId: + case L2_MAIN_NETWORK.chainId: return - case chainId === L3_NETWORK.chainId || L3_MAIN_NETWORK.chainId: + case L3_NETWORK.chainId: + case L3_MAIN_NETWORK.chainId: return default: return <> diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 09887acf..683b6623 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -75,7 +75,7 @@ interface BlockchainProviderProps { export const BlockchainProvider: React.FC = ({ children }) => { const [walletProvider, setWalletProvider] = useState() - const [selectedNetworkType, setSelectedNetworkType] = useState('Mainnet') + const [selectedNetworkType, setSelectedNetworkType] = useState('Testnet') const [selectedLowNetwork, _setSelectedLowNetwork] = useState( selectedNetworkType === 'Testnet' ? DEFAULT_LOW_NETWORK : DEFAULT_LOW_MAINNET_NETWORK ) @@ -124,6 +124,27 @@ export const BlockchainProvider: React.FC = ({ children } }, [window.ethereum]) + useEffect(() => { + fetchChainId() + if (window.ethereum?.on) { + window.ethereum.on('chainChanged', handleChainChanged) + } + }, [walletProvider]) + + useEffect(() => { + handleAccountsChanged() + }, [walletProvider]) + + useEffect(() => { + if (selectedNetworkType === 'Testnet') { + setSelectedLowNetwork(DEFAULT_LOW_NETWORK) + setSelectedHighNetwork(DEFAULT_HIGH_NETWORK) + } else { + setSelectedLowNetwork(DEFAULT_LOW_MAINNET_NETWORK) + setSelectedHighNetwork(DEFAULT_HIGH_MAINNET_NETWORK) + } + }, [selectedNetworkType]) + const fetchChainId = async () => { const _chainId = (await walletProvider?.getNetwork())?.chainId setChainId(_chainId) @@ -134,13 +155,6 @@ export const BlockchainProvider: React.FC = ({ children setChainId(newChainId) } - useEffect(() => { - fetchChainId() - if (window.ethereum?.on) { - window.ethereum.on('chainChanged', handleChainChanged) - } - }, [walletProvider]) - const handleAccountsChanged = async () => { const ethereum = window.ethereum if (ethereum) { @@ -157,10 +171,6 @@ export const BlockchainProvider: React.FC = ({ children } } - useEffect(() => { - handleAccountsChanged() - }, [walletProvider]) - const connectWallet = async () => { setIsConnecting(true) const ethereum = window.ethereum From 24614788c9c3f8882389c59283c26353dd6f4208 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 10:20:54 +0000 Subject: [PATCH 148/266] navigate to `/bridge` when on settings page and on mainnet --- .../src/components/bridge/bridge/BridgeView.tsx | 3 --- .../src/components/bridge/bridge/NetworkSelector.tsx | 1 - .../src/components/bridge/settings/SettingsView.tsx | 7 ++++++- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 820a6041..efdfc551 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -65,9 +65,6 @@ const BridgeView = ({ token: selectedBridgeToken }) - console.log(selectedLowNetwork) - console.log(selectedHighNetwork) - const { data: coinUSDRate, isFetching: isCoinFetching } = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? '') const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 2bc2b527..46479158 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -29,7 +29,6 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: }) const networkLogo = (chainId: number) => { - console.log(chainId) switch (chainId) { case L1_NETWORK.chainId: case L1_MAIN_NETWORK.chainId: diff --git a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx index 35ffb73e..98b0331a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/settings/SettingsView.tsx @@ -4,18 +4,23 @@ import { L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../../constants' import styles from './SettingsView.module.css' import IconG7tLarge from '@/assets/IconG7tLarge' import MessagingSettings from '@/components/bridge/settings/MessagingSettings' -import { NetworkInterface } from '@/contexts/BlockchainContext' +import { NetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' import { useUISettings } from '@/contexts/UISettingsContext' interface SettingsViewProps {} const SettingsView: React.FC = ({}) => { const { setFaucetTargetChainId } = useUISettings() + const { selectedNetworkType } = useBlockchainContext() const navigate = useNavigate() const handleClick = (network: NetworkInterface) => { setFaucetTargetChainId(network.chainId) navigate('/faucet') } + if (selectedNetworkType === 'Mainnet') { + navigate('/bridge') + } + return (
From 41124ef1e7583139dc3a3411e35e8af4d5cac5e4 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 10:50:27 +0000 Subject: [PATCH 149/266] change symbol --- .../src/components/bridge/history/HistoryDesktop.tsx | 2 -- webapps/world-builder-dashboard/src/utils/tokens.ts | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 89a664c5..3f3cb332 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -56,9 +56,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() - console.log(selectedNetworkType) const messages = useMessages(connectedAccount, selectedNetworkType) - console.log(messages.data) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) diff --git a/webapps/world-builder-dashboard/src/utils/tokens.ts b/webapps/world-builder-dashboard/src/utils/tokens.ts index 2843d674..ef16661d 100644 --- a/webapps/world-builder-dashboard/src/utils/tokens.ts +++ b/webapps/world-builder-dashboard/src/utils/tokens.ts @@ -138,7 +138,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st return [ { name: 'Game7DAO', - symbol: 'G7T', + symbol: 'G7', address: L1_MAIN_NETWORK.g7TokenAddress, Icon: IconG7T, tokenAddressMap: G7T_MAINNET, @@ -173,7 +173,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st return [ { name: 'Game7DAO', - symbol: 'G7T', + symbol: 'G7', address: L2_MAIN_NETWORK.g7TokenAddress, Icon: IconG7T, tokenAddressMap: G7T_MAINNET, @@ -208,7 +208,7 @@ export const getTokensForNetwork = (chainId: number | undefined, userAddress: st return [ { name: 'Game7DAO', - symbol: 'G7T', + symbol: 'G7', address: L3_MAIN_NETWORK.g7TokenAddress, Icon: IconG7T, tokenAddressMap: G7T_MAINNET, From edf25f8eb5220298618d45da0ab7cc51585d1be5 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 14:25:27 +0000 Subject: [PATCH 150/266] change L1 name --- webapps/world-builder-dashboard/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 12699f48..ac426137 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -88,7 +88,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { export const L3_MAIN_NETWORK: NetworkInterface = { chainId: 2187, name: 'game7', - displayName: 'Game7 Mainnet', + displayName: 'Game7 Network', rpcs: ['https://mainnet-rpc.game7.io'], blockExplorerUrls: ['https://mainnet.game7.io'], nativeCurrency: { From b6dc20dce9804f9e1acf194b57d5b4aa38a30db8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 15:30:20 +0000 Subject: [PATCH 151/266] current caching --- .../src/components/bridge/bridge/ActionButton.tsx | 2 ++ .../src/components/bridge/history/HistoryDesktop.tsx | 7 ++++--- .../src/hooks/useL2ToL1MessageStatus.ts | 2 +- .../src/pages/BridgePage/BridgePage.tsx | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 9fd99794..d6f23af5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -147,9 +147,11 @@ const ActionButton: React.FC = ({ } transactions.push(record) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(transactions)) + queryClient.invalidateQueries(['incomingMessages', connectedAccount]) } catch (e) { console.log(e) } + queryClient.refetchQueries(['pendingTransactions']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) queryClient.refetchQueries(['pendingNotifications']) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 6e987fcb..db5399d6 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -56,7 +56,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount } = useBlockchainContext() - const messages = useMessages(connectedAccount) + const { data: messages } = useMessages(connectedAccount) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) @@ -64,9 +64,10 @@ const HistoryDesktop: React.FC = () => { // Merge transations only when API data is updated with new data useEffect(() => { - const localTransactions = messages.data || [] + const localTransactions = messages || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) + // Retrieve existing transactions from localStorage const storedTransactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) const storedTransactions = storedTransactionsString ? JSON.parse(storedTransactionsString) : [] @@ -96,7 +97,7 @@ const HistoryDesktop: React.FC = () => { ) } setMergedTransactions(combinedTransactions) - }, [messages.data, apiTransactions]) + }, [messages, apiTransactions]) return (
diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index ab8f27a6..65ba6715 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -333,7 +333,7 @@ export const usePendingTransactions = (connectedAccount: string | undefined): Us ) const completedTransactions = transactions.filter((t: { completionTimestamp: number }) => t.completionTimestamp) const newCompletedTransactions: TransactionRecord[] = [] - for (const t of pendingTransactions) { + for (const t of transactions) { if (t.type === 'DEPOSIT') { const status = await fetchDepositStatus(t as TransactionRecord) if (status?.highNetworkTimestamp) { diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index 880a9e46..c4734808 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -15,7 +15,7 @@ import { FloatingNotification } from '@/components/notifications/NotificationsDr import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' // Hooks -import { useNotifications } from '@/hooks/useL2ToL1MessageStatus' +import { useNotifications, usePendingTransactions } from '@/hooks/useL2ToL1MessageStatus' import { useMediaQuery } from '@mantine/hooks' export type DepositDirection = 'DEPOSIT' | 'WITHDRAW' @@ -32,6 +32,7 @@ const BridgePage = () => { const { newNotifications, refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') const queryClient = useQueryClient() + usePendingTransactions(connectedAccount) useEffect(() => { if (connectedAccount) { From 27aea422fe9ba5f0f81e89f6e761bab89fa5a0f2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 17:11:42 +0000 Subject: [PATCH 152/266] show and hide badge --- .../bridge/history/HistoryMobile.tsx | 4 +- .../networkToggle/NetworkToggle.tsx | 1 - .../MainLayout/MobileSidebar.module.css | 106 +++++++++++------- .../src/layouts/MainLayout/MobileSidebar.tsx | 20 +++- 4 files changed, 85 insertions(+), 46 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx index 1fb86bee..85d46dd1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx @@ -40,8 +40,8 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { } } const HistoryMobile: React.FC = ({}) => { - const { connectedAccount } = useBlockchainContext() - const messages = useMessages(connectedAccount) + const { connectedAccount, selectedNetworkType } = useBlockchainContext() + const messages = useMessages(connectedAccount, selectedNetworkType) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index b1a017b3..28859007 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -20,7 +20,6 @@ const NetworkToggle: React.FC = () => { return (
- {/* */}
= ({ navigationItems }) => { const location = useLocation() const navigate = useNavigate() - const { connectedAccount, isMetaMask, disconnectWallet, connectWallet, isConnecting, selectedNetworkType } = useBlockchainContext() + const { connectedAccount, isMetaMask, disconnectWallet, connectWallet, isConnecting, selectedNetworkType } = + useBlockchainContext() const [isExpanded, setIsExpanded] = useState(false) return ( <>
-
- setIsExpanded(!isExpanded)} /> +
setIsExpanded(!isExpanded)}> + {!isExpanded && ( +
+ {selectedNetworkType} +
+ )} +
+ +
{isExpanded && ( From 908077c662f6dcb6aeca8b261b8b7e1c9cbc8d37 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 18:28:42 +0000 Subject: [PATCH 153/266] network toggle new styles added to navbar waiting for b/e integrations to continue --- .../networkToggle/NetworkToggle.module.css | 7 +++--- .../networkToggle/NetworkToggle.tsx | 1 - .../layouts/MainLayout/MainLayout.module.css | 1 - .../MainLayout/MobileSidebar.module.css | 24 ++++++++++++------- .../src/layouts/MainLayout/MobileSidebar.tsx | 2 +- 5 files changed, 21 insertions(+), 14 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css index 753dcac0..e1b26c20 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css @@ -6,7 +6,8 @@ flex-direction: column; align-items: flex-start; gap: 8px; - background-color: var(--Base-White, #fff); + /* background-color: rgba(11, 11, 11, 0.8); + backdrop-filter: blur(4px); */ } .toggle { @@ -17,8 +18,8 @@ gap: 8px; align-self: stretch; border-radius: 8px; - border: 1px solid var(--Gray-true-700, #393939); - background: var(--Gray-true-800, #171717); + /* border: 1px solid var(--Gray-true-700, #393939); + background: var(--Gray-true-800, #171717); */ } .testnet { diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 28859007..4cfee7ee 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -35,7 +35,6 @@ const NetworkToggle: React.FC = () => {
handleNetworkSelect(network)}>
- {/* */}
= ({ navigationItems }) => { ))}
{isMetaMask && connectedAccount ? ( -
+
{`${connectedAccount.slice(0, 6)}...${connectedAccount.slice(-4)}`}
From 074b1202653d0f2ee94e8c13dd12b557d92c75fa Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 14 Nov 2024 22:02:12 +0000 Subject: [PATCH 154/266] fix build and add blockchain explorer link --- .../bridge/history/HistoryDesktop.tsx | 32 +++++++++---------- .../walletButton/WalletButton.tsx | 6 ++-- .../src/layouts/MainLayout/MainLayout.tsx | 8 ++--- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 3f3cb332..349fa29e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -82,20 +82,20 @@ const HistoryDesktop: React.FC = () => { : tx.highNetworkHash === storedTransactions[index]?.highNetworkHash ) ) { - // // Determine new transactions that aren’t in storedTransactions - // const newTransactions = combinedTransactions.filter( - // (newTx) => - // !storedTransactions.some((storedTx: TransactionRecord) => - // storedTx.type === 'DEPOSIT' - // ? storedTx.lowNetworkHash === newTx.lowNetworkHash - // : storedTx.highNetworkHash === newTx.highNetworkHash - // ) - // ) + // Determine new transactions that aren’t in storedTransactions + const newTransactions = combinedTransactions.filter( + (newTx) => + !storedTransactions.some((storedTx: TransactionRecord) => + storedTx.type === 'DEPOSIT' + ? storedTx.lowNetworkHash === newTx.lowNetworkHash + : storedTx.highNetworkHash === newTx.highNetworkHash + ) + ) - // localStorage.setItem( - // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - // JSON.stringify([...storedTransactions, ...newTransactions]) - // ) + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify([...storedTransactions, ...newTransactions]) + ) } setMergedTransactions(combinedTransactions) }, [messages.data, apiTransactions]) @@ -103,7 +103,7 @@ const HistoryDesktop: React.FC = () => { return (
- {messages.data && ( + {mergedTransactions && (
{headers.map((h) => ( @@ -111,7 +111,7 @@ const HistoryDesktop: React.FC = () => { {h}
))} - {messages.data + {mergedTransactions .sort((x: TransactionRecord, y: TransactionRecord) => { const xTimestamp = x.type === 'DEPOSIT' ? x.lowNetworkTimestamp : x.highNetworkTimestamp const yTimestamp = y.type === 'DEPOSIT' ? y.lowNetworkTimestamp : y.highNetworkTimestamp @@ -125,7 +125,7 @@ const HistoryDesktop: React.FC = () => { {tx.lowNetworkHash && } ) )} - {messages.data.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') + {mergedTransactions.filter((tx: TransactionRecord) => tx.type === 'DEPOSIT' || tx.type === 'WITHDRAWAL') .length === 0 &&
No transactions yet
}
diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx index 8d292151..f537e3fe 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import { ALL_NETWORKS, L3_NETWORK } from '../../../../constants' +import { ALL_TESTNET_NETWORKS, L3_NETWORK } from '../../../../constants' import TokenRow from '../tokenRow/TokenRow' import styles from './WalletButton.module.css' import { Modal } from 'summon-ui/mantine' @@ -21,7 +21,7 @@ const WalletButton: React.FC = () => { const { data: nativeBalance } = useNativeBalance({ account: connectedAccount, - rpc: ALL_NETWORKS.find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] + rpc: ALL_TESTNET_NETWORKS.find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] }) const getTokens = async () => { @@ -45,7 +45,7 @@ const WalletButton: React.FC = () => {
{nativeBalance - ? `${Number(nativeBalance).toFixed(4)} ${ALL_NETWORKS.find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` + ? `${Number(nativeBalance).toFixed(4)} ${ALL_TESTNET_NETWORKS.find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` : 'Fetching...'}
diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index f57e6fe6..0729bc58 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -7,17 +7,17 @@ import IconDocumentation from '@/assets/IconDocumentation' import IconDroplets02 from '@/assets/IconDroplets02' import IconExplorer from '@/assets/IconExplorer' import IconWallet04 from '@/assets/IconWallet04' +import { useBlockchainContext } from '@/contexts/BlockchainContext' // Local components and assets import DesktopSidebar from '@/layouts/MainLayout/DesktopSidebar' import MobileSidebar from '@/layouts/MainLayout/MobileSidebar' import { useMediaQuery } from '@mantine/hooks' -import { useBlockchainContext } from '@/contexts/BlockchainContext' interface MainLayoutProps {} const MainLayout: React.FC = ({}) => { const location = useLocation() - const {selectedNetworkType} = useBlockchainContext() + const { selectedNetworkType } = useBlockchainContext() const TESTNET_NAVIGATION_ITEMS = [ { @@ -32,7 +32,7 @@ const MainLayout: React.FC = ({}) => { }, { name: 'explorer', - navigateTo: 'https://testnet.game7.io/', + navigateTo: selectedNetworkType === 'Testnet' ? `https://testnet.game7.io/` : `https://mainnet.game7.io`, icon: }, { @@ -43,7 +43,7 @@ const MainLayout: React.FC = ({}) => { ] const MAINNET_NAVIGATION_ITEMS = TESTNET_NAVIGATION_ITEMS.slice(1, TESTNET_NAVIGATION_ITEMS.length) - const NAVIGATION_ITEMS = selectedNetworkType === "Mainnet" ? MAINNET_NAVIGATION_ITEMS : TESTNET_NAVIGATION_ITEMS + const NAVIGATION_ITEMS = selectedNetworkType === 'Mainnet' ? MAINNET_NAVIGATION_ITEMS : TESTNET_NAVIGATION_ITEMS const smallView = useMediaQuery('(max-width: 1199px)') return (
From 826175f7f45fe771f24e5a8548948cdaea4ea509 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 15 Nov 2024 10:25:55 +0000 Subject: [PATCH 155/266] clip navbar items to the right no matter the screen size --- .../src/components/landing/Landing.module.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css index e1dc3e2d..27ea69a3 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -26,11 +26,11 @@ body { .navbarContainer { display: flex; - max-width: 1920px; + width: 100%; padding: 4px 0px; flex-direction: column; align-items: center; - align-self: stretch; + align-self: stretch } .navbar { From 330014a9af1b7f1828a9d8fd7281f26ce0a941c9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 10:00:52 +0000 Subject: [PATCH 156/266] caching update --- .../bridge/history/DepositMobile.module.css | 1 + .../tokenSelector/TokenSelector.tsx | 1 + .../src/hooks/useBridgeTransfer.ts | 39 ++++++++++--------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css index 796ec080..4cd93f94 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.module.css @@ -92,6 +92,7 @@ } .button { + cursor: pointer; display: flex; padding: 12px 16px; justify-content: center; diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index 7cdb6677..c13839f2 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -55,6 +55,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken }: TokenSelectorProps) // can create token address map here const chainIds = Object.keys(n.tokenAddressMap ?? []) const isChainIdValid = chainIds.includes(highNetworkChainId) && chainIds.includes(lowNetworkChainId) + if (!isChainIdValid) return return ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 1eded066..bdea567c 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -15,7 +15,6 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const { connectedAccount } = useBlockchainContext() - // Pre-compute properties for cleaner instantiation const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId @@ -28,9 +27,17 @@ export const useBridgeTransfer = () => { return transactionsString ? JSON.parse(transactionsString) : [] } + // If the status is pending and time since last fetched is 2 minutes, fetch again + const shouldFetchStatus = (cachedTransaction: any) => { + const isPending = ![2, 6, 9].includes(cachedTransaction?.status) + const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) + + return isPending && timeSinceLastUpdate > 2 * 60 * 1000 + } + let status: any return useQuery( - ['transferData', txRecord], + ['transferData', txHash], async () => { const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', @@ -39,23 +46,25 @@ export const useBridgeTransfer = () => { destinationSignerOrProviderOrRpc: destinationRpc, originSignerOrProviderOrRpc: originRpc }) + try { status = await _bridgeTransfer.getStatus() const transactions = getCachedTransactions() - const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { + const newTransactions = transactions.map((t: any) => { const isSameHash = isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - return isSameHash ? { ...t, status: status?.status } : t + + return isSameHash ? { ...t, status: status?.status, lastUpdated: Date.now() } : t }) localStorage.setItem(`bridge-${connectedAccount}-transactions`, JSON.stringify(newTransactions)) return status - } catch (error: any) { + } catch (error) { const transactions = getCachedTransactions() - const cachedTransaction = transactions.find((t: TransactionRecord) => + const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) @@ -68,7 +77,7 @@ export const useBridgeTransfer = () => { { placeholderData: () => { const transactions = getCachedTransactions() - const cachedTransaction = transactions.find((t: TransactionRecord) => + const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) @@ -77,21 +86,15 @@ export const useBridgeTransfer = () => { return { status } } }, - // if status is completed, no need to refetch again. if pending, refetch every 1-2 minutes - refetchInterval: [2, 6, 9].includes(status?.status) ? false : 60 * 5 * 1000, + refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + ? 5 * 60 * 1000 + : false, refetchOnWindowFocus: false, - enabled: !!txRecord && ![2, 6, 9].includes(status?.status), - retry: (error) => { - console.log(error) - return (error as { status?: number }).status === 429 - }, - retryDelay: (failureCount) => { - console.log(failureCount) - return Math.min(10 ** failureCount * 1000, 60000) - } + enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) } ) } + // Mutate function const navigate = useNavigate() const { refetchNewNotifications } = useBridgeNotificationsContext() From 1d69f8dfdfa9a1d1b420188f3c979c4a205b2819 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 10:48:52 +0000 Subject: [PATCH 157/266] fix decimal places in action button --- .../components/bridge/bridge/ActionButton.tsx | 21 +++++++------------ .../components/bridge/bridge/BridgeView.tsx | 9 ++++++-- .../bridge/history/HistoryDesktop.tsx | 2 +- .../walletButton/WalletButton.tsx | 6 +++--- .../src/components/faucet/FaucetView.tsx | 4 ++-- .../src/contexts/BlockchainContext.tsx | 1 + .../src/hooks/useBridgeTransfer.ts | 14 +++++-------- 7 files changed, 27 insertions(+), 30 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index b16cc738..59395434 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -3,7 +3,7 @@ import React from 'react' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' // Constants -import { ALL_TESTNET_NETWORKS, USDC } from '../../../../constants' +import { getNetworks, USDC } from '../../../../constants' // Styles import styles from './ActionButton.module.css' import { ethers } from 'ethers' @@ -21,6 +21,7 @@ interface ActionButtonProps { setErrorMessage: (arg0: string) => void bridger?: Bridger symbol?: string + decimals?: number } const ActionButton: React.FC = ({ direction, @@ -29,7 +30,8 @@ const ActionButton: React.FC = ({ setErrorMessage, L2L3message, bridger, - symbol + symbol, + decimals }) => { const { connectedAccount, @@ -44,6 +46,7 @@ const ActionButton: React.FC = ({ const { refetchNewNotifications } = useBridgeNotificationsContext() const navigate = useNavigate() + const networks = getNetworks() const getLabel = (): String | undefined => { if (isConnecting) { @@ -78,28 +81,20 @@ const ActionButton: React.FC = ({ const queryClient = useQueryClient() const transfer = useMutation( async (amount: string) => { - const network = ALL_TESTNET_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId)! + const network = networks.find((n) => n.chainId === bridger?.originNetwork.chainId)! const provider = await getProvider(network) const signer = provider.getSigner() const destinationRPC = direction === 'DEPOSIT' ? selectedHighNetwork.rpcs[0] : selectedLowNetwork.rpcs[0] const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider // Amount to send variable parsed to correct decimal places depending on the token - let amountToSend - const bridgeToken = bridger?.token - - // if usdc, parse to 6 decimal places - if (bridgeToken === USDC) amountToSend = ethers.utils.parseUnits(amount, 6) - else amountToSend = ethers.utils.parseUnits(amount) + const amountToSend = ethers.utils.parseUnits(amount, decimals) // If deposit if (bridger?.isDeposit) { if (selectedBridgeToken.address != ZERO_ADDRESS) { const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' - let allowanceToCheck - - if (bridgeToken === USDC) allowanceToCheck = ethers.utils.formatUnits(allowance, 6) - else allowanceToCheck = ethers.utils.formatEther(allowance) + const allowanceToCheck = ethers.utils.formatUnits(allowance, decimals) // approve first if (Number(allowanceToCheck) < Number(amount)) { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index efdfc551..b2926f05 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -2,8 +2,8 @@ import { useEffect, useState } from 'react' import { useQuery } from 'react-query' import { - ALL_TESTNET_NETWORKS, DEFAULT_STAKE_NATIVE_POOL_ID, + getNetworks, L1_MAIN_NETWORK, L1_NETWORK, L2_MAIN_NETWORK, @@ -65,16 +65,20 @@ const BridgeView = ({ token: selectedBridgeToken }) + console.log(tokenInformation) + const { data: coinUSDRate, isFetching: isCoinFetching } = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? '') const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) } + const networks = getNetworks() + const estimatedFee = useQuery( ['estimatedFee', bridger, connectedAccount, value], async () => { try { - const originNetwork = ALL_TESTNET_NETWORKS.find((n) => n.chainId === bridger?.originNetwork.chainId) + const originNetwork = networks.find((n) => n.chainId === bridger?.originNetwork.chainId) if (!originNetwork) throw new Error("Can't find network!") const allowance = await bridger?.getAllowance(originNetwork.rpcs[0], connectedAccount ?? '') @@ -277,6 +281,7 @@ const BridgeView = ({ L2L3message={isMessageExpanded ? message : { data: '', destination: '' }} bridger={bridger} symbol={tokenInformation?.symbol ?? ''} + decimals={tokenInformation?.decimalPlaces ?? 18} />
) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index c747df20..eec510ec 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -21,7 +21,7 @@ const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionR combinedData.set(hashKey, localTx) }) - apiData.forEach((tx) => { + apiData?.forEach((tx) => { const hashKey = tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? '') if (combinedData.has(hashKey)) { const localTx = combinedData.get(hashKey) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx index f537e3fe..3f345e8d 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react' -import { ALL_TESTNET_NETWORKS, L3_NETWORK } from '../../../../constants' +import { getNetworks, L3_NETWORK } from '../../../../constants' import TokenRow from '../tokenRow/TokenRow' import styles from './WalletButton.module.css' import { Modal } from 'summon-ui/mantine' @@ -21,7 +21,7 @@ const WalletButton: React.FC = () => { const { data: nativeBalance } = useNativeBalance({ account: connectedAccount, - rpc: ALL_TESTNET_NETWORKS.find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] + rpc: getNetworks().find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] }) const getTokens = async () => { @@ -45,7 +45,7 @@ const WalletButton: React.FC = () => {
{nativeBalance - ? `${Number(nativeBalance).toFixed(4)} ${ALL_TESTNET_NETWORKS.find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` + ? `${Number(nativeBalance).toFixed(4)} ${getNetworks().find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` : 'Fetching...'}
diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index a37ae939..57ab01e0 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react' import { useMutation, useQuery, useQueryClient } from 'react-query' -import { ALL_TESTNET_NETWORKS, FAUCET_CHAIN, L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../constants' +import { FAUCET_CHAIN, getNetworks, L3_NATIVE_TOKEN_SYMBOL, L3_NETWORK } from '../../../constants' import { AccountType } from '../commonComponents/accountSelector/AccountSelector' import AccountSelector from '../commonComponents/accountSelector/AccountSelector' import styles from './FaucetView.module.css' @@ -32,7 +32,7 @@ const FaucetView: React.FC = ({}) => { const values: AccountType[] = [`External Address`, `Connected Account`] useEffect(() => { - const targetNetwork = ALL_TESTNET_NETWORKS.find((n) => n.chainId === faucetTargetChainId) + const targetNetwork = getNetworks().find((n) => n.chainId === faucetTargetChainId) if (targetNetwork) { setSelectedNetwork(targetNetwork) } diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 683b6623..682740eb 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -219,6 +219,7 @@ export const BlockchainProvider: React.FC = ({ children try { const provider = new ethers.providers.Web3Provider(ethereum, 'any') const currentChain = await provider.getNetwork() + console.log(currentChain) if (currentChain.chainId !== chain.chainId) { const hexChainId = ethers.utils.hexStripZeros(ethers.utils.hexlify(chain.chainId)) try { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 41ef26ab..2ef4accb 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' -import { ALL_TESTNET_NETWORKS, L1_NETWORK, L2_NETWORK } from '../../constants' +import { getNetworks, L1_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -13,18 +13,14 @@ interface UseTransferDataProps { } export const useBridgeTransfer = () => { - const navigate = useNavigate() - const { refetchNewNotifications } = useBridgeNotificationsContext() - const queryClient = useQueryClient() - const returnTransferData = ({ txRecord }: UseTransferDataProps) => { // Pre-compute properties for cleaner instantiation const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId - const destinationRpc = ALL_TESTNET_NETWORKS.find((n) => n.chainId === destinationChainId)?.rpcs[0] - const originRpc = ALL_TESTNET_NETWORKS.find((n) => n.chainId === originChainId)?.rpcs[0] + const destinationRpc = getNetworks().find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = getNetworks().find((n) => n.chainId === originChainId)?.rpcs[0] const getCachedTransactions = () => { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) @@ -129,9 +125,9 @@ export const useBridgeTransfer = () => { txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: ALL_TESTNET_NETWORKS.find((n) => n.chainId === withdrawal.lowNetworkChainId) + destinationSignerOrProviderOrRpc: getNetworks().find((n) => n.chainId === withdrawal.lowNetworkChainId) ?.rpcs[0], - originSignerOrProviderOrRpc: ALL_TESTNET_NETWORKS.find((n) => n.chainId === withdrawal.highNetworkChainId) + originSignerOrProviderOrRpc: getNetworks().find((n) => n.chainId === withdrawal.highNetworkChainId) ?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) From 1bd53d402c6641bde36dbef030e1d13382489f8e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 11:13:38 +0000 Subject: [PATCH 158/266] withdraw successful --- webapps/world-builder-dashboard/constants.ts | 25 +++++++++++++++++++ .../components/bridge/bridge/BridgeView.tsx | 2 -- .../src/components/bridge/history/Deposit.tsx | 6 ++--- .../bridge/history/DepositMobile.tsx | 6 ++--- .../bridge/history/HistoryDesktop.tsx | 4 +-- .../components/bridge/history/Withdrawal.tsx | 6 ++--- .../src/hooks/useL2ToL1MessageStatus.ts | 10 ++++---- .../src/utils/web3utils.ts | 6 ++--- 8 files changed, 44 insertions(+), 21 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index ac426137..e2604851 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -104,6 +104,11 @@ export const L3_MAIN_NETWORK: NetworkInterface = { export const ALL_TESTNET_NETWORKS = [L1_NETWORK, L2_NETWORK, L3_NETWORK] export const ALL_MAINNET_NETWORKS = [L1_MAIN_NETWORK, L2_MAIN_NETWORK, L3_MAIN_NETWORK] +export const ALL_HIGH_TESTNET_NETWORKS = [L2_NETWORK, L3_NETWORK] +export const ALL_LOW_TESTNET_NETWORKS = [L1_NETWORK, L2_NETWORK] +export const ALL_HIGH_MAINNET_NETWORKS = [L2_MAIN_NETWORK, L3_MAIN_NETWORK] +export const ALL_LOW_MAINNET_NETWORKS = [L1_MAIN_NETWORK, L2_MAIN_NETWORK] + export const L3_NATIVE_TOKEN_SYMBOL = 'TG7T' export const DEFAULT_LOW_NETWORK = L1_NETWORK @@ -171,5 +176,25 @@ export const getNetworks = () => { } } +export const getHighNetworks = () => { + const { selectedNetworkType } = useBlockchainContext() + switch (selectedNetworkType) { + case 'Mainnet': + return ALL_HIGH_MAINNET_NETWORKS + case 'Testnet': + return ALL_HIGH_TESTNET_NETWORKS + } +} + +export const getLowNetworks = () => { + const { selectedNetworkType } = useBlockchainContext() + switch (selectedNetworkType) { + case 'Mainnet': + return ALL_LOW_MAINNET_NETWORKS + case 'Testnet': + return ALL_LOW_TESTNET_NETWORKS + } +} + // ETH, ARBITRUM, USDC, MANTLE, USDT, export const ALL_TOKEN_MAPPINGS = [TG7T, ETH, USDC] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index b2926f05..b594494e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -65,8 +65,6 @@ const BridgeView = ({ token: selectedBridgeToken }) - console.log(tokenInformation) - const { data: coinUSDRate, isFetching: isCoinFetching } = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? '') const handleTokenChange = async (token: Token) => { setSelectedBridgeToken(token) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 869440f4..7cec3295 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,5 +1,5 @@ import React from 'react' -import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' +import { getHighNetworks, getLowNetworks } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' @@ -18,8 +18,8 @@ interface DepositProps { } const Deposit: React.FC = ({ deposit }) => { const depositInfo = { - from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', - to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' + from: getLowNetworks().find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', + to: getHighNetworks().find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const smallView = useMediaQuery('(max-width: 1199px)') const { returnTransferData } = useBridgeTransfer() diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index e0101aaf..7bb7d1e2 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' +import { getHighNetworks, getLowNetworks} from '../../../../constants' import styles from './DepositMobile.module.css' import parentStyles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' @@ -19,8 +19,8 @@ const DepositMobile: React.FC = ({ deposit, transferStatus, const [isCollapsed, setIsCollapsed] = useState(true) const status = useDepositStatus(deposit) const depositInfo = { - from: LOW_NETWORKS.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', - to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' + from: getLowNetworks().find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', + to: getHighNetworks().find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const smallView = useMediaQuery('(max-width: 1199px)') diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index eec510ec..febbb1b1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -56,7 +56,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() - const messages = useMessages(connectedAccount, selectedNetworkType) + const {data: messages} = useMessages(connectedAccount, selectedNetworkType) const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) @@ -98,7 +98,7 @@ const HistoryDesktop: React.FC = () => { JSON.stringify([...storedTransactions, ...newTransactions]) ) } - setMergedTransactions(combinedTransactions) + setMergedTransactions(selectedNetworkType === "Testnet" ? combinedTransactions : localTransactions) }, [messages, apiTransactions]) return ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 62528a4a..21f09548 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,5 +1,5 @@ import React, { useCallback, useState } from 'react' -import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' +import { getHighNetworks, getLowNetworks } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import { BridgeTransferStatus } from 'game7-bridge-sdk' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' @@ -33,8 +33,8 @@ export const getStatus = (withdrawal: TransactionRecord) => { : claimableTimestamp ? ChildToParentMessageStatus.CONFIRMED : ChildToParentMessageStatus.UNCONFIRMED - const lowNetwork = LOW_NETWORKS.find((n) => n.chainId === lowNetworkChainId) - const highNetwork = HIGH_NETWORKS.find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks().find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks().find((n) => n.chainId === highNetworkChainId) if (lowNetwork && highNetwork) { const data = { status, diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 951b0aa4..c6c7f2ff 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -1,5 +1,5 @@ import { useQueries, useQuery, UseQueryResult } from 'react-query' -import { HIGH_NETWORKS, L2_NETWORK, LOW_NETWORKS } from '../../constants' +import { getHighNetworks, getLowNetworks, L2_NETWORK } from '../../constants' import { ethers, providers } from 'ethers' import { Transaction } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' @@ -45,8 +45,8 @@ export interface L2ToL1MessageStatusResult { const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { const { lowNetworkChainId, highNetworkChainId, highNetworkHash, amount, highNetworkTimestamp } = withdrawal - const lowNetwork = LOW_NETWORKS.find((n) => n.chainId === lowNetworkChainId) - const highNetwork = HIGH_NETWORKS.find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks().find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks().find((n) => n.chainId === highNetworkChainId) if (!highNetwork || !lowNetwork || !highNetworkHash) { return undefined } @@ -117,8 +117,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { } } - const lowNetwork = LOW_NETWORKS.find((n) => n.chainId === lowNetworkChainId) - const highNetwork = HIGH_NETWORKS.find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks().find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks().find((n) => n.chainId === highNetworkChainId) if (!lowNetwork || !lowNetworkHash) { return undefined diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index 366122a8..c76991f6 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -1,4 +1,4 @@ -import { HIGH_NETWORKS, LOW_NETWORKS } from '../../constants' +import { getHighNetworks, getLowNetworks, HIGH_NETWORKS, LOW_NETWORKS } from '../../constants' import { ethers } from 'ethers' export const convertToBigNumber = (numberString: string, precision = 18) => { @@ -9,7 +9,7 @@ export const convertToBigNumber = (numberString: string, precision = 18) => { } export const getBlockExplorerUrl = (chainId: number | undefined) => { - const network = [...LOW_NETWORKS, ...HIGH_NETWORKS].find((n) => n.chainId === chainId) + const network = [...getLowNetworks(), ...getHighNetworks()].find((n) => n.chainId === chainId) if (network?.blockExplorerUrls) { return network.blockExplorerUrls[0] } @@ -17,7 +17,7 @@ export const getBlockExplorerUrl = (chainId: number | undefined) => { } export const getNetwork = (chainId: number) => { - return [...LOW_NETWORKS, ...HIGH_NETWORKS].find((n) => n.chainId === chainId) + return [...getLowNetworks(), ...getHighNetworks()].find((n) => n.chainId === chainId) } export const tokenTypes = [ From ebe7cd417e8d0afa5759cb1715df0473e67762ef Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 11:18:24 +0000 Subject: [PATCH 159/266] hide token from list if `to` chain doesn't contain it --- .../components/commonComponents/tokenSelector/TokenSelector.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx index c13839f2..840e15db 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/tokenSelector/TokenSelector.tsx @@ -57,7 +57,7 @@ const TokenSelector = ({ tokens, onChange, selectedToken }: TokenSelectorProps) const isChainIdValid = chainIds.includes(highNetworkChainId) && chainIds.includes(lowNetworkChainId) if (!isChainIdValid) return return ( - +
Date: Mon, 18 Nov 2024 11:35:31 +0000 Subject: [PATCH 160/266] added rate --- .../src/components/bridge/bridge/BridgeView.tsx | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 2db9f4af..3b640b05 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -244,9 +244,21 @@ const BridgeView = ({ fee={Number(estimatedFee.data ?? 0)} isEstimatingFee={estimatedFee.isFetching} value={Number(value)} - ethRate={coinUSDRate ?? 0} + ethRate={ + selectedBridgeToken.symbol === 'TG7T' + ? 1 + : isCoinFetching + ? 0.0 + : coinUSDRate[selectedBridgeToken?.geckoId ?? ''].usd + } tokenSymbol={tokenInformation?.symbol ?? ''} - tokenRate={g7tUsdRate.data ?? 0} + tokenRate={ + selectedBridgeToken.symbol === 'TG7T' + ? 1 + : isCoinFetching + ? 0.0 + : coinUSDRate[selectedBridgeToken?.geckoId ?? ''].usd + } gasTokenSymbol={ direction === 'DEPOSIT' ? (selectedLowNetwork?.nativeCurrency?.symbol ?? '') From 52ec25b691e06286de9a586a417ad2fe467b836f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 11:50:21 +0000 Subject: [PATCH 161/266] keep token selection --- .../src/components/bridge/bridge/BridgeView.tsx | 1 - .../src/components/bridge/bridge/ValueToBridge.tsx | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 3b640b05..a7ad92a1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -39,7 +39,6 @@ const BridgeView = ({ const [networkErrorMessage, setNetworkErrorMessage] = useState('') const { isMessagingEnabled } = useUISettings() const { useUSDPriceOfToken } = useCoinGeckoAPI() - const g7tUsdRate = useQuery(['rate'], () => 2501.32) const { connectedAccount, selectedLowNetwork, diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 02e6256a..24d595a9 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -39,11 +39,12 @@ const ValueToBridge: React.FC = ({ selectedChainId }) => { const [tokens, setTokens] = useState([]) - const { connectedAccount, selectedBridgeToken, setSelectedBridgeToken } = useBlockchainContext() + const { connectedAccount, selectedBridgeToken } = useBlockchainContext() const getTokens = async () => { + console.log(selectedBridgeToken) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) - handleTokenChange(_tokens[0]) + handleTokenChange(_tokens.find((token) => token.name === selectedBridgeToken.name) || _tokens[0]) setTokens(_tokens) } @@ -71,7 +72,6 @@ const ValueToBridge: React.FC = ({ }, [connectedAccount]) const handleTokenChange = (token: Token) => { - setSelectedBridgeToken(token) onTokenChange(token) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) setTokens(_tokens) From 018d3ad63bb4b1472ef571dcbdcfdc8f2ce17777 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 14:00:52 +0000 Subject: [PATCH 162/266] fix hook update --- .../src/components/faucet/FaucetView.tsx | 3 ++- webapps/world-builder-dashboard/src/utils/web3utils.ts | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 57ab01e0..54fcf16b 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -30,9 +30,10 @@ const FaucetView: React.FC = ({}) => { const smallView = useMediaQuery('(max-width: 1199px)') const values: AccountType[] = [`External Address`, `Connected Account`] + const networks = getNetworks() useEffect(() => { - const targetNetwork = getNetworks().find((n) => n.chainId === faucetTargetChainId) + const targetNetwork = networks.find((n) => n.chainId === faucetTargetChainId) if (targetNetwork) { setSelectedNetwork(targetNetwork) } diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index c76991f6..6b030bf3 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -1,4 +1,4 @@ -import { getHighNetworks, getLowNetworks, HIGH_NETWORKS, LOW_NETWORKS } from '../../constants' +import { getHighNetworks, getLowNetworks } from '../../constants' import { ethers } from 'ethers' export const convertToBigNumber = (numberString: string, precision = 18) => { @@ -51,6 +51,6 @@ export const formatBigNumber = (bigNumber: ethers.BigNumber, lengthLimit = 25, u } export const parseUntilDelimiter = (input: any) => { - const match = input.match(/^[^\(\[]+/); - return match ? match[0] : input; + const match = input.match(/^[^\(\[]+/) + return match ? match[0] : input } From b681ac983af587dc397e7fa2b324e54ab1ea6dba Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 15:24:15 +0000 Subject: [PATCH 163/266] fix arbiscan url --- webapps/world-builder-dashboard/constants.ts | 2 +- .../src/components/bridge/history/Withdrawal.tsx | 3 ++- webapps/world-builder-dashboard/src/utils/web3utils.ts | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index e2604851..d0dff026 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -74,7 +74,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { name: 'arbitrumOne', displayName: 'Arbitrum One', rpcs: ['https://arb-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], - blockExplorerUrls: ['https://arbiscan.io/'], + blockExplorerUrls: ['https://arbiscan.io'], nativeCurrency: { decimals: 18, name: 'ETH', diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 21f09548..c91bbac4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -55,13 +55,14 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) - const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal, returnTransferData]) + const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal]) const { data: transferStatus, isLoading } = transferData() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) + const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction return ( <> diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index 6b030bf3..a305e448 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -13,7 +13,6 @@ export const getBlockExplorerUrl = (chainId: number | undefined) => { if (network?.blockExplorerUrls) { return network.blockExplorerUrls[0] } - console.log(network) } export const getNetwork = (chainId: number) => { From b17a04025f89ef903c602ae12845d010cc1b16cc Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 15:49:14 +0000 Subject: [PATCH 164/266] claim working from mobile --- .../src/components/bridge/history/WithdrawalMobile.tsx | 2 +- webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 3c4ab7dc..7491f50d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -108,7 +108,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim,
Status
{transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( - )} diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index bdea567c..89af99e6 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -121,6 +121,8 @@ export const useBridgeTransfer = () => { } const signer = provider.getSigner() + console.log(withdrawal) + // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', From 918d492f2c79b46653bf4de2611214fa463e08c2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 22:16:58 +0000 Subject: [PATCH 165/266] mergeTx function fix.. --- .../src/components/bridge/history/HistoryDesktop.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index db5399d6..5bcac6ea 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -13,7 +13,7 @@ import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' interface HistoryDesktopProps {} -const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionRecord[]): TransactionRecord[] => { +const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionRecord[]): TransactionRecord[] => { const combinedData = new Map() localData.forEach((localTx) => { @@ -32,7 +32,8 @@ const mergeTransactions = (localData: TransactionRecord[], apiData: TransactionR } }) - return Array.from(combinedData.values()) + const combinedDataArray = Array.from(combinedData.values()) + return combinedDataArray } // Maps API data to the TransactionRecord format From 6b37b9e606354e5cc4d531dc3efcf56600bb06f4 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 18 Nov 2024 22:42:40 +0000 Subject: [PATCH 166/266] increased stale time and went back to old status for withdrawal.. --- .../src/components/bridge/bridge/ValueToBridge.tsx | 1 - .../src/components/bridge/history/Withdrawal.tsx | 9 ++++----- .../src/hooks/useBridgeTransfer.ts | 1 + .../src/hooks/useL2ToL1MessageStatus.ts | 5 +++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 24d595a9..73ca70fc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -42,7 +42,6 @@ const ValueToBridge: React.FC = ({ const { connectedAccount, selectedBridgeToken } = useBlockchainContext() const getTokens = async () => { - console.log(selectedBridgeToken) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) handleTokenChange(_tokens.find((token) => token.name === selectedBridgeToken.name) || _tokens[0]) setTokens(_tokens) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 95c27b26..28c19b3e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,7 +1,6 @@ import React, { useCallback, useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' -import { BridgeTransferStatus } from 'game7-bridge-sdk' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' @@ -98,7 +97,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {transferStatus && transferStatus?.status === BridgeTransferStatus.WITHDRAW_EXECUTED && ( + {status?.data && status.data.status === ChildToParentMessageStatus.EXECUTED && ( <>
= ({ withdrawal }) => { )} )} - {transferStatus && transferStatus.status != BridgeTransferStatus.WITHDRAW_EXECUTED && ( + {status?.data && status.data.status !== ChildToParentMessageStatus.EXECUTED && ( <>
@@ -270,7 +269,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
- {transferStatus && transferStatus.status === BridgeTransferStatus.WITHDRAW_CONFIRMED && ( + {status?.data && status.data.status === ChildToParentMessageStatus.CONFIRMED && ( <> )} - {transferStatus && transferStatus.status === BridgeTransferStatus.WITHDRAW_UNCONFIRMED && ( + {status?.data && status.data.status === ChildToParentMessageStatus.UNCONFIRMED && ( <>
{ return { status } } }, + staleTime: 2 * 60 * 1000, refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) ? 5 * 60 * 1000 : false, diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 65ba6715..eb5637f2 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -148,7 +148,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { try { l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations) } catch (e) { - console.error('Error waiting for child transaction receipt:', e) + console.error('Error waiting for child transaction receipt:', {deposit, e}) } if (!l2Result) { @@ -167,7 +167,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { export const useDepositStatus = (deposit: TransactionRecord) => { return useQuery(['depositStatus', deposit], () => fetchDepositStatus(deposit), { - refetchInterval: 60000 * 3 + refetchInterval: 60000 * 3, + staleTime: 2 * 60 * 1000 // 2 minutes }) } From 1777b5640d8c96c98ab2396d0ecae41aaff4a60a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 10:46:23 +0000 Subject: [PATCH 167/266] back to using old method of status --- .../src/components/bridge/history/Deposit.tsx | 16 +++++----------- .../components/bridge/history/DepositMobile.tsx | 7 ++----- .../components/bridge/history/Withdrawal.tsx | 9 ++++----- .../bridge/history/WithdrawalMobile.tsx | 17 ++++++++--------- 4 files changed, 19 insertions(+), 30 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 49ee9922..ddd1a405 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -2,12 +2,10 @@ import React from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' -import { BridgeTransferStatus } from 'game7-bridge-sdk' import { useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useBlockchainContext } from '@/contexts/BlockchainContext' -import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -22,8 +20,6 @@ const Deposit: React.FC = ({ deposit }) => { to: HIGH_NETWORKS.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const smallView = useMediaQuery('(max-width: 1199px)') - const { returnTransferData } = useBridgeTransfer() - const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { connectedAccount } = useBlockchainContext() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] @@ -33,14 +29,14 @@ const Deposit: React.FC = ({ deposit }) => { const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) return ( <> - {isLoading && smallView ? ( + {isLoadingStatus && smallView ? (
Loading
) : ( <> {smallView ? ( - + ) : ( <>
@@ -53,7 +49,7 @@ const Deposit: React.FC = ({ deposit }) => {
{`${deposit.amount} ${localStorageTransaction?.symbol}`}
{depositInfo.from}
{depositInfo.to}
- {isLoading ? ( + {isLoadingStatus ? ( <>
Loading
@@ -70,8 +66,7 @@ const Deposit: React.FC = ({ deposit }) => { className={styles.explorerLink} >
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( + {status?.l2Result?.complete ? (
Completed @@ -90,8 +85,7 @@ const Deposit: React.FC = ({ deposit }) => {
) : (
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( + {status?.highNetworkTimestamp ? ( <> {status?.highNetworkTimestamp === undefined ? 'No status found' diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index e0101aaf..437ae93c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -2,7 +2,6 @@ import React, { useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './DepositMobile.module.css' import parentStyles from './WithdrawTransactions.module.css' -import { BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' @@ -12,10 +11,9 @@ import { getBlockExplorerUrl } from '@/utils/web3utils' interface DepositMobileProps { deposit: TransactionRecord - transferStatus: any isLoading: boolean } -const DepositMobile: React.FC = ({ deposit, transferStatus, isLoading }) => { +const DepositMobile: React.FC = ({ deposit, isLoading }) => { const [isCollapsed, setIsCollapsed] = useState(true) const status = useDepositStatus(deposit) const depositInfo = { @@ -53,8 +51,7 @@ const DepositMobile: React.FC = ({ deposit, transferStatus, target={'_blank'} className={styles.explorerLink} > - {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED ? ( + {status?.data?.l2Result?.complete ? (
Completed diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 28c19b3e..a5f24b49 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -54,8 +54,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) - const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal, returnTransferData]) - const { data: transferStatus, isLoading } = transferData() + const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal]) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( @@ -64,17 +63,17 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction return ( <> - {isLoading && smallView ? ( + {status?.isLoading && smallView ? (
Loading
) : ( <> {smallView ? ( - + ) : ( <> - {isLoading || transferStatus?.status === undefined ? ( + {status?.isLoading || status?.data === undefined ? ( <>
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 7491f50d..b1e5be50 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -12,9 +12,8 @@ interface WithdrawalMobileProps { withdrawal: TransactionRecord claim: any status: any - transferStatus: any } -const WithdrawalMobile: React.FC = ({ withdrawal, claim, status, transferStatus }) => { +const WithdrawalMobile: React.FC = ({ withdrawal, claim, status }) => { const [isCollapsed, setIsCollapsed] = useState(true) return ( @@ -27,7 +26,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim, <> )} - {transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( + {status?.status === ChildToParentMessageStatus.CONFIRMED && ( = ({ withdrawal, claim,
)} - {transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {status?.status === ChildToParentMessageStatus.UNCONFIRMED && ( = ({ withdrawal, claim, )}
- {transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + {status?.status === ChildToParentMessageStatus.EXECUTED && ( <>
@@ -107,16 +106,16 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim, )}
Status
- {transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( + {status?.status === ChildToParentMessageStatus.CONFIRMED && ( )} - {transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + {status?.status === ChildToParentMessageStatus.EXECUTED && (
{timeAgo(status.data.lowNetworkTimeStamp)}
)} - {transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {status?.status === ChildToParentMessageStatus.UNCONFIRMED && (
{ETA(status.data?.timestamp, withdrawal.challengePeriod)}
)}
From 08bde58e3e0448a8932f6e24553c39715ff7e779 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 11:10:47 +0000 Subject: [PATCH 168/266] withdrawal clean up --- .../bridge/history/HistoryDesktop.tsx | 15 ++++++----- .../components/bridge/history/Withdrawal.tsx | 27 ++++++++----------- 2 files changed, 19 insertions(+), 23 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5bcac6ea..fa299cd3 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -23,13 +23,14 @@ const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionR apiData.forEach((tx) => { const hashKey = tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? '') - if (combinedData.has(hashKey)) { - const localTx = combinedData.get(hashKey) - if (localTx) { - tx.status = localTx.status - combinedData.set(hashKey, tx) - } - } + combinedData.set(hashKey, tx) + // if (combinedData.has(hashKey)) { + // const localTx = combinedData.get(hashKey) + // if (localTx) { + // tx.status = localTx.status + // combinedData.set(hashKey, tx) + // } + // } }) const combinedDataArray = Array.from(combinedData.values()) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index a5f24b49..a82c31e9 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useState } from 'react' +import React, { useState } from 'react' import { HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' @@ -49,18 +49,19 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) + console.log( + withdrawal.highNetworkHash === '0x4425be5ed93245e0424cce52d8bac9008679d188c8317a2ecdc5b8f35f360ba1' ? withdrawal : "" + ) const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { claim, returnTransferData } = useBridgeTransfer() + const { claim } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) - const transferData = useCallback(() => returnTransferData({ txRecord: withdrawal }), [withdrawal]) const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) let transactions = transactionsString ? JSON.parse(transactionsString) : [] const localStorageTransaction = transactions.find( (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash ) - const withdrawalCompletedData = withdrawal?.lowNetworkHash ? withdrawal : localStorageTransaction return ( <> {status?.isLoading && smallView ? ( @@ -172,7 +173,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onMouseLeave={() => setHovered(false)} > @@ -192,7 +193,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} > -
{timeAgo(withdrawalCompletedData?.completionTimestamp)}
+
{timeAgo(withdrawal?.completionTimestamp)}
{collapseExecuted && ( <> @@ -218,16 +219,12 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
- {timeAgo(withdrawalCompletedData?.completionTimestamp)} -
+
{timeAgo(withdrawal?.completionTimestamp)}
Finalize
-
- {timeAgo(withdrawalCompletedData?.completionTimestamp)} -
+
{timeAgo(withdrawal?.completionTimestamp)}
{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
@@ -235,7 +232,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status?.data?.to ?? ''}
-
- {timeAgo(withdrawalCompletedData?.completionTimestamp)} -
+
{timeAgo(withdrawal?.completionTimestamp)}
)} From 41a799cf76d792b9c545eb12728f1c5327e90de6 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 12:11:31 +0000 Subject: [PATCH 169/266] tokeninformation from API and merge transactions --- .../src/components/bridge/history/Deposit.tsx | 13 ++++++----- .../bridge/history/HistoryDesktop.tsx | 22 ++++++++++--------- .../components/bridge/history/Withdrawal.tsx | 20 +++++++---------- .../src/hooks/useBridgeTransfer.ts | 4 +--- 4 files changed, 28 insertions(+), 31 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index ddd1a405..e049275a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -9,6 +9,7 @@ import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' +import { getTokensForNetwork } from '@/utils/tokens' import { getBlockExplorerUrl } from '@/utils/web3utils' interface DepositProps { @@ -21,10 +22,8 @@ const Deposit: React.FC = ({ deposit }) => { } const smallView = useMediaQuery('(max-width: 1199px)') const { connectedAccount } = useBlockchainContext() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions = transactionsString ? JSON.parse(transactionsString) : [] - const localStorageTransaction = transactions.find( - (t: any) => t.type === 'DEPOSIT' && t.lowNetworkHash === deposit.lowNetworkHash + const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( + (token) => token.address === deposit?.tokenAddress ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) return ( @@ -46,14 +45,16 @@ const Deposit: React.FC = ({ deposit }) => {
{timeAgo(deposit.lowNetworkTimestamp)}
-
{`${deposit.amount} ${localStorageTransaction?.symbol}`}
+
{`${tokenInformation?.decimals ? Number(deposit.amount) / tokenInformation?.decimals : deposit.amount} ${tokenInformation?.symbol}`}
{depositInfo.from}
{depositInfo.to}
{isLoadingStatus ? ( <>
Loading
-
{' '} +
Loading
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index fa299cd3..cc968bfb 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -21,16 +21,18 @@ const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionR combinedData.set(hashKey, localTx) }) - apiData.forEach((tx) => { - const hashKey = tx.type === 'DEPOSIT' ? (tx.lowNetworkHash ?? '') : (tx.highNetworkHash ?? '') - combinedData.set(hashKey, tx) - // if (combinedData.has(hashKey)) { - // const localTx = combinedData.get(hashKey) - // if (localTx) { - // tx.status = localTx.status - // combinedData.set(hashKey, tx) - // } - // } + // Merge API data, prioritizing latest withdrawal completionTimestamp + apiData.forEach((apiTx) => { + const hashKey = apiTx.type === 'DEPOSIT' ? (apiTx.lowNetworkHash ?? '') : (apiTx.highNetworkHash ?? '') + const existingTx = combinedData.get(hashKey) + + if (existingTx) { + if (apiTx.type === 'WITHDRAWAL' && !apiTx.completionTimestamp && existingTx.completionTimestamp) { + combinedData.set(hashKey, existingTx) + } + } else { + combinedData.set(hashKey, apiTx) + } }) const combinedDataArray = Array.from(combinedData.values()) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index a82c31e9..9d653bce 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -9,6 +9,7 @@ import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' +import { getTokensForNetwork } from '@/utils/tokens' import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' import { useMediaQuery } from '@mantine/hooks' @@ -49,18 +50,13 @@ export const getStatus = (withdrawal: TransactionRecord) => { } const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal) - console.log( - withdrawal.highNetworkHash === '0x4425be5ed93245e0424cce52d8bac9008679d188c8317a2ecdc5b8f35f360ba1' ? withdrawal : "" - ) const { connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) - let transactions = transactionsString ? JSON.parse(transactionsString) : [] - const localStorageTransaction = transactions.find( - (t: TransactionRecord) => t.type === 'WITHDRAWAL' && t.highNetworkHash === withdrawal.highNetworkHash + const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( + (token) => token.address === withdrawal?.tokenAddress ) return ( <> @@ -85,7 +81,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -137,7 +133,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { }} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} - >{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
setCollapseExecuted(!collapseExecuted)} @@ -203,7 +199,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -227,7 +223,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.completionTimestamp)}
{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -260,7 +256,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status?.data?.timestamp)}
{`${status?.data?.amount} ${localStorageTransaction?.symbol ?? ''}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
{status?.data && status.data.status === ChildToParentMessageStatus.CONFIRMED && ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 632b8a1d..6b0feac1 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -121,9 +121,7 @@ export const useBridgeTransfer = () => { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() - - console.log(withdrawal) - + // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', From 0afc0799fb3aa9b1b0fa703b3591f0b644aaea06 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 17:36:47 +0000 Subject: [PATCH 170/266] fix hook issue --- webapps/world-builder-dashboard/constants.ts | 14 +++------ .../src/components/bridge/history/Deposit.tsx | 14 ++++----- .../bridge/history/DepositMobile.tsx | 12 ++++---- .../bridge/history/HistoryDesktop.tsx | 2 +- .../components/bridge/history/Withdrawal.tsx | 28 ++++++++++------- .../src/hooks/useBridgeTransfer.ts | 11 +++---- .../src/hooks/useL2ToL1MessageStatus.ts | 30 +++++++++---------- .../src/pages/BridgePage/BridgePage.tsx | 1 - .../src/utils/web3utils.ts | 13 +++++--- 9 files changed, 66 insertions(+), 59 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index d0dff026..7d95fd41 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,4 +1,4 @@ -import { NetworkInterface, HighNetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' +import { NetworkInterface, HighNetworkInterface, useBlockchainContext, NetworkType } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' export const L1_NETWORK: NetworkInterface = { @@ -166,8 +166,7 @@ export const USDC_MAINNET: TokenAddressMap = { -export const getNetworks = () => { - const { selectedNetworkType } = useBlockchainContext() +export const getNetworks = (selectedNetworkType: NetworkType) => { switch (selectedNetworkType) { case 'Mainnet': return ALL_MAINNET_NETWORKS @@ -176,8 +175,7 @@ export const getNetworks = () => { } } -export const getHighNetworks = () => { - const { selectedNetworkType } = useBlockchainContext() +export const getHighNetworks = (selectedNetworkType: NetworkType) => { switch (selectedNetworkType) { case 'Mainnet': return ALL_HIGH_MAINNET_NETWORKS @@ -186,8 +184,7 @@ export const getHighNetworks = () => { } } -export const getLowNetworks = () => { - const { selectedNetworkType } = useBlockchainContext() +export const getLowNetworks = (selectedNetworkType: NetworkType) => { switch (selectedNetworkType) { case 'Mainnet': return ALL_LOW_MAINNET_NETWORKS @@ -195,6 +192,3 @@ export const getLowNetworks = () => { return ALL_LOW_TESTNET_NETWORKS } } - -// ETH, ARBITRUM, USDC, MANTLE, USDT, -export const ALL_TOKEN_MAPPINGS = [TG7T, ETH, USDC] diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index b0af856f..5944621e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -16,16 +16,16 @@ interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { + const { connectedAccount, selectedNetworkType } = useBlockchainContext() + const smallView = useMediaQuery('(max-width: 1199px)') + const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { - from: getLowNetworks().find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', - to: getHighNetworks().find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' + from: getLowNetworks(selectedNetworkType).find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', + to: getHighNetworks(selectedNetworkType).find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } - const smallView = useMediaQuery('(max-width: 1199px)') - const { connectedAccount } = useBlockchainContext() const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( (token) => token.address === deposit?.tokenAddress ) - const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit) return ( <> {isLoadingStatus && smallView ? ( @@ -35,7 +35,7 @@ const Deposit: React.FC = ({ deposit }) => { ) : ( <> {smallView ? ( - + ) : ( <>
@@ -62,7 +62,7 @@ const Deposit: React.FC = ({ deposit }) => { ) : ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index 34582275..c17a3ff7 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -8,17 +8,19 @@ import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' +import { NetworkType } from '@/contexts/BlockchainContext' interface DepositMobileProps { deposit: TransactionRecord isLoading: boolean + selectedNetworkType: NetworkType } -const DepositMobile: React.FC = ({ deposit, isLoading }) => { +const DepositMobile: React.FC = ({ deposit, isLoading, selectedNetworkType }) => { const [isCollapsed, setIsCollapsed] = useState(true) - const status = useDepositStatus(deposit) + const status = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { - from: getLowNetworks().find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', - to: getHighNetworks().find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' + from: getLowNetworks(selectedNetworkType).find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', + to: getHighNetworks(selectedNetworkType).find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const smallView = useMediaQuery('(max-width: 1199px)') @@ -47,7 +49,7 @@ const DepositMobile: React.FC = ({ deposit, isLoading }) =>
Transaction
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 851efb31..a757ea08 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -23,7 +23,7 @@ const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionR // Merge API data, prioritizing latest withdrawal completionTimestamp apiData.forEach((apiTx) => { - const hashKey = apiTx.type === 'DEPOSIT' ? (apiTx.lowNetworkHash ?? '') : (apiTx.highNetworkHash ?? '') + const hashKey = apiTx.type === 'DEPOSIT' ? (apiTx.lowNetworkHash ?? '') : (apiTx.highNetworkHash ?? '') const existingTx = combinedData.get(hashKey) if (existingTx) { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 0ef43434..7603a0f1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,11 +1,11 @@ -import { getHighNetworks, getLowNetworks } from '../../../../constants' import React, { useState } from 'react' +import { getHighNetworks, getLowNetworks } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' import WithdrawalMobile from '@/components/bridge/history/WithdrawalMobile' -import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { NetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -18,7 +18,11 @@ interface WithdrawalProps { withdrawal: TransactionRecord } -export const getStatus = (withdrawal: TransactionRecord) => { +export const getStatus = ( + withdrawal: TransactionRecord, + lowNetworks: NetworkInterface[], + highNetworks: NetworkInterface[] +) => { const { completionTimestamp, claimableTimestamp, @@ -33,8 +37,8 @@ export const getStatus = (withdrawal: TransactionRecord) => { : claimableTimestamp ? ChildToParentMessageStatus.CONFIRMED : ChildToParentMessageStatus.UNCONFIRMED - const lowNetwork = getLowNetworks().find((n) => n.chainId === lowNetworkChainId) - const highNetwork = getHighNetworks().find((n) => n.chainId === highNetworkChainId) + const lowNetwork = lowNetworks.find((n) => n.chainId === lowNetworkChainId) + const highNetwork = highNetworks.find((n) => n.chainId === highNetworkChainId) if (lowNetwork && highNetwork) { const data = { status, @@ -49,12 +53,14 @@ export const getStatus = (withdrawal: TransactionRecord) => { } } const Withdrawal: React.FC = ({ withdrawal }) => { - const status = getStatus(withdrawal) const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) + const lowNetworks = getLowNetworks(selectedNetworkType) + const highNetworks = getHighNetworks(selectedNetworkType) + const status = getStatus(withdrawal, lowNetworks, highNetworks) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) @@ -169,7 +175,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { onMouseLeave={() => setHovered(false)} > @@ -204,7 +210,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status?.data?.to ?? ''}
@@ -228,7 +234,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{status?.data?.to ?? ''}
@@ -263,7 +269,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { <>
@@ -284,7 +290,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { <>
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 02897cbb..ba95dfbb 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -13,14 +13,15 @@ interface UseTransferDataProps { } export const useBridgeTransfer = () => { + const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() + const returnTransferData = ({ txRecord }: UseTransferDataProps) => { - const { connectedAccount } = useBlockchainContext() const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId - const destinationRpc = getNetworks().find((n) => n.chainId === destinationChainId)?.rpcs[0] - const originRpc = getNetworks().find((n) => n.chainId === originChainId)?.rpcs[0] + const destinationRpc = getNetworks(selectedNetworkType).find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = getNetworks(selectedNetworkType).find((n) => n.chainId === originChainId)?.rpcs[0] const getCachedTransactions = () => { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) @@ -130,9 +131,9 @@ export const useBridgeTransfer = () => { txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: getNetworks().find((n) => n.chainId === withdrawal.lowNetworkChainId) + destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType).find((n) => n.chainId === withdrawal.lowNetworkChainId) ?.rpcs[0], - originSignerOrProviderOrRpc: getNetworks().find((n) => n.chainId === withdrawal.highNetworkChainId) + originSignerOrProviderOrRpc: getNetworks(selectedNetworkType).find((n) => n.chainId === withdrawal.highNetworkChainId) ?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 6ab586ab..4a1efe9b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -3,7 +3,7 @@ import { getHighNetworks, getLowNetworks, L2_NETWORK } from '../../constants' import { ethers, providers } from 'ethers' import { Transaction } from 'ethers' import { BridgeNotification } from '@/components/notifications/NotificationsButton' -import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ParentTransactionReceipt, @@ -42,11 +42,11 @@ export interface L2ToL1MessageStatusResult { l2Receipt?: ChildTransactionReceipt } -const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { +const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord, selectedNetworkType: NetworkType) => { const { lowNetworkChainId, highNetworkChainId, highNetworkHash, amount, highNetworkTimestamp } = withdrawal - const lowNetwork = getLowNetworks().find((n) => n.chainId === lowNetworkChainId) - const highNetwork = getHighNetworks().find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks(selectedNetworkType).find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks(selectedNetworkType).find((n) => n.chainId === highNetworkChainId) if (!highNetwork || !lowNetwork || !highNetworkHash) { return undefined } @@ -73,8 +73,8 @@ const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord) => { } } -export const useL2ToL1MessageStatus = (withdrawal: TransactionRecord) => { - return useQuery(['withdrawalStatus', withdrawal], () => fetchL2ToL1MessageStatus(withdrawal), { +export const useL2ToL1MessageStatus = (withdrawal: TransactionRecord, selectedNetworkType: NetworkType) => { + return useQuery(['withdrawalStatus', withdrawal], () => fetchL2ToL1MessageStatus(withdrawal, selectedNetworkType), { refetchInterval: 60 * 1000 }) } @@ -108,7 +108,7 @@ export const getDecodedInputs = (tx: Transaction, ABI: any) => { // throw new Error(`Unable to decode inputs - ${tx.to} is unknown contract`) // } -const fetchDepositStatus = async (deposit: TransactionRecord) => { +const fetchDepositStatus = async (deposit: TransactionRecord, selectedNetworkType: NetworkType) => { const { lowNetworkChainId, highNetworkChainId, lowNetworkHash, lowNetworkTimestamp } = deposit if (lowNetworkChainId === L2_NETWORK.chainId) { return { @@ -117,8 +117,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { } } - const lowNetwork = getLowNetworks().find((n) => n.chainId === lowNetworkChainId) - const highNetwork = getHighNetworks().find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks(selectedNetworkType).find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks(selectedNetworkType).find((n) => n.chainId === highNetworkChainId) if (!lowNetwork || !lowNetworkHash) { return undefined @@ -149,7 +149,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { try { l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations) } catch (e) { - console.error('Error waiting for child transaction receipt:', {deposit, e}) + console.error('Error waiting for child transaction receipt:', { deposit, e }) } if (!l2Result) { @@ -166,8 +166,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord) => { return { l1Receipt, l2Result, highNetworkTimestamp } } -export const useDepositStatus = (deposit: TransactionRecord) => { - return useQuery(['depositStatus', deposit], () => fetchDepositStatus(deposit), { +export const useDepositStatus = (deposit: TransactionRecord, selectedNetworkType: NetworkType) => { + return useQuery(['depositStatus', deposit], () => fetchDepositStatus(deposit, selectedNetworkType), { refetchInterval: 60000 * 3, staleTime: 2 * 60 * 1000 // 2 minutes }) @@ -264,7 +264,7 @@ export const useMessages = ( } }, { - enabled: !!networkType && !!connectedAccount + enabled: !!networkType && !!connectedAccount } ) } @@ -348,7 +348,7 @@ export const usePendingTransactions = (connectedAccount: string | undefined): Us const newCompletedTransactions: TransactionRecord[] = [] for (const t of transactions) { if (t.type === 'DEPOSIT') { - const status = await fetchDepositStatus(t as TransactionRecord) + const status = await fetchDepositStatus(t as TransactionRecord, selectedNetworkType) if (status?.highNetworkTimestamp) { newCompletedTransactions.push({ ...t, @@ -358,7 +358,7 @@ export const usePendingTransactions = (connectedAccount: string | undefined): Us } } if (t.type === 'WITHDRAWAL') { - const status = await fetchL2ToL1MessageStatus(t as TransactionRecord) + const status = await fetchL2ToL1MessageStatus(t as TransactionRecord, selectedNetworkType) if (status?.status === ChildToParentMessageStatus.CONFIRMED) { if (!t.claimableTimestamp) { newCompletedTransactions.push({ ...t, claimableTimestamp: Date.now() / 1000, newTransaction: true }) diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index 10a7ab3e..fa18707f 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -32,7 +32,6 @@ const BridgePage = () => { const { newNotifications, refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') const queryClient = useQueryClient() - usePendingTransactions(connectedAccount) useEffect(() => { if (connectedAccount) { diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index a305e448..ed40644b 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -1,5 +1,6 @@ import { getHighNetworks, getLowNetworks } from '../../constants' import { ethers } from 'ethers' +import { NetworkType } from '@/contexts/BlockchainContext' export const convertToBigNumber = (numberString: string, precision = 18) => { const [integerPart, decimalPart] = numberString.split('.') @@ -8,15 +9,19 @@ export const convertToBigNumber = (numberString: string, precision = 18) => { return ethers.BigNumber.from(bigNumberString) } -export const getBlockExplorerUrl = (chainId: number | undefined) => { - const network = [...getLowNetworks(), ...getHighNetworks()].find((n) => n.chainId === chainId) +export const getBlockExplorerUrl = (chainId: number | undefined, selectedNetworkType: NetworkType) => { + const network = [...getLowNetworks(selectedNetworkType), ...getHighNetworks(selectedNetworkType)].find( + (n) => n.chainId === chainId + ) if (network?.blockExplorerUrls) { return network.blockExplorerUrls[0] } } -export const getNetwork = (chainId: number) => { - return [...getLowNetworks(), ...getHighNetworks()].find((n) => n.chainId === chainId) +export const getNetwork = (chainId: number, selectedNetworkType: NetworkType) => { + return [...getLowNetworks(selectedNetworkType), ...getHighNetworks(selectedNetworkType)].find( + (n) => n.chainId === chainId + ) } export const tokenTypes = [ From 443a2d7e9445b5385f46605d9e9e1d53252a52b2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 17:43:44 +0000 Subject: [PATCH 171/266] fix build --- webapps/world-builder-dashboard/constants.ts | 2 +- .../components/bridge/bridge/ActionButton.tsx | 4 ++-- .../components/bridge/bridge/BridgeView.tsx | 2 +- .../components/bridge/history/Withdrawal.tsx | 7 ++++++- .../bridge/history/WithdrawalMobile.tsx | 14 ++++++++------ .../walletButton/WalletButton.tsx | 6 +++--- .../src/components/faucet/FaucetView.tsx | 2 +- .../notifications/NotificationsDropModal.tsx | 19 +++++++++++-------- .../src/pages/BridgePage/BridgePage.tsx | 2 +- 9 files changed, 34 insertions(+), 24 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 7d95fd41..2357b68e 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,4 +1,4 @@ -import { NetworkInterface, HighNetworkInterface, useBlockchainContext, NetworkType } from '@/contexts/BlockchainContext' +import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' export const L1_NETWORK: NetworkInterface = { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 59395434..28458f09 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -3,7 +3,7 @@ import React from 'react' import { useMutation, useQueryClient } from 'react-query' import { useNavigate } from 'react-router-dom' // Constants -import { getNetworks, USDC } from '../../../../constants' +import { getNetworks } from '../../../../constants' // Styles import styles from './ActionButton.module.css' import { ethers } from 'ethers' @@ -46,7 +46,7 @@ const ActionButton: React.FC = ({ const { refetchNewNotifications } = useBridgeNotificationsContext() const navigate = useNavigate() - const networks = getNetworks() + const networks = getNetworks(selectedNetworkType) const getLabel = (): String | undefined => { if (isConnecting) { diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index fe66518b..34e0d723 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -69,7 +69,7 @@ const BridgeView = ({ setSelectedBridgeToken(token) } - const networks = getNetworks() + const networks = getNetworks(selectedNetworkType) const estimatedFee = useQuery( ['estimatedFee', bridger, connectedAccount, value], diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 7603a0f1..476dd75b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -73,7 +73,12 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> {smallView ? ( - + ) : ( <> {status?.isLoading || status?.data === undefined ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index b1e5be50..193635b4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -7,13 +7,15 @@ import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' +import { NetworkType } from '@/contexts/BlockchainContext' interface WithdrawalMobileProps { withdrawal: TransactionRecord claim: any status: any + selectedNetworkType: NetworkType } -const WithdrawalMobile: React.FC = ({ withdrawal, claim, status }) => { +const WithdrawalMobile: React.FC = ({ withdrawal, claim, status, selectedNetworkType }) => { const [isCollapsed, setIsCollapsed] = useState(true) return ( @@ -28,7 +30,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim,
Transaction
{status?.status === ChildToParentMessageStatus.EXECUTED && (
@@ -40,7 +42,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim, )} {status?.status === ChildToParentMessageStatus.CONFIRMED && ( @@ -52,7 +54,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim, )} {status?.status === ChildToParentMessageStatus.UNCONFIRMED && ( @@ -69,7 +71,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim,
Initiate
@@ -82,7 +84,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim,
Finalize
diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx index 3f345e8d..a45a412c 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx @@ -14,14 +14,14 @@ interface WalletButtonProps { } const WalletButton: React.FC = () => { const [isModalOpen, setIsModalOpen] = useState(false) const [tokens, setTokens] = useState([]) - const { connectedAccount, chainId } = useBlockchainContext() + const { connectedAccount, chainId, selectedNetworkType } = useBlockchainContext() const handleModalClose = () => { setIsModalOpen(false) } const { data: nativeBalance } = useNativeBalance({ account: connectedAccount, - rpc: getNetworks().find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] + rpc: getNetworks(selectedNetworkType).find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] }) const getTokens = async () => { @@ -45,7 +45,7 @@ const WalletButton: React.FC = () => {
{nativeBalance - ? `${Number(nativeBalance).toFixed(4)} ${getNetworks().find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` + ? `${Number(nativeBalance).toFixed(4)} ${getNetworks(selectedNetworkType).find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` : 'Fetching...'}
diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 54fcf16b..f0d6b113 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -30,7 +30,7 @@ const FaucetView: React.FC = ({}) => { const smallView = useMediaQuery('(max-width: 1199px)') const values: AccountType[] = [`External Address`, `Connected Account`] - const networks = getNetworks() + const networks = getNetworks(selectedNetworkType) useEffect(() => { const targetNetwork = networks.find((n) => n.chainId === faucetTargetChainId) diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 97fe1bb1..1db3cbe7 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -12,7 +12,7 @@ import IconLinkExternal02 from '@/assets/IconLinkExternal02' // Components import { BridgeNotification } from '@/components/notifications/NotificationsButton' // Context and Hooks -import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' // Utilities import { timeAgo } from '@/utils/timeFormat' @@ -22,8 +22,8 @@ interface NotificationsDropModalProps { notifications: BridgeNotification[] } -const copy = (notification: BridgeNotification) => { - const targetNetwork = getNetwork(notification.to)?.displayName ?? 'unknown chain' +const copy = (notification: BridgeNotification, selectedNetworkType: NetworkType) => { + const targetNetwork = getNetwork(notification.to, selectedNetworkType)?.displayName ?? 'unknown chain' if (notification.status === 'CLAIMABLE') { return `Heads Up: Your ${notification.amount} ${notification.tx.symbol} withdrawal is complete and you can now claim your assets` } @@ -52,7 +52,7 @@ const badgeClassName = (status: string) => { } const NotificationsDropModal: React.FC = ({ notifications }) => { - const { connectedAccount } = useBlockchainContext() + const { connectedAccount, selectedNetworkType } = useBlockchainContext() const { cleanNewNotifications, setIsDropdownOpened, setIsModalOpened } = useBridgeNotificationsContext() useEffect(() => { @@ -83,7 +83,7 @@ const NotificationsDropModal: React.FC = ({ notific
{timeAgo(n.timestamp, true)}
-
{copy(n)}
+
{copy(n, selectedNetworkType)}
))}
{timeAgo(n.timestamp, true)}
-
{copy(n)}
+
{copy(n, selectedNetworkType)}
))}
diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index fa18707f..0f398661 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -15,7 +15,7 @@ import { FloatingNotification } from '@/components/notifications/NotificationsDr import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' // Hooks -import { useNotifications, usePendingTransactions } from '@/hooks/useL2ToL1MessageStatus' +import { useNotifications } from '@/hooks/useL2ToL1MessageStatus' import { useMediaQuery } from '@mantine/hooks' export type DepositDirection = 'DEPOSIT' | 'WITHDRAW' From 82d80c6d70ac1bad9134caff7cfaacfe01b1c705 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 17:51:06 +0000 Subject: [PATCH 172/266] attempt removing scroll bar from safari --- .../src/pages/LandingPage/LandingPage.module.css | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css index 56dde405..8ef91dda 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -3,6 +3,7 @@ body { overscroll-behavior: none; scrollbar-width: none; -webkit-overflow-scrolling: auto; + -webkit-scrollbar: none; } .layout { From f480e76b5388744449addc297b99a3718d5d2589 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 17:52:47 +0000 Subject: [PATCH 173/266] fix .usd error null check --- .../src/components/bridge/bridge/BridgeView.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 34e0d723..894f5765 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -218,7 +218,7 @@ const BridgeView = ({ onTokenChange={handleTokenChange} balance={tokenInformation?.tokenBalance} rate={ - selectedBridgeToken.symbol === 'TG7T' + selectedBridgeToken.symbol === 'TG7T' || selectedBridgeToken.symbol === 'G7' ? 1 : isCoinFetching ? 0.0 @@ -261,7 +261,7 @@ const BridgeView = ({ isEstimatingFee={estimatedFee.isFetching} value={Number(value)} ethRate={ - selectedBridgeToken.symbol === 'TG7T' + selectedBridgeToken.symbol === 'TG7T' || selectedBridgeToken.symbol === 'G7' ? 1 : isCoinFetching ? 0.0 @@ -269,7 +269,7 @@ const BridgeView = ({ } tokenSymbol={tokenInformation?.symbol ?? ''} tokenRate={ - selectedBridgeToken.symbol === 'TG7T' + selectedBridgeToken.symbol === 'TG7T' || selectedBridgeToken.symbol === 'G7' ? 1 : isCoinFetching ? 0.0 From ec9a4448de5b28f0ff03eb780b6352b905b64626 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 19 Nov 2024 18:09:33 +0000 Subject: [PATCH 174/266] fix token selection --- .../bridge/bridge/ValueToBridge.tsx | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 73ca70fc..0fc0af03 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -39,11 +39,26 @@ const ValueToBridge: React.FC = ({ selectedChainId }) => { const [tokens, setTokens] = useState([]) - const { connectedAccount, selectedBridgeToken } = useBlockchainContext() + const { connectedAccount, selectedBridgeToken, selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() const getTokens = async () => { + const highNetworkChainId = String(selectedHighNetwork.chainId) + const lowNetworkChainId = String(selectedLowNetwork.chainId) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) - handleTokenChange(_tokens.find((token) => token.name === selectedBridgeToken.name) || _tokens[0]) + + const n = _tokens.find((token) => token.name === selectedBridgeToken.name) || _tokens[0] + + const chainIds = Object.keys(n.tokenAddressMap ?? {}) + + const isChainIdValid = + n.tokenAddressMap && chainIds.includes(String(highNetworkChainId)) && chainIds.includes(String(lowNetworkChainId)) + + const selectedToken = + isChainIdValid && _tokens.some((token) => token.name === selectedBridgeToken.name) + ? _tokens.find((token) => token.name === selectedBridgeToken.name) || _tokens[0] + : _tokens[0] + + handleTokenChange(selectedToken) setTokens(_tokens) } From f37b4ccec3e34e10528473ea66fe110308424280 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 14:16:32 +0000 Subject: [PATCH 175/266] save selectedNetworkType to local storage --- .../components/bridge/bridge/ActionButton.tsx | 2 +- .../components/bridge/bridge/BridgeView.tsx | 4 +++- .../src/contexts/BlockchainContext.tsx | 22 +++++++++++++++++-- 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 28458f09..eff151d5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -95,7 +95,7 @@ const ActionButton: React.FC = ({ if (selectedBridgeToken.address != ZERO_ADDRESS) { const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' const allowanceToCheck = ethers.utils.formatUnits(allowance, decimals) - + // approve first if (Number(allowanceToCheck) < Number(amount)) { const txApprove = await bridger?.approve(amountToSend, signer) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 894f5765..375cb2b1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -79,7 +79,9 @@ const BridgeView = ({ if (!originNetwork) throw new Error("Can't find network!") const allowance = await bridger?.getAllowance(originNetwork.rpcs[0], connectedAccount ?? '') - const parsedValue = value ? ethers.utils.parseEther(value) : ethers.utils.parseEther('0') + const decimals = tokenInformation?.decimalPlaces ?? 18 + console.log(decimals) + const parsedValue = value ? ethers.utils.parseUnits(value, decimals) : ethers.utils.parseEther('0') let approvalFee = ethers.utils.parseEther('0') // Default to zero if no approval needed let transferFee = ethers.utils.parseEther('0') // Default to zero diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 682740eb..235b40c6 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -61,7 +61,7 @@ export interface NetworkInterface { wrappedG7TokenAddress?: string } -export type NetworkType = 'Testnet' | 'Mainnet' +export type NetworkType = 'Testnet' | 'Mainnet' | undefined export interface HighNetworkInterface extends NetworkInterface { inbox: string @@ -75,7 +75,7 @@ interface BlockchainProviderProps { export const BlockchainProvider: React.FC = ({ children }) => { const [walletProvider, setWalletProvider] = useState() - const [selectedNetworkType, setSelectedNetworkType] = useState('Testnet') + const [selectedNetworkType, setSelectedNetworkType] = useState(undefined) const [selectedLowNetwork, _setSelectedLowNetwork] = useState( selectedNetworkType === 'Testnet' ? DEFAULT_LOW_NETWORK : DEFAULT_LOW_MAINNET_NETWORK ) @@ -110,6 +110,15 @@ export const BlockchainProvider: React.FC = ({ children _setSelectedHighNetwork(network) } + useEffect(() => { + const _selectedNetworkType = localStorage.getItem('selectedNetworkType') + if (_selectedNetworkType) { + setSelectedNetworkType(_selectedNetworkType as NetworkType) + } else { + setSelectedNetworkType('Testnet') + } + }, []) + useEffect(() => { const ethereum = window.ethereum if (ethereum) { @@ -136,6 +145,9 @@ export const BlockchainProvider: React.FC = ({ children }, [walletProvider]) useEffect(() => { + if (selectedNetworkType) { + localStorage.setItem('selectedNetworkType', selectedNetworkType) + } if (selectedNetworkType === 'Testnet') { setSelectedLowNetwork(DEFAULT_LOW_NETWORK) setSelectedHighNetwork(DEFAULT_HIGH_NETWORK) @@ -145,6 +157,12 @@ export const BlockchainProvider: React.FC = ({ children } }, [selectedNetworkType]) + useEffect(() => { + if (selectedNetworkType) { + localStorage.setItem('selectedNetworkType', selectedNetworkType) + } + }, [selectedNetworkType]) + const fetchChainId = async () => { const _chainId = (await walletProvider?.getNetwork())?.chainId setChainId(_chainId) From 79fe91a5e0e4b487cde675ebcfc1740b7320527a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 14:39:40 +0000 Subject: [PATCH 176/266] allow network selection but maintain token selection --- .../src/components/bridge/bridge/NetworkSelector.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 46479158..633abc6f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -76,9 +76,8 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: {networks.map((n) => { const chainIds = Object.keys(selectedToken.tokenAddressMap) - const isDisabled = chainIds.includes(String(n.chainId)) return ( - +
Date: Wed, 20 Nov 2024 15:35:19 +0000 Subject: [PATCH 177/266] fix build and log errors --- .../src/components/bridge/bridge/ActionButton.tsx | 2 +- .../src/components/bridge/bridge/BridgeView.tsx | 5 ++--- .../src/components/bridge/bridge/NetworkSelector.tsx | 5 +---- .../src/components/bridge/history/Deposit.tsx | 4 ++-- .../src/components/bridge/history/DepositMobile.tsx | 4 ++-- .../src/components/bridge/history/HistoryDesktop.tsx | 2 +- .../src/components/bridge/history/HistoryMobile.tsx | 2 +- .../src/components/bridge/history/Withdrawal.tsx | 6 +++--- .../commonComponents/walletButton/WalletButton.tsx | 4 ++-- .../src/components/faucet/FaucetView.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 8 ++++---- .../src/hooks/useL2ToL1MessageStatus.ts | 8 ++++---- webapps/world-builder-dashboard/src/utils/web3utils.ts | 6 +++--- 13 files changed, 27 insertions(+), 31 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index eff151d5..671db2e2 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -81,7 +81,7 @@ const ActionButton: React.FC = ({ const queryClient = useQueryClient() const transfer = useMutation( async (amount: string) => { - const network = networks.find((n) => n.chainId === bridger?.originNetwork.chainId)! + const network = networks?.find((n) => n.chainId === bridger?.originNetwork.chainId)! const provider = await getProvider(network) const signer = provider.getSigner() const destinationRPC = direction === 'DEPOSIT' ? selectedHighNetwork.rpcs[0] : selectedLowNetwork.rpcs[0] diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 375cb2b1..e7d5ad36 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -75,7 +75,7 @@ const BridgeView = ({ ['estimatedFee', bridger, connectedAccount, value], async () => { try { - const originNetwork = networks.find((n) => n.chainId === bridger?.originNetwork.chainId) + const originNetwork = networks?.find((n) => n.chainId === bridger?.originNetwork.chainId) if (!originNetwork) throw new Error("Can't find network!") const allowance = await bridger?.getAllowance(originNetwork.rpcs[0], connectedAccount ?? '') @@ -122,6 +122,7 @@ const BridgeView = ({ const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) + console.log({origin, destinationChainId, chainIds, selectedBridgeToken}) if (!chainIds.includes(String(destinationChainId))) { return @@ -164,7 +165,6 @@ const BridgeView = ({ networks={selectedNetworkType === 'Testnet' ? [L1_NETWORK, L2_NETWORK] : [L1_MAIN_NETWORK, L2_MAIN_NETWORK]} selectedNetwork={selectedLowNetwork} onChange={setSelectedLowNetwork} - selectedToken={selectedBridgeToken} /> ) } else { @@ -173,7 +173,6 @@ const BridgeView = ({ networks={selectedNetworkType === 'Testnet' ? [L2_NETWORK, L3_NETWORK] : [L2_MAIN_NETWORK, L3_MAIN_NETWORK]} selectedNetwork={selectedHighNetwork} onChange={setSelectedHighNetwork} - selectedToken={selectedBridgeToken} /> ) } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 633abc6f..b9ee7a59 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -14,16 +14,14 @@ import IconChevronDown from '@/assets/IconChevronDown' import IconEthereum from '@/assets/IconEthereum' import IconG7T from '@/assets/IconG7T' import { HighNetworkInterface, NetworkInterface } from '@/contexts/BlockchainContext' -import { Token } from '@/utils/tokens' type NetworkSelectorProps = { networks: NetworkInterface[] selectedNetwork: NetworkInterface onChange: (network: NetworkInterface | HighNetworkInterface) => void - selectedToken: Token } & InputBaseProps -const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: NetworkSelectorProps) => { +const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelectorProps) => { const combobox = useCombobox({ onDropdownClose: () => combobox.resetSelectedOption() }) @@ -75,7 +73,6 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, selectedToken }: {networks.map((n) => { - const chainIds = Object.keys(selectedToken.tokenAddressMap) return ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 5944621e..56431bac 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -20,8 +20,8 @@ const Deposit: React.FC = ({ deposit }) => { const smallView = useMediaQuery('(max-width: 1199px)') const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { - from: getLowNetworks(selectedNetworkType).find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', - to: getHighNetworks(selectedNetworkType).find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' + from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', + to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( (token) => token.address === deposit?.tokenAddress diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index c17a3ff7..cf4345d5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -19,8 +19,8 @@ const DepositMobile: React.FC = ({ deposit, isLoading, selec const [isCollapsed, setIsCollapsed] = useState(true) const status = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { - from: getLowNetworks(selectedNetworkType).find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', - to: getHighNetworks(selectedNetworkType).find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' + from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', + to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } const smallView = useMediaQuery('(max-width: 1199px)') diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index a757ea08..366444b8 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -60,7 +60,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() - const {data: messages} = useMessages(connectedAccount, selectedNetworkType) + const {data: messages} = useMessages(connectedAccount, selectedNetworkType || 'Testnet') const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx index 85d46dd1..1b4976cf 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryMobile.tsx @@ -41,7 +41,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { } const HistoryMobile: React.FC = ({}) => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() - const messages = useMessages(connectedAccount, selectedNetworkType) + const messages = useMessages(connectedAccount, selectedNetworkType || 'Testnet') const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 476dd75b..1eaefb6f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react' -import { getHighNetworks, getLowNetworks } from '../../../../constants' +import { getHighNetworks, getLowNetworks, HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' @@ -58,8 +58,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { claim } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) - const lowNetworks = getLowNetworks(selectedNetworkType) - const highNetworks = getHighNetworks(selectedNetworkType) + const lowNetworks = getLowNetworks(selectedNetworkType) || LOW_NETWORKS + const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx index a45a412c..09832d5c 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/walletButton/WalletButton.tsx @@ -21,7 +21,7 @@ const WalletButton: React.FC = () => { const { data: nativeBalance } = useNativeBalance({ account: connectedAccount, - rpc: getNetworks(selectedNetworkType).find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] + rpc: getNetworks(selectedNetworkType)?.find((network) => network.chainId === chainId)?.rpcs[0] || L3_NETWORK.rpcs[0] }) const getTokens = async () => { @@ -45,7 +45,7 @@ const WalletButton: React.FC = () => {
{nativeBalance - ? `${Number(nativeBalance).toFixed(4)} ${getNetworks(selectedNetworkType).find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` + ? `${Number(nativeBalance).toFixed(4)} ${getNetworks(selectedNetworkType)?.find((network) => network.chainId === chainId)?.nativeCurrency?.symbol}` : 'Fetching...'}
diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index f0d6b113..6b99bf10 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -33,7 +33,7 @@ const FaucetView: React.FC = ({}) => { const networks = getNetworks(selectedNetworkType) useEffect(() => { - const targetNetwork = networks.find((n) => n.chainId === faucetTargetChainId) + const targetNetwork = networks?.find((n) => n.chainId === faucetTargetChainId) if (targetNetwork) { setSelectedNetwork(targetNetwork) } diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index ba95dfbb..e56527bc 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -20,8 +20,8 @@ export const useBridgeTransfer = () => { const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId - const destinationRpc = getNetworks(selectedNetworkType).find((n) => n.chainId === destinationChainId)?.rpcs[0] - const originRpc = getNetworks(selectedNetworkType).find((n) => n.chainId === originChainId)?.rpcs[0] + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] const getCachedTransactions = () => { const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) @@ -131,9 +131,9 @@ export const useBridgeTransfer = () => { txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType).find((n) => n.chainId === withdrawal.lowNetworkChainId) + destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.lowNetworkChainId) ?.rpcs[0], - originSignerOrProviderOrRpc: getNetworks(selectedNetworkType).find((n) => n.chainId === withdrawal.highNetworkChainId) + originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.highNetworkChainId) ?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 4a1efe9b..6efe7081 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -45,8 +45,8 @@ export interface L2ToL1MessageStatusResult { const fetchL2ToL1MessageStatus = async (withdrawal: TransactionRecord, selectedNetworkType: NetworkType) => { const { lowNetworkChainId, highNetworkChainId, highNetworkHash, amount, highNetworkTimestamp } = withdrawal - const lowNetwork = getLowNetworks(selectedNetworkType).find((n) => n.chainId === lowNetworkChainId) - const highNetwork = getHighNetworks(selectedNetworkType).find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === highNetworkChainId) if (!highNetwork || !lowNetwork || !highNetworkHash) { return undefined } @@ -117,8 +117,8 @@ const fetchDepositStatus = async (deposit: TransactionRecord, selectedNetworkTyp } } - const lowNetwork = getLowNetworks(selectedNetworkType).find((n) => n.chainId === lowNetworkChainId) - const highNetwork = getHighNetworks(selectedNetworkType).find((n) => n.chainId === highNetworkChainId) + const lowNetwork = getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === lowNetworkChainId) + const highNetwork = getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === highNetworkChainId) if (!lowNetwork || !lowNetworkHash) { return undefined diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index ed40644b..f709cc54 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -1,4 +1,4 @@ -import { getHighNetworks, getLowNetworks } from '../../constants' +import { getHighNetworks, getLowNetworks, HIGH_NETWORKS, LOW_NETWORKS } from '../../constants' import { ethers } from 'ethers' import { NetworkType } from '@/contexts/BlockchainContext' @@ -10,7 +10,7 @@ export const convertToBigNumber = (numberString: string, precision = 18) => { } export const getBlockExplorerUrl = (chainId: number | undefined, selectedNetworkType: NetworkType) => { - const network = [...getLowNetworks(selectedNetworkType), ...getHighNetworks(selectedNetworkType)].find( + const network = [...getLowNetworks(selectedNetworkType) || LOW_NETWORKS, ...getHighNetworks(selectedNetworkType) || HIGH_NETWORKS].find( (n) => n.chainId === chainId ) if (network?.blockExplorerUrls) { @@ -19,7 +19,7 @@ export const getBlockExplorerUrl = (chainId: number | undefined, selectedNetwork } export const getNetwork = (chainId: number, selectedNetworkType: NetworkType) => { - return [...getLowNetworks(selectedNetworkType), ...getHighNetworks(selectedNetworkType)].find( + return [...getLowNetworks(selectedNetworkType) || LOW_NETWORKS, ...getHighNetworks(selectedNetworkType) || HIGH_NETWORKS].find( (n) => n.chainId === chainId ) } From d0699a89b059ec7481970097713be8cebfef636e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 16:04:40 +0000 Subject: [PATCH 178/266] log --- .../src/components/bridge/bridge/BridgeView.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index e7d5ad36..caea0315 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -122,7 +122,7 @@ const BridgeView = ({ const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) - console.log({origin, destinationChainId, chainIds, selectedBridgeToken}) + console.log({originChainId, destinationChainId, chainIds, selectedBridgeToken}) if (!chainIds.includes(String(destinationChainId))) { return From a08518dca4a8aacacf583de574f56522d60c2a80 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 16:32:11 +0000 Subject: [PATCH 179/266] updated sdk --- webapps/world-builder-dashboard/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 0988d27c..78a58775 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,7 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.54", + "game7-bridge-sdk": "^0.0.64", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", From 3c9e5aaeb7ca3748f293198c923350cd524541af Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 19:37:06 +0000 Subject: [PATCH 180/266] added lock file --- .../src/assets/IconInfoCircle.tsx | 2 +- .../src/assets/IconLock.tsx | 15 +++++++++++++++ .../src/contexts/BlockchainContext.tsx | 2 +- .../src/layouts/MainLayout/DesktopSidebar.tsx | 4 ++-- .../src/layouts/MainLayout/MobileSidebar.tsx | 4 ++-- 5 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/assets/IconLock.tsx diff --git a/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx b/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx index 5b1422ad..06ff055a 100644 --- a/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx @@ -27,4 +27,4 @@ const IconInfoCircle = forwardRef>( )) -export default IconInfoCircle +export default IconInfoCircle \ No newline at end of file diff --git a/webapps/world-builder-dashboard/src/assets/IconLock.tsx b/webapps/world-builder-dashboard/src/assets/IconLock.tsx new file mode 100644 index 00000000..ddd94874 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/IconLock.tsx @@ -0,0 +1,15 @@ +import React, { forwardRef } from 'react' + +const IconLock = forwardRef>((props, ref) => ( + + + +)) + +export default IconLock diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 235b40c6..09e7f135 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -115,7 +115,7 @@ export const BlockchainProvider: React.FC = ({ children if (_selectedNetworkType) { setSelectedNetworkType(_selectedNetworkType as NetworkType) } else { - setSelectedNetworkType('Testnet') + setSelectedNetworkType('Mainnet') } }, []) diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index b4561e65..b615b8e7 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -3,7 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' -import IconInfoCircle from '@/assets/IconInfoCircle' +import IconLock from '@/assets/IconLock' import IconLogout from '@/assets/IconLogout' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -45,7 +45,7 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => { ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - + ) : ( <> diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index ce22be74..76db8510 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -5,11 +5,11 @@ import styles from './MobileSidebar.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' import IconHamburgerLanding from '@/assets/IconHamburgerLanding' -import IconInfoCircle from '@/assets/IconInfoCircle' import IconLogoutLarge from '@/assets/IconLogoutLarge' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' +import IconLock from '@/assets/IconLock' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -69,7 +69,7 @@ const MobileSidebar: React.FC = ({ navigationItems }) => { ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - + ) : ( <> From 66e9e90417ebc66e91d2726b0bf8dcb484ed8e29 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 19:58:16 +0000 Subject: [PATCH 181/266] remove useless logs --- .../src/components/bridge/bridge/BridgeView.tsx | 4 +--- .../src/contexts/BlockchainContext.tsx | 3 +++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index caea0315..e66a4337 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -80,7 +80,6 @@ const BridgeView = ({ const allowance = await bridger?.getAllowance(originNetwork.rpcs[0], connectedAccount ?? '') const decimals = tokenInformation?.decimalPlaces ?? 18 - console.log(decimals) const parsedValue = value ? ethers.utils.parseUnits(value, decimals) : ethers.utils.parseEther('0') let approvalFee = ethers.utils.parseEther('0') // Default to zero if no approval needed @@ -122,8 +121,7 @@ const BridgeView = ({ const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) - console.log({originChainId, destinationChainId, chainIds, selectedBridgeToken}) - + if (!chainIds.includes(String(destinationChainId))) { return } diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 09e7f135..7c0caa32 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -15,6 +15,7 @@ import { import { ethers } from 'ethers' import { getTokensForNetwork, Token } from '@/utils/tokens' + interface BlockchainContextType { walletProvider?: ethers.providers.Web3Provider connectedAccount?: string @@ -90,6 +91,7 @@ export const BlockchainProvider: React.FC = ({ children const [selectedBridgeToken, setSelectedBridgeToken] = useState( getTokensForNetwork(DEFAULT_LOW_NETWORK.chainId, connectedAccount)[0] ) + const tokenAddress = '0x5f88d811246222F6CB54266C42cc1310510b9feA' const setSelectedLowNetwork = (network: NetworkInterface) => { @@ -154,6 +156,7 @@ export const BlockchainProvider: React.FC = ({ children } else { setSelectedLowNetwork(DEFAULT_LOW_MAINNET_NETWORK) setSelectedHighNetwork(DEFAULT_HIGH_MAINNET_NETWORK) + } }, [selectedNetworkType]) From 5bfa0f16301d8ae54e693d08b8daad02907cc33f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 20 Nov 2024 20:11:55 +0000 Subject: [PATCH 182/266] Revert "added lock file" This reverts commit 3c9e5aaeb7ca3748f293198c923350cd524541af. --- .../src/assets/IconInfoCircle.tsx | 2 +- .../src/assets/IconLock.tsx | 15 --------------- .../src/contexts/BlockchainContext.tsx | 2 +- .../src/layouts/MainLayout/DesktopSidebar.tsx | 4 ++-- .../src/layouts/MainLayout/MobileSidebar.tsx | 4 ++-- 5 files changed, 6 insertions(+), 21 deletions(-) delete mode 100644 webapps/world-builder-dashboard/src/assets/IconLock.tsx diff --git a/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx b/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx index 06ff055a..5b1422ad 100644 --- a/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx @@ -27,4 +27,4 @@ const IconInfoCircle = forwardRef>( )) -export default IconInfoCircle \ No newline at end of file +export default IconInfoCircle diff --git a/webapps/world-builder-dashboard/src/assets/IconLock.tsx b/webapps/world-builder-dashboard/src/assets/IconLock.tsx deleted file mode 100644 index ddd94874..00000000 --- a/webapps/world-builder-dashboard/src/assets/IconLock.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React, { forwardRef } from 'react' - -const IconLock = forwardRef>((props, ref) => ( - - - -)) - -export default IconLock diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 7c0caa32..f7a0dd50 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -117,7 +117,7 @@ export const BlockchainProvider: React.FC = ({ children if (_selectedNetworkType) { setSelectedNetworkType(_selectedNetworkType as NetworkType) } else { - setSelectedNetworkType('Mainnet') + setSelectedNetworkType('Testnet') } }, []) diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index b615b8e7..b4561e65 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -3,7 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' -import IconLock from '@/assets/IconLock' +import IconInfoCircle from '@/assets/IconInfoCircle' import IconLogout from '@/assets/IconLogout' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -45,7 +45,7 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => { ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - + ) : ( <> diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index 76db8510..ce22be74 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -5,11 +5,11 @@ import styles from './MobileSidebar.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' import IconHamburgerLanding from '@/assets/IconHamburgerLanding' +import IconInfoCircle from '@/assets/IconInfoCircle' import IconLogoutLarge from '@/assets/IconLogoutLarge' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' -import IconLock from '@/assets/IconLock' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -69,7 +69,7 @@ const MobileSidebar: React.FC = ({ navigationItems }) => { ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - + ) : ( <> From 18f36d1ad9fe5805d422dd0899ce4bc905081d44 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 12:29:20 +0000 Subject: [PATCH 183/266] Reapply "added lock file" This reverts commit 5bfa0f16301d8ae54e693d08b8daad02907cc33f. --- .../src/assets/IconInfoCircle.tsx | 2 +- .../src/assets/IconLock.tsx | 15 +++++++++++++++ .../src/contexts/BlockchainContext.tsx | 2 +- .../src/layouts/MainLayout/DesktopSidebar.tsx | 4 ++-- .../src/layouts/MainLayout/MobileSidebar.tsx | 4 ++-- 5 files changed, 21 insertions(+), 6 deletions(-) create mode 100644 webapps/world-builder-dashboard/src/assets/IconLock.tsx diff --git a/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx b/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx index 5b1422ad..06ff055a 100644 --- a/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconInfoCircle.tsx @@ -27,4 +27,4 @@ const IconInfoCircle = forwardRef>( )) -export default IconInfoCircle +export default IconInfoCircle \ No newline at end of file diff --git a/webapps/world-builder-dashboard/src/assets/IconLock.tsx b/webapps/world-builder-dashboard/src/assets/IconLock.tsx new file mode 100644 index 00000000..ddd94874 --- /dev/null +++ b/webapps/world-builder-dashboard/src/assets/IconLock.tsx @@ -0,0 +1,15 @@ +import React, { forwardRef } from 'react' + +const IconLock = forwardRef>((props, ref) => ( + + + +)) + +export default IconLock diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index f7a0dd50..7c0caa32 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -117,7 +117,7 @@ export const BlockchainProvider: React.FC = ({ children if (_selectedNetworkType) { setSelectedNetworkType(_selectedNetworkType as NetworkType) } else { - setSelectedNetworkType('Testnet') + setSelectedNetworkType('Mainnet') } }, []) diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index b4561e65..b615b8e7 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -3,7 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' -import IconInfoCircle from '@/assets/IconInfoCircle' +import IconLock from '@/assets/IconLock' import IconLogout from '@/assets/IconLogout' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -45,7 +45,7 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => { ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - + ) : ( <> diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index ce22be74..76db8510 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -5,11 +5,11 @@ import styles from './MobileSidebar.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' import IconHamburgerLanding from '@/assets/IconHamburgerLanding' -import IconInfoCircle from '@/assets/IconInfoCircle' import IconLogoutLarge from '@/assets/IconLogoutLarge' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' +import IconLock from '@/assets/IconLock' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -69,7 +69,7 @@ const MobileSidebar: React.FC = ({ navigationItems }) => { ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - + ) : ( <> From f73d218cd3c91fcedcf52d6d2fb10b2b7e965eb5 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 13:00:02 +0000 Subject: [PATCH 184/266] faucet tooltip --- .../components/bridge/bridge/ActionButton.tsx | 8 ++++--- .../src/components/bridge/history/Deposit.tsx | 19 ++++++++++++--- .../src/hooks/useBridgeTransfer.ts | 24 +++++++++---------- .../src/hooks/useL2ToL1MessageStatus.ts | 4 ++-- .../src/layouts/MainLayout/DesktopSidebar.tsx | 8 ++++++- .../src/layouts/MainLayout/MainLayout.tsx | 4 +--- 6 files changed, 43 insertions(+), 24 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 671db2e2..0bc743fc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -95,15 +95,17 @@ const ActionButton: React.FC = ({ if (selectedBridgeToken.address != ZERO_ADDRESS) { const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' const allowanceToCheck = ethers.utils.formatUnits(allowance, decimals) - + // approve first - if (Number(allowanceToCheck) < Number(amount)) { + if (Number(allowanceToCheck) < Number(amountToSend)) { + console.log("about to approve") const txApprove = await bridger?.approve(amountToSend, signer) await txApprove.wait() - queryClient.refetchQueries(['estimatedFee']) } } + console.log("approved already") const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) + console.log("transfer .. ?") await tx?.wait() return { type: 'DEPOSIT', diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 56431bac..eb94a16c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -2,10 +2,12 @@ import React from 'react' import { getHighNetworks, getLowNetworks } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' +import { BridgeTransferStatus } from 'game7-bridge-sdk' import { useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useBlockchainContext } from '@/contexts/BlockchainContext' +import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' @@ -26,6 +28,13 @@ const Deposit: React.FC = ({ deposit }) => { const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( (token) => token.address === deposit?.tokenAddress ) + const { returnTransferData } = useBridgeTransfer() + const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) + console.log( + deposit.lowNetworkHash === '0x5dbdde9a6783b3f12a39368f63e1ee6cecb5242b03ac23a0c19c0a624d3970b1' + ? transferStatus + : {} + ) return ( <> {isLoadingStatus && smallView ? ( @@ -50,7 +59,7 @@ const Deposit: React.FC = ({ deposit }) => { >{`${tokenInformation?.decimals ? Number(deposit.amount) / tokenInformation?.decimals : deposit.amount} ${tokenInformation?.symbol}`}
{depositInfo.from}
{depositInfo.to}
- {isLoadingStatus ? ( + {isLoading ? ( <>
Loading
@@ -67,7 +76,9 @@ const Deposit: React.FC = ({ deposit }) => { className={styles.explorerLink} >
- {status?.l2Result?.complete ? ( + {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? (
Completed @@ -86,7 +97,9 @@ const Deposit: React.FC = ({ deposit }) => {
) : (
- {status?.highNetworkTimestamp ? ( + {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( <> {status?.highNetworkTimestamp === undefined ? 'No status found' diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index e56527bc..981caff3 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,4 +1,4 @@ -import { useMutation, useQueryClient } from 'react-query' + import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' import { getNetworks, L1_NETWORK, L2_NETWORK } from '../../constants' @@ -79,17 +79,17 @@ export const useBridgeTransfer = () => { } }, { - placeholderData: () => { - const transactions = getCachedTransactions() - const cachedTransaction = transactions.find((t: any) => - isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - ) - - if (cachedTransaction && cachedTransaction.status !== undefined) { - status = cachedTransaction.status - return { status } - } - }, + // placeholderData: () => { + // const transactions = getCachedTransactions() + // const cachedTransaction = transactions.find((t: any) => + // isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + // ) + + // if (cachedTransaction && cachedTransaction.status !== undefined) { + // status = cachedTransaction.status + // return { status } + // } + // }, staleTime: 2 * 60 * 1000, refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) ? 5 * 60 * 1000 diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 6efe7081..3cefa361 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -147,7 +147,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord, selectedNetworkTyp let l2Result try { - l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations) + l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations, 1) } catch (e) { console.error('Error waiting for child transaction receipt:', { deposit, e }) } @@ -169,7 +169,7 @@ const fetchDepositStatus = async (deposit: TransactionRecord, selectedNetworkTyp export const useDepositStatus = (deposit: TransactionRecord, selectedNetworkType: NetworkType) => { return useQuery(['depositStatus', deposit], () => fetchDepositStatus(deposit, selectedNetworkType), { refetchInterval: 60000 * 3, - staleTime: 2 * 60 * 1000 // 2 minutes + staleTime: 2 * 60 * 1000 }) } diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index b615b8e7..ec91b169 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -3,6 +3,7 @@ import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' +import IconInfoCircle from '@/assets/IconInfoCircle' import IconLock from '@/assets/IconLock' import IconLogout from '@/assets/IconLogout' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' @@ -26,11 +27,12 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => {
{navigationItems.map((item) => (
{ if (item.name === 'documentation' || item.name === 'explorer') { window.open(item.navigateTo, '_blank') - } else { + } else if (!(item.name === 'faucet' && selectedNetworkType === 'Mainnet')) { navigate(item.navigateTo) } }} @@ -44,6 +46,10 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => { {item.name === 'documentation' || item.name === 'explorer' ? ( ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( + + + + ) : item.name === 'faucet' && selectedNetworkType === 'Mainnet' ? ( diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index 0729bc58..7e5e78c0 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -19,7 +19,7 @@ const MainLayout: React.FC = ({}) => { const location = useLocation() const { selectedNetworkType } = useBlockchainContext() - const TESTNET_NAVIGATION_ITEMS = [ + const NAVIGATION_ITEMS = [ { name: 'faucet', navigateTo: '/faucet', @@ -42,8 +42,6 @@ const MainLayout: React.FC = ({}) => { } ] - const MAINNET_NAVIGATION_ITEMS = TESTNET_NAVIGATION_ITEMS.slice(1, TESTNET_NAVIGATION_ITEMS.length) - const NAVIGATION_ITEMS = selectedNetworkType === 'Mainnet' ? MAINNET_NAVIGATION_ITEMS : TESTNET_NAVIGATION_ITEMS const smallView = useMediaQuery('(max-width: 1199px)') return (
From 704e767aa453b2aec321a48338661b5834078f21 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 13:38:05 +0000 Subject: [PATCH 185/266] clean up --- .../src/components/bridge/bridge/ActionButton.tsx | 2 -- .../src/components/bridge/history/Deposit.tsx | 6 +----- .../notifications/NotificationsDropModal.module.css | 2 +- .../notifications/NotificationsDropModal.tsx | 1 + .../src/layouts/MainLayout/MobileSidebar.tsx | 11 ++++++++--- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 0bc743fc..ea5bff16 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -98,12 +98,10 @@ const ActionButton: React.FC = ({ // approve first if (Number(allowanceToCheck) < Number(amountToSend)) { - console.log("about to approve") const txApprove = await bridger?.approve(amountToSend, signer) await txApprove.wait() } } - console.log("approved already") const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) console.log("transfer .. ?") await tx?.wait() diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index eb94a16c..aa19ee97 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -30,11 +30,7 @@ const Deposit: React.FC = ({ deposit }) => { ) const { returnTransferData } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) - console.log( - deposit.lowNetworkHash === '0x5dbdde9a6783b3f12a39368f63e1ee6cecb5242b03ac23a0c19c0a624d3970b1' - ? transferStatus - : {} - ) + return ( <> {isLoadingStatus && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css index bf19dabe..c048165f 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css @@ -233,7 +233,7 @@ } .closeIconMultiple:hover { - stroke: var(--Purple-800, #5925dc); + stroke: #fff; } @media (max-width: 1199px) { diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 1db3cbe7..6d633c2e 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -131,6 +131,7 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN const { setIsDropdownOpened } = useBridgeNotificationsContext() const { selectedNetworkType } = useBlockchainContext() const handleClick = () => { + console.log('clickity?') setIsDropdownOpened(true) } if (!notifications || notifications.length === 0) { diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index 76db8510..7ce0cbd2 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -5,11 +5,12 @@ import styles from './MobileSidebar.module.css' import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' import IconHamburgerLanding from '@/assets/IconHamburgerLanding' +import IconInfoCircle from '@/assets/IconInfoCircle' +import IconLock from '@/assets/IconLock' import IconLogoutLarge from '@/assets/IconLogoutLarge' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' import Game7Logo from '@/layouts/MainLayout/Game7Logo' -import IconLock from '@/assets/IconLock' interface MobileSidebarProps { navigationItems: { name: string; navigateTo: string; icon: ReactNode }[] @@ -54,7 +55,7 @@ const MobileSidebar: React.FC = ({ navigationItems }) => { setIsExpanded(false) if (item.name === 'documentation' || item.name === 'explorer') { window.open(item.navigateTo, '_blank') - } else { + } else if (!(item.name === 'faucet' && selectedNetworkType === 'Mainnet')) { navigate(item.navigateTo) } }} @@ -66,8 +67,12 @@ const MobileSidebar: React.FC = ({ navigationItems }) => {
{item.name === 'documentation' || item.name === 'explorer' ? ( - + ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( + + + + ) : item.name === 'faucet' && selectedNetworkType === 'Mainnet' ? ( From 4abc748e1b8dedc70c7789b3e900310e86859e57 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 19:15:42 +0000 Subject: [PATCH 186/266] Attempt to fix DEV-11 --- .../bridge/bridge/NetworkSelector.tsx | 41 +++++++++++-------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index b9ee7a59..64c5bbef 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -13,7 +13,7 @@ import IconCheck from '@/assets/IconCheck' import IconChevronDown from '@/assets/IconChevronDown' import IconEthereum from '@/assets/IconEthereum' import IconG7T from '@/assets/IconG7T' -import { HighNetworkInterface, NetworkInterface } from '@/contexts/BlockchainContext' +import { HighNetworkInterface, NetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' type NetworkSelectorProps = { networks: NetworkInterface[] @@ -26,6 +26,8 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelecto onDropdownClose: () => combobox.resetSelectedOption() }) + const { selectedLowNetwork, selectedHighNetwork } = useBlockchainContext() + const networkLogo = (chainId: number) => { switch (chainId) { case L1_NETWORK.chainId: @@ -73,23 +75,28 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelecto {networks.map((n) => { - return ( - - -
-
- {networkLogo(n.chainId)} - {n.displayName} + if (selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId) { + return + } + else { + return ( + + +
+
+ {networkLogo(n.chainId)} + {n.displayName} +
+ {n.chainId === selectedNetwork.chainId && }
- {n.chainId === selectedNetwork.chainId && } -
- - - ) + + + ) + } })} From 41ebfaf721ac2f749c03801eff570568140475d2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 19:20:57 +0000 Subject: [PATCH 187/266] fix build --- .../src/components/bridge/bridge/BridgeView.tsx | 4 +++- .../src/components/bridge/bridge/NetworkSelector.tsx | 7 ++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index e66a4337..692bc270 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -121,7 +121,7 @@ const BridgeView = ({ const originChainId = direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId const destinationChainId = direction === 'DEPOSIT' ? selectedHighNetwork.chainId : selectedLowNetwork.chainId const chainIds = Object.keys(selectedBridgeToken.tokenAddressMap) - + if (!chainIds.includes(String(destinationChainId))) { return } @@ -160,6 +160,7 @@ const BridgeView = ({ if ((isSource && direction === 'DEPOSIT') || (!isSource && direction === 'WITHDRAW')) { return ( ) } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 64c5bbef..fecea9ac 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -19,14 +19,15 @@ type NetworkSelectorProps = { networks: NetworkInterface[] selectedNetwork: NetworkInterface onChange: (network: NetworkInterface | HighNetworkInterface) => void + direction: 'DEPOSIT' | 'WITHDRAW' } & InputBaseProps -const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelectorProps) => { +const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: NetworkSelectorProps) => { const combobox = useCombobox({ onDropdownClose: () => combobox.resetSelectedOption() }) - const { selectedLowNetwork, selectedHighNetwork } = useBlockchainContext() + const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() const networkLogo = (chainId: number) => { switch (chainId) { @@ -75,7 +76,7 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork }: NetworkSelecto {networks.map((n) => { - if (selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId) { + if (direction === "DEPOSIT" ? selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId : selectedLowNetwork.chainId !== n.chainId && selectedLowNetwork.chainId === selectedNetwork.chainId) { return } else { From bde8781d751156aad481262af4bbb9e197b1c804 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 20:22:37 +0000 Subject: [PATCH 188/266] padding on options --- .../bridge/bridge/NetworkSelector.module.css | 120 ++++++++++-------- .../bridge/bridge/NetworkSelector.tsx | 39 +++--- 2 files changed, 85 insertions(+), 74 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.module.css b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.module.css index a616bdbe..0ed2c85f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.module.css +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.module.css @@ -1,85 +1,99 @@ .inputBase { - padding: 3px 6px; - align-items: center; - gap: 8px; - align-self: stretch; - - border-radius: 8px; - border: 1px solid var(--Gray-200, #d0d5dd); - background: var(--Base-Container, #ffffff); - - box-shadow: 0 1px 2px 0 rgba(16, 24, 40, 0.05); - color: var(--Gray-700, #344054); - - /* Text sm/Medium */ - font-family: Inter, sans-serif; - font-size: 14px; - font-style: normal; - font-weight: 500; - line-height: 20px; /* 142.857% */ - width: 100%; + padding: 3px 6px; + align-items: center; + gap: 8px; + align-self: stretch; + + border-radius: 8px; + border: 1px solid var(--Gray-200, #d0d5dd); + background: var(--Base-Container, #ffffff); + + box-shadow: 0 1px 2px 0 rgba(16, 24, 40, 0.05); + color: var(--Gray-700, #344054); + + /* Text sm/Medium */ + font-family: Inter, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 20px; /* 142.857% */ + width: 100%; } .inputBase:hover { - background: var(--Gray-25, #FCFCFD); + background: var(--Gray-25, #fcfcfd); } .inputBaseNetworkName { - color: var(--Gray-700, #344054); + color: var(--Gray-700, #344054); } /* Mantine components - !important should be used in every line*/ .dropdown { - padding: 0 !important; - background: var(--Base-White, #FFF) !important; - border-radius: 8px !important; - border: 1px solid var(--Gray-200, #EAECF0) !important; - background: var(--Base-White, #FFF) !important; - - /* Shadow/lg */ - box-shadow: 0 12px 16px -4px rgba(16, 24, 40, 0.08), 0 4px 6px -2px rgba(16, 24, 40, 0.03) !important; + padding: 0 !important; + background: var(--Base-White, #fff) !important; + border-radius: 8px !important; + border: 1px solid var(--Gray-200, #eaecf0) !important; + background: var(--Base-White, #fff) !important; + + /* Shadow/lg */ + box-shadow: + 0 12px 16px -4px rgba(16, 24, 40, 0.08), + 0 4px 6px -2px rgba(16, 24, 40, 0.03) !important; } .options { - padding: 2px 6px !important; + padding: 6px 6px !important; } .option { - padding: 0 !important; - color: var(--Gray-700, #344054) !important; - - /* Text sm/Medium */ - font-size: 14px !important; - font-style: normal !important; - font-weight: 500 !important; - line-height: 20px !important; /* 142.857% */ + padding: 0 !important; + color: var(--Gray-700, #344054) !important; + + /* Text sm/Medium */ + font-size: 14px !important; + font-style: normal !important; + font-weight: 500 !important; + line-height: 20px !important; + border-radius: 8px !important; } -.option:hover { - background-color: var(--Gray-60, #393939) !important; +.optionDisabled { + padding: 0 !important; + color: var(--Gray-700, #344054) !important; + + /* Text sm/Medium */ + font-size: 14px !important; + font-style: normal !important; + font-weight: 500 !important; + line-height: 20px !important; } +.option:hover { + background-color: var(--Gray-60, #393939) !important; +} -.optionContainer, .optionContainerSelected { - display: flex; - padding: 10px 10px 10px 8px; - align-items: center; - gap: 8px; - flex: 1 0 0; +.optionContainer, +.optionContainerSelected { + display: flex; + padding: 10px 10px 10px 8px; + align-items: center; + gap: 8px; + flex: 1 0 0; - border-radius: 6px; + border-radius: 6px; } .optionContainerSelected { - background: var(--Gray-50, #F9FAFB); + background: var(--Gray-50, #f9fafb); } .optionLeftSection { - display: flex; - align-items: center; - gap: 8px; - flex: 1 0 0; + display: flex; + align-items: center; + gap: 8px; + flex: 1 0 0; } .chevron { - stroke: var(--Gray-500, #667085); + stroke: var(--Gray-500, #667085); } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index fecea9ac..9ec32bb8 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -76,28 +76,25 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: Net {networks.map((n) => { - if (direction === "DEPOSIT" ? selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId : selectedLowNetwork.chainId !== n.chainId && selectedLowNetwork.chainId === selectedNetwork.chainId) { - return - } - else { - return ( - - -
-
- {networkLogo(n.chainId)} - {n.displayName} -
- {n.chainId === selectedNetwork.chainId && } + const isDisabled = direction === "DEPOSIT" ? selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId : selectedLowNetwork.chainId !== n.chainId && selectedLowNetwork.chainId === selectedNetwork.chainId + return ( + + +
+
+ {networkLogo(n.chainId)} + {n.displayName}
- - - ) - } + {n.chainId === selectedNetwork.chainId && } +
+
+
+ ) })} From 7a6ce22766da59bfcfae399a35fe06b15ad2239c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 21 Nov 2024 20:32:27 +0000 Subject: [PATCH 189/266] navigate to bridge if on faucet and switch to mainnet --- .../src/components/faucet/FaucetView.tsx | 7 +++++++ .../src/pages/FaucetPage/FaucetPage.tsx | 10 ---------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 6b99bf10..0e525288 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -12,6 +12,7 @@ import { useUISettings } from '@/contexts/UISettingsContext' import { useFaucetAPI } from '@/hooks/useFaucetAPI' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { timeDifferenceInHoursAndMinutes, timeDifferenceInHoursMinutesAndSeconds } from '@/utils/timeFormat' +import { useNavigate } from 'react-router-dom' interface FaucetViewProps {} const FaucetView: React.FC = ({}) => { @@ -28,10 +29,16 @@ const FaucetView: React.FC = ({}) => { const { faucetTargetChainId } = useUISettings() const { refetchNewNotifications } = useBridgeNotificationsContext() const smallView = useMediaQuery('(max-width: 1199px)') + const navigate = useNavigate() const values: AccountType[] = [`External Address`, `Connected Account`] const networks = getNetworks(selectedNetworkType) + if (selectedNetworkType === 'Mainnet') { + navigate('/bridge') + } + + useEffect(() => { const targetNetwork = networks?.find((n) => n.chainId === faucetTargetChainId) if (targetNetwork) { diff --git a/webapps/world-builder-dashboard/src/pages/FaucetPage/FaucetPage.tsx b/webapps/world-builder-dashboard/src/pages/FaucetPage/FaucetPage.tsx index 1e2ac477..64883c34 100644 --- a/webapps/world-builder-dashboard/src/pages/FaucetPage/FaucetPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/FaucetPage/FaucetPage.tsx @@ -42,16 +42,6 @@ const BridgePage = () => {
- {/* TODO: make into component. */} - {/*
-
-
Warning
-
{`This faucet only dispenses ${L3_NATIVE_TOKEN_SYMBOL} tokens. For other tokens, please visit external faucets.`}
-
-
*/} -
From 9bde71e775d3e2455179da2830c44947f56f875c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 10:31:13 +0000 Subject: [PATCH 190/266] removing local tx cache to test raw status retrieval --- .../components/bridge/history/Withdrawal.tsx | 15 ++- .../notifications/NotificationsDropModal.tsx | 1 - .../src/hooks/useBridgeTransfer.ts | 115 +++++++++++------- 3 files changed, 82 insertions(+), 49 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 1eaefb6f..e522d970 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -55,15 +55,18 @@ export const getStatus = ( const Withdrawal: React.FC = ({ withdrawal }) => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { claim } = useBridgeTransfer() + const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) const lowNetworks = getLowNetworks(selectedNetworkType) || LOW_NETWORKS const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) + const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) + console.log(transferStatus) + return ( <> {status?.isLoading && smallView ? ( @@ -81,7 +84,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {status?.isLoading || status?.data === undefined ? ( + {status?.isLoading || transferStatus?.status === undefined ? ( <>
@@ -104,7 +107,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {status?.data && status.data.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus.status === ChildToParentMessageStatus.EXECUTED && ( <>
= ({ withdrawal }) => { )} )} - {status?.data && status.data.status !== ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus.status !== ChildToParentMessageStatus.EXECUTED && ( <>
@@ -270,7 +273,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
- {status?.data && status.data.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( <> )} - {status?.data && status.data.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus && transferStatus.status === ChildToParentMessageStatus.UNCONFIRMED && ( <>
{ - console.log('clickity?') setIsDropdownOpened(true) } if (!notifications || notifications.length === 0) { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 981caff3..63c9a2da 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,4 +1,4 @@ - import { useMutation, useQueryClient } from 'react-query' +import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' import { getNetworks, L1_NETWORK, L2_NETWORK } from '../../constants' @@ -14,7 +14,7 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() - + const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash @@ -23,18 +23,13 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - const getCachedTransactions = () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) - return transactionsString ? JSON.parse(transactionsString) : [] - } + // // If the status is pending and time since last fetched is 2 minutes, fetch again + // const shouldFetchStatus = (cachedTransaction: any) => { + // const isPending = ![2, 6, 9].includes(cachedTransaction?.status) + // const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - // If the status is pending and time since last fetched is 2 minutes, fetch again - const shouldFetchStatus = (cachedTransaction: any) => { - const isPending = ![2, 6, 9].includes(cachedTransaction?.status) - const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - - return isPending && timeSinceLastUpdate > 2 * 60 * 1000 - } + // return isPending && timeSinceLastUpdate > 2 * 60 * 1000 + // } let status: any return useQuery( @@ -50,32 +45,31 @@ export const useBridgeTransfer = () => { try { status = await _bridgeTransfer.getStatus() - const transactions = getCachedTransactions() + // const transactions = getCachedTransactions() - const newTransactions = transactions.map((t: any) => { - const isSameHash = isDeposit - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash + // const newTransactions = transactions.map((t: any) => { + // const isSameHash = isDeposit + // ? t.lowNetworkHash === txRecord.lowNetworkHash + // : t.highNetworkHash === txRecord.highNetworkHash - return isSameHash ? { ...t, status: status?.status, lastUpdated: Date.now() } : t - }) + // return isSameHash ? { ...t, status: status?.status, lastUpdated: Date.now() } : t + // }) - localStorage.setItem( - `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - JSON.stringify(newTransactions) - ) + // localStorage.setItem( + // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + // JSON.stringify(newTransactions) + // ) return status } catch (error) { - const transactions = getCachedTransactions() - const cachedTransaction = transactions.find((t: any) => - isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - ) - - if (cachedTransaction && cachedTransaction.status !== undefined) { - status = cachedTransaction.status - return { status } - } + // const transactions = getCachedTransactions() + // const cachedTransaction = transactions.find((t: any) => + // isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + // ) + // if (cachedTransaction && cachedTransaction.status !== undefined) { + // status = cachedTransaction.status + // return { status } + // } } }, { @@ -91,11 +85,44 @@ export const useBridgeTransfer = () => { // } // }, staleTime: 2 * 60 * 1000, - refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) - ? 5 * 60 * 1000 - : false, + // refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + // ? 5 * 60 * 1000 + // : false, refetchOnWindowFocus: false, - enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + enabled: !!txRecord // && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + } + ) + } + + const getTransactionInputs = ({ txRecord }: UseTransferDataProps) => { + const isDeposit = txRecord.type === 'DEPOSIT' + const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash + const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId + const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] + + let transactionInputs: any + + return useQuery( + ['transactionInputs', txHash], + async () => { + const _bridgeTransfer = new BridgeTransfer({ + txHash: txHash ?? '', + destinationNetworkChainId: destinationChainId ?? 0, + originNetworkChainId: originChainId ?? 0, + destinationSignerOrProviderOrRpc: destinationRpc, + originSignerOrProviderOrRpc: originRpc + }) + + transactionInputs = await _bridgeTransfer.getTransactionInputs() + console.log(transactionInputs) + return transactionInputs + }, + { + staleTime: 2 * 60 * 1000, + refetchOnWindowFocus: false, + enabled: !!txRecord } ) } @@ -125,16 +152,18 @@ export const useBridgeTransfer = () => { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() - + // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.lowNetworkChainId) - ?.rpcs[0], - originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.highNetworkChainId) - ?.rpcs[0] + destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find( + (n) => n.chainId === withdrawal.lowNetworkChainId + )?.rpcs[0], + originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find( + (n) => n.chainId === withdrawal.highNetworkChainId + )?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } @@ -178,7 +207,9 @@ export const useBridgeTransfer = () => { } } ) + return { + getTransactionInputs, returnTransferData, claim } From 8e3026a323ebc6146a323fd4338b183dfdff9b12 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 10:46:48 +0000 Subject: [PATCH 191/266] Revert "removing local tx cache to test raw status retrieval" This reverts commit 9bde71e775d3e2455179da2830c44947f56f875c. --- .../components/bridge/history/Withdrawal.tsx | 15 +-- .../notifications/NotificationsDropModal.tsx | 1 + .../src/hooks/useBridgeTransfer.ts | 115 +++++++----------- 3 files changed, 49 insertions(+), 82 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index e522d970..1eaefb6f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -55,18 +55,15 @@ export const getStatus = ( const Withdrawal: React.FC = ({ withdrawal }) => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { claim, returnTransferData } = useBridgeTransfer() + const { claim } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) const lowNetworks = getLowNetworks(selectedNetworkType) || LOW_NETWORKS const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) - const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) - console.log(transferStatus) - return ( <> {status?.isLoading && smallView ? ( @@ -84,7 +81,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {status?.isLoading || transferStatus?.status === undefined ? ( + {status?.isLoading || status?.data === undefined ? ( <>
@@ -107,7 +104,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {transferStatus && transferStatus.status === ChildToParentMessageStatus.EXECUTED && ( + {status?.data && status.data.status === ChildToParentMessageStatus.EXECUTED && ( <>
= ({ withdrawal }) => { )} )} - {transferStatus && transferStatus.status !== ChildToParentMessageStatus.EXECUTED && ( + {status?.data && status.data.status !== ChildToParentMessageStatus.EXECUTED && ( <>
@@ -273,7 +270,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
- {transferStatus && transferStatus.status === ChildToParentMessageStatus.CONFIRMED && ( + {status?.data && status.data.status === ChildToParentMessageStatus.CONFIRMED && ( <>
)} - {transferStatus && transferStatus.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {status?.data && status.data.status === ChildToParentMessageStatus.UNCONFIRMED && ( <>
{ + console.log('clickity?') setIsDropdownOpened(true) } if (!notifications || notifications.length === 0) { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 63c9a2da..981caff3 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,4 +1,4 @@ -import { useMutation, useQueryClient } from 'react-query' + import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' import { getNetworks, L1_NETWORK, L2_NETWORK } from '../../constants' @@ -14,7 +14,7 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() - + const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash @@ -23,13 +23,18 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - // // If the status is pending and time since last fetched is 2 minutes, fetch again - // const shouldFetchStatus = (cachedTransaction: any) => { - // const isPending = ![2, 6, 9].includes(cachedTransaction?.status) - // const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) + const getCachedTransactions = () => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) + return transactionsString ? JSON.parse(transactionsString) : [] + } - // return isPending && timeSinceLastUpdate > 2 * 60 * 1000 - // } + // If the status is pending and time since last fetched is 2 minutes, fetch again + const shouldFetchStatus = (cachedTransaction: any) => { + const isPending = ![2, 6, 9].includes(cachedTransaction?.status) + const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) + + return isPending && timeSinceLastUpdate > 2 * 60 * 1000 + } let status: any return useQuery( @@ -45,31 +50,32 @@ export const useBridgeTransfer = () => { try { status = await _bridgeTransfer.getStatus() - // const transactions = getCachedTransactions() + const transactions = getCachedTransactions() - // const newTransactions = transactions.map((t: any) => { - // const isSameHash = isDeposit - // ? t.lowNetworkHash === txRecord.lowNetworkHash - // : t.highNetworkHash === txRecord.highNetworkHash + const newTransactions = transactions.map((t: any) => { + const isSameHash = isDeposit + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash - // return isSameHash ? { ...t, status: status?.status, lastUpdated: Date.now() } : t - // }) + return isSameHash ? { ...t, status: status?.status, lastUpdated: Date.now() } : t + }) - // localStorage.setItem( - // `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - // JSON.stringify(newTransactions) - // ) + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(newTransactions) + ) return status } catch (error) { - // const transactions = getCachedTransactions() - // const cachedTransaction = transactions.find((t: any) => - // isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - // ) - // if (cachedTransaction && cachedTransaction.status !== undefined) { - // status = cachedTransaction.status - // return { status } - // } + const transactions = getCachedTransactions() + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + if (cachedTransaction && cachedTransaction.status !== undefined) { + status = cachedTransaction.status + return { status } + } } }, { @@ -85,44 +91,11 @@ export const useBridgeTransfer = () => { // } // }, staleTime: 2 * 60 * 1000, - // refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) - // ? 5 * 60 * 1000 - // : false, + refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + ? 5 * 60 * 1000 + : false, refetchOnWindowFocus: false, - enabled: !!txRecord // && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) - } - ) - } - - const getTransactionInputs = ({ txRecord }: UseTransferDataProps) => { - const isDeposit = txRecord.type === 'DEPOSIT' - const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash - const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId - const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId - const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] - const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - - let transactionInputs: any - - return useQuery( - ['transactionInputs', txHash], - async () => { - const _bridgeTransfer = new BridgeTransfer({ - txHash: txHash ?? '', - destinationNetworkChainId: destinationChainId ?? 0, - originNetworkChainId: originChainId ?? 0, - destinationSignerOrProviderOrRpc: destinationRpc, - originSignerOrProviderOrRpc: originRpc - }) - - transactionInputs = await _bridgeTransfer.getTransactionInputs() - console.log(transactionInputs) - return transactionInputs - }, - { - staleTime: 2 * 60 * 1000, - refetchOnWindowFocus: false, - enabled: !!txRecord + enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) } ) } @@ -152,18 +125,16 @@ export const useBridgeTransfer = () => { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() - + // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find( - (n) => n.chainId === withdrawal.lowNetworkChainId - )?.rpcs[0], - originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find( - (n) => n.chainId === withdrawal.highNetworkChainId - )?.rpcs[0] + destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.lowNetworkChainId) + ?.rpcs[0], + originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.highNetworkChainId) + ?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } @@ -207,9 +178,7 @@ export const useBridgeTransfer = () => { } } ) - return { - getTransactionInputs, returnTransferData, claim } From aec9c8324e84400fae82684fd5adec374c89ac7a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 11:29:17 +0000 Subject: [PATCH 192/266] caching looking better --- .../components/bridge/history/Withdrawal.tsx | 13 ++++++----- .../src/hooks/useBridgeTransfer.ts | 23 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 1eaefb6f..81f69924 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -55,12 +55,13 @@ export const getStatus = ( const Withdrawal: React.FC = ({ withdrawal }) => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { claim } = useBridgeTransfer() + const { claim, returnTransferData } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) const lowNetworks = getLowNetworks(selectedNetworkType) || LOW_NETWORKS const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) + const {data: transferStatus, isLoading} = returnTransferData({txRecord: withdrawal}) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) @@ -81,7 +82,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {status?.isLoading || status?.data === undefined ? ( + {status?.isLoading && isLoading ? ( <>
@@ -104,7 +105,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { ) : ( <> - {status?.data && status.data.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <>
= ({ withdrawal }) => { )} )} - {status?.data && status.data.status !== ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus?.status !== ChildToParentMessageStatus.EXECUTED && ( <>
@@ -270,7 +271,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
- {status?.data && status.data.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( <>
)} - {status?.data && status.data.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( <>
{ } }, { - // placeholderData: () => { - // const transactions = getCachedTransactions() - // const cachedTransaction = transactions.find((t: any) => - // isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - // ) - - // if (cachedTransaction && cachedTransaction.status !== undefined) { - // status = cachedTransaction.status - // return { status } - // } - // }, + placeholderData: () => { + const transactions = getCachedTransactions() + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + if (cachedTransaction && cachedTransaction.status !== undefined) { + status = cachedTransaction.status + console.log(status) + return { status } + } + }, staleTime: 2 * 60 * 1000, refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) ? 5 * 60 * 1000 From 778250271160572bb368c3de50da9af8adf06df9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 11:33:55 +0000 Subject: [PATCH 193/266] change network name --- webapps/world-builder-dashboard/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 2357b68e..86c31be2 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -39,7 +39,7 @@ export const L2_NETWORK: HighNetworkInterface = { export const L3_NETWORK: HighNetworkInterface = { chainId: 13746, name: 'game7Testnet', - displayName: 'Game7 Testnet', + displayName: 'Game7 Sepolia', rpcs: ['https://testnet-rpc.game7.io'], blockExplorerUrls: ['https://testnet.game7.io'], nativeCurrency: { From 57ca174ab5ec7205e5ab692addad91faba6f6e90 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 12:41:05 +0000 Subject: [PATCH 194/266] return of the transfer --- .../src/components/bridge/history/Withdrawal.tsx | 2 +- webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 81f69924..344203b0 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -61,7 +61,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const lowNetworks = getLowNetworks(selectedNetworkType) || LOW_NETWORKS const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) - const {data: transferStatus, isLoading} = returnTransferData({txRecord: withdrawal}) + const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index d89891fd..fe3f3956 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -87,7 +87,6 @@ export const useBridgeTransfer = () => { if (cachedTransaction && cachedTransaction.status !== undefined) { status = cachedTransaction.status - console.log(status) return { status } } }, From 747f2132241b62128210aa458b231860bd1103ab Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 13:27:28 +0000 Subject: [PATCH 195/266] added getTransactionInputs --- .../src/hooks/useBridgeTransfer.ts | 63 +++++++++++++++---- 1 file changed, 52 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index fe3f3956..1402bc9b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,4 +1,4 @@ - import { useMutation, useQueryClient } from 'react-query' +import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' import { getNetworks, L1_NETWORK, L2_NETWORK } from '../../constants' @@ -14,7 +14,7 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() - + const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const isDeposit = txRecord.type === 'DEPOSIT' const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash @@ -33,7 +33,7 @@ export const useBridgeTransfer = () => { const isPending = ![2, 6, 9].includes(cachedTransaction?.status) const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - return isPending && timeSinceLastUpdate > 2 * 60 * 1000 + return isPending && timeSinceLastUpdate > 2 * 60 * 1000 } let status: any @@ -91,9 +91,9 @@ export const useBridgeTransfer = () => { } }, staleTime: 2 * 60 * 1000, - refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) - ? 5 * 60 * 1000 - : false, + // refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + // ? 5 * 60 * 1000 + // : false, refetchOnWindowFocus: false, enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) } @@ -125,16 +125,18 @@ export const useBridgeTransfer = () => { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() - + // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', destinationNetworkChainId: withdrawal.lowNetworkChainId ?? 0, originNetworkChainId: withdrawal.highNetworkChainId ?? 0, - destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.lowNetworkChainId) - ?.rpcs[0], - originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find((n) => n.chainId === withdrawal.highNetworkChainId) - ?.rpcs[0] + destinationSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find( + (n) => n.chainId === withdrawal.lowNetworkChainId + )?.rpcs[0], + originSignerOrProviderOrRpc: getNetworks(selectedNetworkType)?.find( + (n) => n.chainId === withdrawal.highNetworkChainId + )?.rpcs[0] }) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } @@ -146,8 +148,12 @@ export const useBridgeTransfer = () => { `bridge-${connectedAccount}-transactions-${selectedNetworkType}` ) let transactions = transactionsString ? JSON.parse(transactionsString) : [] + console.log('successful transaction') + console.log(res) const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { if (t.highNetworkHash === withdrawal.highNetworkHash) { + console.log('found matching transaction from local data') + console.log(t) return { ...t, completionTimestamp: Date.now() / 1000, @@ -178,7 +184,42 @@ export const useBridgeTransfer = () => { } } ) + + const getTransactionInputs = ({ txRecord }: UseTransferDataProps) => { + const isDeposit = txRecord.type === 'DEPOSIT' + const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash + const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId + const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] + + let transactionInputs: any + + return useQuery( + ['transactionInputs', txHash], + async () => { + const _bridgeTransfer = new BridgeTransfer({ + txHash: txHash ?? '', + destinationNetworkChainId: destinationChainId ?? 0, + originNetworkChainId: originChainId ?? 0, + destinationSignerOrProviderOrRpc: destinationRpc, + originSignerOrProviderOrRpc: originRpc + }) + + transactionInputs = await _bridgeTransfer.getTransactionInputs() + console.log(transactionInputs) + return transactionInputs + }, + { + staleTime: 2 * 60 * 1000, + refetchOnWindowFocus: false, + enabled: !!txRecord + } + ) + } + return { + getTransactionInputs, returnTransferData, claim } From be51280240d55e170481c1fbb72e60b91bd72818 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 17:12:23 +0000 Subject: [PATCH 196/266] tokenInformation?.symbol --- .../src/components/bridge/history/Deposit.tsx | 2 +- .../components/bridge/history/Withdrawal.tsx | 2 ++ .../notifications/NotificationsDropModal.tsx | 1 - .../src/hooks/useBridgeTransfer.ts | 22 +++++++++---------- 4 files changed, 13 insertions(+), 14 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index aa19ee97..07cb0789 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -55,7 +55,7 @@ const Deposit: React.FC = ({ deposit }) => { >{`${tokenInformation?.decimals ? Number(deposit.amount) / tokenInformation?.decimals : deposit.amount} ${tokenInformation?.symbol}`}
{depositInfo.from}
{depositInfo.to}
- {isLoading ? ( + {isLoading && isLoadingStatus ? ( <>
Loading
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 344203b0..6dc71f09 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -65,6 +65,8 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) + // const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) + return ( <> {status?.isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 6d633c2e..1db3cbe7 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -131,7 +131,6 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN const { setIsDropdownOpened } = useBridgeNotificationsContext() const { selectedNetworkType } = useBlockchainContext() const handleClick = () => { - console.log('clickity?') setIsDropdownOpened(true) } if (!notifications || notifications.length === 0) { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 1402bc9b..8621cdf8 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -90,10 +90,10 @@ export const useBridgeTransfer = () => { return { status } } }, - staleTime: 2 * 60 * 1000, - // refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) - // ? 5 * 60 * 1000 - // : false, + staleTime: 1 * 60 * 1000, + refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + ? 5 * 60 * 1000 + : false, refetchOnWindowFocus: false, enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) } @@ -112,20 +112,21 @@ export const useBridgeTransfer = () => { } const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK - + console.log(targetChain) let provider if (window.ethereum) { provider = new ethers.providers.Web3Provider(window.ethereum) const currentChain = await provider.getNetwork() if (currentChain.chainId !== targetChain.chainId) { + console.log('about to switch') await switchChain(targetChain) + console.log('switching?') provider = new ethers.providers.Web3Provider(window.ethereum) //refresh provider } } else { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() - // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', @@ -138,6 +139,7 @@ export const useBridgeTransfer = () => { (n) => n.chainId === withdrawal.highNetworkChainId )?.rpcs[0] }) + const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } }, @@ -148,12 +150,8 @@ export const useBridgeTransfer = () => { `bridge-${connectedAccount}-transactions-${selectedNetworkType}` ) let transactions = transactionsString ? JSON.parse(transactionsString) : [] - console.log('successful transaction') - console.log(res) const newTransactions: TransactionRecord[] = transactions.map((t: TransactionRecord) => { if (t.highNetworkHash === withdrawal.highNetworkHash) { - console.log('found matching transaction from local data') - console.log(t) return { ...t, completionTimestamp: Date.now() / 1000, @@ -163,6 +161,7 @@ export const useBridgeTransfer = () => { status: BridgeTransferStatus.WITHDRAW_EXECUTED } } + console.log("couldn't find the transaction..") return { ...t } }) localStorage.setItem( @@ -173,7 +172,7 @@ export const useBridgeTransfer = () => { console.log(e) } refetchNewNotifications(connectedAccount ?? '') - queryClient.refetchQueries(['transferData', withdrawal]) + queryClient.refetchQueries(['transferData', withdrawal?.highNetworkHash]) queryClient.refetchQueries(['incomingMessages']) queryClient.refetchQueries(['ERC20Balance']) queryClient.refetchQueries(['nativeBalance']) @@ -207,7 +206,6 @@ export const useBridgeTransfer = () => { }) transactionInputs = await _bridgeTransfer.getTransactionInputs() - console.log(transactionInputs) return transactionInputs }, { From f11d1846257dffebe68a79320ccd8aaa264ae1a3 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 17:30:24 +0000 Subject: [PATCH 197/266] fix tx hash return --- .../src/hooks/useBridgeTransfer.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 8621cdf8..19ffa541 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -32,7 +32,7 @@ export const useBridgeTransfer = () => { const shouldFetchStatus = (cachedTransaction: any) => { const isPending = ![2, 6, 9].includes(cachedTransaction?.status) const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - + console.log({isPending, cachedTransaction}) return isPending && timeSinceLastUpdate > 2 * 60 * 1000 } @@ -91,7 +91,11 @@ export const useBridgeTransfer = () => { } }, staleTime: 1 * 60 * 1000, - refetchInterval: shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + refetchInterval: shouldFetchStatus( + getCachedTransactions().find((t: TransactionRecord) => + t.type === 'DEPOSIT' ? t.lowNetworkHash === txHash : t.highNetworkHash === txHash + ) + ) ? 5 * 60 * 1000 : false, refetchOnWindowFocus: false, From b33ff34eb09290f727b20fa76de8eeb58ec3e9f8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 17:56:23 +0000 Subject: [PATCH 198/266] caching update --- .../src/components/bridge/history/Deposit.tsx | 2 +- .../src/components/bridge/history/HistoryDesktop.tsx | 3 ++- .../world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 5 ++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 07cb0789..6b0bfce4 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -55,7 +55,7 @@ const Deposit: React.FC = ({ deposit }) => { >{`${tokenInformation?.decimals ? Number(deposit.amount) / tokenInformation?.decimals : deposit.amount} ${tokenInformation?.symbol}`}
{depositInfo.from}
{depositInfo.to}
- {isLoading && isLoadingStatus ? ( + {isLoading || transferStatus?.status === undefined || isLoadingStatus ? ( <>
Loading
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 366444b8..5c06b027 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -71,7 +71,8 @@ const HistoryDesktop: React.FC = () => { const localTransactions = messages || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) - + console.log(formattedApiTransactions) + console.log(combinedTransactions) // Retrieve existing transactions from localStorage const storedTransactionsString = localStorage.getItem( `bridge-${connectedAccount}-transactions-${selectedNetworkType}` diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 19ffa541..6da4470b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -32,8 +32,7 @@ export const useBridgeTransfer = () => { const shouldFetchStatus = (cachedTransaction: any) => { const isPending = ![2, 6, 9].includes(cachedTransaction?.status) const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - console.log({isPending, cachedTransaction}) - return isPending && timeSinceLastUpdate > 2 * 60 * 1000 + return isPending && timeSinceLastUpdate > 1 * 60 * 1000 } let status: any @@ -96,7 +95,7 @@ export const useBridgeTransfer = () => { t.type === 'DEPOSIT' ? t.lowNetworkHash === txHash : t.highNetworkHash === txHash ) ) - ? 5 * 60 * 1000 + ? 1 * 60 * 1000 : false, refetchOnWindowFocus: false, enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) From 77b18e4210dc867fc226c2f2bde2baf791112fb7 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 18:27:08 +0000 Subject: [PATCH 199/266] split last 2 columns in deposit --- .../src/components/bridge/history/Deposit.tsx | 69 +++++++++---------- .../components/bridge/history/Withdrawal.tsx | 4 +- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 6b0bfce4..277febfe 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -20,7 +20,6 @@ interface DepositProps { const Deposit: React.FC = ({ deposit }) => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' @@ -28,6 +27,8 @@ const Deposit: React.FC = ({ deposit }) => { const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( (token) => token.address === deposit?.tokenAddress ) + + const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit, selectedNetworkType) const { returnTransferData } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) @@ -55,17 +56,13 @@ const Deposit: React.FC = ({ deposit }) => { >{`${tokenInformation?.decimals ? Number(deposit.amount) / tokenInformation?.decimals : deposit.amount} ${tokenInformation?.symbol}`}
{depositInfo.from}
{depositInfo.to}
- {isLoading || transferStatus?.status === undefined || isLoadingStatus ? ( - <> + <> + {/* First column */} + {isLoading || transferStatus?.status === undefined ? (
Loading
-
-
Loading
-
- - ) : ( - <> + ) : (
= ({ deposit }) => { {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( -
- Completed - -
+
Completed
) : ( -
- Pending - -
+
Pending
)}
- {isLoadingStatus ? ( -
-
Loading
-
- ) : ( -
- {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( - <> - {status?.highNetworkTimestamp === undefined - ? 'No status found' - : timeAgo(status?.highNetworkTimestamp)} - - ) : ( - <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} - )} -
- )} - - )} + )} + + {/* Second column */} + {isLoadingStatus ? ( +
+
Loading
+
+ ) : ( +
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( + <> + {status?.highNetworkTimestamp === undefined + ? 'No status found' + : timeAgo(status?.highNetworkTimestamp)} + + ) : ( + <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} + )} +
+ )} + )} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 6dc71f09..0c78a0ab 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -66,7 +66,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { (token) => token.address === withdrawal?.tokenAddress ) // const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) - + return ( <> {status?.isLoading && smallView ? ( @@ -84,7 +84,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {status?.isLoading && isLoading ? ( + {status?.isLoading || isLoading ? ( <>
From 4a078d9eb1cae2067c029fdb7b578d7ab7575b79 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 22 Nov 2024 18:31:59 +0000 Subject: [PATCH 200/266] update split columns --- .../src/components/bridge/history/Deposit.tsx | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 277febfe..4855cdfc 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -72,16 +72,22 @@ const Deposit: React.FC = ({ deposit }) => { {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( -
Completed
+
+ Completed + +
) : ( -
Pending
+
+ Pending + +
)}
)} {/* Second column */} - {isLoadingStatus ? ( + {isLoading || transferStatus?.status === undefined || isLoadingStatus ? (
Loading
From 0b5cb3885c3c84c10d03d080f52091a6ffcc0676 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Sat, 23 Nov 2024 01:43:47 +0000 Subject: [PATCH 201/266] major progress with Withdrawal caching --- .../components/bridge/history/Withdrawal.tsx | 393 +++++++++--------- 1 file changed, 196 insertions(+), 197 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 0c78a0ab..c1e29054 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -65,6 +65,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) + console.log(transferStatus?.status) // const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) return ( @@ -84,236 +85,234 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {status?.isLoading || isLoading ? ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <> -
-
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {collapseExecuted && } +
setCollapseExecuted(!collapseExecuted)}> Withdraw
-
{timeAgo(withdrawal.highNetworkTimestamp)}
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {timeAgo(withdrawal?.highNetworkTimestamp)} +
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
-
-
Loading
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {status?.data?.from ?? ''}
-
-
Loading
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {status?.data?.to ?? ''}
- - ) : ( - <> - {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( - <> -
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {collapseExecuted && } -
setCollapseExecuted(!collapseExecuted)}> - - Withdraw -
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + +
setCollapseExecuted(!collapseExecuted)}> + Completed +
-
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > +
{timeAgo(withdrawal?.completionTimestamp)}
+
+ {collapseExecuted && ( + <> +
+
Initiate
+
{timeAgo(withdrawal?.highNetworkTimestamp)}
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} + className={styles.gridItemInitiate} >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {status?.data?.from ?? ''} +
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {status?.data?.to ?? ''} +
+
{timeAgo(withdrawal?.completionTimestamp)}
+
+
+
Finalize
+
{timeAgo(withdrawal?.completionTimestamp)}
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > + className={styles.gridItemInitiate} + >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+
- -
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > -
{timeAgo(withdrawal?.completionTimestamp)}
+
+
{timeAgo(withdrawal?.completionTimestamp)}
+
+ + )} + + )} + {(transferStatus?.status !== ChildToParentMessageStatus.EXECUTED || + transferStatus?.status === undefined) && ( + <> +
+
+ + Withdraw +
+
+
{timeAgo(withdrawal.highNetworkTimestamp)}
+
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+ {(status?.isLoading || isLoading) && ( + <> +
+
Loading
+
+
+
Loading
- {collapseExecuted && ( - <> -
-
Initiate
-
-
{timeAgo(withdrawal?.highNetworkTimestamp)}
-
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
- -
-
{timeAgo(withdrawal?.completionTimestamp)}
-
-
-
Finalize
-
-
{timeAgo(withdrawal?.completionTimestamp)}
-
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
- -
-
{timeAgo(withdrawal?.completionTimestamp)}
-
- - )} )} - {transferStatus && transferStatus?.status !== ChildToParentMessageStatus.EXECUTED && ( + {transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( <> -
-
- - Withdraw -
+
-
{timeAgo(status?.data?.timestamp)}
-
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
- {transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( - <> -
-
- -
- - )} - {transferStatus && transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( - <> - +
+ +
+ + )} -
-
{ETA(withdrawal?.highNetworkTimestamp, withdrawal.challengePeriod)} left
-
- - )} + {transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + <> +
+ {status?.isLoading ? ( +
Loading...
+ ) : ( + +
+ Pending + +
+
+ )} +
+
+
{ETA(withdrawal?.highNetworkTimestamp, withdrawal.challengePeriod)} left
+
)} From d99a66853e9503b1c5bb35821048989cf2766c73 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 10:17:54 +0000 Subject: [PATCH 202/266] Revert "major progress with Withdrawal caching" This reverts commit 0b5cb3885c3c84c10d03d080f52091a6ffcc0676. --- .../components/bridge/history/Withdrawal.tsx | 393 +++++++++--------- 1 file changed, 197 insertions(+), 196 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index c1e29054..0c78a0ab 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -65,7 +65,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) - console.log(transferStatus?.status) // const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) return ( @@ -85,234 +84,236 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + {status?.isLoading || isLoading ? ( <> -
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {collapseExecuted && } -
setCollapseExecuted(!collapseExecuted)}> +
+
Withdraw
+
{timeAgo(withdrawal.highNetworkTimestamp)}
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {timeAgo(withdrawal?.highNetworkTimestamp)} -
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {status?.data?.from ?? ''} -
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - {status?.data?.to ?? ''} -
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > - -
setCollapseExecuted(!collapseExecuted)}> - Completed - -
-
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+
+
Loading
-
setCollapseExecuted(!collapseExecuted)} - style={{ - cursor: 'pointer', - backgroundColor: hovered ? '#393939' : 'initial' - }} - onMouseEnter={() => setHovered(true)} - onMouseLeave={() => setHovered(false)} - > -
{timeAgo(withdrawal?.completionTimestamp)}
+
+
Loading
- {collapseExecuted && ( + + ) : ( + <> + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( <> -
-
Initiate
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {collapseExecuted && } +
setCollapseExecuted(!collapseExecuted)}> + + Withdraw +
-
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
-
- -
- Completed - -
-
+ className={styles.gridItem} + onClick={() => setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {timeAgo(withdrawal?.highNetworkTimestamp)}
-
-
{timeAgo(withdrawal?.completionTimestamp)}
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {status?.data?.from ?? ''}
-
-
Finalize
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > + {status?.data?.to ?? ''}
-
{timeAgo(withdrawal?.completionTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
-
+ className={styles.gridItem} + onClick={() => setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > - -
-
{timeAgo(withdrawal?.completionTimestamp)}
-
- - )} - - )} - {(transferStatus?.status !== ChildToParentMessageStatus.EXECUTED || - transferStatus?.status === undefined) && ( - <> -
-
- - Withdraw -
-
-
{timeAgo(withdrawal.highNetworkTimestamp)}
-
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
-
{status?.data?.from ?? ''}
-
{status?.data?.to ?? ''}
- {(status?.isLoading || isLoading) && ( - <> -
-
Loading
-
-
-
Loading
+
setCollapseExecuted(!collapseExecuted)} + style={{ + cursor: 'pointer', + backgroundColor: hovered ? '#393939' : 'initial' + }} + onMouseEnter={() => setHovered(true)} + onMouseLeave={() => setHovered(false)} + > +
{timeAgo(withdrawal?.completionTimestamp)}
+ {collapseExecuted && ( + <> +
+
Initiate
+
+
{timeAgo(withdrawal?.highNetworkTimestamp)}
+
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+ +
+
{timeAgo(withdrawal?.completionTimestamp)}
+
+
+
Finalize
+
+
{timeAgo(withdrawal?.completionTimestamp)}
+
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+ +
+
{timeAgo(withdrawal?.completionTimestamp)}
+
+ + )} )} - {transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus?.status !== ChildToParentMessageStatus.EXECUTED && ( <> -
- {claim.isLoading && !claim.isSuccess ? ( -
Loading...
- ) : ( - -
- Claimable - -
-
- )} -
-
- +
+
+ + Withdraw +
- - )} +
{timeAgo(status?.data?.timestamp)}
+
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+
{status?.data?.from ?? ''}
+
{status?.data?.to ?? ''}
+ {transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( + <> + +
+ +
+ + )} + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + <> + - {transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( - <> -
- {status?.isLoading ? ( -
Loading...
- ) : ( - -
- Pending - -
-
- )} -
-
-
{ETA(withdrawal?.highNetworkTimestamp, withdrawal.challengePeriod)} left
-
+
+
{ETA(withdrawal?.highNetworkTimestamp, withdrawal.challengePeriod)} left
+
+ + )} )} From 18518a03b7de2cc1859ab5e2641559d7ac512e88 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 10:59:35 +0000 Subject: [PATCH 203/266] getTransactionInputs update --- .../components/bridge/bridge/ActionButton.tsx | 1 - .../components/bridge/history/Withdrawal.tsx | 14 +++++------ .../src/hooks/useBridgeTransfer.ts | 23 ++++++++++++++++--- 3 files changed, 27 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index ea5bff16..4333576e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -103,7 +103,6 @@ const ActionButton: React.FC = ({ } } const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) - console.log("transfer .. ?") await tx?.wait() return { type: 'DEPOSIT', diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 0c78a0ab..1611240c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -55,7 +55,7 @@ export const getStatus = ( const Withdrawal: React.FC = ({ withdrawal }) => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') - const { claim, returnTransferData } = useBridgeTransfer() + const { claim, returnTransferData, getTransactionInputs } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) const [hovered, setHovered] = useState(false) const lowNetworks = getLowNetworks(selectedNetworkType) || LOW_NETWORKS @@ -65,7 +65,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( (token) => token.address === withdrawal?.tokenAddress ) - // const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) + const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) return ( <> @@ -95,7 +95,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -147,7 +147,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { }} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} - >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
setCollapseExecuted(!collapseExecuted)} @@ -213,7 +213,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -237,7 +237,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.completionTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -270,7 +270,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status?.data?.timestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${tokenInformation?.symbol}`}
+ >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
{transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 6da4470b..6b6a55fd 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -115,7 +115,6 @@ export const useBridgeTransfer = () => { } const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK - console.log(targetChain) let provider if (window.ethereum) { provider = new ethers.providers.Web3Provider(window.ethereum) @@ -194,12 +193,28 @@ export const useBridgeTransfer = () => { const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] + const storageKey = `transaction-inputs-${connectedAccount}` - let transactionInputs: any + const getCachedTransactionInputs = () => { + const cachedData = localStorage.getItem(storageKey) + if (!cachedData) return null + const cachedTransactions = JSON.parse(cachedData) + return cachedTransactions[txHash ?? ''] || null + } + + const saveTransactionInputsToCache = (inputs: any) => { + localStorage.setItem(`transaction-inputs-${connectedAccount}`, JSON.stringify(inputs)) + } return useQuery( ['transactionInputs', txHash], async () => { + const cachedTransactionInputs = getCachedTransactionInputs() + + if (cachedTransactionInputs) { + return cachedTransactionInputs + } + const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -208,7 +223,9 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc }) - transactionInputs = await _bridgeTransfer.getTransactionInputs() + const transactionInputs = await _bridgeTransfer.getTransactionInputs() + saveTransactionInputsToCache(transactionInputs) + return transactionInputs }, { From 446717ddd526736f6b94b2da5bde193683d77d85 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 12:44:30 +0000 Subject: [PATCH 204/266] caching tx inputs --- .../components/bridge/history/Withdrawal.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 139 ++++++++++++------ 2 files changed, 97 insertions(+), 44 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 1611240c..c93ada86 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -84,7 +84,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { /> ) : ( <> - {status?.isLoading || isLoading ? ( + {status?.isLoading || isLoading || transferStatus === undefined ? ( <>
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 6b6a55fd..7ccff15e 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -28,14 +28,34 @@ export const useBridgeTransfer = () => { return transactionsString ? JSON.parse(transactionsString) : [] } - // If the status is pending and time since last fetched is 2 minutes, fetch again + // Retry function with exponential backoff for handling 429 errors + const retryWithExponentialBackoff = async (fn: () => Promise, retries: number = 5, delay: number = 1000) => { + let attempt = 0 + + while (attempt < retries) { + try { + return await fn() + } catch (error: any) { + if (error?.response?.status === 429 && attempt < retries - 1) { + const retryDelay = delay * 2 ** attempt + await new Promise((resolve) => setTimeout(resolve, retryDelay)) + attempt++ + } else { + throw error // Rethrow error if not 429 or max retries reached + } + } + } + } + + // If the status is pending and time since last fetched is > 2 minutes, fetch again const shouldFetchStatus = (cachedTransaction: any) => { - const isPending = ![2, 6, 9].includes(cachedTransaction?.status) + const isPending = ![2, 6, 9].includes(cachedTransaction?.status) // Add actual pending statuses const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - return isPending && timeSinceLastUpdate > 1 * 60 * 1000 + return isPending && timeSinceLastUpdate > 1 * 60 * 1000 // Adjust timing as needed } let status: any + return useQuery( ['transferData', txHash], async () => { @@ -48,9 +68,12 @@ export const useBridgeTransfer = () => { }) try { - status = await _bridgeTransfer.getStatus() + // Fetch status with retry logic + status = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getStatus()) + const transactions = getCachedTransactions() + // Update the cache with the latest status const newTransactions = transactions.map((t: any) => { const isSameHash = isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash @@ -66,6 +89,9 @@ export const useBridgeTransfer = () => { return status } catch (error) { + console.error('Error fetching status:', error) + + // Fallback to cached status if available const transactions = getCachedTransactions() const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash @@ -73,11 +99,14 @@ export const useBridgeTransfer = () => { if (cachedTransaction && cachedTransaction.status !== undefined) { status = cachedTransaction.status - return { status } + return { status } // Return cached status } + + throw error // Re-throw error if no cache } }, { + // Placeholder data from cache placeholderData: () => { const transactions = getCachedTransactions() const cachedTransaction = transactions.find((t: any) => @@ -89,16 +118,17 @@ export const useBridgeTransfer = () => { return { status } } }, - staleTime: 1 * 60 * 1000, + staleTime: 2 * 60 * 1000, // Data is considered fresh for 2 minutes refetchInterval: shouldFetchStatus( - getCachedTransactions().find((t: TransactionRecord) => + getCachedTransactions().find((t: any) => t.type === 'DEPOSIT' ? t.lowNetworkHash === txHash : t.highNetworkHash === txHash ) ) ? 1 * 60 * 1000 : false, refetchOnWindowFocus: false, - enabled: !!txRecord && shouldFetchStatus(getCachedTransactions().find((t: any) => t.txHash === txHash)) + enabled: !!txRecord, + // retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 2000) } ) } @@ -187,55 +217,78 @@ export const useBridgeTransfer = () => { ) const getTransactionInputs = ({ txRecord }: UseTransferDataProps) => { - const isDeposit = txRecord.type === 'DEPOSIT' - const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash - const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId - const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId - const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] - const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - const storageKey = `transaction-inputs-${connectedAccount}` - + const isDeposit = txRecord.type === 'DEPOSIT'; + const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash; + const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId; + const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId; + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0]; + const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0]; + const storageKey = `transaction-inputs-${connectedAccount}`; + + // Retrieve cached transaction inputs from localStorage const getCachedTransactionInputs = () => { - const cachedData = localStorage.getItem(storageKey) - if (!cachedData) return null - const cachedTransactions = JSON.parse(cachedData) - return cachedTransactions[txHash ?? ''] || null - } - - const saveTransactionInputsToCache = (inputs: any) => { - localStorage.setItem(`transaction-inputs-${connectedAccount}`, JSON.stringify(inputs)) - } - + const cachedData = localStorage.getItem(storageKey); + if (!cachedData) return null; + + const cachedTransactions = JSON.parse(cachedData); + + // Return the specific transaction input based on txHash + return cachedTransactions.find((input: any) => input.txHash === txHash) || null; + }; + + // Save transaction inputs to localStorage as an array + const saveTransactionInputsToCache = (newInput: any) => { + const cachedData = localStorage.getItem(storageKey); + const cachedTransactions = cachedData ? JSON.parse(cachedData) : []; + + // Check if the transaction already exists in the array + const updatedTransactions = cachedTransactions.some((input: any) => input.txHash === newInput.txHash) + ? cachedTransactions.map((input: any) => + input.txHash === newInput.txHash ? { ...input, ...newInput } : input + ) + : [...cachedTransactions, newInput]; // Add new input if not found + + // Save updated transactions back to localStorage + localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)); + }; + + // Use React Query to fetch or cache transaction inputs return useQuery( ['transactionInputs', txHash], async () => { - const cachedTransactionInputs = getCachedTransactionInputs() - + const cachedTransactionInputs = getCachedTransactionInputs(); + + // If found in cache, return the cached data if (cachedTransactionInputs) { - return cachedTransactionInputs + return cachedTransactionInputs; } - + + // Otherwise, fetch transaction inputs from the bridge transfer instance const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, originNetworkChainId: originChainId ?? 0, destinationSignerOrProviderOrRpc: destinationRpc, - originSignerOrProviderOrRpc: originRpc - }) - - const transactionInputs = await _bridgeTransfer.getTransactionInputs() - saveTransactionInputsToCache(transactionInputs) - - return transactionInputs + originSignerOrProviderOrRpc: originRpc, + }); + + const transactionInputs = await _bridgeTransfer.getTransactionInputs(); + + // Save the fetched transaction inputs to cache + saveTransactionInputsToCache({ txHash, ...transactionInputs }); + + return transactionInputs; }, { - staleTime: 2 * 60 * 1000, - refetchOnWindowFocus: false, - enabled: !!txRecord + placeholderData: () => { + return getCachedTransactionInputs() + }, + staleTime: 2 * 60 * 1000, // Data is considered fresh for 2 minutes + refetchOnWindowFocus: false, // Disable refetching on window focus + enabled: !!txRecord, // Ensure the query only runs when txRecord exists } - ) - } - + ); + }; return { getTransactionInputs, returnTransferData, From 5b1806eec7a0b1b507071fd1ef539b387f0c13f4 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 13:59:31 +0000 Subject: [PATCH 205/266] caching and token decimals looking grreat --- .../src/components/bridge/history/Deposit.tsx | 12 ++-- .../bridge/history/HistoryDesktop.tsx | 2 - .../components/bridge/history/Withdrawal.tsx | 8 ++- .../src/hooks/useBridgeTransfer.ts | 56 +++++++++---------- 4 files changed, 40 insertions(+), 38 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 4855cdfc..8d33d39c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -2,6 +2,7 @@ import React from 'react' import { getHighNetworks, getLowNetworks } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' +import { ethers } from 'ethers' import { BridgeTransferStatus } from 'game7-bridge-sdk' import { useMediaQuery } from 'summon-ui/mantine' import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' @@ -24,13 +25,14 @@ const Deposit: React.FC = ({ deposit }) => { from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } - const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( - (token) => token.address === deposit?.tokenAddress - ) const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit, selectedNetworkType) - const { returnTransferData } = useBridgeTransfer() + const { returnTransferData, getTransactionInputs } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) + const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) + const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( + (token) => token.address === transactionInputs?.tokenOriginAddress + ) return ( <> @@ -53,7 +55,7 @@ const Deposit: React.FC = ({ deposit }) => {
{timeAgo(deposit.lowNetworkTimestamp)}
{`${tokenInformation?.decimals ? Number(deposit.amount) / tokenInformation?.decimals : deposit.amount} ${tokenInformation?.symbol}`}
+ >{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : deposit.amount} ${transactionInputs?.tokenSymbol}`}
{depositInfo.from}
{depositInfo.to}
<> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 5c06b027..3e54f24b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -71,8 +71,6 @@ const HistoryDesktop: React.FC = () => { const localTransactions = messages || [] const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) - console.log(formattedApiTransactions) - console.log(combinedTransactions) // Retrieve existing transactions from localStorage const storedTransactionsString = localStorage.getItem( `bridge-${connectedAccount}-transactions-${selectedNetworkType}` diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index c93ada86..d0e33fc5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -1,6 +1,7 @@ import React, { useState } from 'react' import { getHighNetworks, getLowNetworks, HIGH_NETWORKS, LOW_NETWORKS } from '../../../../constants' import styles from './WithdrawTransactions.module.css' +import { ethers } from 'ethers' import IconArrowNarrowUp from '@/assets/IconArrowNarrowUp' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompleted from '@/assets/IconWithdrawalNodeCompleted' @@ -62,10 +63,11 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) + + const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( - (token) => token.address === withdrawal?.tokenAddress + (token) => token.address === transactionInputs?.tokenAddress ) - const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) return ( <> @@ -147,7 +149,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { }} onMouseEnter={() => setHovered(true)} onMouseLeave={() => setHovered(false)} - >{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
+ >{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
setCollapseExecuted(!collapseExecuted)} diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 7ccff15e..283fb208 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -217,50 +217,48 @@ export const useBridgeTransfer = () => { ) const getTransactionInputs = ({ txRecord }: UseTransferDataProps) => { - const isDeposit = txRecord.type === 'DEPOSIT'; - const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash; - const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId; - const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId; - const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0]; - const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0]; - const storageKey = `transaction-inputs-${connectedAccount}`; + const isDeposit = txRecord.type === 'DEPOSIT' + const txHash = isDeposit ? txRecord.lowNetworkHash : txRecord.highNetworkHash + const destinationChainId = isDeposit ? txRecord.highNetworkChainId : txRecord.lowNetworkChainId + const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] + const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] + const storageKey = `transaction-inputs-${connectedAccount}` // Retrieve cached transaction inputs from localStorage const getCachedTransactionInputs = () => { - const cachedData = localStorage.getItem(storageKey); - if (!cachedData) return null; + const cachedData = localStorage.getItem(storageKey) + if (!cachedData) return null - const cachedTransactions = JSON.parse(cachedData); + const cachedTransactions = JSON.parse(cachedData) // Return the specific transaction input based on txHash - return cachedTransactions.find((input: any) => input.txHash === txHash) || null; - }; + return cachedTransactions.find((input: any) => input.txHash === txHash) || null + } // Save transaction inputs to localStorage as an array const saveTransactionInputsToCache = (newInput: any) => { - const cachedData = localStorage.getItem(storageKey); - const cachedTransactions = cachedData ? JSON.parse(cachedData) : []; + const cachedData = localStorage.getItem(storageKey) + const cachedTransactions = cachedData ? JSON.parse(cachedData) : [] - // Check if the transaction already exists in the array const updatedTransactions = cachedTransactions.some((input: any) => input.txHash === newInput.txHash) ? cachedTransactions.map((input: any) => input.txHash === newInput.txHash ? { ...input, ...newInput } : input ) - : [...cachedTransactions, newInput]; // Add new input if not found + : [...cachedTransactions, newInput] - // Save updated transactions back to localStorage - localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)); - }; + localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)) + } // Use React Query to fetch or cache transaction inputs return useQuery( ['transactionInputs', txHash], async () => { - const cachedTransactionInputs = getCachedTransactionInputs(); - + const cachedTransactionInputs = getCachedTransactionInputs() + console.log({cachedTransactionInputs, isDeposit}) // If found in cache, return the cached data if (cachedTransactionInputs) { - return cachedTransactionInputs; + return cachedTransactionInputs } // Otherwise, fetch transaction inputs from the bridge transfer instance @@ -270,14 +268,16 @@ export const useBridgeTransfer = () => { originNetworkChainId: originChainId ?? 0, destinationSignerOrProviderOrRpc: destinationRpc, originSignerOrProviderOrRpc: originRpc, - }); + }) + + console.log(_bridgeTransfer, isDeposit) - const transactionInputs = await _bridgeTransfer.getTransactionInputs(); + const transactionInputs = isDeposit ? await _bridgeTransfer.getInfo() : await _bridgeTransfer.getTransactionInputs() // Save the fetched transaction inputs to cache - saveTransactionInputsToCache({ txHash, ...transactionInputs }); + saveTransactionInputsToCache({ txHash, ...transactionInputs }) - return transactionInputs; + return transactionInputs }, { placeholderData: () => { @@ -287,8 +287,8 @@ export const useBridgeTransfer = () => { refetchOnWindowFocus: false, // Disable refetching on window focus enabled: !!txRecord, // Ensure the query only runs when txRecord exists } - ); - }; + ) + } return { getTransactionInputs, returnTransferData, From 44d2f8655a45ac0bc8ad61ba0c7bb9ed17228fd8 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 14:02:59 +0000 Subject: [PATCH 206/266] reemove logs --- .../world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 283fb208..ed4b5e82 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -150,9 +150,7 @@ export const useBridgeTransfer = () => { provider = new ethers.providers.Web3Provider(window.ethereum) const currentChain = await provider.getNetwork() if (currentChain.chainId !== targetChain.chainId) { - console.log('about to switch') await switchChain(targetChain) - console.log('switching?') provider = new ethers.providers.Web3Provider(window.ethereum) //refresh provider } } else { @@ -193,7 +191,6 @@ export const useBridgeTransfer = () => { status: BridgeTransferStatus.WITHDRAW_EXECUTED } } - console.log("couldn't find the transaction..") return { ...t } }) localStorage.setItem( @@ -255,7 +252,6 @@ export const useBridgeTransfer = () => { ['transactionInputs', txHash], async () => { const cachedTransactionInputs = getCachedTransactionInputs() - console.log({cachedTransactionInputs, isDeposit}) // If found in cache, return the cached data if (cachedTransactionInputs) { return cachedTransactionInputs @@ -270,8 +266,7 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc, }) - console.log(_bridgeTransfer, isDeposit) - + const transactionInputs = isDeposit ? await _bridgeTransfer.getInfo() : await _bridgeTransfer.getTransactionInputs() // Save the fetched transaction inputs to cache From 0866ed390862e2affa934e45d14220bc28044e1f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 14:05:12 +0000 Subject: [PATCH 207/266] clear errors --- .../src/components/bridge/history/Deposit.tsx | 6 +----- .../src/components/bridge/history/Withdrawal.tsx | 11 ++++------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 8d33d39c..a20abb8f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -12,14 +12,13 @@ import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' -import { getTokensForNetwork } from '@/utils/tokens' import { getBlockExplorerUrl } from '@/utils/web3utils' interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { - const { connectedAccount, selectedNetworkType } = useBlockchainContext() + const { selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const depositInfo = { from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', @@ -30,9 +29,6 @@ const Deposit: React.FC = ({ deposit }) => { const { returnTransferData, getTransactionInputs } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) - const tokenInformation = getTokensForNetwork(deposit?.lowNetworkChainId, connectedAccount).find( - (token) => token.address === transactionInputs?.tokenOriginAddress - ) return ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index d0e33fc5..c60dd9d5 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -65,9 +65,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) - const tokenInformation = getTokensForNetwork(withdrawal?.highNetworkChainId, connectedAccount).find( - (token) => token.address === transactionInputs?.tokenAddress - ) return ( <> @@ -97,7 +94,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
+ >{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -215,7 +212,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.highNetworkTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
+ >{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -239,7 +236,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal?.completionTimestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
+ >{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
@@ -272,7 +269,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(status?.data?.timestamp)}
{`${tokenInformation?.decimals ? Number(withdrawal.amount) / tokenInformation?.decimals : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
+ >{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}
{transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( From 700146b35d003709c4499077acc8f2aeb7fdfe73 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 14:05:53 +0000 Subject: [PATCH 208/266] clear build erro --- .../src/components/bridge/history/Withdrawal.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index c60dd9d5..fe38c193 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -10,7 +10,6 @@ import { NetworkInterface, useBlockchainContext } from '@/contexts/BlockchainCon import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' -import { getTokensForNetwork } from '@/utils/tokens' import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' import { useMediaQuery } from '@mantine/hooks' @@ -54,7 +53,7 @@ export const getStatus = ( } } const Withdrawal: React.FC = ({ withdrawal }) => { - const { connectedAccount, selectedNetworkType } = useBlockchainContext() + const { selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const { claim, returnTransferData, getTransactionInputs } = useBridgeTransfer() const [collapseExecuted, setCollapseExecuted] = useState(false) From b5e0ab005b3f801ae4696d923d08dca5a2733702 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 17:34:04 +0000 Subject: [PATCH 209/266] getInfo() for both withdraw and deposit --- .../src/hooks/useBridgeTransfer.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index ed4b5e82..a7d16305 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -252,12 +252,11 @@ export const useBridgeTransfer = () => { ['transactionInputs', txHash], async () => { const cachedTransactionInputs = getCachedTransactionInputs() - // If found in cache, return the cached data + if (cachedTransactionInputs) { return cachedTransactionInputs } - // Otherwise, fetch transaction inputs from the bridge transfer instance const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -267,9 +266,8 @@ export const useBridgeTransfer = () => { }) - const transactionInputs = isDeposit ? await _bridgeTransfer.getInfo() : await _bridgeTransfer.getTransactionInputs() - - // Save the fetched transaction inputs to cache + const transactionInputs = await _bridgeTransfer.getInfo() + saveTransactionInputsToCache({ txHash, ...transactionInputs }) return transactionInputs From dd9f3e9492b9b690d3df7d19598f43dace6cee95 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 17:37:01 +0000 Subject: [PATCH 210/266] clear build error --- .../src/hooks/useBridgeTransfer.ts | 37 ++++++++++--------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index a7d16305..fdf90be7 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -127,7 +127,7 @@ export const useBridgeTransfer = () => { ? 1 * 60 * 1000 : false, refetchOnWindowFocus: false, - enabled: !!txRecord, + enabled: !!txRecord // retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 2000) } ) @@ -221,55 +221,56 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] const storageKey = `transaction-inputs-${connectedAccount}` - + // Retrieve cached transaction inputs from localStorage const getCachedTransactionInputs = () => { const cachedData = localStorage.getItem(storageKey) if (!cachedData) return null - + const cachedTransactions = JSON.parse(cachedData) - + // Return the specific transaction input based on txHash return cachedTransactions.find((input: any) => input.txHash === txHash) || null } - + // Save transaction inputs to localStorage as an array const saveTransactionInputsToCache = (newInput: any) => { const cachedData = localStorage.getItem(storageKey) const cachedTransactions = cachedData ? JSON.parse(cachedData) : [] - + const updatedTransactions = cachedTransactions.some((input: any) => input.txHash === newInput.txHash) - ? cachedTransactions.map((input: any) => - input.txHash === newInput.txHash ? { ...input, ...newInput } : input - ) + ? cachedTransactions.map((input: any) => (input.txHash === newInput.txHash ? { ...input, ...newInput } : input)) : [...cachedTransactions, newInput] - + localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)) } - + // Use React Query to fetch or cache transaction inputs return useQuery( ['transactionInputs', txHash], async () => { const cachedTransactionInputs = getCachedTransactionInputs() - + // If found in cache, return the cached data if (cachedTransactionInputs) { return cachedTransactionInputs } - + + // Otherwise, fetch transaction inputs from the bridge transfer instance const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, originNetworkChainId: originChainId ?? 0, destinationSignerOrProviderOrRpc: destinationRpc, - originSignerOrProviderOrRpc: originRpc, + originSignerOrProviderOrRpc: originRpc }) - const transactionInputs = await _bridgeTransfer.getInfo() - saveTransactionInputsToCache({ txHash, ...transactionInputs }) - + saveTransactionInputsToCache({ + ...transactionInputs, + txHash + }) + return transactionInputs }, { @@ -278,7 +279,7 @@ export const useBridgeTransfer = () => { }, staleTime: 2 * 60 * 1000, // Data is considered fresh for 2 minutes refetchOnWindowFocus: false, // Disable refetching on window focus - enabled: !!txRecord, // Ensure the query only runs when txRecord exists + enabled: !!txRecord // Ensure the query only runs when txRecord exists } ) } From f7166d17c0033cb2e047baee7553251cdc028a88 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 18:30:28 +0000 Subject: [PATCH 211/266] DEV-22, 23, 26 --- .../src/components/landing/BenefitsSection.tsx | 2 +- .../src/components/landing/NetworksEssentials.tsx | 2 +- webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts | 1 + .../src/pages/LandingPage/LandingPage.tsx | 3 +++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx b/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx index b25ea246..08684d15 100644 --- a/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/BenefitsSection.tsx @@ -23,7 +23,7 @@ const BenefitsSection: React.FC = () => { return (
-
Get all benefits of the G7 Network
+
Get all of the benefits of the G7 Network
{benefits.map((benefit, index) => (
diff --git a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx index 78366b56..bd37bdd4 100644 --- a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx @@ -28,7 +28,7 @@ const essentials = [ }, { title: "Docs", - description: "Get more information about building in the G7 Network", + description: "Get more information about building on the G7 Network", imageClass: styles.networkEssentialDocs, onClick: () => window.open('https://wiki.game7.io/g7-developer-resource/', '_blank'), }, diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts index bd515b4e..1d2fe7ca 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts @@ -1,5 +1,6 @@ import { useQuery } from 'react-query' import { ethers } from 'ethers' +import { useBlockchainContext } from '@/contexts/BlockchainContext' const BASE_URL = 'https://api.game7.build' diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index fdac4aef..1313aaad 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -9,14 +9,17 @@ import AlliesSection from "@/components/landing/AlliesSection"; import NetworkEssentials from "@/components/landing/NetworksEssentials"; import Navbar from "@/components/landing/Navbar"; import Container from "@/components/landing/Container"; +import { useBlockchainContext } from '@/contexts/BlockchainContext'; const LandingPage: React.FC = () => { const navigate = useNavigate(); + const {setSelectedNetworkType} = useBlockchainContext() const [navbarOpen, setNavBarOpen] = useState(false); const smallView = useMediaQuery('(max-width: 750px)'); const isLargeView = useMediaQuery('(min-width: 1440px)'); const startBuilding = () => { + setSelectedNetworkType('Testnet') navigate('/faucet'); }; From 07d0829f375778c3f5e6501b618320c943f8ee9f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 21:02:18 +0000 Subject: [PATCH 212/266] notifications correction --- .../src/hooks/useL2ToL1MessageStatus.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 3cefa361..aebb2302 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -293,6 +293,7 @@ export const useNotifications = ( offset: number, limit: number ): UseQueryResult => { + const { selectedNetworkType } = useBlockchainContext() return useQuery( ['notifications', connectedAccount, offset, limit], async () => { @@ -300,7 +301,7 @@ export const useNotifications = ( return [] } // const { selectedNetworkType } = useBlockchainContext() - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions`) + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions if (!transactionsString) { return [] From def8ab14068dc33cf7be1c638a5b04529254284b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 21:34:29 +0000 Subject: [PATCH 213/266] switch between testnet/mainnet tx's --- .../src/components/bridge/history/HistoryDesktop.tsx | 2 +- .../world-builder-dashboard/src/hooks/useBridgeAPI.ts | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 3e54f24b..2c17c754 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -101,7 +101,7 @@ const HistoryDesktop: React.FC = () => { JSON.stringify([...storedTransactions, ...newTransactions]) ) } - setMergedTransactions(selectedNetworkType === "Testnet" ? combinedTransactions : localTransactions) + setMergedTransactions(combinedTransactions) }, [messages, apiTransactions]) return ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts index 1d2fe7ca..48850891 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts @@ -7,10 +7,13 @@ const BASE_URL = 'https://api.game7.build' export const useBridgeAPI = () => { const useHistoryTransactions = (address: string | undefined) => { const isValidAddress = ethers.utils.isAddress(address ?? '') + const { selectedNetworkType } = useBlockchainContext() + const uriSnippet = selectedNetworkType === 'Testnet' ? '-testnet' : '' return useQuery( - ['historyTransactions', address], + ['historyTransactions', address, selectedNetworkType], async () => { - const res = await fetch(`${BASE_URL}/bridge/${address}/transactions?limit=50&offset=0`, { + console.log(selectedNetworkType) + const res = await fetch(`${BASE_URL}/bridge/game7${uriSnippet}/${address}/transactions?limit=50&offset=0`, { method: 'GET' }) if (!res.ok) { @@ -20,7 +23,7 @@ export const useBridgeAPI = () => { return data }, { - enabled: !!address && isValidAddress, + enabled: !!address && isValidAddress && !!selectedNetworkType, retry: false } ) From 8600f099ff42ff032ab3c018feeb051c7ef2a6bb Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 22:06:08 +0000 Subject: [PATCH 214/266] faucet links to testnet faucet --- .../src/components/landing/Navbar.tsx | 2 +- .../components/landing/NetworksEssentials.tsx | 132 +++++++++--------- .../src/layouts/MainLayout/DesktopSidebar.tsx | 11 -- .../src/layouts/MainLayout/MainLayout.tsx | 5 +- .../src/layouts/MainLayout/MobileSidebar.tsx | 11 -- .../src/pages/LandingPage/LandingPage.tsx | 102 ++++++++------ 6 files changed, 131 insertions(+), 132 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx index 41ad51d7..76d5572f 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx @@ -44,7 +44,7 @@ const Navbar: React.FC = ({ navbarOpen, smallView, setIsNavbarOpen,
navigateLink(item)} + onClick={() => {navigateLink(item)}} > {item.name}
diff --git a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx index bd37bdd4..0ef18f2b 100644 --- a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx @@ -1,73 +1,77 @@ -import React from 'react'; -import styles from './Landing.module.css'; -import { useNavigate } from 'react-router-dom'; +import React from 'react' +import { useNavigate } from 'react-router-dom' +import styles from './Landing.module.css' +import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' interface NetworkEssentialsProps { - smallView: boolean; - startBuilding: () => void; + smallView: boolean + startBuilding: () => void } const essentials = [ - { - title: "Faucet", - description: "Get testnet tokens to start building on G7 Sepolia", - imageClass: styles.networkEssentialFaucet, - onClick: (navigate: (path: string) => void) => navigate('/faucet'), - }, - { - title: "Bridge", - description: "Bridge tokens between Ethereum, Arbitrum and the G7 network", - imageClass: styles.networkEssentialBridge, - onClick: (navigate: (path: string) => void) => navigate('/bridge'), - }, - { - title: "Block explorer", - description: "Track and interact directly with your smart contracts", - imageClass: styles.networkEssentialExplorer, - onClick: () => window.open('https://testnet.game7.io/', '_blank'), - }, - { - title: "Docs", - description: "Get more information about building on the G7 Network", - imageClass: styles.networkEssentialDocs, - onClick: () => window.open('https://wiki.game7.io/g7-developer-resource/', '_blank'), - }, - { - title: "Discord", - description: "Join our community of builders on Discord", - imageClass: styles.networkEssentialDiscord, - onClick: () => window.open('https://discord.com/invite/g7dao', '_blank'), - }, -]; + { + title: 'Faucet', + description: 'Get testnet tokens to start building on G7 Sepolia', + imageClass: styles.networkEssentialFaucet, + onClick: (navigate: (path: string) => void, setSelectedNetworkType: (type: NetworkType) => void) => { + setSelectedNetworkType('Testnet') + navigate('/faucet') + } + }, + { + title: 'Bridge', + description: 'Bridge tokens between Ethereum, Arbitrum and the G7 network', + imageClass: styles.networkEssentialBridge, + onClick: (navigate: (path: string) => void) => navigate('/bridge') + }, + { + title: 'Block explorer', + description: 'Track and interact directly with your smart contracts', + imageClass: styles.networkEssentialExplorer, + onClick: () => window.open('https://testnet.game7.io/', '_blank') + }, + { + title: 'Docs', + description: 'Get more information about building on the G7 Network', + imageClass: styles.networkEssentialDocs, + onClick: () => window.open('https://wiki.game7.io/g7-developer-resource/', '_blank') + }, + { + title: 'Discord', + description: 'Join our community of builders on Discord', + imageClass: styles.networkEssentialDiscord, + onClick: () => window.open('https://discord.com/invite/g7dao', '_blank') + } +] const NetworkEssentials: React.FC = ({ smallView, startBuilding }) => { - const navigate = useNavigate(); - - return ( -
-
Start building with the network essentials
-
- {essentials.map((essential, index) => ( -
essential.onClick(navigate)} - key={index} - > -
-
-
{essential.title}
-
{essential.description}
-
-
- ))} -
- {!smallView && ( -
- Start building -
- )} + const navigate = useNavigate() + const { setSelectedNetworkType } = useBlockchainContext() + return ( +
+
Start building with the network essentials
+
+ {essentials.map((essential, index) => ( +
essential.onClick(navigate, setSelectedNetworkType)} + key={index} + > +
+
+
{essential.title}
, +
{essential.description}
- ); -}; +
+ ))} +
+ {!smallView && ( +
+ Start building +
+ )} +
+ ) +} -export default NetworkEssentials; +export default NetworkEssentials diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index ec91b169..05e336f3 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -1,10 +1,7 @@ import React, { ReactNode } from 'react' import { useLocation, useNavigate } from 'react-router-dom' import styles from './MainLayout.module.css' -import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' -import IconInfoCircle from '@/assets/IconInfoCircle' -import IconLock from '@/assets/IconLock' import IconLogout from '@/assets/IconLogout' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -45,14 +42,6 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => {
{item.name === 'documentation' || item.name === 'explorer' ? ( - ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - - - - ) : item.name === 'faucet' && selectedNetworkType === 'Mainnet' ? ( - - - ) : ( <> )} diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index 7e5e78c0..d260e94e 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -19,7 +19,7 @@ const MainLayout: React.FC = ({}) => { const location = useLocation() const { selectedNetworkType } = useBlockchainContext() - const NAVIGATION_ITEMS = [ + const TESTNET_NAVIGATION_ITEMS = [ { name: 'faucet', navigateTo: '/faucet', @@ -42,6 +42,9 @@ const MainLayout: React.FC = ({}) => { } ] + const MAINNET_NAVIGATION_ITEMS = TESTNET_NAVIGATION_ITEMS.slice(1, TESTNET_NAVIGATION_ITEMS.length) + const NAVIGATION_ITEMS = selectedNetworkType === 'Testnet' ? TESTNET_NAVIGATION_ITEMS : MAINNET_NAVIGATION_ITEMS + const smallView = useMediaQuery('(max-width: 1199px)') return (
diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx index 7ce0cbd2..08398e65 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.tsx @@ -2,11 +2,8 @@ import React, { ReactNode, useState } from 'react' import { useLocation, useNavigate } from 'react-router-dom' import parentStyles from './MainLayout.module.css' import styles from './MobileSidebar.module.css' -import { Tooltip } from 'summon-ui/mantine' import IconExternalLink from '@/assets/IconExternalLink' import IconHamburgerLanding from '@/assets/IconHamburgerLanding' -import IconInfoCircle from '@/assets/IconInfoCircle' -import IconLock from '@/assets/IconLock' import IconLogoutLarge from '@/assets/IconLogoutLarge' import NetworkToggle from '@/components/commonComponents/networkToggle/NetworkToggle' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -68,14 +65,6 @@ const MobileSidebar: React.FC = ({ navigationItems }) => {
{item.name === 'documentation' || item.name === 'explorer' ? ( - ) : item.name === 'faucet' && selectedNetworkType === 'Testnet' ? ( - - - - ) : item.name === 'faucet' && selectedNetworkType === 'Mainnet' ? ( - - - ) : ( <> )} diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index 1313aaad..a8b3747a 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -1,52 +1,65 @@ // LandingPage.tsx -import React, { useState } from 'react'; -import { useNavigate } from 'react-router-dom'; -import styles from './LandingPage.module.css'; -import { useMediaQuery } from 'summon-ui/mantine'; -import MainSection from "@/components/landing/MainSection"; -import BenefitsSection from "@/components/landing/BenefitsSection"; -import AlliesSection from "@/components/landing/AlliesSection"; -import NetworkEssentials from "@/components/landing/NetworksEssentials"; -import Navbar from "@/components/landing/Navbar"; -import Container from "@/components/landing/Container"; -import { useBlockchainContext } from '@/contexts/BlockchainContext'; +import React, { useState } from 'react' +import { useNavigate } from 'react-router-dom' +import styles from './LandingPage.module.css' +import { useMediaQuery } from 'summon-ui/mantine' +import AlliesSection from '@/components/landing/AlliesSection' +import BenefitsSection from '@/components/landing/BenefitsSection' +import Container from '@/components/landing/Container' +import MainSection from '@/components/landing/MainSection' +import Navbar from '@/components/landing/Navbar' +import NetworkEssentials from '@/components/landing/NetworksEssentials' +import { useBlockchainContext } from '@/contexts/BlockchainContext' const LandingPage: React.FC = () => { - const navigate = useNavigate(); - const {setSelectedNetworkType} = useBlockchainContext() - const [navbarOpen, setNavBarOpen] = useState(false); - const smallView = useMediaQuery('(max-width: 750px)'); - const isLargeView = useMediaQuery('(min-width: 1440px)'); + const navigate = useNavigate() + const { setSelectedNetworkType } = useBlockchainContext() + const [navbarOpen, setNavBarOpen] = useState(false) + const smallView = useMediaQuery('(max-width: 750px)') + const isLargeView = useMediaQuery('(min-width: 1440px)') const startBuilding = () => { setSelectedNetworkType('Testnet') - navigate('/faucet'); - }; + navigate('/faucet') + } const navigateLink = (item: any) => { - item.name !== 'Docs' && item.name !== 'Community' - ? navigate(`/${item.link}`) - : window.open(item.link, '_blank'); - }; + if (item.name === 'Faucet') { + setSelectedNetworkType('Testnet') + navigate(`/${item.link}`) + } else if (item.name !== 'Docs' && item.name !== 'Community') { + navigate(`/${item.link}`) + } else { + window.open(item.link, '_blank') + } + } const slides = [ - , - , - , - - ]; + , + , + , + + ] return ( - <> - {isLargeView ? : ( - -
+ <> + {isLargeView ? ( + + ) : ( +
@@ -57,13 +70,14 @@ const LandingPage: React.FC = () => {
{smallView && ( -
- Start building -
+
+ Start building +
)} -
)} - - ); -}; +
+ )} + + ) +} -export default LandingPage; +export default LandingPage From 5a7f75b9a9a0fe80573c9db252b129628da73e7a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 25 Nov 2024 22:11:29 +0000 Subject: [PATCH 215/266] setselectednetwork type specifies notifications --- .../src/hooks/useL2ToL1MessageStatus.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index aebb2302..adc2611b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -295,12 +295,11 @@ export const useNotifications = ( ): UseQueryResult => { const { selectedNetworkType } = useBlockchainContext() return useQuery( - ['notifications', connectedAccount, offset, limit], + ['notifications', connectedAccount, offset, limit, selectedNetworkType], async () => { if (!connectedAccount) { return [] } - // const { selectedNetworkType } = useBlockchainContext() const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) let transactions if (!transactionsString) { From 50c5c13ff497114185db18e37addbdfe38593019 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 26 Nov 2024 10:22:06 +0000 Subject: [PATCH 216/266] rename networks --- webapps/world-builder-dashboard/constants.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 86c31be2..5802a49d 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -39,7 +39,7 @@ export const L2_NETWORK: HighNetworkInterface = { export const L3_NETWORK: HighNetworkInterface = { chainId: 13746, name: 'game7Testnet', - displayName: 'Game7 Sepolia', + displayName: 'G7 Sepolia', rpcs: ['https://testnet-rpc.game7.io'], blockExplorerUrls: ['https://testnet.game7.io'], nativeCurrency: { @@ -88,7 +88,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { export const L3_MAIN_NETWORK: NetworkInterface = { chainId: 2187, name: 'game7', - displayName: 'Game7 Network', + displayName: 'G7 Network', rpcs: ['https://mainnet-rpc.game7.io'], blockExplorerUrls: ['https://mainnet.game7.io'], nativeCurrency: { From 4b7864c33520ec6053ac424ea527ec35dbd69dac Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 26 Nov 2024 11:21:00 +0000 Subject: [PATCH 217/266] mouse click away from network toggle closes dropdown --- .../networkToggle/NetworkToggle.tsx | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 4cfee7ee..824122c0 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -1,4 +1,4 @@ -import React, { useState } from 'react' +import React, { useState, useRef, useEffect } from 'react' import styles from './NetworkToggle.module.css' import IconChevronDownToggle from '@/assets/IconChevronDownToggle' import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' @@ -10,15 +10,30 @@ interface NetworkToggleProps {} const NetworkToggle: React.FC = () => { const { selectedNetworkType, setSelectedNetworkType } = useBlockchainContext() const [isDropdownOpen, setDropdownOpen] = useState(false) + const dropdownRef = useRef(null) - const toggleDropdown = () => setDropdownOpen(!isDropdownOpen) + const toggleDropdown = () => setDropdownOpen((prev) => !prev) const handleNetworkSelect = (network: NetworkType) => { setSelectedNetworkType(network as NetworkType) - setDropdownOpen(false) + setDropdownOpen(!isDropdownOpen) } + + useEffect(() => { + const handleClickOutside = (event: MouseEvent) => { + if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) { + setDropdownOpen(false) + } + } + + document.addEventListener('click', handleClickOutside) + return () => { + document.removeEventListener('click', handleClickOutside) + } + }, []) + return ( -
+
Date: Tue, 26 Nov 2024 11:24:32 +0000 Subject: [PATCH 218/266] change g7 network logos --- .../bridge/bridge/NetworkSelector.tsx | 19 ++++++++++++++----- .../src/utils/tokens.ts | 1 + 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 9ec32bb8..557c2890 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -8,11 +8,12 @@ import { } from '../../../../constants' import styles from './NetworkSelector.module.css' import { Combobox, Group, InputBase, InputBaseProps, useCombobox } from 'summon-ui/mantine' +import G7LogoBlue from '@/assets/G7LogoBlue' +import G7LogoRed from '@/assets/G7LogoRed' import IconArbitrumOne from '@/assets/IconArbitrumOne' import IconCheck from '@/assets/IconCheck' import IconChevronDown from '@/assets/IconChevronDown' import IconEthereum from '@/assets/IconEthereum' -import IconG7T from '@/assets/IconG7T' import { HighNetworkInterface, NetworkInterface, useBlockchainContext } from '@/contexts/BlockchainContext' type NetworkSelectorProps = { @@ -38,8 +39,9 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: Net case L2_MAIN_NETWORK.chainId: return case L3_NETWORK.chainId: + return case L3_MAIN_NETWORK.chainId: - return + return default: return <> } @@ -76,10 +78,17 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: Net {networks.map((n) => { - const isDisabled = direction === "DEPOSIT" ? selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId : selectedLowNetwork.chainId !== n.chainId && selectedLowNetwork.chainId === selectedNetwork.chainId + const isDisabled = + direction === 'DEPOSIT' + ? selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId + : selectedLowNetwork.chainId !== n.chainId && selectedLowNetwork.chainId === selectedNetwork.chainId return ( - +
Date: Tue, 26 Nov 2024 11:32:34 +0000 Subject: [PATCH 219/266] update icon for G7Token --- .../src/assets/IconG7T.tsx | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/webapps/world-builder-dashboard/src/assets/IconG7T.tsx b/webapps/world-builder-dashboard/src/assets/IconG7T.tsx index 27fc90a4..4243c7b4 100644 --- a/webapps/world-builder-dashboard/src/assets/IconG7T.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconG7T.tsx @@ -1,22 +1,14 @@ import React from 'react' const IconG7T: React.FC> = (props) => ( - + - ) From 0592058aac42c87e1907bae49a056b92912541d9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 26 Nov 2024 12:34:54 +0000 Subject: [PATCH 220/266] query params --- .../networkToggle/NetworkToggle.tsx | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 824122c0..efe69677 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -1,4 +1,5 @@ import React, { useState, useRef, useEffect } from 'react' +import { useSearchParams } from 'react-router-dom' import styles from './NetworkToggle.module.css' import IconChevronDownToggle from '@/assets/IconChevronDownToggle' import { NetworkType, useBlockchainContext } from '@/contexts/BlockchainContext' @@ -11,12 +12,36 @@ const NetworkToggle: React.FC = () => { const { selectedNetworkType, setSelectedNetworkType } = useBlockchainContext() const [isDropdownOpen, setDropdownOpen] = useState(false) const dropdownRef = useRef(null) - + const [searchParams, setSearchParams] = useSearchParams() const toggleDropdown = () => setDropdownOpen((prev) => !prev) + useEffect(() => { + const networkType = searchParams.get('network') + const defaultNetworkType = networkType + ? (networkType as NetworkType) + : selectedNetworkType + ? selectedNetworkType + : 'Mainnet' + + setSelectedNetworkType(defaultNetworkType) + + if (!networkType) { + setSearchParams({ network: defaultNetworkType as string }) + } + }, [selectedNetworkType]) + + useEffect(() => { + const networkType = searchParams.get('network') + if (!networkType) { + const defaultNetworkType = selectedNetworkType ?? 'Mainnet' + setSearchParams({ network: defaultNetworkType }) + } + }, [location]) + const handleNetworkSelect = (network: NetworkType) => { setSelectedNetworkType(network as NetworkType) setDropdownOpen(!isDropdownOpen) + setSearchParams({ network: network as string }) } useEffect(() => { From 131953a5e9009764fbb7a2afaa36f6304b04e070 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Tue, 26 Nov 2024 12:57:45 +0000 Subject: [PATCH 221/266] navigating to bridge selects mainnet --- .../networkToggle/NetworkToggle.tsx | 21 +-- .../src/components/landing/Navbar.tsx | 154 +++++++++--------- .../components/landing/NetworksEssentials.tsx | 5 +- .../src/contexts/BlockchainContext.tsx | 4 +- .../src/pages/LandingPage/LandingPage.tsx | 3 +- 5 files changed, 87 insertions(+), 100 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index efe69677..753512dd 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -17,27 +17,10 @@ const NetworkToggle: React.FC = () => { useEffect(() => { const networkType = searchParams.get('network') - const defaultNetworkType = networkType - ? (networkType as NetworkType) - : selectedNetworkType - ? selectedNetworkType - : 'Mainnet' - - setSelectedNetworkType(defaultNetworkType) - - if (!networkType) { - setSearchParams({ network: defaultNetworkType as string }) - } + setSelectedNetworkType(networkType ? (networkType as NetworkType) : selectedNetworkType ? selectedNetworkType : 'Mainnet') + setSearchParams({ network: networkType ? (networkType as string) : selectedNetworkType ? (selectedNetworkType as string) : 'Mainnet' }) }, [selectedNetworkType]) - useEffect(() => { - const networkType = searchParams.get('network') - if (!networkType) { - const defaultNetworkType = selectedNetworkType ?? 'Mainnet' - setSearchParams({ network: defaultNetworkType }) - } - }, [location]) - const handleNetworkSelect = (network: NetworkType) => { setSelectedNetworkType(network as NetworkType) setDropdownOpen(!isDropdownOpen) diff --git a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx index 76d5572f..6a21d800 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx @@ -1,88 +1,90 @@ // Navbar.tsx -import React from 'react'; -import { useNavigate } from 'react-router-dom'; -import styles from './Landing.module.css'; -import IconGame7Logo from '@/assets/IconGame7Logo'; -import IconGame7 from '@/assets/IconGame7'; -import IconHamburgerLanding from '@/assets/IconHamburgerLanding'; +import React from 'react' +import { useNavigate } from 'react-router-dom' +import styles from './Landing.module.css' +import IconGame7 from '@/assets/IconGame7' +import IconGame7Logo from '@/assets/IconGame7Logo' +import IconHamburgerLanding from '@/assets/IconHamburgerLanding' interface NavbarProps { - navbarOpen: boolean; - smallView: boolean; - setIsNavbarOpen: React.Dispatch>; - startBuilding: () => void; - navigateLink: (item: {name: string, link: string}) => void; + navbarOpen: boolean + smallView: boolean + setIsNavbarOpen: React.Dispatch> + startBuilding: () => void + navigateLink: (item: { name: string; link: string }) => void } const NAVBAR_ITEMS = [ - { name: 'Home', link: '/' }, - { name: 'Faucet', link: 'faucet' }, - { name: 'Bridge', link: 'bridge' }, - { name: 'Community', link: 'https://discord.com/invite/g7dao' }, - { - name: 'Docs', - link: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder' - } -]; + { name: 'Home', link: '/' }, + { name: 'Faucet', link: 'faucet' }, + { name: 'Bridge', link: 'bridge' }, + { name: 'Community', link: 'https://discord.com/invite/g7dao' }, + { + name: 'Docs', + link: 'https://wiki.game7.io/g7-developer-resource/bWmdEUXVjGpgIbH3H5XT/introducing-the-g7-network/world-builder' + } +] const Navbar: React.FC = ({ navbarOpen, smallView, setIsNavbarOpen, startBuilding, navigateLink }) => { - const navigate = useNavigate(); + const navigate = useNavigate() - return ( - <> - {/* Main Navbar */} -
-
-
navigate('/')}> - - -
-
- {!smallView ? ( -
- {NAVBAR_ITEMS.map((item, index) => ( -
{navigateLink(item)}} - > - {item.name} -
- ))} -
- Start building -
-
- ) : ( -
- setIsNavbarOpen(!navbarOpen)} /> -
- )} -
-
-
- - {/* Expanded Navbar for small view */} - {navbarOpen && smallView && ( -
- {NAVBAR_ITEMS.map((item, index) => ( -
navigateLink(item)} - > - {item.name} -
- ))} -
-
- Start building -
-
+ return ( + <> + {/* Main Navbar */} +
+
+
navigate('/')}> + + +
+
+ {!smallView ? ( +
+ {NAVBAR_ITEMS.map((item, index) => ( +
{ + navigateLink(item) + }} + > + {item.name} +
+ ))} +
+ Start building
+
+ ) : ( +
+ setIsNavbarOpen(!navbarOpen)} /> +
)} - - ); -}; +
+
+
+ + {/* Expanded Navbar for small view */} + {navbarOpen && smallView && ( +
+ {NAVBAR_ITEMS.map((item, index) => ( +
navigateLink(item)} + > + {item.name} +
+ ))} +
+
+ Start building +
+
+
+ )} + + ) +} -export default Navbar; +export default Navbar diff --git a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx index 0ef18f2b..f681b858 100644 --- a/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/NetworksEssentials.tsx @@ -22,7 +22,10 @@ const essentials = [ title: 'Bridge', description: 'Bridge tokens between Ethereum, Arbitrum and the G7 network', imageClass: styles.networkEssentialBridge, - onClick: (navigate: (path: string) => void) => navigate('/bridge') + onClick: (navigate: (path: string) => void, setSelectedNetworkType: (type: NetworkType) => void) => { + setSelectedNetworkType('Mainnet') + navigate('/bridge') + } }, { title: 'Block explorer', diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 7c0caa32..65e89bbb 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -15,7 +15,6 @@ import { import { ethers } from 'ethers' import { getTokensForNetwork, Token } from '@/utils/tokens' - interface BlockchainContextType { walletProvider?: ethers.providers.Web3Provider connectedAccount?: string @@ -91,7 +90,7 @@ export const BlockchainProvider: React.FC = ({ children const [selectedBridgeToken, setSelectedBridgeToken] = useState( getTokensForNetwork(DEFAULT_LOW_NETWORK.chainId, connectedAccount)[0] ) - + const tokenAddress = '0x5f88d811246222F6CB54266C42cc1310510b9feA' const setSelectedLowNetwork = (network: NetworkInterface) => { @@ -156,7 +155,6 @@ export const BlockchainProvider: React.FC = ({ children } else { setSelectedLowNetwork(DEFAULT_LOW_MAINNET_NETWORK) setSelectedHighNetwork(DEFAULT_HIGH_MAINNET_NETWORK) - } }, [selectedNetworkType]) diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index a8b3747a..a1101b65 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -27,7 +27,8 @@ const LandingPage: React.FC = () => { if (item.name === 'Faucet') { setSelectedNetworkType('Testnet') navigate(`/${item.link}`) - } else if (item.name !== 'Docs' && item.name !== 'Community') { + } else if (item.name === "Bridge") { + setSelectedNetworkType('Mainnet') navigate(`/${item.link}`) } else { window.open(item.link, '_blank') From 9be0bb531a3e6a1760fce7adea9290014b89c2d7 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 10:26:35 +0000 Subject: [PATCH 222/266] update SDK version --- webapps/world-builder-dashboard/package.json | 2 +- .../src/components/bridge/bridge/ActionButton.tsx | 4 ++-- .../src/components/bridge/bridge/NetworkSelector.tsx | 4 ++-- .../src/components/bridge/history/Withdrawal.tsx | 1 - .../world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 4 ++-- .../src/hooks/useL2ToL1MessageStatus.ts | 4 ++-- 6 files changed, 9 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 78a58775..0de182c9 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,7 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.64", + "game7-bridge-sdk": "^0.0.67", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 4333576e..25ee2571 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -95,7 +95,7 @@ const ActionButton: React.FC = ({ if (selectedBridgeToken.address != ZERO_ADDRESS) { const allowance = (await bridger?.getAllowance(selectedLowNetwork.rpcs[0], connectedAccount ?? '')) ?? '' const allowanceToCheck = ethers.utils.formatUnits(allowance, decimals) - + // approve first if (Number(allowanceToCheck) < Number(amountToSend)) { const txApprove = await bridger?.approve(amountToSend, signer) @@ -126,7 +126,7 @@ const ActionButton: React.FC = ({ highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: 60 * 60, + challengePeriod: selectedNetworkType === 'Testnet' ? 60 * 60 : 60 * 60 * 24 * 7, symbol: symbol, status: BridgeTransferStatus.WITHDRAW_UNCONFIRMED } diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index 557c2890..afb66d5a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -82,11 +82,11 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: Net direction === 'DEPOSIT' ? selectedHighNetwork.chainId !== n.chainId && selectedHighNetwork.chainId === selectedNetwork.chainId : selectedLowNetwork.chainId !== n.chainId && selectedLowNetwork.chainId === selectedNetwork.chainId + if (isDisabled) return return ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index fe38c193..123efa55 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -62,7 +62,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const highNetworks = getHighNetworks(selectedNetworkType) || HIGH_NETWORKS const status = getStatus(withdrawal, lowNetworks, highNetworks) const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) - const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) return ( diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index fdf90be7..b491c2d2 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -49,7 +49,7 @@ export const useBridgeTransfer = () => { // If the status is pending and time since last fetched is > 2 minutes, fetch again const shouldFetchStatus = (cachedTransaction: any) => { - const isPending = ![2, 6, 9].includes(cachedTransaction?.status) // Add actual pending statuses + const isPending = ![1, 2, 6, 9].includes(cachedTransaction?.status) // Add actual pending statuses const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) return isPending && timeSinceLastUpdate > 1 * 60 * 1000 // Adjust timing as needed } @@ -86,7 +86,7 @@ export const useBridgeTransfer = () => { `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(newTransactions) ) - + console.log(status) return status } catch (error) { console.error('Error fetching status:', error) diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index adc2611b..177af086 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -147,9 +147,9 @@ const fetchDepositStatus = async (deposit: TransactionRecord, selectedNetworkTyp let l2Result try { - l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations, 1) + l2Result = await l1ContractCallReceipt.waitForChildTransactionReceipt(l2Provider, l1Receipt.confirmations) } catch (e) { - console.error('Error waiting for child transaction receipt:', { deposit, e }) + console.error('Error waiting for child transaction receipt: ', { error: e, receipt: l1Receipt }) } if (!l2Result) { From 6afef02c5a1e06cbbab8d2dd707c3c754f8d9a14 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 12:17:16 +0000 Subject: [PATCH 223/266] fix noStatusFound --- .../world-builder-dashboard/package-lock.json | 9 ++-- .../src/components/bridge/history/Deposit.tsx | 44 +++++++++++++------ .../src/hooks/useBridgeTransfer.ts | 4 +- .../src/utils/web3utils.ts | 28 ++++++++++++ 4 files changed, 66 insertions(+), 19 deletions(-) diff --git a/webapps/world-builder-dashboard/package-lock.json b/webapps/world-builder-dashboard/package-lock.json index 1f8dd2f9..c5a6bfa9 100644 --- a/webapps/world-builder-dashboard/package-lock.json +++ b/webapps/world-builder-dashboard/package-lock.json @@ -15,7 +15,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.54", + "game7-bridge-sdk": "^0.0.67", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", @@ -6879,10 +6879,11 @@ } }, "node_modules/game7-bridge-sdk": { - "version": "0.0.54", - "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.54.tgz", - "integrity": "sha512-Rf1nlrsIsIaG0/DGQmOFqjuGWfzKgnfqSB6bWglCtohz0dPIKRDR3Ap3xC5fvvQpqSnz6/6jm2ctjPTFOeOUpA==", + "version": "0.0.67", + "resolved": "https://registry.npmjs.org/game7-bridge-sdk/-/game7-bridge-sdk-0.0.67.tgz", + "integrity": "sha512-nzgLfJML3oyrDUiBc9ALSPpa24/EeyN+FhwxLHHVIJr4ruoImXzy68DHnHTFSzkg7mAaRjgZrutFXwmTJy/pXg==", "hasInstallScript": true, + "license": "MIT", "dependencies": { "@arbitrum/sdk": "4.0.1", "ethers": "^5.7.2", diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index a20abb8f..2b659440 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,5 +1,5 @@ -import React from 'react' -import { getHighNetworks, getLowNetworks } from '../../../../constants' +import React, { useEffect, useState } from 'react' +import { getHighNetworks, getLowNetworks, getNetworks } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' @@ -9,14 +9,14 @@ import IconArrowNarrowDown from '@/assets/IconArrowNarrowDown' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' -import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' -import { getBlockExplorerUrl } from '@/utils/web3utils' +import { fetchTransactionTimestamp, getBlockExplorerUrl } from '@/utils/web3utils' interface DepositProps { deposit: TransactionRecord } + const Deposit: React.FC = ({ deposit }) => { const { selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') @@ -25,21 +25,43 @@ const Deposit: React.FC = ({ deposit }) => { to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } - const { data: status, isLoading: isLoadingStatus } = useDepositStatus(deposit, selectedNetworkType) const { returnTransferData, getTransactionInputs } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) + const [highNetworkTimestamp, setHighNetworkTimestamp] = useState(0) + + + useEffect(() => { + const fetchTimestamp = async () => { + if (transferStatus) { + if (transferStatus?.completionTxHash) { + console.log(selectedNetworkType) + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId) + ?.rpcs[0] + const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') + if (timestamp) { + console.log(timestamp) + setHighNetworkTimestamp(timestamp) + } + } else { + console.log("no compl;etion tx hash found" ) + } + } + } + + fetchTimestamp() + }, [transferStatus?.completionTxHash]) return ( <> - {isLoadingStatus && smallView ? ( + {isLoading && smallView ? (
Loading
) : ( <> {smallView ? ( - + ) : ( <>
@@ -85,7 +107,7 @@ const Deposit: React.FC = ({ deposit }) => { )} {/* Second column */} - {isLoading || transferStatus?.status === undefined || isLoadingStatus ? ( + {isLoading || transferStatus?.status === undefined || !highNetworkTimestamp ? (
Loading
@@ -94,11 +116,7 @@ const Deposit: React.FC = ({ deposit }) => { {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( - <> - {status?.highNetworkTimestamp === undefined - ? 'No status found' - : timeAgo(status?.highNetworkTimestamp)} - + <>{timeAgo(highNetworkTimestamp)} ) : ( <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} )} diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index b491c2d2..fdf90be7 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -49,7 +49,7 @@ export const useBridgeTransfer = () => { // If the status is pending and time since last fetched is > 2 minutes, fetch again const shouldFetchStatus = (cachedTransaction: any) => { - const isPending = ![1, 2, 6, 9].includes(cachedTransaction?.status) // Add actual pending statuses + const isPending = ![2, 6, 9].includes(cachedTransaction?.status) // Add actual pending statuses const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) return isPending && timeSinceLastUpdate > 1 * 60 * 1000 // Adjust timing as needed } @@ -86,7 +86,7 @@ export const useBridgeTransfer = () => { `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, JSON.stringify(newTransactions) ) - console.log(status) + return status } catch (error) { console.error('Error fetching status:', error) diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index f709cc54..f59b9f12 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -1,6 +1,7 @@ import { getHighNetworks, getLowNetworks, HIGH_NETWORKS, LOW_NETWORKS } from '../../constants' import { ethers } from 'ethers' import { NetworkType } from '@/contexts/BlockchainContext' +import { providers } from 'ethers' export const convertToBigNumber = (numberString: string, precision = 18) => { const [integerPart, decimalPart] = numberString.split('.') @@ -58,3 +59,30 @@ export const parseUntilDelimiter = (input: any) => { const match = input.match(/^[^\(\[]+/) return match ? match[0] : input } + +export const fetchTransactionTimestamp = async (completionTxHash: string, rpcUrl: string): Promise => { + try { + // Initialize the provider with the RPC URL + const provider = new providers.JsonRpcProvider(rpcUrl) + + // Fetch the transaction receipt + const receipt = await provider.getTransactionReceipt(completionTxHash) + if (!receipt) { + console.warn('Transaction receipt not found for hash:', completionTxHash) + return null + } + + // Fetch the block details using the block number from the receipt + const block = await provider.getBlock(receipt.blockNumber) + if (!block) { + console.warn('Block not found for block number:', receipt.blockNumber) + return null + } + + // Return the timestamp from the block + return block.timestamp + } catch (error) { + console.error('Error fetching transaction timestamp:', error) + return null + } +} \ No newline at end of file From 1a2dca7d975c144f9977493197e2cf4e43b8f1cd Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 14:09:35 +0000 Subject: [PATCH 224/266] links --- .../src/components/landing/AlliesSection.tsx | 61 +++++++++++++------ .../src/components/landing/Landing.module.css | 6 ++ .../pages/LandingPage/LandingPage.module.css | 13 ++-- 3 files changed, 58 insertions(+), 22 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx b/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx index fc0e6a64..8a7153c1 100644 --- a/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/AlliesSection.tsx @@ -1,22 +1,49 @@ -import React from 'react'; -import styles from './Landing.module.css'; -import { HyperPlayLogo, SummonLogo, SummonTextLogo, ArbitrumLogo, ConduitLogo, MarketWarsLogo } from '../../assets'; +import React from 'react' +import { HyperPlayLogo, SummonLogo, SummonTextLogo, ArbitrumLogo, ConduitLogo, MarketWarsLogo } from '../../assets' +import styles from './Landing.module.css' + +const allies = [ + { + logo: , + link: 'https://www.hyperplay.xyz/' + }, + { + logo: ( + <> + + + ), + link: 'https://summon.xyz/' + }, + { + logo: , + link: 'https://arbitrum.io/' + }, + { + logo: , + link: 'https://www.conduit.xyz/' + }, + { + logo: , + link: 'https://www.marketwars.com/' + } +] const AlliesSection: React.FC = () => { - return ( -
-
-
G7 Network allies
-
-
-
-
-
-
-
+ return ( +
+
+
G7 Network allies
+
+ {allies.map((ally) => ( +
window.open(ally.link, '_blank')}> + {ally.logo}
+ ))}
- ); -}; +
+
+ ) +} -export default AlliesSection; +export default AlliesSection diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css index 27ea69a3..07839319 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -421,6 +421,7 @@ body { } .sponsorCards { + cursor: pointer; display: flex; justify-content: center; align-items: center; @@ -430,6 +431,7 @@ body { } .sponsorCard { + cursor: url('../../assets/hand.svg'), pointer; display: flex; height: 120px; width: 220px; @@ -442,6 +444,10 @@ body { backdrop-filter: blur(0.6990200281143188px); } +.sponsorCard::hover { + +} + .sponsorCardImage { display: flex; padding: 8.627px; diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css index 8ef91dda..3b27ddaf 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -442,6 +442,11 @@ body { backdrop-filter: blur(0.6990200281143188px); } +.sponsorCard:hover { + cursor: url('../../assets/hand.svg'), pointer; + border: 1px solid #f04438; +} + .sponsorCardImage { display: flex; padding: 8.627px; @@ -510,17 +515,17 @@ body { } .networkEssentialBridge { - background: url('../../assets/G7BridgeCardDark.jpg') 50% / cover no-repeat;; + background: url('../../assets/G7BridgeCardDark.jpg') 50% / cover no-repeat; background-size: contain; } .networkEssentialExplorer { - background: url('../../assets/G7ExplorerCardDark.jpg') 50% / cover no-repeat;; + background: url('../../assets/G7ExplorerCardDark.jpg') 50% / cover no-repeat; background-size: contain; } .networkEssentialDocs { - background: url('../../assets/G7DocsCardDark.jpg') 50% / cover no-repeat;; + background: url('../../assets/G7DocsCardDark.jpg') 50% / cover no-repeat; background-size: contain; } @@ -586,8 +591,6 @@ body { flex: 1 0 auto; } - - @media (max-width: 1199px) { .layout { display: flex; From 9d5d53e11416b1924dbf9a1670c4f7240a7558b1 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 16:01:12 +0000 Subject: [PATCH 225/266] caching highNetworkTimestamp --- .../src/components/bridge/history/Deposit.tsx | 52 ++++++++++++++----- .../src/components/landing/Navbar.tsx | 2 +- .../src/hooks/useBridgeTransfer.ts | 11 ++-- .../pages/LandingPage/LandingPage.module.css | 19 ++++++- .../src/utils/web3utils.ts | 5 ++ 5 files changed, 68 insertions(+), 21 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 2b659440..c83b393e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -11,14 +11,14 @@ import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' -import { fetchTransactionTimestamp, getBlockExplorerUrl } from '@/utils/web3utils' +import { fetchTransactionTimestamp, getBlockExplorerUrl, getCachedTransactions } from '@/utils/web3utils' interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { - const { selectedNetworkType } = useBlockchainContext() + const { selectedNetworkType, connectedAccount } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const depositInfo = { from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', @@ -30,21 +30,49 @@ const Deposit: React.FC = ({ deposit }) => { const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) const [highNetworkTimestamp, setHighNetworkTimestamp] = useState(0) - useEffect(() => { const fetchTimestamp = async () => { - if (transferStatus) { + if (deposit) { + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + + const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === deposit.lowNetworkHash) + + if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { + console.log('Timestamp found in cache:', cachedTransaction.highNetworkTimestamp) + setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) + return + } + + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId) + ?.rpcs[0] + if (transferStatus?.completionTxHash) { - console.log(selectedNetworkType) - const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId) - ?.rpcs[0] - const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') - if (timestamp) { - console.log(timestamp) - setHighNetworkTimestamp(timestamp) + try { + const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') + + if (timestamp) { + setHighNetworkTimestamp(timestamp) + + const updatedTransactions = transactions.map((t: any) => { + const isSameHash = t.lowNetworkHash === deposit.lowNetworkHash + + return isSameHash ? { ...t, highNetworkTimestamp: timestamp, lastUpdated: Date.now() } : t + }) + + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(updatedTransactions) + ) + } + } catch (error) { + console.error('Error fetching timestamp:', error) + + if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { + setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) + } } } else { - console.log("no compl;etion tx hash found" ) + console.log('No completion transaction hash found') } } } diff --git a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx index 6a21d800..fea37284 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Navbar.tsx @@ -77,7 +77,7 @@ const Navbar: React.FC = ({ navbarOpen, smallView, setIsNavbarOpen,
))}
-
+
Start building
diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index fdf90be7..cdc317db 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -7,6 +7,7 @@ import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' +import { getCachedTransactions } from '@/utils/web3utils' interface UseTransferDataProps { txRecord: TransactionRecord @@ -23,10 +24,6 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - const getCachedTransactions = () => { - const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) - return transactionsString ? JSON.parse(transactionsString) : [] - } // Retry function with exponential backoff for handling 429 errors const retryWithExponentialBackoff = async (fn: () => Promise, retries: number = 5, delay: number = 1000) => { @@ -71,7 +68,7 @@ export const useBridgeTransfer = () => { // Fetch status with retry logic status = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getStatus()) - const transactions = getCachedTransactions() + const transactions = getCachedTransactions(connectedAccount ?? "", selectedNetworkType) // Update the cache with the latest status const newTransactions = transactions.map((t: any) => { @@ -92,7 +89,7 @@ export const useBridgeTransfer = () => { console.error('Error fetching status:', error) // Fallback to cached status if available - const transactions = getCachedTransactions() + const transactions = getCachedTransactions(connectedAccount ?? "", selectedNetworkType) const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) @@ -108,7 +105,7 @@ export const useBridgeTransfer = () => { { // Placeholder data from cache placeholderData: () => { - const transactions = getCachedTransactions() + const transactions = getCachedTransactions(connectedAccount ?? "", selectedNetworkType) const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css index 3b27ddaf..5675e6ec 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -85,7 +85,6 @@ body { } .navbarCTA { - cursor: url('../../assets/hand.svg'), pointer; display: flex; padding: 10px 16px; justify-content: center; @@ -103,6 +102,24 @@ body { line-height: 20px; } +.navbarCTA:hover { + display: flex; + padding: 10px 16px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + background: linear-gradient(147deg, #f04438 11.16%, #fff 142.48%); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; +} + + .logoWrapper { cursor: url('../../assets/hand.svg'), pointer; display: flex; diff --git a/webapps/world-builder-dashboard/src/utils/web3utils.ts b/webapps/world-builder-dashboard/src/utils/web3utils.ts index f59b9f12..69d9d4b6 100644 --- a/webapps/world-builder-dashboard/src/utils/web3utils.ts +++ b/webapps/world-builder-dashboard/src/utils/web3utils.ts @@ -85,4 +85,9 @@ export const fetchTransactionTimestamp = async (completionTxHash: string, rpcUrl console.error('Error fetching transaction timestamp:', error) return null } +} + +export const getCachedTransactions = (connectedAccount: string, selectedNetworkType: NetworkType) => { + const transactionsString = localStorage.getItem(`bridge-${connectedAccount}-transactions-${selectedNetworkType}`) + return transactionsString ? JSON.parse(transactionsString) : [] } \ No newline at end of file From 7af0bce24b0f353ddb8234994f4ee96fb7019ca0 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 22:21:02 +0000 Subject: [PATCH 226/266] claim working --- .../src/components/bridge/history/Deposit.tsx | 1 - .../components/bridge/history/Withdrawal.tsx | 10 ++++-- .../src/contexts/BlockchainContext.tsx | 1 - .../src/hooks/useBridgeTransfer.ts | 32 +++++++++++-------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index c83b393e..200a86d7 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -38,7 +38,6 @@ const Deposit: React.FC = ({ deposit }) => { const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === deposit.lowNetworkHash) if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { - console.log('Timestamp found in cache:', cachedTransaction.highNetworkTimestamp) setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) return } diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 123efa55..c110442c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -63,7 +63,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal, lowNetworks, highNetworks) const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) - + return ( <> {status?.isLoading && smallView ? ( @@ -285,7 +285,13 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 65e89bbb..3e5689f5 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -238,7 +238,6 @@ export const BlockchainProvider: React.FC = ({ children try { const provider = new ethers.providers.Web3Provider(ethereum, 'any') const currentChain = await provider.getNetwork() - console.log(currentChain) if (currentChain.chainId !== chain.chainId) { const hexChainId = ethers.utils.hexStripZeros(ethers.utils.hexlify(chain.chainId)) try { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index cdc317db..e3863627 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -1,7 +1,7 @@ import { useMutation, useQueryClient } from 'react-query' import { useQuery } from 'react-query' import { useNavigate } from 'react-router-dom' -import { getNetworks, L1_NETWORK, L2_NETWORK } from '../../constants' +import { getNetworks, L1_MAIN_NETWORK, L1_NETWORK, L2_MAIN_NETWORK, L2_NETWORK } from '../../constants' import { ethers } from 'ethers' import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' @@ -24,7 +24,6 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - // Retry function with exponential backoff for handling 429 errors const retryWithExponentialBackoff = async (fn: () => Promise, retries: number = 5, delay: number = 1000) => { let attempt = 0 @@ -68,7 +67,7 @@ export const useBridgeTransfer = () => { // Fetch status with retry logic status = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getStatus()) - const transactions = getCachedTransactions(connectedAccount ?? "", selectedNetworkType) + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) // Update the cache with the latest status const newTransactions = transactions.map((t: any) => { @@ -89,7 +88,7 @@ export const useBridgeTransfer = () => { console.error('Error fetching status:', error) // Fallback to cached status if available - const transactions = getCachedTransactions(connectedAccount ?? "", selectedNetworkType) + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) @@ -105,7 +104,7 @@ export const useBridgeTransfer = () => { { // Placeholder data from cache placeholderData: () => { - const transactions = getCachedTransactions(connectedAccount ?? "", selectedNetworkType) + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) @@ -115,9 +114,9 @@ export const useBridgeTransfer = () => { return { status } } }, - staleTime: 2 * 60 * 1000, // Data is considered fresh for 2 minutes + staleTime: 2 * 60 * 1000, refetchInterval: shouldFetchStatus( - getCachedTransactions().find((t: any) => + getCachedTransactions(connectedAccount ?? '', selectedNetworkType).find((t: any) => t.type === 'DEPOSIT' ? t.lowNetworkHash === txHash : t.highNetworkHash === txHash ) ) @@ -140,20 +139,27 @@ export const useBridgeTransfer = () => { if (!withdrawal) { throw new Error('transaction hash is undefined') } - - const targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK - let provider + + let targetChain + if (selectedNetworkType === 'Testnet') + targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK + else + targetChain = withdrawal.highNetworkChainId === L2_MAIN_NETWORK.chainId ? L1_MAIN_NETWORK : L2_MAIN_NETWORK + + let provider if (window.ethereum) { provider = new ethers.providers.Web3Provider(window.ethereum) const currentChain = await provider.getNetwork() if (currentChain.chainId !== targetChain.chainId) { await switchChain(targetChain) - provider = new ethers.providers.Web3Provider(window.ethereum) //refresh provider + provider = new ethers.providers.Web3Provider(window.ethereum) } } else { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() + console.log(signer) + // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ txHash: withdrawal.highNetworkHash || '', @@ -166,8 +172,8 @@ export const useBridgeTransfer = () => { (n) => n.chainId === withdrawal.highNetworkChainId )?.rpcs[0] }) - - const res = await _bridgeTransfer?.execute(signer) + console.log(_bridgeTransfer) + const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } }, { From 648694e1f124df440733454f7227365f262766fa Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 22:53:29 +0000 Subject: [PATCH 227/266] DEV-27 hover animation --- .../src/components/landing/Landing.module.css | 1382 +++++++++-------- .../src/hooks/useBridgeTransfer.ts | 14 +- .../pages/LandingPage/LandingPage.module.css | 1 + 3 files changed, 704 insertions(+), 693 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css index 07839319..d96f4fd0 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -1,570 +1,663 @@ html, body { - overscroll-behavior: none; - -webkit-overflow-scrolling: auto; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; } .layout { - display: flex; - width: 100vw; - height: 100svh; - padding: 24px; - flex-direction: column; - align-items: center; - gap: 16px; - background: #171717; - cursor: url('../../assets/cursor.svg'), auto; - overflow: hidden; - overscroll-behavior: none; - -webkit-overflow-scrolling: auto; + display: flex; + width: 100vw; + height: 100svh; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + background: #171717; + cursor: url('../../assets/cursor.svg'), auto; + overflow: hidden; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; } .layout.darkened { - background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent dark overlay */ - pointer-events: none; /* Prevent interactions with the background */ + background-color: rgba(0, 0, 0, 0.5); /* Semi-transparent dark overlay */ + pointer-events: none; /* Prevent interactions with the background */ } .navbarContainer { - display: flex; - width: 100%; - padding: 4px 0px; - flex-direction: column; - align-items: center; - align-self: stretch + display: flex; + width: 100%; + padding: 4px 0px; + flex-direction: column; + align-items: center; + align-self: stretch; } .navbar { - display: flex; - justify-content: space-between; - align-items: center; - align-self: stretch; + display: flex; + justify-content: space-between; + align-items: center; + align-self: stretch; } .navbarItemsContainer { - display: flex; - align-items: center; - gap: 12px; + display: flex; + align-items: center; + gap: 12px; } .navbarItems { - display: flex; - align-items: center; - gap: 4px; + display: flex; + align-items: center; + gap: 4px; } .navbarItem { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - padding: 8px 12px; - align-items: center; - gap: 8px; - border-radius: 6px; - color: #d5d5d5; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + border-radius: 6px; + color: #d5d5d5; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; } .navbarItemHome { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - padding: 8px 12px; - align-items: center; - gap: 8px; - border-radius: 6px; - color: #fff; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; /* 150% */ + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + border-radius: 6px; + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; /* 150% */ } .navbarCTA { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - padding: 10px 16px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - border: 1px solid #f04438; - background: #f04438; - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - color: #fff; - font-family: Inter; - font-size: 14px; - font-style: normal; - font-weight: 600; - line-height: 20px; + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 16px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #f04438; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 600; + line-height: 20px; +} + +.navbarCTA:hover { + display: inline-flex; + padding: 10px 16px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + background: linear-gradient(147deg, #f04438 11.16%, #fff 142.48%); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 600; + line-height: 20px; } .logoWrapper { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - align-items: center; - gap: 12px; + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + align-items: center; + gap: 12px; } .themeSwitchButton { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - width: 40px; - height: 40px; - padding: 8px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - border: 1px solid var(--Gray-300, #d0d5dd); + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + width: 40px; + height: 40px; + padding: 8px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid var(--Gray-300, #d0d5dd); } .mainLayout { - position: relative; - display: flex; - padding: 40px; - flex-direction: column; - justify-content: start; - align-items: center; - gap: 200px; - flex: 1 0 0; - align-self: stretch; - border-radius: 12px; - border: 1px solid #727272; - background: url('../../assets/G7LandingPageBGDark.jpg') lightgray 50% / cover no-repeat; - overflow-y: scroll; - padding: 40px; - scrollbar-width: none; - -ms-overflow-style: none; - transition: justify-content 0.3s ease; - overscroll-behavior: none; - -webkit-overflow-scrolling: auto; + position: relative; + display: flex; + padding: 40px; + flex-direction: column; + justify-content: start; + align-items: center; + gap: 200px; + flex: 1 0 0; + align-self: stretch; + border-radius: 12px; + border: 1px solid #727272; + background: url('../../assets/G7LandingPageBGDark.jpg') lightgray 50% / cover no-repeat; + overflow-y: scroll; + padding: 40px; + scrollbar-width: none; + -ms-overflow-style: none; + transition: justify-content 0.3s ease; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; } .mainLayoutStart { - justify-content: start; + justify-content: start; } .titleContainer { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 24px; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; } .titleText { - align-self: stretch; - color: #f9fafb; - text-align: center; - font-family: Inter; - font-size: 120px; - font-style: normal; - font-weight: 900; - line-height: 100%; - letter-spacing: -4px; - text-transform: uppercase; + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 120px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -4px; + text-transform: uppercase; } .subtitleText { - color: #b9b9b9; - text-align: center; - font-family: Inter; - font-size: 24px; - font-style: normal; - font-weight: 500; - line-height: 32px; - align-self: stretch; + color: #b9b9b9; + text-align: center; + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; + align-self: stretch; } .ctaContainer { - display: flex; - justify-content: center; - align-items: flex-start; - gap: 16px; + display: flex; + justify-content: center; + align-items: flex-start; + gap: 16px; } .learnMoreCTA { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - padding: 10px 18px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - border: 1px solid #393939; - background: rgba(11, 11, 11, 0.7); - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - color: #b9b9b9; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #393939; + background: rgba(11, 11, 11, 0.7); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #b9b9b9; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; } .learnMoreCTA:hover { - display: inline-flex; - padding: 10px 18px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - border: 1px solid #f04438; - background: #0b0b0b; - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; - background: linear-gradient(173deg, #f04438 -3.52%, #fff 129.23%); - background-clip: text; + display: inline-flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #0b0b0b; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + background: linear-gradient(173deg, #f04438 -3.52%, #fff 129.23%); + background-clip: text; } .startBuildingCTA { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - padding: 10px 18px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - border: 1px solid #f04438; - background: #f04438; - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - color: #fff; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + border: 1px solid #f04438; + background: #f04438; + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; } .startBuildingCTA:hover { - display: inline-flex; - padding: 10px 18px; - justify-content: center; - align-items: center; - gap: 8px; - border-radius: 8px; - background: linear-gradient(147deg, #f04438 11.16%, #fff 142.48%); - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - color: #fff; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; + display: inline-flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + border-radius: 8px; + background: linear-gradient(147deg, #f04438 11.16%, #fff 142.48%); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; } .scrollbarContainer { - display: flex; - height: calc(100% - 16px); - /* max-width: 940px; */ - padding: 8px 6px; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 16px; - border-radius: 100px; - background: #171717; - position: absolute; - right: 6px; + display: flex; + height: calc(100% - 16px); + /* max-width: 940px; */ + padding: 8px 6px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 16px; + border-radius: 100px; + background: #171717; + position: absolute; + right: 6px; } .scrollBar { - height: 100px; - width: 6px; - background-color: #393939; - border-radius: 100px; - position: relative; - overflow: hidden; - flex: 1 0 0; + height: 100px; + width: 6px; + background-color: #393939; + border-radius: 100px; + position: relative; + overflow: hidden; + flex: 1 0 0; } .scrollBarFill { - width: 100%; /* Full width */ - height: 0%; /* Start at 0% height */ - background-color: #f04438; - border-radius: 100px; - transition: height 0.25s ease-in-out; - flex: 1 0 0; + width: 100%; /* Full width */ + height: 0%; /* Start at 0% height */ + background-color: #f04438; + border-radius: 100px; + transition: height 0.25s ease-in-out; + flex: 1 0 0; } .scrollBarsContainer { - display: flex; - flex-direction: column; - gap: 10px; + display: flex; + flex-direction: column; + gap: 10px; } .pill { - display: flex; - height: 28px; - padding: var(--4px, 4px) var(--8px, 8px); - justify-content: center; - align-items: center; - gap: var(--4px, 4px); - border-radius: 16px; - border: 1px solid #b9b9b9; - background: rgba(23, 23, 23, 0.8); - color: #b9b9b9; - text-align: center; - - /* Body 2/Medium */ - font-family: Inter; - font-size: 14px; - font-style: normal; - font-weight: 500; - line-height: 20px; /* 142.857% */ + display: flex; + height: 28px; + padding: var(--4px, 4px) var(--8px, 8px); + justify-content: center; + align-items: center; + gap: var(--4px, 4px); + border-radius: 16px; + border: 1px solid #b9b9b9; + background: rgba(23, 23, 23, 0.8); + color: #b9b9b9; + text-align: center; + + /* Body 2/Medium */ + font-family: Inter; + font-size: 14px; + font-style: normal; + font-weight: 500; + line-height: 20px; /* 142.857% */ } .contentContainer { - display: flex; - flex-direction: column; - align-items: center; - gap: 40px; - align-self: stretch; - overscroll-behavior: none; - -webkit-overflow-scrolling: auto; - margin-top: auto; - margin-bottom: auto; + display: flex; + flex-direction: column; + align-items: center; + gap: 40px; + align-self: stretch; + overscroll-behavior: none; + -webkit-overflow-scrolling: auto; + margin-top: auto; + margin-bottom: auto; } .sectionTitle { - align-self: stretch; - color: #f9fafb; - text-align: center; - font-family: Inter; - font-size: 48px; - font-style: normal; - font-weight: 700; - line-height: 60px; /* 125% */ - letter-spacing: -0.96px; + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 48px; + font-style: normal; + font-weight: 700; + line-height: 60px; /* 125% */ + letter-spacing: -0.96px; } .cards { - display: flex; - justify-content: center; - align-items: flex-start; - align-content: flex-start; - gap: 24px; - flex-wrap: wrap; + display: flex; + justify-content: center; + align-items: flex-start; + align-content: flex-start; + gap: 24px; + flex-wrap: wrap; } .card { - display: flex; - width: 100%; - max-width: 400px; - padding: 24px; - flex-direction: column; - align-items: center; - gap: 16px; - border-radius: 24px; - border: 1px solid #727272; - background: #171717; - height: 100%; - max-height: 426px; - flex: 1 0 0; + display: flex; + width: 100%; + max-width: 400px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + border-radius: 24px; + border: 1px solid #727272; + background: #171717; + height: 100%; + max-height: 426px; + flex: 1 0 0; } .cardTitle { - color: #f9fafb; + color: #f9fafb; - /* Display xs Medium */ - font-family: Inter; - font-size: 24px; - font-style: normal; - font-weight: 500; - line-height: 32px; /* 133.333% */ + /* Display xs Medium */ + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; /* 133.333% */ } .cardImage { - height: 178px; - align-self: stretch; - border-radius: 12px; - border: 1px solid #393939; + height: 178px; + align-self: stretch; + border-radius: 12px; + border: 1px solid #393939; } .cardImageGamers { - background: url('../../assets/G7ReachGamersDark.jpg') lightgray 50% / cover no-repeat; + background: url('../../assets/G7ReachGamersDark.jpg') lightgray 50% / cover no-repeat; } .cardImageLightningQuick { - background: url('../../assets/G7LightningQuickDark.jpg') lightgray 50% / cover no-repeat; + background: url('../../assets/G7LightningQuickDark.jpg') lightgray 50% / cover no-repeat; } .cardImageSpecialEcon { - background: url('../../assets/G7SpecialEconZoneDark.jpg') lightgray 50% / cover no-repeat; + background: url('../../assets/G7SpecialEconZoneDark.jpg') lightgray 50% / cover no-repeat; } .cardDescription { - display: flex; - padding: 24px; - flex-direction: column; - align-items: center; - gap: var(--20px, 20px); - align-self: stretch; - color: #b9b9b9; - text-align: center; - font-family: Inter; - font-size: 18px; - font-style: normal; - font-weight: 400; - line-height: 28px; /* 155.556% */ - border-radius: 12px; - border: 1px solid #727272; - flex-grow: 1; - justify-content: center; + display: flex; + padding: 24px; + flex-direction: column; + align-items: center; + gap: var(--20px, 20px); + align-self: stretch; + color: #b9b9b9; + text-align: center; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: 28px; /* 155.556% */ + border-radius: 12px; + border: 1px solid #727272; + flex-grow: 1; + justify-content: center; } .sponsorCards { - cursor: pointer; - display: flex; - justify-content: center; - align-items: center; - align-content: center; - gap: 24px; - flex-wrap: wrap; + cursor: pointer; + display: flex; + justify-content: center; + align-items: center; + align-content: center; + gap: 24px; + flex-wrap: wrap; } .sponsorCard { - cursor: url('../../assets/hand.svg'), pointer; - display: flex; - height: 120px; - width: 220px; - padding: 31.231px 37.218px 31.257px 37.75px; - justify-content: center; - align-items: center; - border-radius: 12px; - border: 1px solid #727272; - background: #171717; - backdrop-filter: blur(0.6990200281143188px); + cursor: url('../../assets/hand.svg'), pointer; + display: flex; + height: 120px; + width: 220px; + padding: 31.231px 37.218px 31.257px 37.75px; + justify-content: center; + align-items: center; + border-radius: 12px; + border: 1px solid #727272; + background: #171717; + backdrop-filter: blur(0.6990200281143188px); } .sponsorCard::hover { - } .sponsorCardImage { - display: flex; - padding: 8.627px; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 4.313px; + display: flex; + padding: 8.627px; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 4.313px; } .summonLogoContainer { - display: flex; - height: 28px; - padding: 0px 5.637px 0px 0.734px; - align-items: flex-start; - gap: 14.826px; - flex-shrink: 0; + display: flex; + height: 28px; + padding: 0px 5.637px 0px 0.734px; + align-items: flex-start; + gap: 14.826px; + flex-shrink: 0; } .networkEssentialCards { - display: flex; - align-items: flex-start; - gap: 24px; - align-self: stretch; - justify-content: center; - scrollbar-width: none; - flex-wrap: wrap; + display: flex; + align-items: flex-start; + gap: 24px; + align-self: stretch; + justify-content: center; + scrollbar-width: none; + flex-wrap: wrap; } .networkEssentialCards::-webkit-scrollbar { - display: none; + display: none; } .networkEssentialCard { - display: flex; - width: 100%; - max-width: 340px; - height: 422px; - padding: 24px; - flex-direction: column; - align-items: center; - gap: 16px; - border-radius: 24px; - background: #0b0b0b; - border: 1px solid #727272; + display: flex; + width: 100%; + max-width: 340px; + height: 422px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + border-radius: 24px; + background: #0b0b0b; + border: 1px solid #727272; } .networkEssentialCard:hover { - cursor: url('../../assets/hand.svg'), pointer; - border: 1px solid #f04438; + cursor: url('../../assets/hand.svg'), pointer; + border: 1px solid #f04438; } .networkEssentialCardImage { - width: 292px; - height: 178px; - cursor: url('../../assets/hand.svg'), pointer; - border-radius: 12px; - border: 1px solid #393939; - height: 178px; - align-self: stretch; - width: 100%; + width: 292px; + height: 178px; + cursor: url('../../assets/hand.svg'), pointer; + border-radius: 12px; + border: 1px solid #393939; + height: 178px; + align-self: stretch; + width: 100%; } .networkEssentialFaucet { - background: url('../../assets/G7FaucetCardDark.jpg') 50% / cover no-repeat; - background-size: contain; + background: url('../../assets/G7FaucetCardDark.jpg') 50% / cover no-repeat; + background-size: contain; } .networkEssentialBridge { - background: url('../../assets/G7BridgeCardDark.jpg') 50% / cover no-repeat;; - background-size: contain; + background: url('../../assets/G7BridgeCardDark.jpg') 50% / cover no-repeat; + background-size: contain; } .networkEssentialExplorer { - background: url('../../assets/G7ExplorerCardDark.jpg') 50% / cover no-repeat;; - background-size: contain; + background: url('../../assets/G7ExplorerCardDark.jpg') 50% / cover no-repeat; + background-size: contain; } .networkEssentialDocs { - background: url('../../assets/G7DocsCardDark.jpg') 50% / cover no-repeat;; - background-size: contain; + background: url('../../assets/G7DocsCardDark.jpg') 50% / cover no-repeat; + background-size: contain; } .networkEssentialDiscord { - background: url('../../assets/G7DiscordCardDark.jpg') 50% / cover no-repeat; - background-size: contain; + background: url('../../assets/G7DiscordCardDark.jpg') 50% / cover no-repeat; + background-size: contain; } .networkEssentialCardText { - display: flex; - flex-direction: column; - align-items: flex-start; - gap: 8px; - align-self: stretch; - cursor: url('../../assets/hand.svg'), pointer; + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 8px; + align-self: stretch; + cursor: url('../../assets/hand.svg'), pointer; } .networkEssentialCardTitle { - color: #f9fafb; - font-family: Inter; - font-size: 24px; - font-style: normal; - font-weight: 500; - line-height: 32px; /* 133.333% */ - cursor: url('../../assets/hand.svg'), pointer; + color: #f9fafb; + font-family: Inter; + font-size: 24px; + font-style: normal; + font-weight: 500; + line-height: 32px; /* 133.333% */ + cursor: url('../../assets/hand.svg'), pointer; } .networkEssentialCardDescription { - color: #b9b9b9; - font-family: Inter; - font-size: 18px; - font-style: normal; - font-weight: 400; - line-height: 28px; - cursor: url('../../assets/hand.svg'), pointer; + color: #b9b9b9; + font-family: Inter; + font-size: 18px; + font-style: normal; + font-weight: 400; + line-height: 28px; + cursor: url('../../assets/hand.svg'), pointer; } .firstSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + height: var(--Landing-Page-First-Section-Height-Tablet); + flex: 1 0 auto; +} + +.secondSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + flex: 1 0 auto; +} + +.thirdSection { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + align-self: stretch; + flex: 1 0 auto; +} + +@media (max-width: 1199px) { + .layout { + display: flex; + padding: 16px; + flex-direction: column; + align-items: center; + gap: 16px; + } + + .mainLayout { + display: flex; + height: fit-content; + padding: 30px 24px; + flex-direction: column; + align-items: center; + flex: 1 0 0; + justify-content: start; + } + + .contentContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + } + + .titleContainer { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 24px; + padding: 0px; + } + + .titleText { + align-self: stretch; + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 72px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -2px; + text-transform: uppercase; + } + + .firstSection { display: flex; flex-direction: column; justify-content: center; @@ -572,310 +665,229 @@ body { align-self: stretch; height: var(--Landing-Page-First-Section-Height-Tablet); flex: 1 0 auto; -} + } -.secondSection { + .secondSection { display: flex; flex-direction: column; - justify-content: center; + /* justify-content: center; */ align-items: center; align-self: stretch; + /* height: var(--Landing-Page-First-Section-Height-Tablet); */ flex: 1 0 auto; + } + + .thirdSection { + display: flex; + flex-direction: column; + align-items: center; + align-self: stretch; + } + .fourthSection { + display: flex; + flex-direction: column; + align-items: center; + align-self: stretch; + } + + .card { + display: flex; + width: 340px; + padding: 24px; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + width: 100%; + min-width: 300px; + } } -.thirdSection { +@media (max-width: 750px) { + .sectionTitle { + font-size: 30px; + line-height: 38px; + } + + .card { + width: 100%; + max-width: 340px; display: flex; + padding: 16px; flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + height: inherit; + } + + .navbarItem { + display: flex; + padding: 8px; justify-content: center; align-items: center; + gap: 8px; + } + + .titleText { align-self: stretch; - flex: 1 0 auto; -} + color: #f9fafb; + text-align: center; + font-family: Inter; + font-size: 48px; + font-style: normal; + font-weight: 900; + line-height: 100%; + letter-spacing: -2px; + text-transform: uppercase; + } + .startBuildingCTA { + width: 100%; + display: flex; + padding: 10px 18px; + justify-content: center; + align-items: center; + gap: 8px; + /* flex: 1 0 0; */ + border-radius: 8px; + border: 1px solid var(--color-error-Error-500, #f04438); + background: var(--color-error-Error-500, #f04438); + box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); + } + + .navbarContainer { + z-index: 1000; + } + + .navContainer { + padding-top: 100px; + position: fixed; /* Make the menu overlay the entire screen */ + top: 72px; + left: 0; + width: 100vw; /* Full width */ + background-color: rgba(0, 0, 0, 0.75); + z-index: 1000; /* Ensure it's on top */ + padding: 24px 24px 24px 24px; + display: flex; + flex-direction: column; + align-items: flex-start; + justify-content: flex-start; + } + .navItem { + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + color: #d5d5d5; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + } -@media (max-width: 1199px) { - .layout { - display: flex; - padding: 16px; - flex-direction: column; - align-items: center; - gap: 16px; - } - - .mainLayout { - display: flex; - height: fit-content; - padding: 30px 24px; - flex-direction: column; - align-items: center; - flex: 1 0 0; - justify-content: start; - } - - .contentContainer { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 24px; - } - - .titleContainer { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - gap: 24px; - padding: 0px; - } - - .titleText { - align-self: stretch; - color: #f9fafb; - text-align: center; - font-family: Inter; - font-size: 72px; - font-style: normal; - font-weight: 900; - line-height: 100%; - letter-spacing: -2px; - text-transform: uppercase; - } - - .firstSection { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - align-self: stretch; - height: var(--Landing-Page-First-Section-Height-Tablet); - flex: 1 0 auto; - } - - .secondSection { - display: flex; - flex-direction: column; - /* justify-content: center; */ - align-items: center; - align-self: stretch; - /* height: var(--Landing-Page-First-Section-Height-Tablet); */ - flex: 1 0 auto; - } - - .thirdSection { - display: flex; - flex-direction: column; - align-items: center; - align-self: stretch; - } - .fourthSection { - display: flex; - flex-direction: column; - align-items: center; - align-self: stretch; - } - - .card { - display: flex; - width: 340px; - padding: 24px; - flex-direction: column; - align-items: center; - gap: 16px; - align-self: stretch; - width: 100%; - min-width: 300px; - } -} + .navItemHome { + display: flex; + padding: 8px 12px; + align-items: center; + gap: 8px; + align-self: stretch; + color: #fff; + font-family: Inter; + font-size: 16px; + font-style: normal; + font-weight: 600; + line-height: 24px; + } -@media (max-width: 750px) { - .sectionTitle { - font-size: 30px; - line-height: 38px; - } - - .card { - width: 100%; - max-width: 340px; - display: flex; - padding: 16px; - flex-direction: column; - align-items: center; - gap: 16px; - align-self: stretch; - height: inherit; - } - - .navbarItem { - display: flex; - padding: 8px; - justify-content: center; - align-items: center; - gap: 8px; - } - - .titleText { - align-self: stretch; - color: #f9fafb; - text-align: center; - font-family: Inter; - font-size: 48px; - font-style: normal; - font-weight: 900; - line-height: 100%; - letter-spacing: -2px; - text-transform: uppercase; - } - - .startBuildingCTA { - width: 100%; - display: flex; - padding: 10px 18px; - justify-content: center; - align-items: center; - gap: 8px; - /* flex: 1 0 0; */ - border-radius: 8px; - border: 1px solid var(--color-error-Error-500, #f04438); - background: var(--color-error-Error-500, #f04438); - box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); - } - - .navbarContainer { - z-index: 1000; - } - - .navContainer { - padding-top: 100px; - position: fixed; /* Make the menu overlay the entire screen */ - top: 72px; - left: 0; - width: 100vw; /* Full width */ - background-color: rgba(0, 0, 0, 0.75); - z-index: 1000; /* Ensure it's on top */ - padding: 24px 24px 24px 24px; - display: flex; - flex-direction: column; - align-items: flex-start; - justify-content: flex-start; - } - - .navItem { - display: flex; - padding: 8px 12px; - align-items: center; - gap: 8px; - align-self: stretch; - color: #d5d5d5; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; - } - - .navItemHome { - display: flex; - padding: 8px 12px; - align-items: center; - gap: 8px; - align-self: stretch; - color: #fff; - font-family: Inter; - font-size: 16px; - font-style: normal; - font-weight: 600; - line-height: 24px; - } - - .ctaContainer { - display: flex; - padding-top: 32px; - flex-direction: column; - align-items: flex-start; - gap: 4px; - align-self: stretch; - } - - .layoutBlur::before { - content: ''; - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background-color: rgba(0, 0, 0, 0.75); - z-index: 999; - } - - .layout { - padding: 16px; - } - - .networkEssentialCards { - display: flex; - flex-direction: column; - align-items: center; - gap: 16px; - align-self: stretch; - justify-content: center; - flex-wrap: wrap; - } - - .networkEssentialCard { - max-width: 340px; - } - - .contentContainer { - display: flex; - flex-direction: column; - align-items: center; - gap: 24px; - justify-content: space-between; - } - - .mainLayout { - display: flex; - gap: 80px; - padding: 24px; - flex-direction: column; - align-items: center; - flex: 1 0 0; - align-self: stretch; - justify-content: start; - } - - .scrollbarContainer { - position: fixed; - right: 23px; - height: calc(100% - 180px); - } - - .firstSection { - height: var(--Landing-Page-First-Section-Height-Phone); - } -} + .ctaContainer { + display: flex; + padding-top: 32px; + flex-direction: column; + align-items: flex-start; + gap: 4px; + align-self: stretch; + } -@media (min-width: 1440px) { + .layoutBlur::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background-color: rgba(0, 0, 0, 0.75); + z-index: 999; + } + + .layout { + padding: 16px; + } + .networkEssentialCards { + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; + align-self: stretch; + justify-content: center; + flex-wrap: wrap; + } - .networkEssentialCards { - display: flex; - gap: 24px; - align-self: stretch; - justify-content: flex-start; - overflow-x: auto; - flex-wrap: nowrap; - margin: 0 -40px; - padding: 0 40px; - } - - .firstSection { - height: auto; - } - - .networkEssentialCard { - min-width: 340px; - } + .networkEssentialCard { + max-width: 340px; + } + + .contentContainer { + display: flex; + flex-direction: column; + align-items: center; + gap: 24px; + justify-content: space-between; + } + + .mainLayout { + display: flex; + gap: 80px; + padding: 24px; + flex-direction: column; + align-items: center; + flex: 1 0 0; + align-self: stretch; + justify-content: start; + } + + .scrollbarContainer { + position: fixed; + right: 23px; + height: calc(100% - 180px); + } + + .firstSection { + height: var(--Landing-Page-First-Section-Height-Phone); + } +} + +@media (min-width: 1440px) { + .networkEssentialCards { + display: flex; + gap: 24px; + align-self: stretch; + justify-content: flex-start; + overflow-x: auto; + flex-wrap: nowrap; + margin: 0 -40px; + padding: 0 40px; + } + + .firstSection { + height: auto; + } + + .networkEssentialCard { + min-width: 340px; + } } diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index e3863627..549390e5 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -139,14 +139,13 @@ export const useBridgeTransfer = () => { if (!withdrawal) { throw new Error('transaction hash is undefined') } - + let targetChain if (selectedNetworkType === 'Testnet') targetChain = withdrawal.highNetworkChainId === L2_NETWORK.chainId ? L1_NETWORK : L2_NETWORK - else - targetChain = withdrawal.highNetworkChainId === L2_MAIN_NETWORK.chainId ? L1_MAIN_NETWORK : L2_MAIN_NETWORK - - let provider + else targetChain = withdrawal.highNetworkChainId === L2_MAIN_NETWORK.chainId ? L1_MAIN_NETWORK : L2_MAIN_NETWORK + + let provider if (window.ethereum) { provider = new ethers.providers.Web3Provider(window.ethereum) const currentChain = await provider.getNetwork() @@ -158,7 +157,6 @@ export const useBridgeTransfer = () => { throw new Error('Wallet is not installed!') } const signer = provider.getSigner() - console.log(signer) // Bridge Transfer execute const _bridgeTransfer = new BridgeTransfer({ @@ -173,7 +171,7 @@ export const useBridgeTransfer = () => { )?.rpcs[0] }) console.log(_bridgeTransfer) - const res = await _bridgeTransfer?.execute(signer) + const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } }, { @@ -223,7 +221,7 @@ export const useBridgeTransfer = () => { const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - const storageKey = `transaction-inputs-${connectedAccount}` + const storageKey = `bridge-${connectedAccount}-transactions-${selectedNetworkType}` // Retrieve cached transaction inputs from localStorage const getCachedTransactionInputs = () => { diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css index 5675e6ec..7b6dcbfa 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -159,6 +159,7 @@ body { -ms-overflow-style: none; transition: justify-content 0.3s ease; overscroll-behavior: none; + border-color: #1B1B1B; -webkit-overflow-scrolling: auto; } From bc4230936c4b459332aa338fc555c682fe1d84d4 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 23:25:14 +0000 Subject: [PATCH 228/266] mobile changes --- .../src/components/bridge/history/Deposit.tsx | 9 ++++- .../bridge/history/DepositMobile.tsx | 29 +++++++++++---- .../components/bridge/history/Withdrawal.tsx | 2 ++ .../bridge/history/WithdrawalMobile.tsx | 36 +++++++++++-------- 4 files changed, 54 insertions(+), 22 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 200a86d7..5652f72a 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -88,7 +88,14 @@ const Deposit: React.FC = ({ deposit }) => { ) : ( <> {smallView ? ( - + ) : ( <>
diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index cf4345d5..dc1713f0 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -1,21 +1,32 @@ import React, { useState } from 'react' -import { getHighNetworks, getLowNetworks} from '../../../../constants' +import { getHighNetworks, getLowNetworks } from '../../../../constants' import styles from './DepositMobile.module.css' import parentStyles from './WithdrawTransactions.module.css' +import { BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconLinkExternal02 from '@/assets/IconLinkExternal02' +import { NetworkType } from '@/contexts/BlockchainContext' import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' -import { NetworkType } from '@/contexts/BlockchainContext' interface DepositMobileProps { deposit: TransactionRecord isLoading: boolean selectedNetworkType: NetworkType + transactionInputs: any + highNetworkTimestamp: number + transferStatus: any } -const DepositMobile: React.FC = ({ deposit, isLoading, selectedNetworkType }) => { +const DepositMobile: React.FC = ({ + deposit, + isLoading, + selectedNetworkType, + transactionInputs, + highNetworkTimestamp, + transferStatus +}) => { const [isCollapsed, setIsCollapsed] = useState(true) const status = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { @@ -42,7 +53,7 @@ const DepositMobile: React.FC = ({ deposit, isLoading, selec
Deposit
-
{`${deposit.amount} ${deposit.symbol}`}
+
{`${deposit.amount} ${transactionInputs?.tokenSymbol}`}
{!isCollapsed && ( <> @@ -53,7 +64,9 @@ const DepositMobile: React.FC = ({ deposit, isLoading, selec target={'_blank'} className={styles.explorerLink} > - {status?.data?.l2Result?.complete ? ( + {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? (
Completed @@ -79,8 +92,10 @@ const DepositMobile: React.FC = ({ deposit, isLoading, selec
Status
- {status.data && status.data.highNetworkTimestamp ? ( -
{timeAgo(status.data.highNetworkTimestamp)}
+ {transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( +
{timeAgo(highNetworkTimestamp)}
) : (
{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)}
)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index c110442c..da1f0c9c 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -77,7 +77,9 @@ const Withdrawal: React.FC = ({ withdrawal }) => { withdrawal={withdrawal} claim={claim} status={status} + transferStatus={transferStatus} selectedNetworkType={selectedNetworkType} + transactionInputs={transactionInputs} /> ) : ( <> diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index 193635b4..dd75ff90 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -3,32 +3,41 @@ import styles from './DepositMobile.module.css' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import IconWithdrawalNodeCompletedMobile from '@/assets/IconWithdrawalNodeCompletedMobile' import parentStyles from '@/components/bridge/history/WithdrawTransactions.module.css' +import { NetworkType } from '@/contexts/BlockchainContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' import { ChildToParentMessageStatus } from '@arbitrum/sdk' -import { NetworkType } from '@/contexts/BlockchainContext' interface WithdrawalMobileProps { withdrawal: TransactionRecord claim: any status: any + transferStatus: any selectedNetworkType: NetworkType + transactionInputs: any } -const WithdrawalMobile: React.FC = ({ withdrawal, claim, status, selectedNetworkType }) => { +const WithdrawalMobile: React.FC = ({ + withdrawal, + claim, + status, + transferStatus, + selectedNetworkType, + transactionInputs +}) => { const [isCollapsed, setIsCollapsed] = useState(true) - + console.log(transactionInputs) return (
Withdraw
-
{`${withdrawal.amount} ${withdrawal.symbol}`}
+
{`${withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
{!isCollapsed && ( <>
Transaction
- {status?.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( = ({ withdrawal, claim,
)} - {status?.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( = ({ withdrawal, claim,
)} - {status?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( = ({ withdrawal, claim, )}
- {status?.status === ChildToParentMessageStatus.EXECUTED && ( - <> + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( + <>
Initiate
@@ -84,7 +93,7 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim,
Finalize
@@ -108,16 +117,15 @@ const WithdrawalMobile: React.FC = ({ withdrawal, claim, )}
Status
- {status?.status === ChildToParentMessageStatus.CONFIRMED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.CONFIRMED && ( )} - - {status?.status === ChildToParentMessageStatus.EXECUTED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && (
{timeAgo(status.data.lowNetworkTimeStamp)}
)} - {status?.status === ChildToParentMessageStatus.UNCONFIRMED && ( + {transferStatus && transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && (
{ETA(status.data?.timestamp, withdrawal.challengePeriod)}
)}
From cc04319d55fcb81fc99ff6d9195c2c78459a88a2 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 27 Nov 2024 23:27:35 +0000 Subject: [PATCH 229/266] build error --- .../src/components/bridge/history/DepositMobile.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx index dc1713f0..2c76d055 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/DepositMobile.tsx @@ -6,7 +6,6 @@ import { BridgeTransferStatus } from 'game7-bridge-sdk' import { Skeleton, useMediaQuery } from 'summon-ui/mantine' import IconLinkExternal02 from '@/assets/IconLinkExternal02' import { NetworkType } from '@/contexts/BlockchainContext' -import { useDepositStatus } from '@/hooks/useL2ToL1MessageStatus' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' import { getBlockExplorerUrl } from '@/utils/web3utils' @@ -28,7 +27,6 @@ const DepositMobile: React.FC = ({ transferStatus }) => { const [isCollapsed, setIsCollapsed] = useState(true) - const status = useDepositStatus(deposit, selectedNetworkType) const depositInfo = { from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' From 2907b7a35e2902e037c94d3a143276c3d5777531 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 28 Nov 2024 17:27:01 +0000 Subject: [PATCH 230/266] token symbol caching well --- .../src/components/bridge/history/Deposit.tsx | 4 +- .../bridge/history/HistoryDesktop.tsx | 8 +- .../notifications/NotificationsDropModal.tsx | 5 +- .../src/hooks/useBridgeTransfer.ts | 79 +++++++++---------- .../src/hooks/useL2ToL1MessageStatus.ts | 8 +- 5 files changed, 52 insertions(+), 52 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 5652f72a..1d0900c9 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -38,17 +38,17 @@ const Deposit: React.FC = ({ deposit }) => { const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === deposit.lowNetworkHash) if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { + console.log('..') setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) return } const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId) ?.rpcs[0] - if (transferStatus?.completionTxHash) { try { const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') - + console.log(timestamp) if (timestamp) { setHighNetworkTimestamp(timestamp) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 2c17c754..508a8942 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -23,13 +23,15 @@ const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionR // Merge API data, prioritizing latest withdrawal completionTimestamp apiData.forEach((apiTx) => { - const hashKey = apiTx.type === 'DEPOSIT' ? (apiTx.lowNetworkHash ?? '') : (apiTx.highNetworkHash ?? '') + const hashKey = apiTx.type === 'DEPOSIT' ? (apiTx.lowNetworkHash ?? '') : (apiTx.highNetworkHash ?? '') const existingTx = combinedData.get(hashKey) if (existingTx) { if (apiTx.type === 'WITHDRAWAL' && !apiTx.completionTimestamp && existingTx.completionTimestamp) { combinedData.set(hashKey, existingTx) - } + } else if (apiTx.type === 'WITHDRAWAL' && apiTx.completionTimestamp && !existingTx.completionTimestamp) { + combinedData.set(hashKey, apiTx) + } } else { combinedData.set(hashKey, apiTx) } @@ -60,7 +62,7 @@ const mapAPIDataToTransactionRecord = (apiData: any): TransactionRecord => { const HistoryDesktop: React.FC = () => { const { connectedAccount, selectedNetworkType } = useBlockchainContext() - const {data: messages} = useMessages(connectedAccount, selectedNetworkType || 'Testnet') + const { data: messages } = useMessages(connectedAccount, selectedNetworkType || 'Testnet') const { useHistoryTransactions } = useBridgeAPI() const { data: apiTransactions } = useHistoryTransactions(connectedAccount) const [mergedTransactions, setMergedTransactions] = useState([]) diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index 1db3cbe7..d63294ac 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -63,7 +63,7 @@ const NotificationsDropModal: React.FC = ({ notific return (
- {!notifications || (notifications.length === 0 &&
No notifications yet
)} + {!notifications || (notifications.length === 0 &&
No notifications
)} {notifications && notifications.slice(0, 3).map((n, idx) => (
@@ -203,10 +203,9 @@ export const NotificationsModal: React.FC = ({ noti Notifications setIsModalOpened(false)} />
-
Review your notification center
- {!notifications || (notifications.length === 0 &&
No notifications yet
)} + {!notifications || (notifications.length === 0 &&
No notifications
)} {notifications && notifications.slice(0, LIMIT * page + LIMIT).map((n, idx) => (
{ return { status } } }, - staleTime: 2 * 60 * 1000, + staleTime: 0.5 * 60 * 1000, refetchInterval: shouldFetchStatus( getCachedTransactions(connectedAccount ?? '', selectedNetworkType).find((t: any) => t.type === 'DEPOSIT' ? t.lowNetworkHash === txHash : t.highNetworkHash === txHash @@ -170,7 +170,6 @@ export const useBridgeTransfer = () => { (n) => n.chainId === withdrawal.highNetworkChainId )?.rpcs[0] }) - console.log(_bridgeTransfer) const res = await _bridgeTransfer?.execute(signer) return { res, withdrawal } }, @@ -221,42 +220,11 @@ export const useBridgeTransfer = () => { const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - const storageKey = `bridge-${connectedAccount}-transactions-${selectedNetworkType}` - - // Retrieve cached transaction inputs from localStorage - const getCachedTransactionInputs = () => { - const cachedData = localStorage.getItem(storageKey) - if (!cachedData) return null - - const cachedTransactions = JSON.parse(cachedData) - - // Return the specific transaction input based on txHash - return cachedTransactions.find((input: any) => input.txHash === txHash) || null - } - - // Save transaction inputs to localStorage as an array - const saveTransactionInputsToCache = (newInput: any) => { - const cachedData = localStorage.getItem(storageKey) - const cachedTransactions = cachedData ? JSON.parse(cachedData) : [] - - const updatedTransactions = cachedTransactions.some((input: any) => input.txHash === newInput.txHash) - ? cachedTransactions.map((input: any) => (input.txHash === newInput.txHash ? { ...input, ...newInput } : input)) - : [...cachedTransactions, newInput] - - localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)) - } - + let transferInputs: any // Use React Query to fetch or cache transaction inputs return useQuery( ['transactionInputs', txHash], async () => { - const cachedTransactionInputs = getCachedTransactionInputs() - // If found in cache, return the cached data - if (cachedTransactionInputs) { - return cachedTransactionInputs - } - - // Otherwise, fetch transaction inputs from the bridge transfer instance const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -265,18 +233,47 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc }) - const transactionInputs = await _bridgeTransfer.getInfo() + try { + // Fetch status with retry logic + transferInputs = await _bridgeTransfer.getInfo() - saveTransactionInputsToCache({ - ...transactionInputs, - txHash - }) + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + + // Update the cache with the latest status + const newTransactions = transactions.map((t: any) => { + const isSameHash = isDeposit + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash - return transactionInputs + return isSameHash ? { ...t, symbol: transferInputs?.tokenSymbol } : t + }) + + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(newTransactions) + ) + + return transferInputs + } catch (error) { + console.error('Error fetching status:', error) + + // Fallback to cached status if available + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + if (cachedTransaction && cachedTransaction.status !== undefined) { + transferInputs = { tokenSymbol: cachedTransaction.symbol } + return transferInputs // Return cached status + } + + throw error // Re-throw error if no cache + } }, { placeholderData: () => { - return getCachedTransactionInputs() + return getCachedTransactions(connectedAccount ?? '', selectedNetworkType) }, staleTime: 2 * 60 * 1000, // Data is considered fresh for 2 minutes refetchOnWindowFocus: false, // Disable refetching on window focus diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index 177af086..c3455111 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -270,16 +270,18 @@ export const useMessages = ( } export const getNotifications = (transactions: TransactionRecord[]) => { - const completedTransactions = transactions.filter((tx) => tx.completionTimestamp || tx.claimableTimestamp) + const completedTransactions = transactions.filter((tx) => + tx.type === 'DEPOSIT' ? tx.status === 6 || tx.status === 9 : tx.completionTimestamp || tx.claimableTimestamp + ) const notifications: BridgeNotification[] = completedTransactions .map((ct) => { - const timestamp = ct.completionTimestamp ?? ct.claimableTimestamp ?? Date.now() / 1000 // + const timestamp = ct.completionTimestamp ?? ct.claimableTimestamp ?? Date.now() / 1000 return { status: ct.isFailed ? 'FAILED' : ct.completionTimestamp ? 'COMPLETED' : 'CLAIMABLE', type: ct.type, timestamp, amount: ct.amount, - to: (ct.type === 'WITHDRAWAL' ? ct.lowNetworkChainId : ct.highNetworkChainId) ?? 1, //TODO remove null assertion + to: (ct.type === 'WITHDRAWAL' ? ct.lowNetworkChainId : ct.highNetworkChainId) ?? 1, seen: !ct.newTransaction, tx: ct } From 2687c3ffff820baa6c9e05f586ed15db7b7fa4f3 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 28 Nov 2024 17:47:48 +0000 Subject: [PATCH 231/266] caching well --- .../src/components/bridge/history/Deposit.tsx | 4 ---- .../src/components/bridge/history/HistoryDesktop.tsx | 4 ++++ .../components/bridge/history/WithdrawalMobile.tsx | 11 +++++------ .../src/hooks/useBridgeTransfer.ts | 1 - 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 1d0900c9..af840915 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -29,7 +29,6 @@ const Deposit: React.FC = ({ deposit }) => { const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) const [highNetworkTimestamp, setHighNetworkTimestamp] = useState(0) - useEffect(() => { const fetchTimestamp = async () => { if (deposit) { @@ -38,7 +37,6 @@ const Deposit: React.FC = ({ deposit }) => { const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === deposit.lowNetworkHash) if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { - console.log('..') setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) return } @@ -48,13 +46,11 @@ const Deposit: React.FC = ({ deposit }) => { if (transferStatus?.completionTxHash) { try { const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') - console.log(timestamp) if (timestamp) { setHighNetworkTimestamp(timestamp) const updatedTransactions = transactions.map((t: any) => { const isSameHash = t.lowNetworkHash === deposit.lowNetworkHash - return isSameHash ? { ...t, highNetworkTimestamp: timestamp, lastUpdated: Date.now() } : t }) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 508a8942..345b400d 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -31,6 +31,10 @@ const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionR combinedData.set(hashKey, existingTx) } else if (apiTx.type === 'WITHDRAWAL' && apiTx.completionTimestamp && !existingTx.completionTimestamp) { combinedData.set(hashKey, apiTx) + } else if (apiTx.type === 'DEPOSIT' && !apiTx.symbol && existingTx.symbol) { + combinedData.set(hashKey, existingTx) + } else if (apiTx.type === 'DEPOSIT' && !apiTx.symbol && existingTx.symbol) { + combinedData.set(hashKey, apiTx) } } else { combinedData.set(hashKey, apiTx) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx index dd75ff90..93e6b726 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/WithdrawalMobile.tsx @@ -26,7 +26,6 @@ const WithdrawalMobile: React.FC = ({ transactionInputs }) => { const [isCollapsed, setIsCollapsed] = useState(true) - console.log(transactionInputs) return (
@@ -107,11 +106,11 @@ const WithdrawalMobile: React.FC = ({ )}
From
-
{status.data?.from ?? ''}
+
{status?.data?.from ?? ''}
To
-
{status.data?.to ?? ''}
+
{status?.data?.to ?? ''}
)} @@ -123,10 +122,10 @@ const WithdrawalMobile: React.FC = ({ )} {transferStatus && transferStatus?.status === ChildToParentMessageStatus.EXECUTED && ( -
{timeAgo(status.data.lowNetworkTimeStamp)}
+
{timeAgo(status?.data?.lowNetworkTimeStamp)}
)} {transferStatus && transferStatus?.status === ChildToParentMessageStatus.UNCONFIRMED && ( -
{ETA(status.data?.timestamp, withdrawal.challengePeriod)}
+
{ETA(status?.data?.timestamp, withdrawal.challengePeriod)}
)}
setIsCollapsed(!isCollapsed)}> diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 4a8119e1..f40ff025 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -124,7 +124,6 @@ export const useBridgeTransfer = () => { : false, refetchOnWindowFocus: false, enabled: !!txRecord - // retryDelay: (attempt) => Math.min(1000 * 2 ** attempt, 2000) } ) } From 98b4a72d68f9a2288d337a0fe4f340ed837823a9 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 28 Nov 2024 18:45:50 +0000 Subject: [PATCH 232/266] separate storage keys --- .../src/components/bridge/history/Deposit.tsx | 1 + .../src/hooks/useBridgeTransfer.ts | 80 +++++++++---------- 2 files changed, 40 insertions(+), 41 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index af840915..14fba9fe 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -29,6 +29,7 @@ const Deposit: React.FC = ({ deposit }) => { const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) const [highNetworkTimestamp, setHighNetworkTimestamp] = useState(0) + useEffect(() => { const fetchTimestamp = async () => { if (deposit) { diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index f40ff025..b0b7127b 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -219,11 +219,38 @@ export const useBridgeTransfer = () => { const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - let transferInputs: any - // Use React Query to fetch or cache transaction inputs + const storageKey = `transactionInputs-${connectedAccount}-${selectedNetworkType}` + + const getCachedTransactionInputs = () => { + const cachedData = localStorage.getItem(storageKey) + if (!cachedData) return null + + const cachedTransactions: any[] = JSON.parse(cachedData) + console.log(cachedTransactions) + + return cachedTransactions?.find((input: any) => input.txHash === txHash) || null + } + + const saveTransactionInputsToCache = (newInput: any) => { + const cachedData = localStorage.getItem(storageKey) + const cachedTransactions = cachedData ? JSON.parse(cachedData) : [] + + const updatedTransactions = cachedTransactions.some((input: any) => input.txHash === newInput.txHash) + ? cachedTransactions.map((input: any) => (input.txHash === newInput.txHash ? { ...input, ...newInput } : input)) + : [...cachedTransactions, newInput] + + localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)) + } + return useQuery( ['transactionInputs', txHash], async () => { + const cachedTransactionInputs = getCachedTransactionInputs() + + if (cachedTransactionInputs) { + return cachedTransactionInputs + } + const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -232,51 +259,22 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc }) - try { - // Fetch status with retry logic - transferInputs = await _bridgeTransfer.getInfo() - - const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const transactionInputs = await _bridgeTransfer.getInfo() - // Update the cache with the latest status - const newTransactions = transactions.map((t: any) => { - const isSameHash = isDeposit - ? t.lowNetworkHash === txRecord.lowNetworkHash - : t.highNetworkHash === txRecord.highNetworkHash - - return isSameHash ? { ...t, symbol: transferInputs?.tokenSymbol } : t - }) - - localStorage.setItem( - `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - JSON.stringify(newTransactions) - ) - - return transferInputs - } catch (error) { - console.error('Error fetching status:', error) - - // Fallback to cached status if available - const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) - const cachedTransaction = transactions.find((t: any) => - isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - ) - - if (cachedTransaction && cachedTransaction.status !== undefined) { - transferInputs = { tokenSymbol: cachedTransaction.symbol } - return transferInputs // Return cached status - } + saveTransactionInputsToCache({ + ...transactionInputs, + txHash + }) - throw error // Re-throw error if no cache - } + return transactionInputs }, { placeholderData: () => { - return getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + return getCachedTransactionInputs() }, - staleTime: 2 * 60 * 1000, // Data is considered fresh for 2 minutes - refetchOnWindowFocus: false, // Disable refetching on window focus - enabled: !!txRecord // Ensure the query only runs when txRecord exists + staleTime: 2 * 60 * 1000, + refetchOnWindowFocus: false, + enabled: !!txRecord } ) } From 96388c0cceacd3026c722c879725bf72a6bf7f11 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 29 Nov 2024 11:52:44 +0000 Subject: [PATCH 233/266] updated pkg --- webapps/world-builder-dashboard/package.json | 2 +- webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 0de182c9..2588852c 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,7 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", - "game7-bridge-sdk": "^0.0.67", + "game7-bridge-sdk": "^0.0.68", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", "react": "^18.2.0", diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index b0b7127b..36ca36e3 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -226,7 +226,6 @@ export const useBridgeTransfer = () => { if (!cachedData) return null const cachedTransactions: any[] = JSON.parse(cachedData) - console.log(cachedTransactions) return cachedTransactions?.find((input: any) => input.txHash === txHash) || null } From ae8b3ff038f3e10c535e4a71021289828b852200 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 29 Nov 2024 15:28:14 +0000 Subject: [PATCH 234/266] fix transactionInputs caching --- .../src/components/bridge/history/Deposit.tsx | 2 +- .../bridge/history/HistoryDesktop.tsx | 1 - .../notifications/NotificationsDropModal.tsx | 6 +- .../src/hooks/useBridgeTransfer.ts | 57 ++++++++----------- .../utils/bridge/depositERC20ArbitrumSDK.ts | 4 +- 5 files changed, 31 insertions(+), 39 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 14fba9fe..253a2694 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -29,7 +29,7 @@ const Deposit: React.FC = ({ deposit }) => { const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) const [highNetworkTimestamp, setHighNetworkTimestamp] = useState(0) - + useEffect(() => { const fetchTimestamp = async () => { if (deposit) { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 345b400d..82214ff9 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -25,7 +25,6 @@ const mergeTransactions = (apiData: TransactionRecord[], localData: TransactionR apiData.forEach((apiTx) => { const hashKey = apiTx.type === 'DEPOSIT' ? (apiTx.lowNetworkHash ?? '') : (apiTx.highNetworkHash ?? '') const existingTx = combinedData.get(hashKey) - if (existingTx) { if (apiTx.type === 'WITHDRAWAL' && !apiTx.completionTimestamp && existingTx.completionTimestamp) { combinedData.set(hashKey, existingTx) diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index d63294ac..97a220c8 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -25,16 +25,16 @@ interface NotificationsDropModalProps { const copy = (notification: BridgeNotification, selectedNetworkType: NetworkType) => { const targetNetwork = getNetwork(notification.to, selectedNetworkType)?.displayName ?? 'unknown chain' if (notification.status === 'CLAIMABLE') { - return `Heads Up: Your ${notification.amount} ${notification.tx.symbol} withdrawal is complete and you can now claim your assets` + return `Heads Up: Your ${notification.amount} ${notification.tx.transactionInputs?.tokenSymbol} withdrawal is complete and you can now claim your assets` } if (notification.status === 'COMPLETED') { if (notification.type === 'DEPOSIT') { - return `${notification.amount} ${notification.tx.symbol} deposited to ${targetNetwork}` + return `${notification.amount} ${notification.tx.transactionInputs?.tokenSymbol} deposited to ${targetNetwork}` } if (notification.type === 'CLAIM') { return `You requested ${notification.amount} ${L3_NATIVE_TOKEN_SYMBOL}` } - return `Your ${notification.amount} ${notification.tx.symbol} withdrawal is complete` + return `Your ${notification.amount} ${notification.tx.transactionInputs?.tokenSymbol} withdrawal is complete` } } diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 36ca36e3..f3ef7052 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -45,9 +45,9 @@ export const useBridgeTransfer = () => { // If the status is pending and time since last fetched is > 2 minutes, fetch again const shouldFetchStatus = (cachedTransaction: any) => { - const isPending = ![2, 6, 9].includes(cachedTransaction?.status) // Add actual pending statuses + const isPending = ![1, 2, 6, 9].includes(cachedTransaction?.status) const timeSinceLastUpdate = Date.now() - (cachedTransaction?.lastUpdated || 0) - return isPending && timeSinceLastUpdate > 1 * 60 * 1000 // Adjust timing as needed + return isPending && timeSinceLastUpdate > 1 * 60 * 1000 } let status: any @@ -219,37 +219,10 @@ export const useBridgeTransfer = () => { const originChainId = isDeposit ? txRecord.lowNetworkChainId : txRecord.highNetworkChainId const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - const storageKey = `transactionInputs-${connectedAccount}-${selectedNetworkType}` - - const getCachedTransactionInputs = () => { - const cachedData = localStorage.getItem(storageKey) - if (!cachedData) return null - - const cachedTransactions: any[] = JSON.parse(cachedData) - - return cachedTransactions?.find((input: any) => input.txHash === txHash) || null - } - - const saveTransactionInputsToCache = (newInput: any) => { - const cachedData = localStorage.getItem(storageKey) - const cachedTransactions = cachedData ? JSON.parse(cachedData) : [] - - const updatedTransactions = cachedTransactions.some((input: any) => input.txHash === newInput.txHash) - ? cachedTransactions.map((input: any) => (input.txHash === newInput.txHash ? { ...input, ...newInput } : input)) - : [...cachedTransactions, newInput] - - localStorage.setItem(storageKey, JSON.stringify(updatedTransactions)) - } return useQuery( ['transactionInputs', txHash], async () => { - const cachedTransactionInputs = getCachedTransactionInputs() - - if (cachedTransactionInputs) { - return cachedTransactionInputs - } - const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -260,16 +233,34 @@ export const useBridgeTransfer = () => { const transactionInputs = await _bridgeTransfer.getInfo() - saveTransactionInputsToCache({ - ...transactionInputs, - txHash + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + + // Update the cache with the latest status + const newTransactions = transactions.map((t: any) => { + const isSameHash = isDeposit + ? t.lowNetworkHash === txRecord.lowNetworkHash + : t.highNetworkHash === txRecord.highNetworkHash + + return isSameHash ? { ...t, transactionInputs: transactionInputs } : t }) + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(newTransactions) + ) return transactionInputs }, { placeholderData: () => { - return getCachedTransactionInputs() + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + console.log(cachedTransaction) + if (cachedTransaction && cachedTransaction.transactionInputs !== undefined) { + console.log({ transactionInputs: cachedTransaction?.transactionInputs }) + return cachedTransaction?.transactionInputs + } }, staleTime: 2 * 60 * 1000, refetchOnWindowFocus: false, diff --git a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts index 87807591..9bd37793 100644 --- a/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts +++ b/webapps/world-builder-dashboard/src/utils/bridge/depositERC20ArbitrumSDK.ts @@ -1,4 +1,5 @@ import { ethers, providers } from 'ethers' +import { BridgeTransferInfo } from 'game7-bridge-sdk' import { NetworkInterface } from '@/contexts/BlockchainContext' import { convertToBigNumber } from '@/utils/web3utils' import { L2GatewayRouterABI } from '@/web3/ABI/l2GatewayRouter_abi' @@ -40,6 +41,7 @@ export interface TransactionRecord { status?: number ETA?: number tokenAddress?: string + transactionInputs?: BridgeTransferInfo } export const depositERC20ArbitrumSDK = async ( @@ -47,7 +49,7 @@ export const depositERC20ArbitrumSDK = async ( highNetwork: NetworkInterface, amount: string, l1Signer: Signer -): Promise => { +): Promise => { const l2Provider = new providers.JsonRpcProvider(highNetwork.rpcs[0]) const l2Network = await getArbitrumNetwork(l2Provider) From eae0b5d0fd45216975c4646800e70cb2d17ccdab Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 11:34:56 +0000 Subject: [PATCH 235/266] fix clicking notification errro --- .../components/bridge/history/Withdrawal.tsx | 1 - .../notifications/NotificationsDropModal.tsx | 25 ++++++++++++++----- .../src/hooks/useBridgeTransfer.ts | 2 -- .../src/pages/BridgePage/BridgePage.tsx | 2 +- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index da1f0c9c..6a0c1173 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -290,7 +290,6 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
-
{timeAgo(n.timestamp, true)}
+
+ {timeAgo( + n.type === 'DEPOSIT' + ? n.tx.highNetworkTimestamp + ? n.tx.highNetworkTimestamp + : n.timestamp + : n.timestamp, + true + )} +
{copy(n, selectedNetworkType)}
@@ -130,8 +139,10 @@ const iconCloseClassName = (status: string) => { export const FloatingNotification = ({ notifications }: { notifications: BridgeNotification[] }) => { const { setIsDropdownOpened } = useBridgeNotificationsContext() const { selectedNetworkType } = useBlockchainContext() + const [show, setShow] = useState(false) const handleClick = () => { setIsDropdownOpened(true) + setShow(!show) } if (!notifications || notifications.length === 0) { return <> @@ -139,17 +150,19 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN if (notifications.length > 1) { return ( -
- {`You have ${notifications.length} new notifications. Click here to view`} - -
+ show && ( +
+ {`You have ${notifications.length} new notifications. Click here to view`} + +
+ ) ) } return (
{copy(notifications[0], selectedNetworkType)} - +
) } diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index f3ef7052..17291a70 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -256,9 +256,7 @@ export const useBridgeTransfer = () => { const cachedTransaction = transactions.find((t: any) => isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash ) - console.log(cachedTransaction) if (cachedTransaction && cachedTransaction.transactionInputs !== undefined) { - console.log({ transactionInputs: cachedTransaction?.transactionInputs }) return cachedTransaction?.transactionInputs } }, diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index 0f398661..eac27602 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -44,7 +44,7 @@ const BridgePage = () => {
- {notifications.data && } + {notifications.data && }
Bridge
From 7e345fbba70f9e177f0f6ea555cc51d00ad4a686 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 12:39:53 +0000 Subject: [PATCH 236/266] some ui changes --- .../NotificationsButton.module.css | 3 ++- .../notifications/NotificationsButton.tsx | 2 +- .../NotificationsDropModal.module.css | 2 +- .../notifications/NotificationsDropModal.tsx | 18 +++++++----------- .../NotificationsModal.module.css | 10 +++++----- .../src/layouts/MainLayout/DesktopSidebar.tsx | 2 +- .../layouts/MainLayout/MainLayout.module.css | 16 +++++++++------- .../src/layouts/MainLayout/MainLayout.tsx | 7 ++++++- 8 files changed, 32 insertions(+), 28 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.module.css b/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.module.css index 3b9e4c7e..2198ea12 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.module.css +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.module.css @@ -42,7 +42,7 @@ font-weight: 500; line-height: 20px; /* 142.857% */ - position: absolute; + position: absolute; right: 0; top: 0; transform: translateX(12px) translateY(-50%); @@ -51,6 +51,7 @@ /* Mantine classes */ .dropdown { background: var(--Base-White, #ffffff) !important; + border-color: #393939 !important; } .icon { diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.tsx index c0868043..4caea4cc 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsButton.tsx @@ -44,7 +44,7 @@ const NotificationsButton: React.FC = ({ notifications size={'678px'} radius={'12px'} overlayProps={{ - color: 'rgba(52, 64, 84)', + color: 'rgba(57, 57, 57)', backgroundOpacity: 0.7, blur: 8 }} diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css index c048165f..eb1d6399 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css @@ -150,7 +150,7 @@ .content { padding: 10px 0px; - color: var(--Gray-600, #475467); + color: #D5D5D5; /* Text sm/Regular */ font-size: 14px; diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index ca315582..a33a902c 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -81,16 +81,7 @@ const NotificationsDropModal: React.FC = ({ notific
{n.status.toLowerCase()}
)}
-
- {timeAgo( - n.type === 'DEPOSIT' - ? n.tx.highNetworkTimestamp - ? n.tx.highNetworkTimestamp - : n.timestamp - : n.timestamp, - true - )} -
+
{timeAgo(n.timestamp, true)}
{copy(n, selectedNetworkType)}
@@ -144,6 +135,11 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN setIsDropdownOpened(true) setShow(!show) } + + const handleExit = () => { + setShow(!show) + } + if (!notifications || notifications.length === 0) { return <> } @@ -162,7 +158,7 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN return (
{copy(notifications[0], selectedNetworkType)} - +
) } diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsModal.module.css b/webapps/world-builder-dashboard/src/components/notifications/NotificationsModal.module.css index cc642347..e44beaf2 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsModal.module.css +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsModal.module.css @@ -19,7 +19,7 @@ align-items: flex-start; gap: 4px; align-self: stretch; - border-bottom: 1px solid var(--Gray-200, #EAECF0); + border-bottom: 1px solid #393939; background: var(--Base-White, #FFF); } @@ -63,11 +63,11 @@ border-radius: 8px; cursor: pointer; - stroke: #667085; + stroke: #B9B9B9; } .closeButton:hover { - stroke: var(--Gray-600, #475467); + stroke: #fff; } .itemsContainer { @@ -87,7 +87,7 @@ align-self: stretch; width: 100%; - border-bottom: 1px solid var(--Gray-200, #EAECF0); + border-bottom: 1px solid #393939; } .itemWithoutBorder { @@ -175,7 +175,7 @@ } .headerTime { - color: var(--Gray-500, #667085); + color: #B9B9B9; /* Text sm/Regular */ font-size: 14px; diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx index 05e336f3..8a0681fc 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/DesktopSidebar.tsx @@ -41,7 +41,7 @@ const DesktopSidebar: React.FC = ({ navigationItems }) => {
{item.name === 'documentation' || item.name === 'explorer' ? ( - + ) : ( <> )} diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css index 7b54faf8..8afd3d94 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.module.css @@ -62,6 +62,7 @@ .navButton, .selectedNavButton { + cursor: pointer; display: flex; padding: 8px 12px; align-items: center; @@ -80,15 +81,16 @@ text-transform: capitalize; } +.navButton:hover { + background: rgba(57, 57, 57, 0.5); + color: #fff; +} + .selectedNavButton { background: #393939; color: var(--Gray-900, #101828); } -.navButton { - cursor: pointer; -} - .footer { display: flex; padding: 0 16px 32px 16px; @@ -127,7 +129,7 @@ } .iconButton:hover { - stroke: var(--Gray-600, #475467); + stroke: #fff; } @media (max-width: 1199px) { @@ -150,8 +152,8 @@ gap: 8px; flex: 1 0 0; border-radius: 8px; - border: 1px solid var(--Primary-600, #F04438); - background: var(--Primary-600, #F04438); + border: 1px solid var(--Primary-600, #f04438); + background: var(--Primary-600, #f04438); /* Shadow/xs */ box-shadow: 0px 1px 2px 0px rgba(16, 24, 40, 0.05); diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx index d260e94e..f601fddc 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MainLayout.tsx @@ -28,7 +28,12 @@ const MainLayout: React.FC = ({}) => { { name: 'bridge', navigateTo: '/bridge', - icon: + icon: ( + + ) }, { name: 'explorer', From 611eb436f982f5886790a7764d251220fcb8bfbb Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 12:52:08 +0000 Subject: [PATCH 237/266] other ui stuff --- .../commonComponents/networkToggle/NetworkToggle.module.css | 1 + .../notifications/NotificationsDropModal.module.css | 4 ++-- .../src/layouts/MainLayout/MobileSidebar.module.css | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css index e1b26c20..88f0696f 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.module.css @@ -18,6 +18,7 @@ gap: 8px; align-self: stretch; border-radius: 8px; + background-color: #171717; /* border: 1px solid var(--Gray-true-700, #393939); background: var(--Gray-true-800, #171717); */ } diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css index eb1d6399..65d9c402 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.module.css @@ -138,7 +138,7 @@ } .headerTime { - color: var(--Gray-500, #667085); + color: #b9b9b9; /* Text sm/Regular */ font-size: 14px; @@ -150,7 +150,7 @@ .content { padding: 10px 0px; - color: #D5D5D5; + color: #d5d5d5; /* Text sm/Regular */ font-size: 14px; diff --git a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.module.css b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.module.css index 6975cf88..041180e2 100644 --- a/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.module.css +++ b/webapps/world-builder-dashboard/src/layouts/MainLayout/MobileSidebar.module.css @@ -61,7 +61,7 @@ width: 100vw; height: calc(100vh); background-color: rgba(11, 11, 11, 0.8); - backdrop-filter: blur(4px); + backdrop-filter: blur(8px); } .spacer { From 2767413a561017938c700a0f24b040fbd4f427a0 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 15:22:11 +0000 Subject: [PATCH 238/266] click notification close --- .../components/bridge/bridge/TransactionSummary.tsx | 2 +- .../commonComponents/networkToggle/NetworkToggle.tsx | 8 ++++++-- .../notifications/NotificationsDropModal.tsx | 10 ++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx index d14995ec..2da49484 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx @@ -96,7 +96,7 @@ const TransactionSummary: React.FC = ({ )}
) : ( -
{isEstimatingFee ? 'estimating...' : `can't estimate fee`}
+
{isEstimatingFee ? 'Estimating...' : `Can't estimate fee`}
)}
diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 753512dd..502455ce 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -17,8 +17,12 @@ const NetworkToggle: React.FC = () => { useEffect(() => { const networkType = searchParams.get('network') - setSelectedNetworkType(networkType ? (networkType as NetworkType) : selectedNetworkType ? selectedNetworkType : 'Mainnet') - setSearchParams({ network: networkType ? (networkType as string) : selectedNetworkType ? (selectedNetworkType as string) : 'Mainnet' }) + setSelectedNetworkType( + networkType ? (networkType as NetworkType) : selectedNetworkType ? selectedNetworkType : 'Mainnet' + ) + setSearchParams({ + network: networkType ? (networkType as string) : selectedNetworkType ? (selectedNetworkType as string) : 'Mainnet' + }) }, [selectedNetworkType]) const handleNetworkSelect = (network: NetworkType) => { diff --git a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx index a33a902c..564db701 100644 --- a/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx +++ b/webapps/world-builder-dashboard/src/components/notifications/NotificationsDropModal.tsx @@ -139,7 +139,7 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN const handleExit = () => { setShow(!show) } - + if (!notifications || notifications.length === 0) { return <> } @@ -149,7 +149,13 @@ export const FloatingNotification = ({ notifications }: { notifications: BridgeN show && (
{`You have ${notifications.length} new notifications. Click here to view`} - + { + e.stopPropagation() + handleExit() + }} + className={styles.closeIconMultiple} + />
) ) From da8322c4c6bd1e8731435d9b8c0dbbb71b5a6bec Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 16:32:52 +0000 Subject: [PATCH 239/266] remove settings --- .../src/components/bridge/bridge/ActionButton.tsx | 2 +- .../src/components/faucet/FaucetView.tsx | 3 +-- .../src/pages/BridgePage/BridgePage.tsx | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 25ee2571..ebd9a528 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -126,7 +126,7 @@ const ActionButton: React.FC = ({ highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: selectedNetworkType === 'Testnet' ? 60 * 60 : 60 * 60 * 24 * 7, + challengePeriod: selectedNetworkType === 'Testnet' ? (60 * 60) : (60 * 60) * 24 * 7, symbol: symbol, status: BridgeTransferStatus.WITHDRAW_UNCONFIRMED } diff --git a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx index 0e525288..fbc2d036 100644 --- a/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx +++ b/webapps/world-builder-dashboard/src/components/faucet/FaucetView.tsx @@ -239,8 +239,7 @@ const FaucetView: React.FC = ({}) => {
G7 Sepolia Faucet
- Request and get 1 {L3_NATIVE_TOKEN_SYMBOL} token to your connected wallet or an external - address on G7 Sepolia. + Request 1 {L3_NATIVE_TOKEN_SYMBOL} token to your connected wallet or an external address on G7 Sepolia.
diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index eac27602..2be7df1f 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -67,7 +67,7 @@ const BridgePage = () => { > History - {selectedNetworkType === 'Testnet' && ( + {/* {selectedNetworkType === 'Testnet' && ( - )} + )} */}
From 276678bfa8984f33aae13b7e3383778bd4890341 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 17:18:38 +0000 Subject: [PATCH 240/266] gasFee = 0.0025 --- .../src/components/bridge/bridge/ActionButton.tsx | 4 +++- .../src/components/bridge/bridge/BridgeView.tsx | 2 ++ .../bridge/bridge/TransactionSummary.tsx | 2 +- .../components/bridge/bridge/ValueToBridge.tsx | 15 ++++++++++++--- 4 files changed, 18 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index ebd9a528..8dcbb16b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -22,6 +22,7 @@ interface ActionButtonProps { bridger?: Bridger symbol?: string decimals?: number + gasFee?: string } const ActionButton: React.FC = ({ direction, @@ -31,7 +32,8 @@ const ActionButton: React.FC = ({ L2L3message, bridger, symbol, - decimals + decimals, + gasFee }) => { const { connectedAccount, diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 692bc270..307ee663 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -231,6 +231,8 @@ const BridgeView = ({ errorMessage={inputErrorMessages.value} setErrorMessage={(msg) => setInputErrorMessages((prev) => ({ ...prev, value: msg }))} selectedChainId={direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId} + gasFee={estimatedFee.data ?? ""} + isEstimatingFee={estimatedFee.isFetching} /> {direction === 'DEPOSIT' && selectedLowNetwork.chainId === L2_NETWORK.chainId && diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx index 2da49484..2f97335e 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx @@ -87,7 +87,7 @@ const TransactionSummary: React.FC = ({
{`${fee.toFixed(18).replace(/\.?0+$/, '')} ${gasTokenSymbol}`}
{!!(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate)) && (
diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 0fc0af03..740c1575 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -25,6 +25,8 @@ interface ValueToBridgeProps { setErrorMessage: (arg0: string) => void onTokenChange: (token: Token) => void selectedChainId: number + gasFee?: string | undefined + isEstimatingFee?: boolean } const ValueToBridge: React.FC = ({ setValue, @@ -36,7 +38,9 @@ const ValueToBridge: React.FC = ({ errorMessage, setErrorMessage, onTokenChange, - selectedChainId + selectedChainId, + gasFee, + isEstimatingFee }) => { const [tokens, setTokens] = useState([]) const { connectedAccount, selectedBridgeToken, selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() @@ -72,7 +76,7 @@ const ValueToBridge: React.FC = ({ setErrorMessage('Invalid number') return } - if (num > Number(balance)) { + if (num + Number(gasFee) > Number(balance)) { setErrorMessage('Insufficient funds') return } @@ -85,6 +89,7 @@ const ValueToBridge: React.FC = ({ } }, [connectedAccount]) + const handleTokenChange = (token: Token) => { onTokenChange(token) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) @@ -105,7 +110,11 @@ const ValueToBridge: React.FC = ({ disabled={!connectedAccount} placeholder={'0'} /> - {tokens.length > 0 && selectedBridgeToken && ( From f47d054d06e505f7ee77d1bd467259a709e7d104 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Mon, 2 Dec 2024 17:24:41 +0000 Subject: [PATCH 241/266] fix build --- .../src/components/bridge/bridge/ActionButton.tsx | 4 +--- .../src/components/bridge/bridge/BridgeView.tsx | 1 - .../src/components/bridge/bridge/ValueToBridge.tsx | 2 -- .../src/components/bridge/history/Deposit.tsx | 1 - .../src/pages/BridgePage/BridgePage.tsx | 14 +------------- 5 files changed, 2 insertions(+), 20 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 8dcbb16b..ebd9a528 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -22,7 +22,6 @@ interface ActionButtonProps { bridger?: Bridger symbol?: string decimals?: number - gasFee?: string } const ActionButton: React.FC = ({ direction, @@ -32,8 +31,7 @@ const ActionButton: React.FC = ({ L2L3message, bridger, symbol, - decimals, - gasFee + decimals }) => { const { connectedAccount, diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 307ee663..7dd7911b 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -232,7 +232,6 @@ const BridgeView = ({ setErrorMessage={(msg) => setInputErrorMessages((prev) => ({ ...prev, value: msg }))} selectedChainId={direction === 'DEPOSIT' ? selectedLowNetwork.chainId : selectedHighNetwork.chainId} gasFee={estimatedFee.data ?? ""} - isEstimatingFee={estimatedFee.isFetching} /> {direction === 'DEPOSIT' && selectedLowNetwork.chainId === L2_NETWORK.chainId && diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 740c1575..7e8ad4a2 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -26,7 +26,6 @@ interface ValueToBridgeProps { onTokenChange: (token: Token) => void selectedChainId: number gasFee?: string | undefined - isEstimatingFee?: boolean } const ValueToBridge: React.FC = ({ setValue, @@ -40,7 +39,6 @@ const ValueToBridge: React.FC = ({ onTokenChange, selectedChainId, gasFee, - isEstimatingFee }) => { const [tokens, setTokens] = useState([]) const { connectedAccount, selectedBridgeToken, selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 253a2694..9da36271 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -49,7 +49,6 @@ const Deposit: React.FC = ({ deposit }) => { const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') if (timestamp) { setHighNetworkTimestamp(timestamp) - const updatedTransactions = transactions.map((t: any) => { const isSameHash = t.lowNetworkHash === deposit.lowNetworkHash return isSameHash ? { ...t, highNetworkTimestamp: timestamp, lastUpdated: Date.now() } : t diff --git a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx index 2be7df1f..ba4fe277 100644 --- a/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx +++ b/webapps/world-builder-dashboard/src/pages/BridgePage/BridgePage.tsx @@ -23,7 +23,7 @@ export type DepositDirection = 'DEPOSIT' | 'WITHDRAW' const BridgePage = () => { const location = useLocation() const navigate = useNavigate() - const { connectedAccount, selectedNetworkType } = useBlockchainContext() + const { connectedAccount } = useBlockchainContext() const [notificationsOffset] = useState(0) const [notificationsLimit] = useState(10) const [direction, setDirection] = useState('DEPOSIT') @@ -67,18 +67,6 @@ const BridgePage = () => { > History - {/* {selectedNetworkType === 'Testnet' && ( - - )} */}
From d722499686e592c43e6d8a48102b64cd83565654 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 4 Dec 2024 13:01:11 +0000 Subject: [PATCH 242/266] addressed all comments --- webapps/world-builder-dashboard/constants.ts | 6 +- .../src/assets/IconTokenNoSymbol.tsx | 4 +- .../components/bridge/bridge/ActionButton.tsx | 5 +- .../components/bridge/bridge/BridgeView.tsx | 26 ++++- .../bridge/bridge/NetworkSelector.tsx | 4 +- .../bridge/bridge/TransactionSummary.tsx | 6 +- .../bridge/bridge/ValueToBridge.tsx | 2 +- .../src/components/bridge/history/Deposit.tsx | 55 +--------- .../bridge/history/HistoryDesktop.tsx | 16 ++- .../networkToggle/NetworkToggle.tsx | 10 +- .../src/contexts/BlockchainContext.tsx | 11 +- .../src/hooks/useBalance.ts | 4 +- .../src/hooks/useBridgeAPI.ts | 1 - .../src/hooks/useBridgeTransfer.ts | 101 ++++++++++++++---- .../src/hooks/useL2ToL1MessageStatus.ts | 20 ---- 15 files changed, 146 insertions(+), 125 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 5802a49d..e3a262c0 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -81,7 +81,6 @@ export const L2_MAIN_NETWORK: NetworkInterface = { symbol: 'ETH' }, g7TokenAddress: '0xF18e4466F26B4cA55bbAb890b314a54976E45B17', - routerSpender: '0x902b3e5f8f19571859f4ab1003b960a5df693aff', retryableCreationTimeout: 15 * 60 } @@ -97,7 +96,6 @@ export const L3_MAIN_NETWORK: NetworkInterface = { symbol: 'G7T' }, g7TokenAddress: '0x0000000000000000000000000000000000000000', - routerSpender: '0x902b3e5f8f19571859f4ab1003b960a5df693aff', retryableCreationTimeout: 15 * 60, wrappedG7TokenAddress: '0xfa3ed70386b9255fC04aA008A8ad1B0CDa816Fac' } @@ -128,8 +126,6 @@ export const FIVE_MINUTES = 1000 * 60 * 5 export const DEFAULT_STAKE_NATIVE_POOL_ID = '1' -export const MAX_ALLOWANCE_ACCOUNT = '0x9ed191DB1829371F116Deb9748c26B49467a592A' - export const TG7T: TokenAddressMap = { 13746: '0x0000000000000000000000000000000000000000', 421614: '0x10adbf84548f923577be12146eac104c899d1e75', @@ -143,7 +139,7 @@ export const ETH: TokenAddressMap = { export const USDC: TokenAddressMap = { 13746: '0xf2B58E3519C5b977a254993A4A6EaD581A8989A0', - 421614: '0x119f0E6303BEc7021B295EcaB27A4a1A5b37ECf0', + 421614: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', 11155111: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238' } diff --git a/webapps/world-builder-dashboard/src/assets/IconTokenNoSymbol.tsx b/webapps/world-builder-dashboard/src/assets/IconTokenNoSymbol.tsx index f839c71d..af6cbcad 100644 --- a/webapps/world-builder-dashboard/src/assets/IconTokenNoSymbol.tsx +++ b/webapps/world-builder-dashboard/src/assets/IconTokenNoSymbol.tsx @@ -1,6 +1,6 @@ import React from 'react' -const IconTokenNoSynbol: React.FC> = () => ( +const IconTokenNoSymbol: React.FC> = () => ( > = () => ( ) -export default IconTokenNoSynbol +export default IconTokenNoSymbol diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 25ee2571..d0da53ae 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -114,7 +114,10 @@ const ActionButton: React.FC = ({ completionTimestamp: Date.now() / 1000, newTransaction: true, symbol: symbol, - status: BridgeTransferStatus.DEPOSIT_GAS_PENDING + status: + selectedBridgeToken.address === ZERO_ADDRESS + ? BridgeTransferStatus.DEPOSIT_GAS_PENDING + : BridgeTransferStatus.DEPOSIT_ERC20_NOT_YET_CREATED } } else { const tx = await bridger?.transfer({ amount: amountToSend, signer, destinationProvider }) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 692bc270..03654a98 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -30,7 +30,7 @@ import { useCoinGeckoAPI } from '@/hooks/useCoinGeckoAPI' // Hooks and Constants import { DepositDirection } from '@/pages/BridgePage/BridgePage' import { getStakeNativeTxData } from '@/utils/bridge/stakeContractInfo' -import { Token } from '@/utils/tokens' +import { getTokensForNetwork, Token } from '@/utils/tokens' const BridgeView = ({ direction, @@ -56,13 +56,19 @@ const BridgeView = ({ setSelectedHighNetwork, setSelectedBridgeToken, selectedBridgeToken, - selectedNetworkType + selectedNetworkType, + setSelectedNativeToken, + selectedNativeToken } = useBlockchainContext() const { isFetching: isFetchingTokenInformation, data: tokenInformation } = useTokenInformation({ account: connectedAccount, token: selectedBridgeToken }) + const { isFetching: isFetchingNativeTokenInformation, data: nativeTokenInformation } = useTokenInformation({ + account: connectedAccount, + token: selectedNativeToken + }) const { data: coinUSDRate, isFetching: isCoinFetching } = useUSDPriceOfToken(selectedBridgeToken.geckoId ?? '') const handleTokenChange = async (token: Token) => { @@ -126,6 +132,20 @@ const BridgeView = ({ return } try { + if (direction === 'DEPOSIT') { + const token = + getTokensForNetwork(selectedLowNetwork.chainId, connectedAccount).find( + (token) => token.symbol === selectedLowNetwork.nativeCurrency?.symbol + ) ?? null + setSelectedNativeToken(token) + } else if (direction === 'WITHDRAW') { + const token = + getTokensForNetwork(selectedLowNetwork.chainId, connectedAccount).find( + (token) => token.symbol === selectedLowNetwork.nativeCurrency?.symbol + ) ?? null + + setSelectedNativeToken(token) + } const _bridger: Bridger = new Bridger(originChainId, destinationChainId, selectedBridgeToken.tokenAddressMap) setBridger(_bridger) } catch (e) { @@ -251,8 +271,8 @@ const BridgeView = ({ )} combobox.resetSelectedOption() }) - const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() + const { selectedHighNetwork, selectedLowNetwork, setSelectedNativeToken } = useBlockchainContext() const networkLogo = (chainId: number) => { switch (chainId) { @@ -86,7 +86,7 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: Net return ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx index d14995ec..b791e084 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx @@ -38,7 +38,7 @@ const TransactionSummary: React.FC = ({ tokenRate, tokenSymbol, gasTokenSymbol, - value + value, }) => { const clipboard = useClipboard({ timeout: 700 }) @@ -87,7 +87,7 @@ const TransactionSummary: React.FC = ({
{`${fee.toFixed(18).replace(/\.?0+$/, '')} ${gasTokenSymbol}`}
{!!(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate)) && (
@@ -96,7 +96,7 @@ const TransactionSummary: React.FC = ({ )}
) : ( -
{isEstimatingFee ? 'estimating...' : `can't estimate fee`}
+
{isEstimatingFee ? 'Estimating...' : `Can't estimate fee`}
)}
diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx index 0fc0af03..9cf501f3 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ValueToBridge.tsx @@ -41,7 +41,7 @@ const ValueToBridge: React.FC = ({ const [tokens, setTokens] = useState([]) const { connectedAccount, selectedBridgeToken, selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() - const getTokens = async () => { + const getTokens = () => { const highNetworkChainId = String(selectedHighNetwork.chainId) const lowNetworkChainId = String(selectedLowNetwork.chainId) const _tokens = getTokensForNetwork(selectedChainId, connectedAccount) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 253a2694..143f03cb 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -11,71 +11,24 @@ import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeTransfer } from '@/hooks/useBridgeTransfer' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' import { ETA, timeAgo } from '@/utils/timeFormat' -import { fetchTransactionTimestamp, getBlockExplorerUrl, getCachedTransactions } from '@/utils/web3utils' +import { getBlockExplorerUrl } from '@/utils/web3utils' interface DepositProps { deposit: TransactionRecord } const Deposit: React.FC = ({ deposit }) => { - const { selectedNetworkType, connectedAccount } = useBlockchainContext() + const { selectedNetworkType } = useBlockchainContext() const smallView = useMediaQuery('(max-width: 1199px)') const depositInfo = { from: getLowNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.lowNetworkChainId)?.displayName ?? '', to: getHighNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId)?.displayName ?? '' } - const { returnTransferData, getTransactionInputs } = useBridgeTransfer() + const { returnTransferData, getTransactionInputs, getHighNetworkTimestamp } = useBridgeTransfer() const { data: transferStatus, isLoading } = returnTransferData({ txRecord: deposit }) const { data: transactionInputs } = getTransactionInputs({ txRecord: deposit }) - const [highNetworkTimestamp, setHighNetworkTimestamp] = useState(0) - - useEffect(() => { - const fetchTimestamp = async () => { - if (deposit) { - const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) - - const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === deposit.lowNetworkHash) - - if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { - setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) - return - } - - const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === deposit.highNetworkChainId) - ?.rpcs[0] - if (transferStatus?.completionTxHash) { - try { - const timestamp = await fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') - if (timestamp) { - setHighNetworkTimestamp(timestamp) - - const updatedTransactions = transactions.map((t: any) => { - const isSameHash = t.lowNetworkHash === deposit.lowNetworkHash - return isSameHash ? { ...t, highNetworkTimestamp: timestamp, lastUpdated: Date.now() } : t - }) - - localStorage.setItem( - `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - JSON.stringify(updatedTransactions) - ) - } - } catch (error) { - console.error('Error fetching timestamp:', error) - - if (cachedTransaction && cachedTransaction.highNetworkTimestamp) { - setHighNetworkTimestamp(cachedTransaction.highNetworkTimestamp) - } - } - } else { - console.log('No completion transaction hash found') - } - } - } - - fetchTimestamp() - }, [transferStatus?.completionTxHash]) - + const { data: highNetworkTimestamp } = getHighNetworkTimestamp({ txRecord: deposit, transferStatus: transferStatus }) return ( <> {isLoading && smallView ? ( diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx index 82214ff9..2e8d0098 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/HistoryDesktop.tsx @@ -77,24 +77,20 @@ const HistoryDesktop: React.FC = () => { const formattedApiTransactions = apiTransactions ? apiTransactions.map(mapAPIDataToTransactionRecord) : [] const combinedTransactions = mergeTransactions(formattedApiTransactions, localTransactions) // Retrieve existing transactions from localStorage - const storedTransactionsString = localStorage.getItem( - `bridge-${connectedAccount}-transactions-${selectedNetworkType}` - ) - const storedTransactions = storedTransactionsString ? JSON.parse(storedTransactionsString) : [] - + // Check if the combined transactions are different from those in localStorage if ( - combinedTransactions.length !== storedTransactions.length || + combinedTransactions.length !== localTransactions.length || !combinedTransactions.every((tx, index) => tx.type === 'DEPOSIT' - ? tx.lowNetworkHash === storedTransactions[index]?.lowNetworkHash - : tx.highNetworkHash === storedTransactions[index]?.highNetworkHash + ? tx.lowNetworkHash === localTransactions[index]?.lowNetworkHash + : tx.highNetworkHash === localTransactions[index]?.highNetworkHash ) ) { // Determine new transactions that aren’t in storedTransactions const newTransactions = combinedTransactions.filter( (newTx) => - !storedTransactions.some((storedTx: TransactionRecord) => + !localTransactions.some((storedTx: TransactionRecord) => storedTx.type === 'DEPOSIT' ? storedTx.lowNetworkHash === newTx.lowNetworkHash : storedTx.highNetworkHash === newTx.highNetworkHash @@ -103,7 +99,7 @@ const HistoryDesktop: React.FC = () => { localStorage.setItem( `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, - JSON.stringify([...storedTransactions, ...newTransactions]) + JSON.stringify([...localTransactions, ...newTransactions]) ) } setMergedTransactions(combinedTransactions) diff --git a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx index 753512dd..1263001e 100644 --- a/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx +++ b/webapps/world-builder-dashboard/src/components/commonComponents/networkToggle/NetworkToggle.tsx @@ -11,14 +11,18 @@ interface NetworkToggleProps {} const NetworkToggle: React.FC = () => { const { selectedNetworkType, setSelectedNetworkType } = useBlockchainContext() const [isDropdownOpen, setDropdownOpen] = useState(false) - const dropdownRef = useRef(null) + const dropdownRef = useRef(null) const [searchParams, setSearchParams] = useSearchParams() const toggleDropdown = () => setDropdownOpen((prev) => !prev) useEffect(() => { const networkType = searchParams.get('network') - setSelectedNetworkType(networkType ? (networkType as NetworkType) : selectedNetworkType ? selectedNetworkType : 'Mainnet') - setSearchParams({ network: networkType ? (networkType as string) : selectedNetworkType ? (selectedNetworkType as string) : 'Mainnet' }) + setSelectedNetworkType( + networkType ? (networkType as NetworkType) : selectedNetworkType ? selectedNetworkType : 'Mainnet' + ) + setSearchParams({ + network: networkType ? (networkType as string) : selectedNetworkType ? (selectedNetworkType as string) : 'Mainnet' + }) }, [selectedNetworkType]) const handleNetworkSelect = (network: NetworkType) => { diff --git a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx index 3e5689f5..3af47d9c 100644 --- a/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx +++ b/webapps/world-builder-dashboard/src/contexts/BlockchainContext.tsx @@ -28,6 +28,8 @@ interface BlockchainContextType { setSelectedHighNetwork: (network: NetworkInterface) => void selectedBridgeToken: Token setSelectedBridgeToken: (token: Token) => void + selectedNativeToken: Token | null + setSelectedNativeToken: (token: Token | null) => void isMetaMask: boolean getProvider: (network: NetworkInterface) => Promise accounts: string[] @@ -90,6 +92,11 @@ export const BlockchainProvider: React.FC = ({ children const [selectedBridgeToken, setSelectedBridgeToken] = useState( getTokensForNetwork(DEFAULT_LOW_NETWORK.chainId, connectedAccount)[0] ) + const [selectedNativeToken, setSelectedNativeToken] = useState( + getTokensForNetwork(DEFAULT_LOW_NETWORK.chainId, connectedAccount).find( + (token) => token.symbol === DEFAULT_LOW_NETWORK.nativeCurrency?.symbol + ) ?? null + ) const tokenAddress = '0x5f88d811246222F6CB54266C42cc1310510b9feA' @@ -315,7 +322,9 @@ export const BlockchainProvider: React.FC = ({ children setSelectedBridgeToken, selectedBridgeToken, selectedNetworkType, - setSelectedNetworkType + setSelectedNetworkType, + setSelectedNativeToken, + selectedNativeToken }} > {children} diff --git a/webapps/world-builder-dashboard/src/hooks/useBalance.ts b/webapps/world-builder-dashboard/src/hooks/useBalance.ts index 065eca72..84350821 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBalance.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBalance.ts @@ -5,14 +5,14 @@ import { Token } from '@/utils/tokens' interface UseBalanceProps { account: string | undefined - token: Token + token: Token | null } const useTokenInformation = ({ account, token }: UseBalanceProps) => { return useQuery( ['balance', account, token], async () => { - if (!account) { + if (!account || !token) { return { tokenBalance: '0', symbol: '' } } const bridgeToken: BridgeToken = new BridgeToken(token.tokenAddressMap, token.chainId) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts index 48850891..675b0687 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeAPI.ts @@ -12,7 +12,6 @@ export const useBridgeAPI = () => { return useQuery( ['historyTransactions', address, selectedNetworkType], async () => { - console.log(selectedNetworkType) const res = await fetch(`${BASE_URL}/bridge/game7${uriSnippet}/${address}/transactions?limit=50&offset=0`, { method: 'GET' }) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 17291a70..565be200 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -7,7 +7,7 @@ import { BridgeTransfer, BridgeTransferStatus } from 'game7-bridge-sdk' import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' import { TransactionRecord } from '@/utils/bridge/depositERC20ArbitrumSDK' -import { getCachedTransactions } from '@/utils/web3utils' +import { fetchTransactionTimestamp, getCachedTransactions } from '@/utils/web3utils' interface UseTransferDataProps { txRecord: TransactionRecord @@ -15,6 +15,24 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() + // Retry function with exponential backoff for handling 429 errors + const retryWithExponentialBackoff = async (fn: () => Promise, retries: number = 5, delay: number = 1000) => { + let attempt = 0 + + while (attempt < retries) { + try { + return await fn() + } catch (error: any) { + if (error?.response?.status === 429 && attempt < retries - 1) { + const retryDelay = delay * 2 ** attempt + await new Promise((resolve) => setTimeout(resolve, retryDelay)) + attempt++ + } else { + throw error // Rethrow error if not 429 or max retries reached + } + } + } + } const returnTransferData = ({ txRecord }: UseTransferDataProps) => { const isDeposit = txRecord.type === 'DEPOSIT' @@ -24,25 +42,6 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - // Retry function with exponential backoff for handling 429 errors - const retryWithExponentialBackoff = async (fn: () => Promise, retries: number = 5, delay: number = 1000) => { - let attempt = 0 - - while (attempt < retries) { - try { - return await fn() - } catch (error: any) { - if (error?.response?.status === 429 && attempt < retries - 1) { - const retryDelay = delay * 2 ** attempt - await new Promise((resolve) => setTimeout(resolve, retryDelay)) - attempt++ - } else { - throw error // Rethrow error if not 429 or max retries reached - } - } - } - } - // If the status is pending and time since last fetched is > 2 minutes, fetch again const shouldFetchStatus = (cachedTransaction: any) => { const isPending = ![1, 2, 6, 9].includes(cachedTransaction?.status) @@ -266,9 +265,71 @@ export const useBridgeTransfer = () => { } ) } + + const getHighNetworkTimestamp = ({ + txRecord, + transferStatus, + }: { + txRecord: any + transferStatus: any + }) => { + + + return useQuery( + ['highNetworkTimestamp', txRecord?.lowNetworkHash], + async () => { + if (!txRecord) throw new Error('Deposit data is missing.') + + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === txRecord.lowNetworkHash) + + if (cachedTransaction?.highNetworkTimestamp) { + return cachedTransaction.highNetworkTimestamp + } + + const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === txRecord.highNetworkChainId) + ?.rpcs[0] + + if (!transferStatus?.completionTxHash) { + console.log('No completion transaction hash found') + throw new Error('Completion transaction hash is missing.') + } + + const timestamp = await retryWithExponentialBackoff(() => + fetchTransactionTimestamp(transferStatus.completionTxHash, destinationRpc ?? '') + ) + + const updatedTransactions = transactions.map((t: any) => { + const isSameHash = t.lowNetworkHash === txRecord.lowNetworkHash + return isSameHash ? { ...t, highNetworkTimestamp: timestamp, lastUpdated: Date.now() } : t + }) + + localStorage.setItem( + `bridge-${connectedAccount}-transactions-${selectedNetworkType}`, + JSON.stringify(updatedTransactions) + ) + + return timestamp + }, + { + placeholderData: () => { + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === txRecord?.lowNetworkHash) + return cachedTransaction?.highNetworkTimestamp + }, + + staleTime: 1 * 60 * 1000, + refetchInterval: false, + refetchOnWindowFocus: false, + enabled: !!txRecord && !!transferStatus?.completionTxHash // Run query only if data is valid + } + ) + } + return { getTransactionInputs, returnTransferData, + getHighNetworkTimestamp, claim } } diff --git a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts index c3455111..6fa60a99 100644 --- a/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts +++ b/webapps/world-builder-dashboard/src/hooks/useL2ToL1MessageStatus.ts @@ -88,26 +88,6 @@ export const getDecodedInputs = (tx: Transaction, ABI: any) => { }) } -// const getDepositTransferType = (tx: Transaction) => { -// if (tx.to === networks[this.destinationNetworkChainId]?.ethBridge?.inbox) { -// try { -// const decodedInputs = getDecodedInputs(tx, INBOX_ABI) -// return { transferType: BridgeTransferType.DEPOSIT_GAS, decodedInputs } -// } catch (_) { -// try { -// const decodedInputs = getDecodedInputs(tx, ERC20_INBOX_ABI) -// return { transferType: BridgeTransferType.DEPOSIT_ERC20_TO_GAS, decodedInputs } -// } catch (_) { -// throw new Error(`Unable to decode inputs - unknown method of inbox contract ${tx.to}`) -// } -// } -// } else if (tx.to === networks[this.destinationNetworkChainId]?.tokenBridge?.parentGatewayRouter) { -// const decodedInputs = getDecodedInputs(tx, L1GatewayRouterABI) -// return { transferType: BridgeTransferType.DEPOSIT_ERC20, decodedInputs } -// } -// throw new Error(`Unable to decode inputs - ${tx.to} is unknown contract`) -// } - const fetchDepositStatus = async (deposit: TransactionRecord, selectedNetworkType: NetworkType) => { const { lowNetworkChainId, highNetworkChainId, lowNetworkHash, lowNetworkTimestamp } = deposit if (lowNetworkChainId === L2_NETWORK.chainId) { From e6d4702d66209e2ad02c8aeebd4df61cda4831ba Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 4 Dec 2024 13:27:32 +0000 Subject: [PATCH 243/266] more random retryWithExp.BackOff --- .../src/hooks/useBridgeTransfer.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 565be200..292f311d 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -16,7 +16,7 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() // Retry function with exponential backoff for handling 429 errors - const retryWithExponentialBackoff = async (fn: () => Promise, retries: number = 5, delay: number = 1000) => { + const retryWithExponentialBackoff = async (fn: () => Promise, retries = 5, delay = 1000, jitterFactor = 0.5) => { let attempt = 0 while (attempt < retries) { @@ -24,7 +24,9 @@ export const useBridgeTransfer = () => { return await fn() } catch (error: any) { if (error?.response?.status === 429 && attempt < retries - 1) { - const retryDelay = delay * 2 ** attempt + const baseDelay = delay *2**attempt + const jitter = baseDelay * (Math.random() * jitterFactor * 2 - jitterFactor) + const retryDelay = Math.max(baseDelay + jitter, 0) await new Promise((resolve) => setTimeout(resolve, retryDelay)) attempt++ } else { @@ -317,7 +319,7 @@ export const useBridgeTransfer = () => { const cachedTransaction = transactions.find((t: any) => t.lowNetworkHash === txRecord?.lowNetworkHash) return cachedTransaction?.highNetworkTimestamp }, - + staleTime: 1 * 60 * 1000, refetchInterval: false, refetchOnWindowFocus: false, From cc6b5e5e2ad03c6a66235e14ef1fa5c131134def Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 4 Dec 2024 15:15:32 +0000 Subject: [PATCH 244/266] clear errors --- .../src/components/bridge/bridge/BridgeView.tsx | 2 +- .../src/components/bridge/bridge/NetworkSelector.tsx | 2 +- .../src/components/bridge/history/Deposit.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 03654a98..735c3158 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -65,7 +65,7 @@ const BridgeView = ({ account: connectedAccount, token: selectedBridgeToken }) - const { isFetching: isFetchingNativeTokenInformation, data: nativeTokenInformation } = useTokenInformation({ + const { data: nativeTokenInformation } = useTokenInformation({ account: connectedAccount, token: selectedNativeToken }) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx index bac8eb1c..7bf93c37 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/NetworkSelector.tsx @@ -28,7 +28,7 @@ const NetworkSelector = ({ networks, onChange, selectedNetwork, direction }: Net onDropdownClose: () => combobox.resetSelectedOption() }) - const { selectedHighNetwork, selectedLowNetwork, setSelectedNativeToken } = useBlockchainContext() + const { selectedHighNetwork, selectedLowNetwork } = useBlockchainContext() const networkLogo = (chainId: number) => { switch (chainId) { diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 143f03cb..43a4a3b1 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -1,5 +1,5 @@ -import React, { useEffect, useState } from 'react' -import { getHighNetworks, getLowNetworks, getNetworks } from '../../../../constants' +import React from 'react' +import { getHighNetworks, getLowNetworks } from '../../../../constants' import DepositMobile from './DepositMobile' import styles from './WithdrawTransactions.module.css' import { ethers } from 'ethers' From 012d90fc16f35411c1e040ffa91be025a7951d1c Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 4 Dec 2024 15:41:49 +0000 Subject: [PATCH 245/266] change gasBalance -> nativeBalance --- .../bridge/bridge/TransactionSummary.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx index b791e084..a8d20857 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/TransactionSummary.tsx @@ -20,16 +20,16 @@ interface TransactionSummaryProps { fee: number isEstimatingFee: boolean value: number - gasBalance: number + nativeBalance: number ethRate: number tokenSymbol: string - gasTokenSymbol: string + nativeTokenSymbol: string tokenRate: number direction: 'DEPOSIT' | 'WITHDRAW' } const TransactionSummary: React.FC = ({ direction, - gasBalance, + nativeBalance, address, transferTime, fee, @@ -37,8 +37,8 @@ const TransactionSummary: React.FC = ({ ethRate, tokenRate, tokenSymbol, - gasTokenSymbol, - value, + nativeTokenSymbol, + value }) => { const clipboard = useClipboard({ timeout: 700 }) @@ -87,8 +87,8 @@ const TransactionSummary: React.FC = ({
{`${fee.toFixed(18).replace(/\.?0+$/, '')} ${gasTokenSymbol}`}
+ title={`Balance: ${String(nativeBalance)} ${nativeTokenSymbol}`} + >{`${fee.toFixed(18).replace(/\.?0+$/, '')} ${nativeTokenSymbol}`}
{!!(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate)) && (
{formatCurrency(fee * (direction === 'DEPOSIT' ? ethRate : tokenRate))} From d5bdf9cb3eac574007d5002768ea98867589b3f0 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 4 Dec 2024 16:08:20 +0000 Subject: [PATCH 246/266] transactionSummary updated w/o errors --- .../src/components/bridge/bridge/BridgeView.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx index 735c3158..913522eb 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/BridgeView.tsx @@ -272,7 +272,7 @@ const BridgeView = ({ Date: Wed, 4 Dec 2024 18:43:49 +0000 Subject: [PATCH 247/266] keys --- webapps/world-builder-dashboard/constants.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index e3a262c0..90c0fec2 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,11 +1,13 @@ import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' +import * as dotenv from 'dotenv'; +dotenv.config() export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://eth-sepolia.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: ['https://eth-sepolia.g.alchemy.com/v2/'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -57,7 +59,7 @@ export const L1_MAIN_NETWORK: NetworkInterface = { chainId: 1, name: 'ethereum', displayName: 'Ethereum', - rpcs: ['https://eth-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: [`https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`], blockExplorerUrls: ['https://etherscan.io'], nativeCurrency: { decimals: 18, @@ -73,7 +75,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { chainId: 42161, name: 'arbitrumOne', displayName: 'Arbitrum One', - rpcs: ['https://arb-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: [`https://arb-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`], blockExplorerUrls: ['https://arbiscan.io'], nativeCurrency: { decimals: 18, From 0e5e1c4352d26ab3a9f3ecaf2a17c1a50eb2957e Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Wed, 4 Dec 2024 18:57:44 +0000 Subject: [PATCH 248/266] destinationTokenAddress check --- .../src/components/bridge/bridge/ActionButton.tsx | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx index 3260d3cb..234a0c7f 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/bridge/ActionButton.tsx @@ -11,6 +11,7 @@ import { Bridger, BridgeTransferStatus } from 'game7-bridge-sdk' // Absolute Imports import { useBlockchainContext } from '@/contexts/BlockchainContext' import { useBridgeNotificationsContext } from '@/contexts/BridgeNotificationsContext' +import { getTokensForNetwork } from '@/utils/tokens' import { ZERO_ADDRESS } from '@/utils/web3utils' interface ActionButtonProps { @@ -84,9 +85,12 @@ const ActionButton: React.FC = ({ const network = networks?.find((n) => n.chainId === bridger?.originNetwork.chainId)! const provider = await getProvider(network) const signer = provider.getSigner() - const destinationRPC = direction === 'DEPOSIT' ? selectedHighNetwork.rpcs[0] : selectedLowNetwork.rpcs[0] + const destinationChain = direction === 'DEPOSIT' ? selectedHighNetwork : selectedLowNetwork + const destinationRPC = destinationChain.rpcs[0] const destinationProvider = new ethers.providers.JsonRpcProvider(destinationRPC) as ethers.providers.Provider - + const destinationTokenAddress = getTokensForNetwork(destinationChain.chainId, connectedAccount).find( + (token) => token.symbol === selectedBridgeToken.symbol + )?.address // Amount to send variable parsed to correct decimal places depending on the token const amountToSend = ethers.utils.parseUnits(amount, decimals) @@ -115,7 +119,7 @@ const ActionButton: React.FC = ({ newTransaction: true, symbol: symbol, status: - selectedBridgeToken.address === ZERO_ADDRESS + destinationTokenAddress === ZERO_ADDRESS ? BridgeTransferStatus.DEPOSIT_GAS_PENDING : BridgeTransferStatus.DEPOSIT_ERC20_NOT_YET_CREATED } @@ -129,7 +133,7 @@ const ActionButton: React.FC = ({ highNetworkChainId: selectedHighNetwork.chainId, highNetworkHash: tx?.hash, highNetworkTimestamp: Date.now() / 1000, - challengePeriod: selectedNetworkType === 'Testnet' ? (60 * 60) : (60 * 60) * 24 * 7, + challengePeriod: selectedNetworkType === 'Testnet' ? 60 * 60 : 60 * 60 * 24 * 7, symbol: symbol, status: BridgeTransferStatus.WITHDRAW_UNCONFIRMED } From 56d6c1142835f30624efc3bb75eb6407441a2a0a Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 5 Dec 2024 09:57:08 +0000 Subject: [PATCH 249/266] dotenv --- webapps/world-builder-dashboard/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/webapps/world-builder-dashboard/package.json b/webapps/world-builder-dashboard/package.json index 2588852c..033eb678 100644 --- a/webapps/world-builder-dashboard/package.json +++ b/webapps/world-builder-dashboard/package.json @@ -18,6 +18,7 @@ "axios": "^1.6.8", "clsx": "^1.2.1", "dayjs": "^1.11.11", + "dotenv": "^16.4.7", "game7-bridge-sdk": "^0.0.68", "history": "^5.3.0", "prettier-plugin-tailwindcss": "^0.6.5", From 1af6e3c1ea0ca167aee730cb05e8e835bb878034 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 5 Dec 2024 11:50:26 +0000 Subject: [PATCH 250/266] Revert "keys" This reverts commit 8da1c79984be68f013cacb253443b3c6186af394. --- webapps/world-builder-dashboard/constants.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 90c0fec2..e3a262c0 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,13 +1,11 @@ import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' -import * as dotenv from 'dotenv'; -dotenv.config() export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://eth-sepolia.g.alchemy.com/v2/'], + rpcs: ['https://eth-sepolia.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -59,7 +57,7 @@ export const L1_MAIN_NETWORK: NetworkInterface = { chainId: 1, name: 'ethereum', displayName: 'Ethereum', - rpcs: [`https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`], + rpcs: ['https://eth-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], blockExplorerUrls: ['https://etherscan.io'], nativeCurrency: { decimals: 18, @@ -75,7 +73,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { chainId: 42161, name: 'arbitrumOne', displayName: 'Arbitrum One', - rpcs: [`https://arb-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`], + rpcs: ['https://arb-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], blockExplorerUrls: ['https://arbiscan.io'], nativeCurrency: { decimals: 18, From 0babb8fb4357f830df06c11ed1027f1c382b9677 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Thu, 5 Dec 2024 11:50:44 +0000 Subject: [PATCH 251/266] constants push --- webapps/world-builder-dashboard/constants.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index e3a262c0..cfab2fe9 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -21,7 +21,7 @@ export const L2_NETWORK: HighNetworkInterface = { chainId: 421614, name: 'arbitrumSepolia', displayName: 'Arbitrum Sepolia', - rpcs: ['https://sepolia-rollup.arbitrum.io/rpc'], + rpcs: ['https://nb.moonstream.to/nb/arbitrum-sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], blockExplorerUrls: ['https://sepolia.arbiscan.io'], nativeCurrency: { decimals: 18, From 46a2eddfd360243cb8841809cd4cb3161df675ec Mon Sep 17 00:00:00 2001 From: kompotkot Date: Fri, 6 Dec 2024 12:15:51 +0000 Subject: [PATCH 252/266] Build of WB dashboard with env vars --- .github/workflows/build_prod_wb-dashboard.yml | 5 +++++ .github/workflows/deploy_manual_branch_wb-dashboard.yml | 6 ++++++ .github/workflows/deploy_prod_wb-dashboard.yml | 5 +++++ .github/workflows/deploy_staging_wb-dashboard.yml | 6 ++++++ 4 files changed, 22 insertions(+) diff --git a/.github/workflows/build_prod_wb-dashboard.yml b/.github/workflows/build_prod_wb-dashboard.yml index 091d9910..237945db 100644 --- a/.github/workflows/build_prod_wb-dashboard.yml +++ b/.github/workflows/build_prod_wb-dashboard.yml @@ -24,6 +24,11 @@ jobs: - name: Build frontend working-directory: ./webapps/world-builder-dashboard + env: + NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} run: | npm install npm run build \ No newline at end of file diff --git a/.github/workflows/deploy_manual_branch_wb-dashboard.yml b/.github/workflows/deploy_manual_branch_wb-dashboard.yml index d6e87d2d..1833ab09 100644 --- a/.github/workflows/deploy_manual_branch_wb-dashboard.yml +++ b/.github/workflows/deploy_manual_branch_wb-dashboard.yml @@ -29,6 +29,12 @@ jobs: - name: Install and build staging app working-directory: ./webapps/world-builder-dashboard + env: + NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_BUILD_TARGET: ${{ github.event.inputs.branch || github.event.pull_request.head.ref }} run: | npm install npm run build diff --git a/.github/workflows/deploy_prod_wb-dashboard.yml b/.github/workflows/deploy_prod_wb-dashboard.yml index 0afcacf8..b12f92f4 100644 --- a/.github/workflows/deploy_prod_wb-dashboard.yml +++ b/.github/workflows/deploy_prod_wb-dashboard.yml @@ -25,6 +25,11 @@ jobs: - name: Install and build production app working-directory: ./webapps/world-builder-dashboard + env: + NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} run: | npm install npm run build diff --git a/.github/workflows/deploy_staging_wb-dashboard.yml b/.github/workflows/deploy_staging_wb-dashboard.yml index bd516742..a3e080c1 100644 --- a/.github/workflows/deploy_staging_wb-dashboard.yml +++ b/.github/workflows/deploy_staging_wb-dashboard.yml @@ -25,6 +25,12 @@ jobs: - name: Install and build staging app working-directory: ./webapps/world-builder-dashboard + env: + NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_BUILD_TARGET: staging run: | npm install npm run build From 22e0c8e455ed67afa640e4f59861db7d4e157448 Mon Sep 17 00:00:00 2001 From: kompotkot Date: Fri, 6 Dec 2024 12:21:33 +0000 Subject: [PATCH 253/266] Reduced number of env vars --- .github/workflows/build_prod_wb-dashboard.yml | 6 ++---- .github/workflows/deploy_manual_branch_wb-dashboard.yml | 6 ++---- .github/workflows/deploy_prod_wb-dashboard.yml | 6 ++---- .github/workflows/deploy_staging_wb-dashboard.yml | 6 ++---- 4 files changed, 8 insertions(+), 16 deletions(-) diff --git a/.github/workflows/build_prod_wb-dashboard.yml b/.github/workflows/build_prod_wb-dashboard.yml index 237945db..fdf031c4 100644 --- a/.github/workflows/build_prod_wb-dashboard.yml +++ b/.github/workflows/build_prod_wb-dashboard.yml @@ -25,10 +25,8 @@ jobs: - name: Build frontend working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} + NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} run: | npm install npm run build \ No newline at end of file diff --git a/.github/workflows/deploy_manual_branch_wb-dashboard.yml b/.github/workflows/deploy_manual_branch_wb-dashboard.yml index 1833ab09..ccb374ad 100644 --- a/.github/workflows/deploy_manual_branch_wb-dashboard.yml +++ b/.github/workflows/deploy_manual_branch_wb-dashboard.yml @@ -30,10 +30,8 @@ jobs: - name: Install and build staging app working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} + NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} NEXT_PUBLIC_BUILD_TARGET: ${{ github.event.inputs.branch || github.event.pull_request.head.ref }} run: | npm install diff --git a/.github/workflows/deploy_prod_wb-dashboard.yml b/.github/workflows/deploy_prod_wb-dashboard.yml index b12f92f4..756d18e7 100644 --- a/.github/workflows/deploy_prod_wb-dashboard.yml +++ b/.github/workflows/deploy_prod_wb-dashboard.yml @@ -26,10 +26,8 @@ jobs: - name: Install and build production app working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} + NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} run: | npm install npm run build diff --git a/.github/workflows/deploy_staging_wb-dashboard.yml b/.github/workflows/deploy_staging_wb-dashboard.yml index a3e080c1..2e70bf2f 100644 --- a/.github/workflows/deploy_staging_wb-dashboard.yml +++ b/.github/workflows/deploy_staging_wb-dashboard.yml @@ -26,10 +26,8 @@ jobs: - name: Install and build staging app working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_SEPOLIA_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ETHEREUM_NB_WB_DASHBOARD_JSON_RPC_URI }} - NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_ARBITRUM_ONE_NB_WB_DASHBOARD_JSON_RPC_URI }} + NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} + NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} NEXT_PUBLIC_BUILD_TARGET: staging run: | npm install From 248bb3d49c5ef430970289aa2c4facb45e3746a7 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 6 Dec 2024 13:22:59 +0000 Subject: [PATCH 254/266] added env variables --- webapps/world-builder-dashboard/constants.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index cfab2fe9..bfe7af7b 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,11 +1,14 @@ -import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' +import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' +import * as export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://eth-sepolia.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: [ + `${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/sepolia/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}` + ], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -21,7 +24,7 @@ export const L2_NETWORK: HighNetworkInterface = { chainId: 421614, name: 'arbitrumSepolia', displayName: 'Arbitrum Sepolia', - rpcs: ['https://nb.moonstream.to/nb/arbitrum-sepolia/jsonrpc/36c13893-c382-405b-a73c-1af3e9e25700'], + rpcs: [`${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/arbitrum-sepolia/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://sepolia.arbiscan.io'], nativeCurrency: { decimals: 18, @@ -57,7 +60,7 @@ export const L1_MAIN_NETWORK: NetworkInterface = { chainId: 1, name: 'ethereum', displayName: 'Ethereum', - rpcs: ['https://eth-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: [`${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/ethereum/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://etherscan.io'], nativeCurrency: { decimals: 18, @@ -73,7 +76,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { chainId: 42161, name: 'arbitrumOne', displayName: 'Arbitrum One', - rpcs: ['https://arb-mainnet.g.alchemy.com/v2/C-njXZM_UTlPbC2ukOvg4ojFz2V9yCS6'], + rpcs: [`${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/arbitrum-one/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://arbiscan.io'], nativeCurrency: { decimals: 18, @@ -107,7 +110,6 @@ export const ALL_LOW_TESTNET_NETWORKS = [L1_NETWORK, L2_NETWORK] export const ALL_HIGH_MAINNET_NETWORKS = [L2_MAIN_NETWORK, L3_MAIN_NETWORK] export const ALL_LOW_MAINNET_NETWORKS = [L1_MAIN_NETWORK, L2_MAIN_NETWORK] - export const L3_NATIVE_TOKEN_SYMBOL = 'TG7T' export const DEFAULT_LOW_NETWORK = L1_NETWORK export const DEFAULT_HIGH_NETWORK = L2_NETWORK @@ -160,8 +162,6 @@ export const USDC_MAINNET: TokenAddressMap = { 1: '0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48' } - - export const getNetworks = (selectedNetworkType: NetworkType) => { switch (selectedNetworkType) { case 'Mainnet': From 2f6be7f6b31a60d1db3c087ba042d9ee0c12c51b Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 6 Dec 2024 14:17:46 +0000 Subject: [PATCH 255/266] updated variables --- webapps/world-builder-dashboard/.env.example | 2 ++ webapps/world-builder-dashboard/constants.ts | 15 ++++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) create mode 100644 webapps/world-builder-dashboard/.env.example diff --git a/webapps/world-builder-dashboard/.env.example b/webapps/world-builder-dashboard/.env.example new file mode 100644 index 00000000..b366510b --- /dev/null +++ b/webapps/world-builder-dashboard/.env.example @@ -0,0 +1,2 @@ +VITE_NB_JSON_RPC_URI="ADD_URI_HERE" +VITE_NB_WB_DASHBOARD_ACCESS_ID="ADD_ACCESS_ID_HERE" \ No newline at end of file diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index bfe7af7b..b27ca2e9 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,13 +1,12 @@ import { TokenAddressMap } from 'game7-bridge-sdk' import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' -import * as export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', rpcs: [ - `${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/sepolia/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}` + `${import.meta.env.VITE_NB_JSON_RPC_URI}/sepolia/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}` ], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { @@ -24,7 +23,9 @@ export const L2_NETWORK: HighNetworkInterface = { chainId: 421614, name: 'arbitrumSepolia', displayName: 'Arbitrum Sepolia', - rpcs: [`${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/arbitrum-sepolia/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}`], + rpcs: [ + `${import.meta.env.VITE_NB_JSON_RPC_URI}/arbitrum-sepolia/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}` + ], blockExplorerUrls: ['https://sepolia.arbiscan.io'], nativeCurrency: { decimals: 18, @@ -60,7 +61,9 @@ export const L1_MAIN_NETWORK: NetworkInterface = { chainId: 1, name: 'ethereum', displayName: 'Ethereum', - rpcs: [`${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/ethereum/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}`], + rpcs: [ + `${import.meta.env.VITE_NB_JSON_RPC_URI}/ethereum/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}` + ], blockExplorerUrls: ['https://etherscan.io'], nativeCurrency: { decimals: 18, @@ -76,7 +79,9 @@ export const L2_MAIN_NETWORK: NetworkInterface = { chainId: 42161, name: 'arbitrumOne', displayName: 'Arbitrum One', - rpcs: [`${process.env.NEXT_PUBLIC_NB_JSON_RPC_URI}/arbitrum-one/jsonrpc/${process.env.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID}`], + rpcs: [ + `${import.meta.env.VITE_NB_JSON_RPC_URI}/arbitrum-one/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}` + ], blockExplorerUrls: ['https://arbiscan.io'], nativeCurrency: { decimals: 18, From f9b57735cff1655f1987b5e769252370b28cb7cc Mon Sep 17 00:00:00 2001 From: kompotkot Date: Fri, 6 Dec 2024 14:50:54 +0000 Subject: [PATCH 256/266] Vite env var --- .github/workflows/build_prod_wb-dashboard.yml | 20 ++++++------- .../deploy_manual_branch_wb-dashboard.yml | 24 +++++++-------- .../workflows/deploy_prod_wb-dashboard.yml | 24 +++++++-------- .../workflows/deploy_staging_wb-dashboard.yml | 30 +++++++++---------- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/.github/workflows/build_prod_wb-dashboard.yml b/.github/workflows/build_prod_wb-dashboard.yml index fdf031c4..fb2e1a6f 100644 --- a/.github/workflows/build_prod_wb-dashboard.yml +++ b/.github/workflows/build_prod_wb-dashboard.yml @@ -1,13 +1,13 @@ name: Build prod WB dashboard on: - pull_request: - branches: - - "main" - - "staging" - paths: - - '.github/workflows/build_prod_wb-dashboard.yml' - - 'webapps/world-builder-dashboard/**' + pull_request: + branches: + - "main" + - "staging" + paths: + - ".github/workflows/build_prod_wb-dashboard.yml" + - "webapps/world-builder-dashboard/**" jobs: build_prod_wb-dashboard: @@ -25,8 +25,8 @@ jobs: - name: Build frontend working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} - NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} + VITE_NB_JSON_RPC_URI: ${{ secrets.VITE_NB_JSON_RPC_URI }} + VITE_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.VITE_NB_WB_DASHBOARD_ACCESS_ID }} run: | npm install - npm run build \ No newline at end of file + npm run build diff --git a/.github/workflows/deploy_manual_branch_wb-dashboard.yml b/.github/workflows/deploy_manual_branch_wb-dashboard.yml index ccb374ad..db6cbb22 100644 --- a/.github/workflows/deploy_manual_branch_wb-dashboard.yml +++ b/.github/workflows/deploy_manual_branch_wb-dashboard.yml @@ -1,12 +1,12 @@ name: Manual Deploy branch WB dashboard on: - workflow_dispatch: # Allow manual trigger - inputs: - branch: - description: "Branch to deploy" - required: true - default: "staging" + workflow_dispatch: # Allow manual trigger + inputs: + branch: + description: "Branch to deploy" + required: true + default: "staging" jobs: deploy_manual_branch_wb-dashboard: @@ -15,7 +15,7 @@ jobs: steps: - name: Show branch name run: | - echo "Running manual deployment for ${{ github.event.inputs.branch || github.event.pull_request.head.ref }} branch" + echo "Running manual deployment for ${{ github.event.inputs.branch || github.event.pull_request.head.ref }} branch" - name: Checkout repository and main branch uses: actions/checkout@v2 @@ -30,17 +30,17 @@ jobs: - name: Install and build staging app working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} - NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} - NEXT_PUBLIC_BUILD_TARGET: ${{ github.event.inputs.branch || github.event.pull_request.head.ref }} + VITE_NB_JSON_RPC_URI: ${{ secrets.VITE_NB_JSON_RPC_URI }} + VITE_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.VITE_NB_WB_DASHBOARD_ACCESS_ID }} + VITE_BUILD_TARGET: ${{ github.event.inputs.branch || github.event.pull_request.head.ref }} run: | npm install npm run build - + - name: Update robots.txt, block alpha for crawlers working-directory: ./webapps/world-builder-dashboard/dist run: | - sed -i "s/Disallow:.*/Disallow: \//" robots.txt + sed -i "s/Disallow:.*/Disallow: \//" robots.txt - name: Upload static site to S3 bucket and invalidate CloudFront cache working-directory: ./webapps/world-builder-dashboard diff --git a/.github/workflows/deploy_prod_wb-dashboard.yml b/.github/workflows/deploy_prod_wb-dashboard.yml index 756d18e7..95e71dfa 100644 --- a/.github/workflows/deploy_prod_wb-dashboard.yml +++ b/.github/workflows/deploy_prod_wb-dashboard.yml @@ -2,11 +2,11 @@ name: Deploy prod WB dashboard on: push: - branches: - - main - paths: - - '.github/workflows/deploy_prod_wb-dashboard.yml' - - 'webapps/world-builder-dashboard/**' + branches: + - main + paths: + - ".github/workflows/deploy_prod_wb-dashboard.yml" + - "webapps/world-builder-dashboard/**" jobs: deploy_prod_wb-dashboard: @@ -26,8 +26,8 @@ jobs: - name: Install and build production app working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} - NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} + VITE_NB_JSON_RPC_URI: ${{ secrets.VITE_NB_JSON_RPC_URI }} + VITE_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.VITE_NB_WB_DASHBOARD_ACCESS_ID }} run: | npm install npm run build @@ -35,8 +35,8 @@ jobs: - name: Publish to CloudFlare Page uses: cloudflare/pages-action@v1 with: - apiToken: ${{ secrets.CF_API_TOKEN_PROD }} - accountId: ${{ secrets.CF_ACCOUNT_ID_PROD }} - projectName: ${{ secrets.CF_PROJECT_NAME_WB_DASHBOARD_PROD }} - directory: ./webapps/world-builder-dashboard/dist - gitHubToken: ${{ secrets.GITHUB_TOKEN }} + apiToken: ${{ secrets.CF_API_TOKEN_PROD }} + accountId: ${{ secrets.CF_ACCOUNT_ID_PROD }} + projectName: ${{ secrets.CF_PROJECT_NAME_WB_DASHBOARD_PROD }} + directory: ./webapps/world-builder-dashboard/dist + gitHubToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/deploy_staging_wb-dashboard.yml b/.github/workflows/deploy_staging_wb-dashboard.yml index 2e70bf2f..00ea641a 100644 --- a/.github/workflows/deploy_staging_wb-dashboard.yml +++ b/.github/workflows/deploy_staging_wb-dashboard.yml @@ -2,11 +2,11 @@ name: Deploy staging WB dashboard on: push: - branches: - - staging - paths: - - '.github/workflows/deploy_staging_wb-dashboard.yml' - - 'webapps/world-builder-dashboard/**' + branches: + - staging + paths: + - ".github/workflows/deploy_staging_wb-dashboard.yml" + - "webapps/world-builder-dashboard/**" jobs: deploy_staging_wb-dashboard: @@ -26,23 +26,23 @@ jobs: - name: Install and build staging app working-directory: ./webapps/world-builder-dashboard env: - NEXT_PUBLIC_NB_JSON_RPC_URI: ${{ secrets.NEXT_PUBLIC_NB_JSON_RPC_URI }} - NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.NEXT_PUBLIC_NB_WB_DASHBOARD_ACCESS_ID }} - NEXT_PUBLIC_BUILD_TARGET: staging + VITE_NB_JSON_RPC_URI: ${{ secrets.VITE_NB_JSON_RPC_URI }} + VITE_NB_WB_DASHBOARD_ACCESS_ID: ${{ secrets.VITE_NB_WB_DASHBOARD_ACCESS_ID }} + VITE_BUILD_TARGET: staging run: | npm install npm run build - + - name: Update robots.txt, block alpha for crawlers working-directory: ./webapps/world-builder-dashboard/dist run: | - sed -i "s/Disallow:.*/Disallow: \//" robots.txt + sed -i "s/Disallow:.*/Disallow: \//" robots.txt - name: Publish to CloudFlare Page uses: cloudflare/pages-action@v1 with: - apiToken: ${{ secrets.CF_API_TOKEN_STAGE }} - accountId: ${{ secrets.CF_ACCOUNT_ID_STAGE }} - projectName: ${{ secrets.CF_PROJECT_NAME_WB_DASHBOARD_STAGE }} - directory: ./webapps/world-builder-dashboard/dist - gitHubToken: ${{ secrets.GITHUB_TOKEN }} + apiToken: ${{ secrets.CF_API_TOKEN_STAGE }} + accountId: ${{ secrets.CF_ACCOUNT_ID_STAGE }} + projectName: ${{ secrets.CF_PROJECT_NAME_WB_DASHBOARD_STAGE }} + directory: ./webapps/world-builder-dashboard/dist + gitHubToken: ${{ secrets.GITHUB_TOKEN }} From a714278ee6f8fd0dc98e4587997031bb880eefc5 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Fri, 6 Dec 2024 18:45:12 +0300 Subject: [PATCH 257/266] style: scrolling speed --- .../src/components/landing/Container.module.css | 2 +- .../src/components/landing/Container.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.module.css b/webapps/world-builder-dashboard/src/components/landing/Container.module.css index 014ac6dc..b53d51b0 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Container.module.css @@ -5,7 +5,7 @@ .viewContainer { position: relative; - height: 8000px; + height: 5000px; } .sticky { diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.tsx b/webapps/world-builder-dashboard/src/components/landing/Container.tsx index 09f1e104..b53d490d 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Container.tsx @@ -27,7 +27,7 @@ const Container: React.FC = ({components, isNavbarOpen, setIsNav useEffect(() => { const handleScroll = () => { - const progress = window.scrollY / (8000 - window.innerHeight) + const progress = window.scrollY / (5000 - window.innerHeight) setProgress(progress * 100) setPage(Math.min(Math.floor(progress * components.length), components.length - 1)); }; From 4829544c495af7990a5d8e12c1e57f1f13943189 Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Fri, 6 Dec 2024 19:17:38 +0300 Subject: [PATCH 258/266] style: networkEssentialCards align --- .../src/components/landing/Landing.module.css | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css index d96f4fd0..68e00ed5 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -891,3 +891,9 @@ body { min-width: 340px; } } + +@media(min-width: 1860px) { + .networkEssentialCards { + justify-content: center; /*cards fit to container */ + } +} From a3cd2b1808bda995fb56897d6ad517b91d7bd648 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 6 Dec 2024 17:27:52 +0000 Subject: [PATCH 259/266] clean constants --- webapps/world-builder-dashboard/constants.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index 90c0fec2..fbb98a10 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,13 +1,11 @@ import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' import { TokenAddressMap } from 'game7-bridge-sdk' -import * as dotenv from 'dotenv'; -dotenv.config() export const L1_NETWORK: NetworkInterface = { chainId: 11155111, name: 'sepolia', displayName: 'Sepolia', - rpcs: ['https://eth-sepolia.g.alchemy.com/v2/'], + rpcs: [`${import.meta.env.VITE_NB_JSON_RPC_URI}/sepolia/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://sepolia.etherscan.io'], nativeCurrency: { decimals: 18, @@ -23,7 +21,7 @@ export const L2_NETWORK: HighNetworkInterface = { chainId: 421614, name: 'arbitrumSepolia', displayName: 'Arbitrum Sepolia', - rpcs: ['https://sepolia-rollup.arbitrum.io/rpc'], + rpcs: [`${import.meta.env.VITE_NB_JSON_RPC_URI}/arbitrum-sepolia/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://sepolia.arbiscan.io'], nativeCurrency: { decimals: 18, @@ -59,7 +57,7 @@ export const L1_MAIN_NETWORK: NetworkInterface = { chainId: 1, name: 'ethereum', displayName: 'Ethereum', - rpcs: [`https://eth-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`], + rpcs: [`${import.meta.env.VITE_NB_JSON_RPC_URI}/ethereum/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://etherscan.io'], nativeCurrency: { decimals: 18, @@ -75,7 +73,7 @@ export const L2_MAIN_NETWORK: NetworkInterface = { chainId: 42161, name: 'arbitrumOne', displayName: 'Arbitrum One', - rpcs: [`https://arb-mainnet.g.alchemy.com/v2/${process.env.ALCHEMY_KEY}`], + rpcs: [`${import.meta.env.VITE_NB_JSON_RPC_URI}/arbitrum-one/jsonrpc/${import.meta.env.VITE_NB_WB_DASHBOARD_ACCESS_ID}`], blockExplorerUrls: ['https://arbiscan.io'], nativeCurrency: { decimals: 18, From c1d54ee6690905a97d61e1127f3c3b76bd0bac48 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Fri, 6 Dec 2024 17:33:48 +0000 Subject: [PATCH 260/266] fix errors --- webapps/world-builder-dashboard/constants.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/webapps/world-builder-dashboard/constants.ts b/webapps/world-builder-dashboard/constants.ts index e1b377c2..79af514e 100644 --- a/webapps/world-builder-dashboard/constants.ts +++ b/webapps/world-builder-dashboard/constants.ts @@ -1,6 +1,5 @@ import { TokenAddressMap } from 'game7-bridge-sdk' import { NetworkInterface, HighNetworkInterface, NetworkType } from '@/contexts/BlockchainContext' -import { TokenAddressMap } from 'game7-bridge-sdk' export const L1_NETWORK: NetworkInterface = { chainId: 11155111, From 218983bdbfb3e99f78f5f41afb54ccf8789a54fa Mon Sep 17 00:00:00 2001 From: Anton Mushnin Date: Sat, 7 Dec 2024 12:46:28 +0300 Subject: [PATCH 261/266] fix: landing placeholder for background image while loading --- .../src/components/landing/Container.tsx | 15 ++++++++++++++- .../src/components/landing/Landing.module.css | 3 +-- .../pages/LandingPage/LandingPage.module.css | 4 +--- .../src/pages/LandingPage/LandingPage.tsx | 18 ++++++++++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/landing/Container.tsx b/webapps/world-builder-dashboard/src/components/landing/Container.tsx index b53d490d..0a530ed3 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Container.tsx +++ b/webapps/world-builder-dashboard/src/components/landing/Container.tsx @@ -3,6 +3,8 @@ import styles from "./Container.module.css"; import parentStyles from "./Landing.module.css" import SegmentedProgressBar from "./SegmentedProgressBar"; import Navbar from "@/components/landing/Navbar"; +import backgroundImage from "../../assets/G7LandingPageBGDark.jpg"; + interface ContainerProps { components: ReactNode[] @@ -23,7 +25,16 @@ const Container: React.FC = ({components, isNavbarOpen, setIsNav const [isFadingOut, setIsFadingOut] = useState(false) const hasRunOnce = useRef(false) //to not fade out at first render + const [backgroundStyle, setBackgroundStyle] = useState(); + + useEffect(() => { + const img = new Image(); + img.src = backgroundImage as string; + img.onload = () => { + setBackgroundStyle(`#1b1b1b url(${backgroundImage}) 50% / cover no-repeat`); + }; + }, []); useEffect(() => { const handleScroll = () => { @@ -69,7 +80,9 @@ const Container: React.FC = ({components, isNavbarOpen, setIsNav navigateLink={navigateLink} /> -
+
{components[pageToRender]}
diff --git a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css index 68e00ed5..8c1133a5 100644 --- a/webapps/world-builder-dashboard/src/components/landing/Landing.module.css +++ b/webapps/world-builder-dashboard/src/components/landing/Landing.module.css @@ -150,9 +150,8 @@ body { align-self: stretch; border-radius: 12px; border: 1px solid #727272; - background: url('../../assets/G7LandingPageBGDark.jpg') lightgray 50% / cover no-repeat; + background-color: #1b1b1b; overflow-y: scroll; - padding: 40px; scrollbar-width: none; -ms-overflow-style: none; transition: justify-content 0.3s ease; diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css index 7b6dcbfa..ede82e95 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.module.css @@ -152,14 +152,12 @@ body { align-self: stretch; border-radius: 12px; border: 1px solid #727272; - background: url('../../assets/G7LandingPageBGDark.jpg') lightgray 50% / cover no-repeat; + background-color: #1b1b1b; overflow-y: scroll; - padding: 40px; scrollbar-width: none; -ms-overflow-style: none; transition: justify-content 0.3s ease; overscroll-behavior: none; - border-color: #1B1B1B; -webkit-overflow-scrolling: auto; } diff --git a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx index a1101b65..05b0ac92 100644 --- a/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx +++ b/webapps/world-builder-dashboard/src/pages/LandingPage/LandingPage.tsx @@ -1,5 +1,5 @@ // LandingPage.tsx -import React, { useState } from 'react' +import React, {useEffect, useState} from 'react' import { useNavigate } from 'react-router-dom' import styles from './LandingPage.module.css' import { useMediaQuery } from 'summon-ui/mantine' @@ -10,6 +10,7 @@ import MainSection from '@/components/landing/MainSection' import Navbar from '@/components/landing/Navbar' import NetworkEssentials from '@/components/landing/NetworksEssentials' import { useBlockchainContext } from '@/contexts/BlockchainContext' +import backgroundImage from "@/assets/G7LandingPageBGDark.jpg"; const LandingPage: React.FC = () => { const navigate = useNavigate() @@ -18,6 +19,17 @@ const LandingPage: React.FC = () => { const smallView = useMediaQuery('(max-width: 750px)') const isLargeView = useMediaQuery('(min-width: 1440px)') + const [backgroundStyle, setBackgroundStyle] = useState(); + + useEffect(() => { + const img = new Image(); + img.src = backgroundImage as string; + + img.onload = () => { + setBackgroundStyle(`#1b1b1b url(${backgroundImage}) 50% / cover no-repeat`); + }; + }, []); + const startBuilding = () => { setSelectedNetworkType('Testnet') navigate('/faucet') @@ -63,7 +75,9 @@ const LandingPage: React.FC = () => { navigateLink={navigateLink} /> -
+
From 534e2b193805f965b0204f80cf63e6e51089fa4f Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Sat, 7 Dec 2024 20:00:52 +0000 Subject: [PATCH 262/266] update cache stale time --- .../src/hooks/useBridgeTransfer.ts | 47 +++++++++++++------ 1 file changed, 32 insertions(+), 15 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 292f311d..8541252a 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -23,14 +23,15 @@ export const useBridgeTransfer = () => { try { return await fn() } catch (error: any) { - if (error?.response?.status === 429 && attempt < retries - 1) { - const baseDelay = delay *2**attempt - const jitter = baseDelay * (Math.random() * jitterFactor * 2 - jitterFactor) + const retryableStatusCodes = [429, 503] + if (retryableStatusCodes.includes(error?.response?.status) && attempt < retries - 1) { + const baseDelay = delay * 2 ** attempt + const jitter = baseDelay * (Math.random() * jitterFactor * 2 - jitterFactor) const retryDelay = Math.max(baseDelay + jitter, 0) await new Promise((resolve) => setTimeout(resolve, retryDelay)) attempt++ } else { - throw error // Rethrow error if not 429 or max retries reached + throw error } } } @@ -56,6 +57,14 @@ export const useBridgeTransfer = () => { return useQuery( ['transferData', txHash], async () => { + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + if (cachedTransaction?.status && !shouldFetchStatus(cachedTransaction)) { + return { status: cachedTransaction.status } + } const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -96,7 +105,7 @@ export const useBridgeTransfer = () => { if (cachedTransaction && cachedTransaction.status !== undefined) { status = cachedTransaction.status - return { status } // Return cached status + return { status, ...cachedTransaction } // Return cached status } throw error // Re-throw error if no cache @@ -221,9 +230,20 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] + // Check cache before setting up the query + const cachedTransactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = cachedTransactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + const hasCachedInputs = cachedTransaction?.transactionInputs !== undefined + + return useQuery( ['transactionInputs', txHash], async () => { + if (hasCachedInputs) { + return cachedTransaction.transactionInputs + } const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -232,8 +252,9 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc }) - const transactionInputs = await _bridgeTransfer.getInfo() - + const transactionInputs = await retryWithExponentialBackoff( + async () => _bridgeTransfer.getInfo() + ) const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) // Update the cache with the latest status @@ -253,15 +274,11 @@ export const useBridgeTransfer = () => { }, { placeholderData: () => { - const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) - const cachedTransaction = transactions.find((t: any) => - isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - ) - if (cachedTransaction && cachedTransaction.transactionInputs !== undefined) { - return cachedTransaction?.transactionInputs + if (hasCachedInputs) { + return cachedTransaction.transactionInputs } }, - staleTime: 2 * 60 * 1000, + staleTime: 30 * 60 * 1000, refetchOnWindowFocus: false, enabled: !!txRecord } @@ -320,7 +337,7 @@ export const useBridgeTransfer = () => { return cachedTransaction?.highNetworkTimestamp }, - staleTime: 1 * 60 * 1000, + staleTime: Infinity, refetchInterval: false, refetchOnWindowFocus: false, enabled: !!txRecord && !!transferStatus?.completionTxHash // Run query only if data is valid From 931a9afaab43410a1054dd2a8bb4e715cafd8172 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Sat, 7 Dec 2024 20:30:40 +0000 Subject: [PATCH 263/266] Massively improve error --- .../src/hooks/useBridgeTransfer.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 8541252a..57d97b3c 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -23,11 +23,18 @@ export const useBridgeTransfer = () => { try { return await fn() } catch (error: any) { - const retryableStatusCodes = [429, 503] - if (retryableStatusCodes.includes(error?.response?.status) && attempt < retries - 1) { + // Add network failure errors to retryable conditions + const isNetworkError = error.message?.includes('net::ERR_FAILED') || + error.message?.includes('Network Error') || + error.code === 'ECONNABORTED' || + !error.response; + const retryableStatusCodes = [429, 503, 502, 500]; + + if ((isNetworkError || retryableStatusCodes.includes(error?.response?.status)) && attempt < retries - 1) { const baseDelay = delay * 2 ** attempt const jitter = baseDelay * (Math.random() * jitterFactor * 2 - jitterFactor) const retryDelay = Math.max(baseDelay + jitter, 0) + console.warn(`Retry attempt ${attempt + 1}/${retries} after ${retryDelay}ms due to:`, error.message) await new Promise((resolve) => setTimeout(resolve, retryDelay)) attempt++ } else { @@ -77,8 +84,6 @@ export const useBridgeTransfer = () => { // Fetch status with retry logic status = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getStatus()) - const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) - // Update the cache with the latest status const newTransactions = transactions.map((t: any) => { const isSameHash = isDeposit @@ -255,6 +260,7 @@ export const useBridgeTransfer = () => { const transactionInputs = await retryWithExponentialBackoff( async () => _bridgeTransfer.getInfo() ) + console.log(transactionInputs) const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) // Update the cache with the latest status From c323ffe64c60fd0003d57776c346b046a36d3449 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Sat, 7 Dec 2024 21:13:27 +0000 Subject: [PATCH 264/266] update retryWithExp. backoff --- .../world-builder-dashboard/src/hooks/useBridgeTransfer.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index 57d97b3c..ba39b699 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -257,10 +257,8 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc }) - const transactionInputs = await retryWithExponentialBackoff( - async () => _bridgeTransfer.getInfo() - ) - console.log(transactionInputs) + const transactionInputs = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getInfo()) + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) // Update the cache with the latest status From 621535a795aef0de2d2362263b43b960c560e082 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Sat, 7 Dec 2024 21:15:42 +0000 Subject: [PATCH 265/266] update cache --- .../src/hooks/useBridgeTransfer.ts | 57 ++++++++++--------- 1 file changed, 31 insertions(+), 26 deletions(-) diff --git a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts index ba39b699..5b7c9662 100644 --- a/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts +++ b/webapps/world-builder-dashboard/src/hooks/useBridgeTransfer.ts @@ -16,7 +16,7 @@ interface UseTransferDataProps { export const useBridgeTransfer = () => { const { connectedAccount, selectedNetworkType, switchChain } = useBlockchainContext() // Retry function with exponential backoff for handling 429 errors - const retryWithExponentialBackoff = async (fn: () => Promise, retries = 5, delay = 1000, jitterFactor = 0.5) => { + const retryWithExponentialBackoff = async (fn: () => Promise, retries = 20, delay = 1000, jitterFactor = 0.5) => { let attempt = 0 while (attempt < retries) { @@ -59,7 +59,7 @@ export const useBridgeTransfer = () => { return isPending && timeSinceLastUpdate > 1 * 60 * 1000 } - let status: any + let transferStatus: any return useQuery( ['transferData', txHash], @@ -82,7 +82,9 @@ export const useBridgeTransfer = () => { try { // Fetch status with retry logic - status = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getStatus()) + const statusResponse = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getStatus()) + transferStatus = statusResponse + // Update the cache with the latest status const newTransactions = transactions.map((t: any) => { @@ -90,7 +92,7 @@ export const useBridgeTransfer = () => { ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - return isSameHash ? { ...t, status: status?.status, lastUpdated: Date.now() } : t + return isSameHash ? { ...t, status: statusResponse?.status, lastUpdated: Date.now() } : t }) localStorage.setItem( @@ -98,7 +100,7 @@ export const useBridgeTransfer = () => { JSON.stringify(newTransactions) ) - return status + return statusResponse } catch (error) { console.error('Error fetching status:', error) @@ -109,8 +111,8 @@ export const useBridgeTransfer = () => { ) if (cachedTransaction && cachedTransaction.status !== undefined) { - status = cachedTransaction.status - return { status, ...cachedTransaction } // Return cached status + transferStatus = cachedTransaction.status + return { status: transferStatus, ...cachedTransaction } // Return cached status } throw error // Re-throw error if no cache @@ -125,8 +127,8 @@ export const useBridgeTransfer = () => { ) if (cachedTransaction && cachedTransaction.status !== undefined) { - status = cachedTransaction.status - return { status } + transferStatus = cachedTransaction.status + return { status: transferStatus } } }, staleTime: 0.5 * 60 * 1000, @@ -235,20 +237,21 @@ export const useBridgeTransfer = () => { const destinationRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === destinationChainId)?.rpcs[0] const originRpc = getNetworks(selectedNetworkType)?.find((n) => n.chainId === originChainId)?.rpcs[0] - // Check cache before setting up the query - const cachedTransactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) - const cachedTransaction = cachedTransactions.find((t: any) => - isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - ) - const hasCachedInputs = cachedTransaction?.transactionInputs !== undefined - return useQuery( ['transactionInputs', txHash], async () => { - if (hasCachedInputs) { + // Get fresh cache data + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + + // Check if we have cached inputs + if (cachedTransaction?.transactionInputs !== undefined) { return cachedTransaction.transactionInputs } + const _bridgeTransfer = new BridgeTransfer({ txHash: txHash ?? '', destinationNetworkChainId: destinationChainId ?? 0, @@ -257,17 +260,17 @@ export const useBridgeTransfer = () => { originSignerOrProviderOrRpc: originRpc }) - const transactionInputs = await retryWithExponentialBackoff(async () => await _bridgeTransfer.getInfo()) - - const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const transactionInputs = await retryWithExponentialBackoff( + async () => _bridgeTransfer.getInfo() + ) - // Update the cache with the latest status + // Update cache with new data const newTransactions = transactions.map((t: any) => { const isSameHash = isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash - return isSameHash ? { ...t, transactionInputs: transactionInputs } : t + return isSameHash ? { ...t, transactionInputs: transactionInputs, lastUpdated: Date.now() } : t }) localStorage.setItem( @@ -278,9 +281,12 @@ export const useBridgeTransfer = () => { }, { placeholderData: () => { - if (hasCachedInputs) { - return cachedTransaction.transactionInputs - } + // Get fresh cache data for placeholder + const transactions = getCachedTransactions(connectedAccount ?? '', selectedNetworkType) + const cachedTransaction = transactions.find((t: any) => + isDeposit ? t.lowNetworkHash === txRecord.lowNetworkHash : t.highNetworkHash === txRecord.highNetworkHash + ) + return cachedTransaction?.transactionInputs }, staleTime: 30 * 60 * 1000, refetchOnWindowFocus: false, @@ -288,7 +294,6 @@ export const useBridgeTransfer = () => { } ) } - const getHighNetworkTimestamp = ({ txRecord, transferStatus, From c48adef5a9fd47bc5ccfb3e42b1cb94304ad6837 Mon Sep 17 00:00:00 2001 From: Memo Khoury Date: Sat, 7 Dec 2024 21:23:00 +0000 Subject: [PATCH 266/266] added loading to tokenSymbol --- .../src/components/bridge/history/Deposit.tsx | 20 ++++++++++++------- .../components/bridge/history/Withdrawal.tsx | 14 +++++++++---- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx index 43a4a3b1..fdbb6d80 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Deposit.tsx @@ -55,9 +55,15 @@ const Deposit: React.FC = ({ deposit }) => {
{timeAgo(deposit.lowNetworkTimestamp)}
-
{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : deposit.amount} ${transactionInputs?.tokenSymbol}`}
+ {!transactionInputs?.tokenSymbol ? ( +
+
Loading
+
+ ) : ( +
+ {`${transactionInputs.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs.amount, 6) : deposit.amount} ${transactionInputs.tokenSymbol}`} +
+ )}
{depositInfo.from}
{depositInfo.to}
<> @@ -74,8 +80,8 @@ const Deposit: React.FC = ({ deposit }) => { >
{transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? (
Completed @@ -98,8 +104,8 @@ const Deposit: React.FC = ({ deposit }) => { ) : (
{transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_REDEEMED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || - transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( + transferStatus?.status === BridgeTransferStatus.DEPOSIT_GAS_DEPOSITED || + transferStatus?.status === BridgeTransferStatus.DEPOSIT_ERC20_FUNDS_DEPOSITED_ON_CHILD ? ( <>{timeAgo(highNetworkTimestamp)} ) : ( <>{ETA(deposit.lowNetworkTimestamp, deposit.retryableCreationTimeout ?? 15 * 60)} diff --git a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx index 6a0c1173..ce70c811 100644 --- a/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx +++ b/webapps/world-builder-dashboard/src/components/bridge/history/Withdrawal.tsx @@ -63,7 +63,7 @@ const Withdrawal: React.FC = ({ withdrawal }) => { const status = getStatus(withdrawal, lowNetworks, highNetworks) const { data: transferStatus, isLoading } = returnTransferData({ txRecord: withdrawal }) const { data: transactionInputs } = getTransactionInputs({ txRecord: withdrawal }) - + return ( <> {status?.isLoading && smallView ? ( @@ -92,9 +92,15 @@ const Withdrawal: React.FC = ({ withdrawal }) => {
{timeAgo(withdrawal.highNetworkTimestamp)}
-
{`${transactionInputs?.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs?.amount, 6) : withdrawal.amount} ${transactionInputs?.tokenSymbol}`}
+ {!transactionInputs?.tokenSymbol ? ( +
+
Loading
+
+ ) : ( +
+ {`${transactionInputs.tokenSymbol === 'USDC' ? ethers.utils.formatUnits(transactionInputs.amount, 6) : withdrawal.amount} ${transactionInputs.tokenSymbol}`} +
+ )}
{status?.data?.from ?? ''}
{status?.data?.to ?? ''}