Skip to content

Commit 432e15b

Browse files
authored
feat: gho bridging to ink (#2667)
1 parent 9a9c573 commit 432e15b

File tree

6 files changed

+101
-33
lines changed

6 files changed

+101
-33
lines changed

src/components/transactions/Bridge/BridgeConfig.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import { ENABLE_TESTNET } from 'src/utils/marketsAndNetworksConfig';
2020
export const bridgeGasLimit = '252000';
2121

2222
type Config = {
23-
sourceChainId: ChainId;
23+
sourceChainId: ChainId | number;
2424
router: string;
2525
chainSelector: string;
2626
subgraphUrl: string;
@@ -201,6 +201,28 @@ const prodConfig: Config[] = [
201201
},
202202
],
203203
},
204+
{
205+
sourceChainId: 57073,
206+
chainSelector: '3461204551265785888',
207+
burnMintTokenPool: '0xDe6539018B095353A40753Dc54C91C68c9487D4E',
208+
router: '0xca7c90A52B44E301AC01Cb5EB99b2fD99339433A',
209+
tokenOracle: '0x20fd5f3FCac8883a3A0A2bBcD658A2d2c6EFa6B6',
210+
wrappedNativeOracle: '0xA17887fd35B14A4c6e6ec87458591941934d444c',
211+
subgraphUrl: `https://gateway.thegraph.com/api/${process.env.NEXT_PUBLIC_SUBGRAPH_API_KEY}/subgraphs/id/CZxebNCRkL9RHpFcQcDnRdQMB4yBM8PFgz5NKEHKtrw6`,
212+
feeTokens: [
213+
{
214+
name: 'Ethereum',
215+
symbol: 'ETH',
216+
decimals: 18,
217+
address: constants.AddressZero, // Use zero address for network token ccip
218+
chainId: 57073,
219+
extensions: {
220+
isNative: true,
221+
},
222+
balance: '0',
223+
},
224+
],
225+
},
204226
];
205227

206228
const testnetConfig: Config[] = [

src/components/transactions/Bridge/BridgeModalContent.tsx

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { AaveV3InkWhitelabel } from '@bgd-labs/aave-address-book';
12
import { SwitchVerticalIcon } from '@heroicons/react/outline';
23
import { Trans } from '@lingui/macro';
34
import {
@@ -24,7 +25,7 @@ import {
2425
} from 'src/components/transactions/FlowCommons/TxModalDetails';
2526
import { NetworkSelect } from 'src/components/transactions/NetworkSelect';
2627
import { ConnectWalletButton } from 'src/components/WalletConnection/ConnectWalletButton';
27-
import { useBridgeTokens } from 'src/hooks/bridge/useBridgeWalletBalance';
28+
import { useBridgeTokens, UseBridgeTokensParams } from 'src/hooks/bridge/useBridgeWalletBalance';
2829
import { TokenInfoWithBalance, useTokensBalance } from 'src/hooks/generic/useTokensBalance';
2930
import { useModalContext } from 'src/hooks/useModal';
3031
import { useWeb3Context } from 'src/libs/hooks/useWeb3Context';
@@ -53,7 +54,34 @@ import { useGetBridgeMessage } from './useGetBridgeMessage';
5354
import { useTimeToDestination } from './useGetFinalityTime';
5455

5556
const defaultNetwork = supportedNetworksWithBridge[0];
56-
const defaultNetworkMarket = marketsData[defaultNetwork.chainId];
57+
58+
function getUseBridgeTokensParams(chainId: number): UseBridgeTokensParams {
59+
const tokenOracle = getConfigFor(chainId).tokenOracle;
60+
61+
if (chainId === 57073) {
62+
// no market config available yet for ink, so values are set here
63+
return {
64+
chainId,
65+
ghoTokenAddress: '0xfc421aD3C883Bf9E7C4f42dE845C4e4405799e73',
66+
tokenOracle,
67+
walletBalanceProviderAddress: AaveV3InkWhitelabel.WALLET_BALANCE_PROVIDER,
68+
};
69+
}
70+
71+
const market = Object.values(marketsData).filter(
72+
(md) => md.chainId === chainId && md.v3 === true && md.addresses.GHO_TOKEN_ADDRESS
73+
)[0];
74+
if (!market || !market.addresses.GHO_TOKEN_ADDRESS) {
75+
throw new Error('Market not found');
76+
}
77+
78+
return {
79+
chainId,
80+
ghoTokenAddress: market.addresses.GHO_TOKEN_ADDRESS,
81+
tokenOracle: getConfigFor(chainId).tokenOracle,
82+
walletBalanceProviderAddress: market.addresses.WALLET_BALANCE_PROVIDER,
83+
};
84+
}
5785

5886
export const BridgeModalContent = () => {
5987
const { mainTxState: bridgeTxState, txError, close, gasLimit } = useModalContext();
@@ -121,19 +149,8 @@ export const BridgeModalContent = () => {
121149
setMaxSelected(false);
122150
}, [sourceNetworkObj]);
123151

124-
// Find v3 market for briding as all markets are on v3
125-
const findMarketData = (chainId: number) => {
126-
const allMarkets = Object.values(marketsData).filter((elem) => elem.chainId === chainId);
127-
const v3Market = allMarkets.find((market) => market.v3 === true);
128-
return v3Market || allMarkets[0] || defaultNetworkMarket;
129-
};
130-
131-
const selectedMarketData = findMarketData(sourceNetworkObj.chainId);
132-
133-
const { data: sourceTokenInfo, isFetching: fetchingBridgeTokenBalance } = useBridgeTokens(
134-
selectedMarketData,
135-
getConfigFor(sourceNetworkObj.chainId).tokenOracle
136-
);
152+
const params = getUseBridgeTokensParams(sourceNetworkObj.chainId);
153+
const { data: sourceTokenInfo, isFetching: fetchingBridgeTokenBalance } = useBridgeTokens(params);
137154

138155
const isWrongNetwork = currentChainId !== sourceNetworkObj.chainId;
139156

@@ -306,6 +323,9 @@ export const BridgeModalContent = () => {
306323
</TextWithTooltip>
307324
);
308325

326+
// There's no market config available for ink yet, so skip showing gas station since it relies on having a market
327+
const showGasStation = sourceNetworkObj.chainId !== 57073;
328+
309329
return (
310330
<>
311331
<Box display="flex" justifyContent="space-between" alignItems="center">
@@ -419,7 +439,11 @@ export const BridgeModalContent = () => {
419439
sourceChainId={sourceNetworkObj.chainId}
420440
/>
421441
</Box>
422-
<TxModalDetails gasLimit={gasLimit} chainId={sourceNetworkObj.chainId}>
442+
<TxModalDetails
443+
gasLimit={gasLimit}
444+
chainId={sourceNetworkObj.chainId}
445+
showGasStation={showGasStation}
446+
>
423447
<BridgeAmount
424448
amount={amount}
425449
maxAmountToBridgeFormatted={maxAmountToBridgeFormatted}

src/hooks/bridge/useBridgeWalletBalance.tsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
import { useQuery } from '@tanstack/react-query';
22
import { BigNumber, Contract } from 'ethers';
33
import { useRootStore } from 'src/store/root';
4-
import { MarketDataType } from 'src/ui-config/marketsConfig';
54
import { POLLING_INTERVAL, queryKeysFactory } from 'src/ui-config/queries';
65
import { useSharedDependencies } from 'src/ui-config/SharedDependenciesProvider';
76
import { getProvider } from 'src/utils/marketsAndNetworksConfig';
87

9-
export const useBridgeTokens = (currentMarketData: MarketDataType, tokenOracle: string) => {
8+
export interface UseBridgeTokensParams {
9+
chainId: number;
10+
ghoTokenAddress: string;
11+
tokenOracle: string;
12+
walletBalanceProviderAddress: string;
13+
}
14+
15+
export const useBridgeTokens = ({
16+
chainId,
17+
ghoTokenAddress,
18+
tokenOracle,
19+
walletBalanceProviderAddress,
20+
}: UseBridgeTokensParams) => {
1021
const { poolTokensBalanceService } = useSharedDependencies();
1122
const user = useRootStore((store) => store.account);
1223

1324
return useQuery({
1425
queryFn: async () => {
15-
const provider = getProvider(currentMarketData.chainId);
26+
const provider = getProvider(chainId);
1627
const oracle = new Contract(
1728
tokenOracle,
1829
[
@@ -28,7 +39,9 @@ export const useBridgeTokens = (currentMarketData: MarketDataType, tokenOracle:
2839
]);
2940

3041
const balances = await poolTokensBalanceService.getGhoBridgeBalancesTokenBalances(
31-
currentMarketData,
42+
chainId,
43+
ghoTokenAddress,
44+
walletBalanceProviderAddress,
3245
user
3346
);
3447

@@ -37,14 +50,14 @@ export const useBridgeTokens = (currentMarketData: MarketDataType, tokenOracle:
3750
tokenPriceUSD: latestAnswer.toNumber() / BigNumber.from(10).pow(decimals).toNumber(),
3851
};
3952
},
40-
queryKey: queryKeysFactory.getGhoBridgeBalances(user, currentMarketData),
53+
queryKey: queryKeysFactory.getGhoBridgeBalances(user, chainId),
4154
enabled: !!user,
4255
refetchInterval: POLLING_INTERVAL,
4356
initialData: {
4457
bridgeTokenBalance: '0',
4558
bridgeTokenBalanceFormatted: '0',
4659
tokenPriceUSD: 1,
47-
address: currentMarketData.addresses.GHO_TOKEN_ADDRESS,
60+
address: ghoTokenAddress,
4861
},
4962
});
5063
};

src/hooks/useBridgeTransactionHistory.tsx

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,20 @@ const sendRequestsQuery = gql`
6161
`;
6262

6363
const getSendRequests = async (url: string, sender: string) => {
64-
const result = await request<{ ccipsendRequests: SubgraphBridgeTransaction[] }>(
64+
let result: { ccipsendRequests: SubgraphBridgeTransaction[] } = { ccipsendRequests: [] };
65+
try {
66+
result = await request<{ ccipsendRequests: SubgraphBridgeTransaction[] }>(
6567
url,
6668
sendRequestsQuery,
6769
{
6870
sender,
69-
}
70-
);
71+
}
72+
);
73+
} catch (e) {
74+
console.error(e);
75+
// silently fail so other network txs are still shown
76+
return [];
77+
}
7178

7279
return result.ccipsendRequests
7380
.map((tx) => {

src/services/WalletBalanceService.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,27 +79,29 @@ export class WalletBalanceService {
7979
}
8080

8181
async getGhoBridgeBalancesTokenBalances(
82-
marketData: MarketDataType,
82+
chainId: number,
83+
ghoTokenAddress: string,
84+
walletBalanceProviderAddress: string,
8385
user: string
8486
): Promise<{
8587
bridgeTokenBalance: string;
8688
bridgeTokenBalanceFormatted: string;
8789
address: string;
8890
}> {
8991
const walletBalanceService = this.getWalletBalanceService(
90-
marketData.chainId,
91-
marketData.addresses.WALLET_BALANCE_PROVIDER
92+
chainId,
93+
walletBalanceProviderAddress
9294
);
9395

9496
const balances = await walletBalanceService.batchBalanceOf(
9597
[user],
96-
[marketData.addresses.GHO_TOKEN_ADDRESS?.toLowerCase() as string] // GHO UNDERLYING
98+
[ghoTokenAddress?.toLowerCase() as string] // GHO UNDERLYING
9799
);
98100

99101
return {
100102
bridgeTokenBalance: balances[0].toString(),
101103
bridgeTokenBalanceFormatted: formatUnits(balances[0].toString(), 18),
102-
address: marketData.addresses.GHO_TOKEN_ADDRESS as string,
104+
address: ghoTokenAddress,
103105
};
104106
}
105107
}

src/ui-config/queries.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,10 @@ export const queryKeysFactory = {
163163
chainId,
164164
'tokenDelegatees',
165165
],
166-
getGhoBridgeBalances: (user: string, marketData: MarketDataType) => [
166+
getGhoBridgeBalances: (user: string, chainId: number) => [
167167
...queryKeysFactory.gho,
168168
...queryKeysFactory.user(user),
169-
...queryKeysFactory.market(marketData),
169+
chainId,
170170
'getGhoBridgeBalances',
171171
],
172172
migrationExceptions: (

0 commit comments

Comments
 (0)