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 }) { 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 ? ( 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 ? ( 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 + } +}