Skip to content

Commit 4be004b

Browse files
committed
refactored transceiver message parsing
1 parent 85f914f commit 4be004b

File tree

13 files changed

+105
-94
lines changed

13 files changed

+105
-94
lines changed

wormhole-connect/src/hooks/useCheckInboundQueuedTransfer.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import { isSignedNttMessage } from 'routes/types';
1010
import { isNttRoute } from 'routes';
1111
import RouteOperator from 'routes/operator';
1212
import { NttBase } from 'routes/ntt/nttBase';
13+
import { parseWormholeTransceiverMessage } from 'routes/ntt';
1314

1415
const RETRY_DELAY = 15_000;
1516

@@ -34,8 +35,15 @@ const useCheckInboundQueuedTransfer = () => {
3435
) {
3536
return;
3637
}
37-
const { toChain, recipientNttManager, transceiverMessage, fromChain } =
38-
signedMessage;
38+
const {
39+
toChain,
40+
recipientNttManager,
41+
wormholeTransceiverMessage,
42+
fromChain,
43+
} = signedMessage;
44+
const { nttManagerPayload } = parseWormholeTransceiverMessage(
45+
wormholeTransceiverMessage,
46+
);
3947
const ntt = RouteOperator.getRoute(route) as NttBase;
4048
let active = true;
4149
const fetchData = async () => {
@@ -44,7 +52,7 @@ const useCheckInboundQueuedTransfer = () => {
4452
const queuedTransfer = await ntt.getInboundQueuedTransfer(
4553
toChain,
4654
recipientNttManager,
47-
transceiverMessage,
55+
nttManagerPayload,
4856
fromChain,
4957
);
5058
if (active) {
-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
export * from './nttBase';
22
export * from './nttManual';
33
export * from './nttRelay';
4-
export * from './consts';
54
export * from './errors';
65
export * from './types';
76
export * from './utils';

wormhole-connect/src/routes/ntt/nttBase.ts

+13-25
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,11 @@ import {
3737
} from './errors';
3838
import { getMessageEvm } from './platforms/evm';
3939
import { getMessageSolana } from './platforms/solana';
40-
import { WormholeTransceiverMessage } from './payloads/wormhole';
4140
import { NttManagerMessage } from './payloads/common';
4241
import { NativeTokenTransfer } from './payloads/transfers';
4342
import { formatGasFee } from 'routes/utils';
4443
import { NO_INPUT } from 'utils/style';
44+
import { parseWormholeTransceiverMessage } from './utils';
4545

4646
export abstract class NttBase extends BaseRoute {
4747
isSupportedChain(chain: ChainName): boolean {
@@ -163,8 +163,7 @@ export abstract class NttBase extends BaseRoute {
163163
if (isEvmChain(sendingChain)) {
164164
const provider = wh.mustGetProvider(sendingChain);
165165
const gasPrice = await provider.getGasPrice();
166-
const estSendGas = 200000;
167-
return gasPrice.mul(estSendGas);
166+
return gasPrice.mul(200000);
168167
} else if (wh.toChainName(sendingChain) === 'solana') {
169168
return BigNumber.from(10000);
170169
}
@@ -182,8 +181,7 @@ export abstract class NttBase extends BaseRoute {
182181
if (isEvmChain(destChain)) {
183182
const provider = wh.mustGetProvider(destChain);
184183
const gasPrice = await provider.getGasPrice();
185-
const estClaimGas = 300000;
186-
return gasPrice.mul(estClaimGas);
184+
return gasPrice.mul(300000);
187185
} else if (wh.toChainName(destChain) === 'solana') {
188186
return BigNumber.from(65000);
189187
}
@@ -227,7 +225,6 @@ export abstract class NttBase extends BaseRoute {
227225
wh.toChainId(sendingChain),
228226
tokenConfig.tokenId,
229227
);
230-
// remove any dust before sending
231228
const sendAmount = removeDust(parseUnits(amount, decimals), decimals);
232229
const shouldSkipRelayerSend = this.TYPE !== Route.NttRelay;
233230
return await nttManager.send(
@@ -304,37 +301,29 @@ export abstract class NttBase extends BaseRoute {
304301
async getInboundQueuedTransfer(
305302
chain: ChainName | ChainId,
306303
nttManagerAddress: string,
307-
transceiverMessage: string,
304+
message: NttManagerMessage<NativeTokenTransfer>,
308305
fromChain: ChainName | ChainId,
309306
): Promise<InboundQueuedTransfer | undefined> {
310-
const nttManagerMessage = WormholeTransceiverMessage.deserialize(
311-
Buffer.from(transceiverMessage.slice(2), 'hex'),
312-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
313-
).ntt_managerPayload;
314307
return await getNttManager(
315308
chain,
316309
nttManagerAddress,
317-
).getInboundQueuedTransfer(fromChain, nttManagerMessage);
310+
).getInboundQueuedTransfer(fromChain, message);
318311
}
319312

320313
async completeInboundQueuedTransfer(
321314
chain: ChainName | ChainId,
322315
nttManagerAddress: string,
323-
transceiverMessage: string,
316+
message: NttManagerMessage<NativeTokenTransfer>,
324317
fromChain: ChainName | ChainId,
325318
payer: string,
326319
): Promise<string> {
327-
const nttManagerMessage = WormholeTransceiverMessage.deserialize(
328-
Buffer.from(transceiverMessage.slice(2), 'hex'),
329-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
330-
).ntt_managerPayload;
331320
const nttManager = getNttManager(chain, nttManagerAddress);
332321
if (await nttManager.isPaused()) {
333322
throw new ContractIsPausedError();
334323
}
335324
return await nttManager.completeInboundQueuedTransfer(
336325
fromChain,
337-
nttManagerMessage,
326+
message,
338327
payer,
339328
);
340329
}
@@ -395,21 +384,20 @@ export abstract class NttBase extends BaseRoute {
395384
if (!isSignedNttMessage(signedMessage)) {
396385
throw new Error('Invalid signed message');
397386
}
398-
const { fromChain, recipientNttManager, transceiverMessage } =
387+
const { fromChain, recipientNttManager, wormholeTransceiverMessage } =
399388
signedMessage;
400-
const nttManagerMessage = WormholeTransceiverMessage.deserialize(
401-
Buffer.from(transceiverMessage.slice(2), 'hex'),
402-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
403-
).ntt_managerPayload;
389+
const { nttManagerPayload } = parseWormholeTransceiverMessage(
390+
wormholeTransceiverMessage,
391+
);
404392
const nttManager = getNttManager(chain, recipientNttManager);
405393
const isMessageExecuted = await nttManager.isMessageExecuted(
406394
fromChain,
407-
nttManagerMessage,
395+
nttManagerPayload,
408396
);
409397
if (isMessageExecuted) {
410398
const queuedTransfer = await nttManager.getInboundQueuedTransfer(
411399
fromChain,
412-
nttManagerMessage,
400+
nttManagerPayload,
413401
);
414402
return !queuedTransfer;
415403
}

wormhole-connect/src/routes/ntt/nttRelay.ts

+11-10
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ import { toChainId, wh } from 'utils/sdk';
2121
import { NO_INPUT } from 'utils/style';
2222
import { TokenPrices } from 'store/tokenPrices';
2323
import { toDecimals, toFixedDecimals } from 'utils/balance';
24-
import { NttManagerMessage } from './payloads/common';
25-
import { NativeTokenTransfer } from './payloads/transfers';
26-
import { WormholeTransceiverMessage } from './payloads/wormhole';
24+
import { parseWormholeTransceiverMessage } from './utils';
2725

2826
export class NttRelay extends NttBase {
2927
readonly NATIVE_GAS_DROPOFF_SUPPORTED: boolean = false;
@@ -190,15 +188,18 @@ export class NttRelay extends NttBase {
190188
if (!isUnsignedNttMessage(txData)) {
191189
throw new Error('invalid txData');
192190
}
193-
const { transceiverMessage, toChain, fromChain, recipientNttManager } =
194-
txData;
195-
const nttManagerMessage = WormholeTransceiverMessage.deserialize(
196-
Buffer.from(transceiverMessage.slice(2), 'hex'),
197-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
198-
).ntt_managerPayload;
191+
const {
192+
wormholeTransceiverMessage,
193+
toChain,
194+
fromChain,
195+
recipientNttManager,
196+
} = txData;
197+
const { nttManagerPayload } = parseWormholeTransceiverMessage(
198+
wormholeTransceiverMessage,
199+
);
199200
const nttManager = getNttManager(toChain, recipientNttManager);
200201
try {
201-
return await nttManager.fetchRedeemTx(fromChain, nttManagerMessage);
202+
return await nttManager.fetchRedeemTx(fromChain, nttManagerPayload);
202203
} catch (e) {
203204
console.error(e);
204205
}

wormhole-connect/src/routes/ntt/payloads/common.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ export class TransceiverMessage<A> {
44
static prefix: Buffer;
55
sourceNttManager: Buffer;
66
recipientNttManager: Buffer;
7-
ntt_managerPayload: NttManagerMessage<A>;
7+
nttManagerPayload: NttManagerMessage<A>;
88
transceiverPayload: Buffer;
99

1010
constructor(
@@ -15,7 +15,7 @@ export class TransceiverMessage<A> {
1515
) {
1616
this.sourceNttManager = sourceNttManager;
1717
this.recipientNttManager = recipientNttManager;
18-
this.ntt_managerPayload = ntt_managerPayload;
18+
this.nttManagerPayload = ntt_managerPayload;
1919
this.transceiverPayload = transceiverPayload;
2020
}
2121

@@ -53,7 +53,7 @@ export class TransceiverMessage<A> {
5353
msg: TransceiverMessage<A>,
5454
serializer: (payload: NttManagerMessage<A>) => Buffer,
5555
): Buffer {
56-
const payload = serializer(msg.ntt_managerPayload);
56+
const payload = serializer(msg.nttManagerPayload);
5757
const payloadLen = new BN(payload.length).toBuffer('be', 2);
5858
const transceiverPayloadLen = new BN(
5959
msg.transceiverPayload.length,

wormhole-connect/src/routes/ntt/platforms/evm/getMessage.ts

+4-9
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,7 @@ import { getTokenById, getTokenDecimals } from 'utils';
1414
import { wh } from 'utils/sdk';
1515
import { getWormholeLogEvm } from 'utils/vaa';
1616
import { NttManager__factory } from './abis';
17-
import { NttManagerMessage } from '../../payloads/common';
18-
import { WormholeTransceiverMessage } from '../../payloads/wormhole';
19-
import { NativeTokenTransfer } from '../../payloads/transfers';
17+
import { parseWormholeTransceiverMessage } from 'routes/ntt/utils';
2018

2119
export const getMessageEvm = async (
2220
tx: string,
@@ -72,11 +70,8 @@ export const getMessageEvm = async (
7270
relayerFee = parsed.args.deliveryQuote.toString();
7371
}
7472
}
75-
const transceiverMessage = WormholeTransceiverMessage.deserialize(
76-
payload,
77-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
78-
);
79-
const nttManagerMessage = transceiverMessage.ntt_managerPayload;
73+
const transceiverMessage = parseWormholeTransceiverMessage(payload);
74+
const nttManagerMessage = transceiverMessage.nttManagerPayload;
8075
const toChain = wh.toChainName(nttManagerMessage.payload.recipientChain);
8176
const receivedTokenKey = getNativeVersionOfToken(token.symbol, toChain);
8277
const destToken = TOKENS[receivedTokenKey];
@@ -113,7 +108,7 @@ export const getMessageEvm = async (
113108
transceiverMessage.recipientNttManager,
114109
toChain,
115110
),
116-
transceiverMessage: hexlify(payload),
111+
wormholeTransceiverMessage: hexlify(payload),
117112
relayerFee,
118113
};
119114
};

wormhole-connect/src/routes/ntt/platforms/solana/getMessage.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ import { getNativeVersionOfToken } from 'store/transferInput';
66
import { getTokenById, getTokenDecimals } from 'utils';
77
import { wh } from 'utils/sdk';
88
import { TokenId } from '@wormhole-foundation/wormhole-connect-sdk';
9-
import { WormholeTransceiverMessage } from '../../payloads/wormhole';
10-
import { NttManagerMessage } from '../../payloads/common';
11-
import { NativeTokenTransfer } from '../../payloads/transfers';
9+
import { parseWormholeTransceiverMessage } from 'routes/ntt/utils';
1210

1311
export const getMessageSolana = async (
1412
tx: string,
@@ -37,11 +35,10 @@ export const getMessageSolana = async (
3735
const messageData = PostedMessageData.deserialize(
3836
wormholeMessageAccount.data,
3937
);
40-
const transceiverMessage = WormholeTransceiverMessage.deserialize(
38+
const transceiverMessage = parseWormholeTransceiverMessage(
4139
messageData.message.payload,
42-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
4340
);
44-
const nttManagerMessage = transceiverMessage.ntt_managerPayload;
41+
const nttManagerMessage = transceiverMessage.nttManagerPayload;
4542
const fromChain = wh.toChainName('solana');
4643
const toChain = wh.toChainName(nttManagerMessage.payload.recipientChain);
4744
const tokenAddress = wh.parseAddress(
@@ -86,7 +83,7 @@ export const getMessageSolana = async (
8683
hexlify(transceiverMessage.recipientNttManager),
8784
toChain,
8885
),
89-
transceiverMessage: hexlify(messageData.message.payload),
86+
wormholeTransceiverMessage: hexlify(messageData.message.payload),
9087
relayerFee: '',
9188
};
9289
};

wormhole-connect/src/routes/ntt/platforms/solana/nttManager.ts

+14-21
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ import {
1616
import { BN } from '@coral-xyz/anchor';
1717
import { parseVaa } from '@certusone/wormhole-sdk/lib/esm';
1818
import { utils } from 'ethers';
19-
import { WormholeTransceiverMessage } from '../../payloads/wormhole';
2019
import { NttManagerMessage } from '../../payloads/common';
2120
import { NativeTokenTransfer } from '../../payloads/transfers';
21+
import { parseWormholeTransceiverMessage } from 'routes/ntt/utils';
2222

2323
// TODO: make sure this is in sync with the contract
2424
const RATE_LIMIT_DURATION = 24 * 60 * 60;
@@ -76,9 +76,6 @@ export class NttManagerSolana {
7676
new PublicKey(token.address),
7777
payer,
7878
);
79-
// TODO: make sure limits change
80-
const limit = await this.getCurrentOutboundCapacity();
81-
console.log('limit', limit);
8279
const txArgs = {
8380
payer,
8481
from: tokenAccount,
@@ -168,14 +165,13 @@ export class NttManagerSolana {
168165
// just make the second instruction a no-op in case the transfer is delayed.
169166
tx.add(await this.ntt.createReceiveWormholeMessageInstruction(redeemArgs));
170167
tx.add(await this.ntt.createRedeemInstruction(redeemArgs));
171-
const nttManagerMessage = WormholeTransceiverMessage.deserialize(
168+
const { nttManagerPayload } = parseWormholeTransceiverMessage(
172169
parsedVaa.payload,
173-
(a) => NttManagerMessage.deserialize(a, NativeTokenTransfer.deserialize),
174-
).ntt_managerPayload;
170+
);
175171
const releaseArgs = {
176172
...redeemArgs,
177-
ntt_managerMessage: nttManagerMessage,
178-
recipient: new PublicKey(nttManagerMessage.payload.recipientAddress),
173+
ntt_managerMessage: nttManagerPayload,
174+
recipient: new PublicKey(nttManagerPayload.payload.recipientAddress),
179175
chain: chainId,
180176
revertOnDelay: false,
181177
};
@@ -247,11 +243,11 @@ export class NttManagerSolana {
247243

248244
async getInboundQueuedTransfer(
249245
emitterChain: ChainName | ChainId,
250-
managerMessage: NttManagerMessage<NativeTokenTransfer>,
246+
message: NttManagerMessage<NativeTokenTransfer>,
251247
): Promise<InboundQueuedTransfer | undefined> {
252248
let inboxItem;
253249
try {
254-
inboxItem = await this.ntt.getInboxItem(emitterChain, managerMessage);
250+
inboxItem = await this.ntt.getInboxItem(emitterChain, message);
255251
} catch (e: any) {
256252
if (e.message?.includes('Account does not exist')) {
257253
return undefined;
@@ -271,14 +267,14 @@ export class NttManagerSolana {
271267

272268
async completeInboundQueuedTransfer(
273269
emitterChain: ChainName | ChainId,
274-
nttManagerMessage: NttManagerMessage<NativeTokenTransfer>,
270+
message: NttManagerMessage<NativeTokenTransfer>,
275271
payer: string,
276272
): Promise<string> {
277273
const payerPublicKey = new PublicKey(payer);
278274
const releaseArgs = {
279275
payer: payerPublicKey,
280-
ntt_managerMessage: nttManagerMessage,
281-
recipient: new PublicKey(nttManagerMessage.payload.recipientAddress),
276+
ntt_managerMessage: message,
277+
recipient: new PublicKey(message.payload.recipientAddress),
282278
chain: emitterChain,
283279
revertOnDelay: false,
284280
};
@@ -315,13 +311,10 @@ export class NttManagerSolana {
315311

316312
async isMessageExecuted(
317313
emitterChain: ChainName | ChainId,
318-
nttManagerMessage: NttManagerMessage<NativeTokenTransfer>,
314+
message: NttManagerMessage<NativeTokenTransfer>,
319315
): Promise<boolean> {
320316
try {
321-
const inboxItem = await this.ntt.getInboxItem(
322-
emitterChain,
323-
nttManagerMessage,
324-
);
317+
const inboxItem = await this.ntt.getInboxItem(emitterChain, message);
325318
return (
326319
inboxItem.releaseStatus.released !== null &&
327320
inboxItem.releaseStatus.released !== undefined
@@ -340,11 +333,11 @@ export class NttManagerSolana {
340333

341334
async fetchRedeemTx(
342335
emitterChain: ChainName | ChainId,
343-
nttManagerMessage: NttManagerMessage<NativeTokenTransfer>,
336+
message: NttManagerMessage<NativeTokenTransfer>,
344337
): Promise<string | undefined> {
345338
const address = await this.ntt.inboxItemAccountAddress(
346339
emitterChain,
347-
nttManagerMessage,
340+
message,
348341
);
349342
// fetch the most recent signature
350343
const signatures = await this.connection.getSignaturesForAddress(address, {

0 commit comments

Comments
 (0)