agentwallet-sdk 3.2.1 → 3.4.0

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 (315) hide show
  1. package/README.md +2 -536
  2. package/dist/bridge/abis.d.ts +48 -171
  3. package/dist/bridge/abis.d.ts.map +1 -1
  4. package/dist/bridge/abis.js.map +1 -1
  5. package/dist/bridge/client.d.ts +2 -41
  6. package/dist/bridge/client.d.ts.map +1 -1
  7. package/dist/bridge/client.js +35 -168
  8. package/dist/bridge/client.js.map +1 -1
  9. package/dist/bridge/index.d.ts +2 -4
  10. package/dist/bridge/index.d.ts.map +1 -1
  11. package/dist/bridge/index.js +1 -8
  12. package/dist/bridge/index.js.map +1 -1
  13. package/dist/bridge/types.d.ts +15 -134
  14. package/dist/bridge/types.d.ts.map +1 -1
  15. package/dist/bridge/types.js +16 -170
  16. package/dist/bridge/types.js.map +1 -1
  17. package/dist/identity/erc8004.d.ts +2 -240
  18. package/dist/identity/erc8004.d.ts.map +1 -1
  19. package/dist/identity/erc8004.js +58 -334
  20. package/dist/identity/erc8004.js.map +1 -1
  21. package/dist/index.d.ts +313 -134
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +11 -56
  24. package/dist/index.js.map +1 -1
  25. package/dist/swap/SwapModule.d.ts +6 -50
  26. package/dist/swap/SwapModule.d.ts.map +1 -1
  27. package/dist/swap/SwapModule.js +25 -153
  28. package/dist/swap/SwapModule.js.map +1 -1
  29. package/dist/swap/abi.d.ts +47 -165
  30. package/dist/swap/abi.d.ts.map +1 -1
  31. package/dist/swap/abi.js.map +1 -1
  32. package/dist/swap/index.d.ts +2 -3
  33. package/dist/swap/index.d.ts.map +1 -1
  34. package/dist/swap/index.js +1 -4
  35. package/dist/swap/index.js.map +1 -1
  36. package/dist/swap/types.d.ts +6 -36
  37. package/dist/swap/types.d.ts.map +1 -1
  38. package/dist/swap/types.js +0 -1
  39. package/dist/swap/types.js.map +1 -1
  40. package/dist/types.d.ts +1 -2
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/types.js +0 -1
  43. package/dist/types.js.map +1 -1
  44. package/dist/x402/__tests__/budget.test.d.ts +2 -0
  45. package/dist/x402/__tests__/budget.test.d.ts.map +1 -0
  46. package/dist/x402/__tests__/budget.test.js +114 -0
  47. package/dist/x402/__tests__/budget.test.js.map +1 -0
  48. package/dist/x402/__tests__/client.test.d.ts +2 -0
  49. package/dist/x402/__tests__/client.test.d.ts.map +1 -0
  50. package/dist/x402/__tests__/client.test.js +107 -0
  51. package/dist/x402/__tests__/client.test.js.map +1 -0
  52. package/dist/x402/chains/abstract/index.d.ts +135 -0
  53. package/dist/x402/chains/abstract/index.d.ts.map +1 -0
  54. package/dist/x402/chains/abstract/index.js +190 -0
  55. package/dist/x402/chains/abstract/index.js.map +1 -0
  56. package/dist/x402/client.d.ts.map +1 -1
  57. package/dist/x402/client.js +1 -2
  58. package/dist/x402/client.js.map +1 -1
  59. package/dist/x402/index.d.ts +3 -1
  60. package/dist/x402/index.d.ts.map +1 -1
  61. package/dist/x402/index.js +3 -1
  62. package/dist/x402/index.js.map +1 -1
  63. package/dist/x402/types.d.ts +3 -5
  64. package/dist/x402/types.d.ts.map +1 -1
  65. package/dist/x402/types.js +2 -17
  66. package/dist/x402/types.js.map +1 -1
  67. package/package.json +12 -32
  68. package/dist/ap2/index.d.ts +0 -185
  69. package/dist/ap2/index.d.ts.map +0 -1
  70. package/dist/ap2/index.js +0 -255
  71. package/dist/ap2/index.js.map +0 -1
  72. package/dist/bridge/unified.d.ts +0 -101
  73. package/dist/bridge/unified.d.ts.map +0 -1
  74. package/dist/bridge/unified.js +0 -284
  75. package/dist/bridge/unified.js.map +0 -1
  76. package/dist/chains.d.ts +0 -62
  77. package/dist/chains.d.ts.map +0 -1
  78. package/dist/chains.js +0 -108
  79. package/dist/chains.js.map +0 -1
  80. package/dist/fiat/index.d.ts +0 -10
  81. package/dist/fiat/index.d.ts.map +0 -1
  82. package/dist/fiat/index.js +0 -9
  83. package/dist/fiat/index.js.map +0 -1
  84. package/dist/fiat/onramp.d.ts +0 -101
  85. package/dist/fiat/onramp.d.ts.map +0 -1
  86. package/dist/fiat/onramp.js +0 -155
  87. package/dist/fiat/onramp.js.map +0 -1
  88. package/dist/fiat/providers/index.d.ts +0 -16
  89. package/dist/fiat/providers/index.d.ts.map +0 -1
  90. package/dist/fiat/providers/index.js +0 -30
  91. package/dist/fiat/providers/index.js.map +0 -1
  92. package/dist/fiat/providers/moonpay.d.ts +0 -22
  93. package/dist/fiat/providers/moonpay.d.ts.map +0 -1
  94. package/dist/fiat/providers/moonpay.js +0 -107
  95. package/dist/fiat/providers/moonpay.js.map +0 -1
  96. package/dist/fiat/providers/stripe.d.ts +0 -26
  97. package/dist/fiat/providers/stripe.d.ts.map +0 -1
  98. package/dist/fiat/providers/stripe.js +0 -135
  99. package/dist/fiat/providers/stripe.js.map +0 -1
  100. package/dist/fiat/providers/transak.d.ts +0 -26
  101. package/dist/fiat/providers/transak.d.ts.map +0 -1
  102. package/dist/fiat/providers/transak.js +0 -119
  103. package/dist/fiat/providers/transak.js.map +0 -1
  104. package/dist/fiat/types.d.ts +0 -106
  105. package/dist/fiat/types.d.ts.map +0 -1
  106. package/dist/fiat/types.js +0 -13
  107. package/dist/fiat/types.js.map +0 -1
  108. package/dist/flash/executor.d.ts +0 -119
  109. package/dist/flash/executor.d.ts.map +0 -1
  110. package/dist/flash/executor.js +0 -195
  111. package/dist/flash/executor.js.map +0 -1
  112. package/dist/flash/index.d.ts +0 -28
  113. package/dist/flash/index.d.ts.map +0 -1
  114. package/dist/flash/index.js +0 -25
  115. package/dist/flash/index.js.map +0 -1
  116. package/dist/flash/scanner.d.ts +0 -133
  117. package/dist/flash/scanner.d.ts.map +0 -1
  118. package/dist/flash/scanner.js +0 -212
  119. package/dist/flash/scanner.js.map +0 -1
  120. package/dist/flash/types.d.ts +0 -136
  121. package/dist/flash/types.d.ts.map +0 -1
  122. package/dist/flash/types.js +0 -23
  123. package/dist/flash/types.js.map +0 -1
  124. package/dist/gas/index.d.ts +0 -4
  125. package/dist/gas/index.d.ts.map +0 -1
  126. package/dist/gas/index.js +0 -3
  127. package/dist/gas/index.js.map +0 -1
  128. package/dist/gas/sponsor.d.ts +0 -70
  129. package/dist/gas/sponsor.d.ts.map +0 -1
  130. package/dist/gas/sponsor.js +0 -193
  131. package/dist/gas/sponsor.js.map +0 -1
  132. package/dist/gas/types.d.ts +0 -76
  133. package/dist/gas/types.d.ts.map +0 -1
  134. package/dist/gas/types.js +0 -21
  135. package/dist/gas/types.js.map +0 -1
  136. package/dist/identity/agent-identity.d.ts +0 -276
  137. package/dist/identity/agent-identity.d.ts.map +0 -1
  138. package/dist/identity/agent-identity.js +0 -300
  139. package/dist/identity/agent-identity.js.map +0 -1
  140. package/dist/identity/erc6551.d.ts +0 -441
  141. package/dist/identity/erc6551.d.ts.map +0 -1
  142. package/dist/identity/erc6551.js +0 -517
  143. package/dist/identity/erc6551.js.map +0 -1
  144. package/dist/mev/index.d.ts +0 -4
  145. package/dist/mev/index.d.ts.map +0 -1
  146. package/dist/mev/index.js +0 -4
  147. package/dist/mev/index.js.map +0 -1
  148. package/dist/mev/protection.d.ts +0 -54
  149. package/dist/mev/protection.d.ts.map +0 -1
  150. package/dist/mev/protection.js +0 -185
  151. package/dist/mev/protection.js.map +0 -1
  152. package/dist/mev/risk.d.ts +0 -19
  153. package/dist/mev/risk.d.ts.map +0 -1
  154. package/dist/mev/risk.js +0 -95
  155. package/dist/mev/risk.js.map +0 -1
  156. package/dist/mev/types.d.ts +0 -49
  157. package/dist/mev/types.d.ts.map +0 -1
  158. package/dist/mev/types.js +0 -2
  159. package/dist/mev/types.js.map +0 -1
  160. package/dist/settlement/index.d.ts +0 -4
  161. package/dist/settlement/index.d.ts.map +0 -1
  162. package/dist/settlement/index.js +0 -3
  163. package/dist/settlement/index.js.map +0 -1
  164. package/dist/settlement/types.d.ts +0 -66
  165. package/dist/settlement/types.d.ts.map +0 -1
  166. package/dist/settlement/types.js +0 -37
  167. package/dist/settlement/types.js.map +0 -1
  168. package/dist/settlement/verifier.d.ts +0 -75
  169. package/dist/settlement/verifier.d.ts.map +0 -1
  170. package/dist/settlement/verifier.js +0 -354
  171. package/dist/settlement/verifier.js.map +0 -1
  172. package/dist/solana/bridge.d.ts +0 -144
  173. package/dist/solana/bridge.d.ts.map +0 -1
  174. package/dist/solana/bridge.js +0 -352
  175. package/dist/solana/bridge.js.map +0 -1
  176. package/dist/solana/index.d.ts +0 -8
  177. package/dist/solana/index.d.ts.map +0 -1
  178. package/dist/solana/index.js +0 -6
  179. package/dist/solana/index.js.map +0 -1
  180. package/dist/solana/swap.d.ts +0 -85
  181. package/dist/solana/swap.d.ts.map +0 -1
  182. package/dist/solana/swap.js +0 -173
  183. package/dist/solana/swap.js.map +0 -1
  184. package/dist/solana/types.d.ts +0 -126
  185. package/dist/solana/types.d.ts.map +0 -1
  186. package/dist/solana/types.js +0 -10
  187. package/dist/solana/types.js.map +0 -1
  188. package/dist/solana/wallet.d.ts +0 -83
  189. package/dist/solana/wallet.d.ts.map +0 -1
  190. package/dist/solana/wallet.js +0 -164
  191. package/dist/solana/wallet.js.map +0 -1
  192. package/dist/solana/x402.d.ts +0 -69
  193. package/dist/solana/x402.d.ts.map +0 -1
  194. package/dist/solana/x402.js +0 -154
  195. package/dist/solana/x402.js.map +0 -1
  196. package/dist/solver/adapter.d.ts +0 -47
  197. package/dist/solver/adapter.d.ts.map +0 -1
  198. package/dist/solver/adapter.js +0 -138
  199. package/dist/solver/adapter.js.map +0 -1
  200. package/dist/solver/analyzer.d.ts +0 -48
  201. package/dist/solver/analyzer.d.ts.map +0 -1
  202. package/dist/solver/analyzer.js +0 -89
  203. package/dist/solver/analyzer.js.map +0 -1
  204. package/dist/solver/builder.d.ts +0 -31
  205. package/dist/solver/builder.d.ts.map +0 -1
  206. package/dist/solver/builder.js +0 -60
  207. package/dist/solver/builder.js.map +0 -1
  208. package/dist/solver/index.d.ts +0 -22
  209. package/dist/solver/index.d.ts.map +0 -1
  210. package/dist/solver/index.js +0 -21
  211. package/dist/solver/index.js.map +0 -1
  212. package/dist/solver/types.d.ts +0 -115
  213. package/dist/solver/types.d.ts.map +0 -1
  214. package/dist/solver/types.js +0 -10
  215. package/dist/solver/types.js.map +0 -1
  216. package/dist/swap/router/cache.d.ts +0 -13
  217. package/dist/swap/router/cache.d.ts.map +0 -1
  218. package/dist/swap/router/cache.js +0 -30
  219. package/dist/swap/router/cache.js.map +0 -1
  220. package/dist/swap/router/flashbots.d.ts +0 -10
  221. package/dist/swap/router/flashbots.d.ts.map +0 -1
  222. package/dist/swap/router/flashbots.js +0 -43
  223. package/dist/swap/router/flashbots.js.map +0 -1
  224. package/dist/swap/router/health.d.ts +0 -17
  225. package/dist/swap/router/health.d.ts.map +0 -1
  226. package/dist/swap/router/health.js +0 -38
  227. package/dist/swap/router/health.js.map +0 -1
  228. package/dist/swap/router/index.d.ts +0 -10
  229. package/dist/swap/router/index.d.ts.map +0 -1
  230. package/dist/swap/router/index.js +0 -10
  231. package/dist/swap/router/index.js.map +0 -1
  232. package/dist/swap/router/providers/cowswap.d.ts +0 -11
  233. package/dist/swap/router/providers/cowswap.d.ts.map +0 -1
  234. package/dist/swap/router/providers/cowswap.js +0 -79
  235. package/dist/swap/router/providers/cowswap.js.map +0 -1
  236. package/dist/swap/router/providers/index.d.ts +0 -20
  237. package/dist/swap/router/providers/index.d.ts.map +0 -1
  238. package/dist/swap/router/providers/index.js +0 -32
  239. package/dist/swap/router/providers/index.js.map +0 -1
  240. package/dist/swap/router/providers/jupiter.d.ts +0 -12
  241. package/dist/swap/router/providers/jupiter.d.ts.map +0 -1
  242. package/dist/swap/router/providers/jupiter.js +0 -73
  243. package/dist/swap/router/providers/jupiter.js.map +0 -1
  244. package/dist/swap/router/providers/lifi.d.ts +0 -11
  245. package/dist/swap/router/providers/lifi.d.ts.map +0 -1
  246. package/dist/swap/router/providers/lifi.js +0 -123
  247. package/dist/swap/router/providers/lifi.js.map +0 -1
  248. package/dist/swap/router/providers/oneinch.d.ts +0 -13
  249. package/dist/swap/router/providers/oneinch.d.ts.map +0 -1
  250. package/dist/swap/router/providers/oneinch.js +0 -71
  251. package/dist/swap/router/providers/oneinch.js.map +0 -1
  252. package/dist/swap/router/providers/paraswap.d.ts +0 -11
  253. package/dist/swap/router/providers/paraswap.d.ts.map +0 -1
  254. package/dist/swap/router/providers/paraswap.js +0 -73
  255. package/dist/swap/router/providers/paraswap.js.map +0 -1
  256. package/dist/swap/router/providers/uniswap.d.ts +0 -31
  257. package/dist/swap/router/providers/uniswap.d.ts.map +0 -1
  258. package/dist/swap/router/providers/uniswap.js +0 -116
  259. package/dist/swap/router/providers/uniswap.js.map +0 -1
  260. package/dist/swap/router/providers/zerox.d.ts +0 -13
  261. package/dist/swap/router/providers/zerox.d.ts.map +0 -1
  262. package/dist/swap/router/providers/zerox.js +0 -94
  263. package/dist/swap/router/providers/zerox.js.map +0 -1
  264. package/dist/swap/router/router.d.ts +0 -86
  265. package/dist/swap/router/router.d.ts.map +0 -1
  266. package/dist/swap/router/router.js +0 -224
  267. package/dist/swap/router/router.js.map +0 -1
  268. package/dist/swap/router/rsi/engine.d.ts +0 -60
  269. package/dist/swap/router/rsi/engine.d.ts.map +0 -1
  270. package/dist/swap/router/rsi/engine.js +0 -483
  271. package/dist/swap/router/rsi/engine.js.map +0 -1
  272. package/dist/swap/router/rsi/index.d.ts +0 -3
  273. package/dist/swap/router/rsi/index.d.ts.map +0 -1
  274. package/dist/swap/router/rsi/index.js +0 -3
  275. package/dist/swap/router/rsi/index.js.map +0 -1
  276. package/dist/swap/router/rsi/types.d.ts +0 -106
  277. package/dist/swap/router/rsi/types.d.ts.map +0 -1
  278. package/dist/swap/router/rsi/types.js +0 -3
  279. package/dist/swap/router/rsi/types.js.map +0 -1
  280. package/dist/swap/router/types.d.ts +0 -120
  281. package/dist/swap/router/types.d.ts.map +0 -1
  282. package/dist/swap/router/types.js +0 -16
  283. package/dist/swap/router/types.js.map +0 -1
  284. package/dist/tax/engine.d.ts +0 -131
  285. package/dist/tax/engine.d.ts.map +0 -1
  286. package/dist/tax/engine.js +0 -307
  287. package/dist/tax/engine.js.map +0 -1
  288. package/dist/tax/index.d.ts +0 -9
  289. package/dist/tax/index.d.ts.map +0 -1
  290. package/dist/tax/index.js +0 -8
  291. package/dist/tax/index.js.map +0 -1
  292. package/dist/tax/lots.d.ts +0 -60
  293. package/dist/tax/lots.d.ts.map +0 -1
  294. package/dist/tax/lots.js +0 -129
  295. package/dist/tax/lots.js.map +0 -1
  296. package/dist/tax/types.d.ts +0 -113
  297. package/dist/tax/types.d.ts.map +0 -1
  298. package/dist/tax/types.js +0 -18
  299. package/dist/tax/types.js.map +0 -1
  300. package/dist/yield/index.d.ts +0 -26
  301. package/dist/yield/index.d.ts.map +0 -1
  302. package/dist/yield/index.js +0 -25
  303. package/dist/yield/index.js.map +0 -1
  304. package/dist/yield/rates.d.ts +0 -114
  305. package/dist/yield/rates.d.ts.map +0 -1
  306. package/dist/yield/rates.js +0 -351
  307. package/dist/yield/rates.js.map +0 -1
  308. package/dist/yield/types.d.ts +0 -134
  309. package/dist/yield/types.d.ts.map +0 -1
  310. package/dist/yield/types.js +0 -24
  311. package/dist/yield/types.js.map +0 -1
  312. package/dist/yield/vault.d.ts +0 -112
  313. package/dist/yield/vault.d.ts.map +0 -1
  314. package/dist/yield/vault.js +0 -264
  315. package/dist/yield/vault.js.map +0 -1
package/dist/ap2/index.js DELETED
@@ -1,255 +0,0 @@
1
- /**
2
- * AP2Client — ISO 20022 / AP2 European Payment Module for agentwallet-sdk
3
- *
4
- * Non-custodial AI agent bridge for AP2 payments:
5
- * - Parse ISO 20022 pacs.008 XML → bridge quote
6
- * - Sign x402 payment header locally (private key never leaves agent)
7
- * - Execute USDC → EUR settlement via CCTP V2 (Base → EUR off-ramp)
8
- *
9
- * AP2 context:
10
- * Nexi + Google Cloud MoU (2026): AP2 processes ~2.9T EUR/year across Europe.
11
- * ISO 20022 is the wire standard. This module makes AI agents first-class
12
- * European payment participants — non-custodially.
13
- *
14
- * @module ap2
15
- */
16
- // ---------------------------------------------------------------------------
17
- // Constants
18
- // ---------------------------------------------------------------------------
19
- /** USDC decimals (6) */
20
- const USDC_DECIMALS = 6n;
21
- const USDC_MULTIPLIER = 10n ** USDC_DECIMALS;
22
- /** EUR → USDC rate (fallback; production uses Chainlink oracle) */
23
- const EUR_TO_USDC_RATE = 1.08;
24
- /** Default facilitator URL */
25
- const DEFAULT_FACILITATOR_URL = 'http://localhost:8420';
26
- /** Estimated CCTP V2 settlement time (~20 min) */
27
- const ESTIMATED_SETTLEMENT_SECONDS = 1200;
28
- // ---------------------------------------------------------------------------
29
- // ISO 20022 pacs.008 XML Builder
30
- // ---------------------------------------------------------------------------
31
- /**
32
- * Build a valid ISO 20022 pacs.008 (FIToFICstmrCdtTrf) XML string
33
- * from simple agent-friendly parameters.
34
- *
35
- * @param params - Payment parameters
36
- * @returns ISO 20022 pacs.008 XML string
37
- */
38
- function buildPacs008(params) {
39
- const now = params.creationDateTime ?? new Date().toISOString().replace(/\.\d+Z$/, '+00:00');
40
- const currency = params.currency ?? 'EUR';
41
- const e2eId = params.endToEndId ?? params.messageId;
42
- const amount = params.amount.toFixed(2);
43
- return `<?xml version="1.0" encoding="UTF-8"?>
44
- <Document xmlns="urn:iso:std:iso:20022:tech:xsd:pacs.008.001.08">
45
- <FIToFICstmrCdtTrf>
46
- <GrpHdr>
47
- <MsgId>${escapeXml(params.messageId)}</MsgId>
48
- <CreDtTm>${escapeXml(now)}</CreDtTm>
49
- <NbOfTxs>1</NbOfTxs>
50
- <SttlmInf>
51
- <SttlmMtd>CLRG</SttlmMtd>
52
- </SttlmInf>
53
- </GrpHdr>
54
- <CdtTrfTxInf>
55
- <PmtId>
56
- <EndToEndId>${escapeXml(e2eId)}</EndToEndId>
57
- </PmtId>
58
- <IntrBkSttlmAmt Ccy="${escapeXml(currency)}">${amount}</IntrBkSttlmAmt>
59
- <ChrgBr>SHAR</ChrgBr>
60
- <Dbtr>
61
- <Nm>${escapeXml(params.debtorName)}</Nm>
62
- </Dbtr>
63
- <DbtrAcct>
64
- <Id>
65
- <IBAN>${escapeXml(params.debtorIban.replace(/\s/g, '').toUpperCase())}</IBAN>
66
- </Id>
67
- </DbtrAcct>
68
- <DbtrAgt>
69
- <FinInstnId>
70
- <BICFI>${escapeXml(params.debtorBic.toUpperCase())}</BICFI>
71
- </FinInstnId>
72
- </DbtrAgt>
73
- <Cdtr>
74
- <Nm>${escapeXml(params.creditorName)}</Nm>
75
- </Cdtr>
76
- <CdtrAcct>
77
- <Id>
78
- <IBAN>${escapeXml(params.creditorIban.replace(/\s/g, '').toUpperCase())}</IBAN>
79
- </Id>
80
- </CdtrAcct>
81
- <CdtrAgt>
82
- <FinInstnId>
83
- <BICFI>${escapeXml(params.creditorBic.toUpperCase())}</BICFI>
84
- </FinInstnId>
85
- </CdtrAgt>${params.purposeCode ? `
86
- <Purp>
87
- <Cd>${escapeXml(params.purposeCode)}</Cd>
88
- </Purp>` : ''}${params.remittanceInfo ? `
89
- <RmtInf>
90
- <Ustrd>${escapeXml(params.remittanceInfo)}</Ustrd>
91
- </RmtInf>` : ''}
92
- </CdtTrfTxInf>
93
- </FIToFICstmrCdtTrf>
94
- </Document>`;
95
- }
96
- /** Escape XML special characters. */
97
- function escapeXml(str) {
98
- return str
99
- .replace(/&/g, '&amp;')
100
- .replace(/</g, '&lt;')
101
- .replace(/>/g, '&gt;')
102
- .replace(/"/g, '&quot;')
103
- .replace(/'/g, '&apos;');
104
- }
105
- /** Convert a decimal USDC string to bigint μUSDC. */
106
- function usdcToBigInt(usdcStr) {
107
- const [whole, frac = ''] = usdcStr.split('.');
108
- const fracPadded = frac.padEnd(Number(USDC_DECIMALS), '0').slice(0, Number(USDC_DECIMALS));
109
- return BigInt(whole) * USDC_MULTIPLIER + BigInt(fracPadded);
110
- }
111
- // ---------------------------------------------------------------------------
112
- // AP2Client
113
- // ---------------------------------------------------------------------------
114
- /**
115
- * AP2Client — Non-custodial ISO 20022 / AP2 payment client for AI agents.
116
- *
117
- * Connects to the AP2 facilitator (ap2_handler.py FastAPI service) to
118
- * get bridge quotes and execute payments via CCTP V2 / x402.
119
- *
120
- * @example
121
- * ```typescript
122
- * const client = new AP2Client({ facilitatorUrl: 'http://localhost:8420' });
123
- *
124
- * const xml = AP2Client.buildPacs008({
125
- * messageId: 'MSG-2026-0001',
126
- * amount: 1000,
127
- * debtorName: 'Agent Zero',
128
- * debtorIban: 'DE89370400440532013000',
129
- * debtorBic: 'COBADEFFXXX',
130
- * creditorName: 'Acme GmbH',
131
- * creditorIban: 'FR7630006000011234567890189',
132
- * creditorBic: 'BNPAFRPPXXX',
133
- * });
134
- *
135
- * const quote = await client.quote(xml);
136
- * const receipt = await client.pay(xml);
137
- * ```
138
- */
139
- export class AP2Client {
140
- constructor(config = {}) {
141
- this.facilitatorUrl = (config.facilitatorUrl ?? DEFAULT_FACILITATOR_URL).replace(/\/$/, '');
142
- }
143
- /**
144
- * Parse ISO 20022 pacs.008 XML and get a bridge quote from the facilitator.
145
- *
146
- * @param iso20022Xml - Raw pacs.008 XML string
147
- * @returns AP2Quote with USDC amounts and x402 calldata
148
- * @throws Error if the facilitator returns an error or the XML is invalid
149
- */
150
- async quote(iso20022Xml) {
151
- const response = await fetch(`${this.facilitatorUrl}/ap2/payment`, {
152
- method: 'POST',
153
- headers: { 'Content-Type': 'application/xml' },
154
- body: iso20022Xml,
155
- });
156
- if (!response.ok) {
157
- const body = await response.text();
158
- throw new AP2Error(`Quote failed (${response.status}): ${body}`);
159
- }
160
- const json = (await response.json());
161
- const bq = json.bridge_quote;
162
- const payment = json.payment;
163
- return {
164
- messageId: payment.message_id,
165
- creditorIban: payment.creditor.iban,
166
- amountEur: parseFloat(payment.amount),
167
- usdcRequired: usdcToBigInt(bq.usdc_amount),
168
- bridgeFeeUsdc: usdcToBigInt(bq.bridge_fee_usdc),
169
- estimatedSettlementSeconds: ESTIMATED_SETTLEMENT_SECONDS,
170
- x402PaymentHeader: bq.x402_payment_header,
171
- agentWalletCalldata: bq.agent_wallet_calldata,
172
- expiresAt: bq.expires_at,
173
- };
174
- }
175
- /**
176
- * Execute the full AP2 payment: sign x402 header + bridge USDC + settle.
177
- *
178
- * Calls the /ap2/execute endpoint on the facilitator, which:
179
- * 1. Parses the XML
180
- * 2. Signs x402 header with agent's private key (server-side in this flow)
181
- * 3. Submits USDC to CCTP V2 bridge
182
- * 4. Returns receipt
183
- *
184
- * @param iso20022Xml - Raw pacs.008 XML string
185
- * @returns AP2Receipt with txHash and SEPA reference
186
- * @throws AP2Error on execution failure
187
- */
188
- async pay(iso20022Xml) {
189
- const response = await fetch(`${this.facilitatorUrl}/ap2/execute`, {
190
- method: 'POST',
191
- headers: { 'Content-Type': 'application/xml' },
192
- body: iso20022Xml,
193
- });
194
- if (!response.ok) {
195
- const body = await response.text();
196
- throw new AP2Error(`Execution failed (${response.status}): ${body}`);
197
- }
198
- const json = (await response.json());
199
- const r = json.receipt;
200
- return {
201
- messageId: r.message_id,
202
- txHash: r.tx_hash,
203
- usdcBridged: usdcToBigInt(r.usdc_bridged),
204
- sepaReference: r.sepa_reference,
205
- status: r.status,
206
- dryRun: r.dry_run,
207
- x402Signature: r.x402_signature,
208
- agentAddress: r.agent_address,
209
- nonce: r.nonce,
210
- executedAt: r.executed_at,
211
- creditorIban: r.creditor_iban,
212
- bridgeFeeUsdc: usdcToBigInt(r.bridge_fee_usdc),
213
- };
214
- }
215
- /**
216
- * Generate a valid ISO 20022 pacs.008 XML string from simple parameters.
217
- *
218
- * Handles XML escaping, IBAN normalization, and timestamp formatting.
219
- * Makes AP2 payments agent-friendly — no ISO 20022 expertise required.
220
- *
221
- * @param params - Simple payment parameters
222
- * @returns Valid pacs.008 XML string
223
- */
224
- static buildPacs008(params) {
225
- return buildPacs008(params);
226
- }
227
- /**
228
- * Estimate USDC required for a given EUR amount.
229
- *
230
- * Uses the default EUR/USDC rate. For accurate quotes, call quote() instead.
231
- *
232
- * @param amountEur - Amount in EUR
233
- * @returns Estimated USDC amount as bigint (μUSDC, 6 decimals)
234
- */
235
- static estimateUsdc(amountEur) {
236
- const usdc = amountEur * EUR_TO_USDC_RATE;
237
- return BigInt(Math.round(usdc * Number(USDC_MULTIPLIER)));
238
- }
239
- }
240
- // ---------------------------------------------------------------------------
241
- // Error class
242
- // ---------------------------------------------------------------------------
243
- /** AP2-specific error with structured context. */
244
- export class AP2Error extends Error {
245
- constructor(message, context) {
246
- super(message);
247
- this.context = context;
248
- this.name = 'AP2Error';
249
- }
250
- }
251
- // ---------------------------------------------------------------------------
252
- // Re-export builder as standalone function
253
- // ---------------------------------------------------------------------------
254
- export { buildPacs008 };
255
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ap2/index.ts"],"names":[],"mappings":"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"}
@@ -1,101 +0,0 @@
1
- import type { WalletClient } from 'viem';
2
- import type { Keypair } from '@solana/web3.js';
3
- import { BridgeError } from './client.js';
4
- import type { BridgeChain, BridgeResult } from './types.js';
5
- import { type CCTPSupportedChain, type BridgeQuote, CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, BRIDGE_RPC_URLS, calcBridgeFee } from './types.js';
6
- import { SolanaBridgeError } from '../solana/bridge.js';
7
- export interface UnifiedBridgeConfig {
8
- /** EVM wallet client (required for any EVM source chain) */
9
- evmSigner?: WalletClient;
10
- /** Solana keypair (required when Solana is source) */
11
- solanaWallet?: Keypair;
12
- /** Solana RPC URL (default: mainnet-beta public) */
13
- solanaRpcUrl?: string;
14
- /** Override EVM RPC URLs per chain */
15
- evmRpcOverrides?: Partial<Record<BridgeChain, string>>;
16
- /** Circle attestation API override */
17
- attestationApiUrl?: string;
18
- /** Platform fee wallet address (future: fee collection) */
19
- feeWallet?: string;
20
- }
21
- export interface UnifiedBridgeParams {
22
- /** USDC amount in base units (6 decimals). 1 USDC = 1_000_000 */
23
- amount: bigint;
24
- /** Source chain */
25
- sourceChain: CCTPSupportedChain;
26
- /** Destination chain */
27
- destinationChain: CCTPSupportedChain;
28
- /** Recipient address (hex for EVM, base58 for Solana destination) */
29
- destinationAddress: string;
30
- /** Finality: 0 = fast (~20s), 1000 = finalized (~15min) */
31
- minFinalityThreshold?: number;
32
- /** Apply 0.1% platform fee (default: true) */
33
- applyPlatformFee?: boolean;
34
- /** Override destination RPC URL */
35
- destinationRpcUrl?: string;
36
- }
37
- export type { BridgeResult, BridgeQuote, CCTPSupportedChain };
38
- /**
39
- * UnifiedBridge — Cross-chain USDC bridge across all 17 CCTP V2 supported chains.
40
- *
41
- * Routing:
42
- * - EVM → EVM: BridgeModule (approve → burn → attest → mint)
43
- * - EVM → Solana: BridgeModule burn + SolanaCCTPBridge receive
44
- * - Solana → EVM: SolanaCCTPBridge burn + EVM receiveMessage
45
- * - Solana → Solana: throws (use native Solana transfer instead)
46
- *
47
- * @example
48
- * ```ts
49
- * import { UnifiedBridge } from 'agentwallet-sdk';
50
- * import { createWalletClient } from 'viem';
51
- *
52
- * const bridge = new UnifiedBridge({ evmSigner });
53
- *
54
- * // Bridge 1 USDC from Base to Polygon
55
- * const result = await bridge.bridge({
56
- * amount: 1_000_000n,
57
- * sourceChain: 'base',
58
- * destinationChain: 'polygon',
59
- * destinationAddress: '0x...',
60
- * });
61
- * console.log(bridge.getSupportedChains()); // 17 chains!
62
- * ```
63
- */
64
- export declare class UnifiedBridge {
65
- private readonly config;
66
- private readonly solanaConnection;
67
- constructor(config?: UnifiedBridgeConfig);
68
- /**
69
- * Bridge USDC between any two CCTP V2 supported chains.
70
- * Routes automatically based on source/destination chain types.
71
- */
72
- bridge(params: UnifiedBridgeParams): Promise<BridgeResult>;
73
- /**
74
- * Get all supported chains (16 EVM + Solana = 17 total).
75
- */
76
- getSupportedChains(): CCTPSupportedChain[];
77
- /**
78
- * Get a bridge quote: fee breakdown + estimated time.
79
- */
80
- getQuote(params: {
81
- amount: bigint;
82
- sourceChain: CCTPSupportedChain;
83
- destinationChain: CCTPSupportedChain;
84
- }): BridgeQuote;
85
- /**
86
- * Check if a route is supported.
87
- */
88
- isRouteSupported(source: CCTPSupportedChain, destination: CCTPSupportedChain): boolean;
89
- private bridgeEvmToEvm;
90
- private bridgeSolanaToEvm;
91
- private bridgeEvmToSolana;
92
- private validateParams;
93
- /**
94
- * Convert a Solana base58 address to a 32-byte hex string for EVM mintRecipient.
95
- * Per Circle docs: hex-encoded USDC token account address.
96
- */
97
- private solanaAddressToHex;
98
- }
99
- export { BridgeError, SolanaBridgeError };
100
- export { CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, BRIDGE_RPC_URLS, calcBridgeFee, };
101
- //# sourceMappingURL=unified.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../../src/bridge/unified.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAgB,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EAEf,aAAa,EAGd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAoB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI1E,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,WAAW,EAAE,kBAAkB,CAAC;IAChC,wBAAwB;IACxB,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;gBAElC,MAAM,GAAE,mBAAwB;IAU5C;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DhE;;OAEG;IACH,kBAAkB,IAAI,kBAAkB,EAAE;IAI1C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE;QACf,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,kBAAkB,CAAC;QAChC,gBAAgB,EAAE,kBAAkB,CAAC;KACtC,GAAG,WAAW;IAuBf;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,GAAG,OAAO;YAQxE,cAAc;YAmCd,iBAAiB;YA4EjB,iBAAiB;IAoF/B,OAAO,CAAC,cAAc;IAsCtB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAkB3B;AAID,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,CAAC"}
@@ -1,284 +0,0 @@
1
- // [MAX-ADDED] UnifiedBridge — Single interface for CCTP V2 transfers across all 17 chains
2
- // Routes EVM↔EVM, EVM→Solana, and Solana→EVM via BridgeModule + SolanaCCTPBridge.
3
- //
4
- // Supported: 16 EVM chains + Solana (17 total)
5
- // Fee: 0.1% platform fee on bridged amount
6
- //
7
- // Usage:
8
- // const bridge = new UnifiedBridge({ evmSigner: walletClient, solanaWallet: keypair });
9
- // await bridge.bridge({ amount: 1_000_000n, sourceChain: 'base', destinationChain: 'polygon', destinationAddress: '0x...' });
10
- import { Connection } from '@solana/web3.js';
11
- import { BridgeModule, BridgeError } from './client.js';
12
- import { CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, BRIDGE_RPC_URLS, calcBridgeFee, getEstimatedBridgeSeconds, FAST_TRANSFER_CHAINS, } from './types.js';
13
- import { SolanaCCTPBridge, SolanaBridgeError } from '../solana/bridge.js';
14
- // ─── UnifiedBridge ───
15
- /**
16
- * UnifiedBridge — Cross-chain USDC bridge across all 17 CCTP V2 supported chains.
17
- *
18
- * Routing:
19
- * - EVM → EVM: BridgeModule (approve → burn → attest → mint)
20
- * - EVM → Solana: BridgeModule burn + SolanaCCTPBridge receive
21
- * - Solana → EVM: SolanaCCTPBridge burn + EVM receiveMessage
22
- * - Solana → Solana: throws (use native Solana transfer instead)
23
- *
24
- * @example
25
- * ```ts
26
- * import { UnifiedBridge } from 'agentwallet-sdk';
27
- * import { createWalletClient } from 'viem';
28
- *
29
- * const bridge = new UnifiedBridge({ evmSigner });
30
- *
31
- * // Bridge 1 USDC from Base to Polygon
32
- * const result = await bridge.bridge({
33
- * amount: 1_000_000n,
34
- * sourceChain: 'base',
35
- * destinationChain: 'polygon',
36
- * destinationAddress: '0x...',
37
- * });
38
- * console.log(bridge.getSupportedChains()); // 17 chains!
39
- * ```
40
- */
41
- export class UnifiedBridge {
42
- constructor(config = {}) {
43
- this.config = config;
44
- this.solanaConnection = new Connection(config.solanaRpcUrl ?? 'https://api.mainnet-beta.solana.com', 'confirmed');
45
- }
46
- // ─── Public API ───
47
- /**
48
- * Bridge USDC between any two CCTP V2 supported chains.
49
- * Routes automatically based on source/destination chain types.
50
- */
51
- async bridge(params) {
52
- const { amount, sourceChain, destinationChain, destinationAddress, minFinalityThreshold = 0, applyPlatformFee = true, destinationRpcUrl, } = params;
53
- // Validate before routing (catches unsupported chains, zero amount)
54
- // Check Solana→Solana before generic same-chain to give the right error code
55
- const isSolanaSource = sourceChain === 'solana';
56
- const isSolanaDestination = destinationChain === 'solana';
57
- if (isSolanaSource && isSolanaDestination) {
58
- throw new BridgeError('UNSUPPORTED_ROUTE', 'Solana → Solana bridging is not supported. Use native Solana transfers instead.');
59
- }
60
- this.validateParams(amount, sourceChain, destinationChain);
61
- if (!isSolanaSource && !isSolanaDestination) {
62
- // EVM → EVM
63
- return this.bridgeEvmToEvm({
64
- amount,
65
- sourceChain: sourceChain,
66
- destinationChain: destinationChain,
67
- destinationAddress,
68
- minFinalityThreshold,
69
- applyPlatformFee,
70
- destinationRpcUrl,
71
- });
72
- }
73
- if (isSolanaSource && !isSolanaDestination) {
74
- // Solana → EVM
75
- return this.bridgeSolanaToEvm({
76
- amount,
77
- destinationChain: destinationChain,
78
- destinationAddress,
79
- minFinalityThreshold,
80
- applyPlatformFee,
81
- });
82
- }
83
- // EVM → Solana
84
- return this.bridgeEvmToSolana({
85
- amount,
86
- sourceChain: sourceChain,
87
- destinationAddress,
88
- minFinalityThreshold,
89
- applyPlatformFee,
90
- destinationRpcUrl,
91
- });
92
- }
93
- /**
94
- * Get all supported chains (16 EVM + Solana = 17 total).
95
- */
96
- getSupportedChains() {
97
- return Object.keys(CCTP_DOMAIN_IDS);
98
- }
99
- /**
100
- * Get a bridge quote: fee breakdown + estimated time.
101
- */
102
- getQuote(params) {
103
- const { amount, sourceChain, destinationChain } = params;
104
- if (amount <= 0n) {
105
- throw new BridgeError('INVALID_AMOUNT', 'Quote amount must be > 0');
106
- }
107
- const platformFee = calcBridgeFee(amount);
108
- const outputAmount = amount - platformFee;
109
- const estimatedTimeSeconds = getEstimatedBridgeSeconds(sourceChain);
110
- const fastTransferAvailable = FAST_TRANSFER_CHAINS.has(sourceChain);
111
- return {
112
- inputAmount: amount,
113
- platformFee,
114
- outputAmount,
115
- fromChain: sourceChain,
116
- toChain: destinationChain,
117
- estimatedTimeSeconds,
118
- fastTransferAvailable,
119
- };
120
- }
121
- /**
122
- * Check if a route is supported.
123
- */
124
- isRouteSupported(source, destination) {
125
- if (source === destination)
126
- return false;
127
- if (source === 'solana' && destination === 'solana')
128
- return false;
129
- return source in CCTP_DOMAIN_IDS && destination in CCTP_DOMAIN_IDS;
130
- }
131
- // ─── Internal Routing ───
132
- async bridgeEvmToEvm(params) {
133
- const { sourceChain, destinationChain } = params;
134
- if (!this.config.evmSigner) {
135
- throw new BridgeError('NO_WALLET_CLIENT', `EVM wallet client required for EVM→EVM bridge (${sourceChain} → ${destinationChain}). ` +
136
- `Pass evmSigner to UnifiedBridge constructor.`);
137
- }
138
- const rpcOverride = this.config.evmRpcOverrides?.[sourceChain];
139
- const bridge = new BridgeModule(this.config.evmSigner, sourceChain, { rpcUrl: rpcOverride });
140
- return bridge.bridge(params.amount, destinationChain, {
141
- destinationAddress: params.destinationAddress,
142
- minFinalityThreshold: params.minFinalityThreshold,
143
- applyPlatformFee: params.applyPlatformFee,
144
- destinationRpcUrl: params.destinationRpcUrl ?? this.config.evmRpcOverrides?.[destinationChain],
145
- attestationApiUrl: this.config.attestationApiUrl,
146
- });
147
- }
148
- async bridgeSolanaToEvm(params) {
149
- const startMs = Date.now();
150
- if (!this.config.solanaWallet) {
151
- throw new SolanaBridgeError('NO_SOLANA_WALLET', 'Solana keypair required for Solana→EVM bridge. ' +
152
- 'Pass solanaWallet to UnifiedBridge constructor.');
153
- }
154
- if (!this.config.evmSigner) {
155
- throw new BridgeError('NO_WALLET_CLIENT', 'EVM wallet client required to receive on destination EVM chain. ' +
156
- 'Pass evmSigner to UnifiedBridge constructor.');
157
- }
158
- const applyFee = params.applyPlatformFee !== false;
159
- const platformFee = applyFee ? calcBridgeFee(params.amount) : 0n;
160
- const bridgeAmount = params.amount - platformFee;
161
- // Phase 1: Burn on Solana
162
- const solanaBridge = new SolanaCCTPBridge({
163
- connection: this.solanaConnection,
164
- payer: this.config.solanaWallet,
165
- });
166
- const burnResult = await solanaBridge.depositForBurn({
167
- amount: bridgeAmount,
168
- destinationChain: params.destinationChain,
169
- destinationAddress: params.destinationAddress,
170
- minFinalityThreshold: params.minFinalityThreshold,
171
- });
172
- // Phase 2: Poll attestation (Solana uses same IRIS API)
173
- const attestation = await solanaBridge.waitForAttestation(burnResult.messageHash, this.config.attestationApiUrl);
174
- // Phase 3: Mint on EVM destination
175
- const rpcOverride = this.config.evmRpcOverrides?.[params.destinationChain];
176
- const evmBridge = new BridgeModule(this.config.evmSigner, params.destinationChain, // use dest as source for the receive-only operation
177
- { rpcUrl: rpcOverride });
178
- const evmMintTxHash = await evmBridge.mint(burnResult.messageBytes, attestation, params.destinationChain, rpcOverride);
179
- return {
180
- burnTxHash: burnResult.signature,
181
- mintTxHash: evmMintTxHash,
182
- amount: bridgeAmount,
183
- platformFee,
184
- fromChain: 'solana',
185
- toChain: params.destinationChain,
186
- recipient: params.destinationAddress,
187
- nonce: burnResult.nonce,
188
- elapsedMs: Date.now() - startMs,
189
- };
190
- }
191
- async bridgeEvmToSolana(params) {
192
- const startMs = Date.now();
193
- if (!this.config.evmSigner) {
194
- throw new BridgeError('NO_WALLET_CLIENT', `EVM wallet client required for ${params.sourceChain}→Solana bridge.`);
195
- }
196
- if (!this.config.solanaWallet) {
197
- throw new SolanaBridgeError('NO_SOLANA_WALLET', 'Solana keypair required to receive USDC on Solana. ' +
198
- 'Pass solanaWallet to UnifiedBridge constructor.');
199
- }
200
- const applyFee = params.applyPlatformFee !== false;
201
- const platformFee = applyFee ? calcBridgeFee(params.amount) : 0n;
202
- const bridgeAmount = params.amount - platformFee;
203
- // Solana destination: mintRecipient must be hex of USDC ATA on Solana
204
- // The caller passes a base58 Solana address; we convert to hex for EVM depositForBurn
205
- const solanaAddressHex = this.solanaAddressToHex(params.destinationAddress);
206
- // Phase 1: Burn on EVM (using CCTP domain 5 for Solana)
207
- const rpcOverride = this.config.evmRpcOverrides?.[params.sourceChain];
208
- const evmBridge = new BridgeModule(this.config.evmSigner, params.sourceChain, { rpcUrl: rpcOverride });
209
- const burnResult = await evmBridge.burn(bridgeAmount, 'solana', {
210
- destinationAddress: solanaAddressHex,
211
- minFinalityThreshold: params.minFinalityThreshold,
212
- applyPlatformFee: false, // already deducted
213
- attestationApiUrl: this.config.attestationApiUrl,
214
- });
215
- // Phase 2: Attestation
216
- const attestation = await evmBridge.waitForAttestation(burnResult.messageHash, this.config.attestationApiUrl);
217
- // Phase 3: Receive on Solana
218
- const solanaBridge = new SolanaCCTPBridge({
219
- connection: this.solanaConnection,
220
- payer: this.config.solanaWallet,
221
- });
222
- // Ensure recipient USDC ATA exists
223
- const recipientUsdcAta = await solanaBridge.ensureUsdcAta();
224
- const solanaMintSig = await solanaBridge.receiveMessage({
225
- message: burnResult.messageBytes,
226
- attestation,
227
- recipientUsdcAccount: recipientUsdcAta.toString(),
228
- });
229
- return {
230
- burnTxHash: burnResult.burnTxHash,
231
- mintTxHash: solanaMintSig,
232
- amount: bridgeAmount,
233
- platformFee,
234
- fromChain: params.sourceChain,
235
- toChain: 'solana',
236
- recipient: params.destinationAddress,
237
- nonce: burnResult.nonce,
238
- elapsedMs: Date.now() - startMs,
239
- };
240
- }
241
- // ─── Validation ───
242
- validateParams(amount, sourceChain, destinationChain) {
243
- if (amount <= 0n) {
244
- throw new BridgeError('INVALID_AMOUNT', `Amount must be > 0. Got ${amount}. Use USDC base units (1 USDC = 1_000_000).`);
245
- }
246
- if (!(sourceChain in CCTP_DOMAIN_IDS)) {
247
- throw new BridgeError('UNSUPPORTED_CHAIN', `Source chain '${sourceChain}' is not supported. ` +
248
- `Supported: ${Object.keys(CCTP_DOMAIN_IDS).join(', ')}`);
249
- }
250
- if (!(destinationChain in CCTP_DOMAIN_IDS)) {
251
- throw new BridgeError('UNSUPPORTED_CHAIN', `Destination chain '${destinationChain}' is not supported. ` +
252
- `Supported: ${Object.keys(CCTP_DOMAIN_IDS).join(', ')}`);
253
- }
254
- if (sourceChain === destinationChain) {
255
- throw new BridgeError('SAME_CHAIN', `Source and destination must differ. Both set to '${sourceChain}'.`);
256
- }
257
- }
258
- // ─── Helpers ───
259
- /**
260
- * Convert a Solana base58 address to a 32-byte hex string for EVM mintRecipient.
261
- * Per Circle docs: hex-encoded USDC token account address.
262
- */
263
- solanaAddressToHex(base58Address) {
264
- // bs58 decode → hex encode
265
- // Import dynamically to avoid requiring bs58 for EVM-only users
266
- try {
267
- // eslint-disable-next-line @typescript-eslint/no-require-imports
268
- const bs58 = require('bs58');
269
- const decoded = bs58.decode(base58Address);
270
- return '0x' + Buffer.from(decoded).toString('hex').padStart(64, '0');
271
- }
272
- catch {
273
- // If bs58 not available, assume it's already hex
274
- if (base58Address.startsWith('0x'))
275
- return base58Address;
276
- throw new BridgeError('UNSUPPORTED_CHAIN', `Could not convert Solana address to hex: ${base58Address}. ` +
277
- `Pass the USDC ATA address (base58) for Solana destination.`);
278
- }
279
- }
280
- }
281
- // ─── Re-exports ───
282
- export { BridgeError, SolanaBridgeError };
283
- export { CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, BRIDGE_RPC_URLS, calcBridgeFee, };
284
- //# sourceMappingURL=unified.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unified.js","sourceRoot":"","sources":["../../src/bridge/unified.ts"],"names":[],"mappings":"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"}