Skip to content

Commit 95686fc

Browse files
committed
refactor
1 parent c2fc6ed commit 95686fc

File tree

7 files changed

+152
-106
lines changed

7 files changed

+152
-106
lines changed

evm/ts/src/multiTokenNtt.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,6 @@ export class EvmMultiTokenNtt<N extends Network, C extends EvmChains>
265265
dstChain,
266266
gasLimit
267267
).catch(() => 0n);
268-
console.log("gas fee", gasFee);
269268
return {
270269
index: transceiver.index,
271270
payload: encoding.bignum.toBytes(gasFee, 32),
@@ -300,13 +299,14 @@ export class EvmMultiTokenNtt<N extends Network, C extends EvmChains>
300299
sender: AccountAddress<C>,
301300
token: TokenAddress<C>,
302301
amount: bigint,
303-
destination: ChainAddress
302+
destination: ChainAddress,
303+
destinationGasLimit: bigint
304304
): AsyncGenerator<EvmUnsignedTransaction<N, C>> {
305305
const senderAddress = new EvmAddress(sender).toString();
306306

307307
const transceiverInstructions = await this.createTransceiverInstructions(
308308
destination.chain,
309-
800_000n // TODO: make this configurable
309+
destinationGasLimit
310310
);
311311

312312
const totalPrice = await this.quoteDeliveryPrice(
@@ -625,4 +625,21 @@ export class EvmMultiTokenNtt<N extends Network, C extends EvmChains>
625625
parallelizable
626626
);
627627
}
628+
629+
async estimateGasLimit(
630+
originalToken: MultiTokenNtt.OriginalTokenId
631+
): Promise<bigint> {
632+
const GAS_LIMIT = 500_000n;
633+
634+
// More gas is needed to create the token on the destination chain
635+
const GAS_LIMIT_CREATE_TOKEN = 1_000_000n;
636+
637+
// Check if the token already exists on the destination chain
638+
const existingToken = await this.getLocalToken(originalToken);
639+
const isUnattested = existingToken === null;
640+
641+
const gasLimit = isUnattested ? GAS_LIMIT_CREATE_TOKEN : GAS_LIMIT;
642+
643+
return gasLimit;
644+
}
628645
}

evm/ts/src/multiTokenNttWithExecutor.ts

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import {
2424
type MultiTokenNtt,
2525
type MultiTokenNttWithExecutor,
2626
} from "@wormhole-foundation/sdk-definitions-ntt";
27-
import { EvmMultiTokenNtt } from "./multiTokenNtt.js";
2827

2928
const multiTokenNttWithExecutorAddresses: Partial<
3029
Record<Network, Partial<Record<EvmChains, string>>>
@@ -194,27 +193,6 @@ export class EvmMultiTokenNttWithExecutor<
194193
);
195194
}
196195

197-
async estimateMsgValueAndGasLimit(
198-
originalToken: MultiTokenNtt.OriginalTokenId,
199-
multiTokenNtt: EvmMultiTokenNtt<N, C>
200-
): Promise<{ msgValue: bigint; gasLimit: bigint }> {
201-
const GAS_LIMIT = 500_000n;
202-
203-
// More gas is needed to create the token on the destination chain
204-
const GAS_LIMIT_CREATE_TOKEN = 1_000_000n;
205-
206-
// Check if the token already exists on the destination chain
207-
const existingToken = await multiTokenNtt.getLocalToken(originalToken);
208-
const isUnattested = existingToken === null;
209-
210-
const gasLimit = isUnattested ? GAS_LIMIT_CREATE_TOKEN : GAS_LIMIT;
211-
212-
return {
213-
msgValue: 0n,
214-
gasLimit,
215-
};
216-
}
217-
218196
createUnsignedTx(
219197
txReq: TransactionRequest,
220198
description: string,

sdk/definitions/src/multiTokenNtt.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ export interface MultiTokenNtt<N extends Network, C extends Chain> {
108108
sender: AccountAddress<C>,
109109
token: TokenAddress<C>,
110110
amount: bigint,
111-
destination: ChainAddress
111+
destination: ChainAddress,
112+
destinationGasLimit: bigint
112113
): AsyncGenerator<UnsignedTransaction<N, C>>;
113114

114115
redeem(
@@ -163,6 +164,10 @@ export interface MultiTokenNtt<N extends Network, C extends Chain> {
163164
): Promise<TokenAddress<C>>;
164165

165166
getWrappedNativeToken(): Promise<TokenId>;
167+
168+
estimateGasLimit(
169+
originalToken: MultiTokenNtt.OriginalTokenId
170+
): Promise<bigint>;
166171
}
167172

168173
declare module "@wormhole-foundation/sdk-definitions" {

sdk/definitions/src/multiTokenNttWithExecutor.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type {
88
UnsignedTransaction,
99
} from "@wormhole-foundation/sdk-connect";
1010
import { NttWithExecutor } from "./nttWithExecutor.js";
11-
import type { MultiTokenNtt } from "./multiTokenNtt.js";
1211
import { Ntt } from "./ntt.js";
1312

1413
export namespace MultiTokenNttWithExecutor {
@@ -26,11 +25,6 @@ export interface MultiTokenNttWithExecutor<N extends Network, C extends Chain> {
2625
amount: bigint,
2726
quote: MultiTokenNttWithExecutor.Quote
2827
): AsyncGenerator<UnsignedTransaction<N, C>>;
29-
30-
estimateMsgValueAndGasLimit(
31-
originalToken: MultiTokenNtt.OriginalTokenId,
32-
multiTokenNtt: MultiTokenNtt<N, C>
33-
): Promise<{ msgValue: bigint; gasLimit: bigint }>;
3428
}
3529

3630
declare module "@wormhole-foundation/sdk-definitions" {

sdk/route/src/executor/multiToken.ts

Lines changed: 46 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ import { trackAxelar, trackExecutor } from "../tracking.js";
5959

6060
export namespace MultiTokenNttExecutorRoute {
6161
export type Config = {
62-
ntt: MultiTokenNttRoute.Config;
62+
contracts: MultiTokenNtt.Contracts[];
6363
referrerFee?: ReferrerFeeConfig;
6464
};
6565

@@ -72,8 +72,6 @@ export namespace MultiTokenNttExecutorRoute {
7272

7373
export type NormalizedParams = MultiTokenNttRoute.NormalizedParams & {
7474
referrerFeeDbps: bigint;
75-
gasLimit: bigint;
76-
msgValue: bigint;
7775
};
7876

7977
export interface ValidatedParams
@@ -122,16 +120,19 @@ export class MultiTokenNttExecutorRoute<N extends Network>
122120
readonly staticConfig: MultiTokenNttExecutorRoute.Config =
123121
// @ts-ignore
124122
this.constructor.config;
125-
static config: MultiTokenNttExecutorRoute.Config = { ntt: { contracts: [] } };
123+
static config: MultiTokenNttExecutorRoute.Config = { contracts: [] };
126124

127125
static meta = { name: "MultiTokenNttExecutorRoute" };
128126

129127
static supportedNetworks(): Network[] {
130-
return MultiTokenNttRoute.resolveSupportedNetworks(this.config.ntt);
128+
return MultiTokenNttRoute.resolveSupportedNetworks(this.config.contracts);
131129
}
132130

133131
static supportedChains(network: Network): Chain[] {
134-
return MultiTokenNttRoute.resolveSupportedChains(this.config.ntt, network);
132+
return MultiTokenNttRoute.resolveSupportedChains(
133+
this.config.contracts,
134+
network
135+
);
135136
}
136137

137138
static async supportedDestinationTokens<N extends Network>(
@@ -143,7 +144,7 @@ export class MultiTokenNttExecutorRoute<N extends Network>
143144
sourceToken,
144145
fromChain,
145146
toChain,
146-
this.config.ntt
147+
this.config.contracts
147148
);
148149
return [destinationTokenId];
149150
}
@@ -164,6 +165,14 @@ export class MultiTokenNttExecutorRoute<N extends Network>
164165
request: routes.RouteTransferRequest<N>,
165166
params: Tp
166167
): Promise<Vr> {
168+
if (request.fromChain.chain === request.toChain.chain) {
169+
return {
170+
valid: false,
171+
error: new Error("Source and destination chains must differ"),
172+
params,
173+
};
174+
}
175+
167176
const options = params.options ?? this.getDefaultOptions();
168177

169178
if (
@@ -185,12 +194,12 @@ export class MultiTokenNttExecutorRoute<N extends Network>
185194
);
186195

187196
const sourceContracts = MultiTokenNttRoute.resolveContracts(
188-
this.staticConfig.ntt,
197+
this.staticConfig.contracts,
189198
request.fromChain.chain
190199
);
191200

192201
const destinationContracts = MultiTokenNttRoute.resolveContracts(
193-
this.staticConfig.ntt,
202+
this.staticConfig.contracts,
194203
request.toChain.chain
195204
);
196205

@@ -208,30 +217,9 @@ export class MultiTokenNttExecutorRoute<N extends Network>
208217
request.toChain.chain
209218
);
210219

211-
const destinationNttWithExecutor = await request.toChain.getProtocol(
212-
"MultiTokenNttWithExecutor",
213-
{
214-
multiTokenNtt: destinationContracts,
215-
}
216-
);
217-
218-
const destinationNtt = await request.toChain.getProtocol("MultiTokenNtt", {
219-
multiTokenNtt: destinationContracts,
220-
});
221-
222220
const referrerFeeDbps = this.getReferrerFeeDbps(request);
223221

224-
let { msgValue, gasLimit } =
225-
await destinationNttWithExecutor.estimateMsgValueAndGasLimit(
226-
originalTokenId,
227-
destinationNtt
228-
);
229-
230-
({ msgValue, gasLimit } = this.getGasOverrides(
231-
request,
232-
msgValue,
233-
gasLimit
234-
));
222+
const gasLimit = await this.estimateGasLimit(request, originalTokenId);
235223

236224
const validatedParams: Vp = {
237225
amount: params.amount,
@@ -244,7 +232,6 @@ export class MultiTokenNttExecutorRoute<N extends Network>
244232
destinationTokenId: request.destination.id,
245233
originalTokenId,
246234
gasLimit,
247-
msgValue,
248235
sendTransceivers,
249236
},
250237
options,
@@ -418,25 +405,33 @@ export class MultiTokenNttExecutorRoute<N extends Network>
418405
: 0n;
419406
}
420407

421-
getGasOverrides(
408+
async estimateGasLimit(
422409
request: routes.RouteTransferRequest<N>,
423-
msgValue: bigint,
424-
gasLimit: bigint
425-
): { msgValue: bigint; gasLimit: bigint } {
410+
originalTokenId: MultiTokenNtt.OriginalTokenId
411+
): Promise<bigint> {
426412
if (this.staticConfig.referrerFee?.perTokenOverrides) {
427413
const destinationTokenAddress = canonicalAddress(request.destination.id);
428414
const override =
429415
this.staticConfig.referrerFee.perTokenOverrides[
430416
request.destination.id.chain
431417
]?.[destinationTokenAddress];
432418
if (override?.gasLimit !== undefined) {
433-
gasLimit = override.gasLimit;
434-
}
435-
if (override?.msgValue !== undefined) {
436-
msgValue = override.msgValue;
419+
return override.gasLimit;
437420
}
438421
}
439-
return { msgValue, gasLimit };
422+
423+
const destinationContracts = MultiTokenNttRoute.resolveContracts(
424+
this.staticConfig.contracts,
425+
request.toChain.chain
426+
);
427+
428+
const destinationNtt = await request.toChain.getProtocol("MultiTokenNtt", {
429+
multiTokenNtt: destinationContracts,
430+
});
431+
432+
const gasLimit = await destinationNtt.estimateGasLimit(originalTokenId);
433+
434+
return gasLimit;
440435
}
441436

442437
async fetchExecutorQuote(
@@ -474,7 +469,7 @@ export class MultiTokenNttExecutorRoute<N extends Network>
474469
request: {
475470
type: "GasInstruction" as const,
476471
gasLimit: params.normalizedParams.gasLimit,
477-
msgValue: params.normalizedParams.msgValue,
472+
msgValue: 0n,
478473
},
479474
});
480475

@@ -647,7 +642,7 @@ export class MultiTokenNttExecutorRoute<N extends Network>
647642
}
648643

649644
if (!receipt.attestation) {
650-
throw new Error("No attestation found for the transfer");
645+
throw new Error("No attestation found on the transfer receipt");
651646
}
652647

653648
const toChain = this.wh.getChain(receipt.to);
@@ -674,15 +669,12 @@ export class MultiTokenNttExecutorRoute<N extends Network>
674669
// already attested by the wormhole transceiver
675670
return receipt;
676671
}
677-
const completeTransfer = ntt.redeem(receipt.attestation.attestation);
678672

679-
const txids = await signSendWait(toChain, completeTransfer, signer);
680-
return {
681-
...receipt,
682-
state: TransferState.DestinationInitiated,
683-
attestation: receipt.attestation,
684-
destinationTxs: txids,
685-
};
673+
const completeXfer = ntt.redeem(receipt.attestation.attestation);
674+
675+
await signSendWait(toChain, completeXfer, signer);
676+
677+
return receipt;
686678
}
687679

688680
async resume(tx: TransactionId): Promise<R> {
@@ -696,7 +688,7 @@ export class MultiTokenNttExecutorRoute<N extends Network>
696688
const { payload } = vaa.payload.nttManagerPayload;
697689

698690
const sourceContracts = MultiTokenNttRoute.resolveContracts(
699-
this.staticConfig.ntt,
691+
this.staticConfig.contracts,
700692
fromChain.chain
701693
);
702694
if (
@@ -708,7 +700,7 @@ export class MultiTokenNttExecutorRoute<N extends Network>
708700
}
709701

710702
const destinationContracts = MultiTokenNttRoute.resolveContracts(
711-
this.staticConfig.ntt,
703+
this.staticConfig.contracts,
712704
payload.toChain
713705
);
714706

@@ -738,7 +730,7 @@ export class MultiTokenNttExecutorRoute<N extends Network>
738730
sourceTokenId,
739731
fromChain,
740732
this.wh.getChain(payload.toChain),
741-
this.staticConfig.ntt,
733+
this.staticConfig.contracts,
742734
originalTokenId
743735
);
744736

@@ -773,7 +765,6 @@ export class MultiTokenNttExecutorRoute<N extends Network>
773765
sendTransceivers,
774766
referrerFeeDbps: 0n,
775767
gasLimit: 0n,
776-
msgValue: 0n,
777768
},
778769
options: {
779770
nativeGas: undefined,

0 commit comments

Comments
 (0)