@t2000/sdk 0.17.21 → 0.17.23

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 (254) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/cetus.d.ts +29 -0
  3. package/dist/adapters/cetus.d.ts.map +1 -0
  4. package/dist/adapters/cetus.js +74 -0
  5. package/dist/adapters/cetus.js.map +1 -0
  6. package/dist/adapters/cetus.test.d.ts +2 -0
  7. package/dist/adapters/cetus.test.d.ts.map +1 -0
  8. package/dist/adapters/cetus.test.js +57 -0
  9. package/dist/adapters/cetus.test.js.map +1 -0
  10. package/dist/adapters/compliance.test.d.ts +8 -0
  11. package/dist/adapters/compliance.test.d.ts.map +1 -0
  12. package/dist/adapters/compliance.test.js +202 -0
  13. package/dist/adapters/compliance.test.js.map +1 -0
  14. package/dist/adapters/index.d.ts +10 -4
  15. package/dist/adapters/index.d.ts.map +1 -0
  16. package/dist/adapters/index.js +15 -2107
  17. package/dist/adapters/index.js.map +1 -1
  18. package/dist/adapters/navi.d.ts +41 -0
  19. package/dist/adapters/navi.d.ts.map +1 -0
  20. package/dist/adapters/navi.js +102 -0
  21. package/dist/adapters/navi.js.map +1 -0
  22. package/dist/adapters/navi.test.d.ts +2 -0
  23. package/dist/adapters/navi.test.d.ts.map +1 -0
  24. package/dist/adapters/navi.test.js +164 -0
  25. package/dist/adapters/navi.test.js.map +1 -0
  26. package/dist/adapters/registry.d.ts +47 -0
  27. package/dist/adapters/registry.d.ts.map +1 -0
  28. package/dist/adapters/registry.js +162 -0
  29. package/dist/adapters/registry.js.map +1 -0
  30. package/dist/adapters/registry.test.d.ts +2 -0
  31. package/dist/adapters/registry.test.d.ts.map +1 -0
  32. package/dist/adapters/registry.test.js +197 -0
  33. package/dist/adapters/registry.test.js.map +1 -0
  34. package/dist/adapters/suilend.d.ts +71 -0
  35. package/dist/adapters/suilend.d.ts.map +1 -0
  36. package/dist/adapters/suilend.js +826 -0
  37. package/dist/adapters/suilend.js.map +1 -0
  38. package/dist/adapters/suilend.test.d.ts +2 -0
  39. package/dist/adapters/suilend.test.d.ts.map +1 -0
  40. package/dist/adapters/suilend.test.js +294 -0
  41. package/dist/adapters/suilend.test.js.map +1 -0
  42. package/dist/adapters/types.d.ts +160 -0
  43. package/dist/adapters/types.d.ts.map +1 -0
  44. package/dist/adapters/types.js +2 -0
  45. package/dist/adapters/types.js.map +1 -0
  46. package/dist/auto-invest.d.ts +23 -0
  47. package/dist/auto-invest.d.ts.map +1 -0
  48. package/dist/auto-invest.js +131 -0
  49. package/dist/auto-invest.js.map +1 -0
  50. package/dist/auto-invest.test.d.ts +2 -0
  51. package/dist/auto-invest.test.d.ts.map +1 -0
  52. package/dist/auto-invest.test.js +220 -0
  53. package/dist/auto-invest.test.js.map +1 -0
  54. package/dist/constants.d.ts +177 -0
  55. package/dist/constants.d.ts.map +1 -0
  56. package/dist/constants.js +135 -0
  57. package/dist/constants.js.map +1 -0
  58. package/dist/contacts.d.ts +25 -0
  59. package/dist/contacts.d.ts.map +1 -0
  60. package/dist/contacts.js +83 -0
  61. package/dist/contacts.js.map +1 -0
  62. package/dist/contacts.test.d.ts +2 -0
  63. package/dist/contacts.test.d.ts.map +1 -0
  64. package/dist/contacts.test.js +164 -0
  65. package/dist/contacts.test.js.map +1 -0
  66. package/dist/errors.d.ts +26 -0
  67. package/dist/errors.d.ts.map +1 -0
  68. package/dist/errors.js +81 -0
  69. package/dist/errors.js.map +1 -0
  70. package/dist/errors.test.d.ts +2 -0
  71. package/dist/errors.test.d.ts.map +1 -0
  72. package/dist/errors.test.js +48 -0
  73. package/dist/errors.test.js.map +1 -0
  74. package/dist/gas/autoTopUp.d.ts +18 -0
  75. package/dist/gas/autoTopUp.d.ts.map +1 -0
  76. package/dist/gas/autoTopUp.js +55 -0
  77. package/dist/gas/autoTopUp.js.map +1 -0
  78. package/dist/gas/autoTopUp.test.d.ts +2 -0
  79. package/dist/gas/autoTopUp.test.d.ts.map +1 -0
  80. package/dist/gas/autoTopUp.test.js +59 -0
  81. package/dist/gas/autoTopUp.test.js.map +1 -0
  82. package/dist/gas/gasStation.d.ts +23 -0
  83. package/dist/gas/gasStation.d.ts.map +1 -0
  84. package/dist/gas/gasStation.js +58 -0
  85. package/dist/gas/gasStation.js.map +1 -0
  86. package/dist/gas/index.d.ts +4 -0
  87. package/dist/gas/index.d.ts.map +1 -0
  88. package/dist/gas/index.js +4 -0
  89. package/dist/gas/index.js.map +1 -0
  90. package/dist/gas/manager.d.ts +24 -0
  91. package/dist/gas/manager.d.ts.map +1 -0
  92. package/dist/gas/manager.js +142 -0
  93. package/dist/gas/manager.js.map +1 -0
  94. package/dist/gas/manager.test.d.ts +2 -0
  95. package/dist/gas/manager.test.d.ts.map +1 -0
  96. package/dist/gas/manager.test.js +220 -0
  97. package/dist/gas/manager.test.js.map +1 -0
  98. package/dist/gas/serialization.test.d.ts +2 -0
  99. package/dist/gas/serialization.test.d.ts.map +1 -0
  100. package/dist/gas/serialization.test.js +47 -0
  101. package/dist/gas/serialization.test.js.map +1 -0
  102. package/dist/index.d.ts +30 -649
  103. package/dist/index.d.ts.map +1 -0
  104. package/dist/index.js +21 -6053
  105. package/dist/index.js.map +1 -1
  106. package/dist/invest.test.d.ts +2 -0
  107. package/dist/invest.test.d.ts.map +1 -0
  108. package/dist/invest.test.js +256 -0
  109. package/dist/invest.test.js.map +1 -0
  110. package/dist/portfolio.d.ts +39 -0
  111. package/dist/portfolio.d.ts.map +1 -0
  112. package/dist/portfolio.js +201 -0
  113. package/dist/portfolio.js.map +1 -0
  114. package/dist/portfolio.test.d.ts +2 -0
  115. package/dist/portfolio.test.d.ts.map +1 -0
  116. package/dist/portfolio.test.js +301 -0
  117. package/dist/portfolio.test.js.map +1 -0
  118. package/dist/protocols/cetus.d.ts +73 -0
  119. package/dist/protocols/cetus.d.ts.map +1 -0
  120. package/dist/protocols/cetus.js +267 -0
  121. package/dist/protocols/cetus.js.map +1 -0
  122. package/dist/protocols/cetus.test.d.ts +2 -0
  123. package/dist/protocols/cetus.test.d.ts.map +1 -0
  124. package/dist/protocols/cetus.test.js +325 -0
  125. package/dist/protocols/cetus.test.js.map +1 -0
  126. package/dist/protocols/navi.d.ts +59 -0
  127. package/dist/protocols/navi.d.ts.map +1 -0
  128. package/dist/protocols/navi.js +945 -0
  129. package/dist/protocols/navi.js.map +1 -0
  130. package/dist/protocols/navi.test.d.ts +2 -0
  131. package/dist/protocols/navi.test.d.ts.map +1 -0
  132. package/dist/protocols/navi.test.js +339 -0
  133. package/dist/protocols/navi.test.js.map +1 -0
  134. package/dist/protocols/protocolFee.d.ts +17 -0
  135. package/dist/protocols/protocolFee.d.ts.map +1 -0
  136. package/dist/protocols/protocolFee.js +62 -0
  137. package/dist/protocols/protocolFee.js.map +1 -0
  138. package/dist/protocols/protocolFee.test.d.ts +2 -0
  139. package/dist/protocols/protocolFee.test.d.ts.map +1 -0
  140. package/dist/protocols/protocolFee.test.js +137 -0
  141. package/dist/protocols/protocolFee.test.js.map +1 -0
  142. package/dist/protocols/sentinel.d.ts +18 -0
  143. package/dist/protocols/sentinel.d.ts.map +1 -0
  144. package/dist/protocols/sentinel.js +188 -0
  145. package/dist/protocols/sentinel.js.map +1 -0
  146. package/dist/protocols/sentinel.test.d.ts +2 -0
  147. package/dist/protocols/sentinel.test.d.ts.map +1 -0
  148. package/dist/protocols/sentinel.test.js +199 -0
  149. package/dist/protocols/sentinel.test.js.map +1 -0
  150. package/dist/protocols/yieldTracker.d.ts +6 -0
  151. package/dist/protocols/yieldTracker.d.ts.map +1 -0
  152. package/dist/protocols/yieldTracker.js +29 -0
  153. package/dist/protocols/yieldTracker.js.map +1 -0
  154. package/dist/safeguards/enforcer.d.ts +18 -0
  155. package/dist/safeguards/enforcer.d.ts.map +1 -0
  156. package/dist/safeguards/enforcer.js +130 -0
  157. package/dist/safeguards/enforcer.js.map +1 -0
  158. package/dist/safeguards/enforcer.test.d.ts +2 -0
  159. package/dist/safeguards/enforcer.test.d.ts.map +1 -0
  160. package/dist/safeguards/enforcer.test.js +212 -0
  161. package/dist/safeguards/enforcer.test.js.map +1 -0
  162. package/dist/safeguards/errors.d.ts +24 -0
  163. package/dist/safeguards/errors.d.ts.map +1 -0
  164. package/dist/safeguards/errors.js +31 -0
  165. package/dist/safeguards/errors.js.map +1 -0
  166. package/dist/safeguards/index.d.ts +6 -0
  167. package/dist/safeguards/index.d.ts.map +1 -0
  168. package/dist/safeguards/index.js +4 -0
  169. package/dist/safeguards/index.js.map +1 -0
  170. package/dist/safeguards/types.d.ts +16 -0
  171. package/dist/safeguards/types.d.ts.map +1 -0
  172. package/dist/safeguards/types.js +13 -0
  173. package/dist/safeguards/types.js.map +1 -0
  174. package/dist/strategy.d.ts +22 -0
  175. package/dist/strategy.d.ts.map +1 -0
  176. package/dist/strategy.js +113 -0
  177. package/dist/strategy.js.map +1 -0
  178. package/dist/strategy.test.d.ts +2 -0
  179. package/dist/strategy.test.d.ts.map +1 -0
  180. package/dist/strategy.test.js +212 -0
  181. package/dist/strategy.test.js.map +1 -0
  182. package/dist/t2000.d.ts +218 -0
  183. package/dist/t2000.d.ts.map +1 -0
  184. package/dist/t2000.integration.test.d.ts +2 -0
  185. package/dist/t2000.integration.test.d.ts.map +1 -0
  186. package/dist/t2000.integration.test.js +954 -0
  187. package/dist/t2000.integration.test.js.map +1 -0
  188. package/dist/t2000.js +2395 -0
  189. package/dist/t2000.js.map +1 -0
  190. package/dist/types.d.ts +419 -0
  191. package/dist/types.d.ts.map +1 -0
  192. package/dist/types.js +2 -0
  193. package/dist/types.js.map +1 -0
  194. package/dist/utils/format.d.ts +22 -0
  195. package/dist/utils/format.d.ts.map +1 -0
  196. package/dist/utils/format.js +71 -0
  197. package/dist/utils/format.js.map +1 -0
  198. package/dist/utils/format.test.d.ts +2 -0
  199. package/dist/utils/format.test.d.ts.map +1 -0
  200. package/dist/utils/format.test.js +187 -0
  201. package/dist/utils/format.test.js.map +1 -0
  202. package/dist/utils/hashcash.d.ts +2 -0
  203. package/dist/utils/hashcash.d.ts.map +1 -0
  204. package/dist/utils/hashcash.js +27 -0
  205. package/dist/utils/hashcash.js.map +1 -0
  206. package/dist/utils/hashcash.test.d.ts +2 -0
  207. package/dist/utils/hashcash.test.d.ts.map +1 -0
  208. package/dist/utils/hashcash.test.js +40 -0
  209. package/dist/utils/hashcash.test.js.map +1 -0
  210. package/dist/utils/retry.d.ts +9 -0
  211. package/dist/utils/retry.d.ts.map +1 -0
  212. package/dist/utils/retry.js +47 -0
  213. package/dist/utils/retry.js.map +1 -0
  214. package/dist/utils/simulate.d.ts +15 -0
  215. package/dist/utils/simulate.d.ts.map +1 -0
  216. package/dist/utils/simulate.js +75 -0
  217. package/dist/utils/simulate.js.map +1 -0
  218. package/dist/utils/simulate.test.d.ts +2 -0
  219. package/dist/utils/simulate.test.d.ts.map +1 -0
  220. package/dist/utils/simulate.test.js +80 -0
  221. package/dist/utils/simulate.test.js.map +1 -0
  222. package/dist/utils/sui.d.ts +6 -0
  223. package/dist/utils/sui.d.ts.map +1 -0
  224. package/dist/utils/sui.js +28 -0
  225. package/dist/utils/sui.js.map +1 -0
  226. package/dist/utils/sui.test.d.ts +2 -0
  227. package/dist/utils/sui.test.d.ts.map +1 -0
  228. package/dist/utils/sui.test.js +58 -0
  229. package/dist/utils/sui.test.js.map +1 -0
  230. package/dist/wallet/balance.d.ts +4 -0
  231. package/dist/wallet/balance.d.ts.map +1 -0
  232. package/dist/wallet/balance.js +98 -0
  233. package/dist/wallet/balance.js.map +1 -0
  234. package/dist/wallet/history.d.ts +4 -0
  235. package/dist/wallet/history.d.ts.map +1 -0
  236. package/dist/wallet/history.js +38 -0
  237. package/dist/wallet/history.js.map +1 -0
  238. package/dist/wallet/keyManager.d.ts +9 -0
  239. package/dist/wallet/keyManager.d.ts.map +1 -0
  240. package/dist/wallet/keyManager.js +113 -0
  241. package/dist/wallet/keyManager.js.map +1 -0
  242. package/dist/wallet/keyManager.test.d.ts +2 -0
  243. package/dist/wallet/keyManager.test.d.ts.map +1 -0
  244. package/dist/wallet/keyManager.test.js +55 -0
  245. package/dist/wallet/keyManager.test.js.map +1 -0
  246. package/dist/wallet/send.d.ts +24 -0
  247. package/dist/wallet/send.d.ts.map +1 -0
  248. package/dist/wallet/send.js +95 -0
  249. package/dist/wallet/send.js.map +1 -0
  250. package/dist/wallet/send.test.d.ts +2 -0
  251. package/dist/wallet/send.test.d.ts.map +1 -0
  252. package/dist/wallet/send.test.js +69 -0
  253. package/dist/wallet/send.test.js.map +1 -0
  254. package/package.json +1 -1
@@ -0,0 +1,220 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { Transaction } from '@mysten/sui/transactions';
3
+ import { T2000Error } from '../errors.js';
4
+ // Mock all external dependencies before importing the module under test
5
+ vi.mock('./autoTopUp.js', () => ({
6
+ shouldAutoTopUp: vi.fn(),
7
+ executeAutoTopUp: vi.fn(),
8
+ }));
9
+ vi.mock('./gasStation.js', () => ({
10
+ requestGasSponsorship: vi.fn(),
11
+ reportGasUsage: vi.fn(),
12
+ }));
13
+ // Import after mocks are set up
14
+ import { executeWithGas } from './manager.js';
15
+ import { shouldAutoTopUp, executeAutoTopUp } from './autoTopUp.js';
16
+ import { requestGasSponsorship } from './gasStation.js';
17
+ const MOCK_DIGEST = 'MockTxDigest123456789';
18
+ const MOCK_EFFECTS = {
19
+ gasUsed: {
20
+ computationCost: '1000000',
21
+ storageCost: '2000000',
22
+ storageRebate: '500000',
23
+ },
24
+ };
25
+ function mockClient(suiBalance) {
26
+ return {
27
+ getBalance: vi.fn().mockResolvedValue({ totalBalance: suiBalance.toString() }),
28
+ signAndExecuteTransaction: vi.fn().mockResolvedValue({
29
+ digest: MOCK_DIGEST,
30
+ effects: MOCK_EFFECTS,
31
+ }),
32
+ executeTransactionBlock: vi.fn().mockResolvedValue({
33
+ digest: MOCK_DIGEST,
34
+ effects: MOCK_EFFECTS,
35
+ }),
36
+ waitForTransaction: vi.fn().mockResolvedValue({}),
37
+ };
38
+ }
39
+ function mockKeypair() {
40
+ return {
41
+ getPublicKey: () => ({
42
+ toSuiAddress: () => '0x' + 'a'.repeat(64),
43
+ }),
44
+ signTransaction: vi.fn().mockResolvedValue({ signature: 'mock-sig' }),
45
+ };
46
+ }
47
+ function buildTx() {
48
+ const tx = new Transaction();
49
+ return tx;
50
+ }
51
+ describe('executeWithGas', () => {
52
+ beforeEach(() => {
53
+ vi.clearAllMocks();
54
+ });
55
+ describe('Step 1: Self-funded', () => {
56
+ it('uses self-funded when SUI balance >= 0.05', async () => {
57
+ const client = mockClient(100000000n); // 0.1 SUI
58
+ const keypair = mockKeypair();
59
+ const result = await executeWithGas(client, keypair, () => buildTx());
60
+ expect(result.gasMethod).toBe('self-funded');
61
+ expect(result.digest).toBe(MOCK_DIGEST);
62
+ expect(result.gasCostSui).toBeGreaterThan(0);
63
+ });
64
+ it('skips self-funded when SUI balance < 0.05', async () => {
65
+ const client = mockClient(1000000n); // 0.001 SUI — too low
66
+ const keypair = mockKeypair();
67
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(true);
68
+ vi.mocked(executeAutoTopUp).mockResolvedValue({
69
+ success: true,
70
+ tx: 'topup-digest',
71
+ usdcSpent: 1,
72
+ suiReceived: 0.3,
73
+ });
74
+ // After topup, balance check will still use the mock that returns low balance
75
+ // but the second signAndExecuteTransaction call will succeed
76
+ // We need the getBalance mock to return enough after topup
77
+ const balanceMock = vi.fn()
78
+ .mockResolvedValueOnce({ totalBalance: '1000000' }) // Step 1: too low
79
+ .mockResolvedValueOnce({ totalBalance: '1000000' }) // shouldAutoTopUp check
80
+ .mockResolvedValueOnce({ totalBalance: '1000000' }) // shouldAutoTopUp check (USDC)
81
+ .mockResolvedValueOnce({ totalBalance: '100000000' }); // Step 2: after topup, enough
82
+ client.getBalance = balanceMock;
83
+ const result = await executeWithGas(client, keypair, () => buildTx());
84
+ expect(result.gasMethod).toBe('auto-topup');
85
+ });
86
+ });
87
+ describe('Step 2: Auto-topup', () => {
88
+ it('swaps USDC→SUI then executes self-funded', async () => {
89
+ const client = mockClient(1000000n); // low SUI
90
+ const keypair = mockKeypair();
91
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(true);
92
+ vi.mocked(executeAutoTopUp).mockResolvedValue({
93
+ success: true,
94
+ tx: 'topup-digest',
95
+ usdcSpent: 1,
96
+ suiReceived: 0.3,
97
+ });
98
+ const result = await executeWithGas(client, keypair, () => buildTx());
99
+ expect(vi.mocked(executeAutoTopUp)).toHaveBeenCalledOnce();
100
+ expect(result.gasMethod).toBe('auto-topup');
101
+ expect(result.digest).toBe(MOCK_DIGEST);
102
+ });
103
+ it('falls through to sponsored when auto-topup fails', async () => {
104
+ const client = mockClient(1000000n); // low SUI
105
+ const keypair = mockKeypair();
106
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(true);
107
+ vi.mocked(executeAutoTopUp).mockRejectedValue(new Error('auto-topup failed'));
108
+ // Setup sponsored path
109
+ vi.mocked(requestGasSponsorship).mockResolvedValue({
110
+ txBytes: Buffer.from('mock-tx').toString('base64'),
111
+ sponsorSignature: 'mock-sponsor-sig',
112
+ type: 'fallback',
113
+ });
114
+ // buildTx for sponsored path calls tx.build() which needs client
115
+ // We mock the sponsored path to succeed
116
+ const buildSpy = vi.spyOn(Transaction.prototype, 'build')
117
+ .mockResolvedValue(new Uint8Array([1, 2, 3]));
118
+ const result = await executeWithGas(client, keypair, () => buildTx());
119
+ expect(result.gasMethod).toBe('sponsored');
120
+ buildSpy.mockRestore();
121
+ });
122
+ it('skips auto-topup when shouldAutoTopUp returns false', async () => {
123
+ const client = mockClient(1000000n); // low SUI
124
+ const keypair = mockKeypair();
125
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(false);
126
+ // Sponsored path
127
+ vi.mocked(requestGasSponsorship).mockResolvedValue({
128
+ txBytes: Buffer.from('mock-tx').toString('base64'),
129
+ sponsorSignature: 'mock-sponsor-sig',
130
+ type: 'fallback',
131
+ });
132
+ const buildSpy = vi.spyOn(Transaction.prototype, 'build')
133
+ .mockResolvedValue(new Uint8Array([1, 2, 3]));
134
+ const result = await executeWithGas(client, keypair, () => buildTx());
135
+ expect(vi.mocked(executeAutoTopUp)).not.toHaveBeenCalled();
136
+ expect(result.gasMethod).toBe('sponsored');
137
+ buildSpy.mockRestore();
138
+ });
139
+ });
140
+ describe('Step 3: Sponsored', () => {
141
+ it('uses gas station when self-funded and auto-topup both fail', async () => {
142
+ const client = mockClient(1000000n); // low SUI
143
+ const keypair = mockKeypair();
144
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(false);
145
+ vi.mocked(requestGasSponsorship).mockResolvedValue({
146
+ txBytes: Buffer.from('mock-tx').toString('base64'),
147
+ sponsorSignature: 'mock-sponsor-sig',
148
+ type: 'fallback',
149
+ });
150
+ const buildSpy = vi.spyOn(Transaction.prototype, 'build')
151
+ .mockResolvedValue(new Uint8Array([1, 2, 3]));
152
+ const result = await executeWithGas(client, keypair, () => buildTx());
153
+ expect(result.gasMethod).toBe('sponsored');
154
+ expect(vi.mocked(requestGasSponsorship)).toHaveBeenCalledOnce();
155
+ buildSpy.mockRestore();
156
+ });
157
+ });
158
+ describe('Step 4: All methods exhausted', () => {
159
+ it('throws INSUFFICIENT_GAS when all methods fail', async () => {
160
+ const client = mockClient(1000000n); // low SUI
161
+ const keypair = mockKeypair();
162
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(false);
163
+ vi.mocked(requestGasSponsorship).mockRejectedValue(new Error('gas station down'));
164
+ const buildSpy = vi.spyOn(Transaction.prototype, 'build')
165
+ .mockResolvedValue(new Uint8Array([1, 2, 3]));
166
+ await expect(executeWithGas(client, keypair, () => buildTx())).rejects.toThrow('No SUI for gas');
167
+ buildSpy.mockRestore();
168
+ });
169
+ it('error has correct code', async () => {
170
+ const client = mockClient(1000000n);
171
+ const keypair = mockKeypair();
172
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(false);
173
+ vi.mocked(requestGasSponsorship).mockRejectedValue(new Error('down'));
174
+ const buildSpy = vi.spyOn(Transaction.prototype, 'build')
175
+ .mockResolvedValue(new Uint8Array([1, 2, 3]));
176
+ try {
177
+ await executeWithGas(client, keypair, () => buildTx());
178
+ expect.unreachable('should have thrown');
179
+ }
180
+ catch (err) {
181
+ expect(err).toBeInstanceOf(T2000Error);
182
+ expect(err.code).toBe('INSUFFICIENT_GAS');
183
+ }
184
+ buildSpy.mockRestore();
185
+ });
186
+ });
187
+ describe('buildTx callback', () => {
188
+ it('calls buildTx fresh for each gas strategy attempt', async () => {
189
+ const client = mockClient(1000000n); // low SUI — skip step 1
190
+ const keypair = mockKeypair();
191
+ let buildCount = 0;
192
+ vi.mocked(shouldAutoTopUp).mockResolvedValue(false);
193
+ vi.mocked(requestGasSponsorship).mockResolvedValue({
194
+ txBytes: Buffer.from('mock-tx').toString('base64'),
195
+ sponsorSignature: 'mock-sponsor-sig',
196
+ type: 'fallback',
197
+ });
198
+ const buildSpy = vi.spyOn(Transaction.prototype, 'build')
199
+ .mockResolvedValue(new Uint8Array([1, 2, 3]));
200
+ await executeWithGas(client, keypair, () => {
201
+ buildCount++;
202
+ return buildTx();
203
+ });
204
+ // Called once for step 1 (fails), once for step 2 (skipped via shouldAutoTopUp=false),
205
+ // once for step 3 (sponsored succeeds)
206
+ expect(buildCount).toBeGreaterThanOrEqual(2);
207
+ buildSpy.mockRestore();
208
+ });
209
+ });
210
+ describe('extractGasCost', () => {
211
+ it('correctly calculates gas cost from effects', async () => {
212
+ const client = mockClient(100000000n);
213
+ const keypair = mockKeypair();
214
+ const result = await executeWithGas(client, keypair, () => buildTx());
215
+ // (1000000 + 2000000 - 500000) / 1e9 = 0.0025
216
+ expect(result.gasCostSui).toBeCloseTo(0.0025, 6);
217
+ });
218
+ });
219
+ });
220
+ //# sourceMappingURL=manager.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.test.js","sourceRoot":"","sources":["../../src/gas/manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serialization.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.test.d.ts","sourceRoot":"","sources":["../../src/gas/serialization.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,47 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { Transaction } from '@mysten/sui/transactions';
3
+ describe('Transaction serialization roundtrip', () => {
4
+ it('serialize() returns a JSON string (not bytes)', () => {
5
+ const tx = new Transaction();
6
+ tx.setSender('0x' + 'a'.repeat(64));
7
+ const serialized = tx.serialize();
8
+ expect(typeof serialized).toBe('string');
9
+ expect(() => JSON.parse(serialized)).not.toThrow();
10
+ });
11
+ it('Transaction.from(jsonString) reconstructs from serialize()', () => {
12
+ const tx = new Transaction();
13
+ tx.setSender('0x' + 'a'.repeat(64));
14
+ const serialized = tx.serialize();
15
+ const restored = Transaction.from(serialized);
16
+ expect(restored).toBeInstanceOf(Transaction);
17
+ });
18
+ it('roundtrip preserves sender', () => {
19
+ const address = '0x' + 'b'.repeat(64);
20
+ const tx = new Transaction();
21
+ tx.setSender(address);
22
+ const serialized = tx.serialize();
23
+ const restored = Transaction.from(serialized);
24
+ const reserialized = restored.serialize();
25
+ expect(JSON.parse(reserialized).sender).toBe(address);
26
+ });
27
+ it('Transaction.from(Buffer) treats input as BCS (NOT JSON)', () => {
28
+ const tx = new Transaction();
29
+ tx.setSender('0x' + 'a'.repeat(64));
30
+ const serialized = tx.serialize();
31
+ // Passing a Buffer (Uint8Array) makes Transaction.from try BCS deserialization
32
+ // which fails because JSON bytes aren't valid BCS — this is the bug we fixed
33
+ const buf = Buffer.from(serialized);
34
+ expect(() => Transaction.from(buf)).toThrow();
35
+ });
36
+ it('tx.serialize() is safe to embed in JSON request body', () => {
37
+ const tx = new Transaction();
38
+ tx.setSender('0x' + 'c'.repeat(64));
39
+ const serialized = tx.serialize();
40
+ const requestBody = JSON.stringify({ txJson: serialized, sender: '0x' + 'c'.repeat(64) });
41
+ const parsed = JSON.parse(requestBody);
42
+ expect(typeof parsed.txJson).toBe('string');
43
+ const restored = Transaction.from(parsed.txJson);
44
+ expect(restored).toBeInstanceOf(Transaction);
45
+ });
46
+ });
47
+ //# sourceMappingURL=serialization.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialization.test.js","sourceRoot":"","sources":["../../src/gas/serialization.test.ts"],"names":[],"mappings":"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"}