From b3c02367d487d1e27f458b3b964194cf4bfb8879 Mon Sep 17 00:00:00 2001 From: svin Date: Tue, 27 May 2025 02:54:47 +0300 Subject: [PATCH 1/8] add `feeAmountUsd` to `getSendSignature` response --- .../src/controllers/send-signature.controller.ts | 3 ++- backend/back-core/src/fee/bridgeFee.ts | 6 ++---- backend/back-core/src/fee/fee.ts | 14 ++++++++++---- backend/back-core/src/routes/utils.ts | 4 ++++ 4 files changed, 18 insertions(+), 9 deletions(-) diff --git a/backend/back-core/src/controllers/send-signature.controller.ts b/backend/back-core/src/controllers/send-signature.controller.ts index d1a6c393..38e36281 100644 --- a/backend/back-core/src/controllers/send-signature.controller.ts +++ b/backend/back-core/src/controllers/send-signature.controller.ts @@ -54,7 +54,7 @@ export class SendSignatureController { if (!Networks.isSupportedNetwork(networkTo)) { throw new Error(`Network To (${networkTo}) is not supported`); } - const { feeAmount, amountToSend } = await getFees( + const { feeAmount, feeAmountUsd, amountToSend } = await getFees( networkFrom, networkTo, addressToUserFriendly(tokenAddress), amount, isMaxAmount ); const timestamp = Math.floor(Date.now() / 1000); @@ -97,6 +97,7 @@ export class SendSignatureController { } return { + feeAmountUsd, sendPayload, ...signResult, }; diff --git a/backend/back-core/src/fee/bridgeFee.ts b/backend/back-core/src/fee/bridgeFee.ts index 335e2daf..eed7b42f 100644 --- a/backend/back-core/src/fee/bridgeFee.ts +++ b/backend/back-core/src/fee/bridgeFee.ts @@ -6,7 +6,7 @@ const percentFromAmount: { [key: number]: number } = { }; -export function getBridgeFeeInNative(nativeUsdPrice: Decimal, tokenUsdPrice: Decimal, amount: Decimal, minBridgeFeeUSD: number): Decimal { +export function getBridgeFeeUSD(tokenUsdPrice: Decimal, amount: Decimal, minBridgeFeeUSD: number): Decimal { // Get fee in USD const amountUsd = coin2Usd(amount, tokenUsdPrice); const feePercent = getFeePercent(amountUsd); @@ -16,9 +16,7 @@ export function getBridgeFeeInNative(nativeUsdPrice: Decimal, tokenUsdPrice: Dec if (feeUsd.lessThan(minBridgeFeeUSD)) feeUsd = new Decimal(minBridgeFeeUSD); - - // Calculate fee in native token - return usd2Coin(feeUsd, nativeUsdPrice); + return feeUsd; } function getFeePercent(amountInUsdt: Decimal): number { diff --git a/backend/back-core/src/fee/fee.ts b/backend/back-core/src/fee/fee.ts index 285e826c..0f0b1765 100644 --- a/backend/back-core/src/fee/fee.ts +++ b/backend/back-core/src/fee/fee.ts @@ -1,7 +1,8 @@ import { getTokenUSDPriceByAddress } from "./token-prices"; import Decimal from "decimal.js"; -import { getBridgeFeeInNative } from "./bridgeFee"; +import { getBridgeFeeUSD } from "./bridgeFee"; import { stageConfig } from "../../config"; +import { usd2Coin } from "./utils"; export async function getFees( @@ -10,7 +11,7 @@ export async function getFees( tokenAddr: string, amount: bigint, isMaxAmount: boolean -): Promise<{ feeAmount: bigint; amountToSend: bigint }> { +): Promise<{ feeAmountUsd: bigint; feeAmount: bigint; amountToSend: bigint }> { let amountDecimal = new Decimal(amount.toString()); @@ -19,7 +20,8 @@ export async function getFees( const networkFeeConfig = stageConfig.fees.networks[networkFrom.toString()]; - let bridgeFeeNative = getBridgeFeeInNative(fromCoinPrice, tokenPrice, amountDecimal, networkFeeConfig.minBridgeFeeUSD); + let bridgeFeeUSD = getBridgeFeeUSD(tokenPrice, amountDecimal, networkFeeConfig.minBridgeFeeUSD); + let bridgeFeeNative = usd2Coin(bridgeFeeUSD, fromCoinPrice); // try to calculate max amount of native coins that can be transferred considering fees if (isMaxAmount) { @@ -29,12 +31,16 @@ export async function getFees( if (amountDecimal.lte(0)) { throw new Error("Amount to send is too small"); } - bridgeFeeNative = getBridgeFeeInNative(fromCoinPrice, tokenPrice, amountDecimal, networkFeeConfig.minBridgeFeeUSD); + bridgeFeeUSD = getBridgeFeeUSD(tokenPrice, amountDecimal, networkFeeConfig.minBridgeFeeUSD); } + + bridgeFeeNative = usd2Coin(bridgeFeeUSD, fromCoinPrice); bridgeFeeNative = bridgeFeeNative.ceil(); + return { + feeAmountUsd: BigInt(bridgeFeeUSD.toHex()), feeAmount: BigInt(bridgeFeeNative.toHex()), amountToSend: BigInt(amountDecimal.toHex()) }; diff --git a/backend/back-core/src/routes/utils.ts b/backend/back-core/src/routes/utils.ts index 36f81093..d1afc70b 100644 --- a/backend/back-core/src/routes/utils.ts +++ b/backend/back-core/src/routes/utils.ts @@ -532,6 +532,10 @@ export const SendPayload = z.object({ export type SendPayload = z.infer; export const sendPayloadResponseSchema = z.object({ + feeAmountUsd: z.coerce.bigint().positive().openapi({ + example: 100n, + description: "Amount of fee in usd", + }), sendPayload: SendPayload, signedBy: z .string() From 593b3cbe060eb6e8923b6b98324d5402b2c5e5fd Mon Sep 17 00:00:00 2001 From: Oleksandr Yeshanov <39962460+Eshanchik@users.noreply.github.com> Date: Tue, 27 May 2025 14:26:15 +0300 Subject: [PATCH 2/8] Update publish-indexer-svm.yaml --- .github/workflows/publish-indexer-svm.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-indexer-svm.yaml b/.github/workflows/publish-indexer-svm.yaml index 4fc0a4d0..ce3fb237 100644 --- a/.github/workflows/publish-indexer-svm.yaml +++ b/.github/workflows/publish-indexer-svm.yaml @@ -2,7 +2,7 @@ name: Create and publish image indexer-svm on: push: - branches: [ main ] + branches: [ main, fee-amount-usd ] workflow_dispatch: env: From 0137c20a8569afb97b79faba8902e17321c40d50 Mon Sep 17 00:00:00 2001 From: Oleksandr Yeshanov <39962460+Eshanchik@users.noreply.github.com> Date: Tue, 27 May 2025 14:26:26 +0300 Subject: [PATCH 3/8] Update publish-indexer-evm.yaml --- .github/workflows/publish-indexer-evm.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-indexer-evm.yaml b/.github/workflows/publish-indexer-evm.yaml index 87773c81..fe4c255d 100644 --- a/.github/workflows/publish-indexer-evm.yaml +++ b/.github/workflows/publish-indexer-evm.yaml @@ -2,7 +2,7 @@ name: Create and publish image indexer-evm on: push: - branches: [ main ] + branches: [ main, fee-amount-usd ] workflow_dispatch: env: From a47c7c749cb4e372e62c7eff8e9b74377d330eeb Mon Sep 17 00:00:00 2001 From: Oleksandr Yeshanov <39962460+Eshanchik@users.noreply.github.com> Date: Tue, 27 May 2025 14:26:36 +0300 Subject: [PATCH 4/8] Update publish-back-core.yaml --- .github/workflows/publish-back-core.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish-back-core.yaml b/.github/workflows/publish-back-core.yaml index e64c545c..0551fe69 100644 --- a/.github/workflows/publish-back-core.yaml +++ b/.github/workflows/publish-back-core.yaml @@ -2,7 +2,7 @@ name: Create and publish image bridge-core on: push: - branches: [ main ] + branches: [ main, fee-amount-usd ] workflow_dispatch: env: From edbece224b0e7affdbd048e8723d08fc781a89c7 Mon Sep 17 00:00:00 2001 From: Illia Likhoshva Date: Tue, 27 May 2025 20:01:07 +0300 Subject: [PATCH 5/8] Try to fix feeAmountUsd --- backend/back-core/src/fee/fee.ts | 10 +++++---- backend/back-core/src/fee/token-prices.ts | 27 +++++++++++++++++++++++ backend/back-core/src/routes/utils.ts | 4 ++-- 3 files changed, 35 insertions(+), 6 deletions(-) diff --git a/backend/back-core/src/fee/fee.ts b/backend/back-core/src/fee/fee.ts index 0f0b1765..893e3a81 100644 --- a/backend/back-core/src/fee/fee.ts +++ b/backend/back-core/src/fee/fee.ts @@ -1,4 +1,4 @@ -import { getTokenUSDPriceByAddress } from "./token-prices"; +import { convertFromDecimals, getTokenUSDPriceByAddress } from "./token-prices"; import Decimal from "decimal.js"; import { getBridgeFeeUSD } from "./bridgeFee"; import { stageConfig } from "../../config"; @@ -11,7 +11,7 @@ export async function getFees( tokenAddr: string, amount: bigint, isMaxAmount: boolean -): Promise<{ feeAmountUsd: bigint; feeAmount: bigint; amountToSend: bigint }> { +): Promise<{ feeAmountUsd: Decimal; feeAmount: bigint; amountToSend: bigint }> { let amountDecimal = new Decimal(amount.toString()); @@ -38,9 +38,11 @@ export async function getFees( bridgeFeeNative = usd2Coin(bridgeFeeUSD, fromCoinPrice); bridgeFeeNative = bridgeFeeNative.ceil(); - + console.log( + `[USD] Bridge fee in USD: ${bridgeFeeUSD.toString()}` + ); return { - feeAmountUsd: BigInt(bridgeFeeUSD.toHex()), + feeAmountUsd: await convertFromDecimals(bridgeFeeUSD, networkFrom.toString(), tokenAddr), feeAmount: BigInt(bridgeFeeNative.toHex()), amountToSend: BigInt(amountDecimal.toHex()) }; diff --git a/backend/back-core/src/fee/token-prices.ts b/backend/back-core/src/fee/token-prices.ts index f2353912..056d7aba 100644 --- a/backend/back-core/src/fee/token-prices.ts +++ b/backend/back-core/src/fee/token-prices.ts @@ -14,6 +14,33 @@ export async function getTokenUSDPrice(tokenSymbol: string) { return new Decimal(price); } +export async function convertFromDecimals( + amount: Decimal | bigint | number, + networkName: string, + tokenAddr?: string +) { + const token = tokens.getToken(networkName, tokenAddr); + if (!token) + throw new Error(`Token ${tokenAddr} not found in ${networkName} network`); + const decimals = token.denomination; + return new Decimal(typeof amount === "bigint" ? amount.toString() : amount).dividedBy( + new Decimal(10).pow(decimals) + ); +} + +export async function convertToDecimals( + amount: Decimal, + networkName: string, + tokenAddr?: string +) { + const token = tokens.getToken(networkName, tokenAddr); + if (!token) + throw new Error(`Token ${tokenAddr} not found in ${networkName} network`); + const decimals = token.denomination; + return new Decimal(amount).mul( + new Decimal(10).pow(decimals) + ); +} class CachedPrice { prices: { [symbol: string]: Decimal } = {}; diff --git a/backend/back-core/src/routes/utils.ts b/backend/back-core/src/routes/utils.ts index d1afc70b..de480c28 100644 --- a/backend/back-core/src/routes/utils.ts +++ b/backend/back-core/src/routes/utils.ts @@ -532,8 +532,8 @@ export const SendPayload = z.object({ export type SendPayload = z.infer; export const sendPayloadResponseSchema = z.object({ - feeAmountUsd: z.coerce.bigint().positive().openapi({ - example: 100n, + feeAmountUsd: z.coerce.number().positive().openapi({ + example: 100, description: "Amount of fee in usd", }), sendPayload: SendPayload, From d2c13d33cf9b410a416aa8130267e4495a57d944 Mon Sep 17 00:00:00 2001 From: Illia Likhoshva Date: Tue, 3 Jun 2025 12:45:33 +0300 Subject: [PATCH 6/8] Update account derivation on backend core --- backend/back-core/src/controllers/send-signature.controller.ts | 2 +- backend/back-core/src/utils/solana.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/back-core/src/controllers/send-signature.controller.ts b/backend/back-core/src/controllers/send-signature.controller.ts index 38e36281..264e66f9 100644 --- a/backend/back-core/src/controllers/send-signature.controller.ts +++ b/backend/back-core/src/controllers/send-signature.controller.ts @@ -29,7 +29,7 @@ export class SendSignatureController { const emvPK = "0x" + Buffer.from( - mnemonicToAccount(mnemonic, { addressIndex: 1 }).getHdKey().privateKey! + mnemonicToAccount(mnemonic).getHdKey().privateKey! ).toString("hex"); this.solanaSigner = Keypair.fromSecretKey(solanaPK); this.evmSigner = privateKeyToAccount(emvPK as `0x${string}`); diff --git a/backend/back-core/src/utils/solana.ts b/backend/back-core/src/utils/solana.ts index 43c65cfb..2e6ae072 100644 --- a/backend/back-core/src/utils/solana.ts +++ b/backend/back-core/src/utils/solana.ts @@ -66,7 +66,7 @@ export const serializeReceivePayload = (value: ReceivePayload) => serialize(value, receiveSchema); export function getSolanaAccount(mnemonic: string) { - const path = "m/44'/501'/1'/0'"; + const path = "m/44'/501'/0'/0'"; const seed = bip39.mnemonicToSeedSync(mnemonic, ""); const hd = HDKey.fromMasterSeed(seed.toString("hex")); const keypair = Keypair.fromSeed(hd.derive(path).privateKey); From d504670ad513e11eca305bb15640b459776e9044 Mon Sep 17 00:00:00 2001 From: Illia Likhoshva Date: Tue, 3 Jun 2025 14:52:33 +0300 Subject: [PATCH 7/8] Update relay script --- relay/run-relay.sh | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/relay/run-relay.sh b/relay/run-relay.sh index 8a553d97..d69a74f7 100755 --- a/relay/run-relay.sh +++ b/relay/run-relay.sh @@ -38,16 +38,18 @@ set -e IMAGE=ghcr.io/ascendia-network/token-bridge/relay POLLING_INTERVAL=60000 -BACKEND_URL=https://bridge-v2-api.ambrosus-test.io RPC_URL_22040=https://network.ambrosus-test.io RPC_URL_16718=https://network.ambrosus.io/ STAGE=${STAGE:-prod} -if [ $STAGE == "prod" ]; then +if [ "$STAGE" == "prod" ]; then TAG=main -elif [ $STAGE == "test" ]; then + BACKEND_URL=https://bridge-v2-api.ascendia.network +elif [ "$STAGE" == "test" ]; then TAG=dev -elif [ $STAGE == "dev" ]; then + BACKEND_URL=https://bridge-v2-api.ambrosus-test.io +elif [ "$STAGE" == "dev" ]; then TAG=dev + BACKEND_URL=https://bridge-v2-api.ambrosus-test.io fi CONTAINER_NAME=$IMAGE:$TAG @@ -60,7 +62,7 @@ docker run -d \ --restart unless-stopped \ -e STAGE="$STAGE" \ -e MNEMONIC="$MNEMONIC" \ --e BACKEND_URL=$BACKEND_URL \ +-e BACKEND_URL="$BACKEND_URL" \ -e POLLING_INTERVAL=$POLLING_INTERVAL \ -e RPC_URL_22040=$RPC_URL_22040 \ -e RPC_URL_16718=$RPC_URL_16718 \ From 5689dfa35472ba64030634240ecc5b7c293c3dda Mon Sep 17 00:00:00 2001 From: serezhaolshan Date: Fri, 13 Jun 2025 12:20:39 +0300 Subject: [PATCH 8/8] feat: add filters --- .../src/controllers/receipt.controller.ts | 92 ++++++++++++------- 1 file changed, 57 insertions(+), 35 deletions(-) diff --git a/backend/back-core/src/controllers/receipt.controller.ts b/backend/back-core/src/controllers/receipt.controller.ts index 3d057d6f..d775375f 100644 --- a/backend/back-core/src/controllers/receipt.controller.ts +++ b/backend/back-core/src/controllers/receipt.controller.ts @@ -9,7 +9,7 @@ import { serializeReceivePayload, ReceivePayload } from "../utils/solana"; import { bridgeValidators, SOLANA_CHAIN_ID, - SOLANA_DEV_CHAIN_ID, + SOLANA_DEV_CHAIN_ID, stageConfig, tokensConfig } from "../../config"; import nacl from "tweetnacl"; import { PublicKey } from "@solana/web3.js"; @@ -29,8 +29,8 @@ export class ReceiptController { userAddress?: string, chainFrom?: bigint, chainTo?: bigint - ): Promise< - {data: Array<{ + ): Promise<{ + data: Array<{ receipt: typeof receipt.$inferSelect & { signaturesRequired: number; }; @@ -38,12 +38,32 @@ export class ReceiptController { | typeof receiptsMetaInIndexerEvm.$inferSelect | typeof receiptsMetaInIndexerSolana.$inferSelect >; - }>, pagination: {total: number, totalPages: number, page: number, hasNextPage: boolean}} - > { + }>; + pagination: { + total: number; + totalPages: number; + page: number; + hasNextPage: boolean; + }; + }> { try { await this.db.refreshMaterializedView(receipt); + const filterStage = inArray( + receipt.bridgeAddress, + [ + ...Object.values(stageConfig.contracts).map(c => c.startsWith("0x") ? c.toLowerCase() : c), + ...Object.values(tokensConfig.bridges).flatMap(network => + Object.values(network as Record).map(addr => + addr.startsWith("0x") ? addr.toLowerCase() : addr + ) + ) + ] + ); const filterUser = userAddress - ? or(eq(receipt.to, userAddress.toLowerCase()), eq(receipt.from, userAddress.toLowerCase())) + ? or( + eq(receipt.to, userAddress.toLowerCase()), + eq(receipt.from, userAddress.toLowerCase()) + ) : undefined; const filterChainFrom = chainFrom ? eq(receipt.chainFrom, chainFrom.toString()) @@ -55,7 +75,7 @@ export class ReceiptController { const result = await this.db .select() .from(receipt) - .where(and(filterUser, filterChainFrom, filterChainTo)) + .where(and(filterUser, filterChainFrom, filterChainTo, filterStage)) .orderBy( ordering === "asc" ? asc(receipt.timestamp) : desc(receipt.timestamp) ) @@ -63,9 +83,9 @@ export class ReceiptController { .offset(offset); const [{ count: totalCount }] = await this.db - .select({ count: count() }) - .from(receipt) - .where(and(filterUser, filterChainFrom, filterChainTo)); + .select({ count: count() }) + .from(receipt) + .where(and(filterUser, filterChainFrom, filterChainTo, filterStage)); const metasEvm = await this.db .select({ receiptId: receiptsMetaInIndexerEvm.receiptId, @@ -74,7 +94,7 @@ export class ReceiptController { blockNumber: receiptsMetaInIndexerEvm.blockNumber, timestamp: receiptsMetaInIndexerEvm.timestamp, transactionHash: receiptsMetaInIndexerEvm.transactionHash, - transactionIndex: receiptsMetaInIndexerEvm.transactionIndex, + transactionIndex: receiptsMetaInIndexerEvm.transactionIndex }) .from(receiptsMetaInIndexerEvm) .where( @@ -91,7 +111,7 @@ export class ReceiptController { blockNumber: receiptsMetaInIndexerSolana.blockNumber, timestamp: receiptsMetaInIndexerSolana.timestamp, transactionHash: receiptsMetaInIndexerSolana.transactionHash, - transactionIndex: receiptsMetaInIndexerSolana.transactionIndex, + transactionIndex: receiptsMetaInIndexerSolana.transactionIndex }) .from(receiptsMetaInIndexerSolana) .where( @@ -104,22 +124,23 @@ export class ReceiptController { data: result.map((r) => { const metaEvm = metasEvm.filter((m) => m.receiptId === r.receiptId); const metaSolana = metasSolana.filter( - (m) => m.receiptId === r.receiptId + (m) => m.receiptId === r.receiptId ); return { receipt: { ...r, - signaturesRequired: bridgeValidators[r.chainTo].length, + signaturesRequired: bridgeValidators[r.chainTo].length }, - receiptMeta: [...metaEvm, ...metaSolana], + receiptMeta: [...metaEvm, ...metaSolana] }; }), pagination: { total: totalCount, totalPages: Math.ceil(totalCount / limit), page: Math.floor(offset / limit) + 1, - hasNextPage: Math.floor(offset / limit) + 1 < Math.ceil(totalCount / limit), - }, + hasNextPage: + Math.floor(offset / limit) + 1 < Math.ceil(totalCount / limit) + } }; } catch (error) { consoleLogger( @@ -131,6 +152,7 @@ export class ReceiptController { } } + async getReceiptIdByTransactionHash( transactionHash: string ): Promise { @@ -184,7 +206,7 @@ export class ReceiptController { blockNumber: receiptsMetaInIndexerEvm.blockNumber, timestamp: receiptsMetaInIndexerEvm.timestamp, transactionHash: receiptsMetaInIndexerEvm.transactionHash, - transactionIndex: receiptsMetaInIndexerEvm.transactionIndex, + transactionIndex: receiptsMetaInIndexerEvm.transactionIndex }) .from(receiptsMetaInIndexerEvm) .where(eq(receiptsMetaInIndexerEvm.receiptId, receiptId)); @@ -196,7 +218,7 @@ export class ReceiptController { blockNumber: receiptsMetaInIndexerSolana.blockNumber, timestamp: receiptsMetaInIndexerSolana.timestamp, transactionHash: receiptsMetaInIndexerSolana.transactionHash, - transactionIndex: receiptsMetaInIndexerSolana.transactionIndex, + transactionIndex: receiptsMetaInIndexerSolana.transactionIndex }) .from(receiptsMetaInIndexerSolana) .where(eq(receiptsMetaInIndexerSolana.receiptId, receiptId)); @@ -217,9 +239,9 @@ export class ReceiptController { return { receipt: { ...result, - signaturesRequired: bridgeValidators[result.chainTo].length, + signaturesRequired: bridgeValidators[result.chainTo].length }, - receiptMeta: [...metaEvm, ...metaSolana], + receiptMeta: [...metaEvm, ...metaSolana] }; } catch (error) { consoleLogger( @@ -233,13 +255,13 @@ export class ReceiptController { async getReceiptSignatures( receiptId: `${number}_${number}_${number}` - ): Promise>> { + ): Promise>> { try { await this.db.refreshMaterializedView(receipt); const signaturesData = await this.db .select({ signedBy: signatures.signedBy, - signature: signatures.signature, + signature: signatures.signature }) .from(signatures) .where(eq(signatures.receiptId, receiptId)) @@ -284,13 +306,13 @@ export class ReceiptController { eq(receipt.claimed, false), chainEnum === "svm" ? or( - eq(receipt.chainTo, SOLANA_CHAIN_ID.toString()), - eq(receipt.chainTo, SOLANA_DEV_CHAIN_ID.toString()) - ) + eq(receipt.chainTo, SOLANA_CHAIN_ID.toString()), + eq(receipt.chainTo, SOLANA_DEV_CHAIN_ID.toString()) + ) : and( - ne(receipt.chainTo, SOLANA_CHAIN_ID.toString()), - ne(receipt.chainTo, SOLANA_DEV_CHAIN_ID.toString()) - ), + ne(receipt.chainTo, SOLANA_CHAIN_ID.toString()), + ne(receipt.chainTo, SOLANA_DEV_CHAIN_ID.toString()) + ), notInArray( receipt.receiptId, this.db @@ -304,9 +326,9 @@ export class ReceiptController { return receipts.map((r) => ({ receipts: { ...r.receipts, - signaturesRequired: bridgeValidators[r.receipts.chainTo].length, + signaturesRequired: bridgeValidators[r.receipts.chainTo].length }, - receiptsMeta: r.receiptsMeta, + receiptsMeta: r.receiptsMeta })); } @@ -322,7 +344,7 @@ export class ReceiptController { "uint256", "uint256", "uint256", - "bytes", + "bytes" ], [ receiptToSign.to as `0x${string}`, @@ -332,7 +354,7 @@ export class ReceiptController { BigInt(receiptToSign.chainTo), BigInt(receiptToSign.eventId), BigInt(receiptToSign.flags) >> 65n, - receiptToSign.data as `0x${string}`, + receiptToSign.data as `0x${string}` ] ); const messageHash = keccak256(message); @@ -350,7 +372,7 @@ export class ReceiptController { chainTo: BigInt(receiptToSign.chainTo), eventId: BigInt(receiptToSign.eventId), flags: toBytes(BigInt(receiptToSign.flags), { size: 32 }), - flagData: toBytes(receiptToSign.data), + flagData: toBytes(receiptToSign.data) }); const payload = serializeReceivePayload(value); const messageHash = keccak256(payload); @@ -365,7 +387,7 @@ export class ReceiptController { const messageHash = this.hashedMsgEVM(receiptToSign); const signerRecovered = await recoverMessageAddress({ message: { raw: messageHash }, - signature, + signature }); if (signerRecovered !== signer) throw new Error("Invalid signature");