Skip to content

Commit 3b7ffec

Browse files
committed
support resume
1 parent eed02b8 commit 3b7ffec

File tree

2 files changed

+80
-23
lines changed

2 files changed

+80
-23
lines changed

sdk/route/src/multiTokenAutomatic.ts

+38-23
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ import {
1414
Wormhole,
1515
WormholeMessageId,
1616
amount,
17-
canonicalAddress,
1817
finality,
1918
isAttested,
2019
isDestinationQueued,
@@ -268,8 +267,13 @@ export class MultiTokenNttAutomaticRoute<N extends Network>
268267
}
269268

270269
async resume(tx: TransactionId): Promise<R> {
270+
// TODO: this is a hack since whscan doesn't support looking up VAA by txid for monad devnet yet
271+
const fromChain = this.wh.getChain(tx.chain);
272+
const [msg] = await fromChain.parseTransaction(tx.txid);
273+
if (!msg) throw new Error("No Wormhole messages found");
274+
271275
const vaa = await this.wh.getVaa(
272-
tx.txid,
276+
msg,
273277
"Ntt:MultiTokenWormholeTransferStandardRelayer"
274278
);
275279
if (!vaa) throw new Error("No VAA found for transaction: " + tx.txid);
@@ -286,26 +290,32 @@ export class MultiTokenNttAutomaticRoute<N extends Network>
286290
payload.nttManagerPayload.payload.data.token.token.tokenAddress;
287291
const { trimmedAmount } = payload.nttManagerPayload.payload.data;
288292

289-
const tokenId = Wormhole.tokenId(vaa.emitterChain, sourceToken.toString());
290-
const manager = canonicalAddress({
291-
chain: vaa.emitterChain,
292-
address: payload["sourceNttManager"],
293-
});
294-
// const fromMultiTokenNttManager = payload.nttManagerPayload.payload.callee;
295-
296-
const srcInfo = MultiTokenNttRoute.resolveNttContracts(
297-
this.staticConfig,
298-
tokenId
299-
);
293+
const tokenChain =
294+
payload.nttManagerPayload.payload.data.token.token.chainId;
295+
const tokenId = Wormhole.tokenId(tokenChain, sourceToken.toString());
296+
//const manager = canonicalAddress({
297+
// chain: vaa.emitterChain,
298+
// address: payload.nttManagerPayload.payload.callee,
299+
//});
300300

301-
const dstInfo = MultiTokenNttRoute.resolveDestinationNttContracts(
301+
// const srcInfo = MultiTokenNttRoute.resolveNttContracts(
302+
// this.staticConfig,
303+
// tokenId
304+
//);
305+
306+
//const dstInfo = MultiTokenNttRoute.resolveDestinationNttContracts(
307+
// this.staticConfig,
308+
// {
309+
// chain: vaa.emitterChain,
310+
// address: Wormhole.chainAddress(vaa.emitterChain, manager).address,
311+
// },
312+
// recipientChain
313+
//);
314+
315+
const { srcInfo, dstInfo } = MultiTokenNttRoute.resolveNttContractsByToken(
302316
this.staticConfig,
303-
{
304-
chain: vaa.emitterChain,
305-
// TODO: is sourceNttManager the same as fromMultiTokenNttManager (defined above)?
306-
address: Wormhole.chainAddress(vaa.emitterChain, srcInfo.manager)
307-
.address,
308-
},
317+
tokenId,
318+
fromChain.chain,
309319
recipientChain
310320
);
311321

@@ -330,8 +340,8 @@ export class MultiTokenNttAutomaticRoute<N extends Network>
330340
amount: amt,
331341
options: { queue: false, automatic: true },
332342
sourceContracts: {
333-
token: tokenId.address.toString(),
334-
manager,
343+
token: srcInfo.token,
344+
manager: srcInfo.manager,
335345
gmpManager: srcInfo.gmpManager,
336346
transceiver: {
337347
wormhole: srcInfo.transceiver.wormhole,
@@ -385,8 +395,13 @@ export class MultiTokenNttAutomaticRoute<N extends Network>
385395
if (isSourceInitiated(receipt) || isSourceFinalized(receipt)) {
386396
const { txid } = receipt.originTxs[receipt.originTxs.length - 1]!;
387397

398+
// TODO: this is a hack since whscan doesn't support looking up VAA by txid for monad devnet yet
399+
const fromChain = this.wh.getChain(receipt.from);
400+
const [msg] = await fromChain.parseTransaction(txid);
401+
if (!msg) throw new Error("No Wormhole messages found");
402+
388403
const vaa = await this.wh.getVaa(
389-
txid,
404+
msg,
390405
"Ntt:MultiTokenWormholeTransferStandardRelayer",
391406
timeout
392407
);

sdk/route/src/types.ts

+42
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,48 @@ export namespace MultiTokenNttRoute {
408408
throw new Error("Cannot find Ntt contracts in config for: " + address);
409409
}
410410

411+
export function resolveNttContractsByToken(
412+
config: Config,
413+
token: TokenId,
414+
fromChain: Chain,
415+
toChain: Chain
416+
): { srcInfo: MultiTokenNtt.Contracts; dstInfo: MultiTokenNtt.Contracts } {
417+
const cfg = Object.values(config.tokens);
418+
const address = canonicalAddress(token);
419+
for (const tokens of cfg) {
420+
const found = tokens.find(
421+
(tc) =>
422+
tc.token.toLowerCase() === address.toLowerCase() &&
423+
tc.chain === token.chain
424+
);
425+
if (found) {
426+
const src = tokens.find((tc) => tc.chain === fromChain)!;
427+
const dst = tokens.find((tc) => tc.chain === toChain)!;
428+
return {
429+
srcInfo: {
430+
token: src.token,
431+
manager: src.manager,
432+
gmpManager: src.gmpManager,
433+
transceiver: {
434+
wormhole: src.transceiver.find((v) => v.type === "wormhole")!
435+
.address,
436+
},
437+
},
438+
dstInfo: {
439+
token: dst.token,
440+
manager: dst.manager,
441+
gmpManager: dst.gmpManager,
442+
transceiver: {
443+
wormhole: dst.transceiver.find((v) => v.type === "wormhole")!
444+
.address,
445+
},
446+
},
447+
};
448+
}
449+
}
450+
throw new Error("Cannot find Ntt contracts in config for: " + address);
451+
}
452+
411453
// returns true if the amount is greater than 95% of the capacity
412454
// useful for warning about the possibility of a transfer being queued
413455
export function isCapacityThresholdExceeded(

0 commit comments

Comments
 (0)