Skip to content

Commit

Permalink
Merge pull request #183 from DefiLlama/gemeniteg/master
Browse files Browse the repository at this point in the history
Gemeniteg/master
  • Loading branch information
vrtnd committed May 4, 2024
2 parents 57c3372 + 71fd386 commit 3b00844
Show file tree
Hide file tree
Showing 3 changed files with 152 additions and 100 deletions.
2 changes: 2 additions & 0 deletions src/adapters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ import fuse from "./fuse";
import orbiter from "./orbiter";
import connext from "./connext";
import xswap from "./xswap";
import owlto from "./owlto"

export default {
polygon,
Expand Down Expand Up @@ -116,6 +117,7 @@ export default {
orbiter,
connext,
xswap,
owlto,
} as {
[bridge: string]: BridgeAdapter;
};
215 changes: 118 additions & 97 deletions src/adapters/owlto/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,129 +2,150 @@ import { BridgeAdapter, PartialContractEventParams } from "../../helpers/bridgeA
import { getTxDataFromEVMEventLogs } from "../../helpers/processTransactions";
import { constructTransferParams } from "../../helpers/eventParams";
import { Chain } from "@defillama/sdk/build/general";
import { getProvider } from "../../utils/provider";
import { EventData } from "../../utils/types";
import { PromisePool } from "@supercharge/promise-pool";
import { getTxsBlockRangeEtherscan, wait } from "../../helpers/etherscan";

const retry = require("async-retry");

export const bridgesAddress = {
arbitrum: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
arbitrum_nova: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
ethereum: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
bsc: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
polygon: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
optimism: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
era: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
polygon_zkevm: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],

base: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
linea: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
manta: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
scroll: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
mantle: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],

metis: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
mode: ["0x45A318273749d6eb00f5F6cA3bC7cD3De26D642A", "0x5e809A85Aa182A9921EDD10a4163745bb3e36284"]
arbitrum: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
arbitrum_nova: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
ethereum: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
bsc: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
polygon: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
optimism: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
era: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
polygon_zkevm: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],

base: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
linea: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
manta: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
scroll: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
mantle: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],

metis: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
mode: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],
blast: ["0x5e809A85Aa182A9921EDD10a4163745bb3e36284"],

} as const;

type SupportedChains = keyof typeof bridgesAddress;
export const contractsAddress = {
arbitrum: ["0x0e83DEd9f80e1C92549615D96842F5cB64A08762"],
arbitrum_nova: ["0x0e83DEd9f80e1C92549615D96842F5cB64A08762"],
ethereum: ["0x0e83DEd9f80e1C92549615D96842F5cB64A08762"],
bsc: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
polygon: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
optimism: ["0x0e83DEd9f80e1C92549615D96842F5cB64A08762"],
era: ["0x95cDd9632C924d2cb5586168Cf0Ba7640dF30598"],
polygon_zkevm: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],

base: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
linea: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
manta: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
scroll: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
mantle: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],

metis: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
mode: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],
blast: ["0xC626845BF4E6a5802Ef774dA0B3DfC6707F015F7"],

export const getNativeTokenTransfersFromHash = async (
chain: Chain,
hashes: string[],
address_old: string,
address_new: string,
nativeToken: string
) => {
const provider = getProvider(chain) as any;
const transactions = (
await Promise.all(
hashes.map(async (hash) => {
// TODO: add timeout
const tx = await provider.getTransaction(hash);
if (!tx) {
return;
}
const { blockNumber, from, to, value } = tx;
if (value <= 0) {
return;
}
if (!(address_old === from || address_old === to || address_new === from || address_new === to)) {
return;
}
const isDeposit = (address_old === to || address_new == to);
return {
blockNumber: blockNumber,
txHash: hash,
from: from,
to: to,
token: nativeToken,
amount: value,
isDeposit: isDeposit,
} as EventData;
})
)
).filter((tx) => tx) as EventData[];
return transactions;
} as const;

const nativeTokens: Record<string, string> = {
ethereum: "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2",
arbitrum: "0x82af49447d8a07e3bd95bd0d56f35241523fbab1",
optimism: "0x4200000000000000000000000000000000000006",
base: "0x4200000000000000000000000000000000000006",
linea: "0xe5D7C2a44FfDDf6b295A15c148167daaAf5Cf34f",
blast: "0x4300000000000000000000000000000000000004",
scroll: "0x5300000000000000000000000000000000000004",
mode: "0x4200000000000000000000000000000000000006",
polygon: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
manta: "0x0Dc808adcE2099A9F62AA87D9670745AbA741746",
polygon_zkevm: "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270",
era: "0x5AEa5775959fBC2557Cc8789bC1bf90A239D9a91",
arbitrum_nova: "0x722E8BdD2ce80A4422E880164f2079488e115365",
};

type SupportedChains = keyof typeof bridgesAddress;

const constructParams = (chain: SupportedChains) => {
let eventParams = [] as PartialContractEventParams[];
const bridgeAddress = bridgesAddress[chain];
const contractAddress = contractsAddress[chain];

const oldDepositParams = constructTransferParams(bridgeAddress[0], true, {}, {}, chain);
const oldWithdrawParams = constructTransferParams(bridgeAddress[0], false, {}, {}, chain);

const newDepositParams = constructTransferParams(bridgeAddress[1], true, {}, {}, chain);
const newWithdrawParams = constructTransferParams(bridgeAddress[1], false, {}, {}, chain);

eventParams = [oldDepositParams, oldWithdrawParams, newDepositParams, newWithdrawParams];
let eventParams = [] as any;
bridgeAddress.map((address: string) => {
const transferWithdrawalParams: PartialContractEventParams = constructTransferParams(address, false);
const transferDepositParams: PartialContractEventParams = constructTransferParams(address, true);
eventParams.push(transferWithdrawalParams, transferDepositParams);
});

return async (fromBlock: number, toBlock: number) => {
const provider = getProvider(chain) as any;
const results: EventData[] = [];
const data = {} as any;
const blocknums = []
for (let i = fromBlock; i <= toBlock; i++) {
blocknums.push(i);
}

await PromisePool.withConcurrency(10)
.for(blocknums)
.process(async (blocknum) => {
const block = await retry(async () => provider.getBlock(blocknum), { retries: 3 });
const r = await getNativeTokenTransfersFromHash(chain as Chain, block.transactions, bridgeAddress[0], bridgeAddress[1], "0x0000000000000000000000000000000000000000")
data[blocknum] = r;
});
const eventDatas = Object.values(data) as EventData[][];
for (const eventData of eventDatas) {
results.push(...eventData);
}
const r = await getTxDataFromEVMEventLogs("owlto", chain as Chain, fromBlock, toBlock, eventParams);
results.push(...r);
return results;
const eventLogData = await getTxDataFromEVMEventLogs("owlto", chain as Chain, fromBlock, toBlock, eventParams);

const nativeEvents = await Promise.all([
...bridgeAddress.map(async (address: string, i: number) => {
await wait(300 * i); // for etherscan
const txs = await getTxsBlockRangeEtherscan(chain, address, fromBlock, toBlock, {
includeSignatures: ["0x"],
});
const eventsRes: EventData[] = txs.map((tx: any) => {
const event: EventData = {
txHash: tx.hash,
blockNumber: +tx.blockNumber,
from: tx.from,
to: tx.to,
token: nativeTokens[chain],
amount: tx.value,
isDeposit: address === tx.to,
};
return event;
});

return eventsRes;
}),
...contractAddress.map(async (address: string, i: number) => {
await wait(300 * i); // for etherscan
const txs = await getTxsBlockRangeEtherscan(chain, address, fromBlock, toBlock, {
includeSignatures: ["0xfc180638"],
});
const eventsRes: EventData[] = txs.filter((tx: any) => String(tx.value) != "0").map((tx: any) => {
const event: EventData = {
txHash: tx.hash,
blockNumber: +tx.blockNumber,
from: tx.from,
to: tx.to,
token: nativeTokens[chain],
amount: tx.value,
isDeposit: address === tx.to,
};
return event;
});

return eventsRes;
})
]
);
const allEvents = [...eventLogData, ...nativeEvents.flat()];
return allEvents;
};
}


const adapter: BridgeAdapter = {
arbitrum: constructParams("arbitrum"),
"arbitrum nova": constructParams("arbitrum_nova"),
ethereum: constructParams("ethereum"),
arbitrum: constructParams("arbitrum"),
optimism: constructParams("optimism"),
metis: constructParams("metis"),
polygon: constructParams("polygon"),
"polygon zkevm": constructParams("polygon_zkevm"),
"zksync era": constructParams("era"),
bsc: constructParams("bsc"),

base: constructParams("base"),
linea: constructParams("linea"),
blast: constructParams("blast"),
polygon: constructParams("polygon"),
scroll: constructParams("scroll"),
mantle: constructParams("mantle"),
manta: constructParams("manta"),
// mode: constructParams("mode"), no etherscan
// manta: constructParams("manta"),
"arbitrum nova": constructParams("arbitrum_nova"),
"polygon zkevm": constructParams("polygon_zkevm"),
"zksync era": constructParams("era"),
};

export default adapter;
35 changes: 32 additions & 3 deletions src/data/bridgeNetworkData.ts
Original file line number Diff line number Diff line change
Expand Up @@ -306,7 +306,7 @@ export default [
iconLink: "icons:across",
largeTxThreshold: 10000,
url: "https://across.to/",
chains: ["Ethereum", "Polygon", "Arbitrum", "Optimism", "zkSync Era", "Base", 'Linea'],
chains: ["Ethereum", "Polygon", "Arbitrum", "Optimism", "zkSync Era", "Base", "Linea"],
chainMapping: {
"zksync era": "era",
},
Expand Down Expand Up @@ -850,7 +850,7 @@ export default [
// "Manta",
"Mantle",
// "Rootstock",
"Scroll"
"Scroll",
],
chainMapping: {
"arbitrum nova": "arbitrum_nova",
Expand Down Expand Up @@ -957,4 +957,33 @@ export default [
avalanche: "avax",
},
},
] as BridgeNetwork[];

{
id: 62,
displayName: "Owlto",
bridgeDbName: "owlto",
iconLink: "icons:owlto",
largeTxThreshold: 10000,
url: "https://owlto.finance",
chains: [
"Ethereum",
"Arbitrum",
"Optimism",
"Base",
"Polygon",
"Linea",
"Blast",
"Arbitrum Nova",
"Scroll",
// "Manta",
// "Mode",
"zkSync Era",
"Polygon zkEVM",
],
chainMapping: {
"arbitrum nova": "arbitrum_nova",
"zksync era": "era",
"polygon zkevm": "polygon_zkevm",
},
},
] as BridgeNetwork[];

0 comments on commit 3b00844

Please sign in to comment.