agentwallet-sdk 3.3.0 → 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 (320) 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 -136
  22. package/dist/index.d.ts.map +1 -1
  23. package/dist/index.js +11 -59
  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 +1 -4
  57. package/dist/x402/client.d.ts.map +1 -1
  58. package/dist/x402/client.js +2 -16
  59. package/dist/x402/client.js.map +1 -1
  60. package/dist/x402/index.d.ts +3 -1
  61. package/dist/x402/index.d.ts.map +1 -1
  62. package/dist/x402/index.js +3 -1
  63. package/dist/x402/index.js.map +1 -1
  64. package/dist/x402/types.d.ts +3 -5
  65. package/dist/x402/types.d.ts.map +1 -1
  66. package/dist/x402/types.js +2 -17
  67. package/dist/x402/types.js.map +1 -1
  68. package/package.json +12 -32
  69. package/dist/ap2/index.d.ts +0 -185
  70. package/dist/ap2/index.d.ts.map +0 -1
  71. package/dist/ap2/index.js +0 -255
  72. package/dist/ap2/index.js.map +0 -1
  73. package/dist/bridge/unified.d.ts +0 -101
  74. package/dist/bridge/unified.d.ts.map +0 -1
  75. package/dist/bridge/unified.js +0 -284
  76. package/dist/bridge/unified.js.map +0 -1
  77. package/dist/chains.d.ts +0 -62
  78. package/dist/chains.d.ts.map +0 -1
  79. package/dist/chains.js +0 -108
  80. package/dist/chains.js.map +0 -1
  81. package/dist/fiat/index.d.ts +0 -10
  82. package/dist/fiat/index.d.ts.map +0 -1
  83. package/dist/fiat/index.js +0 -9
  84. package/dist/fiat/index.js.map +0 -1
  85. package/dist/fiat/onramp.d.ts +0 -101
  86. package/dist/fiat/onramp.d.ts.map +0 -1
  87. package/dist/fiat/onramp.js +0 -155
  88. package/dist/fiat/onramp.js.map +0 -1
  89. package/dist/fiat/providers/index.d.ts +0 -16
  90. package/dist/fiat/providers/index.d.ts.map +0 -1
  91. package/dist/fiat/providers/index.js +0 -30
  92. package/dist/fiat/providers/index.js.map +0 -1
  93. package/dist/fiat/providers/moonpay.d.ts +0 -22
  94. package/dist/fiat/providers/moonpay.d.ts.map +0 -1
  95. package/dist/fiat/providers/moonpay.js +0 -107
  96. package/dist/fiat/providers/moonpay.js.map +0 -1
  97. package/dist/fiat/providers/stripe.d.ts +0 -26
  98. package/dist/fiat/providers/stripe.d.ts.map +0 -1
  99. package/dist/fiat/providers/stripe.js +0 -135
  100. package/dist/fiat/providers/stripe.js.map +0 -1
  101. package/dist/fiat/providers/transak.d.ts +0 -26
  102. package/dist/fiat/providers/transak.d.ts.map +0 -1
  103. package/dist/fiat/providers/transak.js +0 -119
  104. package/dist/fiat/providers/transak.js.map +0 -1
  105. package/dist/fiat/types.d.ts +0 -106
  106. package/dist/fiat/types.d.ts.map +0 -1
  107. package/dist/fiat/types.js +0 -13
  108. package/dist/fiat/types.js.map +0 -1
  109. package/dist/flash/executor.d.ts +0 -119
  110. package/dist/flash/executor.d.ts.map +0 -1
  111. package/dist/flash/executor.js +0 -195
  112. package/dist/flash/executor.js.map +0 -1
  113. package/dist/flash/index.d.ts +0 -28
  114. package/dist/flash/index.d.ts.map +0 -1
  115. package/dist/flash/index.js +0 -25
  116. package/dist/flash/index.js.map +0 -1
  117. package/dist/flash/scanner.d.ts +0 -133
  118. package/dist/flash/scanner.d.ts.map +0 -1
  119. package/dist/flash/scanner.js +0 -212
  120. package/dist/flash/scanner.js.map +0 -1
  121. package/dist/flash/types.d.ts +0 -136
  122. package/dist/flash/types.d.ts.map +0 -1
  123. package/dist/flash/types.js +0 -23
  124. package/dist/flash/types.js.map +0 -1
  125. package/dist/gas/index.d.ts +0 -4
  126. package/dist/gas/index.d.ts.map +0 -1
  127. package/dist/gas/index.js +0 -3
  128. package/dist/gas/index.js.map +0 -1
  129. package/dist/gas/sponsor.d.ts +0 -70
  130. package/dist/gas/sponsor.d.ts.map +0 -1
  131. package/dist/gas/sponsor.js +0 -193
  132. package/dist/gas/sponsor.js.map +0 -1
  133. package/dist/gas/types.d.ts +0 -76
  134. package/dist/gas/types.d.ts.map +0 -1
  135. package/dist/gas/types.js +0 -21
  136. package/dist/gas/types.js.map +0 -1
  137. package/dist/identity/agent-identity.d.ts +0 -276
  138. package/dist/identity/agent-identity.d.ts.map +0 -1
  139. package/dist/identity/agent-identity.js +0 -300
  140. package/dist/identity/agent-identity.js.map +0 -1
  141. package/dist/identity/erc6551.d.ts +0 -441
  142. package/dist/identity/erc6551.d.ts.map +0 -1
  143. package/dist/identity/erc6551.js +0 -517
  144. package/dist/identity/erc6551.js.map +0 -1
  145. package/dist/mev/index.d.ts +0 -4
  146. package/dist/mev/index.d.ts.map +0 -1
  147. package/dist/mev/index.js +0 -4
  148. package/dist/mev/index.js.map +0 -1
  149. package/dist/mev/protection.d.ts +0 -54
  150. package/dist/mev/protection.d.ts.map +0 -1
  151. package/dist/mev/protection.js +0 -185
  152. package/dist/mev/protection.js.map +0 -1
  153. package/dist/mev/risk.d.ts +0 -19
  154. package/dist/mev/risk.d.ts.map +0 -1
  155. package/dist/mev/risk.js +0 -95
  156. package/dist/mev/risk.js.map +0 -1
  157. package/dist/mev/types.d.ts +0 -49
  158. package/dist/mev/types.d.ts.map +0 -1
  159. package/dist/mev/types.js +0 -2
  160. package/dist/mev/types.js.map +0 -1
  161. package/dist/settlement/index.d.ts +0 -4
  162. package/dist/settlement/index.d.ts.map +0 -1
  163. package/dist/settlement/index.js +0 -3
  164. package/dist/settlement/index.js.map +0 -1
  165. package/dist/settlement/types.d.ts +0 -66
  166. package/dist/settlement/types.d.ts.map +0 -1
  167. package/dist/settlement/types.js +0 -37
  168. package/dist/settlement/types.js.map +0 -1
  169. package/dist/settlement/verifier.d.ts +0 -75
  170. package/dist/settlement/verifier.d.ts.map +0 -1
  171. package/dist/settlement/verifier.js +0 -354
  172. package/dist/settlement/verifier.js.map +0 -1
  173. package/dist/solana/bridge.d.ts +0 -144
  174. package/dist/solana/bridge.d.ts.map +0 -1
  175. package/dist/solana/bridge.js +0 -352
  176. package/dist/solana/bridge.js.map +0 -1
  177. package/dist/solana/index.d.ts +0 -8
  178. package/dist/solana/index.d.ts.map +0 -1
  179. package/dist/solana/index.js +0 -6
  180. package/dist/solana/index.js.map +0 -1
  181. package/dist/solana/swap.d.ts +0 -85
  182. package/dist/solana/swap.d.ts.map +0 -1
  183. package/dist/solana/swap.js +0 -173
  184. package/dist/solana/swap.js.map +0 -1
  185. package/dist/solana/types.d.ts +0 -126
  186. package/dist/solana/types.d.ts.map +0 -1
  187. package/dist/solana/types.js +0 -10
  188. package/dist/solana/types.js.map +0 -1
  189. package/dist/solana/wallet.d.ts +0 -83
  190. package/dist/solana/wallet.d.ts.map +0 -1
  191. package/dist/solana/wallet.js +0 -164
  192. package/dist/solana/wallet.js.map +0 -1
  193. package/dist/solana/x402.d.ts +0 -69
  194. package/dist/solana/x402.d.ts.map +0 -1
  195. package/dist/solana/x402.js +0 -154
  196. package/dist/solana/x402.js.map +0 -1
  197. package/dist/solver/adapter.d.ts +0 -47
  198. package/dist/solver/adapter.d.ts.map +0 -1
  199. package/dist/solver/adapter.js +0 -138
  200. package/dist/solver/adapter.js.map +0 -1
  201. package/dist/solver/analyzer.d.ts +0 -48
  202. package/dist/solver/analyzer.d.ts.map +0 -1
  203. package/dist/solver/analyzer.js +0 -89
  204. package/dist/solver/analyzer.js.map +0 -1
  205. package/dist/solver/builder.d.ts +0 -31
  206. package/dist/solver/builder.d.ts.map +0 -1
  207. package/dist/solver/builder.js +0 -60
  208. package/dist/solver/builder.js.map +0 -1
  209. package/dist/solver/index.d.ts +0 -22
  210. package/dist/solver/index.d.ts.map +0 -1
  211. package/dist/solver/index.js +0 -21
  212. package/dist/solver/index.js.map +0 -1
  213. package/dist/solver/types.d.ts +0 -115
  214. package/dist/solver/types.d.ts.map +0 -1
  215. package/dist/solver/types.js +0 -10
  216. package/dist/solver/types.js.map +0 -1
  217. package/dist/spend-guard/index.d.ts +0 -125
  218. package/dist/spend-guard/index.d.ts.map +0 -1
  219. package/dist/spend-guard/index.js +0 -150
  220. package/dist/spend-guard/index.js.map +0 -1
  221. package/dist/swap/router/cache.d.ts +0 -13
  222. package/dist/swap/router/cache.d.ts.map +0 -1
  223. package/dist/swap/router/cache.js +0 -30
  224. package/dist/swap/router/cache.js.map +0 -1
  225. package/dist/swap/router/flashbots.d.ts +0 -10
  226. package/dist/swap/router/flashbots.d.ts.map +0 -1
  227. package/dist/swap/router/flashbots.js +0 -43
  228. package/dist/swap/router/flashbots.js.map +0 -1
  229. package/dist/swap/router/health.d.ts +0 -17
  230. package/dist/swap/router/health.d.ts.map +0 -1
  231. package/dist/swap/router/health.js +0 -38
  232. package/dist/swap/router/health.js.map +0 -1
  233. package/dist/swap/router/index.d.ts +0 -10
  234. package/dist/swap/router/index.d.ts.map +0 -1
  235. package/dist/swap/router/index.js +0 -10
  236. package/dist/swap/router/index.js.map +0 -1
  237. package/dist/swap/router/providers/cowswap.d.ts +0 -11
  238. package/dist/swap/router/providers/cowswap.d.ts.map +0 -1
  239. package/dist/swap/router/providers/cowswap.js +0 -79
  240. package/dist/swap/router/providers/cowswap.js.map +0 -1
  241. package/dist/swap/router/providers/index.d.ts +0 -20
  242. package/dist/swap/router/providers/index.d.ts.map +0 -1
  243. package/dist/swap/router/providers/index.js +0 -32
  244. package/dist/swap/router/providers/index.js.map +0 -1
  245. package/dist/swap/router/providers/jupiter.d.ts +0 -12
  246. package/dist/swap/router/providers/jupiter.d.ts.map +0 -1
  247. package/dist/swap/router/providers/jupiter.js +0 -73
  248. package/dist/swap/router/providers/jupiter.js.map +0 -1
  249. package/dist/swap/router/providers/lifi.d.ts +0 -11
  250. package/dist/swap/router/providers/lifi.d.ts.map +0 -1
  251. package/dist/swap/router/providers/lifi.js +0 -123
  252. package/dist/swap/router/providers/lifi.js.map +0 -1
  253. package/dist/swap/router/providers/oneinch.d.ts +0 -13
  254. package/dist/swap/router/providers/oneinch.d.ts.map +0 -1
  255. package/dist/swap/router/providers/oneinch.js +0 -71
  256. package/dist/swap/router/providers/oneinch.js.map +0 -1
  257. package/dist/swap/router/providers/paraswap.d.ts +0 -11
  258. package/dist/swap/router/providers/paraswap.d.ts.map +0 -1
  259. package/dist/swap/router/providers/paraswap.js +0 -73
  260. package/dist/swap/router/providers/paraswap.js.map +0 -1
  261. package/dist/swap/router/providers/uniswap.d.ts +0 -31
  262. package/dist/swap/router/providers/uniswap.d.ts.map +0 -1
  263. package/dist/swap/router/providers/uniswap.js +0 -116
  264. package/dist/swap/router/providers/uniswap.js.map +0 -1
  265. package/dist/swap/router/providers/zerox.d.ts +0 -13
  266. package/dist/swap/router/providers/zerox.d.ts.map +0 -1
  267. package/dist/swap/router/providers/zerox.js +0 -94
  268. package/dist/swap/router/providers/zerox.js.map +0 -1
  269. package/dist/swap/router/router.d.ts +0 -86
  270. package/dist/swap/router/router.d.ts.map +0 -1
  271. package/dist/swap/router/router.js +0 -224
  272. package/dist/swap/router/router.js.map +0 -1
  273. package/dist/swap/router/rsi/engine.d.ts +0 -60
  274. package/dist/swap/router/rsi/engine.d.ts.map +0 -1
  275. package/dist/swap/router/rsi/engine.js +0 -483
  276. package/dist/swap/router/rsi/engine.js.map +0 -1
  277. package/dist/swap/router/rsi/index.d.ts +0 -3
  278. package/dist/swap/router/rsi/index.d.ts.map +0 -1
  279. package/dist/swap/router/rsi/index.js +0 -3
  280. package/dist/swap/router/rsi/index.js.map +0 -1
  281. package/dist/swap/router/rsi/types.d.ts +0 -106
  282. package/dist/swap/router/rsi/types.d.ts.map +0 -1
  283. package/dist/swap/router/rsi/types.js +0 -3
  284. package/dist/swap/router/rsi/types.js.map +0 -1
  285. package/dist/swap/router/types.d.ts +0 -120
  286. package/dist/swap/router/types.d.ts.map +0 -1
  287. package/dist/swap/router/types.js +0 -16
  288. package/dist/swap/router/types.js.map +0 -1
  289. package/dist/tax/engine.d.ts +0 -131
  290. package/dist/tax/engine.d.ts.map +0 -1
  291. package/dist/tax/engine.js +0 -307
  292. package/dist/tax/engine.js.map +0 -1
  293. package/dist/tax/index.d.ts +0 -9
  294. package/dist/tax/index.d.ts.map +0 -1
  295. package/dist/tax/index.js +0 -8
  296. package/dist/tax/index.js.map +0 -1
  297. package/dist/tax/lots.d.ts +0 -60
  298. package/dist/tax/lots.d.ts.map +0 -1
  299. package/dist/tax/lots.js +0 -129
  300. package/dist/tax/lots.js.map +0 -1
  301. package/dist/tax/types.d.ts +0 -113
  302. package/dist/tax/types.d.ts.map +0 -1
  303. package/dist/tax/types.js +0 -18
  304. package/dist/tax/types.js.map +0 -1
  305. package/dist/yield/index.d.ts +0 -26
  306. package/dist/yield/index.d.ts.map +0 -1
  307. package/dist/yield/index.js +0 -25
  308. package/dist/yield/index.js.map +0 -1
  309. package/dist/yield/rates.d.ts +0 -114
  310. package/dist/yield/rates.d.ts.map +0 -1
  311. package/dist/yield/rates.js +0 -351
  312. package/dist/yield/rates.js.map +0 -1
  313. package/dist/yield/types.d.ts +0 -134
  314. package/dist/yield/types.d.ts.map +0 -1
  315. package/dist/yield/types.js +0 -24
  316. package/dist/yield/types.js.map +0 -1
  317. package/dist/yield/vault.d.ts +0 -112
  318. package/dist/yield/vault.d.ts.map +0 -1
  319. package/dist/yield/vault.js +0 -264
  320. package/dist/yield/vault.js.map +0 -1
@@ -1,307 +0,0 @@
1
- /**
2
- * Tax / P&L Engine — Core Engine
3
- *
4
- * ⚠️ DISCLAIMER: This module is for informational purposes only.
5
- * Tax laws are complex, jurisdiction-specific, and change frequently.
6
- * Always consult a qualified tax professional before filing. This is NOT tax advice.
7
- *
8
- * Key rules modeled (US-centric):
9
- * - Every token swap = taxable disposal of fromToken + acquisition of toToken
10
- * - Short-term gain: held < 365 days → taxed as ordinary income
11
- * - Long-term gain: held ≥ 365 days → preferential capital gains rates
12
- * - Yield received = ordinary income (full rate)
13
- * - Gas fees = reduce net gain (treated as selling expense)
14
- * - Wash sale rule: NOT applicable to crypto as of 2024 (no legislation yet)
15
- * - Fiat on-ramp = establishes cost basis, NOT a taxable event
16
- * - Bridge (cross-chain move) = generally NOT taxable (same owner, same asset)
17
- */
18
- import { LotManager } from './lots.js';
19
- /** One year in milliseconds */
20
- const ONE_YEAR_MS = 365 * 24 * 60 * 60 * 1000;
21
- export class TaxEngine {
22
- constructor(config = {}) {
23
- this.events = [];
24
- this.gains = [];
25
- this.config = {
26
- method: 'fifo',
27
- taxYear: new Date().getFullYear(),
28
- jurisdiction: 'US',
29
- trackGasFees: true,
30
- ...config,
31
- };
32
- this.lotManager = new LotManager();
33
- }
34
- /**
35
- * Record a swap — the most common taxable event in DeFi.
36
- *
37
- * A swap creates two sub-events:
38
- * 1. Disposal of fromToken (taxable — creates realized gain/loss)
39
- * 2. Acquisition of toToken (establishes new cost basis)
40
- *
41
- * Returns the RealizedGain record, or null if no lots were tracked
42
- * (zero cost basis scenario — gain equals full proceeds).
43
- */
44
- recordSwap(params) {
45
- // 1. Dispose of fromToken lots using the configured cost basis method
46
- const disposals = this.lotManager.disposeLots({
47
- token: params.fromToken,
48
- chain: params.chain,
49
- amount: params.fromAmount,
50
- method: this.config.method,
51
- });
52
- const totalCostBasis = disposals.reduce((sum, d) => sum + d.costBasisUsed, 0);
53
- // 2. Calculate realized gain/loss
54
- // gain = proceeds − cost basis − gas fees paid
55
- const gasPaidUsd = this.config.trackGasFees ? (params.gasPaidUsd ?? 0) : 0;
56
- const realizedGainUsd = params.fromValueUsd - totalCostBasis - gasPaidUsd;
57
- // 3. Determine hold duration → short-term vs long-term
58
- const gainType = this.determineGainType(disposals, params.timestamp);
59
- // 4. Build the RealizedGain record
60
- const gain = {
61
- eventId: `swap-${params.txHash}`,
62
- txHash: params.txHash,
63
- timestamp: params.timestamp,
64
- chain: params.chain,
65
- token: params.fromToken,
66
- amountDisposed: params.fromAmount,
67
- proceedsUsd: params.fromValueUsd,
68
- costBasisUsd: totalCostBasis,
69
- realizedGainUsd,
70
- gainType,
71
- lotsUsed: disposals.map(d => ({
72
- lotId: d.lotId,
73
- amountUsed: d.amountUsed,
74
- costBasisUsed: d.costBasisUsed,
75
- })),
76
- };
77
- this.gains.push(gain);
78
- // 5. Add new lot for toToken — cost basis = fair market value at acquisition
79
- this.lotManager.addLot({
80
- id: `lot-${params.txHash}-${params.toToken}`,
81
- token: params.toToken,
82
- tokenAddress: params.toTokenAddress,
83
- chain: params.chain,
84
- amount: params.toAmount,
85
- costBasisUsd: params.toValueUsd,
86
- costBasisPerUnit: Number(params.toAmount) > 0
87
- ? params.toValueUsd / Number(params.toAmount)
88
- : 0,
89
- acquiredAt: params.timestamp,
90
- acquiredTxHash: params.txHash,
91
- acquiredFrom: 'swap',
92
- });
93
- // 6. Record the TaxEvent
94
- this.events.push({
95
- id: `event-${params.txHash}`,
96
- type: 'swap',
97
- timestamp: params.timestamp,
98
- txHash: params.txHash,
99
- chain: params.chain,
100
- disposedToken: params.fromToken,
101
- disposedAmount: params.fromAmount,
102
- disposedValueUsd: params.fromValueUsd,
103
- acquiredToken: params.toToken,
104
- acquiredAmount: params.toAmount,
105
- acquiredValueUsd: params.toValueUsd,
106
- gasPaidUsd,
107
- });
108
- // Return null if no lots were tracked (pre-existing wallet, zero cost basis)
109
- return disposals.length > 0 ? gain : null;
110
- }
111
- /**
112
- * Record yield received from a DeFi protocol (taxable as ordinary income).
113
- *
114
- * Yield is treated as income at the fair market value when received.
115
- * The cost basis of the new lot = market value at receipt.
116
- */
117
- recordYieldReceived(params) {
118
- const lotId = `lot-yield-${params.txHash ?? params.timestamp}-${params.token}`;
119
- // Add a lot — cost basis = FMV at receipt (income already recognized)
120
- this.lotManager.addLot({
121
- id: lotId,
122
- token: params.token,
123
- tokenAddress: params.tokenAddress,
124
- chain: params.chain,
125
- amount: params.amount,
126
- costBasisUsd: params.valueUsd,
127
- costBasisPerUnit: Number(params.amount) > 0
128
- ? params.valueUsd / Number(params.amount)
129
- : 0,
130
- acquiredAt: params.timestamp,
131
- acquiredTxHash: params.txHash,
132
- acquiredFrom: 'yield-received',
133
- });
134
- // Record the event (acquiredValueUsd = income amount for getSummary)
135
- this.events.push({
136
- id: `event-yield-${params.txHash ?? params.timestamp}`,
137
- type: 'yield-received',
138
- timestamp: params.timestamp,
139
- txHash: params.txHash,
140
- chain: params.chain,
141
- acquiredToken: params.token,
142
- acquiredAmount: params.amount,
143
- acquiredValueUsd: params.valueUsd,
144
- notes: `Yield from ${params.protocol}`,
145
- });
146
- }
147
- /**
148
- * Record a fiat on-ramp (buying crypto with fiat currency).
149
- *
150
- * This is NOT a taxable event — it establishes the cost basis for future disposals.
151
- * The cost basis = amount paid in fiat (USD).
152
- */
153
- recordFiatOnRamp(params) {
154
- const lotId = `lot-fiat-${params.txHash ?? params.timestamp}-${params.token}`;
155
- this.lotManager.addLot({
156
- id: lotId,
157
- token: params.token,
158
- tokenAddress: params.tokenAddress,
159
- chain: params.chain,
160
- amount: params.amount,
161
- costBasisUsd: params.paidUsd,
162
- costBasisPerUnit: Number(params.amount) > 0
163
- ? params.paidUsd / Number(params.amount)
164
- : 0,
165
- acquiredAt: params.timestamp,
166
- acquiredTxHash: params.txHash,
167
- acquiredFrom: 'fiat-on-ramp',
168
- });
169
- // Record event — not taxable, no gain created
170
- this.events.push({
171
- id: `event-fiat-${params.txHash ?? params.timestamp}`,
172
- type: 'fiat-on-ramp',
173
- timestamp: params.timestamp,
174
- txHash: params.txHash,
175
- chain: params.chain,
176
- acquiredToken: params.token,
177
- acquiredAmount: params.amount,
178
- acquiredValueUsd: params.paidUsd,
179
- notes: 'Fiat on-ramp — establishes cost basis, not taxable',
180
- });
181
- }
182
- /**
183
- * Generate an annual tax summary.
184
- *
185
- * ⚠️ For informational purposes only. Consult a tax professional.
186
- */
187
- getSummary(year) {
188
- const targetYear = year ?? this.config.taxYear;
189
- const yearStart = new Date(targetYear, 0, 1).getTime();
190
- const yearEnd = new Date(targetYear + 1, 0, 1).getTime();
191
- const yearGains = this.gains.filter(g => g.timestamp >= yearStart && g.timestamp < yearEnd);
192
- const yearEvents = this.events.filter(e => e.timestamp >= yearStart && e.timestamp < yearEnd);
193
- const shortTermGain = yearGains
194
- .filter(g => g.gainType === 'short-term')
195
- .reduce((sum, g) => sum + g.realizedGainUsd, 0);
196
- const longTermGain = yearGains
197
- .filter(g => g.gainType === 'long-term')
198
- .reduce((sum, g) => sum + g.realizedGainUsd, 0);
199
- const ordinaryIncome = yearEvents
200
- .filter(e => e.type === 'yield-received')
201
- .reduce((sum, e) => sum + (e.acquiredValueUsd ?? 0), 0);
202
- const totalGasPaid = yearEvents
203
- .reduce((sum, e) => sum + (e.gasPaidUsd ?? 0), 0);
204
- return {
205
- year: targetYear,
206
- totalProceeds: yearGains.reduce((sum, g) => sum + g.proceedsUsd, 0),
207
- totalCostBasis: yearGains.reduce((sum, g) => sum + g.costBasisUsd, 0),
208
- shortTermGain,
209
- longTermGain,
210
- totalNetGain: shortTermGain + longTermGain,
211
- ordinaryIncome,
212
- totalGasPaid,
213
- taxableEventCount: yearGains.length,
214
- };
215
- }
216
- /**
217
- * Export to CSV format compatible with TurboTax, Koinly, CoinTracker, and similar tools.
218
- *
219
- * ⚠️ For informational purposes only. Consult a tax professional.
220
- * All USD values are formatted to 2 decimal places to prevent CSV parsing issues.
221
- */
222
- exportCSV(year) {
223
- const targetYear = year ?? this.config.taxYear;
224
- const yearStart = new Date(targetYear, 0, 1).getTime();
225
- const yearEnd = new Date(targetYear + 1, 0, 1).getTime();
226
- const yearGains = this.gains.filter(g => g.timestamp >= yearStart && g.timestamp < yearEnd);
227
- const headers = [
228
- 'Date',
229
- 'Type',
230
- 'Asset',
231
- 'Proceeds (USD)',
232
- 'Cost Basis (USD)',
233
- 'Gain/Loss (USD)',
234
- 'Gain Type',
235
- 'Tx Hash',
236
- 'Chain',
237
- ];
238
- const rows = yearGains.map(g => [
239
- new Date(g.timestamp).toISOString().split('T')[0],
240
- 'Sale/Swap',
241
- g.token,
242
- g.proceedsUsd.toFixed(2),
243
- g.costBasisUsd.toFixed(2),
244
- g.realizedGainUsd.toFixed(2),
245
- g.gainType === 'long-term' ? 'Long-term' : 'Short-term',
246
- g.txHash ?? '',
247
- g.chain,
248
- ]);
249
- return [headers, ...rows].map(row => row.join(',')).join('\n');
250
- }
251
- /**
252
- * Export to JSON (for programmatic use, custom reporting, CPA handoff).
253
- *
254
- * ⚠️ For informational purposes only. Consult a tax professional.
255
- */
256
- exportJSON(year) {
257
- const summary = this.getSummary(year);
258
- const targetYear = year ?? this.config.taxYear;
259
- const yearStart = new Date(targetYear, 0, 1).getTime();
260
- const yearEnd = new Date(targetYear + 1, 0, 1).getTime();
261
- return {
262
- summary,
263
- gains: this.gains.filter(g => g.timestamp >= yearStart && g.timestamp < yearEnd),
264
- events: this.events.filter(e => e.timestamp >= yearStart && e.timestamp < yearEnd),
265
- };
266
- }
267
- /**
268
- * Export full engine state for persistence across sessions.
269
- */
270
- exportState() {
271
- return {
272
- lots: this.lotManager.exportState(),
273
- events: this.events,
274
- gains: this.gains,
275
- };
276
- }
277
- /**
278
- * Load state from a previous session (e.g., from database or JSON file).
279
- * After loading, new swaps will correctly build on existing lot inventory.
280
- */
281
- loadState(state) {
282
- this.lotManager.loadState(state.lots);
283
- this.events = state.events;
284
- this.gains = state.gains;
285
- }
286
- // ─── Private Helpers ───
287
- /**
288
- * Determine if a disposal is short-term or long-term.
289
- *
290
- * Uses the acquisition timestamp of the earliest lot consumed (conservative
291
- * for FIFO; oldest lot determines the holding period of the bulk of the disposal).
292
- *
293
- * Rule: held ≥ 365 days = long-term; held < 365 days = short-term.
294
- * If no lots were tracked, defaults to short-term (conservative).
295
- */
296
- determineGainType(disposals, disposalTimestamp) {
297
- if (disposals.length === 0)
298
- return 'short-term';
299
- // Find the earliest acquisition date among all lots used in this disposal
300
- const earliestAcquiredAt = disposals.reduce((earliest, d) => Math.min(earliest, d.acquiredAt), Infinity);
301
- if (earliestAcquiredAt === Infinity)
302
- return 'short-term';
303
- const holdDurationMs = disposalTimestamp - earliestAcquiredAt;
304
- return holdDurationMs >= ONE_YEAR_MS ? 'long-term' : 'short-term';
305
- }
306
- }
307
- //# sourceMappingURL=engine.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/tax/engine.ts"],"names":[],"mappings":"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"}
@@ -1,9 +0,0 @@
1
- /**
2
- * Tax / P&L Engine — Barrel Export
3
- *
4
- * ⚠️ DISCLAIMER: For informational purposes only. Consult a tax professional.
5
- */
6
- export type { TaxEventType, CostBasisMethod, GainType, TaxLot, TaxEvent, RealizedGain, TaxSummary, TaxExportRow, TaxEngineConfig, } from './types.js';
7
- export { LotManager } from './lots.js';
8
- export { TaxEngine } from './engine.js';
9
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tax/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,YAAY,EACZ,eAAe,EACf,QAAQ,EACR,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,eAAe,GAChB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
package/dist/tax/index.js DELETED
@@ -1,8 +0,0 @@
1
- /**
2
- * Tax / P&L Engine — Barrel Export
3
- *
4
- * ⚠️ DISCLAIMER: For informational purposes only. Consult a tax professional.
5
- */
6
- export { LotManager } from './lots.js';
7
- export { TaxEngine } from './engine.js';
8
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tax/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
@@ -1,60 +0,0 @@
1
- /**
2
- * Tax / P&L Engine — Cost Basis Lot Manager
3
- *
4
- * ⚠️ DISCLAIMER: For informational purposes only. Consult a tax professional.
5
- *
6
- * Manages tax lots (individual purchase/acquisition records) for each token.
7
- * Supports FIFO, LIFO, and Specific Identification disposal ordering.
8
- */
9
- import type { TaxLot, CostBasisMethod } from './types.js';
10
- export declare class LotManager {
11
- private lots;
12
- private getLotKey;
13
- /**
14
- * Add a new tax lot (e.g., after buying or receiving a token).
15
- */
16
- addLot(lot: TaxLot): void;
17
- /**
18
- * Get all lots for a token on a specific chain.
19
- */
20
- getLots(token: string, chain: string): TaxLot[];
21
- /**
22
- * Get a specific lot by ID (used by determineGainType for acquisition date lookup).
23
- */
24
- getLotById(lotId: string): TaxLot | undefined;
25
- /**
26
- * Dispose of lots using FIFO / LIFO / Specific Identification.
27
- * Updates the lot inventory in place and returns an audit trail of disposals.
28
- *
29
- * If no lots are tracked (pre-existing wallet), returns [] with zero cost basis.
30
- */
31
- disposeLots(params: {
32
- token: string;
33
- chain: string;
34
- amount: bigint;
35
- method: CostBasisMethod;
36
- specificLotIds?: string[];
37
- }): Array<{
38
- lotId: string;
39
- amountUsed: bigint;
40
- costBasisUsed: number;
41
- acquiredAt: number;
42
- }>;
43
- /**
44
- * Get total holdings across all lots for a token on a chain.
45
- */
46
- getTotalHolding(token: string, chain: string): {
47
- amount: bigint;
48
- costBasisUsd: number;
49
- };
50
- /**
51
- * Export lot state for persistence (e.g., to database or JSON file).
52
- * Note: bigint values will need special serialization if persisting to JSON.
53
- */
54
- exportState(): Record<string, TaxLot[]>;
55
- /**
56
- * Load lot state from a previous session.
57
- */
58
- loadState(state: Record<string, TaxLot[]>): void;
59
- }
60
- //# sourceMappingURL=lots.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lots.d.ts","sourceRoot":"","sources":["../../src/tax/lots.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE1D,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAoC;IAEhD,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOzB;;OAEG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAI/C;;OAEG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAQ7C;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE;QAClB,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,eAAe,CAAC;QACxB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;KAC3B,GAAG,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IA2D3F;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE;IAQvF;;;OAGG;IACH,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;IAQvC;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;CAGjD"}
package/dist/tax/lots.js DELETED
@@ -1,129 +0,0 @@
1
- /**
2
- * Tax / P&L Engine — Cost Basis Lot Manager
3
- *
4
- * ⚠️ DISCLAIMER: For informational purposes only. Consult a tax professional.
5
- *
6
- * Manages tax lots (individual purchase/acquisition records) for each token.
7
- * Supports FIFO, LIFO, and Specific Identification disposal ordering.
8
- */
9
- export class LotManager {
10
- constructor() {
11
- this.lots = new Map(); // key: "chain:token"
12
- }
13
- getLotKey(token, chain) {
14
- return `${chain}:${token}`;
15
- }
16
- /**
17
- * Add a new tax lot (e.g., after buying or receiving a token).
18
- */
19
- addLot(lot) {
20
- const key = this.getLotKey(lot.token, lot.chain);
21
- const existing = this.lots.get(key) ?? [];
22
- existing.push(lot);
23
- this.lots.set(key, existing);
24
- }
25
- /**
26
- * Get all lots for a token on a specific chain.
27
- */
28
- getLots(token, chain) {
29
- return this.lots.get(this.getLotKey(token, chain)) ?? [];
30
- }
31
- /**
32
- * Get a specific lot by ID (used by determineGainType for acquisition date lookup).
33
- */
34
- getLotById(lotId) {
35
- for (const lots of this.lots.values()) {
36
- const found = lots.find(l => l.id === lotId);
37
- if (found)
38
- return found;
39
- }
40
- return undefined;
41
- }
42
- /**
43
- * Dispose of lots using FIFO / LIFO / Specific Identification.
44
- * Updates the lot inventory in place and returns an audit trail of disposals.
45
- *
46
- * If no lots are tracked (pre-existing wallet), returns [] with zero cost basis.
47
- */
48
- disposeLots(params) {
49
- const key = this.getLotKey(params.token, params.chain);
50
- let lots = this.lots.get(key) ?? [];
51
- if (lots.length === 0) {
52
- // No lots tracked — zero cost basis (common for pre-existing wallets)
53
- return [];
54
- }
55
- // Order lots by method
56
- let sorted;
57
- if (params.method === 'fifo') {
58
- sorted = [...lots].sort((a, b) => a.acquiredAt - b.acquiredAt);
59
- }
60
- else if (params.method === 'lifo') {
61
- sorted = [...lots].sort((a, b) => b.acquiredAt - a.acquiredAt);
62
- }
63
- else {
64
- // specific-id: use only the explicitly requested lots
65
- sorted = lots.filter(l => params.specificLotIds?.includes(l.id));
66
- }
67
- const disposals = [];
68
- let remaining = params.amount;
69
- for (const lot of sorted) {
70
- if (remaining === 0n)
71
- break;
72
- const amountUsed = remaining > lot.amount ? lot.amount : remaining;
73
- const fraction = Number(amountUsed) / Number(lot.amount);
74
- const costBasisUsed = lot.costBasisUsd * fraction;
75
- disposals.push({
76
- lotId: lot.id,
77
- amountUsed,
78
- costBasisUsed,
79
- acquiredAt: lot.acquiredAt,
80
- });
81
- remaining -= amountUsed;
82
- // Update the lot inventory
83
- if (amountUsed === lot.amount) {
84
- // Lot fully consumed — remove it
85
- lots = lots.filter(l => l.id !== lot.id);
86
- }
87
- else {
88
- // Lot partially consumed — reduce amount and cost basis; perUnit stays unchanged
89
- const idx = lots.findIndex(l => l.id === lot.id);
90
- lots[idx] = {
91
- ...lot,
92
- amount: lot.amount - amountUsed,
93
- costBasisUsd: lot.costBasisUsd * (1 - fraction),
94
- costBasisPerUnit: lot.costBasisPerUnit, // unchanged — reflects original purchase price
95
- };
96
- }
97
- }
98
- this.lots.set(key, lots);
99
- return disposals;
100
- }
101
- /**
102
- * Get total holdings across all lots for a token on a chain.
103
- */
104
- getTotalHolding(token, chain) {
105
- const lots = this.getLots(token, chain);
106
- return {
107
- amount: lots.reduce((sum, l) => sum + l.amount, 0n),
108
- costBasisUsd: lots.reduce((sum, l) => sum + l.costBasisUsd, 0),
109
- };
110
- }
111
- /**
112
- * Export lot state for persistence (e.g., to database or JSON file).
113
- * Note: bigint values will need special serialization if persisting to JSON.
114
- */
115
- exportState() {
116
- const state = {};
117
- for (const [key, lots] of this.lots) {
118
- state[key] = lots;
119
- }
120
- return state;
121
- }
122
- /**
123
- * Load lot state from a previous session.
124
- */
125
- loadState(state) {
126
- this.lots = new Map(Object.entries(state));
127
- }
128
- }
129
- //# sourceMappingURL=lots.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lots.js","sourceRoot":"","sources":["../../src/tax/lots.ts"],"names":[],"mappings":"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"}
@@ -1,113 +0,0 @@
1
- /**
2
- * Tax / P&L Engine — Types
3
- *
4
- * ⚠️ DISCLAIMER: This module is for informational purposes only.
5
- * Tax laws vary by jurisdiction and change frequently. Always consult
6
- * a qualified tax professional before filing. This is NOT tax advice.
7
- *
8
- * Models IRS rules for crypto (US-centric, adaptable):
9
- * - FIFO / LIFO / Specific Identification cost basis methods
10
- * - Short-term capital gains: held < 365 days (taxed as ordinary income)
11
- * - Long-term capital gains: held ≥ 365 days (preferential rates)
12
- * - Wash sale rule: NOT currently applicable to crypto (as of 2024) — noted here
13
- * for awareness. If legislation changes, this engine will need updating.
14
- * - Yield / interest received = ordinary income (taxed at full rate)
15
- * - Gas fees = deductible as part of cost basis / selling expenses
16
- */
17
- export type TaxEventType = 'swap' | 'deposit' | 'withdrawal' | 'yield-received' | 'bridge' | 'gas-paid' | 'fiat-on-ramp';
18
- export type CostBasisMethod = 'fifo' | 'lifo' | 'specific-id';
19
- export type GainType = 'short-term' | 'long-term';
20
- export interface TaxLot {
21
- id: string;
22
- token: string;
23
- tokenAddress: string;
24
- chain: string;
25
- amount: bigint;
26
- costBasisUsd: number;
27
- costBasisPerUnit: number;
28
- acquiredAt: number;
29
- acquiredTxHash?: string;
30
- acquiredFrom: TaxEventType;
31
- }
32
- export interface TaxEvent {
33
- id: string;
34
- type: TaxEventType;
35
- timestamp: number;
36
- txHash?: string;
37
- chain: string;
38
- /** For swaps: token disposed of */
39
- disposedToken?: string;
40
- disposedAmount?: bigint;
41
- disposedValueUsd?: number;
42
- /** For swaps: token acquired */
43
- acquiredToken?: string;
44
- acquiredAmount?: bigint;
45
- acquiredValueUsd?: number;
46
- /** Gas paid in USD */
47
- gasPaidUsd?: number;
48
- /** Notes */
49
- notes?: string;
50
- }
51
- export interface RealizedGain {
52
- eventId: string;
53
- txHash?: string;
54
- timestamp: number;
55
- chain: string;
56
- token: string;
57
- /** Amount disposed */
58
- amountDisposed: bigint;
59
- /** Sale proceeds (market value at disposal) */
60
- proceedsUsd: number;
61
- /** Cost basis of lots disposed */
62
- costBasisUsd: number;
63
- /** Realized gain (proceeds - costBasis - fees) */
64
- realizedGainUsd: number;
65
- /** Short or long term */
66
- gainType: GainType;
67
- /** Lots used (for audit trail) */
68
- lotsUsed: Array<{
69
- lotId: string;
70
- amountUsed: bigint;
71
- costBasisUsed: number;
72
- }>;
73
- }
74
- export interface TaxSummary {
75
- year: number;
76
- totalProceeds: number;
77
- totalCostBasis: number;
78
- /** Short-term gains (< 1 year hold) */
79
- shortTermGain: number;
80
- /** Long-term gains (≥ 1 year hold) */
81
- longTermGain: number;
82
- /** Total net gain */
83
- totalNetGain: number;
84
- /** Total yield/interest received (ordinary income) */
85
- ordinaryIncome: number;
86
- /** Total gas fees paid (cost basis adjustments) */
87
- totalGasPaid: number;
88
- /** Number of taxable events */
89
- taxableEventCount: number;
90
- }
91
- export interface TaxExportRow {
92
- date: string;
93
- type: string;
94
- asset: string;
95
- amount: string;
96
- proceeds: string;
97
- costBasis: string;
98
- gain: string;
99
- gainType: string;
100
- txHash: string;
101
- chain: string;
102
- }
103
- export interface TaxEngineConfig {
104
- /** Cost basis method (default: 'fifo') */
105
- method?: CostBasisMethod;
106
- /** Tax year for summary (default: current year) */
107
- taxYear?: number;
108
- /** Your jurisdiction (default: 'US') */
109
- jurisdiction?: 'US' | 'EU' | 'UK' | 'OTHER';
110
- /** Track gas fees as deductible expenses (default: true) */
111
- trackGasFees?: boolean;
112
- }
113
- //# sourceMappingURL=types.d.ts.map