diff --git a/packages/boba/gateway/package.json b/packages/boba/gateway/package.json index 9545facda3..5324d79f73 100644 --- a/packages/boba/gateway/package.json +++ b/packages/boba/gateway/package.json @@ -26,8 +26,8 @@ "@mui/icons-material": "^5.3.1", "@mui/material": "^5.4.0", "@mui/styles": "^5.3.0", - "@sentry/react": "^7.24.1", - "@sentry/tracing": "^7.24.1", + "@sentry/react": "^7.34.0", + "@sentry/tracing": "^7.34.0", "@typescript-eslint/eslint-plugin": "^5.10.2", "@typescript-eslint/parser": "^5.10.2", "axios": "^0.21.1", diff --git a/packages/boba/gateway/src/actions/farmAction.js b/packages/boba/gateway/src/actions/farmAction.js index aa91df06ef..cdafb74e42 100644 --- a/packages/boba/gateway/src/actions/farmAction.js +++ b/packages/boba/gateway/src/actions/farmAction.js @@ -1,6 +1,6 @@ /* Varna - A Privacy-Preserving Marketplace - Varna uses Fully Homomorphic Encryption to make markets fair. + Varna uses Fully Homomorphic Encryption to make markets fair. Copyright (C) 2021 Enya Inc. Palo Alto, CA This program is free software: you can redistribute it and/or modify @@ -48,7 +48,6 @@ const getFarmInfoSuccess = (L1PoolInfo, L1UserInfo, L2PoolInfo, L2UserInfo) => ( // }) export const getFarmInfo = () => async (dispatch) => { - console.log("getFarmInfo()") dispatch(getFarmInfoBegin()) const [L1LPInfo, L2LPInfo] = await Promise.all([ networkService.getL1LPInfo(), @@ -122,4 +121,4 @@ export function fetchL1LPBalance(currency) { export function fetchL2LPBalance(currency) { return createAction('FETCH/L2LPBALANCE', () => networkService.L2LPBalance(currency)) -} \ No newline at end of file +} diff --git a/packages/boba/gateway/src/actions/networkAction.js b/packages/boba/gateway/src/actions/networkAction.js index 7c46931e34..150daedadf 100644 --- a/packages/boba/gateway/src/actions/networkAction.js +++ b/packages/boba/gateway/src/actions/networkAction.js @@ -13,7 +13,9 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ +import gasService from 'services/gas.service' import networkService from 'services/networkService' +import transctionService from 'services/transaction.service' import { createAction } from './createAction' export function fetchBalances() { @@ -21,17 +23,16 @@ export function fetchBalances() { } export function fetchGas() { - return createAction('GAS/GET', () => networkService.getGas()) + return createAction('GAS/GET', () => gasService.getGas()) } export function addTokenList() { - console.log("addTokenList") return createAction('TOKENLIST/GET', () => networkService.addTokenList()) } export function fetchTransactions() { return createAction('TRANSACTION/GETALL', () => - networkService.getTransactions() + transctionService.getTransactions() ) } @@ -47,10 +48,6 @@ export function fetchFastExits() { ) } -export function fetchExits() { - return createAction('EXIT/GETALL', () => networkService.getExits()) -} - export function exitBOBA(token, value) { return createAction('EXIT/CREATE', () => networkService.exitBOBA(token, value) diff --git a/packages/boba/gateway/src/actions/verifierAction.js b/packages/boba/gateway/src/actions/verifierAction.js index 7cd2e34ffb..8684c26863 100644 --- a/packages/boba/gateway/src/actions/verifierAction.js +++ b/packages/boba/gateway/src/actions/verifierAction.js @@ -13,9 +13,9 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import networkService from 'services/networkService' +import verifierService from 'services/verifier.service' import { createAction } from './createAction' export function fetchVerifierStatus() { - return createAction('VERIFIER/GET', () => networkService.fetchVerifierStatus()) + return createAction('VERIFIER/GET', () => verifierService.getVerifierStatus()) } diff --git a/packages/boba/gateway/src/api/etherScanAxios.js b/packages/boba/gateway/src/api/etherScanAxios.js index c7a2fa84c7..204331d4cf 100644 --- a/packages/boba/gateway/src/api/etherScanAxios.js +++ b/packages/boba/gateway/src/api/etherScanAxios.js @@ -1,39 +1,13 @@ import axios from 'axios' -import { LAYER } from 'util/constant'; -import { getNetwork } from 'util/masterConfig' -const nw = getNetwork() +export default function etherScanInstance(blockExplorer) { -export default function etherScanInstance(networkGateway, layer){ - - let axiosInstance = null; - - if(networkGateway === 'local') { - return null //does not make sense on local - } - else if (networkGateway === 'goerli' && layer === LAYER.L1) { - axiosInstance = axios.create({ - baseURL: nw.goerli.L1.blockExplorer, - }) - } - else if (networkGateway === 'goerli' && layer === LAYER.L2) { - axiosInstance = axios.create({ - baseURL: nw.goerli.L2.blockExplorer, - }) - } - else if (networkGateway === 'mainnet' && layer === LAYER.L1) { - axiosInstance = axios.create({ - baseURL: nw.mainnet.L1.blockExplorer, - }) - } - else if (networkGateway === 'mainnet' && layer === LAYER.L2) { - axiosInstance = axios.create({ - baseURL: nw.mainnet.L2.blockExplorer, - }) - } + let axiosInstance = axios.create({ + baseURL: blockExplorer, + }) axiosInstance.interceptors.request.use((config) => { - config.headers['Accept'] = 'application/json' - config.headers['Content-Type'] = 'application/json' + config.headers[ 'Accept' ] = 'application/json' + config.headers[ 'Content-Type' ] = 'application/json' return config }) diff --git a/packages/boba/gateway/src/api/metaTransactionAxios.js b/packages/boba/gateway/src/api/metaTransactionAxios.js index 8f0bc37044..9d6cfc235d 100644 --- a/packages/boba/gateway/src/api/metaTransactionAxios.js +++ b/packages/boba/gateway/src/api/metaTransactionAxios.js @@ -1,23 +1,11 @@ import axios from 'axios' -import { getBaseServices } from 'util/masterConfig' -export default function metaTransactionAxiosInstance(networkGateway){ +export default function metaTransactionAxiosInstance(networkConfig) { + const url = networkConfig['META_TRANSACTION'] - let axiosInstance = null; - - if(networkGateway === 'local') { - return null //does not make sense on local - } - else if (networkGateway === 'goerli') { - axiosInstance = axios.create({ - baseURL: getBaseServices().GOERLI_META_TRANSACTION, - }) - } - else if (networkGateway === 'mainnet') { - axiosInstance = axios.create({ - baseURL: getBaseServices().MAINNET_META_TRANSACTION, - }) - } + let axiosInstance = axios.create({ + baseURL: url, + }) axiosInstance.interceptors.request.use((config) => { config.headers['Accept'] = 'application/json' diff --git a/packages/boba/gateway/src/api/omgxWatcherAxios.js b/packages/boba/gateway/src/api/omgxWatcherAxios.js index f313540d3e..2255191cf0 100644 --- a/packages/boba/gateway/src/api/omgxWatcherAxios.js +++ b/packages/boba/gateway/src/api/omgxWatcherAxios.js @@ -1,31 +1,15 @@ import axios from 'axios' -import { getNetwork } from 'util/masterConfig' -const nw = getNetwork() -export default function omgxWatcherAxiosInstance(networkGateway){ +export default function omgxWatcherAxiosInstance(networkConfig) { + const watcherUrl = networkConfig[ 'OMGX_WATCHER_URL' ] - let axiosInstance = null - - if(networkGateway === 'local') { - return null //does not make sense on local - } - else if (networkGateway === 'goerli') { - if(nw.goerli.OMGX_WATCHER_URL === null) return - axiosInstance = axios.create({ - baseURL: nw.goerli.OMGX_WATCHER_URL, - }) - } - else if (networkGateway === 'mainnet') { - - if(nw.mainnet.OMGX_WATCHER_URL === null) return - axiosInstance = axios.create({ - baseURL: nw.mainnet.OMGX_WATCHER_URL, - }) - } + let axiosInstance = axios.create({ + baseURL: watcherUrl, + }) axiosInstance.interceptors.request.use((config) => { - config.headers['Accept'] = 'application/json' - config.headers['Content-Type'] = 'application/json' + config.headers[ 'Accept' ] = 'application/json' + config.headers[ 'Content-Type' ] = 'application/json' return config }) diff --git a/packages/boba/gateway/src/api/verifierWatcherAxios.js b/packages/boba/gateway/src/api/verifierWatcherAxios.js index 270aa035b6..55dd883452 100644 --- a/packages/boba/gateway/src/api/verifierWatcherAxios.js +++ b/packages/boba/gateway/src/api/verifierWatcherAxios.js @@ -1,31 +1,15 @@ import axios from 'axios' -import { getNetwork } from 'util/masterConfig' -const nw = getNetwork() -export default function verifierWatcherAxiosInstance(networkGateway){ +export default function verifierWatcherAxiosInstance(networkConfig) { + const url = networkConfig[ 'VERIFIER_WATCHER_URL' ] - let axiosInstance = null - - if(networkGateway === 'local') { - return null //does not make sense on local - } - else if (networkGateway === 'goerli') { - if(nw.goerli.VERIFIER_WATCHER_URL === null) return - axiosInstance = axios.create({ - baseURL: nw.goerli.VERIFIER_WATCHER_URL, - }) - } - else if (networkGateway === 'mainnet') { - - if(nw.mainnet.VERIFIER_WATCHER_URL === null) return - axiosInstance = axios.create({ - baseURL: nw.mainnet.VERIFIER_WATCHER_URL, - }) - } + let axiosInstance = axios.create({ + baseURL: url + }) axiosInstance.interceptors.request.use((config) => { - config.headers['Accept'] = 'application/json' - config.headers['Content-Type'] = 'application/json' + config.headers[ 'Accept' ] = 'application/json' + config.headers[ 'Content-Type' ] = 'application/json' return config }) diff --git a/packages/boba/gateway/src/components/SentryWrapper/SentryWrapper.js b/packages/boba/gateway/src/components/SentryWrapper/SentryWrapper.js index 78f6e7a83f..c1f480c6a0 100644 --- a/packages/boba/gateway/src/components/SentryWrapper/SentryWrapper.js +++ b/packages/boba/gateway/src/components/SentryWrapper/SentryWrapper.js @@ -1,10 +1,9 @@ import React, { useEffect } from 'react' import * as Sentry from '@sentry/react'; -import { BrowserTracing } from '@sentry/tracing'; import { Typography } from '@mui/material'; import { APP_ENV, SENTRY_DSN } from 'util/constant'; import { useSelector } from 'react-redux'; -import { selectNetwork } from 'selectors/networkSelector'; +import { selectActiveNetwork } from 'selectors/networkSelector'; /** @@ -18,7 +17,7 @@ const SentryWrapper = ({ children }) => { - const network = useSelector(selectNetwork()); + const network = useSelector(selectActiveNetwork()); useEffect(() => { const dns = SENTRY_DSN; @@ -33,7 +32,7 @@ const SentryWrapper = ({ onunhandledrejection: false, /// will avoid to send unhandle browser error. onerror: false, }), - new BrowserTracing() + // new BrowserTracing() ], ignoreErrors: [ 'top.GLOBALS', //stop sentry to report the random plugin / extensions errors. diff --git a/packages/boba/gateway/src/components/faucet/Faucet.js b/packages/boba/gateway/src/components/faucet/Faucet.js new file mode 100644 index 0000000000..2d8f7d724c --- /dev/null +++ b/packages/boba/gateway/src/components/faucet/Faucet.js @@ -0,0 +1,149 @@ +import React, { useState } from 'react'; +import { useDispatch, useSelector } from 'react-redux'; +import { selectActiveNetworkType } from 'selectors/networkSelector'; + +import * as G from 'containers/Global.styles' +import { Box, Typography, Input } from '@mui/material'; + +import faucetService from 'services/faucet.service'; +import { openAlert } from 'actions/uiAction'; +import { selectLayer, selectWalletAddress } from 'selectors/setupSelector'; +import { NETWORK_TYPE } from 'util/network/network.util'; +import Copy from 'components/copy/Copy'; +import Button from 'components/button/Button'; +import twitter from 'images/twitter.png' +import { Md5 } from 'ts-md5'; +import networkService from 'services/networkService'; + + +/** + * @Faucet + * - only accessible on L2 for testnet env. + */ + +const Faucet = (props) => { + + const dispatch = useDispatch(); + const activeNetworkType = useSelector(selectActiveNetworkType()); + const layer = useSelector(selectLayer()) + const walletAddress = useSelector(selectWalletAddress()) + + + const [ tweetUrl, setTweetUrl ] = useState("") + const [ isClaimFaucetLoading, setIsClaimFaucetLoading ] = useState(false) + const [ faucetErrorMsg, setFaucetErrorMsg ] = useState("") + + let bobaTag = '' + if (walletAddress) + bobaTag = Md5.hashStr(walletAddress.toLowerCase().substring(2)) + + let BT = '' + let tweet = '' + if (bobaTag) { + BT = "BOBA" + bobaTag.substring(0, 9).toUpperCase() + tweet = networkService.networkConfig.twitterFaucetPromotionText + BT + } + + async function claimAuthenticatedFaucetTokens() { + try { + setIsClaimFaucetLoading(true) + const tweetId = tweetUrl?.match(/twitter\.com\/.*\/status\/(\d+)/)[ 1 ] + const res = await faucetService.getTestnetETHAuthenticatedMetaTransaction(tweetId) + if (!res) { + dispatch(openAlert('Faucet request submitted')) + } else { + setFaucetErrorMsg(res) + } + } catch (err) { + let error = err.message.match(/execution reverted: (.*)\\+"}}/) + if (error) { + error = error[ 1 ] + } else { + error = err?.message ?? err + } + setFaucetErrorMsg(error) + } finally { + setIsClaimFaucetLoading(false) + } + } + + if (layer === 'L2' && + activeNetworkType === NETWORK_TYPE.TESTNET) + { + return ( + + + + + Developer Twitter/Turing test token fountain - your Boba Bubble:{" "} + {BT} + + + + + Welcome developers. + For testnet BOBA and ETH, tweet your Boba Bubble and + then paste the tweet link in the field below. + + + Tweet Now + + + + For the Tweet link, tap the share icon, tap "Share Tweet via", and finally select "Copy link to Tweet". + + + setTweetUrl(e?.target?.value.split('?')[ 0 ])} //remove the superfluous stuff after the "?" + /> + + + You are limited to one fountain call per twitter account per day. + The transaction will not show in your history since it's a MetaTransaction (the gas is covered by Boba). + + + + + {faucetErrorMsg ? {faucetErrorMsg} : null} + + + ) + } + + return null; +} + +export default Faucet; diff --git a/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js b/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js index 7bb2d4b7c9..d95486e00b 100644 --- a/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js +++ b/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js @@ -37,6 +37,9 @@ import { isEqual } from 'lodash' import BN from 'bignumber.js' import { logAmount } from 'util/amountConvert.js' import { HelpOutline } from '@mui/icons-material' +import networkService from 'services/networkService.js' +import { selectActiveNetwork, selectActiveNetworkName } from 'selectors/networkSelector.js' +import { NETWORK } from 'util/network/network.util.js' function FeeSwitcher() { @@ -44,36 +47,35 @@ function FeeSwitcher() { const accountEnabled = useSelector(selectAccountEnabled()) const feeUseBoba = useSelector(selectBobaFeeChoice()) + const networkName = useSelector(selectActiveNetworkName()) + const network = useSelector(selectActiveNetwork()) const layer = useSelector(selectLayer()) const l2Balances = useSelector(selectlayer2Balance, isEqual) const l2BalanceETH = l2Balances.filter((i) => i.symbol === 'ETH') - const balanceETH = l2BalanceETH[0] - + const balanceETH = l2BalanceETH[ 0 ] const l2BalanceBOBA = l2Balances.filter((i) => i.symbol === 'BOBA') - const balanceBOBA = l2BalanceBOBA[0] + const balanceBOBA = l2BalanceBOBA[ 0 ] const dispatchSwitchFee = useCallback(async (targetFee) => { - //console.log("balanceBOBA:",balanceBOBA) - //console.log("balanceETH:",balanceETH) - - let tooSmallETH = false + let tooSmallL1NativeToken = false + let minL1NativeBalance = network === NETWORK.ETHEREUM ? 0.0002 : 0.5 let tooSmallBOBA = false - if(typeof(balanceBOBA) === 'undefined') { + if (typeof (balanceBOBA) === 'undefined') { tooSmallBOBA = true } else { //check actual balance - tooSmallBOBA = new BN(logAmount(balanceBOBA.balance, 18)).lt(new BN(3.0)) + tooSmallBOBA = new BN(logAmount(balanceBOBA.balance, 18)).lt(new BN(1)) } - if(typeof(balanceETH) === 'undefined') { - tooSmallETH = true + if (typeof (balanceETH) === 'undefined') { + tooSmallL1NativeToken = true } else { //check actual balance - tooSmallETH = new BN(logAmount(balanceETH.balance, 18)).lt(new BN(0.002)) + tooSmallL1NativeToken = new BN(logAmount(balanceETH.balance, 18)).lt(new BN(minL1NativeBalance)) } if (!balanceBOBA && !balanceETH) { @@ -86,23 +88,23 @@ function FeeSwitcher() { if (feeUseBoba && targetFee === 'BOBA') { // do nothing - already set to BOBA } - else if ( !feeUseBoba && targetFee === 'ETH' ) { + else if (!feeUseBoba && targetFee === networkService.L1NativeTokenSymbol) { // do nothing - already set to ETH } - else if ( !feeUseBoba && targetFee === 'BOBA' ) { + else if (!feeUseBoba && targetFee === 'BOBA') { // change to BOBA - if( tooSmallBOBA ) { - dispatch(openError(`You cannot change the fee token to BOBA since your BOBA balance is below 3 BOBA. + if (tooSmallBOBA) { + dispatch(openError(`You cannot change the fee token to BOBA since your BOBA balance is below 1 BOBA. If you change fee token now, you might get stuck. Please swap some ETH for BOBA first.`)) } else { res = await dispatch(switchFee(targetFee)) } } - else if (feeUseBoba && targetFee === 'ETH') { - // change to ETH - if( tooSmallETH ) { - dispatch(openError(`You cannot change the fee token to ETH since your ETH balance is below 0.002 ETH. - If you change fee token now, you might get stuck. Please swap some BOBA for ETH first.`)) + else if (feeUseBoba && targetFee === networkService.L1NativeTokenSymbol) { + // change to L1Native Token + if (tooSmallL1NativeToken) { + dispatch(openError(`You cannot change the fee token to ${networkService.L1NativeTokenSymbol} since your ${networkService.L1NativeTokenSymbol} balance is below ${minL1NativeBalance}. + If you change fee token now, you might get stuck. Please obtain some ${networkService.L1NativeTokenSymbol} first.`)) } else { res = await dispatch(switchFee(targetFee)) } @@ -112,11 +114,11 @@ function FeeSwitcher() { dispatch(openAlert(`Successfully changed fee to ${targetFee}`)) } - }, [ dispatch, feeUseBoba, balanceETH, balanceBOBA ]) + }, [ dispatch, feeUseBoba, balanceETH, balanceBOBA, network ]) if (!accountEnabled && layer !== 'L2') { return - + Fee @@ -125,7 +127,7 @@ function FeeSwitcher() { return ( - + Fee @@ -133,16 +135,16 @@ function FeeSwitcher() { onSelect={(e, d) => { dispatchSwitchFee(e.target.value) }} - value={!feeUseBoba ? "ETH" : 'BOBA'} - options={[ { - value: 'ETH', - title: 'ETH', - }, - { - value: 'BOBA', - title: 'BOBA', - description: 'Save another 25% by using Boba as your gas fee token' - } + value={!feeUseBoba ? networkService.L1NativeTokenSymbol: 'BOBA' } + options={[ + { + value: 'BOBA', + title: 'BOBA', + }, + { + value: networkService.L1NativeTokenSymbol, + title: networkService.L1NativeTokenName, + } ]} /> diff --git a/packages/boba/gateway/src/components/mainMenu/gasSwitcher/GasSwitcher.js b/packages/boba/gateway/src/components/mainMenu/gasSwitcher/GasSwitcher.js index 81fea89790..58854b0d61 100644 --- a/packages/boba/gateway/src/components/mainMenu/gasSwitcher/GasSwitcher.js +++ b/packages/boba/gateway/src/components/mainMenu/gasSwitcher/GasSwitcher.js @@ -7,6 +7,10 @@ import * as S from './GasSwitcher.styles.js' import { selectGas } from 'selectors/balanceSelector' import { selectVerifierStatus } from 'selectors/verifierSelector' import { selectBaseEnabled } from 'selectors/setupSelector.js' +import { + selectActiveNetwork, + selectActiveNetworkName +} from 'selectors/networkSelector.js' import { fetchGas } from 'actions/networkAction.js' import { fetchVerifierStatus } from 'actions/verifierAction.js' @@ -16,6 +20,7 @@ import networkService from 'services/networkService.js' import useInterval from 'hooks/useInterval.js' import { GAS_POLL_INTERVAL } from 'util/constant.js' +import { NETWORK, NETWORK_TYPE } from 'util/network/network.util.js' function GasSwitcher() { const dispatch = useDispatch() @@ -23,9 +28,18 @@ function GasSwitcher() { const baseEnabled = useSelector(selectBaseEnabled()) const gas = useSelector(selectGas) const verifierStatus = useSelector(selectVerifierStatus) - + const networkName = useSelector(selectActiveNetworkName()) + const activeNetwork = useSelector(selectActiveNetwork()) const [ savings, setSavings ] = useState(0) + // fetch the gas on changing deployment + useEffect(() => { + if (baseEnabled) { + dispatch(fetchGas()) + dispatch(fetchVerifierStatus()) + } + }, [ networkName, baseEnabled , dispatch]) + useInterval(() => { if (baseEnabled) { dispatch(fetchGas()) @@ -35,7 +49,7 @@ function GasSwitcher() { useEffect(() => { async function getGasSavings() { - if (networkService.networkGateway === 'mainnet') { + if (networkService.networkType === NETWORK_TYPE.MAINNET) { const l1SecurityFee = await networkService.estimateL1SecurityFee() const l2Fee = await networkService.estimateL2Fee() // The l1 security fee is moved to the l2 fee @@ -47,24 +61,30 @@ function GasSwitcher() { } return 1 } - getGasSavings() - }, [ gas ]) + // fetch savings only if network is ethereum and mainnet. + if (activeNetwork === NETWORK.ETHEREUM) { + getGasSavings() + } + }, [ gas, activeNetwork ]) return ( - Ethereum + {networkName[ 'l1' ]} {gas.gasL1} Gwei - Boba + {networkName[ 'l2' ]} {gas.gasL2} Gwei - - Savings - {savings.toFixed(0)}x - + { + activeNetwork === NETWORK.ETHEREUM && + ( + Savings + {savings.toFixed(0)}x + ) + } L1 {gas.blockL1} diff --git a/packages/boba/gateway/src/components/modal/Modal.js b/packages/boba/gateway/src/components/modal/Modal.js index 4a7073fdee..0cca6c5287 100644 --- a/packages/boba/gateway/src/components/modal/Modal.js +++ b/packages/boba/gateway/src/components/modal/Modal.js @@ -53,7 +53,7 @@ function _Modal({ onClose={onClose} ismobile={isMobile ? 1 : 0} // closeAfterTransition - BackdropComponent={S.Backdrop} + slots={S.Backdrop} disableAutoFocus={true} > @@ -61,7 +61,7 @@ function _Modal({ { !!newStyle ? - + diff --git a/packages/boba/gateway/src/components/modal/Modal.styles.js b/packages/boba/gateway/src/components/modal/Modal.styles.js index 8b08150e6a..90107ac8a0 100644 --- a/packages/boba/gateway/src/components/modal/Modal.styles.js +++ b/packages/boba/gateway/src/components/modal/Modal.styles.js @@ -27,9 +27,11 @@ export const Backdrop = styled('div')` opacity: 0.8; backdrop-filter: blur(10px); -webkit-tap-highlight-color: transparent; -`; +`; -export const Style = styled(Box)` +export const Style = styled(Box, { + shouldForwardProp: (props) => props !== 'transparent' && props !== 'isMobile', +})` display: flex; flex-direction: column; justify-content: space-between; @@ -61,7 +63,7 @@ export const WrapperActionsModal = styled(Box)` margin-top: 50px; `; - + export const ModalHead = styled(Box)(({ theme }) => ({ display: "flex", justifyContent: "space-between", diff --git a/packages/boba/gateway/src/components/pageHeader/PageHeader.js b/packages/boba/gateway/src/components/pageHeader/PageHeader.js index 7f91362d27..fe8304bbf5 100644 --- a/packages/boba/gateway/src/components/pageHeader/PageHeader.js +++ b/packages/boba/gateway/src/components/pageHeader/PageHeader.js @@ -15,9 +15,10 @@ import networkService from 'services/networkService' import { makeStyles } from '@mui/styles' import Copy from 'components/copy/Copy' import { useSelector } from 'react-redux' -import { selectAccountEnabled, selectMonster } from 'selectors/setupSelector' +import { selectAccountEnabled, selectLayer, selectMonster } from 'selectors/setupSelector' import NetworkSwitcher from 'components/mainMenu/networkSwitcher/NetworkSwitcher' import WalletSwitch from 'components/walletSwitch/WalletSwitch' +import { LAYER } from 'util/constant' const useStyles = makeStyles({ root: { @@ -36,6 +37,7 @@ const PageHeader = ({ maintenance }) => { const theme = useTheme() const accountEnabled = useSelector(selectAccountEnabled()) + const layer = useSelector(selectLayer()) const monsterNumber = useSelector(selectMonster()) const isMobile = useMediaQuery(theme.breakpoints.down('md')) @@ -109,7 +111,7 @@ const PageHeader = ({ maintenance }) => { - + {layer === LAYER.L2 ? : null} @@ -118,7 +120,7 @@ const PageHeader = ({ maintenance }) => { : ( - + {layer === LAYER.L2 ? : null} {!!accountEnabled ? : null} diff --git a/packages/boba/gateway/src/components/transaction/Transaction.js b/packages/boba/gateway/src/components/transaction/Transaction.js index f9bf232787..20cb6aa583 100644 --- a/packages/boba/gateway/src/components/transaction/Transaction.js +++ b/packages/boba/gateway/src/components/transaction/Transaction.js @@ -21,10 +21,9 @@ import ExpandMoreIcon from '@mui/icons-material/ExpandMore' import * as S from "./ListFarm.styles" import { useTheme } from '@emotion/react' -import { selectNetwork } from 'selectors/networkSelector' -import { useSelector } from 'react-redux' -import { getNetwork } from 'util/masterConfig' + import truncate from 'truncate-middle' +import networkService from 'services/networkService' function Transaction({ link, @@ -53,12 +52,9 @@ function Transaction({ const theme = useTheme() const isMobile = useMediaQuery(theme.breakpoints.down('md')) - const currentNetwork = useSelector(selectNetwork()) - const nw = getNetwork() - const chainLink = ({chain,hash}) => { - let network = nw[currentNetwork] - if (!!network && !!network[chain]) { + const network = networkService.networkConfig; + if (!!network && !!network[ chain ]) { return `${network[chain].transaction}${hash}`; } return '' diff --git a/packages/boba/gateway/src/containers/bridge/bobaBridge/bobaBridge.styles.js b/packages/boba/gateway/src/containers/bridge/bobaBridge/bobaBridge.styles.js index 7b863d7631..9beb545dd3 100644 --- a/packages/boba/gateway/src/containers/bridge/bobaBridge/bobaBridge.styles.js +++ b/packages/boba/gateway/src/containers/bridge/bobaBridge/bobaBridge.styles.js @@ -19,7 +19,9 @@ export const BobaContent = styled(Box)(({ theme }) => ({ gap: '10px' })) -export const BobaContentWrapper = styled(Box)(({ theme, flexDirection }) => ({ +export const BobaContentWrapper = styled(Box, { + shouldForwardProp: (props) => props !== 'fullWidth' +})(({ theme, flexDirection }) => ({ display: 'flex', justifyContent: 'space-between', flexDirection: flexDirection || 'column', diff --git a/packages/boba/gateway/src/containers/history/History.js b/packages/boba/gateway/src/containers/history/History.js index 107d2ab3ee..9495808b19 100644 --- a/packages/boba/gateway/src/containers/history/History.js +++ b/packages/boba/gateway/src/containers/history/History.js @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ import React, { useState } from 'react' -import { batch, useDispatch } from 'react-redux' +import { useDispatch } from 'react-redux' import { isEqual, orderBy } from 'lodash' import { useSelector } from 'react-redux' import DatePicker from 'react-datepicker' @@ -30,7 +30,7 @@ import { selectActiveHistoryTab } from 'selectors/uiSelector' import { fetchTransactions } from 'actions/networkAction' import { selectTransactions } from 'selectors/transactionSelector' -import { selectLayer } from 'selectors/setupSelector' +import { selectAccountEnabled, selectLayer } from 'selectors/setupSelector' import Exits from './TX_Exits' import Deposits from './TX_Deposits' @@ -47,6 +47,7 @@ import Connect from 'containers/connect/Connect' import Tabs from 'components/tabs/Tabs' import { POLL_INTERVAL } from 'util/constant' +import { selectActiveNetworkName } from 'selectors/networkSelector' function History() { @@ -61,9 +62,11 @@ function History() { const [startDate, setStartDate] = useState(last_6months) const [endDate, setEndDate] = useState(now) const layer = useSelector(selectLayer()) + const accountEnabled = useSelector(selectAccountEnabled()) const [searchHistory, setSearchHistory] = useState('') const activeTab = useSelector(selectActiveHistoryTab, isEqual) + const networkName = useSelector(selectActiveNetworkName()) const unorderedTransactions = useSelector(selectTransactions, isEqual) const orderedTransactions = orderBy(unorderedTransactions, i => i.timeStamp, 'desc') @@ -76,9 +79,9 @@ function History() { }) useInterval(() => { - batch(()=>{ + if (accountEnabled) { dispatch(fetchTransactions()) - }) + } }, POLL_INTERVAL) return ( @@ -139,7 +142,7 @@ function History() { {dispatch(setActiveHistoryTab(tab))}} activeTab={activeTab} - tabs={['All', 'Ethereum to Boba Ethereum L2', 'Boba Ethereum L2 to Ethereum', 'Bridge between L1s', 'Pending']} + tabs={['All', `${networkName['l1']} to ${networkName['l2']}`, `${networkName['l2']} to ${networkName['l1']}`, 'Bridge between L1s', 'Pending']} /> {activeTab === 'All' && ( @@ -149,14 +152,14 @@ function History() { /> )} - {activeTab === 'Ethereum to Boba Ethereum L2' && + {activeTab === `${networkName['l1']} to ${networkName['l2']}` && } - {activeTab === 'Boba Ethereum L2 to Ethereum' && + {activeTab === `${networkName['l2']} to ${networkName['l1']}` && { setPage(1) @@ -125,7 +127,7 @@ function TX_Deposits({ searchHistory, transactions }) { title={`Hash: ${i.hash}`} time={moment.unix(i.timeStamp).format('lll')} blockNumber={`Block ${i.blockNumber}`} - chain={`Ethereum to Boba Ethereum L2 ${i.activity === 'ClientDepositL1Batch' ? 'in Batch' : ''}`} + chain={`${networkName['l1']} to ${networkName['l2']} ${i.activity === 'ClientDepositL1Batch' ? 'in Batch' : ''}`} typeTX={`TX Type: ${metaData}`} detail={details} oriChain={chain} diff --git a/packages/boba/gateway/src/containers/history/TX_Exits.js b/packages/boba/gateway/src/containers/history/TX_Exits.js index f3fe02b5e1..8c38d87921 100644 --- a/packages/boba/gateway/src/containers/history/TX_Exits.js +++ b/packages/boba/gateway/src/containers/history/TX_Exits.js @@ -34,8 +34,8 @@ const PER_PAGE = 8 function TX_Exits({ searchHistory, transactions, chainLink }) { - const [page, setPage] = useState(1) - const loading = useSelector(selectLoading(['EXIT/GETALL'])) + const [ page, setPage ] = useState(1) + const loading = useSelector(selectLoading(['TRANSACTION/GETALL'])) const tokenList = useSelector(selectTokens) const allAddresses = networkService.getAllAddresses() diff --git a/packages/boba/gateway/src/containers/history/TX_Pending.js b/packages/boba/gateway/src/containers/history/TX_Pending.js index 42cc4c7742..aaebc83db5 100644 --- a/packages/boba/gateway/src/containers/history/TX_Pending.js +++ b/packages/boba/gateway/src/containers/history/TX_Pending.js @@ -17,12 +17,7 @@ import React, { useState, useEffect } from 'react' import { useSelector } from 'react-redux' import "react-datepicker/dist/react-datepicker.css" import { Grid, Box } from '@mui/material' - import { orderBy } from 'lodash' -// import { selectNetwork } from 'selectors/setupSelector' - -// import { getNetwork } from 'util/masterConfig' - import moment from 'moment' import { selectLoading } from 'selectors/loadingSelector' @@ -169,7 +164,6 @@ function TX_Pending({ searchHistory, transactions }) { // return ''; // } - console.log("PendingToShow:", paginatedTransactions) return ( diff --git a/packages/boba/gateway/src/containers/home/Home.js b/packages/boba/gateway/src/containers/home/Home.js index 5e1f85cffb..8536ab6ac2 100644 --- a/packages/boba/gateway/src/containers/home/Home.js +++ b/packages/boba/gateway/src/containers/home/Home.js @@ -42,8 +42,7 @@ import { getFS_Saves, getFS_Info } from 'actions/fixedAction' import { fetchBalances, - addTokenList, - fetchExits + addTokenList } from 'actions/networkAction' import { getMonsterInfo @@ -90,6 +89,7 @@ import useInterval from 'hooks/useInterval' import useGoogleAnalytics from 'hooks/useGoogleAnalytics' import { selectActiveNetwork, selectActiveNetworkType } from 'selectors/networkSelector' import useNetwork from 'hooks/useNetwork' +import { NETWORK } from 'util/network/network.util' function Home() { @@ -167,7 +167,9 @@ function Home() { if (initialized === 'enabled') { dispatch(setBaseState(true)) // load DAO to speed up the process - dispatch(fetchDaoProposals()) + if (activeNetwork === NETWORK.ETHEREUM) { + dispatch(fetchDaoProposals()) + } return true } } @@ -177,16 +179,20 @@ function Home() { useInterval(() => { if(accountEnabled /*== MetaMask is connected*/) { dispatch(fetchBalances()) // account specific - dispatch(fetchDaoBalance()) // account specific - dispatch(fetchDaoVotes()) // account specific - dispatch(fetchDaoBalanceX()) // account specific - dispatch(fetchDaoVotesX()) // account specific - dispatch(fetchExits()) // account specific - dispatch(getFS_Saves()) // account specific - dispatch(getFS_Info()) // account specific - dispatch(getMonsterInfo()) // account specific + + //specific to ETH network + if (activeNetwork === NETWORK.ETHEREUM) { + dispatch(fetchDaoBalance()) // account specific + dispatch(fetchDaoVotes()) // account specific + dispatch(fetchDaoBalanceX()) // account specific + dispatch(fetchDaoVotesX()) // account specific + dispatch(getFS_Info()) // account specific + dispatch(getFS_Saves()) // account specific + dispatch(getMonsterInfo()) // account specific + } } - if(baseEnabled /*== we only have have Base L1 and L2 providers*/) { + /*== we only have have Base L1 and L2 providers*/ + if (baseEnabled && activeNetwork === NETWORK.ETHEREUM) { dispatch(getProposalThreshold()) dispatch(fetchDaoProposals()) } @@ -203,9 +209,12 @@ function Home() { if (maintenance) return if (accountEnabled) { dispatch(addTokenList()) - dispatch(getMonsterInfo()) + // monster only availble for ETH + if (activeNetwork === NETWORK.ETHEREUM) { + dispatch(getMonsterInfo()) + } } - }, [ dispatch, accountEnabled, maintenance ]) + }, [ dispatch, accountEnabled, maintenance, activeNetwork ]) // Invoking GA analysis page view hooks useGoogleAnalytics(); diff --git a/packages/boba/gateway/src/containers/modals/deposit/steps/InputStep.js b/packages/boba/gateway/src/containers/modals/deposit/steps/InputStep.js index 0cd6d6de2a..970ece9ea0 100644 --- a/packages/boba/gateway/src/containers/modals/deposit/steps/InputStep.js +++ b/packages/boba/gateway/src/containers/modals/deposit/steps/InputStep.js @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react' import { useDispatch, useSelector } from 'react-redux' import { depositErc20, depositETHL2 } from 'actions/networkAction' -import { setActiveHistoryTab } from 'actions/uiAction' +import { setActiveHistoryTab, openAlert } from 'actions/uiAction' import Button from 'components/button/Button' import Input from 'components/input/Input' @@ -18,6 +18,8 @@ import { WrapperActionsModal } from 'components/modal/Modal.styles' import { selectLookupPrice } from 'selectors/lookupSelector' import BN from 'bignumber.js' +import { ethers } from 'ethers' +import { selectActiveNetworkName } from 'selectors/networkSelector' function InputStep({ handleClose, token, isBridge, openTokenPicker }) { @@ -30,6 +32,7 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) { const [ validValue, setValidValue ] = useState(false) const depositLoading = useSelector(selectLoading([ 'DEPOSIT/CREATE' ])) + const networkName = useSelector(selectActiveNetworkName()) const signatureStatus = useSelector(selectSignatureStatus_depositTRAD) const lookupPrice = useSelector(selectLookupPrice) @@ -52,18 +55,20 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) { async function doDeposit() { let res + let toL2Account = enableToL2Account ? recipient : ''; - if (token.symbol === 'ETH') { + // TO check for ETH + if (token.address === ethers.constants.AddressZero) { res = await dispatch( depositETHL2({ - recipient, + recipient: toL2Account, value_Wei_String }) ) } else { res = await dispatch( depositErc20({ - recipient, + recipient: toL2Account, value_Wei_String, currency: token.address, currencyL2: token.addressL2, @@ -71,7 +76,8 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) { ) } if (res) { - dispatch(setActiveHistoryTab('Ethereum to Boba Ethereum L2')) + dispatch(openAlert(`Your funds were bridged to ${networkName[ 'l2' ]}`)) + dispatch(setActiveHistoryTab(`${networkName[ 'l1' ]} to ${networkName[ 'l2' ]}`)) handleClose() } @@ -88,7 +94,6 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) { } }, [ signatureStatus, depositLoading, handleClose ]) - console.log("Loading:", depositLoading) let buttonLabel_1 = 'Cancel' if (depositLoading) buttonLabel_1 = 'Close' diff --git a/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStep.js b/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStep.js index 8fbb5c85db..8aefc25b43 100644 --- a/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStep.js +++ b/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStep.js @@ -56,6 +56,7 @@ import { selectL2BalanceBOBA, selectExitFee, } from 'selectors/balanceSelector' +import networkService from 'services/networkService' function DoExitStep({ handleClose, token, isBridge, openTokenPicker }) { @@ -230,7 +231,8 @@ function DoExitStep({ handleClose, token, isBridge, openTokenPicker }) { const balance = Number(logAmount(token.balance, token.decimals)) // because of MetaMask issue always have to limit ETH - if(token.symbol === 'ETH') { + // if(token.symbol === 'ETH') { + if(token.symbol === networkService.L1NativeTokenSymbol) { if(balance - safeCost > 0.0) setMax_Float(balance - safeCost) else @@ -262,7 +264,7 @@ function DoExitStep({ handleClose, token, isBridge, openTokenPicker }) { if(feeUseBoba) { estGas = `${Number(feeBOBA).toFixed(4)} BOBA` } else { - estGas = `${Number(feeETH).toFixed(4)} ETH` + estGas = `${Number(feeETH).toFixed(4)} ${networkService.L1NativeTokenSymbol}` } } diff --git a/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStepFast.js b/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStepFast.js index dd05c43038..9419da3daf 100644 --- a/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStepFast.js +++ b/packages/boba/gateway/src/containers/modals/exit/steps/DoExitStepFast.js @@ -63,6 +63,7 @@ import { selectBobaFeeChoice, selectBobaPriceRatio, } from 'selectors/setupSelector' +import networkService from 'services/networkService' function DoExitStepFast({ handleClose, token, isBridge, openTokenPicker }) { @@ -282,7 +283,7 @@ function DoExitStepFast({ handleClose, token, isBridge, openTokenPicker }) { const balance = Number(logAmount(token.balance, token.decimals)) // because of MetaMask issue always have to limit ETH - if(token.symbol === 'ETH') { + if(token.symbol === networkService.L1NativeTokenSymbol) { if(balance - safeCost > 0.0) setMax_Float(balance - safeCost) else @@ -318,15 +319,16 @@ function DoExitStepFast({ handleClose, token, isBridge, openTokenPicker }) { if(feeUseBoba) { estGas = `${Number(feeBOBA).toFixed(4)} BOBA` } else { - estGas = `${Number(feeETH).toFixed(4)} ETH` + estGas = `${Number(feeETH).toFixed(4)} ${networkService.L1NativeTokenSymbol}` } } // prohibit ExitAll when paying with the token that is to be exited let allowUseAll = true - if(token.symbol === 'ETH') { + if(token.symbol === networkService.L1NativeTokenSymbol) { allowUseAll = false } + else if (token.symbol === 'BOBA' && feeUseBoba) { allowUseAll = false } diff --git a/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js b/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js index eaa456914b..56312947ea 100644 --- a/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js +++ b/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js @@ -197,7 +197,7 @@ function TransferModal ({ open, token, minHeight }) { {fee && !feeUseBoba && ( - Fee: {fee} ETH + Fee: {fee} {networkService.L1NativeTokenSymbol} )} diff --git a/packages/boba/gateway/src/containers/wallet/Wallet.js b/packages/boba/gateway/src/containers/wallet/Wallet.js index a6658135c1..a64003d76d 100644 --- a/packages/boba/gateway/src/containers/wallet/Wallet.js +++ b/packages/boba/gateway/src/containers/wallet/Wallet.js @@ -33,87 +33,79 @@ import { selectlayer2Balance } from 'selectors/balanceSelector' import PageTitle from 'components/pageTitle/PageTitle' import { isEqual } from 'lodash' -import { DEFAULT_NETWORK, POLL_INTERVAL } from "util/constant" +import { DEFAULT_NETWORK, LAYER, POLL_INTERVAL } from "util/constant" import useInterval from "hooks/useInterval" import BN from 'bignumber.js' import { logAmount } from 'util/amountConvert.js' -import { selectActiveNetworkName } from "selectors/networkSelector" +import { selectActiveNetwork, selectActiveNetworkName } from "selectors/networkSelector" +import networkService from "services/networkService" +import { NETWORK } from "util/network/network.util" function Wallet() { const [ page, setPage ] = useState('Token') - const [ chain, setChain ] = useState('') - const [ tooSmallETH, setTooSmallETH ] = useState(false) + const [ tooSmallSec, setTooSmallSec ] = useState(false) const [ tooSmallBOBA, setTooSmallBOBA ] = useState(false) const dispatch = useDispatch() - + const network = useSelector(selectActiveNetwork()) const layer = useSelector(selectLayer()) const accountEnabled = useSelector(selectAccountEnabled()) const networkName = useSelector(selectActiveNetworkName()) // low balance warnings const l2Balances = useSelector(selectlayer2Balance, isEqual) - useEffect(()=>{ + // fetching transactions + useEffect(() => { if (accountEnabled) dispatch(fetchTransactions()) - },[ dispatch, accountEnabled ]) + }, [ dispatch, accountEnabled ]) + + useInterval(() => { + if (accountEnabled) { + dispatch(fetchTransactions()) + } + }, POLL_INTERVAL) - useEffect(()=>{ - if (accountEnabled && l2Balances.length > 0) { + useEffect(() => { + if (accountEnabled && l2Balances.length > 0) { - const l2BalanceETH = l2Balances.find((i) => i.symbol === 'ETH') + const l2BalanceSec = l2Balances.find((i) => i.symbol === networkService.L1NativeTokenSymbol) const l2BalanceBOBA = l2Balances.find((i) => i.symbol === 'BOBA') - if (l2BalanceETH && l2BalanceETH.balance) { - setTooSmallETH(new BN(logAmount(l2BalanceETH.balance, 18)).lt(new BN(0.003))) + if (l2BalanceSec && l2BalanceSec.balance) { + // FOR ETH MIN BALANCE 0.003ETH for other sec tokens 1 + const minBalance = network === NETWORK.ETHEREUM ? 0.003 : 1; + setTooSmallSec(new BN(logAmount(l2BalanceSec.balance, 18)).lt(new BN(minBalance))) } else { - // in case of zero ETH balance we are setting tooSmallETH - setTooSmallETH(true) + // in case of zero ETH balance we are setting tooSmallSec + setTooSmallSec(true) } if (l2BalanceBOBA && l2BalanceBOBA.balance) { - setTooSmallBOBA(new BN(logAmount(l2BalanceBOBA.balance, 18)).lt(new BN(4.0))) + // FOR BOBA MIN BALANCE of 1 + setTooSmallBOBA(new BN(logAmount(l2BalanceBOBA.balance, 18)).lt(new BN(1))) } else { // in case of zero BOBA balance we are setting tooSmallBOBA setTooSmallBOBA(true) } } - },[ l2Balances, accountEnabled ]) + }, [ l2Balances, accountEnabled, network ]) useEffect(() => { if (layer === 'L2') { - if (tooSmallBOBA && tooSmallETH) { - dispatch(openError('Wallet empty - please bridge in ETH or BOBA from L1')) + if (tooSmallBOBA && tooSmallSec) { + dispatch(openError(`Wallet empty - please bridge in ${networkService.L1NativeTokenSymbol} or BOBA from L1`)) } } - },[tooSmallETH, tooSmallBOBA, layer, dispatch]) + }, [ tooSmallSec, tooSmallBOBA, layer, dispatch ]) - useInterval(() => { - if (accountEnabled) { - dispatch(fetchTransactions()) - } - }, POLL_INTERVAL) - - useEffect(() => { - if (layer === 'L2') { - setChain('Boba Wallet') - } else if (layer === 'L1') { - setChain('Ethereum Wallet') - } - }, [ layer ]) - const handleSwitch = (l) => { - if (l === 'Token') { - setPage('Token') - } else if (l === 'NFT') { - setPage('NFT') - } - } - - async function emergencySwap () { + async function emergencySwap() { const res = await dispatch(getETHMetaTransaction()) - if (res) dispatch(openAlert('Emergency Swap submitted')) + if (res) { + dispatch(openAlert('Emergency Swap submitted')) + } } return ( @@ -126,10 +118,11 @@ function Wallet() { accountEnabled={accountEnabled} /> - {layer === 'L2' && tooSmallETH && - + {layer === 'L2' && + tooSmallSec && + - + - Using Boba requires a minimum ETH balance (of 0.002 ETH) regardless of your fee setting, - otherwise MetaMask may incorrectly reject transactions. If you ran out of ETH, use - EMERGENCY SWAP to swap BOBA for 0.005 ETH at market rates. + Using {networkService.L1NativeTokenSymbol} requires a minimum BOBA balance (of 1 BOBA) regardless of your fee setting, + otherwise MetaMask may incorrectly reject transactions. If you ran out of BOBA, use + EMERGENCY SWAP to swap {networkService.L1NativeTokenSymbol} for 1 BOBA at market rates. - } - - } - - {layer === 'L2' && network === 'goerli' && - - - - - - Developer Twitter/Turing test token fountain - your Boba Bubble:{" "} - {BT} - - - - - Welcome developers. - For testnet BOBA and ETH, tweet your Boba Bubble and - then paste the tweet link in the field below. + <> + {layer === 'L2' && network === 'mainnet' && + + + Need ETH or BOBA{'? '} + You can swap one for the other at + Sushiswap + + and + Oolongswap + - - { GasEstimateApprove() }} + color='primary' + variant="contained" + > + GasEstimateApprove + + } + + } + + + + {!!accountEnabled && inflight.length > 0 && + + { + dispatch(setActiveHistoryTab("Pending")); + navigate('/history') }} - >Tweet Now - - - - For the Tweet link, tap the share icon, tap "Share Tweet via", and finally select "Copy link to Tweet". - - - setTweetUrl(e?.target?.value.split('?')[0])} //remove the superfluous stuff after the "?" - /> - - - You are limited to one fountain call per twitter account per day. - The transaction will not show in your history since it's a MetaTransaction (the gas is covered by Boba). - - - - - {faucetErrorMsg ? {faucetErrorMsg} : null} + Bridge in progress:{' '} + Click for detailed status + + - - } - - {!!accountEnabled && inflight.length > 0 && - - { - dispatch(setActiveHistoryTab("Pending")); - navigate('/history') - }} - > - Bridge in progress:{' '} - Click for detailed status - - - - } - - - - - {tokenTableHeads.map((item) => { + } + + + + + {tokenTableHeads.map((item) => { + return ( + {item.label} + ) + })} + + {layer === 'L2' ? !balanceLoading || !!l2Balance.length ? l2Balance.map((i) => { return ( - {item.label} + ) - })} - - {networkLayer === 'L2' ? !balanceLoading || !!childBalance.length ? childBalance.map((i, index) => { - return ( - - ) - }) : - - - : null} - {networkLayer === 'L1' ? !balanceLoading || !!rootBalance.length ? rootBalance.map((i, index) => { - return ( - - ) - }) : - - - : null} - - - ) + }) : + + + : null} + {layer === 'L1' ? !balanceLoading || !!l1Balance.length ? l1Balance.map((i) => { + return ( + + ) + }) : + + + : null} + + + ) } } diff --git a/packages/boba/gateway/src/images/moonbase.png b/packages/boba/gateway/src/images/moonbase.png new file mode 100644 index 0000000000..e4961a5a62 Binary files /dev/null and b/packages/boba/gateway/src/images/moonbase.png differ diff --git a/packages/boba/gateway/src/reducers/exitReducer.js b/packages/boba/gateway/src/reducers/exitReducer.js deleted file mode 100644 index b53f74738a..0000000000 --- a/packages/boba/gateway/src/reducers/exitReducer.js +++ /dev/null @@ -1,48 +0,0 @@ -/* -Copyright 2021-present Boba Network. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. */ - -import { keyBy } from 'lodash'; - -const initialState = { - pending: {}, - exited: {} -}; - -function exitReducer (state = initialState, action) { - switch (action.type) { - case 'EXIT/GETALL/SUCCESS': - // action.payload will be null on an event timeout, so return old state - if (!action.payload) { - return state; - } - return { ...state, ...action.payload }; - case 'EXIT/CREATE/SUCCESS': - return { - ...state, - }; - case 'EXIT/CHECKALL/SUCCESS': - return { - ...state, - pending: { - ...state.pending, - ...keyBy(action.payload, 'hash') - } - }; - default: - return state; - } -} - -export default exitReducer; diff --git a/packages/boba/gateway/src/reducers/index.js b/packages/boba/gateway/src/reducers/index.js index de385c09ac..97f9bc93a7 100644 --- a/packages/boba/gateway/src/reducers/index.js +++ b/packages/boba/gateway/src/reducers/index.js @@ -21,7 +21,6 @@ import transactionReducer from './transactionReducer' import dataReducer from './dataReducer' import statusReducer from './statusReducer' import balanceReducer from './balanceReducer' -import exitReducer from './exitReducer' import queueReducer from './queueReducer' import tokenReducer from './tokenReducer' import nftReducer from './nftReducer' @@ -47,7 +46,6 @@ const rootReducer = combineReducers({ signature: signatureReducer, status: statusReducer, balance: balanceReducer, - exit: exitReducer, queue: queueReducer, tokenList: tokenReducer, nft: nftReducer, diff --git a/packages/boba/gateway/src/reducers/networkReducer.js b/packages/boba/gateway/src/reducers/networkReducer.js index b0d633497b..1482dcb82c 100644 --- a/packages/boba/gateway/src/reducers/networkReducer.js +++ b/packages/boba/gateway/src/reducers/networkReducer.js @@ -76,4 +76,3 @@ function networkReducer(state = initialState, action) { } export default networkReducer - diff --git a/packages/boba/gateway/src/selectors/exitSelector.js b/packages/boba/gateway/src/selectors/exitSelector.js deleted file mode 100644 index 75bca8b658..0000000000 --- a/packages/boba/gateway/src/selectors/exitSelector.js +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright 2021-present Boba Network. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. */ - -export function selectPendingExits (state) { - return Object.values(state.exit.pending); -} - -export function selectExitedExits (state) { - return Object.values(state.exit.exited); -} diff --git a/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js b/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js new file mode 100644 index 0000000000..621133adc6 --- /dev/null +++ b/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js @@ -0,0 +1,12 @@ +const BobaGasPriceOracleABI = [ + 'function priceRatio() public view returns (uint256)', + 'function bobaFeeTokenUsers(address) public view returns (bool user)', + 'function secondaryFeeTokenUsers(address) public view returns (bool user)', + 'function getBOBAForSwap() public view returns (uint256)', + 'function getSecondaryFeeTokenForSwap() public view returns (uint256)', + 'function useBobaAsFeeToken() public', + 'function useETHAsFeeToken() public', + 'function useSecondaryFeeTokenAsFeeToken() public', +] + +export default BobaGasPriceOracleABI; diff --git a/packages/boba/gateway/src/services/abi/L1StandardBridge.abi.js b/packages/boba/gateway/src/services/abi/L1StandardBridge.abi.js new file mode 100644 index 0000000000..8bc8a62ca1 --- /dev/null +++ b/packages/boba/gateway/src/services/abi/L1StandardBridge.abi.js @@ -0,0 +1,10 @@ +const L1StandardBridgeABI = [ + 'function depositETH(uint32 _l2Gas, bytes calldata _data) external payable', + 'function depositETHTo(address _to, uint32 _l2Gas, bytes calldata _data) external payable', + 'function depositERC20(address _l1Token,address _l2Token, uint256 _amount, uint32 _l2Gas,bytes calldata _data) external', + 'function depositERC20To(address _l1Token, address _l2Token, address _to, uint256 _amount, uint32 _l2Gas,bytes calldata _data) external', + 'function depositNativeToken(uint32 _l2Gas, bytes calldata _data) external payable', + 'function depositNativeTokenTo(address _to,uint32 _l2Gas,bytes calldata _data) external payable' +] + +export default L1StandardBridgeABI; diff --git a/packages/boba/gateway/src/services/app.service.js b/packages/boba/gateway/src/services/app.service.js new file mode 100644 index 0000000000..24a8b19342 --- /dev/null +++ b/packages/boba/gateway/src/services/app.service.js @@ -0,0 +1,259 @@ +import { NETWORK, NETWORK_TYPE } from "util/network/network.util"; +// testnet addresss +import addresses_Goerli from "@boba/register/addresses/addressesGoerli_0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148" +import addresses_BobaBase from "@boba/register/addresses/addressesBobaBase_0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B" +import addresses_BobaOperaTestnet from "@boba/register/addresses/addressesBobaOperaTestnet_0x12ad9f501149D3FDd703cC10c567F416B7F0af8b" +import addresses_BobaFuji from "@boba/register/addresses/addressBobaFuji_0xcE78de95b85212BC348452e91e0e74c17cf37c79" +import addresses_BobaBnbTestnet from "@boba/register/addresses/addressBobaBnbTestnet_0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa" + +// mainnet address +import addresses_Mainnet from "@boba/register/addresses/addressesMainnet_0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089" +import addresses_BobaBeam from "@boba/register/addresses/addressBobaBeam_0x564c10A60af35a07f0EA8Be3106a4D81014b21a0" +import addresses_BobaAvax from "@boba/register/addresses/addressBobaAvax_0x00220f8ce1c4be8436574e575fE38558d85e2E6b" +import addresses_BobaBnb from "@boba/register/addresses/addressBobaBnb_0xeb989B25597259cfa51Bd396cE1d4B085EC4c753" +import addresses_BobaOpera from "@boba/register/addresses/addressBobaOpera_0x4e7325bcf09e091Bb8119258B885D4ef687B7386" + +// layerzero addresses. +import layerZeroTestnet from "@boba/register/addresses/layerZeroTestnet" +import layerZeroMainnet from "@boba/register/addresses/layerZeroMainnet" +import store from "store"; + +// predeployed contracts. + +const ERROR_ADDRESS = '0x0000000000000000000000000000000000000000' +const L1_ETH_Address = '0x0000000000000000000000000000000000000000' +const L2_BOBA_Address = '0x4200000000000000000000000000000000000006' +const L2MessengerAddress = '0x4200000000000000000000000000000000000007' +const L2StandardBridgeAddress = '0x4200000000000000000000000000000000000010' +const L2GasOracle = '0x420000000000000000000000000000000000000F' +const L2_SECONDARYFEETOKEN_ADDRESS = '0x4200000000000000000000000000000000000023' + +const ADDRESS_CONFIG = { + [ NETWORK_TYPE.MAINNET ]: { + [ NETWORK.ETHEREUM ]: { + ...addresses_Mainnet, + ...layerZeroMainnet.BOBA_Bridges.Mainnet, + ...layerZeroMainnet.Layer_Zero_Protocol.Mainnet, + layerZeroTargetChainID: layerZeroMainnet.Layer_Zero_Protocol.Mainnet.Layer_Zero_ChainId, + }, + [ NETWORK.AVAX ]: { + ...addresses_BobaAvax, + ...layerZeroMainnet.BOBA_Bridges.Avalanche, + ...layerZeroMainnet.Layer_Zero_Protocol.Avalanche, + layerZeroTargetChainID: layerZeroMainnet.Layer_Zero_Protocol.Mainnet.Layer_Zero_ChainId, + }, + [ NETWORK.MOONBEAM ]: { + ...addresses_BobaBeam, + ...layerZeroMainnet.BOBA_Bridges.Moonbeam, + ...layerZeroMainnet.Layer_Zero_Protocol.Moonbeam, + layerZeroTargetChainID: layerZeroMainnet.Layer_Zero_Protocol.Mainnet.Layer_Zero_ChainId, + }, + [ NETWORK.BNB ]: { + ...addresses_BobaBnb, + ...layerZeroMainnet.BOBA_Bridges.BNB, + ...layerZeroMainnet.Layer_Zero_Protocol.BNB, + layerZeroTargetChainID: layerZeroMainnet.Layer_Zero_Protocol.Mainnet.Layer_Zero_ChainId, + }, + [ NETWORK.FANTOM ]: addresses_BobaOpera, + }, + [ NETWORK_TYPE.TESTNET ]: { + [ NETWORK.ETHEREUM ]: { + ...addresses_Goerli, + ...layerZeroTestnet.BOBA_Bridges.Testnet, + ...layerZeroTestnet.Layer_Zero_Protocol.Testnet, + layerZeroTargetChainID: layerZeroTestnet.Layer_Zero_Protocol.Testnet.Layer_Zero_ChainId, + }, + [ NETWORK.AVAX ]: { + ...addresses_BobaFuji, + ...layerZeroTestnet.BOBA_Bridges.Avalanche, + ...layerZeroTestnet.Layer_Zero_Protocol.Avalanche, + layerZeroTargetChainID: layerZeroTestnet.Layer_Zero_Protocol.Avalanche.Layer_Zero_ChainId, + }, + [ NETWORK.FANTOM ]: { + ...addresses_BobaOperaTestnet, + ...layerZeroTestnet.BOBA_Bridges.Fantom, + ...layerZeroTestnet.Layer_Zero_Protocol.Fantom, + layerZeroTargetChainID: layerZeroTestnet.Layer_Zero_Protocol.Fantom.Layer_Zero_ChainId, + }, + [ NETWORK.BNB ]: { + ...addresses_BobaBnbTestnet, + ...layerZeroTestnet.BOBA_Bridges.BNB, + ...layerZeroTestnet.Layer_Zero_Protocol.BNB, + layerZeroTargetChainID: layerZeroTestnet.Layer_Zero_Protocol.Fantom.Layer_Zero_ChainId, + }, + [ NETWORK.MOONBEAM ]: addresses_BobaBase, + } +} + +const SUPPORTED_ASSETS = { + [ NETWORK_TYPE.MAINNET ]: { + [ NETWORK.ETHEREUM ]: { + tokens: [ + 'USDT', 'DAI', 'USDC', 'WBTC', 'REP', 'BAT', 'ZRX', 'SUSHI', + 'LINK', 'UNI', 'BOBA', 'xBOBA', 'OMG', 'FRAX', 'FXS', 'DODO', + 'UST', 'BUSD', 'BNB', 'FTM', 'MATIC', 'UMA', 'DOM', 'OLO', + 'WAGMIv0', 'WAGMIv1', 'WAGMIv2', 'WAGMIv2-Oolong', 'WAGMIv3', 'WAGMIv3-Oolong', + 'CGT' + ], + tokenAddresses: { + WAGMIv0: { + 'L1': 'WAGMIv0', + 'L2': '0x8493C4d9Cd1a79be0523791E3331c78Abb3f9672' + }, + WAGMIv1: { + 'L1': 'WAGMIv1', + 'L2': '0xCe055Ea4f29fFB8bf35E852522B96aB67Cbe8197' + }, + WAGMIv2: { + 'L1': 'WAGMIv2', + 'L2': '0x76B5908ecd0ae3DB23011ae96b7C1f803D63136c' + }, + 'WAGMIv2-Oolong': { + 'L1': 'WAGMIv2-Oolong', + 'L2': '0x49a3e4a1284829160f95eE785a1A5FfE2DD5Eb1D' + }, + 'WAGMIv3': { + 'L1': 'WAGMIv3', + 'L2': '0xC6158B1989f89977bcc3150fC1F2eB2260F6cabE' + }, + 'WAGMIv3-Oolong': { + 'L1': 'WAGMIv3-Oolong', + 'L2': '0x70bf3c5B5d80C4Fece8Bde0fCe7ef38B688463d4' + }, + OLO: { + 'L1': 'OLO', + 'L2': '0x5008F837883EA9a07271a1b5eB0658404F5a9610' + }, + CGT: { + 'L1': '0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a', + 'L2': '0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a' + } + } + }, + [ NETWORK.AVAX ]: { + tokenAddresses: { + 'EVO': { 'L1': '0x42006Ab57701251B580bDFc24778C43c9ff589A1', 'L2': '0xc8849f32138de93F6097199C5721a9EfD91ceE01' } + }, + tokens: [ 'BOBA', 'AVAX', 'EVO', 'USDT.e', 'USDt', 'USDC.e', 'BUSD.e', 'BUSD', 'DAI.e' ] + }, + [ NETWORK.MOONBEAM ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'GLMR' ] + }, + [ NETWORK.BNB ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'BNB', 'BUSD', 'USDC', 'USDT', 'SUSHI' ] + }, + [ NETWORK.FANTOM ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'FTM', 'USDC', 'DAI' ] + }, + }, + [ NETWORK_TYPE.TESTNET ]: { + [ NETWORK.ETHEREUM ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'USDC', 'OMG', 'xBOBA' ] + }, + [ NETWORK.AVAX ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'AVAX' ] + }, + [ NETWORK.MOONBEAM ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'GLMR' ] + }, + [ NETWORK.BNB ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'BNB' ] + }, + [ NETWORK.FANTOM ]: { + tokenAddresses: {}, + tokens: [ 'BOBA', 'FTM' ] + }, + } +} + +class AppService { + + + + /** + * @fetchAddresses + * + * NOTE: + * Pre Deployeed contracts add address manually + * + * - L2StandardBridgeAddress + * - L2MessengerAddress + * - L2_ETH_Address + * - L1_ETH_Address + * + */ + + + fetchAddresses({ + networkType, + network + }) { + let addresses = ADDRESS_CONFIG[ networkType ][ network ] || {}; + + return { + ...addresses, + L1LPAddress: addresses.Proxy__L1LiquidityPool, + L2LPAddress: addresses.Proxy__L2LiquidityPool, + L2StandardBridgeAddress, + L2MessengerAddress, + L2_ETH_Address: L2_BOBA_Address, + L2_BOBA_Address, + L1_ETH_Address + }; + + } + + /** + * @fetchSupportedTokens + * - get the supported tokens base on network and network type. + * + * will return {supported tokens and token address} + * + */ + + fetchSupportedAssets({ + networkType, + network + }) { + return SUPPORTED_ASSETS[ networkType ][ network ] || {}; + } + + + /** + * @setupInitState + * setup initial state of token reducer + * + */ + + setupInitState({ + l1Token, + l1TokenName + }) { + + store.dispatch({ + type: 'TOKEN/GET/SUCCESS', + payload: { + currency: L1_ETH_Address, + addressL1: L1_ETH_Address, + addressL2: L2_SECONDARYFEETOKEN_ADDRESS, + symbolL1: l1Token, + symbolL2: l1Token, + decimals: 18, + name: l1TokenName, + redalert: false, + } + }); + } + +}; + +const appService = new AppService(); + +export default appService; diff --git a/packages/boba/gateway/src/services/errorService.js b/packages/boba/gateway/src/services/error.service.js similarity index 100% rename from packages/boba/gateway/src/services/errorService.js rename to packages/boba/gateway/src/services/error.service.js diff --git a/packages/boba/gateway/src/services/faucet.service.js b/packages/boba/gateway/src/services/faucet.service.js new file mode 100644 index 0000000000..09a3c0ac05 --- /dev/null +++ b/packages/boba/gateway/src/services/faucet.service.js @@ -0,0 +1,81 @@ +import networkService from "./networkService"; +import AuthenticatedFaucetJson from "../deployment/contracts/AuthenticatedFaucet.json" +import { ethers } from "ethers"; +import metaTransactionAxiosInstance from "api/metaTransactionAxios"; + +class FaucetService { + + /** + * @getTestnetETHAuthenticatedMetaTransaction + * + * @dev Only works on testnet, but can be freely called on production app + * */ + async getTestnetETHAuthenticatedMetaTransaction(tweetId) { + + const Boba_AuthenticatedFaucet = new ethers.Contract( + networkService.addresses.AuthenticatedFaucet, + AuthenticatedFaucetJson.abi, + networkService.L2Provider, + ) + + const nonce = parseInt( + await Boba_AuthenticatedFaucet.getNonce(networkService.account), + 10 + ) + + const signer = networkService.provider.getSigner(networkService.account) + const hashedMsg = ethers.utils.solidityKeccak256( + ['address', 'uint'], + [networkService.account, nonce] + ) + const messageHashBin = ethers.utils.arrayify(hashedMsg) + const signature = await signer.signMessage(messageHashBin) + + try { + const response = await metaTransactionAxiosInstance( + networkService.networkConfig + ).post('/send.getTestnetETH', { hashedMsg, signature, tweetId, walletAddress: networkService.account }) + console.log(["metaTransactionAxiosInstance res",response]) + } catch (error) { + let errorMsg = error?.response?.data?.error?.error?.body + if (errorMsg) { + errorMsg = JSON.stringify(errorMsg)?.match(/execution reverted:\s(.+)\\"/) + errorMsg = errorMsg ? errorMsg[1]?.trim() : null; + } + console.log(`MetaTx error for getTestnetETH: ${errorMsg}`) + if (errorMsg?.includes('Invalid request')) { + errorMsg = errorMsg.match(/Invalid request:(.+)/) + if (errorMsg) { + const errorMap = [ + 'Twitter API error - Probably limits hit.', + 'Twitter account needs to exist at least 48 hours.', + 'Invalid Tweet, be sure to tweet the Boba Bubble provided above.', + 'Your Twitter account needs more than 5 followers.', + 'You need to have tweeted more than 2 times.', + ] + try { + errorMsg = errorMap[parseInt(errorMsg[1]) - 1] + } catch(err) { + console.error(err) + errorMsg = 'Unexpected Twitter error.' + } + } else { + errorMsg = 'Not expected Turing error.' + } + } else { + const errorMap = { + 'Cooldown': 'Cooldown: You need to wait 24h to claim again with this Twitter account.', + 'No testnet funds': 'Faucet drained: Please reach out to us.', + 'Rate limit reached': 'Throttling: Too many requests. Throttling to not hit Twitter rate limits.', + } + errorMsg = errorMap[errorMsg]; + } + return errorMsg ?? 'Limits reached or Twitter constraints not met.' + } + } + +} + +const faucetService = new FaucetService(); + +export default faucetService; diff --git a/packages/boba/gateway/src/services/gas.service.js b/packages/boba/gateway/src/services/gas.service.js new file mode 100644 index 0000000000..ba0bc351c9 --- /dev/null +++ b/packages/boba/gateway/src/services/gas.service.js @@ -0,0 +1,40 @@ + + +import { logAmount } from "util/amountConvert"; +import networkService from "./networkService"; + + +class GasService { + + /** + * @getGas + */ + + async getGas() { + try { + // get gas price + const gasPrice1 = await networkService.L1Provider.getGasPrice() + const gasPrice2 = await networkService.L2Provider.getGasPrice() + // get block count + const block1 = await networkService.L1Provider.getBlockNumber() + const block2 = await networkService.L2Provider.getBlockNumber() + + const gasData = { + gasL1: Number(logAmount(gasPrice1.toString(),9)).toFixed(0), + gasL2: Number(logAmount(gasPrice2.toString(),9)).toFixed(0), + blockL1: Number(block1), + blockL2: Number(block2), + } + + return gasData + } catch (error) { + console.log("GS: getGas error:",error) + return error + } + } + +} + +const gasService = new GasService(); + +export default gasService; diff --git a/packages/boba/gateway/src/services/graphQLService.js b/packages/boba/gateway/src/services/graphql.service.js similarity index 100% rename from packages/boba/gateway/src/services/graphQLService.js rename to packages/boba/gateway/src/services/graphql.service.js diff --git a/packages/boba/gateway/src/services/networkService.js b/packages/boba/gateway/src/services/networkService.js index 78b9ab049c..93a38d5396 100644 --- a/packages/boba/gateway/src/services/networkService.js +++ b/packages/boba/gateway/src/services/networkService.js @@ -64,10 +64,8 @@ import L2BillingContractJson from "@boba/contracts/artifacts/contracts/L2Billing //special one-off locations import L1ERC20Json from '../deployment/contracts/L1ERC20.json' -import OMGJson from '../deployment/contracts/OMG.json' import TuringMonsterJson from "../deployment/contracts/NFTMonsterV2.json" import AuthenticatedFaucetJson from "../deployment/contracts/AuthenticatedFaucet.json" -import Boba_GasPriceOracleJson from "../deployment/contracts/Boba_GasPriceOracle.json" //WAGMI ABIs import WAGMIv0Json from "../deployment/contracts/WAGMIv0.json" @@ -86,20 +84,12 @@ import LZEndpointMockJson from "../deployment/contracts/crosschain/LZEndpointMoc import { getNftImageUrl } from 'util/nftImage' import { getNetwork } from 'util/masterConfig' -import etherScanInstance from 'api/etherScanAxios' import omgxWatcherAxiosInstance from 'api/omgxWatcherAxios' import coinGeckoAxiosInstance from 'api/coinGeckoAxios' -import verifierWatcherAxiosInstance from 'api/verifierWatcherAxios' import metaTransactionAxiosInstance from 'api/metaTransactionAxios' import { sortRawTokens } from 'util/common' -import GraphQLService from "./graphQLService" - -import addresses_Goerli from "@boba/register/addresses/addressesGoerli_0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148" -import addresses_Mainnet from "@boba/register/addresses/addressesMainnet_0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089" - -import layerZeroTestnet from "@boba/register/addresses/layerZeroTestnet" -import layerZeroMainnet from "@boba/register/addresses/layerZeroMainnet" +import GraphQLService from "./graphql.service" import tokenInfo from "@boba/register/addresses/tokenInfo" @@ -107,41 +97,23 @@ import { bobaBridges } from 'util/bobaBridges' import { APP_CHAIN, SPEED_CHECK } from 'util/constant' import { getPoolDetail } from 'util/poolDetails' import { getNetworkDetail, NETWORK } from 'util/network/network.util' +import appService from './app.service' +import BobaGasPriceOracleABI from './abi/BobaGasPriceOracle.abi' +import L1StandardBridgeABI from './abi/L1StandardBridge.abi' const ERROR_ADDRESS = '0x0000000000000000000000000000000000000000' const L1_ETH_Address = '0x0000000000000000000000000000000000000000' const L2_ETH_Address = '0x4200000000000000000000000000000000000006' -const L2MessengerAddress = '0x4200000000000000000000000000000000000007' -const L2StandardBridgeAddress = '0x4200000000000000000000000000000000000010' +// const L2MessengerAddress = '0x4200000000000000000000000000000000000007' +// const L2StandardBridgeAddress = '0x4200000000000000000000000000000000000010' const L2GasOracle = '0x420000000000000000000000000000000000000F' +const L2_SECONDARYFEETOKEN_ADDRESS = '0x4200000000000000000000000000000000000023' + let supportedAltL1Chains = [] -let allAddresses = {} -let l0AllProtocols = {} -// preload allAddresses if (APP_CHAIN === 'goerli') { - const bobaBridges = layerZeroTestnet.BOBA_Bridges.Testnet; - const l0Protocols = layerZeroTestnet.Layer_Zero_Protocol.Testnet; - l0AllProtocols = layerZeroTestnet.Layer_Zero_Protocol; - allAddresses = { - ...addresses_Goerli, - L1LPAddress: addresses_Goerli.Proxy__L1LiquidityPool, - L2LPAddress: addresses_Goerli.Proxy__L2LiquidityPool, - ...bobaBridges, - ...l0Protocols - } supportedAltL1Chains = ['BNB', 'Fantom', 'Avalanche'] } else if (APP_CHAIN === 'mainnet') { - const bobaBridges = layerZeroMainnet.BOBA_Bridges.Mainnet; - const l0Protocols = layerZeroMainnet.Layer_Zero_Protocol.Mainnet; - l0AllProtocols = layerZeroMainnet.Layer_Zero_Protocol; - allAddresses = { - ...addresses_Mainnet, - L1LPAddress: addresses_Mainnet.Proxy__L1LiquidityPool, - L2LPAddress: addresses_Mainnet.Proxy__L2LiquidityPool, - ...bobaBridges, - ...l0Protocols - } supportedAltL1Chains = ['Moonbeam','BNB', 'Fantom', 'Avalanche'] } let allTokens = {} @@ -170,8 +142,7 @@ class NetworkService { this.L1orL2 = null this.networkGateway = null this.networkType = null - this.L1ProviderBASE = null - this.L2ProviderBASE = null + // Watcher this.watcher = null @@ -224,12 +195,18 @@ class NetworkService { // support token this.supportedTokens = [] + this.supportedTokenAddresses = {} // support alt l1 tokens this.supportedAltL1Chains = supportedAltL1Chains // token info this.tokenInfo = {} + + // newly added properties to network services. + this.addresses = {} + this.network = null; + this.networkConfig = null } bindProviderListeners() { @@ -251,40 +228,37 @@ class NetworkService { }) } - async fetchVerifierStatus() { - const response = await verifierWatcherAxiosInstance( - this.networkGateway - ).post('/', { jsonrpc: "2.0", method: "status", id: 1 }) - - if (response.status === 200) { - const status = response.data.result - return status - } else { - console.log("Bad verifier response") - return false - } - } async getBobaFeeChoice() { + const bobaFeeContract = new ethers.Contract( - allAddresses.Boba_GasPriceOracle, - Boba_GasPriceOracleJson.abi, + this.addresses.Boba_GasPriceOracle, + BobaGasPriceOracleABI, this.L2Provider ) try { - let priceRatio = await bobaFeeContract.priceRatio() - let feeChoice = await bobaFeeContract.bobaFeeTokenUsers(this.account) + let feeChoice; + if (this.networkGateway === NETWORK.ETHEREUM) { + feeChoice = await bobaFeeContract.bobaFeeTokenUsers(this.account) + } else { + // this returns weather the secondary token getting use as tokenfee + feeChoice = await bobaFeeContract.secondaryFeeTokenUsers(this.account) + // if it's false which means boba is getting used as tokenfee which is default value. + feeChoice = !feeChoice; + + } + console.log( + 'Fee used as boba', feeChoice + ) const bobaFee = { priceRatio: priceRatio.toString(), feeChoice } - await addBobaFee( bobaFee ) - return bobaFee } catch (error) { @@ -292,7 +266,6 @@ class NetworkService { console.log(error) return error } - } async switchFee( targetFee ) { @@ -300,8 +273,8 @@ class NetworkService { if( this.L1orL2 !== 'L2' ) return const bobaFeeContract = new ethers.Contract( - allAddresses.Boba_GasPriceOracle, - Boba_GasPriceOracleJson.abi, + this.addresses.Boba_GasPriceOracle, + BobaGasPriceOracleABI, this.provider.getSigner() ) @@ -316,6 +289,9 @@ class NetworkService { } else if (targetFee === 'ETH') { tx = await bobaFeeContract.useETHAsFeeToken() await tx.wait() + } else if (targetFee === this.L1NativeTokenSymbol) { + tx = await bobaFeeContract.useSecondaryFeeTokenAsFeeToken() + await tx.wait() } await this.getBobaFeeChoice() @@ -344,15 +320,23 @@ class NetworkService { ] const owner = this.account - const spender = allAddresses.Boba_GasPriceOracle + const spender = this.addresses.Proxy__Boba_GasPriceOracle const Boba_GasPriceOracle = new ethers.Contract( - allAddresses.Boba_GasPriceOracle, - Boba_GasPriceOracleJson.abi, + this.addresses.Proxy__Boba_GasPriceOracle, + BobaGasPriceOracleABI, this.provider.getSigner() ) - let value = (await Boba_GasPriceOracle.getBOBAForSwap()).toString() + let rawValue; + if (this.networkGateway === NETWORK.ETHEREUM) { + rawValue = await Boba_GasPriceOracle.getBOBAForSwap(); + } else { + rawValue = await Boba_GasPriceOracle.getSecondaryFeeTokenForSwap(); + } + + let value = (rawValue).toString() + const nonce = (await this.BobaContract.nonces(this.account)).toNumber() const deadline = Math.floor(Date.now() / 1000) + 300 const verifyingContract = this.BobaContract.address @@ -371,108 +355,37 @@ class NetworkService { let signature try { - signature = await this.provider.send('eth_signTypedData_v4', [this.account, JSON.stringify(data)]) + signature = await this.provider.send('eth_signTypedData_v4', [ this.account, JSON.stringify(data) ]) } catch (error) { - console.log(error) return error } try { + // change url if network is etheruem + const swapUrl = this.networkGateway === NETWORK.ETHEREUM ? '/send.swapBOBAForETH' : '/send.swapSecondaryFeeToken' const response = await metaTransactionAxiosInstance( - this.networkGateway - ).post('/send.swapBOBAForETH', { owner, spender, value, deadline, signature, data }) - console.log("response",response) + this.networkConfig + ).post(swapUrl, { owner, spender, value, deadline, signature, data }) + console.log(['meta tx fee res', response]) await this.getBobaFeeChoice() } catch (error) { - console.log(error) - // sigh let errorData = error.response.data.error if(errorData.hasOwnProperty('error')) { errorData = errorData.error.error.body } - console.log("returning:",error) return errorData } } - /** @dev Only works on testnet, but can be freely called on production app */ - async getTestnetETHAuthenticatedMetaTransaction(tweetId) { - - console.log("triggering getTestnetETH") - - const Boba_AuthenticatedFaucet = new ethers.Contract( - addresses_Goerli.AuthenticatedFaucet, - AuthenticatedFaucetJson.abi, - this.L2Provider, - ) - - const nonce = parseInt( - await Boba_AuthenticatedFaucet.getNonce(this.account), - 10 - ) - - const signer = this.provider.getSigner(this.account) - const hashedMsg = ethers.utils.solidityKeccak256( - ['address', 'uint'], - [this.account, nonce] - ) - const messageHashBin = ethers.utils.arrayify(hashedMsg) - const signature = await signer.signMessage(messageHashBin) - - try { - const response = await metaTransactionAxiosInstance( - this.networkGateway - ).post('/send.getTestnetETH', { hashedMsg, signature, tweetId, walletAddress: this.account }) - console.log("response",response) - } catch (error) { - let errorMsg = error?.response?.data?.error?.error?.body - if (errorMsg) { - errorMsg = JSON.stringify(errorMsg)?.match(/execution reverted:\s(.+)\\"/) - errorMsg = errorMsg ? errorMsg[1]?.trim() : null; - } - console.log(`MetaTx error for getTestnetETH: ${errorMsg}`) - if (errorMsg?.includes('Invalid request')) { - errorMsg = errorMsg.match(/Invalid request:(.+)/) - if (errorMsg) { - const errorMap = [ - 'Twitter API error - Probably limits hit.', - 'Twitter account needs to exist at least 48 hours.', - 'Invalid Tweet, be sure to tweet the Boba Bubble provided above.', - 'Your Twitter account needs more than 5 followers.', - 'You need to have tweeted more than 2 times.', - ] - try { - errorMsg = errorMap[parseInt(errorMsg[1]) - 1] - } catch(err) { - console.error(err) - errorMsg = 'Unexpected Twitter error.' - } - } else { - errorMsg = 'Not expected Turing error.' - } - } else { - const errorMap = { - 'Cooldown': 'Cooldown: You need to wait 24h to claim again with this Twitter account.', - 'No testnet funds': 'Faucet drained: Please reach out to us.', - 'Rate limit reached': 'Throttling: Too many requests. Throttling to not hit Twitter rate limits.', - } - errorMsg = errorMap[errorMsg]; - } - return errorMsg ?? 'Limits reached or Twitter constraints not met.' - } - } - async getAddress(contractName, varToSet) { const address = await this.AddressManager.getAddress(contractName) if (address === ERROR_ADDRESS) { - console.log(contractName + ' ERROR: NOT IN ADDRESSMANAGER') return false } else { - allAddresses = { - ...allAddresses, + this.addresses = { + ...this.addresses, [varToSet]: address } - console.log(contractName +' pulled from AddressManager and set to:', address) return true } } @@ -480,56 +393,44 @@ class NetworkService { async getAddressCached(cache, contractName, varToSet) { const address = cache[contractName] if (typeof(address) === 'undefined') { - console.log(contractName + ' ERROR: NOT IN CACHE') return false } else { - allAddresses = { - ...allAddresses, + this.addresses = { + ...this.addresses, [varToSet]: address } - console.log(contractName +' pulled from address cache and set to:', address) return true } } getAllAddresses() { - return allAddresses + return this.addresses; } async initializeBase({ - networkGateway, + networkGateway: network, networkType }) { - let addresses = null - this.networkGateway = networkGateway // e.g. mainnet | goerli | ... + let addresses = null; + this.network = network; //// refer this in other services and clean up iteratively. + this.networkGateway = network // e.g. mainnet | goerli | ... this.networkType = networkType // e.g. mainnet | goerli | ... // defines the set of possible networks along with chainId for L1 and L2 const networkDetail = getNetworkDetail({ - network: networkGateway, + network, networkType }) - const L1rpc = networkDetail['L1']['rpcUrl'] - const L2rpc = networkDetail['L2']['rpcUrl'] + this.networkConfig = networkDetail; try { - //fire up the base providers - const Web3 = require("web3") - - this.L1ProviderBASE = new Web3(new Web3.providers.HttpProvider(L1rpc)) - this.L2ProviderBASE = new Web3(new Web3.providers.HttpProvider(L2rpc)) - - //this.L1ProviderBASE.eth.handleRevert = true - //this.L2ProviderBASE.eth.handleRevert = true - - if (NETWORK[networkGateway]) { + if (NETWORK[network]) { this.payloadForL1SecurityFee = networkDetail.payloadForL1SecurityFee this.payloadForFastDepositBatchCost = networkDetail.payloadForFastDepositBatchCost this.gasEstimateAccount = networkDetail.gasEstimateAccount - console.log('gasEstimateAccount:', this.gasEstimateAccount) } this.L1Provider = new ethers.providers.StaticJsonRpcProvider( @@ -540,13 +441,27 @@ class NetworkService { networkDetail['L2']['rpcUrl'] ) + this.L1NativeTokenSymbol = networkDetail['L1']['symbol'] + this.L1NativeTokenName = networkDetail['L1']['tokenName'] || this.L1NativeTokenSymbol + + appService.setupInitState({ + l1Token: this.L1NativeTokenSymbol, + l1TokenName: this.L1NativeTokenName + }) + + // get the tokens based on l1ChainId const chainId = (await this.L1Provider.getNetwork()).chainId this.tokenInfo = tokenInfo[chainId] - if (!!NETWORK[networkGateway]) { - addresses = allAddresses + if (!!NETWORK[ network ]) { + addresses = appService.fetchAddresses({ + network, + networkType + }); } + this.addresses = addresses + // this.AddressManagerAddress = nw[networkGateway].addressManager // console.log("AddressManager address:",this.AddressManagerAddress) @@ -557,170 +472,83 @@ class NetworkService { // ) // //console.log("AddressManager Contract:",this.AddressManager) + if (network === NETWORK.ETHEREUM) { + // check only if selected network is ETHEREUM + if (!(await this.getAddressCached(addresses, 'BobaMonsters', 'BobaMonsters'))) return + if (!(await this.getAddressCached(addresses, 'Proxy__L1LiquidityPool', 'L1LPAddress'))) return + if (!(await this.getAddressCached(addresses, 'Proxy__L2LiquidityPool', 'L2LPAddress'))) return + if (!(await this.getAddressCached(addresses, 'Proxy__BobaFixedSavings', 'BobaFixedSavings'))) return + } + if (!(await this.getAddressCached(addresses, 'Proxy__L1CrossDomainMessenger', 'L1MessengerAddress'))) return if (!(await this.getAddressCached(addresses, 'Proxy__L1CrossDomainMessengerFast', 'L1FastMessengerAddress'))) return if (!(await this.getAddressCached(addresses, 'Proxy__L1StandardBridge', 'L1StandardBridgeAddress'))) return - if (!(await this.getAddressCached(addresses, 'Proxy__BobaFixedSavings', 'BobaFixedSavings'))) return if (!(await this.getAddressCached(addresses, 'Proxy__Boba_GasPriceOracle', 'Boba_GasPriceOracle'))) return - //if (!(await this.getAddressCached(addresses, 'DiscretionaryExitFee', 'DiscretionaryExitFee'))) return // not critical this.getAddressCached(addresses, 'DiscretionaryExitFee', 'DiscretionaryExitFee') - console.log("DiscretionaryExitFee:",allAddresses.DiscretionaryExitFee) - - //L2CrossDomainMessenger is a predeploy, so add by hand.... - allAddresses = { - ...allAddresses, - 'L2MessengerAddress': L2MessengerAddress, - } - - //L2StandardBridgeAddress is a predeploy, so add by hand.... - allAddresses = { - ...allAddresses, - 'L2StandardBridgeAddress': L2StandardBridgeAddress, - } - - //L2MessengerAddress is a predeploy, so add by hand.... - allAddresses = { - ...allAddresses, - 'L2MessengerAddress': L2MessengerAddress - } - - //L2_ETH_Address is a predeploy, so add by hand.... - allAddresses = { - ...allAddresses, - 'L2_ETH_Address': L2_ETH_Address - } - - //L1_ETH_Address is a predeploy, so add by hand.... - allAddresses = { - ...allAddresses, - 'L1_ETH_Address': L1_ETH_Address - } this.L1StandardBridgeContract = new ethers.Contract( - allAddresses.L1StandardBridgeAddress, - L1StandardBridgeJson.abi, + this.addresses.L1StandardBridgeAddress, + L1StandardBridgeABI, this.L1Provider ) - this.supportedTokens = [ 'USDT', 'DAI', 'USDC', 'WBTC', - 'REP', 'BAT', 'ZRX', 'SUSHI', - 'LINK', 'UNI', 'BOBA', 'xBOBA', - 'OMG', 'FRAX', 'FXS', 'DODO', - 'UST', 'BUSD', 'BNB', 'FTM', - 'MATIC', 'UMA', 'DOM', 'OLO', - 'WAGMIv0', - 'WAGMIv1', - 'WAGMIv2', 'WAGMIv2-Oolong', - 'WAGMIv3', 'WAGMIv3-Oolong', - 'CGT' - ] - - //not all tokens are on Goerli - if ( networkGateway === 'goerli') { - this.supportedTokens = [ 'BOBA', 'USDC', 'OMG', 'xBOBA' ] - } + // fech suported assets eg. tokens and address. + const tokenAsset = appService.fetchSupportedAssets({ + network, + networkType + }) - await Promise.all(this.supportedTokens.map(async (key) => { + this.supportedTokens = tokenAsset.tokens; + this.supportedTokenAddresses = tokenAsset.tokenAddresses; + const tokenList = {} - const L2a = addresses['TK_L2'+key] + this.supportedTokens.forEach((key) => { + const L1a = addresses[ 'TK_L1' + key ] + const L2a = addresses[ 'TK_L2' + key ] - if(key === 'xBOBA') { + if (key === 'xBOBA') { if (L2a === ERROR_ADDRESS) { - console.log(key + ' ERROR: TOKEN NOT IN ADDRESSMANAGER') return false } else { - allTokens[key] = { + tokenList[ key ] = { 'L1': 'xBOBA', 'L2': L2a } } } - else if(key === 'WAGMIv0') { - allTokens[key] = { - 'L1': 'WAGMIv0', - 'L2': '0x8493C4d9Cd1a79be0523791E3331c78Abb3f9672' - } - } - else if(key === 'WAGMIv1') { - allTokens[key] = { - 'L1': 'WAGMIv1', - 'L2': '0xCe055Ea4f29fFB8bf35E852522B96aB67Cbe8197' - } - } - else if(key === 'WAGMIv2') { - allTokens[key] = { - 'L1': 'WAGMIv2', - 'L2': '0x76B5908ecd0ae3DB23011ae96b7C1f803D63136c' - } - } - else if(key === 'WAGMIv2-Oolong') { - allTokens[key] = { - 'L1': 'WAGMIv2-Oolong', - 'L2': '0x49a3e4a1284829160f95eE785a1A5FfE2DD5Eb1D' - } - } - else if(key === 'WAGMIv3') { - allTokens[key] = { - 'L1': 'WAGMIv3', - 'L2': '0xC6158B1989f89977bcc3150fC1F2eB2260F6cabE' - } - } - else if(key === 'WAGMIv3-Oolong') { - allTokens[key] = { - 'L1': 'WAGMIv3-Oolong', - 'L2': '0x70bf3c5B5d80C4Fece8Bde0fCe7ef38B688463d4' - } - } - else if(key === 'OLO') { - allTokens[key] = { - 'L1': 'OLO', - 'L2': '0x5008F837883EA9a07271a1b5eB0658404F5a9610' - } - } - else if(key === 'CGT') { - allTokens[key] = { - 'L1': '0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a', - 'L2': '0xf56b164efd3cfc02ba739b719b6526a6fa1ca32a' + + // NOTE: if not in address manager then refer it from token assets config. + if (typeof L1a === 'undefined' || typeof L2a === 'undefined') { + if (typeof this.supportedTokenAddresses[key] !== 'undefined') { + tokenList[key] = this.supportedTokenAddresses[key] } - } - else { - const L1a = addresses['TK_L1'+key] - if (L1a === ERROR_ADDRESS || L2a === ERROR_ADDRESS) { - console.log(key + ' ERROR: TOKEN NOT IN ADDRESSMANAGER') - return false - } else { - allTokens[key] = { - 'L1': L1a, - 'L2': L2a - } + return false + } else { + tokenList[key] = { + 'L1': L1a, + 'L2': L2a } } + }) - })) - - this.tokenAddresses = allTokens - - if (!(await this.getAddressCached(addresses, 'BobaMonsters', 'BobaMonsters'))) return - - if (!(await this.getAddressCached(addresses, 'Proxy__L1LiquidityPool', 'L1LPAddress'))) return - if (!(await this.getAddressCached(addresses, 'Proxy__L2LiquidityPool', 'L2LPAddress'))) return + this.tokenAddresses = tokenList + allTokens = tokenList; - if(allAddresses.L2StandardBridgeAddress !== null) { + if(addresses.L2StandardBridgeAddress !== null) { this.L2StandardBridgeContract = new ethers.Contract( - allAddresses.L2StandardBridgeAddress, + addresses.L2StandardBridgeAddress, L2StandardBridgeJson.abi, this.L2Provider ) } this.L2_ETH_Contract = new ethers.Contract( - allAddresses.L2_ETH_Address, + addresses.L2_ETH_Address, L2ERC20Json.abi, this.L2Provider ) - //console.log("L2_ETH_Contract:", this.L2_ETH_Contract.address) /*The test token*/ this.L1_TEST_Contract = new ethers.Contract( @@ -728,103 +556,82 @@ class NetworkService { L1ERC20Json.abi, this.L1Provider ) - //console.log('L1_TEST_Contract:', this.L1_TEST_Contract) this.L2_TEST_Contract = new ethers.Contract( allTokens.BOBA.L2, //this will get changed anyway when the contract is used L2ERC20Json.abi, this.L2Provider ) - //console.log('L2_TEST_Contract:', this.L2_TEST_Contract) /*The OMG token*/ //We need this seperately because OMG is not ERC20 compliant - this.L1_OMG_Contract = new ethers.Contract( + /* this.L1_OMG_Contract = new ethers.Contract( allTokens.OMG.L1, OMGJson, this.L1Provider - ) + ) */ //console.log('L1_OMG_Contract:', this.L1_OMG_Contract) // Liquidity pools - console.log('Setting up contract for L1LP at:',allAddresses.L1LPAddress) + this.L1LPContract = new ethers.Contract( - allAddresses.L1LPAddress, + addresses.L1LPAddress, L1LPJson.abi, this.L1Provider ) - - console.log('Setting up contract for L2LP at:',allAddresses.L2LPAddress) this.L2LPContract = new ethers.Contract( - allAddresses.L2LPAddress, + addresses.L2LPAddress, L2LPJson.abi, this.L2Provider ) - if(networkGateway === 'mainnet') { - this.watcher = new CrossChainMessenger({ - l1SignerOrProvider: this.L1Provider, - l2SignerOrProvider: this.L2Provider, - l1ChainId: 1, - fastRelayer: false, - }) - this.fastWatcher = new CrossChainMessenger({ - l1SignerOrProvider: this.L1Provider, - l2SignerOrProvider: this.L2Provider, - l1ChainId: 1, - fastRelayer: true, - }) - } else if (networkGateway === 'goerli') { - this.watcher = new CrossChainMessenger({ - l1SignerOrProvider: this.L1Provider, - l2SignerOrProvider: this.L2Provider, - l1ChainId: 5, - fastRelayer: false, - }) - this.fastWatcher = new CrossChainMessenger({ - l1SignerOrProvider: this.L1Provider, - l2SignerOrProvider: this.L2Provider, - l1ChainId: 5, - fastRelayer: true, - }) - } - else { - this.watcher = null - this.fastWatcher = null - } + this.watcher = new CrossChainMessenger({ + l1SignerOrProvider: this.L1Provider, + l2SignerOrProvider: this.L2Provider, + l1ChainId: chainId, + fastRelayer: false, + }) + this.fastWatcher = new CrossChainMessenger({ + l1SignerOrProvider: this.L1Provider, + l2SignerOrProvider: this.L2Provider, + l1ChainId: chainId, + fastRelayer: true, + }) this.BobaContract = new ethers.Contract( - allTokens.BOBA.L2, + L2_SECONDARYFEETOKEN_ADDRESS, Boba.abi, this.L2Provider ) - this.xBobaContract = new ethers.Contract( - allTokens.xBOBA.L2, - Boba.abi, - this.L2Provider - ) + if (NETWORK.ETHEREUM === network) { + this.xBobaContract = new ethers.Contract( + allTokens.xBOBA.L2, + Boba.abi, + this.L2Provider + ) - if (!(await this.getAddressCached(addresses, 'GovernorBravoDelegate', 'GovernorBravoDelegate'))) return - if (!(await this.getAddressCached(addresses, 'GovernorBravoDelegator', 'GovernorBravoDelegator'))) return + if (!(await this.getAddressCached(addresses, 'GovernorBravoDelegate', 'GovernorBravoDelegate'))) return + if (!(await this.getAddressCached(addresses, 'GovernorBravoDelegator', 'GovernorBravoDelegator'))) return - this.delegateContract = new ethers.Contract( - allAddresses.GovernorBravoDelegate, - GovernorBravoDelegate.abi, - this.L2Provider - ) + this.delegateContract = new ethers.Contract( + this.addresses.GovernorBravoDelegate, + GovernorBravoDelegate.abi, + this.L2Provider + ) - this.delegatorContract = new ethers.Contract( - allAddresses.GovernorBravoDelegator, - GovernorBravoDelegator.abi, - this.L2Provider - ) + this.delegatorContract = new ethers.Contract( + this.addresses.GovernorBravoDelegator, + GovernorBravoDelegator.abi, + this.L2Provider + ) - this.delegatorContractV2 = new ethers.Contract( - allAddresses.GovernorBravoDelegatorV2, - GovernorBravoDelegator.abi, - this.L2Provider - ) + this.delegatorContractV2 = new ethers.Contract( + this.addresses.GovernorBravoDelegatorV2, + GovernorBravoDelegator.abi, + this.L2Provider + ) + } this.gasOracleContract = new ethers.Contract( L2GasOracle, @@ -855,13 +662,6 @@ class NetworkService { this.networkGateway = networkGateway this.networkType = networkType - console.log('NS: networkMM:', networkMM) - console.log('NS: networkGateway:', networkGateway) - console.log('NS: networkType:', networkType) - console.log('NS: this.chainID from MM:', this.chainID) - console.log('NS: this.networkName from MM:', this.networkName) - console.log('NS: this.account from MM:', this.account) - // defines the set of possible networks along with chainId for L1 and L2 // const nw = getNetwork() const networkDetail = getNetworkDetail({ @@ -916,6 +716,7 @@ class NetworkService { // connect to the wallet this.provider = new ethers.providers.Web3Provider(window.ethereum) + console.log([ 'Switch Chain addL2Network', chainParam ]); let res = await this.provider.send('wallet_addEthereumChain', [chainParam, this.account]) if( res === null ){ @@ -934,24 +735,17 @@ class NetworkService { networkType: this.networkType }) - let blockExplorerUrls = null - - //local does not have a blockexplorer - if( this.networkGateway !== 'local') { - blockExplorerUrls = [networkDetail.L2.blockExplorer.slice(0, -1)] - } - //the chainParams are only needed for the L2s const chainParam = { - chainId: '0x' + networkDetail.L2.chainId.toString(16), - chainName: networkDetail.L2.name, - rpcUrls: [networkDetail.L2.rpcUrl], + chainId: '0x' + networkDetail[targetLayer].chainId.toString(16), + chainName: networkDetail[targetLayer].name, + rpcUrls: [networkDetail[targetLayer].rpcUrl], nativeCurrency: { - name: 'Ethereum', - symbol: 'ETH', + name: 'BOBA TOKEN', + symbol: 'BOBA', decimals: 18, }, - blockExplorerUrls + blockExplorerUrls: [networkDetail[targetLayer].blockExplorer.slice(0, -1)] } const targetIDHex = networkDetail[targetLayer].chainIdHex @@ -959,15 +753,17 @@ class NetworkService { this.provider = new ethers.providers.Web3Provider(window.ethereum) try { - await this.provider.send('wallet_switchEthereumChain', [{ chainId: targetIDHex }]) + await this.provider.send('wallet_switchEthereumChain', [{ chainId: targetIDHex }]) window.ethereum.on('chainChanged', handleChangeChainOnce) + return true } catch (error) { // 4902 = the chain has not been added to MetaMask. // So, lets add it if (error.code === 4902) { try { + console.log([ 'Switch Chain 123', chainParam, targetIDHex ]); await this.provider.send('wallet_addEthereumChain', [chainParam, this.account]) window.ethereum.on('chainChanged', handleChangeChainOnce) return true @@ -982,110 +778,6 @@ class NetworkService { } } - async getTransactions() { - - // NOT SUPPORTED on LOCAL - if (this.networkGateway === 'local') return - if (this.account === null) return - - let txL1 = [] - let txL1pending = [] - let txL2 = [] - let txL0 = [] - - const responseL1 = await etherScanInstance( - this.networkGateway, - 'L1' - ).get(`&address=${this.account}`) - - if (responseL1.status === 200) { - const transactionsL1 = await responseL1.data - if (transactionsL1.status === '1') { - //thread in ChainID - txL1 = transactionsL1.result.map(v => ({ - ...v, - blockNumber: parseInt(v.blockNumber), //fix bug - sometimes this is string, sometimes an integer - timeStamp: parseInt(v.timeStamp), //fix bug - sometimes this is string, sometimes an integer - chain: 'L1' - })) - } - } - - const responseL2 = await omgxWatcherAxiosInstance( - this.networkGateway - ).post('get.l2.transactions', { - address: this.account, - fromRange: 0, - toRange: 1000, - }) - - if (responseL2.status === 201) { - txL2 = responseL2.data.map(v => ({ ...v, chain: 'L2' })) - } - - const responseL0 = await omgxWatcherAxiosInstance( - this.networkGateway - ).post('get.layerzero.transactions', { - address: this.account, - fromRange: 0, - toRange: 1000, - }) - - if (responseL0.status === 201) { - txL0 = responseL0.data.map((v) => ({ - ...v, - hash: v.tx_hash, - blockNumber: parseInt(v.block_number), - timeStamp: parseInt(v.timestamp), //fix bug - sometimes this is string, sometimes an integer - chain: 'L0', - altL1: true, - })) - } - - const responseL1pending = await omgxWatcherAxiosInstance( - this.networkGateway - ).post('get.l1.transactions', { - address: this.account, - fromRange: 0, - toRange: 1000, - }) - - if (responseL1pending.status === 201) { - //add the chain: 'L1pending' field - txL1pending = responseL1pending.data.map(v => ({ ...v, chain: 'L1pending' })) - const annotated = [ - ...txL1, - ...txL2, - ...txL0, - ...txL1pending //the new data product - ] - return annotated - } - - } - - async getExits() { - // NOT SUPPORTED on LOCAL - if (this.networkGateway === 'local') return - - const response = await omgxWatcherAxiosInstance( - this.networkGateway - ).post('get.l2.transactions', { - address: this.account, - fromRange: 0, - toRange: 1000, - }) - - if (response.status === 201) { - const transactions = response.data - const filteredTransactions = transactions.filter( - (i) => i.exitL2 && i.crossDomainMessage - ) - return { exited: filteredTransactions } - } - - } - async getSevens() { console.log("getSevens()") @@ -1094,7 +786,7 @@ class NetworkService { if (this.networkGateway === 'local') return const response = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).get('get.l2.pendingexits') if (response.status === 201) { @@ -1117,7 +809,7 @@ class NetworkService { if (this.networkGateway === 'local') return const response = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).get('get.l2.pendingexits') if (response.status === 201) { @@ -1137,7 +829,7 @@ class NetworkService { let monsterList = await GraphQLService.queryMonsterTransfer(this.account) const contract = new ethers.Contract( - allAddresses.BobaMonsters, + this.addresses.BobaMonsters, TuringMonsterJson.abi, this.L2Provider ) @@ -1150,7 +842,7 @@ class NetworkService { const owner = await contract.ownerOf(tokenId) //console.log("owner:", owner) if (owner.toLowerCase() === this.account.toLowerCase()) { - await this.addNFT(allAddresses.BobaMonsters, tokenId) + await this.addNFT(this.addresses.BobaMonsters, tokenId) } } await this.checkMonster() @@ -1162,9 +854,9 @@ class NetworkService { } async claimAuthenticatedTestnetTokens(tweetId) { - // Only Goerli + // Only Testnet const contract = new ethers.Contract( - addresses_Goerli.AuthenticatedFaucet, + this.addresses.AuthenticatedFaucet, AuthenticatedFaucetJson.abi, this.L2Provider, ).connect() @@ -1185,7 +877,7 @@ class NetworkService { try { const contract = new ethers.Contract( - allAddresses.BobaMonsters, + this.addresses.BobaMonsters, TuringMonsterJson.abi, this.L2Provider ) @@ -1196,12 +888,12 @@ class NetworkService { let topTop = 0 if(NFTs && Number(monsterBalance) > 0) { - //console.log("checking monsters") + for (const [ , value ] of Object.entries(NFTs)) { - //console.log(`${key} value: ${value.name}`) + if(value.name === 'TuringMonster') { const owner = await contract.ownerOf(value.tokenID) - //console.log("owner:", owner) + if(owner.toLowerCase() === this.account.toLowerCase()) { const attributes = { top: value.meta.attributes[3].value, @@ -1328,63 +1020,62 @@ class NetworkService { } } - async getGas() { + + async getBalances() { try { - const gasPrice2 = await this.L2Provider.getGasPrice() - //console.log("L2 gas", gasPrice2.toString()) - const block2 = await this.L2Provider.getBlockNumber() + let layer1Balances, layer2Balances; + + if (this.network === NETWORK.ETHEREUM) { + layer1Balances = [ + { + address: this.addresses.L1_ETH_Address, + addressL2: this.addresses.L2_ETH_Address, + currency: this.addresses.L1_ETH_Address, + symbol: 'ETH', + decimals: 18, + balance: new BN(0), + }, + ] - const gasPrice1 = await this.L1Provider.getGasPrice() - //console.log("L1 gas", gasPrice1.toString()) + layer2Balances = [ + { + address: this.addresses.L2_ETH_Address, + addressL1: this.addresses.L1_ETH_Address, + addressL2: this.addresses.L2_ETH_Address, + currency: this.addresses.L1_ETH_Address, + symbol: 'ETH', + decimals: 18, + balance: new BN(0), + }, + ] + } else { + layer1Balances = [ + { + address: this.addresses.L1_ETH_Address, + addressL2: this.addresses["TK_L2" + networkService.L1NativeTokenSymbol], + currency: this.addresses.L1_ETH_Address, + symbol: networkService.L1NativeTokenSymbol, + decimals: 18, + balance: new BN(0), + }, + ] - const block1 = await this.L1Provider.getBlockNumber() + layer2Balances = [ + { + address: this.addresses.L2_ETH_Address, + addressL1: this.addresses.TK_L1BOBA, + addressL2: this.addresses.L2_ETH_Address, + currency: this.addresses.TK_L1BOBA, + symbol: 'BOBA', + decimals: 18, + balance: new BN(0), + }, + ] - const gasData = { - gasL1: Number(logAmount(gasPrice1.toString(),9)).toFixed(0), - gasL2: Number(logAmount(gasPrice2.toString(),9)).toFixed(0), - blockL1: Number(block1), - blockL2: Number(block2), } - //console.log(gasData) - - return gasData - } catch (error) { - console.log("NS: getGas error:",error) - return error - } - - } - - async getBalances() { - - const layer1Balances = [ - { - address: allAddresses.L1_ETH_Address, - addressL2: allAddresses.L2_ETH_Address, - currency: allAddresses.L1_ETH_Address, - symbol: 'ETH', - decimals: 18, - balance: new BN(0), - }, - ] - - const layer2Balances = [ - { - address: allAddresses.L2_ETH_Address, - addressL1: allAddresses.L1_ETH_Address, - addressL2: allAddresses.L2_ETH_Address, - currency: allAddresses.L1_ETH_Address, - symbol: 'ETH', - decimals: 18, - balance: new BN(0), - }, - ] - - try { - // Always check ETH const layer1Balance = await this.L1Provider.getBalance(this.account) const layer2Balance = await this.L2Provider.getBalance(this.account) @@ -1393,15 +1084,15 @@ class NetworkService { layer2Balances[0].balance = new BN(layer2Balance.toString()) const state = store.getState() - const tA = Object.values(state.tokenList) + const tA = Object.values(state.tokenList); const tokenC = new ethers.Contract( - allAddresses.L1_ETH_Address, + this.addresses.L1_ETH_Address, L1ERC20Json.abi, this.L1Provider ) - const getERC20Balance = async(token, tokenAddress, layer, provider) => { + const getERC20Balance = async (token, tokenAddress, layer, provider) => { const balance = await tokenC.attach(tokenAddress).connect(provider).balanceOf(this.account) return { ...token, @@ -1415,41 +1106,32 @@ class NetworkService { const getBalancePromise = [] tA.forEach((token) => { - if (token.addressL1 === allAddresses.L1_ETH_Address) return - if (token.addressL2 === allAddresses.L2_ETH_Address) return if (token.addressL1 === null) return if (token.addressL2 === null) return + if (this.network === NETWORK.ETHEREUM) { + if(token.addressL1 === this.addresses.L1_ETH_Address) return + if(token.addressL2 === this.addresses.L2_ETH_Address) return + } else { + if (token.addressL1 === this.addresses.L1_ETH_Address) { + return getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - if (token.symbolL1 === 'xBOBA') { - //there is no L1 xBOBA - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - } - else if (token.symbolL1 === 'WAGMIv0') { - //there is no L1 WAGMIv0 - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - } - else if (token.symbolL1 === 'WAGMIv1') { - //there is no L1 WAGMIv1 - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - } - else if (token.symbolL1 === 'WAGMIv2') { - //there is no L2 WAGMIv2 - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - } - else if (token.symbolL1 === 'WAGMIv2-Oolong') { - //there is no L2 WAGMIv2OLO - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - } - else if (token.symbolL1 === 'WAGMIv3') { - //there is no L2 WAGMIv3 - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) - } - else if (token.symbolL1 === 'WAGMIv3-Oolong') { - //there is no L2 WAGMIv3OLO - getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) + } + if (token.addressL2 === this.addresses.L2_BOBA_Address) { + return getBalancePromise.push(getERC20Balance(token, token.addressL1, "L1", this.L1Provider)) + } } - else if (token.symbolL1 === 'OLO') { - //there is no L1 OLO + + if ([ + 'xBOBA', + 'WAGMIv0', + 'WAGMIv1', + 'WAGMIv2', + 'WAGMIv2-Oolong', + 'WAGMIv3', + 'WAGMIv3-Oolong', + 'OLO' + ].includes(token.symbolL1)) { + //there is no L1 xBOBA, WAGMIv0, WAGMIv1, WAGMIv2, WAGMIv2OLO, WAGMIv3, WAGMIv3OLO, OLO getBalancePromise.push(getERC20Balance(token, token.addressL2, "L2", this.L2Provider)) } else { @@ -1518,72 +1200,98 @@ class NetworkService { try { const time_start = new Date().getTime() - console.log("TX start time:", time_start) + console.log('Deposit ETH L2 Txs start time:', time_start); let depositTX; - - if (!recipient) { - depositTX = await this.L1StandardBridgeContract - .connect(this.provider.getSigner()) - .depositETH( - this.L2GasLimit, - utils.formatBytes32String(new Date().getTime().toString()), - { - value: value_Wei_String - } - ) + if (this.network === NETWORK.ETHEREUM) { + if (!recipient) { + depositTX = await this.L1StandardBridgeContract + .connect(this.provider.getSigner()) + .depositETH( + this.L2GasLimit, + utils.formatBytes32String(new Date().getTime().toString()), + { + value: value_Wei_String + } + ) + } else { + depositTX = await this.L1StandardBridgeContract + .connect(this.provider.getSigner()) + .depositETHTo( + recipient, + this.L2GasLimit, + utils.formatBytes32String(new Date().getTime().toString()), + { + value: value_Wei_String + } + ) + } } else { - depositTX = await this.L1StandardBridgeContract - .connect(this.provider.getSigner()) - .depositETHTo( - recipient, - this.L2GasLimit, - utils.formatBytes32String(new Date().getTime().toString()), - { - value: value_Wei_String - } + if (!recipient) { + depositTX = await this.L1StandardBridgeContract + .connect(this.provider.getSigner()) + .depositNativeToken( + this.L2GasLimit, + utils.formatBytes32String(new Date().getTime().toString()), + { + value: value_Wei_String + } + ) + } else { + depositTX = await this.L1StandardBridgeContract + .connect(this.provider.getSigner()) + .depositNativeTokenTo( + recipient, + this.L2GasLimit, + utils.formatBytes32String(new Date().getTime().toString()), + { + value: value_Wei_String + } ) + } } - //at this point the tx has been submitted, and we are waiting... await depositTX.wait() - const block = await this.L1Provider.getTransaction(depositTX.hash) - console.log(' block:', block) - //closes the Deposit modal updateSignatureStatus_depositTRAD(true) const opts = { fromBlock: -4000 } + const receipt = await this.watcher.waitForMessageReceipt(depositTX, opts) - console.log(' completed Deposit! L2 tx hash:', receipt.transactionHash) + const txReceipt = receipt.transactionReceipt; + console.log('completed Deposit! L2 tx hash:', receipt.transactionHash) const time_stop = new Date().getTime() console.log("TX finish time:", time_stop) + /* + // TODO: Investigate api-watcher failing with 502 + + const block = await this.L1Provider.getTransaction(depositTX.hash) const data = { "key": SPEED_CHECK, "hash": depositTX.hash, - "l1Tol2": false, //since we are going L2->L1 + "l1Tol2": true, //since we are going L1->L2 "startTime": time_start, "endTime": time_stop, "block": block.blockNumber, - "cdmHash": receipt.transactionHash, - "cdmBlock": receipt.blockNumber + "cdmHash": txReceipt.transactionHash, + "cdmBlock": txReceipt.blockNumber } console.log("Speed checker data payload:", data) const speed = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).post('send.crossdomainmessage', data) - console.log("Speed checker:", speed) + console.log("Speed checker:", speed) */ - return receipt + return txReceipt } catch(error) { console.log("NS: depositETHL2 error:",error) return error @@ -1603,7 +1311,7 @@ class NetworkService { try { const contract = new ethers.Contract( - allAddresses.BobaMonsters, + this.addresses.BobaMonsters, TuringMonsterJson.abi, this.L2Provider ) @@ -1618,7 +1326,7 @@ class NetworkService { const rawData = receipt.logs[3].topics[1] const numberHexString = rawData.slice(-64) let tokenID = parseInt(numberHexString, 16) - await this.addNFT( allAddresses.BobaMonsters, tokenID ) + await this.addNFT( this.addresses.BobaMonsters, tokenID ) return tx } catch (error) { @@ -1891,7 +1599,7 @@ class NetworkService { try { - if(currency === allAddresses.L2_ETH_Address) { + if(currency === this.addresses.L2_ETH_Address) { //we are sending ETH let wei = BigNumber.from(value_Wei_String) @@ -1942,7 +1650,7 @@ class NetworkService { try { - if(currency === allAddresses.L2_ETH_Address) { + if(currency === this.addresses.L2_ETH_Address) { gas_BN = await this.provider .getSigner() @@ -2072,7 +1780,7 @@ class NetworkService { let allowance_BN = await L2ERC20Contract.allowance( this.account, - allAddresses.L2LPAddress + this.addresses.L2LPAddress ) //let depositAmount_BN = new BN(value_Wei_String) @@ -2080,7 +1788,7 @@ class NetworkService { if (depositAmount_BN.gt(allowance_BN)) { const approveStatus = await L2ERC20Contract.approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, value_Wei_String ) await approveStatus.wait() @@ -2101,7 +1809,7 @@ class NetworkService { ) { console.log("approveERC20_L1LP") - const approveContractAddress = allAddresses.L1LPAddress + const approveContractAddress = this.addresses.L1LPAddress let allowance_BN = BigNumber.from("0") let allowed = false @@ -2114,7 +1822,7 @@ class NetworkService { this.provider.getSigner() ) - if( currency !== allAddresses.L1_ETH_Address ) { + if( currency !== this.addresses.L1_ETH_Address ) { let allowance_BN = await ERC20Contract.allowance( this.account, @@ -2177,7 +1885,7 @@ class NetworkService { async approveERC20( value_Wei_String, currency, - approveContractAddress = allAddresses.L1StandardBridgeAddress, + approveContractAddress = this.addresses.L1StandardBridgeAddress, contractABI = L1ERC20Json.abi ) { @@ -2275,7 +1983,7 @@ class NetworkService { let allowance_BN = await L1_TEST_Contract.allowance( this.account, - allAddresses.L1StandardBridgeAddress + this.addresses.L1StandardBridgeAddress ) try { @@ -2291,7 +1999,7 @@ class NetworkService { console.log("Current OMG Token allowance too small - might need to reset to 0, unless it's already zero") if (allowance_BN.gt(BigNumber.from("0"))) { const approveOMG = await L1_TEST_Contract.approve( - allAddresses.L1StandardBridgeAddress, + this.addresses.L1StandardBridgeAddress, ethers.utils.parseEther("0") ) await approveOMG.wait() @@ -2302,7 +2010,7 @@ class NetworkService { //recheck the allowance allowance_BN = await L1_TEST_Contract.allowance( this.account, - allAddresses.L1StandardBridgeAddress + this.addresses.L1StandardBridgeAddress ) const allowed = allowance_BN.gte(BigNumber.from(value_Wei_String)) @@ -2311,7 +2019,7 @@ class NetworkService { //and now, the normal allowance transaction const approveStatus = await L1_TEST_Contract .connect(this.provider.getSigner()).approve( - allAddresses.L1StandardBridgeAddress, + this.addresses.L1StandardBridgeAddress, value_Wei_String ) await approveStatus.wait() @@ -2362,33 +2070,34 @@ class NetworkService { fromBlock: -4000 } const receipt = await this.watcher.waitForMessageReceipt(depositTX, opts) - console.log(' completed Deposit! L2 tx hash:', receipt.transactionHash) + const txReceipt = receipt.transactionReceipt; + console.log('completed ERC20 Deposit! L2 tx hash:', txReceipt.transactionHash) const time_stop = new Date().getTime() console.log("TX finish time:", time_stop) - const data = { - "key": SPEED_CHECK, - "hash": depositTX.hash, - "l1Tol2": true, - "startTime": time_start, - "endTime": time_stop, - "block": block.blockNumber, - "cdmHash": receipt.transactionHash, - "cdmBlock": receipt.blockNumber - } + // const data = { + // "key": SPEED_CHECK, + // "hash": depositTX.hash, + // "l1Tol2": true, + // "startTime": time_start, + // "endTime": time_stop, + // "block": block.blockNumber, + // "cdmHash": txReceipt.transactionHash, + // "cdmBlock": txReceipt.blockNumber + // } - console.log("Speed checker data payload:", data) + // console.log("Speed checker data payload:", data) - const speed = await omgxWatcherAxiosInstance( - this.networkGateway - ).post('send.crossdomainmessage', data) + // const speed = await omgxWatcherAxiosInstance( + // this.networkConfig + // ).post('send.crossdomainmessage', data) - console.log("Speed checker:", speed) + // console.log("Speed checker:", speed) this.getBalances() - return receipt + return txReceipt } catch (error) { console.log("NS: depositErc20 error:", error) return error @@ -2403,7 +2112,7 @@ class NetworkService { try { const L2BillingContract = new ethers.Contract( - allAddresses.Proxy__BobaBillingContract, + this.addresses.Proxy__BobaBillingContract, L2BillingContractJson.abi, this.L2Provider, ) @@ -2414,43 +2123,39 @@ class NetworkService { const allowance = await this.checkAllowance( currencyAddress, - allAddresses.DiscretionaryExitFee + this.addresses.DiscretionaryExitFee ) const BobaAllowance = await this.checkAllowance( - allAddresses.TK_L2BOBA, - allAddresses.DiscretionaryExitFee + this.addresses.TK_L2BOBA, + this.addresses.DiscretionaryExitFee ) - if (utils.getAddress(currencyAddress) === utils.getAddress(allAddresses.TK_L2BOBA)) { - BobaApprovalAmount = BobaApprovalAmount.add(value) - } - // Should approve BOBA if ( BobaAllowance.lt(BobaApprovalAmount) ) { const res = await this.approveERC20( BobaApprovalAmount, - allAddresses.TK_L2BOBA, - allAddresses.DiscretionaryExitFee + this.addresses.TK_L2BOBA, + this.addresses.DiscretionaryExitFee ) if (!res) return false } // Should approve other tokens - if( currencyAddress !== allAddresses.L2_ETH_Address && - utils.getAddress(currencyAddress) !== utils.getAddress(allAddresses.TK_L2BOBA) && + if( currencyAddress !== this.addresses.L2_ETH_Address && + utils.getAddress(currencyAddress) !== utils.getAddress(this.addresses.TK_L2BOBA) && allowance.lt(value) ) { const res = await this.approveERC20( value, currencyAddress, - allAddresses.DiscretionaryExitFee + this.addresses.DiscretionaryExitFee ) if (!res) return false } const DiscretionaryExitFeeContract = new ethers.Contract( - allAddresses.DiscretionaryExitFee, + this.addresses.DiscretionaryExitFee, DiscretionaryExitFeeJson.abi, this.provider.getSigner() ) @@ -2461,8 +2166,8 @@ class NetworkService { value_Wei_String, this.L1GasLimit, utils.formatBytes32String(new Date().getTime().toString()), - currencyAddress === allAddresses.L2_ETH_Address ? - { value: value_Wei_String } : {} + currencyAddress === this.addresses.L2_ETH_Address ? + { value: value.add(BobaApprovalAmount) } : { value: BobaApprovalAmount } ) //everything submitted... waiting @@ -2493,7 +2198,7 @@ class NetworkService { const gasPrice = await this.L2Provider.getGasPrice() console.log("Classical exit gas price", gasPrice.toString()) - if( currencyAddress !== allAddresses.L2_ETH_Address ) { + if( currencyAddress !== this.addresses.L2_ETH_Address ) { const ERC20Contract = new ethers.Contract( currencyAddress, @@ -2502,7 +2207,7 @@ class NetworkService { ) const tx = await ERC20Contract.populateTransaction.approve( - allAddresses.DiscretionaryExitFee, + this.addresses.DiscretionaryExitFee, utils.parseEther('1.0') ) @@ -2512,13 +2217,13 @@ class NetworkService { } const DiscretionaryExitFeeContract = new ethers.Contract( - allAddresses.DiscretionaryExitFee, + this.addresses.DiscretionaryExitFee, DiscretionaryExitFeeJson.abi, this.provider.getSigner() ) const tx2 = await DiscretionaryExitFeeContract.populateTransaction.payAndWithdraw( - allAddresses.L2_ETH_Address, + this.addresses.L2_ETH_Address, utils.parseEther('0.00001'), this.L1GasLimit, ethers.utils.formatBytes32String(new Date().getTime().toString()), @@ -2548,7 +2253,7 @@ class NetworkService { try{ const L1LPContract = new ethers.Contract( - allAddresses.L1LPAddress, + this.addresses.L1LPAddress, L1LPJson.abi, this.L1Provider ) @@ -2577,7 +2282,7 @@ class NetworkService { try{ const L2LPContract = new ethers.Contract( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, L2LPJson.abi, this.L2Provider ) @@ -2603,7 +2308,7 @@ class NetworkService { async getL1UserRewardFeeRate(tokenAddress) { try{ const L1LPContract = new ethers.Contract( - allAddresses.L1LPAddress, + this.addresses.L1LPAddress, L1LPJson.abi, this.L1Provider ) @@ -2619,7 +2324,7 @@ class NetworkService { async getL2UserRewardFeeRate(tokenAddress) { try { const L2LPContract = new ethers.Contract( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, L2LPJson.abi, this.L2Provider ) @@ -2640,7 +2345,7 @@ class NetworkService { const poolInfo = {} const userInfo = {} - let tokenAddressList = Object.keys(allTokens).reduce((acc, cur) => { + let tokenAddressList = Object.keys(this.tokenAddresses).reduce((acc, cur) => { if(cur !== 'xBOBA' && cur !== 'OLO' && cur !== 'WAGMIv0' && @@ -2649,13 +2354,13 @@ class NetworkService { cur !== 'WAGMIv2-Oolong' && cur !== 'WAGMIv3' && cur !== 'WAGMIv3-Oolong') { - acc.push(allTokens[cur].L1.toLowerCase()) + acc.push(this.tokenAddresses[cur].L1.toLowerCase()) } return acc - }, [allAddresses.L1_ETH_Address]) + }, [this.addresses.L1_ETH_Address]) const L1LPContract = new ethers.Contract( - allAddresses.L1LPAddress, + this.addresses.L1LPAddress, L1LPJson.abi, this.L1Provider ) @@ -2669,17 +2374,15 @@ class NetworkService { let tokenName let decimals - if (tokenAddress === allAddresses.L1_ETH_Address) { - //console.log("Getting eth balance:", tokenAddress) + if (tokenAddress === this.addresses.L1_ETH_Address) { //getting eth balance - tokenBalance = await this.L1Provider.getBalance(allAddresses.L1LPAddress) - tokenSymbol = 'ETH' - tokenName = 'Ethereum' + tokenBalance = await this.L1Provider.getBalance(this.addresses.L1LPAddress) + tokenSymbol = this.L1NativeTokenSymbol + tokenName = this.L1NativeTokenName decimals = 18 } else { //getting eth balance - //console.log("Getting balance for:", tokenAddress) - tokenBalance = await this.L1_TEST_Contract.attach(tokenAddress).connect(this.L1Provider).balanceOf(allAddresses.L1LPAddress) + tokenBalance = await this.L1_TEST_Contract.attach(tokenAddress).connect(this.L1Provider).balanceOf(this.addresses.L1LPAddress) const tokenInfoFiltered = this.tokenInfo.L1[utils.getAddress(tokenAddress)] if (tokenInfo) { tokenSymbol = tokenInfoFiltered.symbol @@ -2731,12 +2434,13 @@ class NetworkService { rewardDebt: Object.keys(token.userTokenInfo).length? token.userTokenInfo.rewardDebt.toString(): 0 } }) + return { poolInfo, userInfo } } async getL2LPInfo() { - const tokenAddressList = Object.keys(allTokens).reduce((acc, cur) => { + const tokenAddressList = Object.keys(this.tokenAddresses).reduce((acc, cur) => { if(cur !== 'xBOBA' && cur !== 'OLO' && cur !== 'WAGMIv0' && @@ -2747,18 +2451,18 @@ class NetworkService { cur !== 'WAGMIv3-Oolong' ) { acc.push({ - L1: allTokens[cur].L1.toLowerCase(), - L2: allTokens[cur].L2.toLowerCase() + L1: this.tokenAddresses[cur].L1.toLowerCase(), + L2: this.tokenAddresses[cur].L2.toLowerCase() }) } return acc }, [{ - L1: allAddresses.L1_ETH_Address, - L2: allAddresses.L2_ETH_Address + L1: this.addresses.L1_ETH_Address, + L2: this.addresses.L2_ETH_Address }]) const L2LPContract = new ethers.Contract( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, L2LPJson.abi, this.L2Provider ) @@ -2775,13 +2479,13 @@ class NetworkService { let tokenName let decimals - if (tokenAddress === allAddresses.L2_ETH_Address) { - tokenBalance = await this.L2Provider.getBalance(allAddresses.L2LPAddress) - tokenSymbol = 'ETH' - tokenName = 'Ethereum' + if (tokenAddress === this.addresses.L2_ETH_Address) { + tokenBalance = await this.L2Provider.getBalance(this.addresses.L2LPAddress) + tokenSymbol = this.network === NETWORK.ETHEREUM ? 'ETH' : 'BOBA' + tokenName = this.network === NETWORK.ETHEREUM ? 'Ethereum' : 'BOBA Token' decimals = 18 } else { - tokenBalance = await this.L2_TEST_Contract.attach(tokenAddress).connect(this.L2Provider).balanceOf(allAddresses.L2LPAddress) + tokenBalance = await this.L2_TEST_Contract.attach(tokenAddress).connect(this.L2Provider).balanceOf(this.addresses.L2LPAddress) const tokenInfoFiltered = this.tokenInfo.L2[utils.getAddress(tokenAddress)] if (tokenInfo) { tokenSymbol = tokenInfoFiltered.symbol @@ -2844,7 +2548,7 @@ class NetworkService { let otherField = {} - if( currency === allAddresses.L1_ETH_Address || currency === allAddresses.L2_ETH_Address ) { + if( currency === this.addresses.L1_ETH_Address || currency === this.addresses.L2_ETH_Address ) { // add value field for ETH otherField['value'] = value_Wei_String } @@ -2882,12 +2586,12 @@ class NetworkService { // First, we need the approval cost // not relevant to ETH - if( currency !== allAddresses.L2_ETH_Address ) { + if( currency !== this.addresses.L2_ETH_Address ) { const tx1 = await this.BobaContract .populateTransaction .approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, utils.parseEther('1.0'), otherField ) @@ -2992,7 +2696,7 @@ class NetworkService { .clientDepositL1( value_Wei_String, currency, - currency === allAddresses.L1_ETH_Address ? { value: value_Wei_String } : {} + currency === this.addresses.L1_ETH_Address ? { value: value_Wei_String } : {} ) console.log("depositTX",depositTX) @@ -3005,6 +2709,8 @@ class NetworkService { updateSignatureStatus_depositLP(true) + // TODO: Below part is disabled + const opts = { fromBlock: -4000 } @@ -3028,7 +2734,7 @@ class NetworkService { console.log("Speed checker data payload:", data) const speed = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).post('send.crossdomainmessage', data) console.log("Speed checker:", speed) @@ -3105,7 +2811,7 @@ class NetworkService { console.log("Speed checker data payload:", data) const speed = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).post('send.crossdomainmessage', data) console.log("Speed checker:", speed) @@ -3124,7 +2830,7 @@ class NetworkService { async L1LPPending(tokenAddress) { const L1pending = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).get('get.l2.pendingexits', {}) const pendingFast = L1pending.data.filter(i => { @@ -3161,15 +2867,15 @@ class NetworkService { let tokenAddressLC = tokenAddress.toLowerCase() if ( - tokenAddressLC === allAddresses.L2_ETH_Address || - tokenAddressLC === allAddresses.L1_ETH_Address + tokenAddressLC === this.addresses.L2_ETH_Address || + tokenAddressLC === this.addresses.L1_ETH_Address ) { - balance = await this.L1Provider.getBalance(allAddresses.L1LPAddress) + balance = await this.L1Provider.getBalance(this.addresses.L1LPAddress) } else { balance = await this.L1_TEST_Contract .attach(tokenAddress) .connect(this.L1Provider) - .balanceOf(allAddresses.L1LPAddress) + .balanceOf(this.addresses.L1LPAddress) } return balance.toString() @@ -3185,16 +2891,16 @@ class NetworkService { let tokenAddressLC = tokenAddress.toLowerCase() if ( - tokenAddressLC === allAddresses.L2_ETH_Address || - tokenAddressLC === allAddresses.L1_ETH_Address + tokenAddressLC === this.addresses.L2_BOBA_Address || + tokenAddressLC === this.addresses.L1_ETH_Address ) { //We are dealing with ETH balance = await this.L2_ETH_Contract.connect(this.L2Provider).balanceOf( - allAddresses.L2LPAddress + this.addresses.L2LPAddress ) } else { balance = await this.L2_TEST_Contract.attach(tokenAddress).connect(this.L2Provider).balanceOf( - allAddresses.L2LPAddress + this.addresses.L2LPAddress ) } @@ -3207,7 +2913,7 @@ class NetworkService { async L1LPLiquidity(tokenAddress) { const L1LPContractNS = new ethers.Contract( - allAddresses.L1LPAddress, + this.addresses.L1LPAddress, L1LPJson.abi, this.L1Provider ) @@ -3228,7 +2934,7 @@ class NetworkService { async L2LPLiquidity(tokenAddress) { const L2LPContractNS = new ethers.Contract( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, L2LPJson.abi, this.L2Provider ) @@ -3251,7 +2957,7 @@ class NetworkService { const gasPrice = await this.L2Provider.getGasPrice() console.log("Fast exit gas price", gasPrice.toString()) - if( currencyAddress !== allAddresses.L2_ETH_Address ) { + if( currencyAddress !== this.addresses.L2_ETH_Address ) { const ERC20Contract = new ethers.Contract( currencyAddress, @@ -3262,7 +2968,7 @@ class NetworkService { const tx = await ERC20Contract .populateTransaction .approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, utils.parseEther('1.0') ) @@ -3276,9 +2982,9 @@ class NetworkService { .connect(this.provider.getSigner()) .populateTransaction .clientDepositL2( - currencyAddress === allAddresses.L2_ETH_Address ? '1' : '0', //ETH does not allow zero + currencyAddress === this.addresses.L2_ETH_Address ? '1' : '0', //ETH does not allow zero currencyAddress, - currencyAddress === allAddresses.L2_ETH_Address ? { value : '1'} : {} + currencyAddress === this.addresses.L2_ETH_Address ? { value : '1'} : {} ) const depositGas_BN = await this.L2Provider.estimateGas({...tx2, from: this.gasEstimateAccount}) @@ -3311,7 +3017,7 @@ class NetworkService { const gasPrice = await this.L1Provider.getGasPrice() console.log("Fast deposit gas price", gasPrice.toString()) - if( currencyAddress !== allAddresses.L1_ETH_Address ) { + if( currencyAddress !== this.addresses.L1_ETH_Address ) { const ERC20Contract = new ethers.Contract( currencyAddress, @@ -3320,7 +3026,7 @@ class NetworkService { ) const tx = await ERC20Contract.populateTransaction.approve( - allAddresses.L1LPAddress, + this.addresses.L1LPAddress, utils.parseEther('1.0') ) @@ -3332,9 +3038,9 @@ class NetworkService { //in some cases zero not allowed const tx2 = await this.L1LPContract .connect(this.provider.getSigner()).populateTransaction.clientDepositL1( - currencyAddress === allAddresses.L1_ETH_Address ? '1' : '0', //ETH does not allow zero + currencyAddress === this.addresses.L1_ETH_Address ? '1' : '0', //ETH does not allow zero currencyAddress, - currencyAddress === allAddresses.L1_ETH_Address ? { value : '1'} : {} + currencyAddress === this.addresses.L1_ETH_Address ? { value : '1'} : {} ) const depositGas_BN = await this.L1Provider.estimateGas(tx2) @@ -3366,7 +3072,7 @@ class NetworkService { ) const tx = await ERC20Contract.populateTransaction.approve( - allAddresses.L1LPAddress, + this.addresses.L1LPAddress, utils.parseEther('0') ) @@ -3411,20 +3117,20 @@ class NetworkService { let gasPrice = await this.L2Provider.getGasPrice() console.log("Fast exit gas price", gasPrice.toString()) - if( currencyAddress === allAddresses.L2_ETH_Address ) { + if( currencyAddress === this.addresses.L2_ETH_Address ) { balance_BN = await this.L2Provider.getBalance(this.account) } const L2BillingContract = new ethers.Contract( - allAddresses.Proxy__BobaBillingContract, + this.addresses.Proxy__BobaBillingContract, L2BillingContractJson.abi, this.L2Provider, ) let BobaApprovalAmount = await L2BillingContract.exitFee() const BobaAllowance = await this.checkAllowance( - allAddresses.TK_L2BOBA, - allAddresses.L2LPAddress, + this.addresses.TK_L2BOBA, + this.addresses.L2LPAddress, ) try { @@ -3432,15 +3138,15 @@ class NetworkService { if (BobaAllowance.lt(BobaApprovalAmount)) { const approveStatus = await this.approveERC20( BobaApprovalAmount, - allAddresses.TK_L2BOBA, - allAddresses.L2LPAddress + this.addresses.TK_L2BOBA, + this.addresses.L2LPAddress ) if (!approveStatus) return false } // Approve other tokens - if( currencyAddress !== allAddresses.L2_ETH_Address && - utils.getAddress(currencyAddress) !== utils.getAddress(allAddresses.TK_L2BOBA) + if( currencyAddress !== this.addresses.L2_ETH_Address && + utils.getAddress(currencyAddress) !== utils.getAddress(this.addresses.TK_L2BOBA) ) { const L2ERC20Contract = new ethers.Contract( currencyAddress, @@ -3455,7 +3161,7 @@ class NetworkService { let allowance_BN = await L2ERC20Contract.allowance( this.account, - allAddresses.L2LPAddress + this.addresses.L2LPAddress ) console.log("Allowance:",utils.formatEther(allowance_BN)) @@ -3463,7 +3169,7 @@ class NetworkService { //Estimate gas const tx = await L2ERC20Contract.populateTransaction.approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, balance_BN ) @@ -3472,7 +3178,7 @@ class NetworkService { console.log("Cost to Approve (ETH):", utils.formatEther(approvalCost_BN)) const approveStatus = await L2ERC20Contract.approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, balance_BN ) await approveStatus.wait() @@ -3490,7 +3196,7 @@ class NetworkService { .connect(this.provider.getSigner()).populateTransaction.clientDepositL2( balance_BN, currencyAddress, - currencyAddress === allAddresses.L2_ETH_Address ? { value : '1' } : {} + currencyAddress === this.addresses.L2_ETH_Address ? { value : '1' } : {} ) let depositGas_BN = await this.L2Provider.estimateGas(tx2) @@ -3512,7 +3218,7 @@ class NetworkService { let depositCost_BN = depositGas_BN.mul(gasPrice).add(l1SecurityFee) console.log("Deposit gas cost (ETH)", utils.formatEther(depositCost_BN)) - if(currencyAddress === allAddresses.L2_ETH_Address) { + if(currencyAddress === this.addresses.L2_ETH_Address) { //if fee token, need to consider cost to exit balance_BN = balance_BN.sub(depositCost_BN) } @@ -3531,7 +3237,7 @@ class NetworkService { .connect(this.provider.getSigner()).clientDepositL2( balance_BN, currencyAddress, - currencyAddress === allAddresses.L2_ETH_Address ? { value : balance_BN.sub(depositCost_BN) } : {} + currencyAddress === this.addresses.L2_ETH_Address ? { value : balance_BN.sub(depositCost_BN) } : {} ) //at this point the tx has been submitted, and we are waiting... @@ -3547,7 +3253,9 @@ class NetworkService { fromBlock: -4000 } const receipt = await this.fastWatcher.waitForMessageReceipt(depositTX, opts) - console.log(' completed Deposit! L1 tx hash:', receipt.transactionHash) + const txReceipt = receipt.transactionReceipt; + + console.log(' completed Deposit! L1 tx hash:', txReceipt.transactionHash) const time_stop = new Date().getTime() console.log("TX finish time:", time_stop) @@ -3559,14 +3267,14 @@ class NetworkService { "startTime": time_start, "endTime": time_stop, "block": block.blockNumber, - "cdmHash": receipt.transactionHash, - "cdmBlock": receipt.blockNumber + "cdmHash": txReceipt.transactionHash, + "cdmBlock": txReceipt.blockNumber } console.log("Speed checker data payload:", data) const speed = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).post('send.crossdomainmessage', data) console.log("Speed checker:", speed) @@ -3588,34 +3296,34 @@ class NetworkService { console.log("depositL2LP currencyAddress",currencyAddress) const L2BillingContract = new ethers.Contract( - allAddresses.Proxy__BobaBillingContract, + this.addresses.Proxy__BobaBillingContract, L2BillingContractJson.abi, this.L2Provider, ) let BobaApprovalAmount = await L2BillingContract.exitFee() const BobaAllowance = await this.checkAllowance( - allAddresses.TK_L2BOBA, - allAddresses.L2LPAddress, + this.addresses.TK_L2BOBA, + this.addresses.L2LPAddress, ) try { // Approve BOBA first - if (utils.getAddress(currencyAddress) === utils.getAddress(allAddresses.TK_L2BOBA)) { + if (utils.getAddress(currencyAddress) === utils.getAddress(this.addresses.TK_L2BOBA)) { BobaApprovalAmount = BobaApprovalAmount.add(BigNumber.from(value_Wei_String)) } if (BobaAllowance.lt(BobaApprovalAmount)) { const approveStatus = await this.approveERC20( BobaApprovalAmount, - allAddresses.TK_L2BOBA, - allAddresses.L2LPAddress + this.addresses.TK_L2BOBA, + this.addresses.L2LPAddress ) if (!approveStatus) return false } // Approve other tokens - if( currencyAddress !== allAddresses.L2_ETH_Address && - utils.getAddress(currencyAddress) !== utils.getAddress(allAddresses.TK_L2BOBA) + if( currencyAddress !== this.addresses.L2_ETH_Address && + utils.getAddress(currencyAddress) !== utils.getAddress(this.addresses.TK_L2BOBA) ) { const L2ERC20Contract = new ethers.Contract( @@ -3626,14 +3334,14 @@ class NetworkService { let allowance_BN = await L2ERC20Contract.allowance( this.account, - allAddresses.L2LPAddress + this.addresses.L2LPAddress ) let depositAmount_BN = BigNumber.from(value_Wei_String) if (depositAmount_BN.gt(allowance_BN)) { const approveStatus = await L2ERC20Contract.approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, value_Wei_String ) await approveStatus.wait() @@ -3648,7 +3356,7 @@ class NetworkService { .connect(this.provider.getSigner()).clientDepositL2( value_Wei_String, currencyAddress, - currencyAddress === allAddresses.L2_ETH_Address ? { value: value_Wei_String } : {} + currencyAddress === this.addresses.L2_ETH_Address ? { value: value_Wei_String } : {} ) //at this point the tx has been submitted, and we are waiting... @@ -3664,7 +3372,8 @@ class NetworkService { fromBlock: -4000 } const receipt = await this.fastWatcher.waitForMessageReceipt(depositTX, opts) - console.log(' completed Deposit! L1 tx hash:', receipt.transactionHash) + const txReceipt = receipt.transactionReceipt; + console.log(' completed Deposit! L1 tx hash:', txReceipt.transactionHash) const time_stop = new Date().getTime() console.log("TX finish time:", time_stop) @@ -3676,19 +3385,19 @@ class NetworkService { "startTime": time_start, "endTime": time_stop, "block": block.blockNumber, - "cdmHash": receipt.transactionHash, - "cdmBlock": receipt.blockNumber + "cdmHash": txReceipt.transactionHash, + "cdmBlock": txReceipt.blockNumber } console.log("Speed checker data payload:", data) const speed = await omgxWatcherAxiosInstance( - this.networkGateway + this.networkConfig ).post('send.crossdomainmessage', data) console.log("Speed checker:", speed) - return receipt + return txReceipt } catch (error) { console.log("NS: depositL2LP error:", error) return error @@ -3861,7 +3570,7 @@ class NetworkService { if( !this.delegateContract ) return try { - const delegateCheck = await this.delegateContract.attach(allAddresses.GovernorBravoDelegator) + const delegateCheck = await this.delegateContract.attach(this.addresses.GovernorBravoDelegator) const rawThreshold = await delegateCheck.proposalThreshold() return { proposalThreshold: formatEther(rawThreshold) } } catch (error) { @@ -3896,12 +3605,12 @@ class NetworkService { /* let tokenIds = payload.tokenIds // create proposal only on latest contracts. - const delegateCheck = await this.delegateContract.attach(allAddresses.GovernorBravoDelegatorV2) + const delegateCheck = await this.delegateContract.attach(this.addresses.GovernorBravoDelegatorV2) */ // FIXME: Ve DAO Till here - const delegateCheck = await this.delegateContract.attach(allAddresses.GovernorBravoDelegator) + const delegateCheck = await this.delegateContract.attach(this.addresses.GovernorBravoDelegator) if( payload.action === 'text-proposal' ) { address = ['0x000000000000000000000000000000000000dEaD'] @@ -3915,7 +3624,7 @@ class NetworkService { value2 = Number(payload.value[1]) value3 = Number(payload.value[2]) description = `Change L1 LP Bridge fee to ${value1}, ${value2}, and ${value3} integer percent` - address = [allAddresses.L2LPAddress] + address = [this.addresses.L2LPAddress] callData = [ethers.utils.defaultAbiCoder.encode( ['uint256','uint256','uint256'], [value1, value2, value3] @@ -3927,7 +3636,7 @@ class NetworkService { value2 = Number(payload.value[1]) value3 = Number(payload.value[2]) description = `Change L2 LP Bridge fee to ${value1}, ${value2}, and ${value3} integer percent` - address = [allAddresses.L2LPAddress] + address = [this.addresses.L2LPAddress] callData = [ethers.utils.defaultAbiCoder.encode( ['uint256','uint256','uint256'], [value1, value2, value3] @@ -3976,8 +3685,8 @@ class NetworkService { if (!this.delegateContract || this.networkGateway === 'goerli') return - const delegateCheckV1 = await this.delegateContract.attach(allAddresses.GovernorBravoDelegator) - const delegateCheckV2 = await this.delegateContract.attach(allAddresses.GovernorBravoDelegatorV2) + const delegateCheckV1 = await this.delegateContract.attach(this.addresses.GovernorBravoDelegator) + const delegateCheckV2 = await this.delegateContract.attach(this.addresses.GovernorBravoDelegatorV2) try { @@ -3987,13 +3696,13 @@ class NetworkService { const descriptionList = await GraphQLService.queryBridgeProposalCreated() const proposalGroup = groupBy(descriptionList.data.governorProposalCreateds, 'to'); - const delegatorList = [ allAddresses.GovernorBravoDelegator, allAddresses.GovernorBravoDelegatorV2 ]; + const delegatorList = [ this.addresses.GovernorBravoDelegator, this.addresses.GovernorBravoDelegatorV2 ]; for (let delegator of delegatorList) { let delegateCheck; - if (delegator === allAddresses.GovernorBravoDelegator) { + if (delegator === this.addresses.GovernorBravoDelegator) { delegateCheck = delegateCheckV1; - } else if(delegator === allAddresses.GovernorBravoDelegatorV2) { + } else if(delegator === this.addresses.GovernorBravoDelegatorV2) { delegateCheck = delegateCheckV2; } const proposals = proposalGroup[ delegator.toLowerCase() ] @@ -4062,7 +3771,7 @@ class NetworkService { hasLiveProposal } } catch (error) { - console.log("NS: fetchProposals error:",error) + console.log("NS: fetchProposalsVeDao error:",error) return error } } @@ -4072,7 +3781,7 @@ class NetworkService { if (!this.delegateContract) return try { - const delegateCheck = await this.delegateContract.attach(allAddresses.GovernorBravoDelegatorV2) + const delegateCheck = await this.delegateContract.attach(this.addresses.GovernorBravoDelegatorV2) if (this.account) { const receipt = await delegateCheck.getReceipt(Number(proposalId), tokenId); @@ -4101,7 +3810,7 @@ class NetworkService { try { const delegateCheck = await this.delegateContract .connect(this.provider.getSigner()) - .attach(allAddresses.GovernorBravoDelegatorV2) + .attach(this.addresses.GovernorBravoDelegatorV2) const res = await delegateCheck.castVote(id, userVote, tokenIds) @@ -4125,7 +3834,7 @@ class NetworkService { try { const delegateCheck = await this.delegateContract .connect(this.provider.getSigner()) - .attach(allAddresses.GovernorBravoDelegator) + .attach(this.addresses.GovernorBravoDelegator) let res = delegateCheck.queue(Number(proposalID)) return res } catch(error) { @@ -4147,7 +3856,7 @@ class NetworkService { try { const delegateCheck = await this.delegateContract .connect(this.provider.getSigner()) - .attach(allAddresses.GovernorBravoDelegator) + .attach(this.addresses.GovernorBravoDelegator) let res = delegateCheck.execute(Number(proposalID)) return res } catch(error) { @@ -4170,23 +3879,19 @@ class NetworkService { try { const FixedSavings = new ethers.Contract( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, L2SaveJson.abi, this.provider.getSigner() ) - console.log("FixedSavings.address:",FixedSavings.address) - let allowance_BN = await this.BobaContract .connect(this.provider.getSigner()) .allowance( this.account, - allAddresses.BobaFixedSavings + this.addresses.BobaFixedSavings ) - console.log("Allowance:", allowance_BN.toString()) let depositAmount_BN = BigNumber.from(value_Wei_String) - console.log("Deposit:", depositAmount_BN) let approveAmount_BN = depositAmount_BN.add(BigNumber.from('1000000000000')) @@ -4196,11 +3901,10 @@ class NetworkService { const approveStatus = await this.BobaContract .connect(this.provider.getSigner()) .approve( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, approveAmount_BN ) const TX = await approveStatus.wait() - console.log("approveStatus:", TX) } else { console.log("Allowance is sufficient:", allowance_BN.toString(), depositAmount_BN.toString()) @@ -4241,7 +3945,7 @@ class NetworkService { .connect(this.provider) .allowance( this.gasEstimateAccount, - allAddresses.BobaFixedSavings + this.addresses.BobaFixedSavings ) console.log("benchmarkAllowance_BN",allowance_BN.toString()) @@ -4250,7 +3954,7 @@ class NetworkService { .connect(this.provider.getSigner()) .populateTransaction .approve( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, allowance_BN.toString(), ) @@ -4260,7 +3964,7 @@ class NetworkService { // third, we need the stake cost const FixedSavings = new ethers.Contract( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, L2SaveJson.abi, this.provider ) @@ -4295,7 +3999,7 @@ class NetworkService { try { const FixedSavings = new ethers.Contract( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, L2SaveJson.abi, this.provider.getSigner() ) @@ -4317,7 +4021,7 @@ class NetworkService { try { const FixedSavings = new ethers.Contract( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, L2SaveJson.abi, this.L2Provider ) @@ -4336,57 +4040,57 @@ class NetworkService { let allowance_BN = null let approveStatus = null - if(allAddresses.hasOwnProperty('BobaFixedSavings')) { + if(this.addresses.hasOwnProperty('BobaFixedSavings')) { allowance_BN = await this.BobaContract .connect(this.provider.getSigner()) .allowance( this.account, - allAddresses.BobaFixedSavings + this.addresses.BobaFixedSavings ) console.log("Fixed Savings Allowance", allowance_BN.toString()) approveStatus = await this.BobaContract .connect(this.provider.getSigner()) .approve( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, approvalAmount ) await approveStatus.wait() console.log("Fixed Savings Approval", approveStatus) } - if(allAddresses.hasOwnProperty('DiscretionaryExitFee')) { + if(this.addresses.hasOwnProperty('DiscretionaryExitFee')) { allowance_BN = await this.BobaContract .connect(this.provider.getSigner()) .allowance( this.account, - allAddresses.DiscretionaryExitFee + this.addresses.DiscretionaryExitFee ) console.log("DiscretionaryExitFee Allowance", allowance_BN.toString()) approveStatus = await this.BobaContract .connect(this.provider.getSigner()) .approve( - allAddresses.DiscretionaryExitFee, + this.addresses.DiscretionaryExitFee, approvalAmount ) await approveStatus.wait() console.log("DiscretionaryExitFee Approval", approveStatus) } - if(allAddresses.hasOwnProperty('L2LPAddress')) { + if(this.addresses.hasOwnProperty('L2LPAddress')) { allowance_BN = await this.BobaContract .connect(this.provider.getSigner()) .allowance( this.account, - allAddresses.L2LPAddress + this.addresses.L2LPAddress ) console.log("L2LP", allowance_BN.toString()) approveStatus = await this.BobaContract .connect(this.provider.getSigner()) .approve( - allAddresses.L2LPAddress, + this.addresses.L2LPAddress, approvalAmount ) await approveStatus.wait() @@ -4405,7 +4109,7 @@ class NetworkService { try { const FixedSavings = new ethers.Contract( - allAddresses.BobaFixedSavings, + this.addresses.BobaFixedSavings, L2SaveJson.abi, this.L2Provider ) @@ -4518,7 +4222,7 @@ class NetworkService { /***********************************************/ async getExitFeeFromBillingContract() { const L2BillingContract = new ethers.Contract( - allAddresses.Proxy__BobaBillingContract, + this.addresses.Proxy__BobaBillingContract, L2BillingContractJson.abi, this.L2Provider, ) @@ -4554,7 +4258,7 @@ class NetworkService { try { const ve = new ethers.Contract( - allAddresses.Ve_BOBA, + this.addresses.Ve_BOBA, veJson.abi, this.provider.getSigner() ) @@ -4563,7 +4267,7 @@ class NetworkService { .connect(this.provider.getSigner()) .allowance( this.account, - allAddresses.Ve_BOBA + this.addresses.Ve_BOBA ) let depositAmount_BN = BigNumber.from(value_Wei_String) @@ -4575,7 +4279,7 @@ class NetworkService { const approveStatus = await this.BobaContract .connect(this.provider.getSigner()) .approve( - allAddresses.Ve_BOBA, + this.addresses.Ve_BOBA, approveAmount_BN ) const TX = await approveStatus.wait() @@ -4611,7 +4315,7 @@ class NetworkService { try { const ve = new ethers.Contract( - allAddresses.Ve_BOBA, //check ve address is present + this.addresses.Ve_BOBA, //check ve address is present veJson.abi, this.provider.getSigner() ) @@ -4638,7 +4342,7 @@ class NetworkService { } try { const ve = new ethers.Contract( - allAddresses.Ve_BOBA, //check ve address is present + this.addresses.Ve_BOBA, //check ve address is present veJson.abi, this.provider.getSigner() ) @@ -4647,7 +4351,7 @@ class NetworkService { .connect(this.provider.getSigner()) .allowance( this.account, - allAddresses.Ve_BOBA + this.addresses.Ve_BOBA ) let depositAmount_BN = BigNumber.from(value_Wei_String) @@ -4659,7 +4363,7 @@ class NetworkService { const approveStatus = await this.BobaContract .connect(this.provider.getSigner()) .approve( - allAddresses.Ve_BOBA, + this.addresses.Ve_BOBA, approveAmount_BN ) await approveStatus.wait() @@ -4696,7 +4400,7 @@ class NetworkService { try { const ve = new ethers.Contract( - allAddresses.Ve_BOBA, //check ve address is present + this.addresses.Ve_BOBA, //check ve address is present veJson.abi, this.provider.getSigner() ) @@ -4724,13 +4428,13 @@ class NetworkService { try { const ve = new ethers.Contract( - allAddresses.Ve_BOBA, //check ve address is present + this.addresses.Ve_BOBA, //check ve address is present veJson.abi, this.provider ) const baseVoter = new ethers.Contract( - allAddresses.BASE_V1_VOTER, + this.addresses.BASE_V1_VOTER, voterJson.abi, this.provider ) @@ -4783,16 +4487,16 @@ class NetworkService { async getAltL1DepositFee() { if (this.account === null) { - console.log('NS: depositErc20ToL1() error - called but account === null') + console.log('NS: getAltL1DepositFee() error - called but account === null') return } try { const pResponse = supportedAltL1Chains.map(async (type) => { - let L0_ETH_ENDPOINT = allAddresses.Layer_Zero_Endpoint; - let ETH_L1_BOBA_ADDRESS = allAddresses.TK_L1BOBA; - let L0_TARGET_CHAIN_ID = l0AllProtocols[type].Layer_Zero_ChainId; - let ALT_L1_BOBA_ADDRESS = allAddresses[`Proxy__EthBridgeTo${type}`]; - let PROXY_ETH_L1_BRIDGE_ADDRESS_TO = allAddresses[`${type}_TK_BOBA`]; + let L0_ETH_ENDPOINT = this.addresses.Layer_Zero_Endpoint; + let ETH_L1_BOBA_ADDRESS = this.addresses.TK_L1BOBA; + let L0_TARGET_CHAIN_ID = this.addresses.layerZeroTargetChainID; + let ALT_L1_BOBA_ADDRESS = this.addresses[`Proxy__EthBridgeTo${type}`]; + let PROXY_ETH_L1_BRIDGE_ADDRESS_TO = this.addresses[`${type}_TK_BOBA`]; // Layer zero doesn't support moonbase // return 0 for those bridges that haven't been implemented yet @@ -4862,11 +4566,11 @@ class NetworkService { return } try { - let L0_ETH_ENDPOINT = allAddresses.Layer_Zero_Endpoint; - let L0_TARGET_CHAIN_ID = l0AllProtocols[type].Layer_Zero_ChainId; - let ETH_L1_BOBA_ADDRESS = allAddresses.TK_L1BOBA; - let PROXY_ETH_L1_BRIDGE_ADDRESS_TO = allAddresses[`Proxy__EthBridgeTo${type}`]; - let ALT_L1_BOBA_ADDRESS = allAddresses[`${type}_TK_BOBA`]; + let L0_ETH_ENDPOINT = this.addresses.Layer_Zero_Endpoint; + let L0_TARGET_CHAIN_ID = this.addresses.layerZeroTargetChainID; + let ETH_L1_BOBA_ADDRESS = this.addresses.TK_L1BOBA; + let PROXY_ETH_L1_BRIDGE_ADDRESS_TO = this.addresses[`Proxy__EthBridgeTo${type}`]; + let ALT_L1_BOBA_ADDRESS = this.addresses[`${type}_TK_BOBA`]; /* proxy eth bridge contract */ const Proxy__EthBridge = new ethers.Contract( PROXY_ETH_L1_BRIDGE_ADDRESS_TO, @@ -4923,6 +4627,8 @@ class NetworkService { console.log(`🆙 Depositing ${value} 👉 ${type} l1 with 💵 FEE ${ethers.utils.formatEther(estimatedFee._nativeFee)}`); + // TODO: FIXME: Update this function to `withdraw` in case of other deployment than ETHERUEM. + // INPUT STEP MULTICHAIN await Proxy__EthBridge.depositERC20( ETH_L1_BOBA_ADDRESS, ALT_L1_BOBA_ADDRESS, @@ -4957,7 +4663,7 @@ class NetworkService { try { const baseVoter = new ethers.Contract( - allAddresses.BASE_V1_VOTER, + this.addresses.BASE_V1_VOTER, voterJson.abi, this.provider ) @@ -4985,7 +4691,7 @@ class NetworkService { try { const baseVoter = new ethers.Contract( - allAddresses.BASE_V1_VOTER, + this.addresses.BASE_V1_VOTER, voterJson.abi, this.provider.getSigner() ) @@ -5009,7 +4715,7 @@ class NetworkService { const pools = [] const baseVoter = new ethers.Contract( - allAddresses.BASE_V1_VOTER, + this.addresses.BASE_V1_VOTER, voterJson.abi, this.provider ) @@ -5079,7 +4785,7 @@ class NetworkService { if (!this.delegateContract) return - const delegateCheck = await this.delegateContract.attach(allAddresses.GovernorBravoDelegator) + const delegateCheck = await this.delegateContract.attach(this.addresses.GovernorBravoDelegator) try { @@ -5163,7 +4869,7 @@ class NetworkService { try { const delegateCheck = await this.delegateContract .connect(this.provider.getSigner()) - .attach(allAddresses.GovernorBravoDelegator) + .attach(this.addresses.GovernorBravoDelegator) return delegateCheck.castVote(id, userVote) } catch(error) { console.log("NS: castProposalVote error:",error) diff --git a/packages/boba/gateway/src/services/transaction.service.js b/packages/boba/gateway/src/services/transaction.service.js new file mode 100644 index 0000000000..486d31019b --- /dev/null +++ b/packages/boba/gateway/src/services/transaction.service.js @@ -0,0 +1,124 @@ +import etherScanInstance from "api/etherScanAxios"; +import omgxWatcherAxiosInstance from "api/omgxWatcherAxios"; +import networkService from "./networkService"; + + +class TransactionService { + + + // fetch L1 transactions from EtherScan + async fetchEtherscanTx() { + let L1Txs = []; + try { + const BEUrl = networkService.networkConfig[ networkService.L1orL2 ].blockExplorer; + const responseL1 = await etherScanInstance(BEUrl).get(`&address=${networkService.account}`) + if (responseL1.status === 200) { + const transactionsL1 = await responseL1.data + console.log(['transactionsL1.result',transactionsL1.result]) + if (transactionsL1.status === '1') { + //thread in ChainID + L1Txs = transactionsL1.result.map(v => ({ + ...v, + blockNumber: parseInt(v.blockNumber), //fix bug - sometimes this is string, sometimes an integer + timeStamp: parseInt(v.timeStamp), //fix bug - sometimes this is string, sometimes an integer + chain: 'L1' + })) + } + } + return L1Txs + } catch (error) { + console.log('TS: Error while fetching txs') + return L1Txs + } + } + // fetch L2 transactions from omgxWatcherAxiosInstance + async fetchL2Tx() { + let L2Txs = []; + try { + const responseL2 = await omgxWatcherAxiosInstance(networkService.networkConfig) + .post('get.l2.transactions', { + address: networkService.account, + fromRange: 0, + toRange: 1000, + }).catch((error) => { console.log('get l2 tx', error) }) + + if (responseL2.status === 201) { + L2Txs = responseL2.data.map(v => ({ ...v, chain: 'L2' })) + } + return L2Txs + } catch (error) { + console.log('TS: fetchL2Tx',error) + return L2Txs + } + } + + // fetch L0 transactions from omgxWatcherAxiosInstance + async fetchL0Tx() { + let L0Txs = []; + try { + const responseL0 = await omgxWatcherAxiosInstance(networkService.networkConfig) + .post('get.layerzero.transactions', { + address: networkService.account, + fromRange: 0, + toRange: 1000, + }) + + if (responseL0.status === 201) { + L0Txs = responseL0.data.map((v) => ({ + ...v, + hash: v.tx_hash, + blockNumber: parseInt(v.block_number), + timeStamp: parseInt(v.timestamp), //fix bug - sometimes this is string, sometimes an integer + chain: 'L0', + altL1: true, + })) + } + return L0Txs + } catch (error) { + console.log('TS: fetchL0Tx',error) + return L0Txs + } + } + + // fetch L1 pending transactions from omgxWatcherAxiosInstance + async fetchL1PendingTx() { + let txL1pending = []; + try { + const responseL1pending = await omgxWatcherAxiosInstance(networkService.networkConfig) + .post('get.l1.transactions', { + address: networkService.account, + fromRange: 0, + toRange: 1000, + }) + + if (responseL1pending.status === 201) { + //add the chain: 'L1pending' field + txL1pending = responseL1pending.data.map(v => ({ ...v, chain: 'L1pending' })) + }; + return txL1pending + } catch (error) { + console.log('TS: fetchL1PendingTx',error) + return txL1pending + } + } + + /** + * @getTransactions + * - loads L1Txs, l2Txs, l0Txs, L1PendingTxs + * + */ + async getTransactions() { + const result = await Promise.all([ + this.fetchL2Tx(), + this.fetchL0Tx(), + this.fetchL1PendingTx() + ]) + return result.reduce((acc, res) => [ ...acc, ...res ], []) + } + +}; + + +const transctionService = new TransactionService(); + +export default transctionService; diff --git a/packages/boba/gateway/src/services/verifier.service.js b/packages/boba/gateway/src/services/verifier.service.js new file mode 100644 index 0000000000..fc9d2e7499 --- /dev/null +++ b/packages/boba/gateway/src/services/verifier.service.js @@ -0,0 +1,31 @@ + + +import verifierWatcherAxiosInstance from "api/verifierWatcherAxios"; +import networkService from "./networkService"; + + +class VerifierService { + + /** + * @getVerifierStatus + */ + + async getVerifierStatus() { + const response = await verifierWatcherAxiosInstance( + networkService.networkConfig + ).post('/', { jsonrpc: "2.0", method: "status", id: 1 }) + + if (response.status === 200) { + const status = response.data.result + return status + } else { + console.log("VS: Bad verifier response") + return false + } + } + +} + +const verifierService = new VerifierService(); + +export default verifierService; diff --git a/packages/boba/gateway/src/util/amountConvert.js b/packages/boba/gateway/src/util/amountConvert.js index 25687fe705..a0498290a0 100644 --- a/packages/boba/gateway/src/util/amountConvert.js +++ b/packages/boba/gateway/src/util/amountConvert.js @@ -16,17 +16,17 @@ limitations under the License. */ // we use BigNumber here for decimal support import BigNumber from 'bignumber.js'; -export function logAmount (amount, power, truncate = 0) { +export function logAmount(amount, power, truncate = 0) { const x = new BigNumber(amount); const exp = new BigNumber(10).pow(power); const calculated = x.div(exp); - if(truncate > 0) - return calculated.toFixed(truncate); + if (truncate > 0) + return calculated.toFixed(truncate); else - return calculated.toFixed(); + return calculated.toFixed(); } /*Takes a value such as 3.92 and converts it into @@ -37,7 +37,7 @@ Duplicates ethers.utils.parseUnits( valueString , decimalsOrUnitName ) => BigNumber */ -export function powAmount (amount, decimals) { +export function powAmount(amount, decimals) { const x = new BigNumber(amount) const exp = new BigNumber(10).pow(decimals) @@ -57,18 +57,26 @@ export function toWei_String(amount, decimals) { } export function amountToUsd(amount, lookupPrice, token) { - if (token.symbol === 'ETH' && !!lookupPrice['ethereum']) { - return amount * lookupPrice['ethereum'].usd + if (token.symbol === 'ETH' && !!lookupPrice[ 'ethereum' ]) { + return amount * lookupPrice[ 'ethereum' ].usd } else if (token.symbol === 'BOBA' && !!lookupPrice[ 'boba-network' ]) { - return amount * lookupPrice['boba-network'].usd + return amount * lookupPrice[ 'boba-network' ].usd } else if (token.symbol === 'OLO' && !!lookupPrice[ 'oolongswap' ]) { - return amount * lookupPrice['oolongswap'].usd + return amount * lookupPrice[ 'oolongswap' ].usd } else if (token.symbol === 'OMG' && !!lookupPrice[ 'omisego' ]) { - return amount * lookupPrice['omisego'].usd + return amount * lookupPrice[ 'omisego' ].usd } else if (token.symbol === 'USDC' && !!lookupPrice[ 'usd-coin' ]) { - return amount * lookupPrice['usd-coin'].usd + return amount * lookupPrice[ 'usd-coin' ].usd + } else if (token.symbol === 'AVAX' && !!lookupPrice[ 'avalanche-2' ]) { + return amount * lookupPrice[ 'avalanche-2' ].usd + } else if (token.symbol === 'FTM' && !!lookupPrice[ 'fantom' ]) { + return amount * lookupPrice[ 'fantom' ].usd + } else if ([ 'BNB', 'tBNB' ].includes(token.symbol) && !!lookupPrice[ 'binancecoin' ]) { + return amount * lookupPrice[ 'binancecoin' ].usd + } else if ([ 'DEV', 'GLMR' ].includes(token.symbol) && !!lookupPrice[ 'moonbeam' ]) { + return amount * lookupPrice[ 'moonbeam' ].usd } else if (!!lookupPrice[ token.symbol.toLowerCase() ]) { - return amount * lookupPrice[token.symbol.toLowerCase()].usd + return amount * lookupPrice[ token.symbol.toLowerCase() ].usd } else { return 0 } diff --git a/packages/boba/gateway/src/util/coinImage.js b/packages/boba/gateway/src/util/coinImage.js index 6de701919c..c4697e7bcf 100644 --- a/packages/boba/gateway/src/util/coinImage.js +++ b/packages/boba/gateway/src/util/coinImage.js @@ -31,6 +31,7 @@ import wagmiv2OLOLogo from 'images/wagmiv2olo.png' import oloLogo from 'images/olo.svg' import CGTLogo from 'images/CGT.svg' import avaxLog from 'images/avax.svg' +import moonbase from 'images/moonbase.png' import glmrLog from 'images/glmr.svg' export const getCoinImage = (symbol) => { @@ -104,6 +105,9 @@ export const getCoinImage = (symbol) => { case "BNB": logo = bnbLogo; break; + case "tBNB": + logo = bnbLogo; + break; case "FTM": logo = ftmLogo; break; @@ -146,6 +150,9 @@ export const getCoinImage = (symbol) => { case "GLMR": logo = glmrLog; break; + case "DEV": + logo = moonbase; + break; default: logo = ethLogo; break; diff --git a/packages/boba/gateway/src/util/network/config/avax.js b/packages/boba/gateway/src/util/network/config/avax.js index c9fab83342..b2ead066b3 100644 --- a/packages/boba/gateway/src/util/network/config/avax.js +++ b/packages/boba/gateway/src/util/network/config/avax.js @@ -3,6 +3,7 @@ import { ETHERSCAN_API_KEY } from "util/constant"; export const avaxConfig = { Testnet: { OMGX_WATCHER_URL: `https://api-watcher.testnet.avax.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.testnet.avax.boba.network/`, MM_Label: `Boba Avalanche Testnet`, addressManager: `0xcE78de95b85212BC348452e91e0e74c17cf37c79`, L1: { @@ -30,6 +31,7 @@ export const avaxConfig = { }, Mainnet: { OMGX_WATCHER_URL: `https://api-watcher.avax.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.avax.boba.network/`, MM_Label: `Boba Avalanche Mainnet`, addressManager: `0x00220f8ce1c4be8436574e575fE38558d85e2E6b`, L1: { diff --git a/packages/boba/gateway/src/util/network/config/bnb.js b/packages/boba/gateway/src/util/network/config/bnb.js index 3c267937ca..fa76263131 100644 --- a/packages/boba/gateway/src/util/network/config/bnb.js +++ b/packages/boba/gateway/src/util/network/config/bnb.js @@ -3,6 +3,7 @@ import { ETHERSCAN_API_KEY } from "util/constant"; export const bnbConfig = { Testnet: { OMGX_WATCHER_URL: `https://api-watcher.testnet.bnb.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.testnet.bnb.boba.network/`, MM_Label: `bobaBnbTestnet`, addressManager: `0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa`, L1: { @@ -13,8 +14,8 @@ export const bnbConfig = { blockExplorer: `https://api-testnet.bscscan.com/api?module=account&action=txlist&startblock=0&endblock=99999999&sort=asc&apikey=${ETHERSCAN_API_KEY}`, transaction: `https://testnet.bscscan.com/tx/`, blockExplorerUrl: `https://testnet.bscscan.com/`, - symbol: "BNB", - tokenName: "BNB", + symbol: "tBNB", + tokenName: "tBNB", }, L2: { name: "Boba BNB Testnet", @@ -30,6 +31,7 @@ export const bnbConfig = { }, Mainnet: { OMGX_WATCHER_URL: `https://api-watcher.bnb.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.bnb.boba.network/`, MM_Label: `bobaBnb`, addressManager: `0xeb989B25597259cfa51Bd396cE1d4B085EC4c753`, L1: { diff --git a/packages/boba/gateway/src/util/network/config/ethereum.js b/packages/boba/gateway/src/util/network/config/ethereum.js index b27efc761d..4a1de7a49a 100644 --- a/packages/boba/gateway/src/util/network/config/ethereum.js +++ b/packages/boba/gateway/src/util/network/config/ethereum.js @@ -4,6 +4,7 @@ export const ethereumConfig = { Testnet: { OMGX_WATCHER_URL: `https://api-watcher.goerli.boba.network/`, VERIFIER_WATCHER_URL: `https://api-verifier.goerli.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.goerli.boba.network/`, MM_Label: `Goerli`, addressManager: `0x6FF9c8FF8F0B6a0763a3030540c21aFC721A9148`, L1: { @@ -48,11 +49,13 @@ export const ethereumConfig = { data: '0xa44c80e3000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000020000000000000000000000006a6676813d3d4317442cf84667425c13553f4a760000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d7ea4c68000' }, - gasEstimateAccount: `0xdb5a187FED81c735ddB1F6E47F28f2A5F74639b2` + gasEstimateAccount: `0xdb5a187FED81c735ddB1F6E47F28f2A5F74639b2`, + twitterFaucetPromotionText: "https://twitter.com/intent/tweet?text=I%27m%20developing%20on%20Boba%20Network%20" }, Mainnet: { OMGX_WATCHER_URL: `https://api-watcher.mainnet.boba.network/`, VERIFIER_WATCHER_URL: `https://api-verifier.mainnet.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.mainnet.boba.network/`, MM_Label: `Mainnet`, addressManager: `0x8376ac6C3f73a25Dd994E0b0669ca7ee0C02F089`, L1: { @@ -89,6 +92,7 @@ export const ethereumConfig = { data: '0xa44c80e30000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000042bbfa2e77757c645eeaad1655e0911a7553efbc0000000000000000000000000000000000000000000000000de0b6b3a7640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d7ea4c68000' }, - gasEstimateAccount: `0xdb5a187FED81c735ddB1F6E47F28f2A5F74639b2` + gasEstimateAccount: `0xdb5a187FED81c735ddB1F6E47F28f2A5F74639b2`, + twitterFaucetPromotionText: "https://twitter.com/intent/tweet?text=I%27m%20developing%20on%20Boba%20Network%20" } } diff --git a/packages/boba/gateway/src/util/network/config/fantom.js b/packages/boba/gateway/src/util/network/config/fantom.js index 4cd6cab295..9aeb044d8b 100644 --- a/packages/boba/gateway/src/util/network/config/fantom.js +++ b/packages/boba/gateway/src/util/network/config/fantom.js @@ -3,6 +3,7 @@ import { ETHERSCAN_API_KEY } from "util/constant"; export const fantomConfig = { Testnet: { OMGX_WATCHER_URL: `https://api-watcher.testnet.bobaopera.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.testnet.bobaopera.boba.network/`, MM_Label: `bobaOperaTestnet`, addressManager: `0x12ad9f501149D3FDd703cC10c567F416B7F0af8b`, L1: { @@ -30,6 +31,7 @@ export const fantomConfig = { }, Mainnet: { OMGX_WATCHER_URL: `https://api-watcher.bobaopera.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.bobaopera.boba.network/`, MM_Label: `Bobaopera`, addressManager: `0x4e7325bcf09e091Bb8119258B885D4ef687B7386`, L1: { diff --git a/packages/boba/gateway/src/util/network/config/moonbeam.js b/packages/boba/gateway/src/util/network/config/moonbeam.js index 90fe0a8689..3dde6295d2 100644 --- a/packages/boba/gateway/src/util/network/config/moonbeam.js +++ b/packages/boba/gateway/src/util/network/config/moonbeam.js @@ -3,6 +3,7 @@ import { ETHERSCAN_API_KEY } from "util/constant"; export const moonbeamConfig = { Testnet: { OMGX_WATCHER_URL: `https://api-watcher.bobabase.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.bobabase.boba.network/`, MM_Label: `BobaBase`, addressManager: `0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B`, L1: { @@ -13,8 +14,8 @@ export const moonbeamConfig = { blockExplorer: `https://api-moonbase.moonscan.io/api?module=account&action=txlist&startblock=0&endblock=99999999&sort=asc&apikey=${ETHERSCAN_API_KEY}`, transaction: `https://moonbase.moonscan.io/tx/`, blockExplorerUrl: `https://moonbase.moonscan.io`, - symbol: 'GLMR', - tokenName: 'GLMR', + symbol: 'DEV', + tokenName: 'DEV', }, L2: { name: "BobaBase", @@ -30,6 +31,7 @@ export const moonbeamConfig = { }, Mainnet: { OMGX_WATCHER_URL: `https://api-watcher.bobabeam.boba.network/`, + META_TRANSACTION: `https://api-meta-transaction.bobabeam.boba.network/`, MM_Label: `bobaBeam`, addressManager: `0x564c10A60af35a07f0EA8Be3106a4D81014b21a0`, L1: { diff --git a/packages/boba/gateway/src/util/network/network.util.js b/packages/boba/gateway/src/util/network/network.util.js index 0264b82360..dbf9f7366c 100644 --- a/packages/boba/gateway/src/util/network/network.util.js +++ b/packages/boba/gateway/src/util/network/network.util.js @@ -173,8 +173,8 @@ export const NetworkList = { label: 'BNB <> Boba', key: 'bnb', name: { - l1: 'BNB', - l2: 'Boba' + l1: 'Binance Smart Chain Mainnet', + l2: 'Boba BNB Mainnet' } }, { @@ -183,8 +183,8 @@ export const NetworkList = { label: 'Avalanche <> Boba', key: 'avax', name: { - l1: 'Avalanche', - l2: 'Boba' + l1: 'Avalanche Mainnet C-Chain', + l2: 'Boba Avalance Mainnet' } }, { @@ -193,8 +193,8 @@ export const NetworkList = { label: 'Fantom <> Boba', key: 'fantom', name: { - l1: 'Fantom', - l2: 'Boba' + l1: 'Fantom Mainnet', + l2: 'Bobaopera Mainnet' } }, { @@ -204,7 +204,7 @@ export const NetworkList = { key: 'moonbeam', name: { l1: 'Moonbeam', - l2: 'Boba' + l2: 'Bobabeam' } } ], @@ -225,8 +225,8 @@ export const NetworkList = { label: 'BNB (Testnet) <> Boba', key: 'bnb', name: { - l1: 'BNB (Testnet)', - l2: 'Boba', + l1: 'BNB Testnet', + l2: 'Boba BNB Testnet', } }, { @@ -235,8 +235,8 @@ export const NetworkList = { label: 'Fuji (Testnet) <> Boba', key: 'avax', name: { - l1: 'Fuji (Testnet)', - l2: 'Boba', + l1: 'Fuji Testnet', + l2: 'Boba Fuji Testnet', } }, { @@ -245,8 +245,8 @@ export const NetworkList = { label: 'Opera (Testnet) <> Boba', key: 'fantom', name: { - l1: 'Opera (Testnet)', - l2: 'Boba', + l1: 'Fantom Testnet', + l2: 'Bobaopera Testnet', } }, { @@ -256,7 +256,7 @@ export const NetworkList = { key: 'moonbeam', name: { l1: 'Moonbase', - l2: 'Boba', + l2: 'Bobabase', } }, ] @@ -277,7 +277,6 @@ export const getNetworkDetail = ({ return networkConfig[network][networkType] } - export const getBlockExplorerUrl = ({ network, networkType, diff --git a/packages/boba/register/addresses/addressBobaAvax_0x00220f8ce1c4be8436574e575fE38558d85e2E6b.json b/packages/boba/register/addresses/addressBobaAvax_0x00220f8ce1c4be8436574e575fE38558d85e2E6b.json new file mode 100644 index 0000000000..fb95653746 --- /dev/null +++ b/packages/boba/register/addresses/addressBobaAvax_0x00220f8ce1c4be8436574e575fE38558d85e2E6b.json @@ -0,0 +1,59 @@ +{ + "BondManager": "0x26c319B7B2cF823365414d082698C8ac90cbBA63", + "CanonicalTransactionChain": "0x1A19A4ce2b3B0A974Df717b6F88c881a69F315e3", + "ChainStorageContainer-CTC-batches": "0x82e4fCEBa2d0ce0B3f394b6Ab13e4b1B2D485b89", + "ChainStorageContainer-CTC-queue": "0x32fa4eC0aeadf5DEC8461b3834e5572Ad782f075", + "ChainStorageContainer-SCC-batches": "0xc4243ecE585B843c7cf92E65617A4211FA580dDb", + "L1MultiMessageRelayer": "0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8", + "AddressManager": "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", + "OVM_L1CrossDomainMessenger": "0x19FF7f546b66f69e859E07B61444c3d3EF35ABC5", + "Proxy__L1CrossDomainMessenger": "0x0fc742332ae6D447d6619D93985Aa288B81CBb0C", + "Proxy__L1StandardBridge": "0xf188F1e92B2c78956D2859b84684BFD17103e22c", + "StateCommitmentChain": "0x1ef85D873Cf451C8B9a45DbE40b478E991F51210", + "TK_L1BOBA": "0x3cD790449CF7D187a143d4Bd7F4654d4f2403e02", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L2WBOBA9": "0x26c319B7B2cF823365414d082698C8ac90cbBA63", + "TK_L1AVAX": "0x0000000000000000000000000000000000000000", + "TK_L2AVAX": "0x4200000000000000000000000000000000000023", + "TK_L1USDT.e": "0xc7198437980c041c805A1EDcbA50c1Ce5db95118", + "TK_L2USDT.e": "0x4ED96c1dc969d7E2310D9582A68c39556C005912", + "TK_L1USDt": "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7", + "TK_L2USDt": "0xfaA13D82756f1e0e4dec9416b83121db3Fc35199", + "TK_L1USDC": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + "TK_L2USDC": "0x12bb1A120dcF8Cb7152eDAC9f04d176DD7f41F7e", + "TK_L1USDC.e": "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664", + "TK_L2USDC.e": "0x126969743a6d300bab08F303f104f0f7DBAfbe20", + "TK_L1BUSD.e": "0x19860CCB0A68fd4213aB9D8266F7bBf05A8dDe98", + "TK_L2BUSD.e": "0xb8B0034CFD89925944C07Ac6CcB2834d1774cfb6", + "TK_L1BUSD": "0x9C9e5fD8bbc25984B178FdCE6117Defa39d2db39", + "TK_L2BUSD": "0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8", + "TK_L1DAI.e": "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70", + "TK_L2DAI.e": "0x69B7d24f0E03Ff21949081C95dA7288fEa5C844D", + "L1CrossDomainMessengerFast": "0x8A3c2536FDae22D168e3ddaE55BF152660D98026", + "Proxy__L1CrossDomainMessengerFast": "0x5b6714b7926e6D7e34154C9AC945B489978fA7E7", + "L2LiquidityPool": "0x40425E72034eCC797cE77628672c5a7081B54470", + "L1LiquidityPool": "0xCa542506782592028796c456380a58E3D5589422", + "Proxy__L1LiquidityPool": "0x1E6D9F4dDD7C52EF8964e81E5a9a137Ee2489b21", + "Proxy__L2LiquidityPool": "0x0B1b1ce732564974233159213D3931C5400D4B3E", + "L2TokenPool": "0xbFC421c109c4A9851bCE258Ae57D2056c2E7F757", + "L1Message": "0xC12AF64d6Ffe4EB5e3421C91A569E6DA5Ee38f8e", + "L2Message": "0x3B57D8d49e73DA0D589f639A2334C1464C75ed8F", + "AtomicSwap": "0xe6663Fa30eaF07f38C60f33C917E70225ee0b846", + "L2ERC721": "0x00220f8ce1c4be8436574e575fE38558d85e2E6b", + "L2ERC721Reg": "0x938dd85B9c695D9a3A147F65f8991fcf5019BA75", + "L1NFTBridge": "0x9898E7b905dD66422cef07504D8CfFd77c453c48", + "L2NFTBridge": "0x70380b943e5f1fBe5dC8C2Ca3EB9E955B3580938", + "Proxy__L1NFTBridge": "0x328eb74673Eaa1D2d90A48E8137b015F1B6Ed35d", + "Proxy__L2NFTBridge": "0x1A0245f23056132fEcC7098bB011C5C303aE0625", + "L1MultiMessageRelayerFast": "0xf9821061774b9693359F582b007A5F1C39d75Ae3", + "DiscretionaryExitFee": "0x4ef8b611e05121d511d930Bf7EBaeE37f87bfC03", + "FeedRegistry": "0xd5984bD8568447e44d922793E3f210f8F960F065", + "BOBAUSD_Aggregator": "0x82e4fCEBa2d0ce0B3f394b6Ab13e4b1B2D485b89", + "BobaBillingContract": "0x8A4cf5504405A96be09c4fAc2F5f96c6BAe6951c", + "Proxy__BobaBillingContract": "0xc4243ecE585B843c7cf92E65617A4211FA580dDb", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressBobaBeam_0x564c10A60af35a07f0EA8Be3106a4D81014b21a0.json b/packages/boba/register/addresses/addressBobaBeam_0x564c10A60af35a07f0EA8Be3106a4D81014b21a0.json new file mode 100644 index 0000000000..dc7cf88f92 --- /dev/null +++ b/packages/boba/register/addresses/addressBobaBeam_0x564c10A60af35a07f0EA8Be3106a4D81014b21a0.json @@ -0,0 +1,47 @@ +{ + "BondManager": "0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5", + "CanonicalTransactionChain": "0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95", + "ChainStorageContainer-CTC-batches": "0x808fD25dd00D5F8915Ad69326bFD75A6E014f9b3", + "ChainStorageContainer-CTC-queue": "0x1D023D0B9E8aa136241eB8e8827876f51ef49851", + "ChainStorageContainer-SCC-batches": "0x5Ee60822c68CF0966D8Dc53255627216b4ADC30f", + "L1MultiMessageRelayer": "0x3664bC9BA25D0d3911c39d8ae1734b0B5A3495C1", + "AddressManager": "0x564c10A60af35a07f0EA8Be3106a4D81014b21a0", + "OVM_L1CrossDomainMessenger": "0x9182A0AA011f97633d44383F446A5951bDD3f5bf", + "Proxy__L1CrossDomainMessenger": "0x4765f8b50Bbe049045bBA1270dc7A8CDF17165cF", + "Proxy__L1StandardBridge": "0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985", + "StateCommitmentChain": "0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8", + "OVM_Sequencer": "0x9a57cd0a2241f3e5074bec89a86db59098d73e6e", + "Deployer": "0xC31ca2482c936d92dd465391B45940e802A86eDc", + "TK_L1BOBA": "0x18D17A9fD652D7d6a59903E23792ab97F832Ed6C", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L2WBOBA9": "0x74686A29ac7C5703bDC4f9C2DA176DcE55d4DbAC", + "TK_L1GLMR": "0x0000000000000000000000000000000000000000", + "TK_L2GLMR": "0x4200000000000000000000000000000000000023", + "L1CrossDomainMessengerFast": "0xFd4892a500303f5Bfe7C78D49a6aB3dddfCccb92", + "Proxy__L1CrossDomainMessengerFast": "0x17d02C3e6cB69225d83d0bADEb0fC09aE735CA3b", + "L2LiquidityPool": "0x079D6565eEE0129fAe337B52C217951f70c58CFa", + "L1LiquidityPool": "0x1c98d96cfcDc4599D5FbB61Aa30301d94fcA8002", + "Proxy__L1LiquidityPool": "0x3fBc139f80a474c9B19A734e9ABb285b6550dF58", + "Proxy__L2LiquidityPool": "0xD7d057F1b1caBB637BFc81F9bf1Fb74f54941E65", + "L2TokenPool": "0x5Ee60822c68CF0966D8Dc53255627216b4ADC30f", + "L1Message": "0x3bdF3E4543eac155dF6d7F0e5cf55a90E468a33b", + "L2Message": "0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95", + "AtomicSwap": "0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8", + "L2ERC721": "0xD5Ad3B843c4dE06762972a6c1d15BD0Ac96E0231", + "L2ERC721Reg": "0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5", + "L1NFTBridge": "0x65802425d28168e8148B5D13c35e7490Ac52524e", + "L2NFTBridge": "0xFbcc3F48a6Ca8D169f318360E5d9fe00e553F543", + "Proxy__L1NFTBridge": "0x7f61EB6FFe966E8c14AFb8754Bf0825eb6f54bd7", + "Proxy__L2NFTBridge": "0x9182A0AA011f97633d44383F446A5951bDD3f5bf", + "L1MultiMessageRelayerFast": "0xE2EE964E39720f78Cd75BC146Ed078D301981759", + "DiscretionaryExitFee": "0xC828226424E9D9686bddC0fBA91c4e234b3e6F55", + "FeedRegistry": "0xF60bc956315f4E1EA63B925bA4d857CDd95f3532", + "BOBAUSD_Aggregator": "0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985", + "BobaBillingContract": "0xf237D39597B41c9E426e1F23a6aC148DC2a9176e", + "Proxy__BobaBillingContract": "0xb210a4BB024196dC8c5f6f407220cA83e65e45FE", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressBobaBnbTestnet_0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa.json b/packages/boba/register/addresses/addressBobaBnbTestnet_0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa.json new file mode 100644 index 0000000000..e8f4cdc384 --- /dev/null +++ b/packages/boba/register/addresses/addressBobaBnbTestnet_0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa.json @@ -0,0 +1,39 @@ +{ + "AddressManager": "0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa", + "OVM_L1CrossDomainMessenger": "0x6fA80303E479Ea2d705F4f241Ef162aA2F793e71", + "Proxy__L1CrossDomainMessenger": "0x53aD38aE4a63Fe33a86E011F7AF4d3fDe3daD145", + "Proxy__L1StandardBridge": "0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a", + "TK_L1BOBA": "0x875cD11fDf085e0E11B0EE6b814b6d0b38fA554C", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L1tBNB": "0x0000000000000000000000000000000000000000", + "TK_L2tBNB": "0x4200000000000000000000000000000000000023", + "L1CrossDomainMessengerFast": "0xf5a68fC4734a657652717aCC024fAb390274C0E6", + "Proxy__L1CrossDomainMessengerFast": "0xbbD6a271abcC44f6dE284E6051Da76b4fB57458C", + "L2LiquidityPool": "0x8e449c8267cbe89e0615F6ea8FBf885B5755F90D", + "L1LiquidityPool": "0x026fCac45B06395f626c5e6698444B0B51bC7B43", + "Proxy__L1LiquidityPool": "0xed142c7BdA2A3d5b08Eae78C96b37FFe60Fecf80", + "Proxy__L2LiquidityPool": "0xa1786aDDe89d62014CC50bE01d53c16C7A80D460", + "L2TokenPool": "0x14718bB320d6FC2681EF86864732211a9A0928dD", + "L1Message": "0xb743f3A682C846ccC4584bd8bCb434320a769216", + "L2Message": "0x65f291CDfB05bd1D639DF6268F98594fdacDeCa6", + "AtomicSwap": "0x37FB8bB9EA100CA9a0DE822c9923643ef48Cb8EE", + "L2ERC721": "0x81cF4cBEDF5602401178862f0225b93D2deB2E28", + "L2ERC721Reg": "0x6737867ddd04272a79E7207a008f213e336b00e1", + "L1NFTBridge": "0x347cCB98f420E0E7fbeEd4808732b21C1C86db59", + "L2NFTBridge": "0x3de30b620bA8A44423F70c42f9ed973541d11B12", + "Proxy__L1NFTBridge": "0x4c3f621d01c22658F711c70a12662ECDfCA5916A", + "Proxy__L2NFTBridge": "0x6fA80303E479Ea2d705F4f241Ef162aA2F793e71", + "L1MultiMessageRelayerFast": "0x0F01394F5fc19bA1B9F669bA79b76c9EaAe37987", + "DiscretionaryExitFee": "0x587fA2e1d797Ff79Bf86a24E156A559b6551b2B3", + "FeedRegistry": "0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a", + "BOBAUSD_Aggregator": "0xeb92a5d7d92F5Af18DAdf6c6D7f02be55F3ff355", + "BobaBillingContract": "0x72a3d638C4d022abED8A941aE856da28dB2faB7f", + "Proxy__BobaBillingContract": "0xe43Ff19D561EA6DB84Dd2Ec3754027fAFDa79499", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "AuthenticatedFaucet": "0x4Bee9fE15Ff3645A85792607ce4Eee14ab9E9E02", + "WBOBA9": "0xb743f3A682C846ccC4584bd8bCb434320a769216", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressBobaBnb_0xeb989B25597259cfa51Bd396cE1d4B085EC4c753.json b/packages/boba/register/addresses/addressBobaBnb_0xeb989B25597259cfa51Bd396cE1d4B085EC4c753.json new file mode 100644 index 0000000000..146d6ef306 --- /dev/null +++ b/packages/boba/register/addresses/addressBobaBnb_0xeb989B25597259cfa51Bd396cE1d4B085EC4c753.json @@ -0,0 +1,53 @@ +{ + "BondManager": "0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd", + "CanonicalTransactionChain": "0xA0E38a8FE293E9e95c6A4a882F396F1c80e9e2e4", + "ChainStorageContainer-CTC-batches": "0xA774C3f4572C5BA93F75D802ea7Dc6F93228e5cc", + "ChainStorageContainer-CTC-queue": "0xA3f58cF4D4843F600A7e95CE1B23322C6A1A9695", + "ChainStorageContainer-SCC-batches": "0x181D33986CFb5229e42ac3b3a09cad39F1011D17", + "L1MultiMessageRelayer": "0x1E633Dcd0d3D349126983D58988051F7c62c543D", + "AddressManager": "0xeb989B25597259cfa51Bd396cE1d4B085EC4c753", + "OVM_L1CrossDomainMessenger": "0x4085c76ca31c8445A57ABc41393d7D57176A505b", + "Proxy__L1CrossDomainMessenger": "0x31338a7D5d123E18a9a71447136B54B6D28241ae", + "Proxy__L1StandardBridge": "0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC", + "StateCommitmentChain": "0xeF85fA550e6EC5486121313C895EDe1005e2397f", + "TK_L1BOBA": "0xE0DB679377A0F5Ae2BaE485DE475c9e1d8A4607D", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L2WBOBA9": "0xC58aaD327D6D58D979882601ba8DDa0685B505eA", + "TK_L1BNB": "0x0000000000000000000000000000000000000000", + "TK_L2BNB": "0x4200000000000000000000000000000000000023", + "TK_L1USDC": "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d", + "TK_L2USDC": "0x9F98f9F312D23d078061962837042b8918e6aff2", + "TK_L1BUSD": "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56", + "TK_L2BUSD": "0x4a2c2838c3907D024916c3f4Fe07832745Ae4bec", + "TK_L1USDT": "0x55d398326f99059fF775485246999027B3197955", + "TK_L2USDT": "0x1E633Dcd0d3D349126983D58988051F7c62c543D", + "TK_L1SUSHI": "0x986cdF0fd180b40c4D6aEAA01Ab740B996D8b782", + "TK_L2SUSHI": "0xa84D7c48602C898EC84C4cCA78651107B3625943", + "L1CrossDomainMessengerFast": "0x0163D3C18781521cf8e72790d15CCF118A540e24", + "Proxy__L1CrossDomainMessengerFast": "0xBe349cABeA97bB933f8C2594634Deb858167f83c", + "L2LiquidityPool": "0xE0DB679377A0F5Ae2BaE485DE475c9e1d8A4607D", + "L1LiquidityPool": "0x43A24672fd6616DA4AA935A17B5aF282375d0F55", + "Proxy__L1LiquidityPool": "0x88b5d70be4fc644c55b164AD09A3DFD44E31eC59", + "Proxy__L2LiquidityPool": "0x5E36d0ADBDEa248c207312d493a08a6d182D0805", + "L2TokenPool": "0xC1778d29c09f220e4fC6d6e8cEDF040e35b09a88", + "L1Message": "0x58EF355c3A6B5036bF6336b5a5afD5B56d48B9e4", + "L2Message": "0xe8D5B98f999e55635f99310E9eBF3Bc0DBb07194", + "AtomicSwap": "0x1148585B2F2a2A3Ce554Dd9a9a25a5D4b5dFB108", + "L2ERC721": "0xA9B4d027CC4985AE76AB09c3de9BCD9Ec529d3cA", + "L2ERC721Reg": "0x05feB25a1aD2bA11949A0788B56c0eD9fFc09944", + "L1NFTBridge": "0xdf10be20f5a457Ad8eAa0c38E3006F275dFC5cE4", + "L2NFTBridge": "0x17bc3bA65463CAf7578df747E2610e90fe9BCe3C", + "Proxy__L1NFTBridge": "0x76bD545C03391d4e6E3d5cC2B5617c94C6038c86", + "Proxy__L2NFTBridge": "0xA774C3f4572C5BA93F75D802ea7Dc6F93228e5cc", + "L1MultiMessageRelayerFast": "0x2dB5717B37Af9A1D9a28829Ea977B4aE4aEE2AED", + "DiscretionaryExitFee": "0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd", + "FeedRegistry": "0xC21e15185659D2fB166562bf57f241d50259AB24", + "BOBAUSD_Aggregator": "0x7D5A06bF6b7c793352A380720620d03813680ec1", + "BobaBillingContract": "0x4085c76ca31c8445A57ABc41393d7D57176A505b", + "Proxy__BobaBillingContract": "0xf626b0d7C028E6b89c15ca417f21080E376de65b", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressBobaFuji_0xcE78de95b85212BC348452e91e0e74c17cf37c79.json b/packages/boba/register/addresses/addressBobaFuji_0xcE78de95b85212BC348452e91e0e74c17cf37c79.json new file mode 100644 index 0000000000..a43403c637 --- /dev/null +++ b/packages/boba/register/addresses/addressBobaFuji_0xcE78de95b85212BC348452e91e0e74c17cf37c79.json @@ -0,0 +1,38 @@ +{ + "AddressManager": "0xcE78de95b85212BC348452e91e0e74c17cf37c79", + "Proxy__L1CrossDomainMessenger": "0x68c19B7FbAe4F8034cf6316b2045ba6aB6978F6b", + "Proxy__L1StandardBridge": "0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56", + "TK_L1BOBA": "0xEaE78E78cC22690719361F65a50734A15aaE698C", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L1AVAX": "0x0000000000000000000000000000000000000000", + "TK_L2AVAX": "0x4200000000000000000000000000000000000023", + "L1CrossDomainMessengerFast": "0x3C6B8493047b44754EF57129d43d151040871bb7", + "Proxy__L1CrossDomainMessengerFast": "0xBc5249095c890F58C0b75795bd21667eFd123F5F", + "L2LiquidityPool": "0xC5a27088fF840Abc3057C0B5f8B98511033c4867", + "L1LiquidityPool": "0x7BD3DC4aB8087840aB702eb6689d57a60e2143e4", + "Proxy__L1LiquidityPool": "0x30caB2fCA6260FB91B172D4AFB215514069868ea", + "Proxy__L2LiquidityPool": "0x9198b3f5C6acCf05dF8847766A68d992355c18c4", + "L2TokenPool": "0x5edFE3970732EA7878b6e17c1b7Cf27EcF108bC4", + "L1Message": "0x99411339aB22441D6D5f49Ae63deE8c47db85D49", + "L2Message": "0x089489B38e15B21A786791D4409f6E9e2afd7851", + "AtomicSwap": "0x5565f730cab69977E89F21de35f355F2F9fEB1C5", + "L2ERC721": "0xBdBF3b9803DDc910a77bF4852a283Edc055457e5", + "L2ERC721Reg": "0xb1f74c5A3c0cE11d1EB20c03393cc0234254C315", + "L1NFTBridge": "0x8C3E97fdF162615e9e928b4a69b0CB8A738A1910", + "L2NFTBridge": "0xAe34F89F7549903EF99A1cAc77649EA310cC5AAA", + "Proxy__L1NFTBridge": "0xA7A1415eC63Bf410b27AcDAF42fC3c63756E2bFc", + "Proxy__L2NFTBridge": "0x2e59D69cA439b3ab0c1AD8b2762377Afb5C71C7B", + "L1MultiMessageRelayerFast": "0x5e6B412b4fA8373a17aD85B269fA5c354ea57e63", + "DiscretionaryExitFee": "0xED6760E89fB35731ae82d7D149d8c94fdDb376fE", + "FeedRegistry": "0x54CB1E4C1d5F545Ebe9C281927Ee4c0B514b9C33", + "BOBAUSD_Aggregator": "0xF4f9B28F450F3Ecc516D4c91CCFAe52C72c17D33", + "BobaBillingContract": "0xCD50AE5e592ea38bA036aE2a2D6A58f8CAd050BB", + "Proxy__BobaBillingContract": "0xB7E29AB7FB9b6406BAb33Cf6f868fE25B9Ad0160", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "AuthenticatedFaucet": "0x5f6D019832FA4522DB7b94A4fe0DDBb73212FAcE", + "WBOBA9": "0xA7cad1B188Ac7E4d05644D1cf1cBcEB4aD372a9D", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressBobaOpera_0x4e7325bcf09e091Bb8119258B885D4ef687B7386.json b/packages/boba/register/addresses/addressBobaOpera_0x4e7325bcf09e091Bb8119258B885D4ef687B7386.json new file mode 100644 index 0000000000..c560b45fd3 --- /dev/null +++ b/packages/boba/register/addresses/addressBobaOpera_0x4e7325bcf09e091Bb8119258B885D4ef687B7386.json @@ -0,0 +1,49 @@ +{ + "BondManager": "0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1", + "CanonicalTransactionChain": "0x6001C473E020D3562Ea436B61aE4d2e91e7078cE", + "ChainStorageContainer-CTC-batches": "0x282267F1CD5562F91036a1f9FA52961A48385139", + "ChainStorageContainer-CTC-queue": "0x36666Bc3d9FE6fDCfC5Aa1f6e907f36EbF8a8176", + "ChainStorageContainer-SCC-batches": "0x2E3375B06811B3Baed04CC86C691B918155fE176", + "L1MultiMessageRelayer": "0xD8DcA5fC53a83Cf06ec744a7226C23951a353A0f", + "AddressManager": "0x4e7325bcf09e091Bb8119258B885D4ef687B7386", + "OVM_L1CrossDomainMessenger": "0xDEE010E1EedBE26C8AB3AEC8a16Cb974B31068FF", + "Proxy__L1CrossDomainMessenger": "0x64Fca36c52628e40de8684C4C3B5EdB22Fd2eFd9", + "Proxy__L1StandardBridge": "0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8", + "StateCommitmentChain": "0xF764C4f8D2982432239A110Cf6B08e95631cE564", + "TK_L1BOBA": "0x4389b230D15119c347B9E8BEA6d930A21aaDF6BA", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L2WBOBA": "0x5ad2635e9aBce5F95AdcF164Ac81bcAeBdC8E345", + "TK_L1FTM": "0x0000000000000000000000000000000000000000", + "TK_L2FTM": "0x4200000000000000000000000000000000000023", + "TK_L1USDC": "0x04068DA6C83AFCFA0e13ba15A6696662335D5B75", + "TK_L2USDC": "0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8", + "TK_L1DAI": "0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E", + "TK_L2DAI": "0x31223A147fF76C3fC43d67F8BC36F11E034c484e", + "L1CrossDomainMessengerFast": "0xf74C652a160BA2B2e82D8702A743c8Db83F8DA7d", + "Proxy__L1CrossDomainMessengerFast": "0xC0597ED18446254E4dd0CA5D80eb07D3f2E462cF", + "L2LiquidityPool": "0x4389b230D15119c347B9E8BEA6d930A21aaDF6BA", + "L1LiquidityPool": "0x6eA17632630e43dAF94AA776Eba606Ec5d61Ab6A", + "Proxy__L1LiquidityPool": "0x0bF5402a57970C7BD9883248534B644Ab545e6d4", + "Proxy__L2LiquidityPool": "0xD502Ca71dE5e072918884f638408291c066EF1F6", + "L2TokenPool": "0xEb26f95D155f133Ca3B1fc36C7cFcE7C5239e139", + "L1Message": "0xFa965d70BFF2BCb4B76Ac3A485a28C0D5a06fA9e", + "L2Message": "0xa8082C1D4e8615A962494A7Dd8ffe7be089458eE", + "AtomicSwap": "0xA8b85842b7556F556c0Cf0Af71b9241EA8baDc6F", + "L2ERC721": "0xa2444dC15D92D4cf8B51DAB300C1b8534602Db29", + "L2ERC721Reg": "0x18028b28EE7A8000dCB9e55c6bfaEBC5837AdB79", + "L1NFTBridge": "0x9BE15EC6BF78536a970F444A41361367B5de1098", + "L2NFTBridge": "0x282267F1CD5562F91036a1f9FA52961A48385139", + "Proxy__L1NFTBridge": "0x58bfe4D8108f0657585c9e4C106B3FB8b469eeB9", + "Proxy__L2NFTBridge": "0xd0223931513E72C4cbBE97662C07825C7E71DD9C", + "L1MultiMessageRelayerFast": "0xE7beDcedF3E3054aF891DddeF61775A23a16CB90", + "DiscretionaryExitFee": "0xBD4e12b0634b154932D75503E2Ff404953CbD1Bf", + "FeedRegistry": "0x6001C473E020D3562Ea436B61aE4d2e91e7078cE", + "BOBAUSD_Aggregator": "0x677360aba457B747056f3E00095644D9ADB5753D", + "BobaBillingContract": "0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1", + "Proxy__BobaBillingContract": "0xD5b0E66566FEe76d6c550e7190385703Bcf11354", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressesBobaBase_0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B.json b/packages/boba/register/addresses/addressesBobaBase_0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B.json new file mode 100644 index 0000000000..196d97db68 --- /dev/null +++ b/packages/boba/register/addresses/addressesBobaBase_0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B.json @@ -0,0 +1,40 @@ +{ + "AddressManager": "0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B", + "Proxy__L1StandardBridge": "0xEcca5FEd8154420403549f5d8F123fcE69fae806", + "Proxy__L1CrossDomainMessenger": "0x76DB375075F1d5Dcd1D70Fc07F69a5c7b40ab877", + "TK_L1BOBA": "0x1365fd7BcEE84686DBCA71e1571C0d9ad9E64945", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L1DEV": "0x0000000000000000000000000000000000000000", + "TK_L2DEV": "0x4200000000000000000000000000000000000023", + "TK_L1GLMR": "0x0000000000000000000000000000000000000000", + "TK_L2GLMR": "0x4200000000000000000000000000000000000023", + "L1CrossDomainMessengerFast": "0x7bE12FCB0Fc0979f4DD1A9A1CCec9d0036E634A1", + "Proxy__L1CrossDomainMessengerFast": "0xAE8885D3b7937af9480cd7301925a88Dfb0cE9f6", + "L2LiquidityPool": "0xEb0d3b107528FE17b9F55360D03351fe3D0ACaB2", + "L1LiquidityPool": "0xd779D5e0aDA790f382Cd80d0a90De533b8262b9f", + "Proxy__L1LiquidityPool": "0x569a3e1A4A50D0F53BDF05d50D5FeAB3f716f5A1", + "Proxy__L2LiquidityPool": "0xb227a9FebBa59B8Fe5dF7Ad81afac6E7CdE5a4A5", + "L2TokenPool": "0x152eE45C2eF3E6B303d0603C82b785255D386Fd0", + "L1Message": "0x3C285ACC9CAD39c94CF7E46850bd9098b6f858F5", + "L2Message": "0xECF2d55E35E14eC146f17a17B1D2e082bAA12B40", + "AtomicSwap": "0x2e965d49E69dA6182bdc331b740384CF8745A690", + "L2ERC721": "0x3a93df8eba34AFa4Fb74a09D7cb9BB6E528d2E0C", + "L2ERC721Reg": "0xb73Bc7AbED40236ca53b2225e3FA497c04A0F718", + "L1NFTBridge": "0xf5aCb091936715eCAC49d5759b4801703a175387", + "L2NFTBridge": "0x64371C6b9acFDBC14A98CD794a531Ff737Ef0F98", + "Proxy__L1NFTBridge": "0x1E12Ba552Ac35351563091737910d9E5d1DaD17a", + "Proxy__L2NFTBridge": "0x8E65834B52c3aCc79206a0F09c4b627BC588f09e", + "L1MultiMessageRelayerFast": "0x874a7Ea9722b96924e186f0263866FA90a7C777b", + "DiscretionaryExitFee": "0x01ce26900fC11aBc2AcF53154772bb251c8aA005", + "FeedRegistry": "0x0d2E819A8E0FC9377d3D488A9480D6C00ADE986F", + "BOBAUSD_Aggregator": "0x66335BA50c757a5b1Ee6FB3c3ed703e4a26ea526", + "BobaBillingContract": "0x17CC69Adc242f9C50132503A2e5d5d9cD4889786", + "Proxy__BobaBillingContract": "0x05C9f36D901594D220311B211fA26DbD58B87717", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "AuthenticatedFaucet": "0x8b6A1c0590Ab8A9CED9ADa87Df485eCdd97886E2", + "WBOBA9": "0xc03cc0d0995e7b677348e396F5F1D70Fe8667fCe", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/addressesBobaOperaTestnet_0x12ad9f501149D3FDd703cC10c567F416B7F0af8b.json b/packages/boba/register/addresses/addressesBobaOperaTestnet_0x12ad9f501149D3FDd703cC10c567F416B7F0af8b.json new file mode 100644 index 0000000000..1db2669f4a --- /dev/null +++ b/packages/boba/register/addresses/addressesBobaOperaTestnet_0x12ad9f501149D3FDd703cC10c567F416B7F0af8b.json @@ -0,0 +1,38 @@ +{ + "AddressManager": "0x12ad9f501149D3FDd703cC10c567F416B7F0af8b", + "Proxy__L1CrossDomainMessenger": "0xEecAD665ca933eeA4a9a2db600E538c1391930d1", + "Proxy__L1StandardBridge": "0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f", + "TK_L1BOBA": "0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF", + "TK_L2BOBA": "0x4200000000000000000000000000000000000006", + "TK_L1FTM": "0x0000000000000000000000000000000000000000", + "TK_L2FTM": "0x4200000000000000000000000000000000000023", + "L1CrossDomainMessengerFast": "0x7bE12FCB0Fc0979f4DD1A9A1CCec9d0036E634A1", + "Proxy__L1CrossDomainMessengerFast": "0xE5781E5E9CbC67E91DF93eD01E922De30125e491", + "L2LiquidityPool": "0x00Fda9B3952f80c4238C371064FA6667b6146468", + "L1LiquidityPool": "0x6A27b80a11156A7aA88CF34EC73F130df4f28bED", + "Proxy__L1LiquidityPool": "0x34024168ba3cfa608005b5E9f13389bb2532422A", + "Proxy__L2LiquidityPool": "0xE7Da2a8EBcbBa0Dc6082B8D0faBAcA0176920760", + "L2TokenPool": "0x352d964E9aD016f122dc78Afa5164417907E0FaF", + "L1Message": "0x154128647Ff7fc41DdaD3d09f7c83340140539C5", + "L2Message": "0xa97a909D967B150E27AB58ca6d0cb40B39200Be1", + "AtomicSwap": "0x1bc8Bd8FCAd96ee663b6325F71F818Cce678083D", + "L2ERC721": "0x727207c505c1D95Ef7Ed93f74443D72C155064E7", + "L2ERC721Reg": "0xb5F92c9d10539137C9602A626d7F98823e58f3aA", + "L1NFTBridge": "0xA3f17f06F7F02156692D795a1782105dA530631c", + "L2NFTBridge": "0xEecAD665ca933eeA4a9a2db600E538c1391930d1", + "Proxy__L1NFTBridge": "0x5E52f340D43Ee819dd8a38D55Cc27293603Ac5fb", + "Proxy__L2NFTBridge": "0x310FA48450dF21fBC99b937a7AafBc3B7Af6f6D1", + "L1MultiMessageRelayerFast": "0x9Af237336C29dCbA346764af8e8E1F0ba83D1eE5", + "DiscretionaryExitFee": "0x6E7033f647f932D23de37BD3b25b8F56DeAD4034", + "FeedRegistry": "0x48dfB307f6fFbDB9229E63beA2C127e7500DC5Ae", + "BOBAUSD_Aggregator": "0xA145e444abAd1Cb233A37cED870c59FD97e774bf", + "BobaBillingContract": "0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF", + "Proxy__BobaBillingContract": "0x675Ea342D2a85D7db0Cc79AE64196ad628Ce8187", + "Boba_GasPriceOracle":"0x4200000000000000000000000000000000000025", + "Proxy__Boba_GasPriceOracle":"0x4200000000000000000000000000000000000024", + "BobaTuringCredit": "0x4200000000000000000000000000000000000021", + "Proxy__BobaTuringCredit": "0x4200000000000000000000000000000000000020", + "AuthenticatedFaucet": "0xCED1459C6B56a85363426a502a24De99fBbF5a83", + "WBOBA9": "0xfd7f8a9F2D11B30a3571395Be9601720B6a32995", + "L2StandardTokenFactory": "0xD2ae16D8c66ac7bc1Cf3c9e5d6bfE5f76BeDb826" +} diff --git a/packages/boba/register/addresses/layerZeroTestnet.json b/packages/boba/register/addresses/layerZeroTestnet.json index 3b8b6a370e..9c67409ded 100644 --- a/packages/boba/register/addresses/layerZeroTestnet.json +++ b/packages/boba/register/addresses/layerZeroTestnet.json @@ -1,60 +1,76 @@ { "Layer_Zero_Protocol": { "Testnet":{ - "Layer_Zero_Endpoint": "0x79a63d6d8BBD5c6dfc774dA79bCcD948EAcb53FA", - "Layer_Zero_ChainId": "10001" + "Layer_Zero_Endpoint": "0xbfD2135BFfbb0B5378b56643c2Df8a87552Bfa23", + "Layer_Zero_ChainId": "10121" }, "BNB": { "Layer_Zero_Endpoint": "0x6Fcb97553D41516Cb228ac03FdC8B9a0a9df04A1", - "Layer_Zero_ChainId": "10002" + "Layer_Zero_ChainId": "10102" }, "Fantom": { "Layer_Zero_Endpoint": "0x7dcAD72640F835B0FA36EFD3D6d3ec902C7E5acf", - "Layer_Zero_ChainId": "10012" + "Layer_Zero_ChainId": "10112" }, "Avalanche": { "Layer_Zero_Endpoint": "0x93f54D755A063cE7bB9e6Ac47Eccc8e33411d706", "Layer_Zero_ChainId": "10006" + }, + "Moonbase": { + "Layer_Zero_Endpoint": "0xb23b28012ee92E8dE39DEb57Af31722223034747", + "Layer_Zero_ChainId": "10126" } }, "BOBA_Bridges": { "Testnet":{ - "Proxy__EthBridgeToBNB": "0xe15DccaB449aC06eE8eC068a75BA61968ba8BFBC", - "Proxy__EthBridgeToFantom": "0xE3D9a12677dE08D250c20BFe22009d5e34EB4ba5", - "Proxy__EthBridgeToAvalanche": "0x78Af7bF02fEBa4D979Ea2dBc5388cDC768E7b34E", - "EthBridgeToBNB": "0x1Df8afB0ddA430f5A31F731B0C9A673357E4F053", - "EthBridgeToFantom": "0x860E4E12d5b6d979D028cA1A55738722Db68138E", - "EthBridgeToAvalanche": "0x83E8310D78a0a49576C4Bd7609CD77182f31Ba88", - "Proxy__BNBBridgeToEth": "0x5eeA4C745c8099C8A226004493B7ac565D7489C7", - "Proxy__FantomBridgeToEth": "0x2d9322086Ea40Ffd7085e854120F1Bd2670469fD", - "Proxy__AvalancheBridgeToEth": "0x72B9875fF366f12B7fCCa379E762AaCD4CD457Cb", - "BNBBridgeToEth": "0x0168Bfe341d8c30faA7E0b6900104ceafd1E6B16", - "FantomBridgeToEth": "0xB5E0AdBb4cE258472eFe869B24Cb8452281A80a0", - "AvalancheBridgeToEth": "0x482bdcA71c6AB6751Be74e256E9A144e48E0Ba6f", - "BNB_TK_BOBA": "0x5895678be5bbb312B66a36f58D366325DdC35965", - "Avalanche_TK_BOBA": "0xE1BE8c3D60F8046F118F1301B412A908815C8886", - "Fantom_TK_BOBA": "0xD12701Ef5Bc5497a2122E0Cb630D44Cd88AfA770" + "Proxy__EthBridgeToBNB": "0x88F8cD148A4B68d250B62EeB75D9Cccd99624E2C", + "Proxy__EthBridgeToFantom": "0x46Df4761959BC78867e1Af47cA8bC7B40B3Cb1A6", + "Proxy__EthBridgeToAvalanche": "0x1b588Adb7Ec795f45D9c8BDdc2eA49efAE37AB6a", + "Proxy__EthBridgeToMoonbase": "0x3BB2954d2c2AaeE4832e4a89974DC4E5a5a53C0a", + "EthBridgeToBNB": "0xCb91c5157024618FC90017c28fa83F36f266Eb4e", + "EthBridgeToFantom": "0xa0fDeB9c88178E35D336042A076CeC12b55054a2", + "EthBridgeToAvalanche": "0x2C4Ec0725D9b795A90de46326C7dDb57C1437019", + "EthBridgeToMoonbase": "0x66c8283aECcAbB15f3359961a91783ff8553ee1B", + "Proxy__BNBBridgeToEth": "0x37152D3D998ED163f4253FDaBDD9E545F0Ec7c07", + "Proxy__FantomBridgeToEth": "0x01F93E4EFa199d4D42A248Db90716214f7283DCb", + "Proxy__AvalancheBridgeToEth": "0xec4DE3D3bCbCe89875C1C5d2d7FAd8B2AF5080a7", + "Proxy__MoonbaseBridgeToEth": "0xc60e797bf8166EEF92681fc47cDdd7517293F025", + "BNBBridgeToEth": "0xc614A66f82e71758Fa7735C91dAD1088c8362f15", + "FantomBridgeToEth": "0x7B23c975195503C9Eb1972e900ac4799B5A504Cb", + "AvalancheBridgeToEth": "0x7eD586Db48CB0b60b821462Be6e925CA1b5D271D", + "MoonbaseBridgeToEth": "0xBe9813929AD03bE8955fab157D64f5f784ADfc30", + "BNB_TK_BOBA": "0x89d7128C93933012F0d36D9A5bCae82414318A0D", + "Avalanche_TK_BOBA": "0xDA72d93c5645E70437D733d55DdE9CCb5403E4b1", + "Fantom_TK_BOBA": "0x44DcA16c6940D74d12ABFa586E0b6caAC0ceDeF8", + "Moonbase_TK_BOBA": "0x0F59e146b557c2168025E576C2A52f782e88cC6D" }, "BNB": { - "Proxy__EthBridgeToBNB": "0xe15DccaB449aC06eE8eC068a75BA61968ba8BFBC", - "EthBridgeToBNB": "0x1Df8afB0ddA430f5A31F731B0C9A673357E4F053", - "Proxy__BNBBridgeToEth": "0x5eeA4C745c8099C8A226004493B7ac565D7489C7", - "BNBBridgeToEth": "0x0168Bfe341d8c30faA7E0b6900104ceafd1E6B16", - "BNB_TK_BOBA": "0x5895678be5bbb312B66a36f58D366325DdC35965" + "Proxy__EthBridgeToBNB": "0x88F8cD148A4B68d250B62EeB75D9Cccd99624E2C", + "EthBridgeToBNB": "0xCb91c5157024618FC90017c28fa83F36f266Eb4e", + "Proxy__BNBBridgeToEth": "0x37152D3D998ED163f4253FDaBDD9E545F0Ec7c07", + "BNBBridgeToEth": "0xc614A66f82e71758Fa7735C91dAD1088c8362f15", + "BNB_TK_BOBA": "0x89d7128C93933012F0d36D9A5bCae82414318A0D" }, "Fantom": { - "Proxy__EthBridgeToFantom": "0xE3D9a12677dE08D250c20BFe22009d5e34EB4ba5", - "EthBridgeToFantom": "0x860E4E12d5b6d979D028cA1A55738722Db68138E", - "Proxy__FantomBridgeToEth": "0x2d9322086Ea40Ffd7085e854120F1Bd2670469fD", - "FantomBridgeToEth": "0xB5E0AdBb4cE258472eFe869B24Cb8452281A80a0", - "Fantom_TK_BOBA": "0xD12701Ef5Bc5497a2122E0Cb630D44Cd88AfA770" + "Proxy__EthBridgeToFantom": "0x46Df4761959BC78867e1Af47cA8bC7B40B3Cb1A6", + "EthBridgeToFantom": "0xa0fDeB9c88178E35D336042A076CeC12b55054a2", + "Proxy__FantomBridgeToEth": "0x01F93E4EFa199d4D42A248Db90716214f7283DCb", + "FantomBridgeToEth": "0x7B23c975195503C9Eb1972e900ac4799B5A504Cb", + "Fantom_TK_BOBA": "0x44DcA16c6940D74d12ABFa586E0b6caAC0ceDeF8" }, "Avalanche": { - "Proxy__EthBridgeToAvalanche": "0x78Af7bF02fEBa4D979Ea2dBc5388cDC768E7b34E", - "EthBridgeToAvalanche": "0x83E8310D78a0a49576C4Bd7609CD77182f31Ba88", - "Proxy__AvalancheBridgeToEth": "0x72B9875fF366f12B7fCCa379E762AaCD4CD457Cb", - "AvalancheBridgeToEth": "0x482bdcA71c6AB6751Be74e256E9A144e48E0Ba6f", - "Avalanche_TK_BOBA": "0xE1BE8c3D60F8046F118F1301B412A908815C8886" + "Proxy__EthBridgeToAvalanche": "0x1b588Adb7Ec795f45D9c8BDdc2eA49efAE37AB6a", + "EthBridgeToAvalanche": "0x2C4Ec0725D9b795A90de46326C7dDb57C1437019", + "Proxy__AvalancheBridgeToEth": "0xec4DE3D3bCbCe89875C1C5d2d7FAd8B2AF5080a7", + "AvalancheBridgeToEth": "0x7eD586Db48CB0b60b821462Be6e925CA1b5D271D", + "Avalanche_TK_BOBA": "0xDA72d93c5645E70437D733d55DdE9CCb5403E4b1" + }, + "Moonbase": { + "Proxy__EthBridgeToMoonbase": "0x3BB2954d2c2AaeE4832e4a89974DC4E5a5a53C0a", + "EthBridgeToMoonbase": "0x66c8283aECcAbB15f3359961a91783ff8553ee1B", + "Proxy__MoonbaseBridgeToEth": "0xc60e797bf8166EEF92681fc47cDdd7517293F025", + "MoonbaseBridgeToEth": "0xBe9813929AD03bE8955fab157D64f5f784ADfc30", + "Moonbase_TK_BOBA": "0x0F59e146b557c2168025E576C2A52f782e88cC6D" } } } diff --git a/packages/boba/register/addresses/tokenInfo.json b/packages/boba/register/addresses/tokenInfo.json index 5689658e0f..227ca5fb15 100644 --- a/packages/boba/register/addresses/tokenInfo.json +++ b/packages/boba/register/addresses/tokenInfo.json @@ -526,5 +526,313 @@ "decimals": 18 } } + }, + "43114": { + "L1": { + "0x3cD790449CF7D187a143d4Bd7F4654d4f2403e02": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x42006Ab57701251B580bDFc24778C43c9ff589A1": { + "name": "EVO", + "symbol": "EVO", + "decimals": 18 + }, + "0xc7198437980c041c805A1EDcbA50c1Ce5db95118": { + "name": "Tether USD", + "symbol": "USDT.e", + "decimals": 6 + }, + "0x9702230A8Ea53601f5cD2dc00fDBc13d4dF4A8c7": { + "name": "TetherToken", + "symbol": "USDt", + "decimals": 6 + }, + "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E": { + "name": "USD Coin", + "symbol": "USDC", + "decimals": 6 + }, + "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664": { + "name": "USD Coin", + "symbol": "USDC.e", + "decimals": 6 + }, + "0x19860CCB0A68fd4213aB9D8266F7bBf05A8dDe98": { + "name": "Binance USD", + "symbol": "BUSD.e", + "decimals": 18 + }, + "0x9C9e5fD8bbc25984B178FdCE6117Defa39d2db39": { + "name": "BUSD Token", + "symbol": "BUSD", + "decimals": 18 + }, + "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70": { + "name": "Dai Stablecoin", + "symbol": "DAI.e", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0xc8849f32138de93F6097199C5721a9EfD91ceE01": { + "name": "EVO", + "symbol": "EVO", + "decimals": 18 + }, + "0x4ED96c1dc969d7E2310D9582A68c39556C005912": { + "name": "Tether USD", + "symbol": "USDT.e", + "decimals": 6 + }, + "0xfaA13D82756f1e0e4dec9416b83121db3Fc35199": { + "name": "TetherToken", + "symbol": "USDt", + "decimals": 6 + }, + "0x12bb1A120dcF8Cb7152eDAC9f04d176DD7f41F7e": { + "name": "USD Coin", + "symbol": "USDC", + "decimals": 6 + }, + "0x126969743a6d300bab08F303f104f0f7DBAfbe20": { + "name": "USD Coin", + "symbol": "USDC.e", + "decimals": 6 + }, + "0xb8B0034CFD89925944C07Ac6CcB2834d1774cfb6": { + "name": "Binance USD", + "symbol": "BUSD.e", + "decimals": 18 + }, + "0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8": { + "name": "BUSD Token", + "symbol": "BUSD", + "decimals": 18 + }, + "0x69B7d24f0E03Ff21949081C95dA7288fEa5C844D": { + "name": "Dai Stablecoin", + "symbol": "DAI.e", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "Avalanche", + "symbol": "AVAX", + "decimals": 18 + } + } + }, + "43113": { + "L1": { + "0xEaE78E78cC22690719361F65a50734A15aaE698C": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "Avalanche", + "symbol": "AVAX", + "decimals": 18 + } + } + }, + "56": { + "L1": { + "0xE0DB679377A0F5Ae2BaE485DE475c9e1d8A4607D": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d": { + "name": "USD Coin", + "symbol": "USDC", + "decimals": 18 + }, + "0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56": { + "name": "BUSD Token", + "symbol": "BUSD", + "decimals": 18 + }, + "0x55d398326f99059fF775485246999027B3197955": { + "name": "Tether USD", + "symbol": "USDT", + "decimals": 18 + }, + "0x986cdF0fd180b40c4D6aEAA01Ab740B996D8b782": { + "name": "SushiToken", + "symbol": "SUSHI", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x9F98f9F312D23d078061962837042b8918e6aff2": { + "name": "USD Coin", + "symbol": "USDC", + "decimals": 18 + }, + "0x4a2c2838c3907D024916c3f4Fe07832745Ae4bec": { + "name": "BUSD Token", + "symbol": "BUSD", + "decimals": 18 + }, + "0x1E633Dcd0d3D349126983D58988051F7c62c543D": { + "name": "Tether USD", + "symbol": "USDT", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "BNB", + "symbol": "BNB", + "decimals": 18 + }, + "0xa84D7c48602C898EC84C4cCA78651107B3625943": { + "name": "SushiToken", + "symbol": "SUSHI", + "decimals": 18 + } + } + }, + "97": { + "L1": { + "0x875cD11fDf085e0E11B0EE6b814b6d0b38fA554C": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "tBNB", + "symbol": "tBNB", + "decimals": 18 + } + } + }, + "1284": { + "L1": { + "0x18D17A9fD652D7d6a59903E23792ab97F832Ed6C": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "GLMR", + "symbol": "GLMR", + "decimals": 18 + } + } + }, + "1287": { + "L1": { + "0x1365fd7BcEE84686DBCA71e1571C0d9ad9E64945": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "DEV", + "symbol": "DEV", + "decimals": 18 + } + } + }, + "250": { + "L1": { + "0x4389b230D15119c347B9E8BEA6d930A21aaDF6BA": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x04068DA6C83AFCFA0e13ba15A6696662335D5B75": { + "name": "USD Coin", + "symbol": "USDC", + "decimals": 6 + }, + "0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E": { + "name": "Dai Stablecoin", + "symbol": "DAI", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "FTM", + "symbol": "FTM", + "decimals": 18 + }, + "0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8": { + "name": "USD Coin", + "symbol": "USDC", + "decimals": 6 + }, + "0x31223A147fF76C3fC43d67F8BC36F11E034c484e": { + "name": "Dai Stablecoin", + "symbol": "DAI", + "decimals": 18 + } + } + }, + "4002": { + "L1": { + "0x5E747DfA79b8f9e46BE0CC67e378b7600350B2eF": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + } + }, + "L2": { + "0x4200000000000000000000000000000000000006": { + "name": "BOBA Token", + "symbol": "BOBA", + "decimals": 18 + }, + "0x4200000000000000000000000000000000000023": { + "name": "FTM", + "symbol": "FTM", + "decimals": 18 + } + } } } diff --git a/packages/sdk/src/utils/contracts.ts b/packages/sdk/src/utils/contracts.ts index b38387ecf2..6e047ad929 100644 --- a/packages/sdk/src/utils/contracts.ts +++ b/packages/sdk/src/utils/contracts.ts @@ -128,6 +128,186 @@ export const CONTRACT_ADDRESSES: { }, l2: DEFAULT_L2_CONTRACT_ADDRESSES, }, + // Moonbeam local + 1281: { + l1: { + AddressManager: '0xc01Ee7f10EA4aF4673cFff62710E1D7792aBa8f3', + L1CrossDomainMessenger: '0xab7785d56697E65c2683c8121Aac93D3A028Ba95', + L1CrossDomainMessengerFast: '0xB942FA2273C7Bce69833e891BDdFd7212d2dA415', + L1StandardBridge: '0x78D714e1b47Bb86FE15788B917C9CC7B77975529', + StateCommitmentChain: '0x294c664f6D63bd1521231a2EeFC26d805ce00a08', + CanonicalTransactionChain: '0x598efcBD0B5b4Fd0142bEAae1a38f6Bd4d8a218d', + BondManager: '0xEC69d4f48f4f1740976968FAb9828d645Ad1d77f', + L1MultiMessageRelayer: '0xad856F238CBeafd064b80D12EadAea3981fB21B5', + L1MultiMessageRelayerFast: '0xAdD0E4aD78B01048027154c7a432a1cB6711178f', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // MoonBase + 1287: { + l1: { + AddressManager: '0xF8d0bF3a1411AC973A606f90B2d1ee0840e5979B', + L1CrossDomainMessenger: '0x76DB375075F1d5Dcd1D70Fc07F69a5c7b40ab877', + L1CrossDomainMessengerFast: '0xAE8885D3b7937af9480cd7301925a88Dfb0cE9f6', + L1StandardBridge: '0xEcca5FEd8154420403549f5d8F123fcE69fae806', + StateCommitmentChain: '0x5E41Eaac5319CDf336c51969E2F164A686138B28', + CanonicalTransactionChain: '0xa8bD51a7F46321587921A33fa3c752b426c74754', + BondManager: '0x6c55306656E8b74F93653A753DE539c2F6ca18Db', + L1MultiMessageRelayer: '0x4c1bcfe4F0b1a57d3c578a8ED3dBEBCa29339c85', + L1MultiMessageRelayerFast: '0x874a7Ea9722b96924e186f0263866FA90a7C777b', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Moonbeam + 1284: { + l1: { + AddressManager: '0x564c10A60af35a07f0EA8Be3106a4D81014b21a0', + L1CrossDomainMessenger: '0x4765f8b50Bbe049045bBA1270dc7A8CDF17165cF', + L1CrossDomainMessengerFast: '0x17d02C3e6cB69225d83d0bADEb0fC09aE735CA3b', + L1StandardBridge: '0xAf5297f68D48cd2DE37Ee5cbaC0647fbA4132985', + StateCommitmentChain: '0xAD379B1518f50Fc737536D2Ec2c13E4640e228A8', + CanonicalTransactionChain: '0x99C970105cf6EE2e22b563CB86bCA42D05ac7A95', + BondManager: '0xcfe333e0e48EC71f1399a76001cf39E0c6A51dA5', + L1MultiMessageRelayer: '0x3664bC9BA25D0d3911c39d8ae1734b0B5A3495C1', + L1MultiMessageRelayerFast: '0xE2EE964E39720f78Cd75BC146Ed078D301981759', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Fantom local + 4003: { + l1: { + AddressManager: '0xf536cAF1a894E09945E649FCE3032E8E03ECb9A0', + L1CrossDomainMessenger: '0x03466593AE8Bc085F384bC4EB91d5035F5a7936C', + L1CrossDomainMessengerFast: '0xC93DD6833E6A29004FcC84C757cCf0d5551aBFe1', + L1StandardBridge: '0xAEa06C2B29edfac53a0538A9843D018348845Ebf', + StateCommitmentChain: '0xC98Dd1b152d9e4cf2A6384a78d4FFE8D50E86C6c', + CanonicalTransactionChain: '0xFfB9dF984DC95ab53c561d818b708135612b087f', + BondManager: '0xE9BC1f638d05edF64Bf3e23A08ff3e2B0fb8b7F7', + L1MultiMessageRelayer: '0x9257aE2144eF338Da70D6884c98BD8CB90Da639E', + L1MultiMessageRelayerFast: '0xB6D431Bb85298030eA27a0E3769bEa5ed1F9fF53', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Fantom testnet + 4002: { + l1: { + AddressManager: '0x12ad9f501149D3FDd703cC10c567F416B7F0af8b', + L1CrossDomainMessenger: '0xEecAD665ca933eeA4a9a2db600E538c1391930d1', + L1CrossDomainMessengerFast: '0xE5781E5E9CbC67E91DF93eD01E922De30125e491', + L1StandardBridge: '0x86FC7AeFcd69983A8d82eAB1E0EaFD38bB42fd3f', + StateCommitmentChain: '0x352d964E9aD016f122dc78Afa5164417907E0FaF', + CanonicalTransactionChain: '0xE66Bd40BBeC97397758E22858331752f0ecBE02e', + BondManager: '0xa97a909D967B150E27AB58ca6d0cb40B39200Be1', + L1MultiMessageRelayer: '0xD7Cbc979C909d864c38670AcccD57209F7B556e3', + L1MultiMessageRelayerFast: '0x9Af237336C29dCbA346764af8e8E1F0ba83D1eE5', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Fantom mainnet + 250: { + l1: { + AddressManager: '0x4e7325bcf09e091Bb8119258B885D4ef687B7386', + L1CrossDomainMessenger: '0x64Fca36c52628e40de8684C4C3B5EdB22Fd2eFd9', + L1CrossDomainMessengerFast: '0xC0597ED18446254E4dd0CA5D80eb07D3f2E462cF', + L1StandardBridge: '0xb7629EF94B991865940E8A840Aa7d68fa88c3Fe8', + StateCommitmentChain: '0xF764C4f8D2982432239A110Cf6B08e95631cE564', + CanonicalTransactionChain: '0x6001C473E020D3562Ea436B61aE4d2e91e7078cE', + BondManager: '0xCcA5a1CB9fAD5F2A5b88D95440dA7c83EC031Cb1', + L1MultiMessageRelayer: '0xD8DcA5fC53a83Cf06ec744a7226C23951a353A0f', + L1MultiMessageRelayerFast: '0xE7beDcedF3E3054aF891DddeF61775A23a16CB90', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Avalanche local + 43112: { + l1: { + AddressManager: '0x52C84043CD9c865236f11d9Fc9F56aa003c1f922', + L1CrossDomainMessenger: '0xDFBb4b49DfAe39720f68f8297ADb2368FeffaDdb', + L1CrossDomainMessengerFast: '0xD054149e4345Cc00cc2f2465C02a864f60d6bd46', + L1StandardBridge: '0x4475A8FBeF5Cf4a92a484B6f5602A91F3abC72D8', + StateCommitmentChain: '0xF5f1f185cF359dC48469e410Aeb6983cD4DC5812', + CanonicalTransactionChain: '0xa1E47689f396fED7d18D797d9D31D727d2c0d483', + BondManager: '0x97C0FE6aB595cbFD50ad3860DA5B2017d8B35c2E', + L1MultiMessageRelayer: '0xEC1bf080BDFBbBa102603Cc1C55aFd215C694a2b', + L1MultiMessageRelayerFast: '0x1AA001Cd20F35F3F4EF1A945053CeE4Acc24aDb4', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Avalanche testnet + 43113: { + l1: { + AddressManager: '0xcE78de95b85212BC348452e91e0e74c17cf37c79', + L1CrossDomainMessenger: '0x68c19B7FbAe4F8034cf6316b2045ba6aB6978F6b', + L1CrossDomainMessengerFast: '0xBc5249095c890F58C0b75795bd21667eFd123F5F', + L1StandardBridge: '0x07B606934b5B5D6A9E1f8b78A0B26215FF58Ad56', + StateCommitmentChain: '0x57B9C47F2Ae857005238096486C5B107447dE221', + CanonicalTransactionChain: '0xA36D21C0125b5Dc52d95ED8FF1eF7188d4666EAE', + BondManager: '0x067cD503bd734a779830dafF0Db582B6a347c3df', + L1MultiMessageRelayer: '0x74546A4c6D5543Be7e8447159c47BAe7f5431C49', + L1MultiMessageRelayerFast: '0x5e6B412b4fA8373a17aD85B269fA5c354ea57e63', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // Avalanche Mainnet + 43114: { + l1: { + AddressManager: '0x00220f8ce1c4be8436574e575fE38558d85e2E6b', + L1CrossDomainMessenger: '0x0fc742332ae6D447d6619D93985Aa288B81CBb0C', + L1CrossDomainMessengerFast: '0x5b6714b7926e6D7e34154C9AC945B489978fA7E7', + L1StandardBridge: '0xf188F1e92B2c78956D2859b84684BFD17103e22c', + StateCommitmentChain: '0x1ef85D873Cf451C8B9a45DbE40b478E991F51210', + CanonicalTransactionChain: '0x1A19A4ce2b3B0A974Df717b6F88c881a69F315e3', + BondManager: '0x26c319B7B2cF823365414d082698C8ac90cbBA63', + L1MultiMessageRelayer: '0x87e062dE99Ed71aF9b22dDA63e1b6D43333798f8', + L1MultiMessageRelayerFast: '0xf9821061774b9693359F582b007A5F1C39d75Ae3', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // BNB local + 99: { + l1: { + AddressManager: '0xC194E4CFa59D2DfC520217dA22E23DF8D4658a37', + L1CrossDomainMessenger: '0x8b8656D5d37C3DC620B80817972E0d9a5267761b', + L1CrossDomainMessengerFast: '0x07B43F437c3A13eeb17EF2beBea046e61502151f', + L1StandardBridge: '0x285766B642eAA86b8052817c827E4472cDb3dd18', + StateCommitmentChain: '0x57a243B34F9232515Fa9FD8D4c2daFd611cF1BCA', + CanonicalTransactionChain: '0x3717E342Bc746c01244fb40e47521945091238ce', + BondManager: '0xcF8dDe2accE564024B4b92ef7db81B0e6698F07f', + L1MultiMessageRelayer: '0x90f502229E1fAa70cCf900B2D14595a5C55B3bE8', + L1MultiMessageRelayerFast: '0x64160054BdD6e53915C221cBBfAAbaf1f80c7f20', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // BNB testnet + 97: { + l1: { + AddressManager: '0xAee1fb3f4353a9060aEC3943fE932b6Efe35CdAa', + L1CrossDomainMessenger: '0x53aD38aE4a63Fe33a86E011F7AF4d3fDe3daD145', + L1CrossDomainMessengerFast: '0xbbD6a271abcC44f6dE284E6051Da76b4fB57458C', + L1StandardBridge: '0xBf0939120b4F5E3196b9E12cAC291e03dD058e9a', + StateCommitmentChain: '0x37FB8bB9EA100CA9a0DE822c9923643ef48Cb8EE', + CanonicalTransactionChain: '0x65f291CDfB05bd1D639DF6268F98594fdacDeCa6', + BondManager: '0x6737867ddd04272a79E7207a008f213e336b00e1', + L1MultiMessageRelayer: '0x5e593AeB2Dbd855D79167831f091B4d959FbB2D1', + L1MultiMessageRelayerFast: '0x0F01394F5fc19bA1B9F669bA79b76c9EaAe37987', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, + // BNB mainnet + 56: { + l1: { + AddressManager: '0xeb989B25597259cfa51Bd396cE1d4B085EC4c753', + L1CrossDomainMessenger: '0x31338a7D5d123E18a9a71447136B54B6D28241ae', + L1CrossDomainMessengerFast: '0xBe349cABeA97bB933f8C2594634Deb858167f83c', + L1StandardBridge: '0x1E0f7f4b2656b14C161f1caDF3076C02908F9ACC', + StateCommitmentChain: '0xeF85fA550e6EC5486121313C895EDe1005e2397f', + CanonicalTransactionChain: '0xA0E38a8FE293E9e95c6A4a882F396F1c80e9e2e4', + BondManager: '0xEB6652A4eb6e0d003Fbb3DD76Ae72694175191cd', + L1MultiMessageRelayer: '0x1E633Dcd0d3D349126983D58988051F7c62c543D', + L1MultiMessageRelayerFast: '0x2dB5717B37Af9A1D9a28829Ea977B4aE4aEE2AED', + }, + l2: DEFAULT_L2_CONTRACT_ADDRESSES, + }, } /** diff --git a/yarn.lock b/yarn.lock index ab0c3d4050..47f5d2e9c7 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5049,14 +5049,15 @@ "@noble/hashes" "~1.1.1" "@scure/base" "~1.1.0" -"@sentry/browser@7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.24.1.tgz#01c1ce61ba3cfbdec07bcf1413dc958087e26c32" - integrity sha512-Tr7p1Bg8a+ycdUmZuega0TTOl6xNZUj17PBFZnCjpZtxUMxlwR6aBlM0TxF6/bV6fUJchmoLCAjL3kLIHSSo6Q== - dependencies: - "@sentry/core" "7.24.1" - "@sentry/types" "7.24.1" - "@sentry/utils" "7.24.1" +"@sentry/browser@7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.34.0.tgz#6a521c5d95d535e6e89cf4eae85153f90c37d17a" + integrity sha512-5Jmjj0DLxx+31o12T+VH4U+gO7wz3L+ftjuTxcQaC8GeFVe5qCyXZoDmWKNV9NEyREiZ3azV62bJc5wojZrIIg== + dependencies: + "@sentry/core" "7.34.0" + "@sentry/replay" "7.34.0" + "@sentry/types" "7.34.0" + "@sentry/utils" "7.34.0" tslib "^1.9.3" "@sentry/core@5.30.0": @@ -5081,13 +5082,13 @@ "@sentry/utils" "6.19.7" tslib "^1.9.3" -"@sentry/core@7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.24.1.tgz#815480791e4230fd2e8718a4caa1b8253ca42c23" - integrity sha512-x/kBpBVFCZn4ijVVAPAw0cmHy0PfXgBpYGQ1X3+EEzI3pkvlygvnF2pLR/4LrsC23zGfIRlbDj4DwK5hxoFF4g== +"@sentry/core@7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.34.0.tgz#bfda8d386cf7343200aa9fb7a7a26e99b839fc0c" + integrity sha512-J1oxsYZX1N0tkEcaHt/uuDqk6zOnaivyampp+EvBsUMCdemjg7rwKvawlRB0ZtBEQu3HAhi8zecm03mlpWfCDw== dependencies: - "@sentry/types" "7.24.1" - "@sentry/utils" "7.24.1" + "@sentry/types" "7.34.0" + "@sentry/utils" "7.34.0" tslib "^1.9.3" "@sentry/hub@5.30.0": @@ -5155,17 +5156,26 @@ lru_map "^0.3.3" tslib "^1.9.3" -"@sentry/react@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.24.1.tgz#56c3d0df8424421c5f1081fdcb09bb76ef569d24" - integrity sha512-AxpEFML0nXOq7c1p34JYI2UjxWE+nqIaIXuX/sRTpyOtW+Wq/JLp2qTjimgb3bwY2JmefweRSvzf8J/cuXDG4A== +"@sentry/react@^7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.34.0.tgz#8d69d3957736fe2692cd5547ad2d2f6f307e5590" + integrity sha512-vdonnZK9R8xyEBDaXNofHyoqy9biNRvlKrQXZp4x8WlYcBCwbU46qxZlSVsxa89pm7yUYS+KHq8cYL801+weqg== dependencies: - "@sentry/browser" "7.24.1" - "@sentry/types" "7.24.1" - "@sentry/utils" "7.24.1" + "@sentry/browser" "7.34.0" + "@sentry/types" "7.34.0" + "@sentry/utils" "7.34.0" hoist-non-react-statics "^3.3.2" tslib "^1.9.3" +"@sentry/replay@7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.34.0.tgz#66d63b1e04d7e8068cac0c623a607f470d000751" + integrity sha512-4L4YZfWt8mcVNcI99RxHORPb308URI1R9xsFj97fagk0ATjexLKr5QCA2ApnKaSn8Q0q1Zdzd4XmFtW9anU45Q== + dependencies: + "@sentry/core" "7.34.0" + "@sentry/types" "7.34.0" + "@sentry/utils" "7.34.0" + "@sentry/tracing@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" @@ -5188,14 +5198,14 @@ "@sentry/utils" "6.19.7" tslib "^1.9.3" -"@sentry/tracing@^7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.24.1.tgz#8f947b01a6b836334f20fcb36441d69cede474c9" - integrity sha512-Vp03aH7wMxLszFMZqVWPlDlqCP5mwAqqsh9nHWUJhyarGJjeacrMj+B+5qKKM4W/JNnbrHRTRLw2lL/szxj1KA== +"@sentry/tracing@^7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.34.0.tgz#bc084389cad4f1e8520311ac195b070eced72b40" + integrity sha512-JtfSWBfcWslfIujcpGEPF5oOiAOCd5shMoWYrdTvCfruHhYjp4w5kv/ndkvq2EpFkcQYhdmtQEytXEO8IJIqRw== dependencies: - "@sentry/core" "7.24.1" - "@sentry/types" "7.24.1" - "@sentry/utils" "7.24.1" + "@sentry/core" "7.34.0" + "@sentry/types" "7.34.0" + "@sentry/utils" "7.34.0" tslib "^1.9.3" "@sentry/types@5.30.0": @@ -5208,10 +5218,10 @@ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.19.7.tgz#c6b337912e588083fc2896eb012526cf7cfec7c7" integrity sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg== -"@sentry/types@7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.24.1.tgz#ff2e39752ff1d46b54807275e9262209f95ec429" - integrity sha512-77E1cgw31YmEeqTi5RNMfIgwDB164UdtAGKtTtCehbF9HffO3Lp4f3G8TumqNKOik1RDNHrn+ZWqbj2c97UZZA== +"@sentry/types@7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.34.0.tgz#e0dc6a927dd13e4cacbca7bfee67a088885e8309" + integrity sha512-K+OeHIrl35PSYn6Zwqe4b8WWyAJQoI5NeWxHVkM7oQTGJ1YLG4BvLsR+UiUXnKdR5krE4EDtEA5jLsDlBEyPvw== "@sentry/utils@5.30.0": version "5.30.0" @@ -5229,12 +5239,12 @@ "@sentry/types" "6.19.7" tslib "^1.9.3" -"@sentry/utils@7.24.1": - version "7.24.1" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.24.1.tgz#f9760a7cb4b33d2ead01aace7b0fd62c8c2c6be8" - integrity sha512-wH0+ToU3OpL373Nx0YiuYje82a8lf6fm7q+MqyWyC6sVETe4YiL4+Ge0WLEJ0XEGFjxfL4gSZL3FhoVbJQxUtA== +"@sentry/utils@7.34.0": + version "7.34.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.34.0.tgz#32fb6db8b352477d219ddff8200372959c68b445" + integrity sha512-VIHHXEBw0htzqxnU8A7WkXKvmsG2pZVqHlAn0H9W/yyFQtXMuP1j1i0NsjADB/3JXUKK83kTNWGzScXvp0o+Jg== dependencies: - "@sentry/types" "7.24.1" + "@sentry/types" "7.34.0" tslib "^1.9.3" "@sindresorhus/is@^0.14.0":