From bf8c89929d91d5b0ba40c52df8f3544bec7df18e Mon Sep 17 00:00:00 2001 From: Nayan Das Date: Sun, 8 Mar 2026 12:47:24 +0530 Subject: [PATCH] fix(sdk-coin-tempo): fix nonce 0 RLP encoding and verifyTransaction for TSS flow Ticket: CECHO-325 --- modules/sdk-coin-tempo/src/lib/transaction.ts | 2 +- modules/sdk-coin-tempo/src/tempo.ts | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/modules/sdk-coin-tempo/src/lib/transaction.ts b/modules/sdk-coin-tempo/src/lib/transaction.ts index 070921c85b..41c1b07c33 100644 --- a/modules/sdk-coin-tempo/src/lib/transaction.ts +++ b/modules/sdk-coin-tempo/src/lib/transaction.ts @@ -128,7 +128,7 @@ export class Tip20Transaction extends BaseTransaction { callsTuples, accessTuples, '0x', // nonceKey (reserved for 2D nonce system) - ethers.utils.hexlify(this.txRequest.nonce), + this.txRequest.nonce ? this.bigintToHex(BigInt(this.txRequest.nonce)) : '0x', '0x', // validBefore (reserved for time bounds) '0x', // validAfter (reserved for time bounds) this.txRequest.feeToken || '0x', diff --git a/modules/sdk-coin-tempo/src/tempo.ts b/modules/sdk-coin-tempo/src/tempo.ts index 0265b2b361..ee053348dd 100644 --- a/modules/sdk-coin-tempo/src/tempo.ts +++ b/modules/sdk-coin-tempo/src/tempo.ts @@ -25,7 +25,7 @@ import { } from '@bitgo/sdk-core'; import { BaseCoin as StaticsBaseCoin, coins } from '@bitgo/statics'; import { Tip20Transaction, Tip20TransactionBuilder } from './lib'; -import { amountToTip20Units, isValidMemoId as isValidMemoIdUtil } from './lib/utils'; +import { amountToTip20Units, isTip20Transaction, isValidMemoId as isValidMemoIdUtil } from './lib/utils'; import * as url from 'url'; import * as querystring from 'querystring'; @@ -213,6 +213,9 @@ export class Tempo extends AbstractEthLikeNewCoins { if (!txHex) { return {}; } + if (!isTip20Transaction(txHex)) { + return {}; + } const txBuilder = this.getTransactionBuilder(); txBuilder.from(txHex); const tx = (await txBuilder.build()) as Tip20Transaction; @@ -241,8 +244,14 @@ export class Tempo extends AbstractEthLikeNewCoins { return true; } + // signableHex may arrive without the 0x prefix (e.g. from the TSS signing flow). + const txHex = txPrebuild.txHex.startsWith('0x') ? txPrebuild.txHex : '0x' + txPrebuild.txHex; + if (!isTip20Transaction(txHex)) { + throw new Error(`Invalid Tempo transaction hex: expected a 0x76 TIP-20 transaction`); + } + const txBuilder = this.getTransactionBuilder(); - txBuilder.from(txPrebuild.txHex); + txBuilder.from(txHex); const tx = (await txBuilder.build()) as Tip20Transaction; const operations = tx.getOperations();