Skip to content

Commit 4f81524

Browse files
authored
Merge pull request #292 from DefiLlama/Add-SuiBridge
Add SuiBridge Adapter
2 parents 2d51490 + 71506fb commit 4f81524

File tree

3 files changed

+123
-3
lines changed

3 files changed

+123
-3
lines changed

src/adapters/index.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,10 @@ import memebridge from "./memebridge";
6565
import bunnyfi from "./bunnyfi";
6666
import minibridge from "./minibridge";
6767
import cometbridge from "./cometbridge";
68-
import fastbtc from "./rootstock-fastbtc-bridge"
69-
import crowdswap from "./crowdswap"
70-
import mint from "./mint"
68+
import fastbtc from "./rootstock-fastbtc-bridge";
69+
import crowdswap from "./crowdswap";
70+
import mint from "./mint";
71+
import suibridge from "./suibridge";
7172

7273
export default {
7374
polygon,
@@ -139,6 +140,7 @@ export default {
139140
fastbtc,
140141
crowdswap,
141142
mint,
143+
suibridge,
142144
} as {
143145
[bridge: string]: BridgeAdapter;
144146
};

src/adapters/suibridge/index.ts

+108
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import { BigNumber, ethers } from "ethers";
2+
import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeAdapter.type";
3+
import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions";
4+
import { getProvider } from "@defillama/sdk";
5+
6+
const WETH = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
7+
const WBTC = "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599";
8+
const USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
9+
const SUI_BRIDGE = "0xda3bD1fE1973470312db04551B65f401Bc8a92fD";
10+
const SUI_BRIDGE_CONFIG = "0x72D34Fe82c71Bf8120647518e5128e53106a1540";
11+
12+
const erc20DepositParams: PartialContractEventParams = {
13+
target: SUI_BRIDGE,
14+
topic: "TokensDeposited(uint8,uint64,uint8,uint8,uint64,address,bytes)",
15+
abi: [
16+
"event TokensDeposited(uint8 indexed sourceChainID, uint64 indexed nonce, uint8 indexed destinationChainID, uint8 tokenID, uint64 suiAdjustedAmount, address senderAddress, bytes recipientAddress)",
17+
],
18+
logKeys: {
19+
blockNumber: "blockNumber",
20+
txHash: "transactionHash",
21+
},
22+
argKeys: {
23+
from: "senderAddress",
24+
to: "recipientAddress",
25+
amount: "suiAdjustedAmount",
26+
token: "tokenID",
27+
},
28+
argGetters: {
29+
token: (log) => getTokenAddressFromTokenID(log.tokenID),
30+
},
31+
fixedEventData: {
32+
to: SUI_BRIDGE,
33+
},
34+
isDeposit: true,
35+
};
36+
37+
const erc20WithdrawParams: PartialContractEventParams = {
38+
target: SUI_BRIDGE,
39+
topic: "TokensClaimed(uint8,uint64,uint8,uint8,uint256,bytes,address)",
40+
abi: [
41+
"event TokensClaimed(uint8 indexed sourceChainID, uint64 indexed nonce, uint8 indexed destinationChainID, uint8 tokenID, uint256 erc20AdjustedAmount, bytes senderAddress, address recipientAddress)",
42+
],
43+
logKeys: {
44+
blockNumber: "blockNumber",
45+
txHash: "transactionHash",
46+
},
47+
argKeys: {
48+
from: "senderAddress",
49+
to: "recipientAddress",
50+
amount: "erc20AdjustedAmount",
51+
token: "tokenID"
52+
},
53+
argGetters: {
54+
token: (log) => getTokenAddressFromTokenID(log.tokenID),
55+
},
56+
fixedEventData: {
57+
from: SUI_BRIDGE,
58+
},
59+
isDeposit: false,
60+
};
61+
62+
const constructParams = () => {
63+
const eventParams = [erc20WithdrawParams, erc20DepositParams];
64+
return async (fromBlock: number, toBlock: number) => {
65+
const eventLogsRes = await getTxDataFromEVMEventLogs("suibridge", "ethereum", fromBlock, toBlock, eventParams);
66+
return eventLogsRes.map((event) => {
67+
if (event.isDeposit) {
68+
let erc20TokenAmount = formatSuiAmount(event.amount, event.token);
69+
event.amount = erc20TokenAmount;
70+
}
71+
return event;
72+
});
73+
};
74+
};
75+
76+
// TODO: use config contract read to get the token address from tokenID
77+
const getTokenAddressFromTokenID = (tokenID: number) => {
78+
switch (tokenID) {
79+
case 2:
80+
return WETH;
81+
case 3:
82+
return WBTC;
83+
case 4:
84+
return USDT;
85+
default:
86+
return "";
87+
}
88+
}
89+
90+
// TODO: get decimal values from on chain contract call
91+
const formatSuiAmount = (amount: BigNumber, token: string) => {
92+
switch (token) {
93+
case WETH:
94+
return amount.mul(10**10);
95+
case WBTC:
96+
return amount.mul(10**10);
97+
case USDT:
98+
return amount.mul(10**12);
99+
default:
100+
return amount;
101+
}
102+
}
103+
104+
const adapter: BridgeAdapter = {
105+
ethereum: constructParams(),
106+
};
107+
108+
export default adapter;

src/data/bridgeNetworkData.ts

+10
Original file line numberDiff line numberDiff line change
@@ -1521,4 +1521,14 @@ export default [
15211521
chains: ["Ethereum", "Mint"],
15221522
destinationChain: "Mint",
15231523
},
1524+
{
1525+
id: 73,
1526+
displayName: "Sui Bridge",
1527+
bridgeDbName: "suibridge",
1528+
iconLink: "icons:sui",
1529+
largeTxThreshold: 10000,
1530+
url: "https://sui.io/",
1531+
chains: ["Ethereum", "Sui"],
1532+
destinationChain: "Sui",
1533+
},
15241534
] as BridgeNetwork[];

0 commit comments

Comments
 (0)