@lendasat/lendaswap-sdk-pure 0.2.24 → 0.2.25

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 (133) hide show
  1. package/dist/arkade-network.d.ts +8 -0
  2. package/dist/arkade-network.d.ts.map +1 -0
  3. package/dist/arkade-network.js +40 -0
  4. package/dist/arkade-network.js.map +1 -0
  5. package/dist/arkade.d.ts.map +1 -1
  6. package/dist/arkade.js +2 -9
  7. package/dist/arkade.js.map +1 -1
  8. package/dist/cctp/fee.d.ts +49 -0
  9. package/dist/cctp/fee.d.ts.map +1 -0
  10. package/dist/cctp/fee.js +70 -0
  11. package/dist/cctp/fee.js.map +1 -0
  12. package/dist/cctp/index.d.ts +1 -0
  13. package/dist/cctp/index.d.ts.map +1 -1
  14. package/dist/cctp/index.js +1 -0
  15. package/dist/cctp/index.js.map +1 -1
  16. package/dist/cctp-bridge/bridge.d.ts +62 -0
  17. package/dist/cctp-bridge/bridge.d.ts.map +1 -0
  18. package/dist/cctp-bridge/bridge.js +74 -0
  19. package/dist/cctp-bridge/bridge.js.map +1 -0
  20. package/dist/cctp-bridge/index.d.ts +17 -0
  21. package/dist/cctp-bridge/index.d.ts.map +1 -0
  22. package/dist/cctp-bridge/index.js +16 -0
  23. package/dist/cctp-bridge/index.js.map +1 -0
  24. package/dist/cctp-inbound/approveAndBurn.d.ts +68 -0
  25. package/dist/cctp-inbound/approveAndBurn.d.ts.map +1 -0
  26. package/dist/cctp-inbound/approveAndBurn.js +95 -0
  27. package/dist/cctp-inbound/approveAndBurn.js.map +1 -0
  28. package/dist/cctp-inbound/burn.d.ts +51 -0
  29. package/dist/cctp-inbound/burn.d.ts.map +1 -0
  30. package/dist/cctp-inbound/burn.js +66 -0
  31. package/dist/cctp-inbound/burn.js.map +1 -0
  32. package/dist/cctp-inbound/chainMap.d.ts +48 -0
  33. package/dist/cctp-inbound/chainMap.d.ts.map +1 -0
  34. package/dist/cctp-inbound/chainMap.js +103 -0
  35. package/dist/cctp-inbound/chainMap.js.map +1 -0
  36. package/dist/cctp-inbound/client.d.ts +1573 -0
  37. package/dist/cctp-inbound/client.d.ts.map +1 -0
  38. package/dist/cctp-inbound/client.js +117 -0
  39. package/dist/cctp-inbound/client.js.map +1 -0
  40. package/dist/cctp-inbound/eip2612.d.ts +77 -0
  41. package/dist/cctp-inbound/eip2612.d.ts.map +1 -0
  42. package/dist/cctp-inbound/eip2612.js +95 -0
  43. package/dist/cctp-inbound/eip2612.js.map +1 -0
  44. package/dist/cctp-inbound/evmSignerAdapter.d.ts +25 -0
  45. package/dist/cctp-inbound/evmSignerAdapter.d.ts.map +1 -0
  46. package/dist/cctp-inbound/evmSignerAdapter.js +50 -0
  47. package/dist/cctp-inbound/evmSignerAdapter.js.map +1 -0
  48. package/dist/cctp-inbound/fundSwap.d.ts +94 -0
  49. package/dist/cctp-inbound/fundSwap.d.ts.map +1 -0
  50. package/dist/cctp-inbound/fundSwap.js +90 -0
  51. package/dist/cctp-inbound/fundSwap.js.map +1 -0
  52. package/dist/cctp-inbound/index.d.ts +35 -0
  53. package/dist/cctp-inbound/index.d.ts.map +1 -0
  54. package/dist/cctp-inbound/index.js +33 -0
  55. package/dist/cctp-inbound/index.js.map +1 -0
  56. package/dist/cctp-inbound/permit2.d.ts +33 -0
  57. package/dist/cctp-inbound/permit2.d.ts.map +1 -0
  58. package/dist/cctp-inbound/permit2.js +32 -0
  59. package/dist/cctp-inbound/permit2.js.map +1 -0
  60. package/dist/cctp-inbound/preflight.d.ts +36 -0
  61. package/dist/cctp-inbound/preflight.d.ts.map +1 -0
  62. package/dist/cctp-inbound/preflight.js +67 -0
  63. package/dist/cctp-inbound/preflight.js.map +1 -0
  64. package/dist/cctp-inbound/smartAccount.d.ts +1518 -0
  65. package/dist/cctp-inbound/smartAccount.d.ts.map +1 -0
  66. package/dist/cctp-inbound/smartAccount.js +117 -0
  67. package/dist/cctp-inbound/smartAccount.js.map +1 -0
  68. package/dist/cctp-inbound/submit.d.ts +75 -0
  69. package/dist/cctp-inbound/submit.d.ts.map +1 -0
  70. package/dist/cctp-inbound/submit.js +126 -0
  71. package/dist/cctp-inbound/submit.js.map +1 -0
  72. package/dist/cctp-inbound/types.d.ts +30 -0
  73. package/dist/cctp-inbound/types.d.ts.map +1 -0
  74. package/dist/cctp-inbound/types.js +5 -0
  75. package/dist/cctp-inbound/types.js.map +1 -0
  76. package/dist/cctp-inbound/userOp.d.ts +93 -0
  77. package/dist/cctp-inbound/userOp.d.ts.map +1 -0
  78. package/dist/cctp-inbound/userOp.js +151 -0
  79. package/dist/cctp-inbound/userOp.js.map +1 -0
  80. package/dist/client.d.ts +130 -5
  81. package/dist/client.d.ts.map +1 -1
  82. package/dist/client.js +479 -14
  83. package/dist/client.js.map +1 -1
  84. package/dist/create/evm-to-arkade.d.ts.map +1 -1
  85. package/dist/create/evm-to-arkade.js +2 -0
  86. package/dist/create/evm-to-arkade.js.map +1 -1
  87. package/dist/create/evm-to-bitcoin.d.ts.map +1 -1
  88. package/dist/create/evm-to-bitcoin.js +2 -0
  89. package/dist/create/evm-to-bitcoin.js.map +1 -1
  90. package/dist/create/evm-to-lightning.d.ts.map +1 -1
  91. package/dist/create/evm-to-lightning.js +6 -3
  92. package/dist/create/evm-to-lightning.js.map +1 -1
  93. package/dist/create/types.d.ts +23 -0
  94. package/dist/create/types.d.ts.map +1 -1
  95. package/dist/delegate.d.ts.map +1 -1
  96. package/dist/delegate.js +2 -31
  97. package/dist/delegate.js.map +1 -1
  98. package/dist/evm/wallet.d.ts +16 -0
  99. package/dist/evm/wallet.d.ts.map +1 -1
  100. package/dist/evm/wallet.js.map +1 -1
  101. package/dist/generated/api.d.ts +274 -2
  102. package/dist/generated/api.d.ts.map +1 -1
  103. package/dist/index.d.ts +3 -2
  104. package/dist/index.d.ts.map +1 -1
  105. package/dist/index.js +4 -2
  106. package/dist/index.js.map +1 -1
  107. package/dist/redeem/arkade.d.ts.map +1 -1
  108. package/dist/redeem/arkade.js +4 -43
  109. package/dist/redeem/arkade.js.map +1 -1
  110. package/dist/refund/arkade.d.ts.map +1 -1
  111. package/dist/refund/arkade.js +3 -39
  112. package/dist/refund/arkade.js.map +1 -1
  113. package/dist/refund/{collab.d.ts → collab-arkade-evm.d.ts} +6 -6
  114. package/dist/refund/collab-arkade-evm.d.ts.map +1 -0
  115. package/dist/refund/{collab.js → collab-arkade-evm.js} +6 -38
  116. package/dist/refund/collab-arkade-evm.js.map +1 -0
  117. package/dist/refund/collab-arkade-lightning.d.ts +59 -0
  118. package/dist/refund/collab-arkade-lightning.d.ts.map +1 -0
  119. package/dist/refund/collab-arkade-lightning.js +208 -0
  120. package/dist/refund/collab-arkade-lightning.js.map +1 -0
  121. package/dist/refund/index.d.ts +3 -2
  122. package/dist/refund/index.d.ts.map +1 -1
  123. package/dist/refund/index.js +3 -2
  124. package/dist/refund/index.js.map +1 -1
  125. package/dist/tokens.d.ts +12 -0
  126. package/dist/tokens.d.ts.map +1 -1
  127. package/dist/tokens.js +21 -1
  128. package/dist/tokens.js.map +1 -1
  129. package/dist/version.d.ts +2 -2
  130. package/dist/version.js +1 -1
  131. package/package.json +27 -2
  132. package/dist/refund/collab.d.ts.map +0 -1
  133. package/dist/refund/collab.js.map +0 -1
@@ -0,0 +1,8 @@
1
+ import { type NetworkName } from "@arkade-os/sdk";
2
+ /** Default Arkade server URL by network */
3
+ export declare const DEFAULT_ARKADE_URLS: Record<string, string>;
4
+ export declare function getNetworkName(network: string): NetworkName;
5
+ export declare function getNetworkHrp(networkName: NetworkName): string;
6
+ export declare function resolveArkadeServerUrl(network: string, arkadeServerUrl?: string): string;
7
+ export declare function resolveArkadeServerUrlByName(networkName: NetworkName, arkadeServerUrl?: string): string;
8
+ //# sourceMappingURL=arkade-network.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkade-network.d.ts","sourceRoot":"","sources":["../src/arkade-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAY,MAAM,gBAAgB,CAAC;AAE5D,2CAA2C;AAC3C,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAKtD,CAAC;AAEF,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAgB3D;AAED,wBAAgB,aAAa,CAAC,WAAW,EAAE,WAAW,GAAG,MAAM,CAE9D;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAGR;AAED,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,WAAW,EACxB,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAQR"}
@@ -0,0 +1,40 @@
1
+ import { networks } from "@arkade-os/sdk";
2
+ /** Default Arkade server URL by network */
3
+ export const DEFAULT_ARKADE_URLS = {
4
+ bitcoin: "https://arkade.computer",
5
+ mainnet: "https://arkade.computer",
6
+ signet: "https://mutinynet.arkade.sh",
7
+ mutinynet: "https://mutinynet.arkade.sh",
8
+ };
9
+ export function getNetworkName(network) {
10
+ switch (network.toLowerCase()) {
11
+ case "mainnet":
12
+ case "bitcoin":
13
+ return "bitcoin";
14
+ case "testnet":
15
+ return "testnet";
16
+ case "signet":
17
+ return "signet";
18
+ case "mutinynet":
19
+ return "mutinynet";
20
+ case "regtest":
21
+ return "regtest";
22
+ default:
23
+ throw new Error(`Unknown network: ${network}`);
24
+ }
25
+ }
26
+ export function getNetworkHrp(networkName) {
27
+ return networks[networkName].hrp;
28
+ }
29
+ export function resolveArkadeServerUrl(network, arkadeServerUrl) {
30
+ const networkName = getNetworkName(network);
31
+ return resolveArkadeServerUrlByName(networkName, arkadeServerUrl);
32
+ }
33
+ export function resolveArkadeServerUrlByName(networkName, arkadeServerUrl) {
34
+ const serverUrl = arkadeServerUrl ?? DEFAULT_ARKADE_URLS[networkName];
35
+ if (!serverUrl) {
36
+ throw new Error(`No Arkade server URL configured for network: ${networkName}`);
37
+ }
38
+ return serverUrl;
39
+ }
40
+ //# sourceMappingURL=arkade-network.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arkade-network.js","sourceRoot":"","sources":["../src/arkade-network.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE5D,2CAA2C;AAC3C,MAAM,CAAC,MAAM,mBAAmB,GAA2B;IACzD,OAAO,EAAE,yBAAyB;IAClC,OAAO,EAAE,yBAAyB;IAClC,MAAM,EAAE,6BAA6B;IACrC,SAAS,EAAE,6BAA6B;CACzC,CAAC;AAEF,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,QAAQ,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9B,KAAK,SAAS,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB;YACE,MAAM,IAAI,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;IACnD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,WAAwB;IACpD,OAAO,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAe,EACf,eAAwB;IAExB,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5C,OAAO,4BAA4B,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,WAAwB,EACxB,eAAwB;IAExB,MAAM,SAAS,GAAG,eAAe,IAAI,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACtE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,gDAAgD,WAAW,EAAE,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"arkade.d.ts","sourceRoot":"","sources":["../src/arkade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,oCAAoC;AACpC,MAAM,MAAM,UAAU,GAClB,YAAY,GACZ,WAAW,GACX,aAAa,GACb,OAAO,GACP,OAAO,CAAC;AAEZ,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAyDvB"}
1
+ {"version":3,"file":"arkade.d.ts","sourceRoot":"","sources":["../src/arkade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,oCAAoC;AACpC,MAAM,MAAM,UAAU,GAClB,YAAY,GACZ,WAAW,GACX,aAAa,GACb,OAAO,GACP,OAAO,CAAC;AAEZ,8BAA8B;AAC9B,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,WAAW,EAAE,MAAM,CAAC;IACpB,8CAA8C;IAC9C,UAAU,EAAE,UAAU,CAAC;CACxB;AAED,4CAA4C;AAC5C,MAAM,WAAW,qBAAqB;IACpC,+BAA+B;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,iFAAiF;IACjF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,MAAM,EAAE,qBAAqB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAsDvB"}
package/dist/arkade.js CHANGED
@@ -5,11 +5,7 @@
5
5
  */
6
6
  import { ArkAddress, RestIndexerProvider, } from "@arkade-os/sdk";
7
7
  import { hex } from "@scure/base";
8
- /** Default Arkade server URLs by network */
9
- const DEFAULT_ARKADE_URLS = {
10
- bitcoin: "https://arkade.computer",
11
- signet: "https://signet.arkade.computer",
12
- };
8
+ import { resolveArkadeServerUrl } from "./arkade-network.js";
13
9
  /**
14
10
  * Queries the Arkade indexer for spendable, spent, and recoverable balances
15
11
  * at a VHTLC address.
@@ -23,10 +19,7 @@ export async function getVhtlcAmounts(params) {
23
19
  const decoded = ArkAddress.decode(vhtlcAddress);
24
20
  const pkScript = hex.encode(decoded.pkScript);
25
21
  // Determine Arkade server URL: explicit override > network default
26
- const serverUrl = arkadeServerUrl ?? DEFAULT_ARKADE_URLS[network];
27
- if (!serverUrl) {
28
- throw new Error(`Unknown network for Arkade: ${network}`);
29
- }
22
+ const serverUrl = resolveArkadeServerUrl(network, arkadeServerUrl);
30
23
  const indexerProvider = new RestIndexerProvider(serverUrl);
31
24
  // Query each category separately
32
25
  const [spendableResult, spentResult, recoverableResult] = await Promise.all([
@@ -1 +1 @@
1
- {"version":3,"file":"arkade.js","sourceRoot":"","sources":["../src/arkade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"arkade.js","sourceRoot":"","sources":["../src/arkade.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EAEV,mBAAmB,GACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAgC7D;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAA6B;IAE7B,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CAAC;IAE1D,oEAAoE;IACpE,MAAM,OAAO,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE9C,mEAAmE;IACnE,MAAM,SAAS,GAAG,sBAAsB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IAEnE,MAAM,eAAe,GAAoB,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAE5E,iCAAiC;IACjC,MAAM,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAC1E,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;QACtE,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAClE,eAAe,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;KACzE,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,CAAC,KAA0B,EAAE,EAAE,CACzC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAE7C,0EAA0E;IAC1E,0EAA0E;IAC1E,sEAAsE;IACtE,uDAAuD;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,KAAK,MAAM,CAAC,IAAI,eAAe,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,CAAC,CAAC,aAAa,EAAE,WAAW,CAAC;QAC5C,IAAI,MAAM,IAAI,MAAM,IAAI,GAAG,EAAE,CAAC;YAC5B,gBAAgB,IAAI,CAAC,CAAC,KAAK,CAAC;QAC9B,CAAC;aAAM,CAAC;YACN,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,eAAe,CAAC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,WAAW,GAAG,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,gBAAgB,CAAC;IAEpE,MAAM,UAAU,GACd,SAAS,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC;QACjD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,SAAS,GAAG,CAAC,IAAI,WAAW,GAAG,CAAC;YAChC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,SAAS,GAAG,CAAC;gBACb,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,WAAW,GAAG,CAAC;oBACf,CAAC,CAAC,aAAa;oBACf,CAAC,CAAC,OAAO,CAAC;IAEpB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,49 @@
1
+ /** Fee tiers returned by the IRIS API (low/med/high gas estimates for the forwarder). */
2
+ export interface IrisForwardFeeTiers {
3
+ low: number;
4
+ med: number;
5
+ high: number;
6
+ }
7
+ /** Raw entry from `GET /v2/burn/USDC/fees/{sourceDomain}/{destDomain}`. */
8
+ export interface IrisFeeEntry {
9
+ finalityThreshold: number;
10
+ /** CCTPv2 fast-transfer fee in basis points (e.g. `1.3` = 0.013%). */
11
+ minimumFee: number;
12
+ /** Forward-service relayer fees (absolute USDC smallest-units). */
13
+ forwardFee: IrisForwardFeeTiers;
14
+ }
15
+ export interface FetchCctpFeeOptions {
16
+ /** CCTP source domain ID (e.g. 2 = Optimism, 6 = Base). */
17
+ sourceDomain: number;
18
+ /** CCTP destination domain ID (3 = Arbitrum). */
19
+ destinationDomain: number;
20
+ /** Finality threshold to query — defaults to `FINALITY_FAST` (1000). */
21
+ finalityThreshold?: number;
22
+ /** IRIS API base URL. Defaults to mainnet. */
23
+ irisApiUrl?: string;
24
+ /** Optional abort signal. */
25
+ signal?: AbortSignal;
26
+ }
27
+ /**
28
+ * Fetch the fee entry for the given source → destination pair and
29
+ * finality threshold. Returns the raw IRIS shape — callers that want
30
+ * an applied maxFee should pass this to {@link computeCctpFastFee}.
31
+ */
32
+ export declare function fetchCctpFee(options: FetchCctpFeeOptions): Promise<IrisFeeEntry>;
33
+ /**
34
+ * Cached variant of {@link fetchCctpFee}. Multiple callers within a
35
+ * 60-second window share a single IRIS round-trip per source→dest pair.
36
+ */
37
+ export declare function getCachedCctpFee(options: FetchCctpFeeOptions): Promise<IrisFeeEntry>;
38
+ /**
39
+ * Apply IRIS's `minimumFee` (basis points) to an amount in USDC smallest
40
+ * units, matching the Rust backend's formula:
41
+ * protocolFee = amount × round(minimumFee × 100) ÷ 1_000_000
42
+ *
43
+ * Adds a conservative 20% buffer to absorb rounding drift between quote
44
+ * time and burn time. Return value is the fee in USDC smallest units,
45
+ * suitable for `maxFee` in `depositForBurn` and as the subtracted amount
46
+ * when sizing the Permit2 permit.
47
+ */
48
+ export declare function computeCctpFastFee(entry: IrisFeeEntry, amountUsdcUnits: bigint): bigint;
49
+ //# sourceMappingURL=fee.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fee.d.ts","sourceRoot":"","sources":["../../src/cctp/fee.ts"],"names":[],"mappings":"AAaA,yFAAyF;AACzF,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,YAAY,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,iBAAiB,EAAE,MAAM,CAAC;IAC1B,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6BAA6B;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA0BvB;AAUD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,YAAY,CAAC,CAevB;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EACnB,eAAe,EAAE,MAAM,GACtB,MAAM,CAIR"}
@@ -0,0 +1,70 @@
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
@@ -0,0 +1 @@
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"}
@@ -8,6 +8,7 @@
8
8
  */
9
9
  export { type AttestationResult, type FetchAttestationOptions, fetchAttestation, type TrackCctpMessageOptions, trackCctpMessage, } from "./attestation.js";
10
10
  export { CCTP_DOMAINS, type CctpChainName, 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, type FetchCctpFeeOptions, fetchCctpFee, getCachedCctpFee, type IrisFeeEntry, type IrisForwardFeeTiers, } from "./fee.js";
11
12
  export type { AttestationResponse, AttestationStatus, BridgeParams, BurnResult, CctpMessageResult, CctpMessageStatus, MintResult, } from "./types.js";
12
13
  export { addressToBytes32, bytes32ToAddress, getDomain, needsBridge, } from "./utils.js";
13
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cctp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,KAAK,aAAa,EAClB,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;AAExB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,WAAW,GACZ,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cctp/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,gBAAgB,EAChB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,KAAK,aAAa,EAClB,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,EAClB,KAAK,mBAAmB,EACxB,YAAY,EACZ,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,WAAW,GACZ,MAAM,YAAY,CAAC"}
@@ -8,5 +8,6 @@
8
8
  */
9
9
  export { fetchAttestation, trackCctpMessage, } from "./attestation.js";
10
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";
11
12
  export { addressToBytes32, bytes32ToAddress, getDomain, needsBridge, } from "./utils.js";
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
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;AAYxB,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,SAAS,EACT,WAAW,GACZ,MAAM,YAAY,CAAC"}
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,WAAW,GACZ,MAAM,YAAY,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { type BridgeChainIdentifier, type BridgeConfig, type BridgeParams, type BridgeResult, type EstimateResult } from "@circle-fin/bridge-kit";
2
+ type BridgeKitAdapter = BridgeParams["from"]["adapter"];
3
+ type BridgeEventPayload = any;
4
+ export interface BridgeUsdcParams {
5
+ /** Source chain + pre-built bridge-kit adapter. */
6
+ source: {
7
+ adapter: BridgeKitAdapter;
8
+ chain: BridgeChainIdentifier;
9
+ /** Required when the adapter is developer-controlled. */
10
+ address?: string;
11
+ };
12
+ /**
13
+ * Destination. Adapter may be the same instance as `source.adapter` if the
14
+ * user holds the same key on both chains (the common case).
15
+ */
16
+ destination: {
17
+ adapter: BridgeKitAdapter;
18
+ chain: BridgeChainIdentifier;
19
+ /** Required when the adapter is developer-controlled. */
20
+ address?: string;
21
+ /** Send to a different EVM address than the adapter's own. */
22
+ recipientAddress?: string;
23
+ };
24
+ /** Human-readable USDC amount, e.g. "10.50". */
25
+ amount: string;
26
+ config?: BridgeConfig;
27
+ /** Subscribe to all bridge-kit lifecycle events (approve/burn/attest/mint). */
28
+ onEvent?: (event: BridgeEventPayload) => void;
29
+ /** Subscribe to a single lifecycle event. */
30
+ onApprove?: (event: BridgeEventPayload) => void;
31
+ onBurn?: (event: BridgeEventPayload) => void;
32
+ onAttestation?: (event: BridgeEventPayload) => void;
33
+ onMint?: (event: BridgeEventPayload) => void;
34
+ }
35
+ /**
36
+ * Bridge USDC cross-chain via Circle CCTPv2.
37
+ *
38
+ * Runs the full approve → burn → attest → mint flow in one call. Returns a
39
+ * `BridgeResult` whose `state` is `'success'` or `'error'`; inspect `steps`
40
+ * for per-action details. Recoverable failures can be resumed with
41
+ * `BridgeKit.retry()` — see bridge-kit's retry guide.
42
+ */
43
+ export declare function bridgeUsdc(params: BridgeUsdcParams): Promise<BridgeResult>;
44
+ /**
45
+ * Bridge USDC from any CCTPv2-supported chain into Arbitrum.
46
+ *
47
+ * Convenience for the common Lendaswap flow: land USDC on Arbitrum so the
48
+ * existing Arbitrum USDC → BTC HTLC swap can run against it.
49
+ */
50
+ export declare function bridgeUsdcToArbitrum(params: Omit<BridgeUsdcParams, "destination"> & {
51
+ destination: Omit<BridgeUsdcParams["destination"], "chain"> & {
52
+ chain?: BridgeChainIdentifier;
53
+ };
54
+ }): Promise<BridgeResult>;
55
+ /**
56
+ * Estimate CCTPv2 bridge costs (protocol fee + gas on source and destination)
57
+ * without executing anything. Requires an adapter on both sides because gas
58
+ * estimation depends on the specific wallet/account.
59
+ */
60
+ export declare function estimateUsdcBridgeFees(params: Omit<BridgeUsdcParams, "onEvent" | "onApprove" | "onBurn" | "onAttestation" | "onMint">): Promise<EstimateResult>;
61
+ export {};
62
+ //# sourceMappingURL=bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../src/cctp-bridge/bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,YAAY,EAEjB,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,cAAc,EACpB,MAAM,wBAAwB,CAAC;AAEhC,KAAK,gBAAgB,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;AAGxD,KAAK,kBAAkB,GAAG,GAAG,CAAC;AAE9B,MAAM,WAAW,gBAAgB;IAC/B,mDAAmD;IACnD,MAAM,EAAE;QACN,OAAO,EAAE,gBAAgB,CAAC;QAC1B,KAAK,EAAE,qBAAqB,CAAC;QAC7B,yDAAyD;QACzD,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;IACF;;;OAGG;IACH,WAAW,EAAE;QACX,OAAO,EAAE,gBAAgB,CAAC;QAC1B,KAAK,EAAE,qBAAqB,CAAC;QAC7B,yDAAyD;QACzD,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,8DAA8D;QAC9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IACF,gDAAgD;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC9C,6CAA6C;IAC7C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IAC7C,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACpD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,YAAY,CAAC,CAIvB;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC,GAAG;IAC9C,WAAW,EAAE,IAAI,CAAC,gBAAgB,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,GAAG;QAC5D,KAAK,CAAC,EAAE,qBAAqB,CAAC;KAC/B,CAAC;CACH,GACA,OAAO,CAAC,YAAY,CAAC,CAQvB;AAED;;;;GAIG;AACH,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,IAAI,CACV,gBAAgB,EAChB,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,eAAe,GAAG,QAAQ,CAChE,GACA,OAAO,CAAC,cAAc,CAAC,CAGzB"}
@@ -0,0 +1,74 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * CCTP bridge (source-side) — wraps Circle's @circle-fin/bridge-kit.
3
+ *
4
+ * Used for bridging USDC from any CCTPv2-supported chain into Arbitrum,
5
+ * so it can feed into an Arbitrum USDC → BTC swap. Exposed as a subpath
6
+ * export so bridge-kit + its viem adapter stay optional peer deps; consumers
7
+ * that don't import from `@lendasat/lendaswap-sdk-pure/cctp-bridge` don't
8
+ * pay the bundle cost.
9
+ *
10
+ * Attestation tracking for the *target* side of an existing swap (Circle's
11
+ * forwarding service) still lives in `../cctp` — that flow isn't what
12
+ * bridge-kit drives.
13
+ */
14
+ export type { AdapterContext, BridgeChainIdentifier, BridgeConfig, BridgeParams, EstimateResult, } from "@circle-fin/bridge-kit";
15
+ export { BridgeChain, BridgeKit, type BridgeResult, TransferSpeed, } from "@circle-fin/bridge-kit";
16
+ export { type BridgeUsdcParams, bridgeUsdc, bridgeUsdcToArbitrum, estimateUsdcBridgeFees, } from "./bridge.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cctp-bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,YAAY,EACZ,YAAY,EACZ,cAAc,GACf,MAAM,wBAAwB,CAAC;AAEhC,OAAO,EACL,WAAW,EACX,SAAS,EACT,KAAK,YAAY,EACjB,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,gBAAgB,EACrB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * CCTP bridge (source-side) — wraps Circle's @circle-fin/bridge-kit.
3
+ *
4
+ * Used for bridging USDC from any CCTPv2-supported chain into Arbitrum,
5
+ * so it can feed into an Arbitrum USDC → BTC swap. Exposed as a subpath
6
+ * export so bridge-kit + its viem adapter stay optional peer deps; consumers
7
+ * that don't import from `@lendasat/lendaswap-sdk-pure/cctp-bridge` don't
8
+ * pay the bundle cost.
9
+ *
10
+ * Attestation tracking for the *target* side of an existing swap (Circle's
11
+ * forwarding service) still lives in `../cctp` — that flow isn't what
12
+ * bridge-kit drives.
13
+ */
14
+ export { BridgeChain, BridgeKit, TransferSpeed, } from "@circle-fin/bridge-kit";
15
+ export { bridgeUsdc, bridgeUsdcToArbitrum, estimateUsdcBridgeFees, } from "./bridge.js";
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cctp-bridge/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAUH,OAAO,EACL,WAAW,EACX,SAAS,EAET,aAAa,GACd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,UAAU,EACV,oBAAoB,EACpB,sBAAsB,GACvB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,68 @@
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 type { Address, Hex } from "viem";
17
+ import type { EvmSigner } from "../evm/wallet.js";
18
+ export interface ApproveAndBurnParams {
19
+ /** SDK signer bound to the source chain. */
20
+ signer: EvmSigner;
21
+ /** USDC amount in smallest units (6 decimals). */
22
+ amount: bigint;
23
+ /** USDC contract address on the source chain. */
24
+ usdcAddress: Address;
25
+ /** CCTP destination domain id (3 = Arbitrum mainnet). */
26
+ destinationDomain: number;
27
+ /**
28
+ * The address that will both (a) receive the minted USDC on the
29
+ * destination chain and (b) be the sole caller allowed to submit
30
+ * `receiveMessage`. For the CCTP-inbound settlement flow this is
31
+ * the caller's Kernel smart-account address.
32
+ */
33
+ smartAccountAddress: Address;
34
+ /**
35
+ * Max CCTPv2 fast-transfer fee in USDC units, from the IRIS fee API.
36
+ * The caller is responsible for fetching this — typical value is
37
+ * ~1/10000 of the amount.
38
+ */
39
+ maxFee: bigint;
40
+ /**
41
+ * CCTP finality threshold. Defaults to fast transfer (1000).
42
+ * Use 2000 for standard (cheaper, ~13 minutes) transfers.
43
+ */
44
+ minFinalityThreshold?: number;
45
+ /**
46
+ * Override the TokenMessenger contract address. Defaults to the
47
+ * canonical CCTPv2 deployment shared across all EVM chains.
48
+ */
49
+ tokenMessengerAddress?: Address;
50
+ /**
51
+ * When `true`, always send `approve` even if existing allowance is
52
+ * sufficient. Defaults to `false` to avoid unnecessary txs.
53
+ */
54
+ forceApprove?: boolean;
55
+ }
56
+ export interface ApproveAndBurnResult {
57
+ /** Tx hash of the USDC approval; omitted when the existing allowance was sufficient. */
58
+ approveTxHash?: Hex;
59
+ /** Tx hash of the `depositForBurn` call. */
60
+ burnTxHash: Hex;
61
+ }
62
+ /**
63
+ * Approve USDC to the TokenMessenger (if needed) then burn it for the
64
+ * cross-chain transfer. Returns the tx hashes. Does NOT wait for the
65
+ * burn receipt — the caller pairs this with `waitForAttestation`.
66
+ */
67
+ export declare function approveAndBurn(params: ApproveAndBurnParams): Promise<ApproveAndBurnResult>;
68
+ //# sourceMappingURL=approveAndBurn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approveAndBurn.d.ts","sourceRoot":"","sources":["../../src/cctp-inbound/approveAndBurn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAIzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAMlD,MAAM,WAAW,oBAAoB;IACnC,4CAA4C;IAC5C,MAAM,EAAE,SAAS,CAAC;IAClB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,iBAAiB,EAAE,MAAM,CAAC;IAC1B;;;;;OAKG;IACH,mBAAmB,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;OAGG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,wFAAwF;IACxF,aAAa,CAAC,EAAE,GAAG,CAAC;IACpB,4CAA4C;IAC5C,UAAU,EAAE,GAAG,CAAC;CACjB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAoE/B"}
@@ -0,0 +1,95 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approveAndBurn.js","sourceRoot":"","sources":["../../src/cctp-inbound/approveAndBurn.ts"],"names":[],"mappings":"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"}