diff --git a/packages/boba/gateway/src/actions/signAction.js b/packages/boba/gateway/src/actions/signAction.js
index 7562a3e252..562d869f2d 100644
--- a/packages/boba/gateway/src/actions/signAction.js
+++ b/packages/boba/gateway/src/actions/signAction.js
@@ -26,7 +26,3 @@ export async function updateSignatureStatus_exitTRAD ( sigStatus ) {
export async function updateSignatureStatus_depositLP ( sigStatus ) {
store.dispatch({type: 'DEPOSIT/LP/SIGNED',payload: sigStatus})
}
-
-export async function updateSignatureStatus_depositTRAD ( sigStatus ) {
- store.dispatch({type: 'DEPOSIT/TRAD/SIGNED',payload: sigStatus})
-}
diff --git a/packages/boba/gateway/src/api/buyerAxios.js b/packages/boba/gateway/src/api/buyerAxios.js
deleted file mode 100644
index df7fb2dc19..0000000000
--- a/packages/boba/gateway/src/api/buyerAxios.js
+++ /dev/null
@@ -1,19 +0,0 @@
-import axios from 'axios'
-
-import { getBaseServices } from 'util/masterConfig'
-
-/*
-might need to be updated - not sure this makes sense for local?
-*/
-
-const _buyerAxiosInstance = axios.create({
- baseURL: getBaseServices().BUYER_OPTIMISM_API_URL,
-})
-
-_buyerAxiosInstance.interceptors.request.use((config) => {
- config.headers['Accept'] = 'application/json'
- config.headers['Content-Type'] = 'application/json'
- return config
-})
-
-export default _buyerAxiosInstance
diff --git a/packages/boba/gateway/src/api/sellerAxios.js b/packages/boba/gateway/src/api/sellerAxios.js
deleted file mode 100644
index 63556b73b0..0000000000
--- a/packages/boba/gateway/src/api/sellerAxios.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import axios from 'axios'
-import { SELLER_OPTIMISM_API_URL } from 'util/constant'
-
-const _sellerAxiosInstance = axios.create({
- baseURL: SELLER_OPTIMISM_API_URL,
-})
-
-_sellerAxiosInstance.interceptors.request.use((config) => {
- config.headers['Accept'] = 'application/json'
- config.headers['Content-Type'] = 'application/json'
- return config
-})
-
-export default _sellerAxiosInstance
diff --git a/packages/boba/gateway/src/api/serviceAxios.js b/packages/boba/gateway/src/api/serviceAxios.js
deleted file mode 100644
index 2736e8f20c..0000000000
--- a/packages/boba/gateway/src/api/serviceAxios.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import axios from 'axios'
-import { SERVICE_OPTIMISM_API_URL } from 'util/constant'
-
-const _serviceAxiosInstance = axios.create({
- baseURL: SERVICE_OPTIMISM_API_URL,
-})
-
-_serviceAxiosInstance.interceptors.request.use((config) => {
- config.headers[ 'Accept' ] = 'application/json'
- config.headers[ 'Content-Type' ] = 'application/json'
- return config
-})
-
-export default _serviceAxiosInstance
diff --git a/packages/boba/gateway/src/components/listFarm/listFarm.js b/packages/boba/gateway/src/components/listFarm/listFarm.js
index bfb00d4e18..a920c744ac 100644
--- a/packages/boba/gateway/src/components/listFarm/listFarm.js
+++ b/packages/boba/gateway/src/components/listFarm/listFarm.js
@@ -476,10 +476,10 @@ class ListFarm extends React.Component {
Staked
{logAmount(userInfo.amount, decimals, 2)}
-
diff --git a/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js b/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js
index 480c1b4661..ee99f218fa 100644
--- a/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js
+++ b/packages/boba/gateway/src/components/mainMenu/feeSwitcher/FeeSwitcher.js
@@ -38,10 +38,9 @@ import BN from 'bignumber.js'
import { logAmount } from 'util/amountConvert.js'
import networkService from 'services/networkService.js'
import {
- selectActiveNetwork,
selectActiveNetworkName,
} from 'selectors/networkSelector.js'
-import { NETWORK } from 'util/network/network.util.js'
+
function FeeSwitcher() {
const dispatch = useDispatch()
@@ -49,20 +48,21 @@ function FeeSwitcher() {
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 l2BalanceNativeToken = l2Balances.filter((i) => i.symbol === networkService.L1NativeTokenSymbol)
+ const balanceETH = l2BalanceNativeToken[ 0 ]
const l2BalanceBOBA = l2Balances.filter((i) => i.symbol === 'BOBA')
const balanceBOBA = l2BalanceBOBA[0]
const dispatchSwitchFee = useCallback(
async (targetFee) => {
let tooSmallL1NativeToken = false
- let minL1NativeBalance = network === NETWORK.ETHEREUM ? 0.0002 : 0.5
+ // mini balance required for token to use as bridge fee
+ let minL1NativeBalance = await networkService.estimateMinL1NativeTokenForFee() //0.002
let tooSmallBOBA = false
if (typeof balanceBOBA === 'undefined') {
@@ -126,7 +126,7 @@ function FeeSwitcher() {
dispatch(openAlert(`Successfully changed fee to ${targetFee}`))
}
},
- [dispatch, feeUseBoba, balanceETH, balanceBOBA, network]
+ [dispatch, feeUseBoba, balanceETH, balanceBOBA]
)
if (!accountEnabled && layer !== 'L2') {
diff --git a/packages/boba/gateway/src/components/mainMenu/layerSwitcher/LayerSwitcher.js b/packages/boba/gateway/src/components/mainMenu/layerSwitcher/LayerSwitcher.js
index 0454bc6ca5..d404aaba0c 100644
--- a/packages/boba/gateway/src/components/mainMenu/layerSwitcher/LayerSwitcher.js
+++ b/packages/boba/gateway/src/components/mainMenu/layerSwitcher/LayerSwitcher.js
@@ -22,13 +22,14 @@ import {
IconButton,
} from '@mui/material'
import { useTheme } from '@mui/styles'
-import { setConnect, setLayer } from 'actions/setupAction.js'
+import { setConnect, setConnectBOBA, setConnectETH, setLayer } from 'actions/setupAction.js'
import BobaIcon from 'components/icons/BobaIcon.js'
import EthereumIcon from 'components/icons/EthereumIcon.js'
import React, { useCallback, useEffect } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import {
+ selectBaseEnabled,
selectAccountEnabled,
selectLayer,
selectConnectETH,
@@ -58,6 +59,7 @@ import { LAYER } from 'util/constant.js'
function LayerSwitcher({ visisble = true }) {
const dispatch = useDispatch()
const accountEnabled = useSelector(selectAccountEnabled())
+ const baseEnabled = useSelector(selectBaseEnabled())
let layer = useSelector(selectLayer())
const network = useSelector(selectActiveNetwork())
@@ -87,7 +89,7 @@ function LayerSwitcher({ visisble = true }) {
const dispatchBootAccount = useCallback(() => {
- if (!accountEnabled) initializeAccount()
+ if (!accountEnabled && baseEnabled) initializeAccount()
async function initializeAccount() {
@@ -95,19 +97,18 @@ function LayerSwitcher({ visisble = true }) {
networkGateway: network,
networkType,
})
-
if (initialized === 'nometamask') {
dispatch(openModal('noMetaMaskModal'));
return false;
} else if (initialized === 'wrongnetwork') {
dispatch(openModal('wrongNetworkModal'))
return false
- } else if (initialized === false) {
- console.log('WP: Account NOT enabled for', network, accountEnabled)
+ }
+ else if (initialized === false) {
dispatch(setEnableAccount(false))
return false
- } else if (initialized === LAYER.L1 || initialized === LAYER.L2) {
- console.log('WP: Account IS enabled for', initialized)
+ }
+ else if (initialized === LAYER.L1 || initialized === LAYER.L2) {
dispatch(setLayer(initialized))
dispatch(setEnableAccount(true))
dispatch(setWalletAddress(networkService.account))
@@ -118,35 +119,22 @@ function LayerSwitcher({ visisble = true }) {
return false
}
}
- }, [dispatch, accountEnabled, network, networkType])
-
- // this will switch chain, if needed, and then connect to Boba
- const connectToBOBA = useCallback(async () => {
- localStorage.setItem('wantChain', JSON.stringify('L2'))
- await networkService.switchChain('L2')
- dispatchBootAccount()
- }, [dispatchBootAccount])
-
- // this will switch chain, if needed, and then connect to Ethereum
- const connectToETH = useCallback(async () => {
- localStorage.setItem('wantChain', JSON.stringify('L1'))
- await networkService.switchChain('L1')
- dispatchBootAccount()
- }, [ dispatchBootAccount ])
-
- const dispatchSwitchLayer = useCallback(
- (targetLayer) => {
- if (targetLayer === 'L1') {
- connectToETH()
- } else if (targetLayer === 'L2') {
- connectToBOBA()
- } else {
- // handles the strange targetLayer === null when people click on ETH icon a second time
- connectToETH()
+ }, [dispatch, accountEnabled, network, networkType, baseEnabled])
+
+ const doConnectToLayer = useCallback((layer) => {
+ async function doConnect() {
+ try {
+ localStorage.setItem('wantChain', JSON.stringify(layer))
+ await networkService.switchChain(layer)
+ dispatchBootAccount()
+ } catch (err) {
+ console.log('ERROR', err)
+ dispatch(setConnectETH(false));
+ dispatch(setConnectBOBA(false));
}
- },
- [connectToBOBA, connectToETH]
- )
+ }
+ doConnect();
+ }, [dispatch, dispatchBootAccount])
useEffect(() => {
// detect mismatch and correct the mismatch
@@ -175,21 +163,19 @@ function LayerSwitcher({ visisble = true }) {
}
}, [chainChangedFromMM, dispatchBootAccount])
+ // listening for l1 connection request
useEffect(() => {
if (connectETHRequest) {
- localStorage.setItem('wantChain', JSON.stringify('L1'))
- networkService.switchChain('L1')
- dispatchBootAccount()
+ doConnectToLayer('L1')
}
- }, [connectETHRequest, dispatchBootAccount])
+ }, [ connectETHRequest, doConnectToLayer ])
+ // listening for l2 connection request
useEffect(() => {
if (connectBOBARequest) {
- localStorage.setItem('wantChain', JSON.stringify('L2'))
- networkService.switchChain('L2')
- dispatchBootAccount()
+ doConnectToLayer('L2')
}
- }, [connectBOBARequest, dispatchBootAccount])
+ }, [ connectBOBARequest, doConnectToLayer ])
useEffect(() => {
if (connectRequest) {
@@ -247,7 +233,7 @@ function LayerSwitcher({ visisble = true }) {
title="Ethereum"
layer={layer}
icon={}
- onConnect={() => connectToETH()}
+ onConnect={() => doConnectToLayer(LAYER.L1)}
isConnected={layer === LAYER.L1}
/>
@@ -255,7 +241,7 @@ function LayerSwitcher({ visisble = true }) {
title="Boba Network"
layer={layer}
icon={}
- onConnect={() => connectToBOBA()}
+ onConnect={() => doConnectToLayer(LAYER.L1)}
isConnected={layer === LAYER.L2}
/>
@@ -267,7 +253,7 @@ function LayerSwitcher({ visisble = true }) {
dispatchSwitchLayer(n)}
+ onChange={(e, n) => doConnectToLayer(n)}
aria-label="text alignment"
>
{
// reset baseState to false to trigger initialization on chain change.
// and trigger the connect to BOBA & ETH base on current chain.
dispatch(setBaseState(false));
+ dispatch(setEnableAccount(false));
setReconnect(true);
}
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 d74e6ac61f..64fdd059c0 100644
--- a/packages/boba/gateway/src/containers/bridge/bobaBridge/bobaBridge.styles.js
+++ b/packages/boba/gateway/src/containers/bridge/bobaBridge/bobaBridge.styles.js
@@ -25,6 +25,16 @@ export const BobaContent = styled(Box)(({ theme }) => ({
gap: '10px',
}))
+export const BridgeConnectButton = styled(Box)(({theme})=> ({
+ alignSelf: 'flex-start',
+ [ theme.breakpoints.down('md') ]: {
+ alignSelf: 'stretch',
+ 'button': {
+ width: '100%'
+ }
+ }
+}));
+
export const BobaContentWrapper = styled(Box, {
shouldForwardProp: (props) => props !== 'fullWidth',
})(({ theme, flexDirection }) => ({
diff --git a/packages/boba/gateway/src/containers/connect/Connect.js b/packages/boba/gateway/src/containers/connect/Connect.js
index 24081e3df4..46d1dd06f2 100644
--- a/packages/boba/gateway/src/containers/connect/Connect.js
+++ b/packages/boba/gateway/src/containers/connect/Connect.js
@@ -32,7 +32,7 @@ const Connect = ({
variant="contained"
size="large"
onClick={() => dispatch(setConnect(true))}
- sx="font-weight: 500;"
+ sx={{fontWeight: '500;'}}
>
Connect
diff --git a/packages/boba/gateway/src/containers/home/Home.js b/packages/boba/gateway/src/containers/home/Home.js
index b4360269a1..4a2118d79a 100644
--- a/packages/boba/gateway/src/containers/home/Home.js
+++ b/packages/boba/gateway/src/containers/home/Home.js
@@ -182,18 +182,21 @@ function Home() {
useInterval(() => {
if(accountEnabled /*== MetaMask is connected*/) {
dispatch(fetchBalances()) // account specific
+
+ if (activeNetwork === NETWORK.ETHEREUM) {
+ dispatch(fetchDaoBalance()) // account specific
+ dispatch(fetchDaoVotes()) // account specific
+ dispatch(fetchDaoBalanceX()) // account specific
+ dispatch(fetchDaoVotesX()) // account specific
+ dispatch(getMonsterInfo()) // account specific
+ dispatch(getFS_Info()) // account specific
+ dispatch(getFS_Saves()) // account specific
+ }
}
/*== we only have have Base L1 and L2 providers*/
if (baseEnabled && activeNetwork === NETWORK.ETHEREUM) {
dispatch(getProposalThreshold())
dispatch(fetchDaoProposals())
- 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
}
}, POLL_INTERVAL)
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 f2d6790b4f..65131d8703 100644
--- a/packages/boba/gateway/src/containers/modals/deposit/steps/InputStep.js
+++ b/packages/boba/gateway/src/containers/modals/deposit/steps/InputStep.js
@@ -1,5 +1,5 @@
-import React, { useEffect, useState } from 'react'
+import React, { useState } from 'react'
import { useDispatch, useSelector } from 'react-redux'
import { depositErc20, depositETHL2 } from 'actions/networkAction'
@@ -9,7 +9,6 @@ import Button from 'components/button/Button'
import Input from 'components/input/Input'
import { selectLoading } from 'selectors/loadingSelector'
-import { selectSignatureStatus_depositTRAD } from 'selectors/signatureSelector'
import { amountToUsd, logAmount, toWei_String } from 'util/amountConvert'
import { useTheme } from '@emotion/react'
@@ -23,7 +22,10 @@ import { selectActiveNetworkName } from 'selectors/networkSelector'
function InputStep({ handleClose, token, isBridge, openTokenPicker }) {
+ const theme = useTheme()
const dispatch = useDispatch()
+
+ const isMobile = useMediaQuery(theme.breakpoints.down('md'))
const [ enableToL2Account, setEnableToL2Account ] = useState(false);
const [ recipient, setRecipient ] = useState('');
const [ value, setValue ] = useState('')
@@ -33,7 +35,6 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) {
const depositLoading = useSelector(selectLoading([ 'DEPOSIT/CREATE' ]))
const networkName = useSelector(selectActiveNetworkName())
- const signatureStatus = useSelector(selectSignatureStatus_depositTRAD)
const lookupPrice = useSelector(selectLookupPrice)
const maxValue = logAmount(token.balance, token.decimals)
@@ -83,18 +84,6 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) {
}
- const theme = useTheme()
- const isMobile = useMediaQuery(theme.breakpoints.down('md'))
-
- useEffect(() => {
- if (signatureStatus && depositLoading) {
- //we are all set - can close the window
- //transaction has been sent and signed
- handleClose()
- }
- }, [ signatureStatus, depositLoading, handleClose ])
-
-
let buttonLabel_1 = 'Cancel'
if (depositLoading) buttonLabel_1 = 'Close'
@@ -200,7 +189,7 @@ function InputStep({ handleClose, token, isBridge, openTokenPicker }) {
networkService.supportedAltL1Chains.includes(i.value))
const dispatch = useDispatch()
+ const theme = useTheme()
+
+ const isMobile = useMediaQuery(theme.breakpoints.down('md'))
const [ value, setValue ] = useState('')
const [ altL1Bridge, setAltL1Bridge ] = useState('')
@@ -56,7 +58,6 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker })
const [ validValue, setValidValue ] = useState(false)
const depositLoading = useSelector(selectLoading([ 'DEPOSIT_ALTL1/CREATE' ]))
- const signatureStatus = useSelector(selectSignatureStatus_depositTRAD)
const lookupPrice = useSelector(selectLookupPrice)
const depositFees = useSelector(selectAltL1DepositCost)
const feeBalance = useSelector(selectL1FeeBalance) //amount of ETH on L1 to pay gas
@@ -94,22 +95,11 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker })
}
}
- const theme = useTheme()
- const isMobile = useMediaQuery(theme.breakpoints.down('md'))
-
useEffect(() => {
dispatch(fetchL1FeeBalance()) //ETH balance for paying gas
dispatch(fetchAltL1DepositFee())
},[dispatch])
- useEffect(() => {
- if (signatureStatus && depositLoading) {
- //we are all set - can close the window
- //transaction has been sent and signed
- handleClose()
- }
- }, [ signatureStatus, depositLoading, handleClose ])
-
let buttonLabel_1 = 'Cancel'
if (depositLoading) buttonLabel_1 = 'Close'
@@ -227,7 +217,7 @@ function InputStepMultiChain({ handleClose, token, isBridge, openTokenPicker })
0 &&
- stakeToken.symbol === 'ETH'
+ stakeToken.symbol === netLayerNativeToken
) {
//do not need to approve ETH
allowanceGTstake = true
@@ -321,7 +328,7 @@ class FarmDepositModal extends React.Component {
}
- {!allowanceGTstake && stakeToken.symbol !== 'ETH' &&
+ {!allowanceGTstake && stakeToken.symbol !== netLayerNativeToken &&
<>
{stakeValueValid &&
@@ -354,7 +361,7 @@ class FarmDepositModal extends React.Component {
{stakeValueValid && allowanceGTstake &&
<>
- {stakeToken.symbol !== 'ETH' &&
+ {stakeToken.symbol !== netLayerNativeToken &&
Your allowance has been approved. You can now stake your funds.
diff --git a/packages/boba/gateway/src/containers/modals/farm/FarmWithdrawModal.js b/packages/boba/gateway/src/containers/modals/farm/FarmWithdrawModal.js
index 87d2404e8a..552c65a46d 100644
--- a/packages/boba/gateway/src/containers/modals/farm/FarmWithdrawModal.js
+++ b/packages/boba/gateway/src/containers/modals/farm/FarmWithdrawModal.js
@@ -235,8 +235,9 @@ class FarmWithdrawModal extends React.Component {
{this.handleClose()}}
- color="neutral"
- size="large"
+ variant="outlined"
+ color='primary'
+ size='large'
>
Cancel
diff --git a/packages/boba/gateway/src/containers/modals/noMetaMask/InstallMetaMaskModal/InstallMetaMaskModal.js b/packages/boba/gateway/src/containers/modals/noMetaMask/InstallMetaMaskModal/InstallMetaMaskModal.js
index 8a38a01912..be0c69aed5 100644
--- a/packages/boba/gateway/src/containers/modals/noMetaMask/InstallMetaMaskModal/InstallMetaMaskModal.js
+++ b/packages/boba/gateway/src/containers/modals/noMetaMask/InstallMetaMaskModal/InstallMetaMaskModal.js
@@ -1,7 +1,7 @@
import React from 'react';
import { useDispatch } from 'react-redux';
-import { Box, Typography, Grid } from '@mui/material'
+import { Box, Typography } from '@mui/material'
import { Circle } from '@mui/icons-material'
import { closeModal } from 'actions/uiAction';
diff --git a/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js b/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js
index 56312947ea..5766132f8a 100644
--- a/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js
+++ b/packages/boba/gateway/src/containers/modals/transfer/TransferModal.js
@@ -224,8 +224,9 @@ function TransferModal ({ open, token, minHeight }) {
{!isMobile ? (
Cancel
diff --git a/packages/boba/gateway/src/containers/modals/transfer/TransferNFTModal.js b/packages/boba/gateway/src/containers/modals/transfer/TransferNFTModal.js
index 77879d5f4d..3777c1154d 100644
--- a/packages/boba/gateway/src/containers/modals/transfer/TransferNFTModal.js
+++ b/packages/boba/gateway/src/containers/modals/transfer/TransferNFTModal.js
@@ -91,8 +91,9 @@ function TransferNFTModal ({ open, token, minHeight }) {
{!isMobile ? (
Cancel
diff --git a/packages/boba/gateway/src/reducers/signatureReducer.js b/packages/boba/gateway/src/reducers/signatureReducer.js
index 47b96eaa8d..a0c3b4a48e 100644
--- a/packages/boba/gateway/src/reducers/signatureReducer.js
+++ b/packages/boba/gateway/src/reducers/signatureReducer.js
@@ -16,36 +16,26 @@ limitations under the License. */
const initialState = {
exitLPsigned: false,
exitTRADsigned: false,
- depositLPsigned: false,
- depositTRADsigned: false
+ depositLPsigned: false
}
function signatureReducer (state = initialState, action) {
switch (action.type) {
case 'EXIT/LP/SIGNED':
- console.log('exitLPsigned:',action.payload)
return {
...state,
exitLPsigned: action.payload
}
case 'EXIT/TRAD/SIGNED':
- console.log('exitTRADsigned:',action.payload)
return {
...state,
exitTRADsigned: action.payload
}
case 'DEPOSIT/LP/SIGNED':
- console.log('depositLPsigned:',action.payload)
return {
...state,
depositLPsigned: action.payload
}
- case 'DEPOSIT/TRAD/SIGNED':
- console.log('depositTRADsigned:',action.payload)
- return {
- ...state,
- depositTRADsigned: action.payload
- }
default:
return state;
}
diff --git a/packages/boba/gateway/src/selectors/signatureSelector.js b/packages/boba/gateway/src/selectors/signatureSelector.js
index 8be9686193..2c08908511 100644
--- a/packages/boba/gateway/src/selectors/signatureSelector.js
+++ b/packages/boba/gateway/src/selectors/signatureSelector.js
@@ -24,7 +24,3 @@ export function selectSignatureStatus_exitTRAD (state) {
export function selectSignatureStatus_depositLP (state) {
return state.signature.depositLPsigned
}
-
-export function selectSignatureStatus_depositTRAD (state) {
- return state.signature.depositTRADsigned
-}
diff --git a/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js b/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js
index 621133adc6..fc097ef629 100644
--- a/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js
+++ b/packages/boba/gateway/src/services/abi/BobaGasPriceOracle.abi.js
@@ -1,4 +1,5 @@
const BobaGasPriceOracleABI = [
+ 'function secondaryFeeTokenMinimum() public view returns (uint256)',
'function priceRatio() public view returns (uint256)',
'function bobaFeeTokenUsers(address) public view returns (bool user)',
'function secondaryFeeTokenUsers(address) public view returns (bool user)',
diff --git a/packages/boba/gateway/src/services/networkService.js b/packages/boba/gateway/src/services/networkService.js
index 22b9aebc2b..9f7f6995d2 100644
--- a/packages/boba/gateway/src/services/networkService.js
+++ b/packages/boba/gateway/src/services/networkService.js
@@ -41,8 +41,7 @@ import {
import {
updateSignatureStatus_exitLP,
updateSignatureStatus_exitTRAD,
- updateSignatureStatus_depositLP,
- updateSignatureStatus_depositTRAD
+ updateSignatureStatus_depositLP
} from 'actions/signAction'
// Base contracts
@@ -93,9 +92,9 @@ import GraphQLService from "./graphql.service"
import tokenInfo from "@boba/register/addresses/tokenInfo"
import { bobaBridges } from 'util/bobaBridges'
-import { SPEED_CHECK } from 'util/constant'
+import { MIN_NATIVE_L1_BALANCE, SPEED_CHECK } from 'util/constant'
import { getPoolDetail } from 'util/poolDetails'
-import { getNetworkDetail, NETWORK } from 'util/network/network.util'
+import { pingRpcUrl, getNetworkDetail, NETWORK, NETWORK_TYPE } from 'util/network/network.util'
import appService from './app.service'
import BobaGasPriceOracleABI from './abi/BobaGasPriceOracle.abi'
import L1StandardBridgeABI from './abi/L1StandardBridge.abi'
@@ -259,6 +258,27 @@ class NetworkService {
}
}
+ async estimateMinL1NativeTokenForFee() {
+ if(this.L1orL2 !== 'L2' ) return 0;
+
+ if (this.networkGateway === NETWORK.ETHEREUM) {
+ // for ethereum l1 fee is always const to 0.002.
+ return MIN_NATIVE_L1_BALANCE
+ } else {
+ // for alt l1 this fee can change
+ const bobaFeeContract = new ethers.Contract(
+ this.addresses.Boba_GasPriceOracle,
+ BobaGasPriceOracleABI,
+ this.provider.getSigner()
+ )
+
+ const minTokenForFee = await bobaFeeContract.secondaryFeeTokenMinimum();
+
+ return logAmount(minTokenForFee.toString(), 18)
+ }
+
+ }
+
async switchFee( targetFee ) {
if( this.L1orL2 !== 'L2' ) return
@@ -423,8 +443,16 @@ class NetworkService {
this.gasEstimateAccount = networkDetail.gasEstimateAccount
}
+ let activeL1RpcURL = networkDetail['L1']['rpcUrl'][0]
+ for (const rpcURL of networkDetail['L1']['rpcUrl']) {
+ if (await pingRpcUrl(rpcURL)) {
+ activeL1RpcURL = rpcURL
+ break
+ }
+ }
+
this.L1Provider = new ethers.providers.StaticJsonRpcProvider(
- networkDetail['L1']['rpcUrl']
+ activeL1RpcURL
)
this.L2Provider = new ethers.providers.StaticJsonRpcProvider(
@@ -443,6 +471,27 @@ class NetworkService {
const chainId = (await this.L1Provider.getNetwork()).chainId
this.tokenInfo = tokenInfo[chainId]
+ // fetch supported tokens, addresses, assets for network selected.
+ const tokenAsset = appService.fetchSupportedAssets({
+ network,
+ networkType
+ })
+
+ this.supportedTokens = tokenAsset.tokens;
+ this.supportedTokenAddresses = tokenAsset.tokenAddresses;
+ this.supportedAltL1Chains = tokenAsset.altL1Chains;
+
+ let addresses = {};
+ // setting up all address;
+ if (!!NETWORK[ network ]) {
+ addresses = appService.fetchAddresses({
+ network,
+ networkType
+ });
+ }
+
+ this.addresses = addresses
+
// this.AddressManagerAddress = nw[networkGateway].addressManager
// console.log("AddressManager address:",this.AddressManagerAddress)
@@ -645,27 +694,6 @@ class NetworkService {
networkType
})
- // fetch supported tokens, addresses, assets for network selected.
- const tokenAsset = appService.fetchSupportedAssets({
- network,
- networkType
- })
-
- this.supportedTokens = tokenAsset.tokens;
- this.supportedTokenAddresses = tokenAsset.tokenAddresses;
- this.supportedAltL1Chains = tokenAsset.altL1Chains;
-
- let addresses;
- // setting up all address;
- if (!!NETWORK[ network ]) {
- addresses = appService.fetchAddresses({
- network,
- networkType
- });
- }
-
- this.addresses = addresses
-
const L1ChainId = networkDetail['L1']['chainId']
const L2ChainId = networkDetail['L2']['chainId']
@@ -683,7 +711,9 @@ class NetworkService {
this.bindProviderListeners()
// this should not do anything unless we changed chains
- await this.getBobaFeeChoice()
+ if (this.L1orL2 === 'L2') {
+ await this.getBobaFeeChoice()
+ }
return this.L1orL2 // return the layer we are actually on
@@ -720,7 +750,7 @@ class NetworkService {
const chainParam = {
chainId: '0x' + networkDetail[targetLayer].chainId.toString(16),
chainName: networkDetail[targetLayer].name,
- rpcUrls: [networkDetail[targetLayer].rpcUrl],
+ rpcUrls: this.L1Provider.connection.url,
nativeCurrency: {
name: 'BOBA TOKEN',
symbol: 'BOBA',
@@ -729,17 +759,16 @@ class NetworkService {
blockExplorerUrls: [networkDetail['L2']?.blockExplorer?.slice(0, -1)]
}
- console.log([ 'Adding ethereum Chain', chainParam, targetIDHex ]);
await this.provider.send('wallet_addEthereumChain', [chainParam, this.account])
window.ethereum.on('chainChanged', handleChangeChainOnce)
return true
} catch (addError) {
console.log("MetaMask - Error adding new RPC: ", addError)
- return addError
+ throw new Error(addError.code)
}
} else { //some other error code
console.log("MetaMask - Switch Error: ", error.code)
- return error
+ throw new Error(error.code)
}
}
}
@@ -1161,8 +1190,6 @@ class NetworkService {
value_Wei_String
}) {
- updateSignatureStatus_depositTRAD(false)
-
try {
const time_start = new Date().getTime()
@@ -1220,9 +1247,6 @@ class NetworkService {
//at this point the tx has been submitted, and we are waiting...
await depositTX.wait()
-
- updateSignatureStatus_depositTRAD(true)
-
const opts = {
fromBlock: -4000
}
@@ -1801,7 +1825,8 @@ class NetworkService {
set to actual amount, unless current approval amount is equal to, or
bigger than, the current approval value
*/
- if( allowance_BN.lt(BigNumber.from(value_Wei_String)) &&
+ if (this.networkGateway === NETWORK.ETHEREUM
+ && allowance_BN.lt(BigNumber.from(value_Wei_String)) &&
(currency.toLowerCase() === allTokens.OMG.L1.toLowerCase())
)
{
@@ -1854,7 +1879,6 @@ class NetworkService {
approveContractAddress = this.addresses.L1StandardBridgeAddress,
contractABI = L1ERC20Json.abi
) {
-
try {
const ERC20Contract = new ethers.Contract(
@@ -1876,7 +1900,8 @@ class NetworkService {
set to actual amount, unless current approval amount is equal to, or
bigger than, the current approval value
*/
- if( allowance_BN.lt(BigNumber.from(value_Wei_String)) &&
+ if ( this.networkGateway === NETWORK.ETHEREUM &&
+ allowance_BN.lt(BigNumber.from(value_Wei_String)) &&
(currency.toLowerCase() === allTokens.OMG.L1.toLowerCase())
)
{
@@ -1943,8 +1968,6 @@ class NetworkService {
currency,
currencyL2 }) {
- updateSignatureStatus_depositTRAD(false)
-
const L1_TEST_Contract = this.L1_TEST_Contract.attach(currency)
let allowance_BN = await L1_TEST_Contract.allowance(
@@ -1958,7 +1981,8 @@ class NetworkService {
set to actual amount, unless current approval amount is equal to, or
bigger than, the current approval value
*/
- if( allowance_BN.lt(BigNumber.from(value_Wei_String)) &&
+ if (this.networkGateway === NETWORK.ETHEREUM &&
+ allowance_BN.lt(BigNumber.from(value_Wei_String)) &&
(currency.toLowerCase() === allTokens.OMG.L1.toLowerCase())
)
{
@@ -2021,27 +2045,19 @@ class NetworkService {
)
}
- console.log("depositTxStatus:",depositTX)
-
//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)
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 block = await this.L1Provider.getTransaction(depositTX.hash)
// const data = {
// "key": SPEED_CHECK,
// "hash": depositTX.hash,
@@ -2159,6 +2175,8 @@ class NetworkService {
/* Estimate cost of Classical Exit to L1 */
async getExitCost(currencyAddress) {
+ try {
+
let approvalCost_BN = BigNumber.from('0')
const gasPrice = await this.L2Provider.getGasPrice()
@@ -2188,12 +2206,23 @@ class NetworkService {
this.provider.getSigner()
)
+ const L2BillingContract = new ethers.Contract(
+ this.addresses.Proxy__BobaBillingContract,
+ L2BillingContractJson.abi,
+ this.L2Provider,
+ )
+ const exitFee = await L2BillingContract.exitFee()
+ let value = utils.parseEther('0.00001').add(exitFee)
+ if (this.networkGateway === NETWORK.ETHEREUM) {
+ value = utils.parseEther('0.00001')
+ }
+
const tx2 = await DiscretionaryExitFeeContract.populateTransaction.payAndWithdraw(
this.addresses.L2_ETH_Address,
utils.parseEther('0.00001'),
this.L1GasLimit,
ethers.utils.formatBytes32String(new Date().getTime().toString()),
- { value: utils.parseEther('0.00001') }
+ { value }
)
const gas_BN = await this.L2Provider.estimateGas({...tx2, from: this.gasEstimateAccount})
@@ -2205,8 +2234,12 @@ class NetworkService {
const totalCost = utils.formatEther(cost_BN.add(approvalCost_BN))
console.log("Classical exit total cost (ETH):", totalCost)
- //returns total cost in ETH
- return totalCost
+ //returns total cost in ETH
+ return totalCost
+ } catch (error) {
+ console.log(error);
+ return 0;
+ }
}
/***********************************************/
@@ -2424,7 +2457,7 @@ class NetworkService {
return acc
}, [{
L1: this.addresses.L1_ETH_Address,
- L2: this.addresses.L2_ETH_Address
+ L2: this.addresses[`TK_L2${this.L1NativeTokenSymbol}`]
}])
const L2LPContract = new ethers.Contract(
@@ -2567,6 +2600,12 @@ class NetworkService {
console.log("Approve cost in ETH:", utils.formatEther(approvalCost_BN))
}
+ if (this.networkGateway !== NETWORK.ETHEREUM) {
+ otherField = {
+ ...otherField,
+ value: utils.parseEther('1.0')
+ }
+ }
// Second, we need the addLiquidity cost
// all ERC20s will be the same, so use the BOBA contract
const tx2 = await this.L2LPContract
@@ -2677,35 +2716,36 @@ class NetworkService {
// TODO: Below part is disabled
- const opts = {
- fromBlock: -4000
- }
- const receipt = await this.watcher.waitForMessageReceipt(depositTX, opts)
- console.log(' completed swap-on ! L2 tx hash:', receipt.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
- }
-
- console.log("Speed checker data payload:", data)
+ /*
+ const opts = {
+ fromBlock: -4000
+ }
+ const receipt = await this.watcher.waitForMessageReceipt(depositTX, opts)
+ console.log(' completed swap-on ! L2 tx hash:', receipt.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 speed = await omgxWatcherAxiosInstance(
- this.networkConfig
- ).post('send.crossdomainmessage', data)
+ console.log("Speed checker data payload:", data)
- console.log("Speed checker:", speed)
+ const speed = await omgxWatcherAxiosInstance(
+ this.networkConfig
+ ).post('send.crossdomainmessage', data)
- return receipt
+ console.log("Speed checker:", speed)
+ */
+ return true
} catch (error) {
console.log("NS: depositL1LP error:", error)
@@ -2943,6 +2983,21 @@ class NetworkService {
console.log("Approve cost in ETH:", utils.formatEther(approvalCost_BN))
}
+ const L2BillingContract = new ethers.Contract(
+ this.addresses.Proxy__BobaBillingContract,
+ L2BillingContractJson.abi,
+ this.L2Provider,
+ )
+
+ const approvalAmount = await L2BillingContract.exitFee()
+
+ let value;
+ if (this.networkGateway === NETWORK.ETHEREUM) {
+ value = currencyAddress === this.addresses.L2_ETH_Address ? { value: '1' } : {};
+ } else {
+ value = currencyAddress === this.addresses.L2_ETH_Address ? { value: approvalAmount.add('1') } : { value: approvalAmount };
+ }
+
//in some cases zero not allowed
const tx2 = await this.L2LPContract
.connect(this.provider.getSigner())
@@ -2950,13 +3005,13 @@ class NetworkService {
.clientDepositL2(
currencyAddress === this.addresses.L2_ETH_Address ? '1' : '0', //ETH does not allow zero
currencyAddress,
- currencyAddress === this.addresses.L2_ETH_Address ? { value : '1'} : {}
+ value
)
const depositGas_BN = await this.L2Provider.estimateGas({...tx2, from: this.gasEstimateAccount})
let l1SecurityFee = BigNumber.from('0')
- if (this.networkGateway === 'mainnet') {
+ if (this.networkType === NETWORK_TYPE.MAINNET) {
delete tx2.from
l1SecurityFee = await this.gasOracleContract.getL1Fee(
utils.serializeTransaction(tx2)
@@ -3322,7 +3377,7 @@ class NetworkService {
.connect(this.provider.getSigner()).clientDepositL2(
value_Wei_String,
currencyAddress,
- currencyAddress === this.addresses.L2_ETH_Address ? { value: value_Wei_String } : {}
+ currencyAddress === this.addresses.L2_ETH_Address ? { value: value_Wei_String } : {value: BobaApprovalAmount}
)
//at this point the tx has been submitted, and we are waiting...
@@ -3334,36 +3389,36 @@ class NetworkService {
//closes the modal
updateSignatureStatus_exitLP(true)
- const opts = {
- fromBlock: -4000
- }
- const receipt = await this.fastWatcher.waitForMessageReceipt(depositTX, opts)
- const txReceipt = receipt.transactionReceipt;
- console.log(' completed Deposit! L1 tx hash:', txReceipt.transactionHash)
+ // const opts = {
+ // fromBlock: -4000
+ // }
+ // const receipt = await this.fastWatcher.waitForMessageReceipt(depositTX, opts)
+ // 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)
+ // const time_stop = new Date().getTime()
+ // console.log("TX finish time:", time_stop)
- const data = {
- "key": SPEED_CHECK,
- "hash": depositTX.hash,
- "l1Tol2": false, //since we are going L2->L1
- "startTime": time_start,
- "endTime": time_stop,
- "block": block.blockNumber,
- "cdmHash": txReceipt.transactionHash,
- "cdmBlock": txReceipt.blockNumber
- }
+ // const data = {
+ // "key": SPEED_CHECK,
+ // "hash": depositTX.hash,
+ // "l1Tol2": false, //since we are going L2->L1
+ // "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.networkConfig
- ).post('send.crossdomainmessage', data)
+ // const speed = await omgxWatcherAxiosInstance(
+ // this.networkConfig
+ // ).post('send.crossdomainmessage', data)
- console.log("Speed checker:", speed)
+ // console.log("Speed checker:", speed)
- return txReceipt
+ return true
} catch (error) {
console.log("NS: depositL2LP error:", error)
return error
diff --git a/packages/boba/gateway/src/util/constant.js b/packages/boba/gateway/src/util/constant.js
index 6c5ee44990..02f51fb942 100644
--- a/packages/boba/gateway/src/util/constant.js
+++ b/packages/boba/gateway/src/util/constant.js
@@ -16,8 +16,6 @@ export const INFURA_ID = process.env.REACT_APP_INFURA_ID
export const MAX_HEALTH_BLOCK_LAG = process.env.REACT_APP_MAX_HEALTH_BLOCK_LAG
export const WALLET_VERSION = process.env.REACT_APP_WALLET_VERSION
export const APP_STATUS = process.env.REACT_APP_STATUS || 'normal'
-export const SELLER_OPTIMISM_API_URL = process.env.REACT_APP_SELLER_OPTIMISM_API_URL
-export const SERVICE_OPTIMISM_API_URL = process.env.REACT_APP_SERVICE_OPTIMISM_API_URL
export const SPEED_CHECK = process.env.REACT_APP_SPEED_CHECK
export const TARGET_CHAIN_URL = process.env.REACT_APP_TARGET_CHAIN_URL
// VE DAO FLAG
@@ -100,3 +98,5 @@ export const DEFAULT_NETWORK = {
export const MM_EXTENTION_URL = 'https://chrome.google.com/webstore/detail/metamask/nkbihfbeogaeaoehlefnkodbefgpgknn?hl=en'
+
+export const MIN_NATIVE_L1_BALANCE = 0.002
diff --git a/packages/boba/gateway/src/util/masterConfig.js b/packages/boba/gateway/src/util/masterConfig.js
index 4673e44771..661c8dc52f 100644
--- a/packages/boba/gateway/src/util/masterConfig.js
+++ b/packages/boba/gateway/src/util/masterConfig.js
@@ -16,10 +16,6 @@ import {
const BaseServices = {
WALLET_SERVICE: `https://api-service.boba.network/`,
- //relevant to local?
- SERVICE_OPTIMISM_API_URL: `https://zlba6djrv6.execute-api.us-west-1.amazonaws.com/prod/`,
- //relevant to local?
- WEBSOCKET_API_URL: `wss://d1cj5xnal2.execute-api.us-west-1.amazonaws.com/prod`,
//Coing gecko url
COIN_GECKO_URL: `https://api.coingecko.com/api/v3/`,
//ETH gas station
diff --git a/packages/boba/gateway/src/util/network/config/avax.js b/packages/boba/gateway/src/util/network/config/avax.js
index 2216835ff3..823df72c9f 100644
--- a/packages/boba/gateway/src/util/network/config/avax.js
+++ b/packages/boba/gateway/src/util/network/config/avax.js
@@ -9,7 +9,10 @@ export const avaxConfig = {
name: "Avalanche Testnet",
chainId: 43113,
chainIdHex: '0xA869',
- rpcUrl: `https://api.avax-test.network/ext/bc/C/rpc`,
+ rpcUrl: [
+ `https://api.avax-test.network/ext/bc/C/rpc`,
+ `https://rpc.ankr.com/avalanche_fuji`,
+ ],
transaction: `https://testnet.snowtrace.io/tx/`,
blockExplorerUrl: `https://testnet.snowtrace.io/`,
symbol: "AVAX",
@@ -36,7 +39,11 @@ export const avaxConfig = {
name: "Avalanche Mainnet",
chainId: 43114,
chainIdHex: '0xA86A',
- rpcUrl: `https://api.avax.network/ext/bc/C/rpc`,
+ rpcUrl: [
+ `https://api.avax.network/ext/bc/C/rpc`,
+ `https://rpc.ankr.com/avalanche`,
+ `https://1rpc.io/avax/c`,
+ ],
transaction: `https://snowtrace.io/tx/`,
blockExplorerUrl: `https://snowtrace.io/`,
symbol: "AVAX",
diff --git a/packages/boba/gateway/src/util/network/config/bnb.js b/packages/boba/gateway/src/util/network/config/bnb.js
index 0098821680..c5ad778b0d 100644
--- a/packages/boba/gateway/src/util/network/config/bnb.js
+++ b/packages/boba/gateway/src/util/network/config/bnb.js
@@ -9,7 +9,11 @@ export const bnbConfig = {
name: "BNB Testnet",
chainId: 97,
chainIdHex: '0x61',
- rpcUrl: `https://data-seed-prebsc-1-s1.binance.org:8545`,
+ rpcUrl: [
+ `https://data-seed-prebsc-1-s1.binance.org:8545`,
+ `https://data-seed-prebsc-2-s1.binance.org:8545`,
+ `https://bsc-testnet.public.blastapi.io`,
+ ],
transaction: `https://testnet.bscscan.com/tx/`,
blockExplorerUrl: `https://testnet.bscscan.com/`,
symbol: "tBNB",
@@ -36,7 +40,11 @@ export const bnbConfig = {
name: "Binance Smart Chain Mainnet",
chainId: 56,
chainIdHex: '0x38',
- rpcUrl: `https://bsc-dataseed.binance.org`,
+ rpcUrl: [
+ `https://bsc-dataseed.binance.org`,
+ `https://rpc.ankr.com/bsc`,
+ `https://1rpc.io/bnb`,
+ ],
transaction: `https://bscscan.com/tx/`,
blockExplorerUrl: `https://bscscan.com/`,
symbol: "BNB",
diff --git a/packages/boba/gateway/src/util/network/config/ethereum.js b/packages/boba/gateway/src/util/network/config/ethereum.js
index 80a7a3d05b..292b737905 100644
--- a/packages/boba/gateway/src/util/network/config/ethereum.js
+++ b/packages/boba/gateway/src/util/network/config/ethereum.js
@@ -11,7 +11,10 @@ export const ethereumConfig = {
name: "Goerli",
chainId: 5,
chainIdHex: '0x5',
- rpcUrl: `https://goerli.infura.io/v3/${INFURA_ID}`,
+ rpcUrl: [
+ `https://goerli.infura.io/v3/${INFURA_ID}`,
+ `https://rpc.ankr.com/eth_goerli`,
+ ],
transaction: `https://goerli.etherscan.io/tx/`,
blockExplorerUrl: `https://goerli.etherscan.io/`,
symbol: 'ETH',
@@ -26,14 +29,6 @@ export const ethereumConfig = {
transaction: `https://testnet.bobascan.com/tx/`,
blockExplorerUrl: `https://testnet.bobascan.com/`
},
- ALTL1: {
- name: "Alt L1s",
- // chainId: 28,
- // chainIdHex: '0x1C',
- rpcUrl: ``,
- // blockExplorer: `https://testnet.bobascan.com/`,
- // transaction: `https://testnet.bobascan.com/tx/`
- },
payloadForL1SecurityFee: {
from: '0x122816e7A7AeB40601d0aC0DCAA8402F7aa4cDfA',
to: '0x4df04E20cCd9a8B82634754fcB041e86c5FF085A',
@@ -61,7 +56,11 @@ export const ethereumConfig = {
name: "Mainnet",
chainId: 1,
chainIdHex: '0x1',
- rpcUrl: `https://mainnet.infura.io/v3/${INFURA_ID}`,
+ rpcUrl: [
+ `https://mainnet.infura.io/v3/${INFURA_ID}`,
+ `https://rpc.ankr.com/eth`,
+ `https://cloudflare-eth.com`,
+ ],
transaction: ` https://etherscan.io/tx/`,
blockExplorerUrl: `https://etherscan.io/`,
symbol: 'ETH',
diff --git a/packages/boba/gateway/src/util/network/config/fantom.js b/packages/boba/gateway/src/util/network/config/fantom.js
index 9d0aeff988..f8ad8863d8 100644
--- a/packages/boba/gateway/src/util/network/config/fantom.js
+++ b/packages/boba/gateway/src/util/network/config/fantom.js
@@ -9,7 +9,11 @@ export const fantomConfig = {
name: "Fantom Testnet",
chainId: 4002,
chainIdHex: '0xFA2',
- rpcUrl: `https://rpc.testnet.fantom.network`,
+ rpcUrl: [
+ `https://rpc.testnet.fantom.network`,
+ `https://rpc.ankr.com/fantom_testnet`,
+ `https://fantom-testnet.public.blastapi.io`,
+ ],
transaction: `https://testnet.ftmscan.com/tx/`,
blockExplorerUrl: `https://testnet.ftmscan.com/`,
symbol: 'FTM',
@@ -36,7 +40,11 @@ export const fantomConfig = {
name: "Fantom Mainnet",
chainId: 250,
chainIdHex: '0xFA',
- rpcUrl: `https://rpc.fantom.network`,
+ rpcUrl: [
+ `https://rpc.fantom.network`,
+ `https://rpc.ankr.com/fantom`,
+ `https://1rpc.io/ftm`,
+ ],
transaction: `https://ftmscan.com/tx/`,
blockExplorerUrl: `https://ftmscan.com/`,
symbol: 'FTM',
diff --git a/packages/boba/gateway/src/util/network/config/moonbeam.js b/packages/boba/gateway/src/util/network/config/moonbeam.js
index da0db9ac5e..59bb154f10 100644
--- a/packages/boba/gateway/src/util/network/config/moonbeam.js
+++ b/packages/boba/gateway/src/util/network/config/moonbeam.js
@@ -8,7 +8,11 @@ export const moonbeamConfig = {
name: "MoonBase",
chainId: 1287,
chainIdHex: '0x507',
- rpcUrl: `https://rpc.api.moonbase.moonbeam.network`,
+ rpcUrl: [
+ `https://rpc.api.moonbase.moonbeam.network`,
+ `https://moonbase-alpha.public.blastapi.io`,
+ `https://moonbeam-alpha.api.onfinality.io/public`,
+ ],
transaction: `https://moonbase.moonscan.io/tx/`,
blockExplorerUrl: `https://moonbase.moonscan.io`,
symbol: 'DEV',
@@ -35,7 +39,11 @@ export const moonbeamConfig = {
name: "MoonBeam",
chainId: 1284,
chainIdHex: '0x504',
- rpcUrl: `https://rpc.api.moonbeam.network`,
+ rpcUrl: [
+ `https://rpc.api.moonbeam.network`,
+ `https://rpc.ankr.com/moonbeam`,
+ `https://1rpc.io/glmr`,
+ ],
transaction: `https://moonscan.io/tx/`,
blockExplorerUrl: `https://moonscan.io/`,
symbol: "GLMR",
diff --git a/packages/boba/gateway/src/util/network/network.util.js b/packages/boba/gateway/src/util/network/network.util.js
index dbf9f7366c..333dc63d3e 100644
--- a/packages/boba/gateway/src/util/network/network.util.js
+++ b/packages/boba/gateway/src/util/network/network.util.js
@@ -1,3 +1,5 @@
+import { providers } from 'ethers';
+
import EthereumIcon from 'components/icons/chain/L1/EthereumIcon';
import BNBIcon from 'components/icons/chain/L1/BNBIcon';
import AvalancheIcon from 'components/icons/chain/L1/AvalancheIcon';
@@ -284,3 +286,16 @@ export const getBlockExplorerUrl = ({
}) => {
return networkConfig[network][networkType][layer]?.blockExplorerUrl
}
+
+export const pingRpcUrl = async (
+ rpcUrl,
+) => {
+ const provider = new providers.JsonRpcProvider(rpcUrl)
+ try {
+ await provider.getBlockNumber()
+ return true
+ } catch (e) {
+ console.log(`Error pinging Rpc Url: ${rpcUrl}`)
+ return false
+ }
+}