agentwallet-sdk 5.0.5 → 5.1.1

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 (271) hide show
  1. package/README.md +65 -30
  2. package/dist/ap2/index.d.ts +185 -0
  3. package/dist/ap2/index.d.ts.map +1 -0
  4. package/dist/ap2/index.js +255 -0
  5. package/dist/ap2/index.js.map +1 -0
  6. package/dist/bridge/unified.d.ts +101 -0
  7. package/dist/bridge/unified.d.ts.map +1 -0
  8. package/dist/bridge/unified.js +284 -0
  9. package/dist/bridge/unified.js.map +1 -0
  10. package/dist/chains.d.ts +62 -0
  11. package/dist/chains.d.ts.map +1 -0
  12. package/dist/chains.js +108 -0
  13. package/dist/chains.js.map +1 -0
  14. package/dist/fiat/index.d.ts +10 -0
  15. package/dist/fiat/index.d.ts.map +1 -0
  16. package/dist/fiat/index.js +9 -0
  17. package/dist/fiat/index.js.map +1 -0
  18. package/dist/fiat/onramp.d.ts +101 -0
  19. package/dist/fiat/onramp.d.ts.map +1 -0
  20. package/dist/fiat/onramp.js +155 -0
  21. package/dist/fiat/onramp.js.map +1 -0
  22. package/dist/fiat/providers/index.d.ts +16 -0
  23. package/dist/fiat/providers/index.d.ts.map +1 -0
  24. package/dist/fiat/providers/index.js +30 -0
  25. package/dist/fiat/providers/index.js.map +1 -0
  26. package/dist/fiat/providers/moonpay.d.ts +22 -0
  27. package/dist/fiat/providers/moonpay.d.ts.map +1 -0
  28. package/dist/fiat/providers/moonpay.js +107 -0
  29. package/dist/fiat/providers/moonpay.js.map +1 -0
  30. package/dist/fiat/providers/stripe.d.ts +26 -0
  31. package/dist/fiat/providers/stripe.d.ts.map +1 -0
  32. package/dist/fiat/providers/stripe.js +135 -0
  33. package/dist/fiat/providers/stripe.js.map +1 -0
  34. package/dist/fiat/providers/transak.d.ts +26 -0
  35. package/dist/fiat/providers/transak.d.ts.map +1 -0
  36. package/dist/fiat/providers/transak.js +119 -0
  37. package/dist/fiat/providers/transak.js.map +1 -0
  38. package/dist/fiat/types.d.ts +106 -0
  39. package/dist/fiat/types.d.ts.map +1 -0
  40. package/dist/fiat/types.js +13 -0
  41. package/dist/fiat/types.js.map +1 -0
  42. package/dist/flash/executor.d.ts +119 -0
  43. package/dist/flash/executor.d.ts.map +1 -0
  44. package/dist/flash/executor.js +195 -0
  45. package/dist/flash/executor.js.map +1 -0
  46. package/dist/flash/index.d.ts +28 -0
  47. package/dist/flash/index.d.ts.map +1 -0
  48. package/dist/flash/index.js +29 -0
  49. package/dist/flash/index.js.map +1 -0
  50. package/dist/flash/scanner.d.ts +133 -0
  51. package/dist/flash/scanner.d.ts.map +1 -0
  52. package/dist/flash/scanner.js +212 -0
  53. package/dist/flash/scanner.js.map +1 -0
  54. package/dist/flash/types.d.ts +136 -0
  55. package/dist/flash/types.d.ts.map +1 -0
  56. package/dist/flash/types.js +23 -0
  57. package/dist/flash/types.js.map +1 -0
  58. package/dist/gas/index.d.ts +4 -0
  59. package/dist/gas/index.d.ts.map +1 -0
  60. package/dist/gas/index.js +3 -0
  61. package/dist/gas/index.js.map +1 -0
  62. package/dist/gas/sponsor.d.ts +70 -0
  63. package/dist/gas/sponsor.d.ts.map +1 -0
  64. package/dist/gas/sponsor.js +193 -0
  65. package/dist/gas/sponsor.js.map +1 -0
  66. package/dist/gas/types.d.ts +76 -0
  67. package/dist/gas/types.d.ts.map +1 -0
  68. package/dist/gas/types.js +21 -0
  69. package/dist/gas/types.js.map +1 -0
  70. package/dist/identity/agent-identity.d.ts +276 -0
  71. package/dist/identity/agent-identity.d.ts.map +1 -0
  72. package/dist/identity/agent-identity.js +300 -0
  73. package/dist/identity/agent-identity.js.map +1 -0
  74. package/dist/identity/email-resolver.d.ts +235 -0
  75. package/dist/identity/email-resolver.js +283 -0
  76. package/dist/identity/erc6551.d.ts +441 -0
  77. package/dist/identity/erc6551.d.ts.map +1 -0
  78. package/dist/identity/erc6551.js +517 -0
  79. package/dist/identity/erc6551.js.map +1 -0
  80. package/dist/index.d.ts +286 -213
  81. package/dist/index.d.ts.map +1 -1
  82. package/dist/index.js +3 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/mev/index.d.ts +4 -0
  85. package/dist/mev/index.d.ts.map +1 -0
  86. package/dist/mev/index.js +8 -0
  87. package/dist/mev/index.js.map +1 -0
  88. package/dist/mev/protection.d.ts +54 -0
  89. package/dist/mev/protection.d.ts.map +1 -0
  90. package/dist/mev/protection.js +185 -0
  91. package/dist/mev/protection.js.map +1 -0
  92. package/dist/mev/risk.d.ts +19 -0
  93. package/dist/mev/risk.d.ts.map +1 -0
  94. package/dist/mev/risk.js +95 -0
  95. package/dist/mev/risk.js.map +1 -0
  96. package/dist/mev/types.d.ts +49 -0
  97. package/dist/mev/types.d.ts.map +1 -0
  98. package/dist/mev/types.js +2 -0
  99. package/dist/mev/types.js.map +1 -0
  100. package/dist/plugins/elizaos.d.ts +52 -0
  101. package/dist/plugins/elizaos.d.ts.map +1 -0
  102. package/dist/plugins/elizaos.js +89 -0
  103. package/dist/plugins/elizaos.js.map +1 -0
  104. package/dist/settlement/index.d.ts +4 -0
  105. package/dist/settlement/index.d.ts.map +1 -0
  106. package/dist/settlement/index.js +3 -0
  107. package/dist/settlement/index.js.map +1 -0
  108. package/dist/settlement/types.d.ts +66 -0
  109. package/dist/settlement/types.d.ts.map +1 -0
  110. package/dist/settlement/types.js +37 -0
  111. package/dist/settlement/types.js.map +1 -0
  112. package/dist/settlement/verifier.d.ts +75 -0
  113. package/dist/settlement/verifier.d.ts.map +1 -0
  114. package/dist/settlement/verifier.js +354 -0
  115. package/dist/settlement/verifier.js.map +1 -0
  116. package/dist/solana/bridge.d.ts +144 -0
  117. package/dist/solana/bridge.d.ts.map +1 -0
  118. package/dist/solana/bridge.js +352 -0
  119. package/dist/solana/bridge.js.map +1 -0
  120. package/dist/solana/index.d.ts +8 -0
  121. package/dist/solana/index.d.ts.map +1 -0
  122. package/dist/solana/index.js +6 -0
  123. package/dist/solana/index.js.map +1 -0
  124. package/dist/solana/swap.d.ts +85 -0
  125. package/dist/solana/swap.d.ts.map +1 -0
  126. package/dist/solana/swap.js +173 -0
  127. package/dist/solana/swap.js.map +1 -0
  128. package/dist/solana/types.d.ts +126 -0
  129. package/dist/solana/types.d.ts.map +1 -0
  130. package/dist/solana/types.js +10 -0
  131. package/dist/solana/types.js.map +1 -0
  132. package/dist/solana/wallet.d.ts +83 -0
  133. package/dist/solana/wallet.d.ts.map +1 -0
  134. package/dist/solana/wallet.js +164 -0
  135. package/dist/solana/wallet.js.map +1 -0
  136. package/dist/solana/x402.d.ts +69 -0
  137. package/dist/solana/x402.d.ts.map +1 -0
  138. package/dist/solana/x402.js +154 -0
  139. package/dist/solana/x402.js.map +1 -0
  140. package/dist/solver/adapter.d.ts +47 -0
  141. package/dist/solver/adapter.d.ts.map +1 -0
  142. package/dist/solver/adapter.js +146 -0
  143. package/dist/solver/adapter.js.map +1 -0
  144. package/dist/solver/analyzer.d.ts +48 -0
  145. package/dist/solver/analyzer.d.ts.map +1 -0
  146. package/dist/solver/analyzer.js +171 -0
  147. package/dist/solver/analyzer.js.map +1 -0
  148. package/dist/solver/builder.d.ts +31 -0
  149. package/dist/solver/builder.d.ts.map +1 -0
  150. package/dist/solver/builder.js +60 -0
  151. package/dist/solver/builder.js.map +1 -0
  152. package/dist/solver/index.d.ts +22 -0
  153. package/dist/solver/index.d.ts.map +1 -0
  154. package/dist/solver/index.js +25 -0
  155. package/dist/solver/index.js.map +1 -0
  156. package/dist/solver/types.d.ts +115 -0
  157. package/dist/solver/types.d.ts.map +1 -0
  158. package/dist/solver/types.js +10 -0
  159. package/dist/solver/types.js.map +1 -0
  160. package/dist/spend-guard/index.d.ts +125 -0
  161. package/dist/spend-guard/index.d.ts.map +1 -0
  162. package/dist/spend-guard/index.js +150 -0
  163. package/dist/spend-guard/index.js.map +1 -0
  164. package/dist/swap/router/cache.d.ts +13 -0
  165. package/dist/swap/router/cache.d.ts.map +1 -0
  166. package/dist/swap/router/cache.js +30 -0
  167. package/dist/swap/router/cache.js.map +1 -0
  168. package/dist/swap/router/flashbots.d.ts +10 -0
  169. package/dist/swap/router/flashbots.d.ts.map +1 -0
  170. package/dist/swap/router/flashbots.js +43 -0
  171. package/dist/swap/router/flashbots.js.map +1 -0
  172. package/dist/swap/router/health.d.ts +17 -0
  173. package/dist/swap/router/health.d.ts.map +1 -0
  174. package/dist/swap/router/health.js +38 -0
  175. package/dist/swap/router/health.js.map +1 -0
  176. package/dist/swap/router/index.d.ts +10 -0
  177. package/dist/swap/router/index.d.ts.map +1 -0
  178. package/dist/swap/router/index.js +10 -0
  179. package/dist/swap/router/index.js.map +1 -0
  180. package/dist/swap/router/providers/cowswap.d.ts +11 -0
  181. package/dist/swap/router/providers/cowswap.d.ts.map +1 -0
  182. package/dist/swap/router/providers/cowswap.js +79 -0
  183. package/dist/swap/router/providers/cowswap.js.map +1 -0
  184. package/dist/swap/router/providers/index.d.ts +20 -0
  185. package/dist/swap/router/providers/index.d.ts.map +1 -0
  186. package/dist/swap/router/providers/index.js +32 -0
  187. package/dist/swap/router/providers/index.js.map +1 -0
  188. package/dist/swap/router/providers/jupiter.d.ts +12 -0
  189. package/dist/swap/router/providers/jupiter.d.ts.map +1 -0
  190. package/dist/swap/router/providers/jupiter.js +73 -0
  191. package/dist/swap/router/providers/jupiter.js.map +1 -0
  192. package/dist/swap/router/providers/lifi.d.ts +11 -0
  193. package/dist/swap/router/providers/lifi.d.ts.map +1 -0
  194. package/dist/swap/router/providers/lifi.js +123 -0
  195. package/dist/swap/router/providers/lifi.js.map +1 -0
  196. package/dist/swap/router/providers/oneinch.d.ts +13 -0
  197. package/dist/swap/router/providers/oneinch.d.ts.map +1 -0
  198. package/dist/swap/router/providers/oneinch.js +71 -0
  199. package/dist/swap/router/providers/oneinch.js.map +1 -0
  200. package/dist/swap/router/providers/paraswap.d.ts +11 -0
  201. package/dist/swap/router/providers/paraswap.d.ts.map +1 -0
  202. package/dist/swap/router/providers/paraswap.js +73 -0
  203. package/dist/swap/router/providers/paraswap.js.map +1 -0
  204. package/dist/swap/router/providers/uniswap.d.ts +31 -0
  205. package/dist/swap/router/providers/uniswap.d.ts.map +1 -0
  206. package/dist/swap/router/providers/uniswap.js +237 -0
  207. package/dist/swap/router/providers/uniswap.js.map +1 -0
  208. package/dist/swap/router/providers/zerox.d.ts +13 -0
  209. package/dist/swap/router/providers/zerox.d.ts.map +1 -0
  210. package/dist/swap/router/providers/zerox.js +94 -0
  211. package/dist/swap/router/providers/zerox.js.map +1 -0
  212. package/dist/swap/router/router.d.ts +86 -0
  213. package/dist/swap/router/router.d.ts.map +1 -0
  214. package/dist/swap/router/router.js +224 -0
  215. package/dist/swap/router/router.js.map +1 -0
  216. package/dist/swap/router/rsi/engine.d.ts +60 -0
  217. package/dist/swap/router/rsi/engine.d.ts.map +1 -0
  218. package/dist/swap/router/rsi/engine.js +483 -0
  219. package/dist/swap/router/rsi/engine.js.map +1 -0
  220. package/dist/swap/router/rsi/index.d.ts +3 -0
  221. package/dist/swap/router/rsi/index.d.ts.map +1 -0
  222. package/dist/swap/router/rsi/index.js +3 -0
  223. package/dist/swap/router/rsi/index.js.map +1 -0
  224. package/dist/swap/router/rsi/types.d.ts +106 -0
  225. package/dist/swap/router/rsi/types.d.ts.map +1 -0
  226. package/dist/swap/router/rsi/types.js +3 -0
  227. package/dist/swap/router/rsi/types.js.map +1 -0
  228. package/dist/swap/router/types.d.ts +120 -0
  229. package/dist/swap/router/types.d.ts.map +1 -0
  230. package/dist/swap/router/types.js +16 -0
  231. package/dist/swap/router/types.js.map +1 -0
  232. package/dist/tax/engine.d.ts +131 -0
  233. package/dist/tax/engine.d.ts.map +1 -0
  234. package/dist/tax/engine.js +307 -0
  235. package/dist/tax/engine.js.map +1 -0
  236. package/dist/tax/index.d.ts +9 -0
  237. package/dist/tax/index.d.ts.map +1 -0
  238. package/dist/tax/index.js +12 -0
  239. package/dist/tax/index.js.map +1 -0
  240. package/dist/tax/lots.d.ts +60 -0
  241. package/dist/tax/lots.d.ts.map +1 -0
  242. package/dist/tax/lots.js +129 -0
  243. package/dist/tax/lots.js.map +1 -0
  244. package/dist/tax/types.d.ts +113 -0
  245. package/dist/tax/types.d.ts.map +1 -0
  246. package/dist/tax/types.js +18 -0
  247. package/dist/tax/types.js.map +1 -0
  248. package/dist/verifiable-intent/index.d.ts +84 -0
  249. package/dist/verifiable-intent/index.js +385 -0
  250. package/dist/yield/index.d.ts +26 -0
  251. package/dist/yield/index.d.ts.map +1 -0
  252. package/dist/yield/index.js +29 -0
  253. package/dist/yield/index.js.map +1 -0
  254. package/dist/yield/rates.d.ts +114 -0
  255. package/dist/yield/rates.d.ts.map +1 -0
  256. package/dist/yield/rates.js +351 -0
  257. package/dist/yield/rates.js.map +1 -0
  258. package/dist/yield/types.d.ts +134 -0
  259. package/dist/yield/types.d.ts.map +1 -0
  260. package/dist/yield/types.js +24 -0
  261. package/dist/yield/types.js.map +1 -0
  262. package/dist/yield/vault.d.ts +112 -0
  263. package/dist/yield/vault.d.ts.map +1 -0
  264. package/dist/yield/vault.js +264 -0
  265. package/dist/yield/vault.js.map +1 -0
  266. package/package.json +3 -3
  267. package/LICENSE +0 -21
  268. package/dist/x402/chains/stellar/index.d.ts +0 -136
  269. package/dist/x402/chains/stellar/index.d.ts.map +0 -1
  270. package/dist/x402/chains/stellar/index.js +0 -190
  271. package/dist/x402/chains/stellar/index.js.map +0 -1
@@ -0,0 +1,264 @@
1
+ /**
2
+ * Yield Vault Engine
3
+ *
4
+ * Manages agent capital deployment across DeFi vaults and RWA tokens.
5
+ * Scans for the best available yield, tracks positions, and generates
6
+ * calldata for deposit/withdrawal transactions.
7
+ *
8
+ * ⚠️ CALLDATA ONLY: buildDepositTx / buildWithdrawTx return unsigned calldata.
9
+ * The agent signs and sends — no private keys are held by this module.
10
+ *
11
+ * Supported protocols for on-chain tx building:
12
+ * ✅ Aave V3 — supply() / withdraw()
13
+ * ✅ Compound V3 — supply() / withdraw()
14
+ * ❌ RWA tokens — use their native interfaces (BUIDL/OUSG/USDY/USYC/wUSTB)
15
+ *
16
+ * ⚠️ BUIDL: $1,000,000 minimum deposit. Do not use for general agent capital.
17
+ */
18
+ import { ethers } from 'ethers';
19
+ import { YieldRateFetcher } from './rates.js';
20
+ // ─── ABI Fragments ───────────────────────────────────────────────────────────
21
+ const AAVE_POOL_ABI = [
22
+ 'function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external',
23
+ 'function withdraw(address asset, uint256 amount, address to) external returns (uint256)',
24
+ ];
25
+ const COMPOUND_COMET_ABI = [
26
+ 'function supply(address asset, uint256 amount) external',
27
+ 'function withdraw(address asset, uint256 amount) external',
28
+ ];
29
+ // Protocol pool addresses (same as rates.ts)
30
+ const AAVE_POOL_ADDRESSES = {
31
+ ethereum: '0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2',
32
+ base: '0xA238Dd80C259a72e81d7e4664a9801593F98d1c5',
33
+ arbitrum: '0x794a61358D6845594F94dc1DB02A252b5b4814aD',
34
+ };
35
+ const COMPOUND_COMET_ADDRESSES = {
36
+ ethereum: '0xc3d688B66703497DAA19211EEdff47f25384cdc3',
37
+ base: '0xb125E6687d4313864e53df431d5425969c15Eb2',
38
+ arbitrum: '0x9c4ec768c28520B50860ea7a15bd7213a9fF58bf',
39
+ };
40
+ // Token addresses
41
+ const USDC_ADDRESSES = {
42
+ ethereum: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
43
+ base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
44
+ arbitrum: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
45
+ };
46
+ const USDT_ADDRESSES = {
47
+ ethereum: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
48
+ arbitrum: '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',
49
+ };
50
+ function getTokenAddress(token, chain) {
51
+ const upper = token.toUpperCase();
52
+ if (upper === 'USDC')
53
+ return USDC_ADDRESSES[chain] ?? '0x';
54
+ if (upper === 'USDT')
55
+ return USDT_ADDRESSES[chain] ?? '0x';
56
+ return '0x';
57
+ }
58
+ // ─── Default Config ───────────────────────────────────────────────────────────
59
+ const DEFAULT_CONFIG = {
60
+ enabled: true,
61
+ chains: ['ethereum', 'base', 'arbitrum'],
62
+ tokens: ['USDC', 'USDT'],
63
+ includeRWA: true,
64
+ minRotationImprovementBps: 25,
65
+ minIdleMs: 24 * 60 * 60 * 1000, // 24 hours
66
+ maxDepositUsd: Infinity,
67
+ skipKYCRequired: true,
68
+ };
69
+ // ─── Yield Vault ─────────────────────────────────────────────────────────────
70
+ export class YieldVault {
71
+ constructor(config) {
72
+ this.positions = new Map();
73
+ this.config = { ...DEFAULT_CONFIG, ...config };
74
+ this.rateFetcher = new YieldRateFetcher();
75
+ }
76
+ /**
77
+ * Scan all protocols and chains for the best available yield.
78
+ *
79
+ * Returns opportunities sorted by netAnnualGainUsd descending.
80
+ * Only includes rates with positive APY improvement vs current position.
81
+ *
82
+ * @param params.token - Underlying token to scan for (e.g. 'USDC')
83
+ * @param params.amountUsd - Amount in USD to use for gain calculations
84
+ * @param params.currentPosition - Active position (if any) to compare against
85
+ */
86
+ async scan(params) {
87
+ const rates = await this.rateFetcher.fetchAllRates(this.config);
88
+ const currentApy = params.currentPosition?.currentApy ?? 0;
89
+ return rates
90
+ .map((rate) => {
91
+ const apyImprovementBps = Math.round((rate.apy - currentApy) * 10000);
92
+ const estimatedAnnualGainUsd = params.amountUsd * (rate.apy - currentApy);
93
+ const rotationCostUsd = this.estimateRotationCost(params.currentPosition?.chain, rate.chain, params.amountUsd);
94
+ const netAnnualGainUsd = estimatedAnnualGainUsd - rotationCostUsd;
95
+ const viable = apyImprovementBps >= this.config.minRotationImprovementBps &&
96
+ netAnnualGainUsd > 0;
97
+ return {
98
+ current: params.currentPosition ?? null,
99
+ best: rate,
100
+ apyImprovementBps,
101
+ estimatedAnnualGainUsd,
102
+ rotationCostUsd,
103
+ netAnnualGainUsd,
104
+ viable,
105
+ };
106
+ })
107
+ .filter(o => o.apyImprovementBps > 0)
108
+ .sort((a, b) => b.netAnnualGainUsd - a.netAnnualGainUsd);
109
+ }
110
+ /**
111
+ * Build a deposit transaction for a supported protocol.
112
+ *
113
+ * Returns unsigned calldata — the agent signs and broadcasts.
114
+ * ERC20 deposits: value is always 0n (approve first, then supply).
115
+ *
116
+ * Supported: aave-v3, compound-v3
117
+ * Unsupported (use native interface): buidl, ousg, usdy, usyc, wustb
118
+ *
119
+ * @throws Error for unsupported protocols
120
+ */
121
+ buildDepositTx(params) {
122
+ switch (params.protocol) {
123
+ case 'aave-v3':
124
+ return this.buildAaveDepositTx(params);
125
+ case 'compound-v3':
126
+ return this.buildCompoundDepositTx(params);
127
+ default:
128
+ throw new Error(`Deposit not supported for '${params.protocol}' via SDK — use their native interface. ` +
129
+ `For RWA tokens (buidl, ousg, usdy, usyc, wustb), interact with the token's ` +
130
+ `native contract or portal directly.`);
131
+ }
132
+ }
133
+ /**
134
+ * Build a withdrawal transaction for a supported protocol.
135
+ *
136
+ * Returns unsigned calldata — the agent signs and broadcasts.
137
+ * Pass ethers.MaxUint256 (2^256-1) to withdraw the full position.
138
+ *
139
+ * Supported: aave-v3, compound-v3
140
+ *
141
+ * @throws Error for unsupported protocols
142
+ */
143
+ buildWithdrawTx(params) {
144
+ switch (params.protocol) {
145
+ case 'aave-v3':
146
+ return this.buildAaveWithdrawTx(params);
147
+ case 'compound-v3':
148
+ return this.buildCompoundWithdrawTx(params);
149
+ default:
150
+ throw new Error(`Withdrawal not supported for '${params.protocol}' via SDK — use their native interface.`);
151
+ }
152
+ }
153
+ /**
154
+ * Estimate USD cost to rotate capital from one position to another.
155
+ *
156
+ * Same-chain rotation: ~$3 gas (single approve + supply tx)
157
+ * Cross-chain rotation: CCTP bridge fee (0.1% of amount) + gas both sides (~$5)
158
+ *
159
+ * Note: For small amounts, cross-chain rotation may not be worth it.
160
+ */
161
+ estimateRotationCost(fromChain, toChain, amountUsd) {
162
+ if (!fromChain || fromChain === toChain) {
163
+ // Same chain: ~$2-5 gas (approve + supply)
164
+ return 3.0;
165
+ }
166
+ // Cross-chain: CCTP bridge fee (0.1% platform) + gas both sides (~$5 total)
167
+ return amountUsd * 0.001 + 5.0;
168
+ }
169
+ /**
170
+ * Track a position for yield accrual estimation.
171
+ * Keyed by protocol:chain:token — one position per slot.
172
+ */
173
+ trackPosition(position) {
174
+ const key = `${position.protocol}:${position.chain}:${position.token}`;
175
+ this.positions.set(key, position);
176
+ }
177
+ /** Get all tracked positions */
178
+ getPositions() {
179
+ return Array.from(this.positions.values());
180
+ }
181
+ /**
182
+ * Estimate yield accrued since deposit.
183
+ *
184
+ * Uses simple linear approximation (accurate for short periods).
185
+ * For compound interest over long periods, use protocol's native accrual.
186
+ */
187
+ estimateAccruedYield(position) {
188
+ const elapsedMs = Date.now() - position.depositedAt;
189
+ const elapsedYears = elapsedMs / (365.25 * 24 * 60 * 60 * 1000);
190
+ const yieldFraction = position.currentApy * elapsedYears;
191
+ return BigInt(Math.round(Number(position.depositedAmount) * yieldFraction));
192
+ }
193
+ // ─── Private TX Builders ──────────────────────────────────────────────────
194
+ buildAaveDepositTx(params) {
195
+ const poolAddress = AAVE_POOL_ADDRESSES[params.chain];
196
+ if (!poolAddress)
197
+ throw new Error(`Aave V3 not supported on chain: ${params.chain}`);
198
+ const tokenAddress = getTokenAddress(params.token, params.chain);
199
+ const iface = new ethers.Interface(AAVE_POOL_ABI);
200
+ // supply(asset, amount, onBehalfOf, referralCode=0)
201
+ const data = iface.encodeFunctionData('supply', [
202
+ tokenAddress,
203
+ params.amount,
204
+ params.walletAddress,
205
+ 0,
206
+ ]);
207
+ return {
208
+ to: poolAddress,
209
+ data,
210
+ value: 0n, // ERC20 deposit — no native token required
211
+ gasEstimate: 250000n,
212
+ };
213
+ }
214
+ buildAaveWithdrawTx(params) {
215
+ const poolAddress = AAVE_POOL_ADDRESSES[params.chain];
216
+ if (!poolAddress)
217
+ throw new Error(`Aave V3 not supported on chain: ${params.chain}`);
218
+ const tokenAddress = getTokenAddress(params.token, params.chain);
219
+ const iface = new ethers.Interface(AAVE_POOL_ABI);
220
+ // withdraw(asset, amount, to) — pass MaxUint256 to withdraw all
221
+ const data = iface.encodeFunctionData('withdraw', [
222
+ tokenAddress,
223
+ params.amount,
224
+ params.walletAddress,
225
+ ]);
226
+ return {
227
+ to: poolAddress,
228
+ data,
229
+ value: 0n,
230
+ gasEstimate: 200000n,
231
+ };
232
+ }
233
+ buildCompoundDepositTx(params) {
234
+ const cometAddress = COMPOUND_COMET_ADDRESSES[params.chain];
235
+ if (!cometAddress)
236
+ throw new Error(`Compound V3 not supported on chain: ${params.chain}`);
237
+ const tokenAddress = getTokenAddress(params.token, params.chain);
238
+ const iface = new ethers.Interface(COMPOUND_COMET_ABI);
239
+ // supply(asset, amount)
240
+ const data = iface.encodeFunctionData('supply', [tokenAddress, params.amount]);
241
+ return {
242
+ to: cometAddress,
243
+ data,
244
+ value: 0n,
245
+ gasEstimate: 180000n,
246
+ };
247
+ }
248
+ buildCompoundWithdrawTx(params) {
249
+ const cometAddress = COMPOUND_COMET_ADDRESSES[params.chain];
250
+ if (!cometAddress)
251
+ throw new Error(`Compound V3 not supported on chain: ${params.chain}`);
252
+ const tokenAddress = getTokenAddress(params.token, params.chain);
253
+ const iface = new ethers.Interface(COMPOUND_COMET_ABI);
254
+ // withdraw(asset, amount)
255
+ const data = iface.encodeFunctionData('withdraw', [tokenAddress, params.amount]);
256
+ return {
257
+ to: cometAddress,
258
+ data,
259
+ value: 0n,
260
+ gasEstimate: 150000n,
261
+ };
262
+ }
263
+ }
264
+ //# sourceMappingURL=vault.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/yield/vault.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentwallet-sdk",
3
- "version": "5.0.5",
3
+ "version": "5.1.1",
4
4
  "description": "Non-custodial AI agent wallet SDK. ERC-8004 identity & reputation registries, mutual stake escrow, x402 payments, 17-chain CCTP bridging, ERC-6551 TBA, SpendingPolicy guardrails, Uniswap V3 swap. The agent holds the keys.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -37,7 +37,7 @@
37
37
  "license": "MIT",
38
38
  "repository": {
39
39
  "type": "git",
40
- "url": "https://github.com/agentnexus/agent-wallet-sdk"
40
+ "url": "git+https://github.com/agentnexus/agent-wallet-sdk.git"
41
41
  },
42
42
  "author": "AgentNexus",
43
43
  "dependencies": {
@@ -48,4 +48,4 @@
48
48
  "typescript": "5.3.3",
49
49
  "vitest": "4.0.18"
50
50
  }
51
- }
51
+ }
package/LICENSE DELETED
@@ -1,21 +0,0 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 up2itnow0822
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
@@ -1,136 +0,0 @@
1
- /**
2
- * Stellar x402 Payment Adapter
3
- *
4
- * Implements x402 payment protocol on Stellar network.
5
- * Stellar x402 support went live March 11, 2026.
6
- *
7
- * Chain identifiers:
8
- * - Stellar Mainnet: "stellar:pubnet"
9
- * - Stellar Testnet: "stellar:testnet"
10
- *
11
- * Key differences from EVM chains:
12
- * - Uses Ed25519 keypairs (not secp256k1)
13
- * - Transaction format: Stellar XDR (not EVM tx)
14
- * - Settlement: ~5 seconds (1 ledger close)
15
- * - Fees: ~0.00001 XLM per operation (effectively free at scale)
16
- * - USDC: Circle-issued USDC on Stellar
17
- *
18
- * Requires optional peer dependency: npm install @stellar/stellar-sdk
19
- */
20
- export declare const STELLAR_NETWORK: {
21
- readonly pubnet: {
22
- readonly horizonUrl: "https://horizon.stellar.org";
23
- readonly networkPassphrase: "Public Global Stellar Network ; September 2015";
24
- readonly chainId: "stellar:pubnet";
25
- };
26
- readonly testnet: {
27
- readonly horizonUrl: "https://horizon-testnet.stellar.org";
28
- readonly networkPassphrase: "Test SDF Network ; September 2015";
29
- readonly chainId: "stellar:testnet";
30
- };
31
- };
32
- /**
33
- * Circle USDC on Stellar (Mainnet)
34
- * Asset code: USDC
35
- * Issuer: GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN
36
- */
37
- export declare const STELLAR_USDC: {
38
- readonly pubnet: {
39
- readonly code: "USDC";
40
- readonly issuer: "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN";
41
- };
42
- readonly testnet: {
43
- readonly code: "USDC";
44
- readonly issuer: "GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5";
45
- };
46
- };
47
- export type StellarNetwork = 'pubnet' | 'testnet';
48
- export interface StellarPaymentConfig {
49
- /** Which Stellar network to use */
50
- network?: StellarNetwork;
51
- /** x402 resource identifier (for memo) */
52
- resource?: string;
53
- /** Custom Horizon URL (overrides default) */
54
- horizonUrl?: string;
55
- }
56
- export interface StellarPaymentRequest {
57
- /** Destination Stellar account (G... address) */
58
- destination: string;
59
- /** Amount in USDC (decimal string, e.g. "0.50") */
60
- amount: string;
61
- /** Source Stellar account public key */
62
- sourcePublicKey: string;
63
- /** x402 resource path for memo */
64
- resource?: string;
65
- /** Network to use */
66
- network?: StellarNetwork;
67
- }
68
- export interface StellarPaymentResult {
69
- /** Stellar transaction hash */
70
- hash: string;
71
- /** Ledger number the transaction landed in */
72
- ledger: number;
73
- /** Successful */
74
- successful: boolean;
75
- /** Network used */
76
- network: StellarNetwork;
77
- }
78
- /**
79
- * StellarX402Adapter
80
- *
81
- * Handles x402 payment flow for Stellar network.
82
- *
83
- * Requires optional peer dependency: npm install @stellar/stellar-sdk
84
- *
85
- * Usage:
86
- * ```typescript
87
- * const adapter = new StellarX402Adapter({ network: 'pubnet' });
88
- * const xdr = await adapter.buildPaymentTransaction({
89
- * destination: 'GDES...',
90
- * amount: '0.50',
91
- * sourcePublicKey: keypair.publicKey(),
92
- * resource: '/api/data-endpoint',
93
- * });
94
- * // sign xdr with your keypair, then:
95
- * const result = await adapter.submitTransaction(signedXdr);
96
- * ```
97
- */
98
- export declare class StellarX402Adapter {
99
- private network;
100
- private horizonUrl;
101
- constructor(config?: StellarPaymentConfig);
102
- /**
103
- * Parse an x402 402 response and extract Stellar payment details.
104
- */
105
- parseX402Response(headers: Record<string, string>): {
106
- supported: boolean;
107
- destination?: string;
108
- amount?: string;
109
- resource?: string;
110
- };
111
- /**
112
- * Build a Stellar USDC payment transaction XDR.
113
- *
114
- * Requires @stellar/stellar-sdk installed as a peer dependency.
115
- * The returned XDR string must be signed before submission.
116
- */
117
- buildPaymentTransaction(request: StellarPaymentRequest): Promise<string>;
118
- /**
119
- * Submit a signed Stellar transaction XDR to Horizon.
120
- */
121
- submitTransaction(signedXdr: string): Promise<StellarPaymentResult>;
122
- private _loadAccount;
123
- /** Chain ID for this adapter (e.g. "stellar:pubnet") */
124
- get chainId(): string;
125
- }
126
- /**
127
- * Full x402 payment flow for Stellar.
128
- * Requires @stellar/stellar-sdk installed as peer dependency.
129
- */
130
- export declare function stellarX402Pay(params: {
131
- responseHeaders: Record<string, string>;
132
- sourcePublicKey: string;
133
- sign: (xdr: string) => Promise<string>;
134
- network?: StellarNetwork;
135
- }): Promise<StellarPaymentResult>;
136
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/x402/chains/stellar/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAIH,eAAO,MAAM,eAAe;;;;;;;;;;;CAWlB,CAAC;AAEX;;;;GAIG;AACH,eAAO,MAAM,YAAY;;;;;;;;;CASf,CAAC;AAIX,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,mCAAmC;IACnC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,wCAAwC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,kCAAkC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB;IACjB,UAAU,EAAE,OAAO,CAAC;IACpB,mBAAmB;IACnB,OAAO,EAAE,cAAc,CAAC;CACzB;AAcD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAiB;IAChC,OAAO,CAAC,UAAU,CAAS;gBAEf,MAAM,GAAE,oBAAyB;IAK7C;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG;QAClD,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAgBD;;;;;OAKG;IACG,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC;IAgD9E;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;YAyB3D,YAAY;IAc1B,wDAAwD;IACxD,IAAI,OAAO,IAAI,MAAM,CAEpB;CACF;AAID;;;GAGG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAqBhC"}
@@ -1,190 +0,0 @@
1
- /**
2
- * Stellar x402 Payment Adapter
3
- *
4
- * Implements x402 payment protocol on Stellar network.
5
- * Stellar x402 support went live March 11, 2026.
6
- *
7
- * Chain identifiers:
8
- * - Stellar Mainnet: "stellar:pubnet"
9
- * - Stellar Testnet: "stellar:testnet"
10
- *
11
- * Key differences from EVM chains:
12
- * - Uses Ed25519 keypairs (not secp256k1)
13
- * - Transaction format: Stellar XDR (not EVM tx)
14
- * - Settlement: ~5 seconds (1 ledger close)
15
- * - Fees: ~0.00001 XLM per operation (effectively free at scale)
16
- * - USDC: Circle-issued USDC on Stellar
17
- *
18
- * Requires optional peer dependency: npm install @stellar/stellar-sdk
19
- */
20
- // ─── Stellar Chain Constants ─────────────────────────────────────────────────
21
- export const STELLAR_NETWORK = {
22
- pubnet: {
23
- horizonUrl: 'https://horizon.stellar.org',
24
- networkPassphrase: 'Public Global Stellar Network ; September 2015',
25
- chainId: 'stellar:pubnet',
26
- },
27
- testnet: {
28
- horizonUrl: 'https://horizon-testnet.stellar.org',
29
- networkPassphrase: 'Test SDF Network ; September 2015',
30
- chainId: 'stellar:testnet',
31
- },
32
- };
33
- /**
34
- * Circle USDC on Stellar (Mainnet)
35
- * Asset code: USDC
36
- * Issuer: GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN
37
- */
38
- export const STELLAR_USDC = {
39
- pubnet: {
40
- code: 'USDC',
41
- issuer: 'GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN',
42
- },
43
- testnet: {
44
- code: 'USDC',
45
- issuer: 'GBBD47IF6LWK7P7MDEVSCWR7DPUWV3NY3DTQEVFL4NAT4AQH3ZLLFLA5',
46
- },
47
- };
48
- // ─── Stellar x402 Payment Adapter ────────────────────────────────────────────
49
- /**
50
- * StellarX402Adapter
51
- *
52
- * Handles x402 payment flow for Stellar network.
53
- *
54
- * Requires optional peer dependency: npm install @stellar/stellar-sdk
55
- *
56
- * Usage:
57
- * ```typescript
58
- * const adapter = new StellarX402Adapter({ network: 'pubnet' });
59
- * const xdr = await adapter.buildPaymentTransaction({
60
- * destination: 'GDES...',
61
- * amount: '0.50',
62
- * sourcePublicKey: keypair.publicKey(),
63
- * resource: '/api/data-endpoint',
64
- * });
65
- * // sign xdr with your keypair, then:
66
- * const result = await adapter.submitTransaction(signedXdr);
67
- * ```
68
- */
69
- export class StellarX402Adapter {
70
- constructor(config = {}) {
71
- this.network = config.network ?? 'pubnet';
72
- this.horizonUrl = config.horizonUrl ?? STELLAR_NETWORK[this.network].horizonUrl;
73
- }
74
- /**
75
- * Parse an x402 402 response and extract Stellar payment details.
76
- */
77
- parseX402Response(headers) {
78
- const chains = headers['x-payment-chains'] ?? headers['X-Payment-Chains'] ?? '';
79
- const chainId = STELLAR_NETWORK[this.network].chainId;
80
- if (!chains.includes(chainId) && !chains.includes('stellar')) {
81
- return { supported: false };
82
- }
83
- return {
84
- supported: true,
85
- destination: headers['x-payment-destination'] ?? headers['X-Payment-Destination'],
86
- amount: headers['x-payment-amount'] ?? headers['X-Payment-Amount'],
87
- resource: headers['x-payment-resource'] ?? headers['X-Payment-Resource'],
88
- };
89
- }
90
- /**
91
- * Build a Stellar USDC payment transaction XDR.
92
- *
93
- * Requires @stellar/stellar-sdk installed as a peer dependency.
94
- * The returned XDR string must be signed before submission.
95
- */
96
- async buildPaymentTransaction(request) {
97
- // Dynamic import to avoid hard dependency on @stellar/stellar-sdk
98
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
99
- let StellarSdk;
100
- try {
101
- StellarSdk = await import(
102
- /* webpackIgnore: true */
103
- '@stellar/stellar-sdk');
104
- }
105
- catch {
106
- throw new Error('Stellar support requires @stellar/stellar-sdk: npm install @stellar/stellar-sdk');
107
- }
108
- const networkConfig = STELLAR_NETWORK[request.network ?? this.network];
109
- const usdcAsset = STELLAR_USDC[request.network ?? this.network];
110
- const account = await this._loadAccount(request.sourcePublicKey, networkConfig.horizonUrl);
111
- const stellarAccount = new StellarSdk.Account(request.sourcePublicKey, account.sequence);
112
- const asset = new StellarSdk.Asset(usdcAsset.code, usdcAsset.issuer);
113
- const memoText = request.resource
114
- ? request.resource.slice(0, 28)
115
- : 'x402-payment';
116
- const transaction = new StellarSdk.TransactionBuilder(stellarAccount, {
117
- fee: StellarSdk.BASE_FEE,
118
- networkPassphrase: networkConfig.networkPassphrase,
119
- })
120
- .addOperation(StellarSdk.Operation.payment({
121
- destination: request.destination,
122
- asset,
123
- amount: request.amount,
124
- }))
125
- .addMemo(StellarSdk.Memo.text(memoText))
126
- .setTimeout(300)
127
- .build();
128
- return transaction.toXDR();
129
- }
130
- /**
131
- * Submit a signed Stellar transaction XDR to Horizon.
132
- */
133
- async submitTransaction(signedXdr) {
134
- const networkConfig = STELLAR_NETWORK[this.network];
135
- const body = new URLSearchParams({ tx: signedXdr }).toString();
136
- const resp = await fetch(`${networkConfig.horizonUrl}/transactions`, {
137
- method: 'POST',
138
- headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
139
- body,
140
- });
141
- if (!resp.ok) {
142
- const err = await resp.text();
143
- throw new Error(`Stellar transaction failed: ${resp.status} ${err.slice(0, 200)}`);
144
- }
145
- const result = await resp.json();
146
- return {
147
- hash: result.hash,
148
- ledger: result.ledger,
149
- successful: result.successful ?? true,
150
- network: this.network,
151
- };
152
- }
153
- async _loadAccount(publicKey, horizonUrl) {
154
- const resp = await fetch(`${horizonUrl}/accounts/${publicKey}`);
155
- if (!resp.ok) {
156
- throw new Error(`Cannot load Stellar account ${publicKey}: ${resp.status}. ` +
157
- `Ensure the account exists and has a USDC trustline established.`);
158
- }
159
- return await resp.json();
160
- }
161
- /** Chain ID for this adapter (e.g. "stellar:pubnet") */
162
- get chainId() {
163
- return STELLAR_NETWORK[this.network].chainId;
164
- }
165
- }
166
- // ─── x402 Auto-Pay Helper ────────────────────────────────────────────────────
167
- /**
168
- * Full x402 payment flow for Stellar.
169
- * Requires @stellar/stellar-sdk installed as peer dependency.
170
- */
171
- export async function stellarX402Pay(params) {
172
- const adapter = new StellarX402Adapter({ network: params.network ?? 'pubnet' });
173
- const details = adapter.parseX402Response(params.responseHeaders);
174
- if (!details.supported) {
175
- throw new Error('This endpoint does not support Stellar x402 payments');
176
- }
177
- if (!details.destination || !details.amount) {
178
- throw new Error('x402 response missing destination or amount headers');
179
- }
180
- const xdr = await adapter.buildPaymentTransaction({
181
- destination: details.destination,
182
- amount: details.amount,
183
- sourcePublicKey: params.sourcePublicKey,
184
- resource: details.resource,
185
- network: params.network ?? 'pubnet',
186
- });
187
- const signedXdr = await params.sign(xdr);
188
- return adapter.submitTransaction(signedXdr);
189
- }
190
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/x402/chains/stellar/index.ts"],"names":[],"mappings":"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"}