Skip to content

Commit e8fc423

Browse files
authored
Merge pull request #297 from arkoc/layerswap
feat(adapters): Add Layerswap Bridge
2 parents 5f2c913 + 12c56f8 commit e8fc423

File tree

3 files changed

+190
-1
lines changed

3 files changed

+190
-1
lines changed

src/adapters/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ import crowdswap from "./crowdswap";
7070
import mint from "./mint";
7171
import suibridge from "./suibridge";
7272
import retrobridge from "./retrobridge"
73+
import layerswap from "./layerswap"
7374

7475
export default {
7576
polygon,
@@ -143,6 +144,7 @@ export default {
143144
mint,
144145
suibridge,
145146
retrobridge,
147+
layerswap,
146148
} as {
147149
[bridge: string]: BridgeAdapter;
148150
};

src/adapters/layerswap/index.ts

+135
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeAdapter.type";
2+
import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions";
3+
import { constructTransferParams } from "../../helpers/eventParams";
4+
import { Chain } from "@defillama/sdk/build/general";
5+
import { getTxsBlockRangeEtherscan, wait } from "../../helpers/etherscan";
6+
import { getTxsBlockRangeMerlinScan } from "../../helpers/merlin";
7+
import { EventData } from "../../utils/types";
8+
import { BigNumber } from "ethers";
9+
import { getTxsBlockRangeBtrScan } from "../../helpers/btr";
10+
11+
const blackListedAddresses = [
12+
"0xe2e1808ed4cc4a6f701696086838f511ee187d57",
13+
].map((a) => a.toLowerCase());
14+
15+
const solverAddressesEOA = [
16+
"0x2fc617e933a52713247ce25730f6695920b3befe"
17+
];
18+
19+
const solverAddressesEOAerc = [
20+
"0x2fc617e933a52713247ce25730f6695920b3befe",
21+
"0x08b00ceee2fb66029b53d76110b19eeaabfd1e65",
22+
];
23+
24+
const nativeTokens: Record<string, string> = {
25+
ethereum: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
26+
arbitrum: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
27+
optimism: "0x4200000000000000000000000000000000000006",
28+
base: "0x4200000000000000000000000000000000000006",
29+
linea: "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f",
30+
blast: "0x4300000000000000000000000000000000000004",
31+
polygon: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
32+
scroll: "0x5300000000000000000000000000000000000004",
33+
mode: "0x4200000000000000000000000000000000000006",
34+
manta: "0x0Dc808adcE2099A9F62AA87D9670745AbA741746",
35+
arbitrum_nova: "0x722E8BdD2ce80A4422E880164f2079488e115365",
36+
polygon_zkevm: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
37+
era: "0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91",
38+
merlin: "0xF6D226f9Dc15d9bB51182815b320D3fBE324e1bA",
39+
zklink: "0x000000000000000000000000000000000000800A",
40+
btr: "0xff204e2681a6fa0e2c3fade68a1b28fb90e4fc5f",
41+
xlayer: "0x5a77f1443d16ee5761d310e38b62f77f726bc71c",
42+
op_bnb: "0xe7798f023fc62146e8aa1b36da45fb70855a77ea",
43+
bsc: "0x2170Ed0880ac9A755fd29B2688956BD959F933F8",
44+
mantle: "0xdeaddeaddeaddeaddeaddeaddeaddeaddead1111",
45+
bouncebit: "0x7F150c293c97172C75983BD8ac084c187107eA19",
46+
zkfair: "0x4b21b980d0Dc7D3C0C6175b0A412694F3A1c7c6b",
47+
bsquared: "0x8dbf84c93727c85DB09478C83a8621e765D20eC2",
48+
taiko: "0xA51894664A773981C6C112C43ce576f315d5b1B6",
49+
};
50+
51+
const constructParams = (chain: string) => {
52+
53+
let eventParams = [] as any;
54+
solverAddressesEOAerc.map((address: string) => {
55+
const transferWithdrawalParams: PartialContractEventParams = constructTransferParams(address, false);
56+
const transferDepositParams: PartialContractEventParams = constructTransferParams(address, true);
57+
eventParams.push(transferWithdrawalParams, transferDepositParams);
58+
});
59+
60+
return async (fromBlock: number, toBlock: number) => {
61+
62+
const eventLogData = await getTxDataFromEVMEventLogs("layerswap", chain as Chain, fromBlock, toBlock, eventParams);
63+
64+
const nativeEvents = await Promise.all(
65+
solverAddressesEOA.map(async (address: string, i: number) => {
66+
await wait(500 * i); // for etherscan
67+
let txs: any[] = [];
68+
if (chain === "merlin") {
69+
txs = await getTxsBlockRangeMerlinScan(address, fromBlock, toBlock, {});
70+
} else if (chain === "btr") {
71+
txs = await getTxsBlockRangeBtrScan(address, fromBlock, toBlock, {});
72+
} else {
73+
txs = await getTxsBlockRangeEtherscan(chain, address, fromBlock, toBlock, {});
74+
}
75+
const eventsRes: EventData[] = txs.map((tx: any) => {
76+
const event: EventData = {
77+
txHash: tx.hash,
78+
blockNumber: +tx.blockNumber,
79+
from: tx.from,
80+
to: tx.to,
81+
token: nativeTokens[chain],
82+
amount: BigNumber.from(tx.value),
83+
isDeposit: address === tx.to,
84+
};
85+
return event;
86+
});
87+
88+
return eventsRes;
89+
})
90+
);
91+
92+
const allEvents: EventData[] = [...nativeEvents.flat(), ...eventLogData];
93+
const filteredEvents = allEvents.filter(
94+
(event) =>
95+
!blackListedAddresses.includes(event?.from?.toLowerCase()) &&
96+
!blackListedAddresses.includes(event?.to?.toLowerCase())
97+
);
98+
return filteredEvents;
99+
};
100+
};
101+
102+
const adapter: BridgeAdapter = {
103+
ethereum: constructParams("ethereum"),
104+
arbitrum: constructParams("arbitrum"),
105+
optimism: constructParams("optimism"),
106+
base: constructParams("base"),
107+
linea: constructParams("linea"),
108+
blast: constructParams("blast"),
109+
polygon: constructParams("polygon"),
110+
scroll: constructParams("scroll"),
111+
bsc: constructParams("bsc"),
112+
mode: constructParams("mode"),
113+
manta: constructParams("manta"),
114+
metis: constructParams("metis"),
115+
mantle: constructParams("mantle"),
116+
taiko: constructParams("taiko"),
117+
opbnb: constructParams("op_bnb"),
118+
bouncebit: constructParams("bouncebit-mainnet"),
119+
mint: constructParams("mint"),
120+
'x layer': constructParams("xlayer"),
121+
"arbitrum nova": constructParams("arbitrum_nova"),
122+
"polygon zkevm": constructParams("polygon_zkevm"),
123+
"zksync era": constructParams("era"),
124+
gnosis: constructParams("xdai"),
125+
avalanche: constructParams("avax"),
126+
gravity: constructParams("gravity"),
127+
bob: constructParams("bob"),
128+
zora: constructParams("zora"),
129+
kroma: constructParams("kroma"),
130+
fraxtal: constructParams("fraxtal"),
131+
kcc: constructParams("kcc"),
132+
astar: constructParams("astar"),
133+
fuse: constructParams("fuse"),
134+
};
135+
export default adapter;

src/data/bridgeNetworkData.ts

+53-1
Original file line numberDiff line numberDiff line change
@@ -1555,5 +1555,57 @@ export default [
15551555
opbnb: "op_bnb",
15561556
avalanche: "avax",
15571557
},
1558-
}
1558+
},
1559+
{
1560+
id: 75,
1561+
displayName: "Layerswap",
1562+
bridgeDbName: "layerswap",
1563+
iconLink: "icons:layerswap",
1564+
url: "https://layerswap.io/app",
1565+
largeTxThreshold: 10000,
1566+
chains: [
1567+
"Ethereum",
1568+
"Arbitrum",
1569+
"Arbitrum Nova",
1570+
"Optimism",
1571+
"Base",
1572+
"Linea",
1573+
"Blast",
1574+
"Scroll",
1575+
"BSC",
1576+
"X Layer",
1577+
"Taiko",
1578+
"ZKsync Era",
1579+
"Merlin",
1580+
"Mode",
1581+
"Manta",
1582+
"Polygon zkEVM",
1583+
"Polygon",
1584+
"Avalanche",
1585+
"opBNB",
1586+
"Gravity",
1587+
"Mint",
1588+
"BOB",
1589+
"Mantle",
1590+
"Zora",
1591+
"Kroma",
1592+
"Fraxtal",
1593+
"Sei",
1594+
"KCC",
1595+
"Fuse",
1596+
"Metis",
1597+
"Astar",
1598+
"Gnosis",
1599+
],
1600+
chainMapping: {
1601+
"arbitrum nova": "arbitrum_nova",
1602+
"zksync era": "era",
1603+
"polygon zkevm": "polygon_zkevm",
1604+
bsquared: "b2-mainnet",
1605+
"x layer": "xlayer",
1606+
bouncebit: "bouncebit-mainnet",
1607+
opbnb: "op_bnb",
1608+
bitlayer: "btr",
1609+
},
1610+
},
15591611
] as BridgeNetwork[];

0 commit comments

Comments
 (0)