From 7e8ea908d93e00a49d5821024a60bfbedf31dfef Mon Sep 17 00:00:00 2001 From: Arjun Nemani Date: Sat, 15 Jul 2023 19:42:18 +0530 Subject: [PATCH] lets use only callHandlers for predicates --- .../templates/polygon-root.template.yaml | 5 +- .../polygon-bridge/src/mappings/fx-erc20.ts | 17 +-- .../polygon-bridge/src/mappings/predicate.ts | 111 ++++++------------ .../src/mappings/rootchain-manager.ts | 5 + .../src/prices/common/constants.ts | 2 + 5 files changed, 53 insertions(+), 87 deletions(-) diff --git a/subgraphs/polygon-bridge/protocols/polygon-bridge/config/templates/polygon-root.template.yaml b/subgraphs/polygon-bridge/protocols/polygon-bridge/config/templates/polygon-root.template.yaml index 268395277c..c97051914d 100644 --- a/subgraphs/polygon-bridge/protocols/polygon-bridge/config/templates/polygon-root.template.yaml +++ b/subgraphs/polygon-bridge/protocols/polygon-bridge/config/templates/polygon-root.template.yaml @@ -258,10 +258,9 @@ templates: file: ./abis/Prices/Uniswap/Factory.json - name: UniswapPair file: ./abis/Prices/Uniswap/Pair.json - eventHandlers: - - event: LockedERC20(indexed address,indexed address,indexed address,uint256) - handler: handleERC20Lock callHandlers: + - function: lockTokens(address,address,address,bytes) + handler: handleLockTokens - function: exitTokens(address,address,bytes) handler: handleExitTokens file: ./src/mappings/predicate.ts \ No newline at end of file diff --git a/subgraphs/polygon-bridge/src/mappings/fx-erc20.ts b/subgraphs/polygon-bridge/src/mappings/fx-erc20.ts index b021b3b34d..ddd42614c0 100644 --- a/subgraphs/polygon-bridge/src/mappings/fx-erc20.ts +++ b/subgraphs/polygon-bridge/src/mappings/fx-erc20.ts @@ -22,7 +22,10 @@ import { getUsdPricePerToken, getUsdPrice } from "../prices"; import { Versions } from "../versions"; import { ERC20 } from "../../generated/FxERC20Events/ERC20"; import { RootChainManager } from "../../generated/FxERC20Events/RootChainManager"; -import { BIGDECIMAL_ZERO } from "../prices/common/constants"; +import { + BIGDECIMAL_ZERO, + UNKNOWN_TOKEN_VALUE, +} from "../prices/common/constants"; import { ETH_ADDRESS } from "../sdk/util/constants"; export const conf = new BridgeConfig( @@ -48,7 +51,7 @@ export class Pricer implements TokenPricer { export class TokenInit implements TokenInitializer { getTokenParams(address: Address): TokenParams { - if (address.toHexString() == ETH_ADDRESS) { + if (Address.fromString(ETH_ADDRESS).equals(address)) { return { name: "ETH", symbol: "ETH", @@ -67,8 +70,8 @@ export class TokenInit implements TokenInitializer { ]); return { - name: "invalid", - symbol: "invalid", + name: UNKNOWN_TOKEN_VALUE, + symbol: UNKNOWN_TOKEN_VALUE, decimals: 18, }; } @@ -87,7 +90,7 @@ export function handleTokenMappedERC20(event: TokenMappedERC20): void { const pool = sdk.Pools.loadPool(event.params.rootToken); const rootToken = sdk.Tokens.getOrCreateToken(event.params.rootToken); - if (rootToken.name == "invalid") { + if (rootToken.name == UNKNOWN_TOKEN_VALUE) { return; } @@ -122,7 +125,7 @@ export function handleFxDepositERC20(event: FxDepositERC20): void { const pool = sdk.Pools.loadPool(event.params.rootToken); const token = sdk.Tokens.getOrCreateToken(event.params.rootToken); - if (token.name == "invalid") { + if (token.name == UNKNOWN_TOKEN_VALUE) { return; } @@ -181,7 +184,7 @@ export function handleFxWithdrawERC20(event: FxWithdrawERC20): void { const pool = sdk.Pools.loadPool(poolAddr); const token = sdk.Tokens.getOrCreateToken(event.params.rootToken); - if (token.name == "invalid") { + if (token.name == UNKNOWN_TOKEN_VALUE) { return; } diff --git a/subgraphs/polygon-bridge/src/mappings/predicate.ts b/subgraphs/polygon-bridge/src/mappings/predicate.ts index cd60b661cf..5c3897b54c 100644 --- a/subgraphs/polygon-bridge/src/mappings/predicate.ts +++ b/subgraphs/polygon-bridge/src/mappings/predicate.ts @@ -8,101 +8,51 @@ import { } from "@graphprotocol/graph-ts"; import { Token } from "../../generated/schema"; -import { - ExitedEther, - LockedEther, -} from "../../generated/FxERC20Events/EtherPredicate"; import { ExitTokensCall, - LockedERC20, + LockTokensCall, } from "../../generated/FxERC20Events/ERC20Predicate"; import { NetworkConfigs } from "../../configurations/configure"; -import { bigIntToBigDecimal } from "../sdk/util/numbers"; -import { BridgeConfig } from "../sdk/protocols/bridge/config"; import { SDK } from "../sdk/protocols/bridge"; -import { TokenPricer } from "../sdk/protocols/config"; -import { TokenInitializer, TokenParams } from "../sdk/protocols/bridge/tokens"; import { - BridgePermissionType, BridgePoolType, CrosschainTokenType, } from "../sdk/protocols/bridge/enums"; -import { getUsdPricePerToken, getUsdPrice } from "../prices"; -import { Versions } from "../versions"; -import { ERC20 } from "../../generated/FxERC20Events/ERC20"; import { RootChainManager } from "../../generated/FxERC20Events/RootChainManager"; -import { BIGDECIMAL_ZERO } from "../prices/common/constants"; +import { UNKNOWN_TOKEN_VALUE } from "../prices/common/constants"; import { conf, Pricer, TokenInit } from "./fx-erc20"; -import { ETH_ADDRESS } from "../sdk/util/constants"; -export function handleEtherLock(event: LockedEther): void { +export function handleLockTokens(call: LockTokensCall): void { // poolAddress == RootToken Address - const poolAddr = Address.fromString(ETH_ADDRESS); - const amount = event.params.amount; - const crosschainID = BigInt.fromI32(137); - - const sdk = SDK.initialize(conf, new Pricer(), new TokenInit(), event); - - const pool = sdk.Pools.loadPool(poolAddr); - const token = sdk.Tokens.getOrCreateToken(poolAddr); - if (token.name == "unknown") { - return; - } - - if (!pool.isInitialized) { - pool.initialize( - token.name, - token.symbol, - BridgePoolType.LOCK_RELEASE, - token - ); - } - - const rootChainManger = RootChainManager.bind( - Address.fromString(conf.getID()) - ); + const poolAddr = call.inputs.rootToken; + const depositData = call.inputs.depositData; - const crosschainTokenAddr_call = - rootChainManger.try_rootToChildToken(poolAddr); - - if (crosschainTokenAddr_call.reverted) { - log.warning( - "[handleSwapIn] No crosschainToken for network: {} poolID: {} token: {}", - [crosschainID.toString(), poolAddr.toHexString(), poolAddr.toHexString()] - ); + const decoded = ethereum.decode("uint256", depositData); + if (!decoded) { + log.critical("[DECODE ERROR] {} {}", [ + call.transaction.hash.toHexString(), + depositData.toHexString(), + ]); return; } - const crosschainTokenAddr = crosschainTokenAddr_call.value; - - const crosschainToken = sdk.Tokens.getOrCreateCrosschainToken( - crosschainID, - crosschainTokenAddr, - CrosschainTokenType.WRAPPED, - Address.fromBytes(token.id) - ); - - pool.addDestinationToken(crosschainToken); - const route = pool.getDestinationTokenRoute(crosschainToken); - - const account = sdk.Accounts.loadAccount(event.params.depositor); - account.transferOut(pool, route!, event.params.depositReceiver, amount); -} + const amount = decoded.toBigInt(); + log.info("[DECODE SUCCESS] txhash = {}, depositData = {} amount = {}", [ + call.transaction.hash.toHexString(), + depositData.toHexString(), + amount.toString(), + ]); -export function handleERC20Lock(event: LockedERC20): void { - // poolAddress == RootToken Address - const poolAddr = event.params.rootToken; - const amount = event.params.amount; const crosschainID = BigInt.fromI32(137); - const sdk = SDK.initialize(conf, new Pricer(), new TokenInit(), event); + const sdk = SDK.initialize(conf, new Pricer(), new TokenInit(), call); const pool = sdk.Pools.loadPool(poolAddr); - const token = sdk.Tokens.getOrCreateToken(poolAddr); - if (token.name == "unknown") { + const token = sdk.Tokens.getOrCreateToken(call.inputs.rootToken); + if (token.name == UNKNOWN_TOKEN_VALUE) { return; } @@ -119,32 +69,36 @@ export function handleERC20Lock(event: LockedERC20): void { Address.fromString(conf.getID()) ); - const crosschainTokenAddr_call = - rootChainManger.try_rootToChildToken(poolAddr); + const crosschainTokenAddr_call = rootChainManger.try_rootToChildToken( + call.inputs.rootToken + ); if (crosschainTokenAddr_call.reverted) { log.warning( "[handleSwapIn] No crosschainToken for network: {} poolID: {} token: {}", - [crosschainID.toString(), poolAddr.toHexString(), poolAddr.toHexString()] + [ + crosschainID.toString(), + poolAddr.toHexString(), + call.inputs.rootToken.toHexString(), + ] ); return; } - const crosschainTokenAddr = crosschainTokenAddr_call.value; const crosschainToken = sdk.Tokens.getOrCreateCrosschainToken( crosschainID, crosschainTokenAddr, - CrosschainTokenType.WRAPPED, + CrosschainTokenType.CANONICAL, Address.fromBytes(token.id) ); pool.addDestinationToken(crosschainToken); const route = pool.getDestinationTokenRoute(crosschainToken); - const account = sdk.Accounts.loadAccount(event.params.depositor); - account.transferOut(pool, route!, event.params.depositReceiver, amount); + const account = sdk.Accounts.loadAccount(call.inputs.depositor); + account.transferOut(pool, route!, call.inputs.depositReceiver, amount); } export function handleExitTokens(call: ExitTokensCall): void { @@ -184,6 +138,9 @@ export function handleExitTokens(call: ExitTokensCall): void { const pool = sdk.Pools.loadPool(poolAddr); const token = sdk.Tokens.getOrCreateToken(call.inputs.rootToken); + if (token.name == UNKNOWN_TOKEN_VALUE) { + return; + } if (!pool.isInitialized) { pool.initialize(token.name, token.symbol, BridgePoolType.BURN_MINT, token); diff --git a/subgraphs/polygon-bridge/src/mappings/rootchain-manager.ts b/subgraphs/polygon-bridge/src/mappings/rootchain-manager.ts index 263dcd6ac2..701778a568 100644 --- a/subgraphs/polygon-bridge/src/mappings/rootchain-manager.ts +++ b/subgraphs/polygon-bridge/src/mappings/rootchain-manager.ts @@ -10,6 +10,7 @@ import { } from "../sdk/protocols/bridge/enums"; import { conf, Pricer, TokenInit } from "./fx-erc20"; import { Predicate as PredicateTemplate } from "../../generated/templates"; +import { UNKNOWN_TOKEN_VALUE } from "../prices/common/constants"; export function handlePredicateRegistered(event: PredicateRegistered): void { log.debug( @@ -31,6 +32,10 @@ export function handlePOSTokenMapped(event: TokenMapped): void { const pool = sdk.Pools.loadPool(event.params.rootToken); const rootToken = sdk.Tokens.getOrCreateToken(event.params.rootToken); + if (rootToken.name == UNKNOWN_TOKEN_VALUE) { + return; + } + if (!pool.isInitialized) { pool.initialize( rootToken.name, diff --git a/subgraphs/polygon-bridge/src/prices/common/constants.ts b/subgraphs/polygon-bridge/src/prices/common/constants.ts index bc742d9953..09801cf65f 100644 --- a/subgraphs/polygon-bridge/src/prices/common/constants.ts +++ b/subgraphs/polygon-bridge/src/prices/common/constants.ts @@ -26,3 +26,5 @@ export const BIGDECIMAL_USD_PRICE = BigDecimal.fromString("1000000"); export const AAVE_ORACLE_DECIMALS = 8; export const DEFAULT_USDC_DECIMALS = 6; export const DEFAULT_DECIMALS = BigInt.fromI32(18); + +export const UNKNOWN_TOKEN_VALUE = "unknown";