@lendasat/lendaswap-sdk-pure 0.2.41 → 0.2.43
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.
- package/dist/_esm-6K2AP5GG.js +3663 -0
- package/dist/_esm-6K2AP5GG.js.map +1 -0
- package/dist/_esm-UGRDSVEV.cjs +3662 -0
- package/dist/_esm-UGRDSVEV.cjs.map +1 -0
- package/dist/api/client.d.ts +0 -4
- package/dist/api/client.d.ts.map +1 -1
- package/dist/base-2KYNAFR3.cjs +109 -0
- package/dist/base-2KYNAFR3.cjs.map +1 -0
- package/dist/base-HMHH3XPM.js +9 -0
- package/dist/base-HMHH3XPM.js.map +1 -0
- package/dist/ccip-EBXWV2U3.js +8 -0
- package/dist/ccip-EBXWV2U3.js.map +1 -0
- package/dist/ccip-PD37NJHA.cjs +26 -0
- package/dist/ccip-PD37NJHA.cjs.map +1 -0
- package/dist/cctp-bridge/index.cjs +67 -0
- package/dist/cctp-bridge/index.cjs.map +1 -0
- package/dist/cctp-bridge/index.js +53 -15
- package/dist/cctp-bridge/index.js.map +1 -1
- package/dist/cctp-inbound/client.d.ts +21 -19
- package/dist/cctp-inbound/client.d.ts.map +1 -1
- package/dist/cctp-inbound/smartAccount.d.ts +21 -19
- package/dist/cctp-inbound/smartAccount.d.ts.map +1 -1
- package/dist/chunk-4JXN4UPB.js +554 -0
- package/dist/chunk-4JXN4UPB.js.map +1 -0
- package/dist/chunk-A4GKKURK.cjs +430 -0
- package/dist/chunk-A4GKKURK.cjs.map +1 -0
- package/dist/chunk-BZU3R5DJ.cjs +554 -0
- package/dist/chunk-BZU3R5DJ.cjs.map +1 -0
- package/dist/chunk-DBBCKPZ5.js +421 -0
- package/dist/chunk-DBBCKPZ5.js.map +1 -0
- package/dist/chunk-DNSJDKTP.cjs +96 -0
- package/dist/chunk-DNSJDKTP.cjs.map +1 -0
- package/dist/chunk-EIK6BZWG.js +90 -0
- package/dist/chunk-EIK6BZWG.js.map +1 -0
- package/dist/chunk-GVAPVS4Z.js +6144 -0
- package/dist/chunk-GVAPVS4Z.js.map +1 -0
- package/dist/chunk-I7TGLGN6.js +46 -0
- package/dist/chunk-I7TGLGN6.js.map +1 -0
- package/dist/chunk-JBVKWKD4.cjs +50 -0
- package/dist/chunk-JBVKWKD4.cjs.map +1 -0
- package/dist/chunk-LA3YX2HD.js +47096 -0
- package/dist/chunk-LA3YX2HD.js.map +1 -0
- package/dist/chunk-PKDJZJMV.cjs +2214 -0
- package/dist/chunk-PKDJZJMV.cjs.map +1 -0
- package/dist/chunk-PRN5VZOM.js +370 -0
- package/dist/chunk-PRN5VZOM.js.map +1 -0
- package/dist/chunk-RIOT5VOJ.cjs +47240 -0
- package/dist/chunk-RIOT5VOJ.cjs.map +1 -0
- package/dist/chunk-WVZSHRV7.cjs +431 -0
- package/dist/chunk-WVZSHRV7.cjs.map +1 -0
- package/dist/chunk-YLWPBHMV.cjs +6311 -0
- package/dist/chunk-YLWPBHMV.cjs.map +1 -0
- package/dist/chunk-Z2FCTNRC.js +2210 -0
- package/dist/chunk-Z2FCTNRC.js.map +1 -0
- package/dist/client.d.ts +68 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/compose-quote.d.ts +77 -0
- package/dist/compose-quote.d.ts.map +1 -0
- package/dist/delegate.cjs +23 -0
- package/dist/delegate.cjs.map +1 -0
- package/dist/delegate.js +8 -269
- package/dist/delegate.js.map +1 -1
- package/dist/dist-PWXNFVDF.js +8 -0
- package/dist/dist-PWXNFVDF.js.map +1 -0
- package/dist/dist-VEHYC67F.cjs +550 -0
- package/dist/dist-VEHYC67F.cjs.map +1 -0
- package/dist/esplora.d.ts +14 -0
- package/dist/esplora.d.ts.map +1 -1
- package/dist/generated/api.d.ts +235 -38
- package/dist/generated/api.d.ts.map +1 -1
- package/dist/index.cjs +35461 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35312 -32
- package/dist/index.js.map +1 -1
- package/dist/mine.wasm-LUTPOAD2.js +12 -0
- package/dist/mine.wasm-LUTPOAD2.js.map +1 -0
- package/dist/mine.wasm-Z3ORSBKN.cjs +12 -0
- package/dist/mine.wasm-Z3ORSBKN.cjs.map +1 -0
- package/dist/node.cjs +166 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.js +159 -18
- package/dist/node.js.map +1 -1
- package/dist/secp256k1-B6OW5ZCM.js +8 -0
- package/dist/secp256k1-B6OW5ZCM.js.map +1 -0
- package/dist/secp256k1-PJCSE4N6.cjs +30 -0
- package/dist/secp256k1-PJCSE4N6.cjs.map +1 -0
- package/dist/tokens.d.ts +2 -1
- package/dist/tokens.d.ts.map +1 -1
- package/dist/types/chain-config.d.ts +50 -0
- package/dist/types/chain-config.d.ts.map +1 -0
- package/dist/types/chain.d.ts +11 -0
- package/dist/types/chain.d.ts.map +1 -0
- package/dist/types/dex-quote.d.ts +85 -0
- package/dist/types/dex-quote.d.ts.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/network-fees.d.ts +43 -0
- package/dist/types/network-fees.d.ts.map +1 -0
- package/dist/types/quote.d.ts +87 -0
- package/dist/types/quote.d.ts.map +1 -0
- package/dist/types/swap-pairs.d.ts +37 -0
- package/dist/types/swap-pairs.d.ts.map +1 -0
- package/dist/version.d.ts +2 -2
- package/dist/wallet-4YGTKWNZ.js +7 -0
- package/dist/wallet-4YGTKWNZ.js.map +1 -0
- package/dist/wallet-SZJDXAY7.cjs +45 -0
- package/dist/wallet-SZJDXAY7.cjs.map +1 -0
- package/package.json +23 -10
- package/dist/api/client.js +0 -13
- package/dist/api/client.js.map +0 -1
- package/dist/arkade-network.js +0 -40
- package/dist/arkade-network.js.map +0 -1
- package/dist/arkade.js +0 -61
- package/dist/arkade.js.map +0 -1
- package/dist/cctp/attestation.js +0 -149
- package/dist/cctp/attestation.js.map +0 -1
- package/dist/cctp/constants.js +0 -92
- package/dist/cctp/constants.js.map +0 -1
- package/dist/cctp/fee.js +0 -70
- package/dist/cctp/fee.js.map +0 -1
- package/dist/cctp/index.js +0 -13
- package/dist/cctp/index.js.map +0 -1
- package/dist/cctp/types.js +0 -5
- package/dist/cctp/types.js.map +0 -1
- package/dist/cctp/utils.js +0 -91
- package/dist/cctp/utils.js.map +0 -1
- package/dist/cctp-bridge/bridge.js +0 -74
- package/dist/cctp-bridge/bridge.js.map +0 -1
- package/dist/cctp-inbound/approveAndBurn.js +0 -95
- package/dist/cctp-inbound/approveAndBurn.js.map +0 -1
- package/dist/cctp-inbound/burn.js +0 -66
- package/dist/cctp-inbound/burn.js.map +0 -1
- package/dist/cctp-inbound/chainMap.js +0 -128
- package/dist/cctp-inbound/chainMap.js.map +0 -1
- package/dist/cctp-inbound/client.js +0 -125
- package/dist/cctp-inbound/client.js.map +0 -1
- package/dist/cctp-inbound/eip2612.js +0 -95
- package/dist/cctp-inbound/eip2612.js.map +0 -1
- package/dist/cctp-inbound/evmSignerAdapter.js +0 -82
- package/dist/cctp-inbound/evmSignerAdapter.js.map +0 -1
- package/dist/cctp-inbound/fundSwap.js +0 -95
- package/dist/cctp-inbound/fundSwap.js.map +0 -1
- package/dist/cctp-inbound/index.js +0 -34
- package/dist/cctp-inbound/index.js.map +0 -1
- package/dist/cctp-inbound/permit2.js +0 -32
- package/dist/cctp-inbound/permit2.js.map +0 -1
- package/dist/cctp-inbound/preflight.js +0 -84
- package/dist/cctp-inbound/preflight.js.map +0 -1
- package/dist/cctp-inbound/recover.js +0 -177
- package/dist/cctp-inbound/recover.js.map +0 -1
- package/dist/cctp-inbound/smartAccount.js +0 -117
- package/dist/cctp-inbound/smartAccount.js.map +0 -1
- package/dist/cctp-inbound/submit.js +0 -136
- package/dist/cctp-inbound/submit.js.map +0 -1
- package/dist/cctp-inbound/types.js +0 -5
- package/dist/cctp-inbound/types.js.map +0 -1
- package/dist/cctp-inbound/userOp.js +0 -151
- package/dist/cctp-inbound/userOp.js.map +0 -1
- package/dist/client.js +0 -4126
- package/dist/client.js.map +0 -1
- package/dist/create/arkade-to-lightning.js +0 -76
- package/dist/create/arkade-to-lightning.js.map +0 -1
- package/dist/create/arkade.js +0 -86
- package/dist/create/arkade.js.map +0 -1
- package/dist/create/bitcoin-to-arkade.js +0 -76
- package/dist/create/bitcoin-to-arkade.js.map +0 -1
- package/dist/create/bitcoin.js +0 -77
- package/dist/create/bitcoin.js.map +0 -1
- package/dist/create/evm-to-arkade.js +0 -80
- package/dist/create/evm-to-arkade.js.map +0 -1
- package/dist/create/evm-to-bitcoin.js +0 -82
- package/dist/create/evm-to-bitcoin.js.map +0 -1
- package/dist/create/evm-to-lightning.js +0 -89
- package/dist/create/evm-to-lightning.js.map +0 -1
- package/dist/create/index.js +0 -21
- package/dist/create/index.js.map +0 -1
- package/dist/create/lightning-to-arkade.js +0 -69
- package/dist/create/lightning-to-arkade.js.map +0 -1
- package/dist/create/lightning.js +0 -61
- package/dist/create/lightning.js.map +0 -1
- package/dist/create/retry.js +0 -71
- package/dist/create/retry.js.map +0 -1
- package/dist/create/types.js +0 -5
- package/dist/create/types.js.map +0 -1
- package/dist/escrow/index.js +0 -115
- package/dist/escrow/index.js.map +0 -1
- package/dist/esplora.js +0 -47
- package/dist/esplora.js.map +0 -1
- package/dist/evm/coordinator.js +0 -714
- package/dist/evm/coordinator.js.map +0 -1
- package/dist/evm/htlc.js +0 -278
- package/dist/evm/htlc.js.map +0 -1
- package/dist/evm/index.js +0 -10
- package/dist/evm/index.js.map +0 -1
- package/dist/evm/signing.js +0 -70
- package/dist/evm/signing.js.map +0 -1
- package/dist/evm/wallet.js +0 -133
- package/dist/evm/wallet.js.map +0 -1
- package/dist/generated/api.js +0 -6
- package/dist/generated/api.js.map +0 -1
- package/dist/logging.js +0 -130
- package/dist/logging.js.map +0 -1
- package/dist/price-calculations.js +0 -135
- package/dist/price-calculations.js.map +0 -1
- package/dist/redeem/arkade.js +0 -416
- package/dist/redeem/arkade.js.map +0 -1
- package/dist/redeem/ethereum.js +0 -206
- package/dist/redeem/ethereum.js.map +0 -1
- package/dist/redeem/gasless.js +0 -73
- package/dist/redeem/gasless.js.map +0 -1
- package/dist/redeem/index.js +0 -189
- package/dist/redeem/index.js.map +0 -1
- package/dist/redeem/types.js +0 -36
- package/dist/redeem/types.js.map +0 -1
- package/dist/refund/arkade.js +0 -200
- package/dist/refund/arkade.js.map +0 -1
- package/dist/refund/collab-arkade-evm.js +0 -307
- package/dist/refund/collab-arkade-evm.js.map +0 -1
- package/dist/refund/collab-arkade-lightning.js +0 -245
- package/dist/refund/collab-arkade-lightning.js.map +0 -1
- package/dist/refund/index.js +0 -12
- package/dist/refund/index.js.map +0 -1
- package/dist/refund/onchain.js +0 -366
- package/dist/refund/onchain.js.map +0 -1
- package/dist/signer/index.js +0 -249
- package/dist/signer/index.js.map +0 -1
- package/dist/storage/idb.js +0 -236
- package/dist/storage/idb.js.map +0 -1
- package/dist/storage/index.js +0 -98
- package/dist/storage/index.js.map +0 -1
- package/dist/storage/sqlite.js +0 -206
- package/dist/storage/sqlite.js.map +0 -1
- package/dist/storage/types.js +0 -9
- package/dist/storage/types.js.map +0 -1
- package/dist/tokens.js +0 -322
- package/dist/tokens.js.map +0 -1
- package/dist/usd-price.js +0 -96
- package/dist/usd-price.js.map +0 -1
- package/dist/usdt0-bridge/constants.js +0 -71
- package/dist/usdt0-bridge/constants.js.map +0 -1
- package/dist/usdt0-bridge/index.js +0 -11
- package/dist/usdt0-bridge/index.js.map +0 -1
- package/dist/usdt0-bridge/tracking.js +0 -123
- package/dist/usdt0-bridge/tracking.js.map +0 -1
- package/dist/usdt0-bridge/utils.js +0 -51
- package/dist/usdt0-bridge/utils.js.map +0 -1
- package/dist/version.js +0 -6
- package/dist/version.js.map +0 -1
- package/dist/ws.js +0 -145
- package/dist/ws.js.map +0 -1
package/dist/cctp/attestation.js
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CCTP attestation client.
|
|
3
|
-
*
|
|
4
|
-
* Polls Circle's IRIS API for attestations after a USDC burn.
|
|
5
|
-
* Used on the destination chain to call MessageTransmitter.receiveMessage().
|
|
6
|
-
*/
|
|
7
|
-
import { CCTP_DOMAINS, IRIS_API_MAINNET, } from "./constants.js";
|
|
8
|
-
/**
|
|
9
|
-
* Poll the IRIS V2 API until the attestation is ready for a given burn tx.
|
|
10
|
-
*
|
|
11
|
-
* @returns The message and attestation bytes needed to call receiveMessage().
|
|
12
|
-
* @throws If the attestation is not ready within the timeout, or the request fails.
|
|
13
|
-
*/
|
|
14
|
-
export async function fetchAttestation(options) {
|
|
15
|
-
const { sourceChain, txHash, irisApiUrl = IRIS_API_MAINNET, pollIntervalMs = 10_000, timeoutMs = 900_000, signal, } = options;
|
|
16
|
-
const sourceDomain = CCTP_DOMAINS[sourceChain];
|
|
17
|
-
if (sourceDomain === undefined) {
|
|
18
|
-
throw new Error(`Unknown CCTP source chain: ${sourceChain}`);
|
|
19
|
-
}
|
|
20
|
-
const url = `${irisApiUrl}/v2/messages/${sourceDomain}?transactionHash=${txHash}`;
|
|
21
|
-
const startTime = Date.now();
|
|
22
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
23
|
-
signal?.throwIfAborted();
|
|
24
|
-
try {
|
|
25
|
-
const response = await fetch(url);
|
|
26
|
-
if (response.status === 404) {
|
|
27
|
-
// Message not yet indexed, keep polling
|
|
28
|
-
await sleep(pollIntervalMs, signal);
|
|
29
|
-
continue;
|
|
30
|
-
}
|
|
31
|
-
if (!response.ok) {
|
|
32
|
-
throw new Error(`IRIS API error: ${response.status} ${response.statusText}`);
|
|
33
|
-
}
|
|
34
|
-
const data = await response.json();
|
|
35
|
-
if (data.messages.length > 0 && data.messages[0].status === "complete") {
|
|
36
|
-
return {
|
|
37
|
-
message: data.messages[0].message,
|
|
38
|
-
attestation: data.messages[0].attestation,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
// Attestation pending, keep polling
|
|
42
|
-
await sleep(pollIntervalMs, signal);
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
if (err instanceof DOMException && err.name === "AbortError") {
|
|
46
|
-
throw err;
|
|
47
|
-
}
|
|
48
|
-
// Network errors — retry after delay
|
|
49
|
-
await sleep(pollIntervalMs, signal);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
throw new Error(`Attestation not ready after ${timeoutMs / 1000}s for tx ${txHash} on ${sourceChain}`);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Poll the IRIS V2 API until the CCTP message is forwarded and delivered.
|
|
56
|
-
*
|
|
57
|
-
* Tracks attestation → forwarding → delivery on the destination chain.
|
|
58
|
-
*
|
|
59
|
-
* @returns The message result with forwarding details (destination tx hash, amount, fee).
|
|
60
|
-
* @throws If the message is not delivered within the timeout.
|
|
61
|
-
*/
|
|
62
|
-
export async function trackCctpMessage(options) {
|
|
63
|
-
const { sourceChain, txHash, irisApiUrl = IRIS_API_MAINNET, pollIntervalMs = 5_000, timeoutMs = 600_000, signal, onStatusChange, } = options;
|
|
64
|
-
const sourceDomain = CCTP_DOMAINS[sourceChain];
|
|
65
|
-
if (sourceDomain === undefined) {
|
|
66
|
-
throw new Error(`Unknown CCTP source chain: ${sourceChain}`);
|
|
67
|
-
}
|
|
68
|
-
const url = `${irisApiUrl}/v2/messages/${sourceDomain}?transactionHash=${txHash}`;
|
|
69
|
-
const startTime = Date.now();
|
|
70
|
-
let lastStatus;
|
|
71
|
-
const emitStatus = (status) => {
|
|
72
|
-
if (status !== lastStatus) {
|
|
73
|
-
lastStatus = status;
|
|
74
|
-
onStatusChange?.(status);
|
|
75
|
-
}
|
|
76
|
-
};
|
|
77
|
-
while (Date.now() - startTime < timeoutMs) {
|
|
78
|
-
signal?.throwIfAborted();
|
|
79
|
-
try {
|
|
80
|
-
const response = await fetch(url);
|
|
81
|
-
if (response.status === 404) {
|
|
82
|
-
emitStatus("PENDING");
|
|
83
|
-
await sleep(pollIntervalMs, signal);
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
if (!response.ok) {
|
|
87
|
-
throw new Error(`IRIS API error: ${response.status} ${response.statusText}`);
|
|
88
|
-
}
|
|
89
|
-
const data = await response.json();
|
|
90
|
-
if (data.messages.length === 0) {
|
|
91
|
-
emitStatus("PENDING");
|
|
92
|
-
await sleep(pollIntervalMs, signal);
|
|
93
|
-
continue;
|
|
94
|
-
}
|
|
95
|
-
const msg = data.messages[0];
|
|
96
|
-
if (msg.status !== "complete") {
|
|
97
|
-
emitStatus("CONFIRMING");
|
|
98
|
-
await sleep(pollIntervalMs, signal);
|
|
99
|
-
continue;
|
|
100
|
-
}
|
|
101
|
-
// Attestation is complete — check forwarding state
|
|
102
|
-
if ((msg.forwardState === "COMPLETE" || msg.forwardState === "CONFIRMED") &&
|
|
103
|
-
msg.forwardTxHash) {
|
|
104
|
-
emitStatus("COMPLETE");
|
|
105
|
-
const cctpSentAmount = msg.decodedMessage?.decodedMessageBody?.amount;
|
|
106
|
-
const cctpPaidFee = msg.decodedMessage?.decodedMessageBody?.feeExecuted;
|
|
107
|
-
return {
|
|
108
|
-
status: "COMPLETE",
|
|
109
|
-
forwardTxHash: msg.forwardTxHash,
|
|
110
|
-
amount: cctpSentAmount && cctpPaidFee
|
|
111
|
-
? (BigInt(cctpSentAmount) - BigInt(cctpPaidFee)).toString()
|
|
112
|
-
: undefined,
|
|
113
|
-
feeExecuted: msg.decodedMessage?.decodedMessageBody?.feeExecuted,
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
|
-
// Forwarding failed — stop polling
|
|
117
|
-
if (msg.forwardState &&
|
|
118
|
-
msg.forwardState !== "PENDING" &&
|
|
119
|
-
msg.forwardState !== "COMPLETE") {
|
|
120
|
-
emitStatus("FAILED");
|
|
121
|
-
throw new Error(`CCTP forwarding failed (state: ${msg.forwardState}) for tx ${txHash} on ${sourceChain}`);
|
|
122
|
-
}
|
|
123
|
-
// Attestation complete but forwarding still in progress
|
|
124
|
-
emitStatus("FORWARDING");
|
|
125
|
-
await sleep(pollIntervalMs, signal);
|
|
126
|
-
}
|
|
127
|
-
catch (err) {
|
|
128
|
-
if (err instanceof DOMException && err.name === "AbortError") {
|
|
129
|
-
throw err;
|
|
130
|
-
}
|
|
131
|
-
// Network errors — retry after delay
|
|
132
|
-
await sleep(pollIntervalMs, signal);
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
throw new Error(`CCTP message not delivered after ${timeoutMs / 1000}s for tx ${txHash} on ${sourceChain}`);
|
|
136
|
-
}
|
|
137
|
-
// ============================================================================
|
|
138
|
-
// Helpers
|
|
139
|
-
// ============================================================================
|
|
140
|
-
function sleep(ms, signal) {
|
|
141
|
-
return new Promise((resolve, reject) => {
|
|
142
|
-
const timer = setTimeout(resolve, ms);
|
|
143
|
-
signal?.addEventListener("abort", () => {
|
|
144
|
-
clearTimeout(timer);
|
|
145
|
-
reject(new DOMException("Aborted", "AbortError"));
|
|
146
|
-
}, { once: true });
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
//# sourceMappingURL=attestation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../src/cctp/attestation.ts"],"names":[],"mappings":"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"}
|
package/dist/cctp/constants.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CCTP (Cross-Chain Transfer Protocol) constants.
|
|
3
|
-
*
|
|
4
|
-
* Uses CCTP V2 contracts which share the same address across all EVM chains.
|
|
5
|
-
* See: https://developers.circle.com/cctp/references/contract-addresses
|
|
6
|
-
*/
|
|
7
|
-
// ============================================================================
|
|
8
|
-
// CCTP V2 contract addresses (same on all EVM chains)
|
|
9
|
-
// ============================================================================
|
|
10
|
-
export const TOKEN_MESSENGER_V2 = "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d";
|
|
11
|
-
export const MESSAGE_TRANSMITTER_V2 = "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64";
|
|
12
|
-
// ============================================================================
|
|
13
|
-
// CCTP Domain IDs
|
|
14
|
-
// See: https://developers.circle.com/cctp/concepts/supported-chains-and-domains
|
|
15
|
-
// ============================================================================
|
|
16
|
-
export const CCTP_DOMAINS = {
|
|
17
|
-
Ethereum: 0,
|
|
18
|
-
Avalanche: 1,
|
|
19
|
-
Optimism: 2,
|
|
20
|
-
Arbitrum: 3,
|
|
21
|
-
Solana: 5,
|
|
22
|
-
Base: 6,
|
|
23
|
-
Polygon: 7,
|
|
24
|
-
Unichain: 10,
|
|
25
|
-
Linea: 11,
|
|
26
|
-
Sonic: 13,
|
|
27
|
-
"World Chain": 14,
|
|
28
|
-
Monad: 15,
|
|
29
|
-
Sei: 16,
|
|
30
|
-
XDC: 18,
|
|
31
|
-
HyperEVM: 19,
|
|
32
|
-
Ink: 21,
|
|
33
|
-
};
|
|
34
|
-
// ============================================================================
|
|
35
|
-
// USDC addresses per chain (native USDC)
|
|
36
|
-
// ============================================================================
|
|
37
|
-
export const USDC_ADDRESSES = {
|
|
38
|
-
Ethereum: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
|
|
39
|
-
Polygon: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
|
|
40
|
-
Arbitrum: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
|
|
41
|
-
Base: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
|
|
42
|
-
Optimism: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
|
|
43
|
-
Avalanche: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
|
|
44
|
-
Linea: "0x176211869ca2b568f2a7d4ee941e073a821ee1ff",
|
|
45
|
-
Unichain: "0x078d782b760474a361dda0af3839290b0ef57ad6",
|
|
46
|
-
"World Chain": "0x79A02482A880bCe3F13E09da970dC34dB4cD24D1",
|
|
47
|
-
Ink: "0x2D270e6886d130D724215A266106e6832161EAEd",
|
|
48
|
-
Sonic: "0x29219dd400f2bf60e5a23d13be72b486d4038894",
|
|
49
|
-
Sei: "0xe15fC38F6D8c56aF07bbCBe3BAf5708A2Bf42392",
|
|
50
|
-
HyperEVM: "0xb88339CB7199b77E23DB6E890353E22632Ba630f",
|
|
51
|
-
XDC: "0xfA2958CB79b0491CC627c1557F441eF849Ca8eb1",
|
|
52
|
-
Monad: "0x754704Bc059F8C67012fEd69BC8A327a5aafb603",
|
|
53
|
-
// Solana's USDC is an SPL mint, encoded as a base58 pubkey rather than
|
|
54
|
-
// an EVM `0x...` hex address. Callers that parse the value with viem's
|
|
55
|
-
// `getAddress` / `Address.from_str` must guard against this entry.
|
|
56
|
-
Solana: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
|
|
57
|
-
};
|
|
58
|
-
export const EURC_ADDRESSES = {
|
|
59
|
-
Ethereum: "0x1aBaEA1f7C830bD89Acc67eC4af516284b1bC33c",
|
|
60
|
-
};
|
|
61
|
-
export const USAT_ADDRESSES = {
|
|
62
|
-
Ethereum: "0x07041776F5007aCa2A54844f50503a18A72A8b68",
|
|
63
|
-
};
|
|
64
|
-
// ============================================================================
|
|
65
|
-
// V2 addresses are the same on all chains, but kept as Records for
|
|
66
|
-
// backward compatibility and for the receiveMessage destination lookup.
|
|
67
|
-
// ============================================================================
|
|
68
|
-
export const TOKEN_MESSENGER_ADDRESSES = Object.fromEntries(Object.keys(CCTP_DOMAINS).map((chain) => [chain, TOKEN_MESSENGER_V2]));
|
|
69
|
-
export const MESSAGE_TRANSMITTER_ADDRESSES = Object.fromEntries(Object.keys(CCTP_DOMAINS).map((chain) => [chain, MESSAGE_TRANSMITTER_V2]));
|
|
70
|
-
// ============================================================================
|
|
71
|
-
// Forwarding Service
|
|
72
|
-
// ============================================================================
|
|
73
|
-
/**
|
|
74
|
-
* Magic hookData for Circle's Forwarding Service.
|
|
75
|
-
* Encodes "cctp-forward" + version 0 + data length 0.
|
|
76
|
-
* When passed to depositForBurnWithHook, Circle auto-mints on destination — zero gas needed.
|
|
77
|
-
*/
|
|
78
|
-
export const FORWARDING_SERVICE_HOOK_DATA = "0x636374702d666f72776172640000000000000000000000000000000000000000";
|
|
79
|
-
/** Fast transfer finality threshold. */
|
|
80
|
-
export const FINALITY_FAST = 1000;
|
|
81
|
-
/** Standard transfer finality threshold. */
|
|
82
|
-
export const FINALITY_STANDARD = 2000;
|
|
83
|
-
/** Forwarding fee for Ethereum destination ($1.25 in USDC units). */
|
|
84
|
-
export const FORWARDING_FEE_ETHEREUM = 1250000n;
|
|
85
|
-
/** Forwarding fee for all other destinations ($0.20 in USDC units). */
|
|
86
|
-
export const FORWARDING_FEE_OTHER = 200000n;
|
|
87
|
-
// ============================================================================
|
|
88
|
-
// Circle Attestation (IRIS) API
|
|
89
|
-
// ============================================================================
|
|
90
|
-
export const IRIS_API_MAINNET = "https://iris-api.circle.com";
|
|
91
|
-
export const IRIS_API_TESTNET = "https://iris-api-sandbox.circle.com";
|
|
92
|
-
//# sourceMappingURL=constants.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/cctp/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/cctp/fee.js
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CCTP v2 fast-transfer fee query against Circle's IRIS API.
|
|
3
|
-
*
|
|
4
|
-
* The fast-transfer fee (`minimumFee`, in basis points × 100) is deducted
|
|
5
|
-
* from the minted amount on the destination chain whenever the burn's
|
|
6
|
-
* `minFinalityThreshold ≤ 1000`. We need to query it to know precisely
|
|
7
|
-
* how much USDC will arrive so the Permit2 signature pulls the right
|
|
8
|
-
* amount and the Multicall doesn't underflow.
|
|
9
|
-
*
|
|
10
|
-
* Mirrors the Rust backend's `swap/src/cctp.rs::compute_max_fee`.
|
|
11
|
-
*/
|
|
12
|
-
import { FINALITY_FAST, IRIS_API_MAINNET } from "./constants.js";
|
|
13
|
-
/**
|
|
14
|
-
* Fetch the fee entry for the given source → destination pair and
|
|
15
|
-
* finality threshold. Returns the raw IRIS shape — callers that want
|
|
16
|
-
* an applied maxFee should pass this to {@link computeCctpFastFee}.
|
|
17
|
-
*/
|
|
18
|
-
export async function fetchCctpFee(options) {
|
|
19
|
-
const { sourceDomain, destinationDomain, finalityThreshold = FINALITY_FAST, irisApiUrl = IRIS_API_MAINNET, signal, } = options;
|
|
20
|
-
const url = `${irisApiUrl}/v2/burn/USDC/fees/${sourceDomain}/${destinationDomain}?forward=true`;
|
|
21
|
-
const response = await fetch(url, { signal });
|
|
22
|
-
if (!response.ok) {
|
|
23
|
-
throw new Error(`IRIS fee lookup failed: ${response.status} ${response.statusText}`);
|
|
24
|
-
}
|
|
25
|
-
const entries = (await response.json());
|
|
26
|
-
const entry = entries.find((e) => e.finalityThreshold === finalityThreshold) ??
|
|
27
|
-
entries[0];
|
|
28
|
-
if (!entry) {
|
|
29
|
-
throw new Error(`IRIS returned no fee entries for ${sourceDomain}→${destinationDomain}`);
|
|
30
|
-
}
|
|
31
|
-
return entry;
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Tiny TTL cache for CCTP fee lookups. The IRIS fee is effectively
|
|
35
|
-
* constant per-pair minute-to-minute — re-fetching on every quote
|
|
36
|
-
* keystroke would bomb IRIS for no gain. 60s TTL is ample.
|
|
37
|
-
*/
|
|
38
|
-
const feeCache = new Map();
|
|
39
|
-
const FEE_CACHE_TTL_MS = 60_000;
|
|
40
|
-
/**
|
|
41
|
-
* Cached variant of {@link fetchCctpFee}. Multiple callers within a
|
|
42
|
-
* 60-second window share a single IRIS round-trip per source→dest pair.
|
|
43
|
-
*/
|
|
44
|
-
export async function getCachedCctpFee(options) {
|
|
45
|
-
const { sourceDomain, destinationDomain, finalityThreshold = FINALITY_FAST, irisApiUrl = IRIS_API_MAINNET, } = options;
|
|
46
|
-
const key = `${sourceDomain}-${destinationDomain}-${finalityThreshold}-${irisApiUrl}`;
|
|
47
|
-
const cached = feeCache.get(key);
|
|
48
|
-
if (cached && cached.expiresAt > Date.now()) {
|
|
49
|
-
return cached.entry;
|
|
50
|
-
}
|
|
51
|
-
const entry = await fetchCctpFee(options);
|
|
52
|
-
feeCache.set(key, { entry, expiresAt: Date.now() + FEE_CACHE_TTL_MS });
|
|
53
|
-
return entry;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Apply IRIS's `minimumFee` (basis points) to an amount in USDC smallest
|
|
57
|
-
* units, matching the Rust backend's formula:
|
|
58
|
-
* protocolFee = amount × round(minimumFee × 100) ÷ 1_000_000
|
|
59
|
-
*
|
|
60
|
-
* Adds a conservative 20% buffer to absorb rounding drift between quote
|
|
61
|
-
* time and burn time. Return value is the fee in USDC smallest units,
|
|
62
|
-
* suitable for `maxFee` in `depositForBurn` and as the subtracted amount
|
|
63
|
-
* when sizing the Permit2 permit.
|
|
64
|
-
*/
|
|
65
|
-
export function computeCctpFastFee(entry, amountUsdcUnits) {
|
|
66
|
-
const bpsScaled = Math.round(entry.minimumFee * 100);
|
|
67
|
-
const protocolFee = (amountUsdcUnits * BigInt(bpsScaled)) / 1000000n;
|
|
68
|
-
return (protocolFee * 120n) / 100n;
|
|
69
|
-
}
|
|
70
|
-
//# sourceMappingURL=fee.js.map
|
package/dist/cctp/fee.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fee.js","sourceRoot":"","sources":["../../src/cctp/fee.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AA+BjE;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAA4B;IAE5B,MAAM,EACJ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAAG,aAAa,EACjC,UAAU,GAAG,gBAAgB,EAC7B,MAAM,GACP,GAAG,OAAO,CAAC;IAEZ,MAAM,GAAG,GAAG,GAAG,UAAU,sBAAsB,YAAY,IAAI,iBAAiB,eAAe,CAAC;IAChG,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9C,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,2BAA2B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmB,CAAC;IAC1D,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,iBAAiB,KAAK,iBAAiB,CAAC;QAC9D,OAAO,CAAC,CAAC,CAAC,CAAC;IACb,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,oCAAoC,YAAY,IAAI,iBAAiB,EAAE,CACxE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;GAIG;AACH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsD,CAAC;AAC/E,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEhC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAA4B;IAE5B,MAAM,EACJ,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAAG,aAAa,EACjC,UAAU,GAAG,gBAAgB,GAC9B,GAAG,OAAO,CAAC;IACZ,MAAM,GAAG,GAAG,GAAG,YAAY,IAAI,iBAAiB,IAAI,iBAAiB,IAAI,UAAU,EAAE,CAAC;IACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;QAC5C,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAAC;IACvE,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAmB,EACnB,eAAuB;IAEvB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC;IACrD,MAAM,WAAW,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,QAAU,CAAC;IACvE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;AACrC,CAAC"}
|
package/dist/cctp/index.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CCTP (Cross-Chain Transfer Protocol) module.
|
|
3
|
-
*
|
|
4
|
-
* Provides utilities for bridging USDC cross-chain via Circle's CCTP:
|
|
5
|
-
* - Domain ID mappings and contract addresses
|
|
6
|
-
* - Attestation polling (IRIS API)
|
|
7
|
-
* - Address conversion helpers
|
|
8
|
-
*/
|
|
9
|
-
export { fetchAttestation, trackCctpMessage, } from "./attestation.js";
|
|
10
|
-
export { CCTP_DOMAINS, EURC_ADDRESSES, FINALITY_FAST, FINALITY_STANDARD, FORWARDING_FEE_ETHEREUM, FORWARDING_FEE_OTHER, FORWARDING_SERVICE_HOOK_DATA, IRIS_API_MAINNET, IRIS_API_TESTNET, MESSAGE_TRANSMITTER_ADDRESSES, MESSAGE_TRANSMITTER_V2, TOKEN_MESSENGER_ADDRESSES, TOKEN_MESSENGER_V2, USAT_ADDRESSES, USDC_ADDRESSES, } from "./constants.js";
|
|
11
|
-
export { computeCctpFastFee, fetchCctpFee, getCachedCctpFee, } from "./fee.js";
|
|
12
|
-
export { addressToBytes32, bytes32ToAddress, getDomain, isValidSolanaAddress, needsBridge, solanaAddressToBytes32, } from "./utils.js";
|
|
13
|
-
//# sourceMappingURL=index.js.map
|
package/dist/cctp/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cctp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAGL,gBAAgB,EAEhB,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EAEZ,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,uBAAuB,EACvB,oBAAoB,EACpB,4BAA4B,EAC5B,gBAAgB,EAChB,gBAAgB,EAChB,6BAA6B,EAC7B,sBAAsB,EACtB,yBAAyB,EACzB,kBAAkB,EAClB,cAAc,EACd,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAElB,YAAY,EACZ,gBAAgB,GAGjB,MAAM,UAAU,CAAC;AAWlB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,oBAAoB,EACpB,WAAW,EACX,sBAAsB,GACvB,MAAM,YAAY,CAAC"}
|
package/dist/cctp/types.js
DELETED
package/dist/cctp/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cctp/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/cctp/utils.js
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CCTP utility functions.
|
|
3
|
-
*/
|
|
4
|
-
import { base58 } from "@scure/base";
|
|
5
|
-
import { CCTP_DOMAINS } from "./constants.js";
|
|
6
|
-
/**
|
|
7
|
-
* Convert an EVM address to CCTP's bytes32 format (left-padded with zeros).
|
|
8
|
-
* @param address - 0x-prefixed hex address (20 bytes)
|
|
9
|
-
* @returns 0x-prefixed bytes32 hex string (32 bytes)
|
|
10
|
-
*/
|
|
11
|
-
export function addressToBytes32(address) {
|
|
12
|
-
const clean = address.toLowerCase().replace("0x", "");
|
|
13
|
-
if (clean.length !== 40) {
|
|
14
|
-
throw new Error(`Invalid address length: expected 40 hex chars, got ${clean.length}`);
|
|
15
|
-
}
|
|
16
|
-
return `0x${clean.padStart(64, "0")}`;
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Convert a CCTP bytes32 back to an EVM address.
|
|
20
|
-
* @param bytes32 - 0x-prefixed bytes32 hex string
|
|
21
|
-
* @returns 0x-prefixed checksummed address
|
|
22
|
-
*/
|
|
23
|
-
export function bytes32ToAddress(bytes32) {
|
|
24
|
-
const clean = bytes32.replace("0x", "");
|
|
25
|
-
if (clean.length !== 64) {
|
|
26
|
-
throw new Error(`Invalid bytes32 length: expected 64 hex chars, got ${clean.length}`);
|
|
27
|
-
}
|
|
28
|
-
return `0x${clean.slice(24)}`;
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Get the CCTP domain ID for a chain name.
|
|
32
|
-
* @param chainName - Chain name (e.g. "Ethereum", "Polygon", "Arbitrum")
|
|
33
|
-
* @returns The CCTP domain ID, or undefined if not supported.
|
|
34
|
-
*/
|
|
35
|
-
export function getDomain(chainName) {
|
|
36
|
-
return CCTP_DOMAINS[chainName];
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Check if two chains require CCTP bridging (i.e., they're different chains).
|
|
40
|
-
* @param sourceChain - Source chain name
|
|
41
|
-
* @param targetChain - Target chain name
|
|
42
|
-
* @returns true if CCTP bridging is needed
|
|
43
|
-
*/
|
|
44
|
-
export function needsBridge(sourceChain, targetChain) {
|
|
45
|
-
if (sourceChain === targetChain)
|
|
46
|
-
return false;
|
|
47
|
-
const sourceDomain = getDomain(sourceChain);
|
|
48
|
-
const targetDomain = getDomain(targetChain);
|
|
49
|
-
return sourceDomain !== undefined && targetDomain !== undefined;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Validate a Solana address. Solana pubkeys are base58-encoded 32-byte
|
|
53
|
-
* values, typically 32-44 base58 characters. Cheap structural check —
|
|
54
|
-
* does not verify on-curve / system-program semantics.
|
|
55
|
-
*/
|
|
56
|
-
export function isValidSolanaAddress(address) {
|
|
57
|
-
if (!address)
|
|
58
|
-
return false;
|
|
59
|
-
if (address.length < 32 || address.length > 44)
|
|
60
|
-
return false;
|
|
61
|
-
// Disallow base58-illegal characters early so we don't rely on the
|
|
62
|
-
// decode throwing for obvious junk.
|
|
63
|
-
if (!/^[1-9A-HJ-NP-Za-km-z]+$/.test(address))
|
|
64
|
-
return false;
|
|
65
|
-
try {
|
|
66
|
-
return base58.decode(address).length === 32;
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
return false;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Decode a base58-encoded Solana pubkey into CCTP's 32-byte recipient
|
|
74
|
-
* format. Solana pubkeys are natively 32 bytes — no padding needed.
|
|
75
|
-
*
|
|
76
|
-
* Returns a `0x`-prefixed 64-character hex string (the bytes32 form
|
|
77
|
-
* accepted by Circle's TokenMessenger `mintRecipient` field), so the
|
|
78
|
-
* shape matches `addressToBytes32` for EVM addresses.
|
|
79
|
-
*/
|
|
80
|
-
export function solanaAddressToBytes32(address) {
|
|
81
|
-
const decoded = base58.decode(address);
|
|
82
|
-
if (decoded.length !== 32) {
|
|
83
|
-
throw new Error(`Solana pubkey must decode to 32 bytes, got ${decoded.length} for ${address}`);
|
|
84
|
-
}
|
|
85
|
-
let hex = "0x";
|
|
86
|
-
for (const byte of decoded) {
|
|
87
|
-
hex += byte.toString(16).padStart(2, "0");
|
|
88
|
-
}
|
|
89
|
-
return hex;
|
|
90
|
-
}
|
|
91
|
-
//# sourceMappingURL=utils.js.map
|
package/dist/cctp/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cctp/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAC;AAElE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,sDAAsD,KAAK,CAAC,MAAM,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,sDAAsD,KAAK,CAAC,MAAM,EAAE,CACrE,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO,YAAY,CAAC,SAA0B,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,WAAmB,EAAE,WAAmB;IAClE,IAAI,WAAW,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9C,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,SAAS,CAAC;AAClE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7D,mEAAmE;IACnE,oCAAoC;IACpC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,IAAI,CAAC;QACH,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,8CAA8C,OAAO,CAAC,MAAM,QAAQ,OAAO,EAAE,CAC9E,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,CAAC;IACf,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -1,74 +0,0 @@
|
|
|
1
|
-
import { BridgeChain, BridgeKit, } from "@circle-fin/bridge-kit";
|
|
2
|
-
/**
|
|
3
|
-
* Bridge USDC cross-chain via Circle CCTPv2.
|
|
4
|
-
*
|
|
5
|
-
* Runs the full approve → burn → attest → mint flow in one call. Returns a
|
|
6
|
-
* `BridgeResult` whose `state` is `'success'` or `'error'`; inspect `steps`
|
|
7
|
-
* for per-action details. Recoverable failures can be resumed with
|
|
8
|
-
* `BridgeKit.retry()` — see bridge-kit's retry guide.
|
|
9
|
-
*/
|
|
10
|
-
export async function bridgeUsdc(params) {
|
|
11
|
-
const kit = new BridgeKit();
|
|
12
|
-
attachListeners(kit, params);
|
|
13
|
-
return kit.bridge(buildBridgeParams(params));
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Bridge USDC from any CCTPv2-supported chain into Arbitrum.
|
|
17
|
-
*
|
|
18
|
-
* Convenience for the common Lendaswap flow: land USDC on Arbitrum so the
|
|
19
|
-
* existing Arbitrum USDC → BTC HTLC swap can run against it.
|
|
20
|
-
*/
|
|
21
|
-
export async function bridgeUsdcToArbitrum(params) {
|
|
22
|
-
return bridgeUsdc({
|
|
23
|
-
...params,
|
|
24
|
-
destination: {
|
|
25
|
-
...params.destination,
|
|
26
|
-
chain: params.destination.chain ?? BridgeChain.Arbitrum,
|
|
27
|
-
},
|
|
28
|
-
});
|
|
29
|
-
}
|
|
30
|
-
/**
|
|
31
|
-
* Estimate CCTPv2 bridge costs (protocol fee + gas on source and destination)
|
|
32
|
-
* without executing anything. Requires an adapter on both sides because gas
|
|
33
|
-
* estimation depends on the specific wallet/account.
|
|
34
|
-
*/
|
|
35
|
-
export async function estimateUsdcBridgeFees(params) {
|
|
36
|
-
const kit = new BridgeKit();
|
|
37
|
-
return kit.estimate(buildBridgeParams(params));
|
|
38
|
-
}
|
|
39
|
-
function buildBridgeParams(params) {
|
|
40
|
-
const from = {
|
|
41
|
-
adapter: params.source.adapter,
|
|
42
|
-
chain: params.source.chain,
|
|
43
|
-
...(params.source.address ? { address: params.source.address } : {}),
|
|
44
|
-
};
|
|
45
|
-
const to = {
|
|
46
|
-
adapter: params.destination.adapter,
|
|
47
|
-
chain: params.destination.chain,
|
|
48
|
-
...(params.destination.address
|
|
49
|
-
? { address: params.destination.address }
|
|
50
|
-
: {}),
|
|
51
|
-
...(params.destination.recipientAddress
|
|
52
|
-
? { recipientAddress: params.destination.recipientAddress }
|
|
53
|
-
: {}),
|
|
54
|
-
};
|
|
55
|
-
return {
|
|
56
|
-
from,
|
|
57
|
-
to,
|
|
58
|
-
amount: params.amount,
|
|
59
|
-
...(params.config ? { config: params.config } : {}),
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
function attachListeners(kit, params) {
|
|
63
|
-
if (params.onEvent)
|
|
64
|
-
kit.on("*", params.onEvent);
|
|
65
|
-
if (params.onApprove)
|
|
66
|
-
kit.on("approve", params.onApprove);
|
|
67
|
-
if (params.onBurn)
|
|
68
|
-
kit.on("burn", params.onBurn);
|
|
69
|
-
if (params.onAttestation)
|
|
70
|
-
kit.on("fetchAttestation", params.onAttestation);
|
|
71
|
-
if (params.onMint)
|
|
72
|
-
kit.on("mint", params.onMint);
|
|
73
|
-
}
|
|
74
|
-
//# sourceMappingURL=bridge.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"bridge.js","sourceRoot":"","sources":["../../src/cctp-bridge/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,SAAS,GAIV,MAAM,wBAAwB,CAAC;AAuChC;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,MAAwB;IAExB,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;IAC5B,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAIC;IAED,OAAO,UAAU,CAAC;QAChB,GAAG,MAAM;QACT,WAAW,EAAE;YACX,GAAG,MAAM,CAAC,WAAW;YACrB,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,WAAW,CAAC,QAAQ;SACxD;KACF,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAGC;IAED,MAAM,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC;IAC5B,OAAO,GAAG,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;AACjD,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAwB;IACjD,MAAM,IAAI,GAAG;QACX,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK;QAC1B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC7C,CAAC;IAE1B,MAAM,EAAE,GAAG;QACT,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO;QACnC,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,KAAK;QAC/B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO;YAC5B,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE;YACzC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB;YACrC,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,gBAAgB,EAAE;YAC3D,CAAC,CAAC,EAAE,CAAC;KACc,CAAC;IAExB,OAAO;QACL,IAAI;QACJ,EAAE;QACF,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAc,EAAE,MAAwB;IAC/D,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,SAAS;QAAE,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC;IAC1D,IAAI,MAAM,CAAC,MAAM;QAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,MAAM,CAAC,aAAa;QAAE,GAAG,CAAC,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAC3E,IAAI,MAAM,CAAC,MAAM;QAAE,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Source-chain USDC approve + burn for the CCTP-inbound flow.
|
|
3
|
-
*
|
|
4
|
-
* Handles the full source-chain leg in one call:
|
|
5
|
-
* 1. Read current allowance via `EvmSigner.call`. If < `amount`,
|
|
6
|
-
* send an `approve` and wait for its receipt.
|
|
7
|
-
* 2. Call `TokenMessenger.depositForBurn(...)` with `mintRecipient`
|
|
8
|
-
* and `destinationCaller` both pinned to the caller's
|
|
9
|
-
* smart-account address.
|
|
10
|
-
* 3. Return the tx hashes.
|
|
11
|
-
*
|
|
12
|
-
* Takes the SDK's `EvmSigner` so the same signer used for direct
|
|
13
|
-
* Permit2 swaps (wagmi, Privy, raw key via the `evm/wallet` adapter)
|
|
14
|
-
* also powers the CCTP flow.
|
|
15
|
-
*/
|
|
16
|
-
import { encodeFunctionData, erc20Abi, parseAbi } from "viem";
|
|
17
|
-
import { FINALITY_FAST, TOKEN_MESSENGER_V2 } from "../cctp/constants.js";
|
|
18
|
-
import { addressToBytes32 } from "../cctp/utils.js";
|
|
19
|
-
const TOKEN_MESSENGER_ABI = parseAbi([
|
|
20
|
-
"function depositForBurn(uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken, bytes32 destinationCaller, uint256 maxFee, uint32 minFinalityThreshold) external returns (uint64)",
|
|
21
|
-
]);
|
|
22
|
-
/**
|
|
23
|
-
* Approve USDC to the TokenMessenger (if needed) then burn it for the
|
|
24
|
-
* cross-chain transfer. Returns the tx hashes. Does NOT wait for the
|
|
25
|
-
* burn receipt — the caller pairs this with `waitForAttestation`.
|
|
26
|
-
*/
|
|
27
|
-
export async function approveAndBurn(params) {
|
|
28
|
-
const { signer, amount, usdcAddress, destinationDomain, smartAccountAddress, maxFee, minFinalityThreshold = FINALITY_FAST, tokenMessengerAddress = TOKEN_MESSENGER_V2, forceApprove = false, } = params;
|
|
29
|
-
// 1. Allowance check — skip `approve` if the user already granted
|
|
30
|
-
// enough USDC to the TokenMessenger. Saves a tx + signature
|
|
31
|
-
// prompt on repeat swaps.
|
|
32
|
-
let approveTxHash;
|
|
33
|
-
const needsApprove = forceApprove ||
|
|
34
|
-
!(await hasEnoughAllowance({
|
|
35
|
-
signer,
|
|
36
|
-
usdcAddress,
|
|
37
|
-
spender: tokenMessengerAddress,
|
|
38
|
-
minAmount: amount,
|
|
39
|
-
}));
|
|
40
|
-
if (needsApprove) {
|
|
41
|
-
approveTxHash = (await signer.sendTransaction({
|
|
42
|
-
to: usdcAddress,
|
|
43
|
-
data: encodeFunctionData({
|
|
44
|
-
abi: erc20Abi,
|
|
45
|
-
functionName: "approve",
|
|
46
|
-
args: [tokenMessengerAddress, amount],
|
|
47
|
-
}),
|
|
48
|
-
}));
|
|
49
|
-
// Wait for the approve to mine — otherwise depositForBurn sees a
|
|
50
|
-
// stale allowance and reverts.
|
|
51
|
-
const receipt = await signer.waitForReceipt(approveTxHash);
|
|
52
|
-
if (receipt.status !== "success") {
|
|
53
|
-
throw new Error(`USDC approve reverted: tx ${approveTxHash}`);
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
// 2. Burn. `mintRecipient` and `destinationCaller` both pinned to
|
|
57
|
-
// the smart-account address:
|
|
58
|
-
// - Destination USDC mints into the smart account (not the EOA).
|
|
59
|
-
// - Only that account can call `receiveMessage` on the
|
|
60
|
-
// destination chain → blocks front-runners from drawing gas
|
|
61
|
-
// from our paymaster via a racing UserOp.
|
|
62
|
-
const recipientBytes32 = addressToBytes32(smartAccountAddress);
|
|
63
|
-
const burnTxHash = (await signer.sendTransaction({
|
|
64
|
-
to: tokenMessengerAddress,
|
|
65
|
-
data: encodeFunctionData({
|
|
66
|
-
abi: TOKEN_MESSENGER_ABI,
|
|
67
|
-
functionName: "depositForBurn",
|
|
68
|
-
args: [
|
|
69
|
-
amount,
|
|
70
|
-
destinationDomain,
|
|
71
|
-
recipientBytes32,
|
|
72
|
-
usdcAddress,
|
|
73
|
-
recipientBytes32,
|
|
74
|
-
maxFee,
|
|
75
|
-
minFinalityThreshold,
|
|
76
|
-
],
|
|
77
|
-
}),
|
|
78
|
-
}));
|
|
79
|
-
return { approveTxHash, burnTxHash };
|
|
80
|
-
}
|
|
81
|
-
/** ERC-20 `allowance(owner, spender)` read via `EvmSigner.call`. */
|
|
82
|
-
async function hasEnoughAllowance(args) {
|
|
83
|
-
const { signer, usdcAddress, spender, minAmount } = args;
|
|
84
|
-
const data = encodeFunctionData({
|
|
85
|
-
abi: erc20Abi,
|
|
86
|
-
functionName: "allowance",
|
|
87
|
-
args: [signer.address, spender],
|
|
88
|
-
});
|
|
89
|
-
const result = await signer.call({ to: usdcAddress, data });
|
|
90
|
-
// `allowance` returns uint256 — 32 bytes, big-endian hex.
|
|
91
|
-
const hex = result.replace(/^0x/, "") || "0";
|
|
92
|
-
const current = BigInt(`0x${hex}`);
|
|
93
|
-
return current >= minAmount;
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=approveAndBurn.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"approveAndBurn.js","sourceRoot":"","sources":["../../src/cctp-inbound/approveAndBurn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,MAAM,mBAAmB,GAAG,QAAQ,CAAC;IACnC,+MAA+M;CAChN,CAAC,CAAC;AAgDH;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,MAA4B;IAE5B,MAAM,EACJ,MAAM,EACN,MAAM,EACN,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,MAAM,EACN,oBAAoB,GAAG,aAAa,EACpC,qBAAqB,GAAG,kBAA6B,EACrD,YAAY,GAAG,KAAK,GACrB,GAAG,MAAM,CAAC;IAEX,kEAAkE;IAClE,+DAA+D;IAC/D,6BAA6B;IAC7B,IAAI,aAA8B,CAAC;IACnC,MAAM,YAAY,GAChB,YAAY;QACZ,CAAC,CAAC,MAAM,kBAAkB,CAAC;YACzB,MAAM;YACN,WAAW;YACX,OAAO,EAAE,qBAAqB;YAC9B,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC,CAAC;IAEN,IAAI,YAAY,EAAE,CAAC;QACjB,aAAa,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC;YAC5C,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,kBAAkB,CAAC;gBACvB,GAAG,EAAE,QAAQ;gBACb,YAAY,EAAE,SAAS;gBACvB,IAAI,EAAE,CAAC,qBAAqB,EAAE,MAAM,CAAC;aACtC,CAAC;SACH,CAAC,CAAQ,CAAC;QACX,iEAAiE;QACjE,+BAA+B;QAC/B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QAC3D,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,6BAA6B,aAAa,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,kEAAkE;IAClE,gCAAgC;IAChC,sEAAsE;IACtE,4DAA4D;IAC5D,mEAAmE;IACnE,iDAAiD;IACjD,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,mBAAmB,CAAQ,CAAC;IACtE,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC;QAC/C,EAAE,EAAE,qBAAqB;QACzB,IAAI,EAAE,kBAAkB,CAAC;YACvB,GAAG,EAAE,mBAAmB;YACxB,YAAY,EAAE,gBAAgB;YAC9B,IAAI,EAAE;gBACJ,MAAM;gBACN,iBAAiB;gBACjB,gBAAgB;gBAChB,WAAW;gBACX,gBAAgB;gBAChB,MAAM;gBACN,oBAAoB;aACrB;SACF,CAAC;KACH,CAAC,CAAQ,CAAC;IAEX,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC;AACvC,CAAC;AAED,oEAAoE;AACpE,KAAK,UAAU,kBAAkB,CAAC,IAKjC;IACC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IACzD,MAAM,IAAI,GAAG,kBAAkB,CAAC;QAC9B,GAAG,EAAE,QAAQ;QACb,YAAY,EAAE,WAAW;QACzB,IAAI,EAAE,CAAC,MAAM,CAAC,OAAkB,EAAE,OAAO,CAAC;KAC3C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,0DAA0D;IAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,OAAO,IAAI,SAAS,CAAC;AAC9B,CAAC"}
|