damm-sdk 1.4.18 → 1.4.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/index.cjs +689 -46
  2. package/dist/index.cjs.map +18 -3
  3. package/dist/index.js +47397 -40297
  4. package/dist/index.js.map +134 -72
  5. package/dist/integrations/ccip/ccip.router.abi.d.ts +85 -0
  6. package/dist/integrations/ccip/ccip.router.abi.d.ts.map +1 -0
  7. package/dist/integrations/ccip/ccip.router.d.ts +72 -0
  8. package/dist/integrations/ccip/ccip.router.d.ts.map +1 -0
  9. package/dist/integrations/ccip/index.d.ts +3 -0
  10. package/dist/integrations/ccip/index.d.ts.map +1 -0
  11. package/dist/integrations/index.d.ts +2 -0
  12. package/dist/integrations/index.d.ts.map +1 -1
  13. package/dist/integrations/wormhole/axelar.gmp.api.d.ts +47 -0
  14. package/dist/integrations/wormhole/axelar.gmp.api.d.ts.map +1 -0
  15. package/dist/integrations/wormhole/executor.quote.api.d.ts +100 -0
  16. package/dist/integrations/wormhole/executor.quote.api.d.ts.map +1 -0
  17. package/dist/integrations/wormhole/gmp.manager.abi.d.ts +32 -0
  18. package/dist/integrations/wormhole/gmp.manager.abi.d.ts.map +1 -0
  19. package/dist/integrations/wormhole/gmp.manager.d.ts +65 -0
  20. package/dist/integrations/wormhole/gmp.manager.d.ts.map +1 -0
  21. package/dist/integrations/wormhole/index.d.ts +10 -0
  22. package/dist/integrations/wormhole/index.d.ts.map +1 -0
  23. package/dist/integrations/wormhole/wormhole.multi.ntt.abi.d.ts +101 -0
  24. package/dist/integrations/wormhole/wormhole.multi.ntt.abi.d.ts.map +1 -0
  25. package/dist/integrations/wormhole/wormhole.multi.ntt.d.ts +149 -0
  26. package/dist/integrations/wormhole/wormhole.multi.ntt.d.ts.map +1 -0
  27. package/dist/integrations/wormhole/wormhole.scan.api.d.ts +56 -0
  28. package/dist/integrations/wormhole/wormhole.scan.api.d.ts.map +1 -0
  29. package/dist/integrations/wormhole/wormhole.transceiver.abi.d.ts +23 -0
  30. package/dist/integrations/wormhole/wormhole.transceiver.abi.d.ts.map +1 -0
  31. package/dist/integrations/wormhole/wormhole.transceiver.d.ts +28 -0
  32. package/dist/integrations/wormhole/wormhole.transceiver.d.ts.map +1 -0
  33. package/package.json +3 -2
  34. package/src/integrations/ccip/ccip.router.abi.ts +62 -0
  35. package/src/integrations/ccip/ccip.router.ts +172 -0
  36. package/src/integrations/ccip/index.ts +19 -0
  37. package/src/integrations/index.ts +2 -0
  38. package/src/integrations/wormhole/axelar.gmp.api.ts +85 -0
  39. package/src/integrations/wormhole/executor.quote.api.ts +182 -0
  40. package/src/integrations/wormhole/gmp.manager.abi.ts +26 -0
  41. package/src/integrations/wormhole/gmp.manager.ts +129 -0
  42. package/src/integrations/wormhole/index.ts +68 -0
  43. package/src/integrations/wormhole/wormhole.multi.ntt.abi.ts +68 -0
  44. package/src/integrations/wormhole/wormhole.multi.ntt.ts +259 -0
  45. package/src/integrations/wormhole/wormhole.scan.api.ts +95 -0
  46. package/src/integrations/wormhole/wormhole.transceiver.abi.ts +20 -0
  47. package/src/integrations/wormhole/wormhole.transceiver.ts +46 -0
  48. package/src/lib/contractsRegistry.json +6 -2
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Client for the Wormhole Executor quote API.
3
+ *
4
+ * The executor framework is a permissionless off-chain relay network that
5
+ * delivers cross-chain messages signed by Wormhole guardians. Integrators
6
+ * fetch a signed quote from a relay provider before calling any `*WithExecutor`
7
+ * wrapper contract — the quote binds the cost of relaying on the destination
8
+ * chain, and the wrapper verifies the signature on-chain.
9
+ *
10
+ * Endpoints:
11
+ * - Mainnet: https://executor.labsapis.com
12
+ * - Testnet: https://executor-testnet.labsapis.com
13
+ *
14
+ * API reference: https://github.com/wormholelabs-xyz/example-messaging-executor
15
+ */
16
+
17
+ import { bytesToBigInt, bytesToNumber, bytesToString, hexToBytes, size as hexSize, sliceHex } from "viem";
18
+ import type { HexString } from "../../types";
19
+
20
+ export const WORMHOLE_EXECUTOR_API_MAINNET = "https://executor.labsapis.com" as const;
21
+ export const WORMHOLE_EXECUTOR_API_TESTNET = "https://executor-testnet.labsapis.com" as const;
22
+
23
+ export type WormholeNetwork = "Mainnet" | "Testnet";
24
+
25
+ export const getExecutorApiUrl = (network: WormholeNetwork = "Mainnet"): string =>
26
+ network === "Mainnet" ? WORMHOLE_EXECUTOR_API_MAINNET : WORMHOLE_EXECUTOR_API_TESTNET;
27
+
28
+ // ─── POST /v0/quote ──────────────────────────────────────────────────────
29
+
30
+ export type FetchQuoteArgs = Readonly<{
31
+ /** Source Wormhole chain ID (e.g. 2 for Ethereum). */
32
+ srcChain: number;
33
+ /** Destination Wormhole chain ID (e.g. 48 for Monad). */
34
+ dstChain: number;
35
+ /**
36
+ * Serialized relay instructions (version 0x01 + uint128 gasLimit +
37
+ * uint128 msgValue). Build via `buildRelayInstructions` in the NTT helpers.
38
+ */
39
+ relayInstructions: HexString;
40
+ }>;
41
+
42
+ export type QuoteResponse = Readonly<{
43
+ /** Signed quote bytes — pass verbatim as `executorArgs.signedQuote`. */
44
+ signedQuote: HexString;
45
+ /** Estimated relay cost in wei (as a decimal string). */
46
+ estimatedCost?: string;
47
+ }>;
48
+
49
+ /**
50
+ * Fetch a signed executor quote.
51
+ *
52
+ * @example
53
+ * const quote = await fetchExecutorQuote({
54
+ * srcChain: 2,
55
+ * dstChain: 48,
56
+ * relayInstructions: buildRelayInstructions({ gasLimit: 250000n, msgValue: 0n }),
57
+ * });
58
+ * const relayFee = BigInt(quote.estimatedCost!);
59
+ */
60
+ export const fetchExecutorQuote = async (
61
+ args: FetchQuoteArgs,
62
+ network: WormholeNetwork = "Mainnet",
63
+ ): Promise<QuoteResponse> => {
64
+ const url = `${getExecutorApiUrl(network)}/v0/quote`;
65
+
66
+ const response = await fetch(url, {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({
70
+ srcChain: args.srcChain,
71
+ dstChain: args.dstChain,
72
+ relayInstructions: args.relayInstructions,
73
+ }),
74
+ });
75
+
76
+ if (!response.ok) {
77
+ const body = await response.text().catch(() => "");
78
+ throw new Error(`Wormhole executor quote API returned ${response.status} ${response.statusText}: ${body}`);
79
+ }
80
+
81
+ return (await response.json()) as QuoteResponse;
82
+ };
83
+
84
+ // ─── Signed quote parsing (EQ01 layout) ──────────────────────────────────
85
+
86
+ /**
87
+ * A decoded EQ01 signed quote.
88
+ *
89
+ * Layout (165 bytes total):
90
+ * [0-4) prefix "EQ01"
91
+ * [4-24) quoterAddress (20 bytes)
92
+ * [24-56) payeeAddress (32 bytes)
93
+ * [56-58) srcChain (uint16 BE)
94
+ * [58-60) dstChain (uint16 BE)
95
+ * [60-68) expiryTime (uint64 BE) — unix seconds
96
+ * [68-76) baseFee (uint64 BE)
97
+ * [76-84) dstGasPrice (uint64 BE)
98
+ * [84-92) srcPrice (uint64 BE)
99
+ * [92-100) dstPrice (uint64 BE)
100
+ * [100-165) signature (65 bytes)
101
+ */
102
+ export type ParsedSignedQuote = Readonly<{
103
+ prefix: "EQ01";
104
+ quoterAddress: HexString;
105
+ payeeAddress: HexString;
106
+ srcChain: number;
107
+ dstChain: number;
108
+ expiryTimeSeconds: bigint;
109
+ baseFee: bigint;
110
+ dstGasPrice: bigint;
111
+ srcPrice: bigint;
112
+ dstPrice: bigint;
113
+ }>;
114
+
115
+ /**
116
+ * Parse an EQ01 signed quote.
117
+ * @throws if the prefix is not "EQ01" or the byte length is wrong.
118
+ */
119
+ export const parseSignedQuote = (signedQuote: HexString): ParsedSignedQuote => {
120
+ if (hexSize(signedQuote) !== 165) {
121
+ throw new Error(`parseSignedQuote: expected 165 bytes, got ${hexSize(signedQuote)}`);
122
+ }
123
+ const prefixBytes = hexToBytes(sliceHex(signedQuote, 0, 4));
124
+ const prefix = bytesToString(prefixBytes);
125
+ if (prefix !== "EQ01") {
126
+ throw new Error(`parseSignedQuote: invalid prefix '${prefix}', expected 'EQ01'`);
127
+ }
128
+ return Object.freeze({
129
+ prefix: "EQ01",
130
+ quoterAddress: sliceHex(signedQuote, 4, 24),
131
+ payeeAddress: sliceHex(signedQuote, 24, 56),
132
+ srcChain: bytesToNumber(hexToBytes(sliceHex(signedQuote, 56, 58))),
133
+ dstChain: bytesToNumber(hexToBytes(sliceHex(signedQuote, 58, 60))),
134
+ expiryTimeSeconds: bytesToBigInt(hexToBytes(sliceHex(signedQuote, 60, 68))),
135
+ baseFee: bytesToBigInt(hexToBytes(sliceHex(signedQuote, 68, 76))),
136
+ dstGasPrice: bytesToBigInt(hexToBytes(sliceHex(signedQuote, 76, 84))),
137
+ srcPrice: bytesToBigInt(hexToBytes(sliceHex(signedQuote, 84, 92))),
138
+ dstPrice: bytesToBigInt(hexToBytes(sliceHex(signedQuote, 92, 100))),
139
+ });
140
+ };
141
+
142
+ // ─── POST /v0/status/tx ──────────────────────────────────────────────────
143
+
144
+ export type StatusResponse = Readonly<{
145
+ txHash: HexString;
146
+ chainId: number;
147
+ status: string;
148
+ blockNumber?: string;
149
+ blockTime?: string;
150
+ [k: string]: unknown;
151
+ }>;
152
+
153
+ /**
154
+ * Fetch the executor's view of a source-chain transaction.
155
+ * Returns an array with one entry per relay attempt.
156
+ */
157
+ export const fetchExecutorTxStatus = async (
158
+ {
159
+ txHash,
160
+ chainId,
161
+ }: {
162
+ txHash: HexString;
163
+ /** Wormhole chain ID of the source chain. */
164
+ chainId: number;
165
+ },
166
+ network: WormholeNetwork = "Mainnet",
167
+ ): Promise<readonly StatusResponse[]> => {
168
+ const url = `${getExecutorApiUrl(network)}/v0/status/tx`;
169
+
170
+ const response = await fetch(url, {
171
+ method: "POST",
172
+ headers: { "Content-Type": "application/json" },
173
+ body: JSON.stringify({ txHash, chainId }),
174
+ });
175
+
176
+ if (!response.ok) {
177
+ const body = await response.text().catch(() => "");
178
+ throw new Error(`Wormhole executor status API returned ${response.status} ${response.statusText}: ${body}`);
179
+ }
180
+
181
+ return (await response.json()) as readonly StatusResponse[];
182
+ };
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Minimal ABI for Wormhole `GmpManager` — the contract that orchestrates
3
+ * transceivers (Wormhole + any additional providers like Axelar) for
4
+ * `MultiTokenNTT` deployments.
5
+ *
6
+ * Mainnet: 0xc6793a32761a11e96c97A3D18fC6545ea931F0E9
7
+ * Monad: 0x92957b3D0CaB3eA7110fEd1ccc4eF564981a59Fc
8
+ *
9
+ * Only the view function we need: `quoteDeliveryPrice` returns per-transceiver
10
+ * delivery prices and the total (in wei of the source chain's native token).
11
+ */
12
+ export default [
13
+ {
14
+ inputs: [
15
+ { name: "recipientChain", type: "uint16" },
16
+ { name: "transceiverInstructions", type: "bytes" },
17
+ ],
18
+ name: "quoteDeliveryPrice",
19
+ outputs: [
20
+ { name: "", type: "uint256[]" },
21
+ { name: "", type: "uint256" },
22
+ ],
23
+ stateMutability: "view",
24
+ type: "function",
25
+ },
26
+ ] as const;
@@ -0,0 +1,129 @@
1
+ import { ethers } from "ethers";
2
+ import { concatHex, size as hexSize, toHex } from "viem";
3
+ import gmpManagerAbi from "./gmp.manager.abi";
4
+ import type { Address } from "viem";
5
+ import type { Call, HexString, Unwrapable } from "../../types";
6
+ import { createCall } from "../../types";
7
+
8
+ const gmpManagerInterface = new ethers.utils.Interface(gmpManagerAbi as any);
9
+
10
+ // ─── quoteDeliveryPrice(uint16 recipientChain, bytes transceiverInstructions) ──
11
+
12
+ export type QuoteDeliveryPriceArgs = Readonly<{
13
+ /** Destination Wormhole chain ID. */
14
+ recipientChain: number;
15
+ /**
16
+ * Serialized transceiver instructions. The GmpManager decodes these to
17
+ * know which transceivers will be used and what fee caps apply.
18
+ * For Wormhole-only deployments pass `"0x00"` (0 instructions).
19
+ * For Monad's 2/2 (Wormhole + Axelar) pass an Axelar-instruction-carrying
20
+ * buffer (see `buildMonadDefaultTransceiverInstructions`).
21
+ */
22
+ transceiverInstructions: HexString;
23
+ }>;
24
+
25
+ /**
26
+ * Encode calldata for the view function
27
+ * `GmpManager.quoteDeliveryPrice(recipientChain, transceiverInstructions)`.
28
+ *
29
+ * Use this to query per-transceiver delivery fees + total via RPC.
30
+ */
31
+ export const GmpManagerQuoteDeliveryPriceCalldata = (args: QuoteDeliveryPriceArgs): HexString => {
32
+ return gmpManagerInterface.encodeFunctionData("quoteDeliveryPrice", [
33
+ args.recipientChain,
34
+ args.transceiverInstructions,
35
+ ]) as HexString;
36
+ };
37
+
38
+ /**
39
+ * Build a Call for `GmpManager.quoteDeliveryPrice` (view, value=0).
40
+ */
41
+ export const GmpManagerQuoteDeliveryPriceTrx = ({
42
+ gmpManagerAddress,
43
+ args,
44
+ }: {
45
+ gmpManagerAddress: Address;
46
+ args: QuoteDeliveryPriceArgs;
47
+ }): Unwrapable<Call> => {
48
+ return createCall({
49
+ operation: 0,
50
+ to: gmpManagerAddress,
51
+ data: GmpManagerQuoteDeliveryPriceCalldata(args),
52
+ value: 0n,
53
+ });
54
+ };
55
+
56
+ /**
57
+ * Decode the return data from a `quoteDeliveryPrice` eth_call.
58
+ *
59
+ * @returns tuple of (per-transceiver fees in wei, total fee in wei).
60
+ */
61
+ export const decodeQuoteDeliveryPriceResult = (
62
+ resultHex: HexString,
63
+ ): { readonly perTransceiver: readonly bigint[]; readonly total: bigint } => {
64
+ const decoded = gmpManagerInterface.decodeFunctionResult("quoteDeliveryPrice", resultHex);
65
+ const perTransceiver: bigint[] = (decoded[0] as Array<{ toString(): string }>).map((v) => BigInt(v.toString()));
66
+ const total = BigInt((decoded[1] as { toString(): string }).toString());
67
+ return { perTransceiver, total };
68
+ };
69
+
70
+ // ─── Transceiver instruction encoding ──────────────────────────────────────
71
+
72
+ /**
73
+ * Encode a single transceiver instruction.
74
+ *
75
+ * Format used by the Monad `MultiTokenNTT` deployment (verified on-chain
76
+ * against a successful reference transfer — note this uses a uint8 payload
77
+ * length, whereas Wormhole's standard NTT spec uses uint16):
78
+ * `uint8 index | uint8 payloadLength | bytes payload`
79
+ */
80
+ const encodeTransceiverInstruction = (index: number, payload: HexString): HexString => {
81
+ if (index < 0 || index > 0xff) throw new Error(`encodeTransceiverInstruction: index out of range: ${index}`);
82
+ const payloadLen = hexSize(payload);
83
+ if (payloadLen > 0xff)
84
+ throw new Error(`encodeTransceiverInstruction: payload length ${payloadLen} exceeds uint8 max`);
85
+ return concatHex([toHex(index, { size: 1 }), toHex(payloadLen, { size: 1 }), payload]) as HexString;
86
+ };
87
+
88
+ /**
89
+ * Encode a list of Wormhole NTT transceiver instructions.
90
+ *
91
+ * Output format: `uint8 numInstructions || concat(encodedInstructions)`.
92
+ */
93
+ export const encodeTransceiverInstructions = (
94
+ instructions: readonly Readonly<{ index: number; payload: HexString }>[],
95
+ ): HexString => {
96
+ if (instructions.length > 0xff)
97
+ throw new Error(`encodeTransceiverInstructions: too many instructions: ${instructions.length}`);
98
+ return concatHex([
99
+ toHex(instructions.length, { size: 1 }),
100
+ ...instructions.map((i) => encodeTransceiverInstruction(i.index, i.payload)),
101
+ ]) as HexString;
102
+ };
103
+
104
+ /**
105
+ * Build transceiver instructions for Monad's MultiTokenNTT deployment.
106
+ *
107
+ * Monad uses a 2-of-2 transceiver stack:
108
+ * - index 0: Wormhole guardians (1-byte enable flag payload)
109
+ * - index 1: Axelar GMP (32-byte uint256 max-fee payload in native token wei)
110
+ *
111
+ * The Axelar max-fee acts as the upper bound the caller is willing to pay
112
+ * for Axelar's side of the relay — the GmpManager will revert with
113
+ * `DeliveryPaymentTooLow` if the current quote exceeds this cap.
114
+ *
115
+ * Set `axelarMaxFee` generously (e.g. 50e18 wei on Monad → Mainnet) to
116
+ * tolerate gas-price spikes between quote time and execution time.
117
+ */
118
+ export const buildMonadDefaultTransceiverInstructions = ({
119
+ axelarMaxFee,
120
+ }: {
121
+ /** Max Axelar fee in wei of the source chain's native token. */
122
+ axelarMaxFee: bigint;
123
+ }): HexString => {
124
+ if (axelarMaxFee < 0n) throw new Error("buildMonadDefaultTransceiverInstructions: negative axelarMaxFee");
125
+ return encodeTransceiverInstructions([
126
+ { index: 0, payload: "0x01" as HexString },
127
+ { index: 1, payload: toHex(axelarMaxFee, { size: 32 }) as HexString },
128
+ ]);
129
+ };
@@ -0,0 +1,68 @@
1
+ export { default as WormholeMultiNttAbi } from "./wormhole.multi.ntt.abi";
2
+ export { default as WormholeGmpManagerAbi } from "./gmp.manager.abi";
3
+ export { default as WormholeTransceiverAbi } from "./wormhole.transceiver.abi";
4
+ export {
5
+ GmpManagerQuoteDeliveryPriceCalldata,
6
+ GmpManagerQuoteDeliveryPriceTrx,
7
+ decodeQuoteDeliveryPriceResult,
8
+ encodeTransceiverInstructions,
9
+ buildMonadDefaultTransceiverInstructions,
10
+ type QuoteDeliveryPriceArgs,
11
+ } from "./gmp.manager";
12
+ export { WormholeReceiveMessageCalldata, wormholeReceiveMessageTrx } from "./wormhole.transceiver";
13
+ export {
14
+ WORMHOLESCAN_API_MAINNET,
15
+ WORMHOLESCAN_API_TESTNET,
16
+ getWormholeScanApiUrl,
17
+ fetchWormholeVAA,
18
+ decodeVaaBase64,
19
+ normalizeEmitterForVaaLookup,
20
+ type WormholeNetworkEnv,
21
+ type VaaLookupArgs,
22
+ type VaaLookupResponse,
23
+ } from "./wormhole.scan.api";
24
+ export {
25
+ AXELAR_GMP_API_MAINNET,
26
+ AXELAR_GMP_API_TESTNET,
27
+ getAxelarGmpApiUrl,
28
+ fetchAxelarGmpStatus,
29
+ type AxelarNetwork,
30
+ type AxelarGmpStatus,
31
+ } from "./axelar.gmp.api";
32
+ export {
33
+ // Chain ID mapping
34
+ WORMHOLE_CHAIN_IDS,
35
+ getWormholeChainId,
36
+ // Byte helpers
37
+ addressToBytes32,
38
+ // Relay instructions
39
+ buildRelayInstructions,
40
+ DEFAULT_NTT_REDEMPTION_GAS_LIMIT,
41
+ // transfer()
42
+ WormholeTransferCalldata,
43
+ wormholeTransferTrx,
44
+ // calculateFee()
45
+ WormholeCalculateFeeCalldata,
46
+ // Composition helper
47
+ buildWormholeTransferArgsFromAvatar,
48
+ // Types
49
+ type ExecutorArgs,
50
+ type FeeArgs,
51
+ type WormholeTransferArgs,
52
+ } from "./wormhole.multi.ntt";
53
+ export {
54
+ // Executor API
55
+ WORMHOLE_EXECUTOR_API_MAINNET,
56
+ WORMHOLE_EXECUTOR_API_TESTNET,
57
+ getExecutorApiUrl,
58
+ fetchExecutorQuote,
59
+ fetchExecutorTxStatus,
60
+ // Signed quote parsing
61
+ parseSignedQuote,
62
+ // Types
63
+ type WormholeNetwork,
64
+ type FetchQuoteArgs,
65
+ type QuoteResponse,
66
+ type ParsedSignedQuote,
67
+ type StatusResponse,
68
+ } from "./executor.quote.api";
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Minimal ABI for Wormhole `MultiNTTWithExecutor` — the wrapper that bundles
3
+ * `MultiTokenNTT.transfer(...)` with automatic Executor-based relay.
4
+ *
5
+ * Mainnet: 0x03dB430D830601DB368991eE55DAa9A708df7912
6
+ * Monad: 0xFEA937F7124E19124671f1685671d3f04a9Af4E4
7
+ *
8
+ * Only the functions we actually call: transfer, calculateFee, executor, chainId.
9
+ */
10
+ export default [
11
+ {
12
+ inputs: [
13
+ { name: "multiTokenNtt", type: "address" },
14
+ { name: "token", type: "address" },
15
+ { name: "amount", type: "uint256" },
16
+ { name: "recipientChain", type: "uint16" },
17
+ { name: "recipient", type: "bytes32" },
18
+ { name: "refundAddress", type: "bytes32" },
19
+ { name: "transceiverInstructions", type: "bytes" },
20
+ {
21
+ name: "executorArgs",
22
+ type: "tuple",
23
+ components: [
24
+ { name: "value", type: "uint256" },
25
+ { name: "refundAddress", type: "address" },
26
+ { name: "signedQuote", type: "bytes" },
27
+ { name: "instructions", type: "bytes" },
28
+ ],
29
+ },
30
+ {
31
+ name: "feeArgs",
32
+ type: "tuple",
33
+ components: [
34
+ { name: "dbps", type: "uint16" },
35
+ { name: "payee", type: "address" },
36
+ ],
37
+ },
38
+ ],
39
+ name: "transfer",
40
+ outputs: [{ name: "sequence", type: "uint64" }],
41
+ stateMutability: "payable",
42
+ type: "function",
43
+ },
44
+ {
45
+ inputs: [
46
+ { name: "amount", type: "uint256" },
47
+ { name: "dbps", type: "uint16" },
48
+ ],
49
+ name: "calculateFee",
50
+ outputs: [{ name: "", type: "uint256" }],
51
+ stateMutability: "view",
52
+ type: "function",
53
+ },
54
+ {
55
+ inputs: [],
56
+ name: "executor",
57
+ outputs: [{ name: "", type: "address" }],
58
+ stateMutability: "view",
59
+ type: "function",
60
+ },
61
+ {
62
+ inputs: [],
63
+ name: "chainId",
64
+ outputs: [{ name: "", type: "uint16" }],
65
+ stateMutability: "view",
66
+ type: "function",
67
+ },
68
+ ] as const;