@0xtorch/core 0.0.29 → 0.0.31

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 (53) hide show
  1. package/_cjs/actions/index.js +17 -13
  2. package/_cjs/actions/index.js.map +1 -1
  3. package/_cjs/actions/utils/createEvidenceNoneAccountActions.js +323 -0
  4. package/_cjs/actions/utils/createEvidenceNoneAccountActions.js.map +1 -0
  5. package/_cjs/actions/utils/parseBaseAccountActionToAccountAction.js +680 -0
  6. package/_cjs/actions/utils/parseBaseAccountActionToAccountAction.js.map +1 -0
  7. package/_cjs/actions/utils/parseBaseNormalActionToNormalAction.js +609 -0
  8. package/_cjs/actions/utils/parseBaseNormalActionToNormalAction.js.map +1 -0
  9. package/_cjs/actions/utils/transfer.js +22 -0
  10. package/_cjs/actions/utils/transfer.js.map +1 -0
  11. package/_cjs/index.js +4 -3
  12. package/_cjs/index.js.map +1 -1
  13. package/_cjs/setAccountActionPrices.js +14 -3
  14. package/_cjs/setAccountActionPrices.js.map +1 -1
  15. package/_esm/actions/index.js +4 -1
  16. package/_esm/actions/index.js.map +1 -1
  17. package/_esm/actions/utils/createEvidenceNoneAccountActions.js +336 -0
  18. package/_esm/actions/utils/createEvidenceNoneAccountActions.js.map +1 -0
  19. package/_esm/actions/{utils.js → utils/parseBaseAccountActionToAccountAction.js} +2 -613
  20. package/_esm/actions/utils/parseBaseAccountActionToAccountAction.js.map +1 -0
  21. package/_esm/actions/utils/parseBaseNormalActionToNormalAction.js +605 -0
  22. package/_esm/actions/utils/parseBaseNormalActionToNormalAction.js.map +1 -0
  23. package/_esm/actions/utils/transfer.js +10 -0
  24. package/_esm/actions/utils/transfer.js.map +1 -0
  25. package/_esm/index.js +1 -1
  26. package/_esm/index.js.map +1 -1
  27. package/_esm/setAccountActionPrices.js +14 -3
  28. package/_esm/setAccountActionPrices.js.map +1 -1
  29. package/_types/actions/index.d.ts +4 -1
  30. package/_types/actions/index.d.ts.map +1 -1
  31. package/_types/actions/utils/createEvidenceNoneAccountActions.d.ts +10 -0
  32. package/_types/actions/utils/createEvidenceNoneAccountActions.d.ts.map +1 -0
  33. package/_types/actions/utils/parseBaseAccountActionToAccountAction.d.ts +3 -0
  34. package/_types/actions/utils/parseBaseAccountActionToAccountAction.d.ts.map +1 -0
  35. package/_types/actions/utils/parseBaseNormalActionToNormalAction.d.ts +3 -0
  36. package/_types/actions/utils/parseBaseNormalActionToNormalAction.d.ts.map +1 -0
  37. package/_types/actions/{utils.d.ts → utils/transfer.d.ts} +2 -5
  38. package/_types/actions/utils/transfer.d.ts.map +1 -0
  39. package/_types/index.d.ts +1 -1
  40. package/_types/index.d.ts.map +1 -1
  41. package/_types/setAccountActionPrices.d.ts.map +1 -1
  42. package/actions/index.ts +4 -3
  43. package/actions/utils/createEvidenceNoneAccountActions.ts +470 -0
  44. package/actions/{utils.ts → utils/parseBaseAccountActionToAccountAction.ts} +10 -913
  45. package/actions/utils/parseBaseNormalActionToNormalAction.ts +874 -0
  46. package/actions/utils/transfer.ts +57 -0
  47. package/index.ts +1 -0
  48. package/package.json +1 -1
  49. package/setAccountActionPrices.ts +14 -2
  50. package/_cjs/actions/utils.js +0 -1301
  51. package/_cjs/actions/utils.js.map +0 -1
  52. package/_esm/actions/utils.js.map +0 -1
  53. package/_types/actions/utils.d.ts.map +0 -1
@@ -0,0 +1,874 @@
1
+ import type {
2
+ NormalActionAddLiquidity,
3
+ NormalActionApprove,
4
+ NormalActionAtomicArbitrage,
5
+ NormalActionBorrow,
6
+ NormalActionBridgeFrom,
7
+ NormalActionBridgeTo,
8
+ NormalActionBuyCrypto,
9
+ NormalActionBuyNft,
10
+ NormalActionCrossReplace,
11
+ NormalActionCrossTrade,
12
+ NormalActionDeposit,
13
+ NormalActionDepositWithBond,
14
+ NormalActionFailTx,
15
+ NormalActionFee,
16
+ NormalActionFreeMintNft,
17
+ NormalActionIncome,
18
+ NormalActionMintNft,
19
+ NormalActionReceiveFromCex,
20
+ NormalActionRemoveLiquidity,
21
+ NormalActionRepayment,
22
+ NormalActionRepaymentWithDebt,
23
+ NormalActionReplace,
24
+ NormalActionRevoke,
25
+ NormalActionSellCrypto,
26
+ NormalActionSellNft,
27
+ NormalActionSendToCex,
28
+ NormalActionSpam,
29
+ NormalActionStake,
30
+ NormalActionSwapNft,
31
+ NormalActionTrade,
32
+ NormalActionTransactionFee,
33
+ NormalActionTransfer,
34
+ NormalActionUnstake,
35
+ NormalActionUnwrap,
36
+ NormalActionValuedown,
37
+ NormalActionValueup,
38
+ NormalActionWithdraw,
39
+ NormalActionWithdrawWithBond,
40
+ NormalActionWrap,
41
+ TransferCryptoCurrencyIn,
42
+ TransferCryptoCurrencyOut,
43
+ TransferFiatCurrencyIn,
44
+ TransferFiatCurrencyOut,
45
+ TransferNftIn,
46
+ TransferNftOut,
47
+ } from '../types'
48
+ import type { BaseNormalAction, NormalAction } from '../types/action'
49
+ import {
50
+ isTransferCryptoCurrencyIn,
51
+ isTransferCryptoCurrencyOut,
52
+ isTransferFiatCurrencyIn,
53
+ isTransferFiatCurrencyOut,
54
+ isTransferNftIn,
55
+ isTransferNftOut,
56
+ } from './transfer'
57
+
58
+ export const parseBaseNormalActionToNormalAction = (
59
+ action: BaseNormalAction,
60
+ ): NormalAction => {
61
+ switch (action.action) {
62
+ case 'add-liquidity': {
63
+ const transfers = action.transfers.filter(
64
+ (
65
+ transfer,
66
+ ): transfer is
67
+ | TransferCryptoCurrencyIn
68
+ | TransferNftIn
69
+ | TransferCryptoCurrencyOut
70
+ | TransferNftOut =>
71
+ isTransferCryptoCurrencyIn(transfer) ||
72
+ isTransferNftIn(transfer) ||
73
+ isTransferCryptoCurrencyOut(transfer) ||
74
+ isTransferNftOut(transfer),
75
+ )
76
+ if (transfers.length !== action.transfers.length) {
77
+ throw new Error('Invalid action.transfers for add-liquidity')
78
+ }
79
+ if (action.loanId === undefined) {
80
+ throw new Error('action.loandId is required for add-liquidity')
81
+ }
82
+ return {
83
+ ...action,
84
+ type: 'LoanNormalAction',
85
+ action: 'add-liquidity',
86
+ loanId: action.loanId,
87
+ transfers,
88
+ } satisfies NormalActionAddLiquidity
89
+ }
90
+ case 'approve': {
91
+ if (action.transfers.length > 0) {
92
+ throw new Error('Invalid action.transfers for approve')
93
+ }
94
+ return {
95
+ ...action,
96
+ type: 'NormalAction',
97
+ action: 'approve',
98
+ transfers: [],
99
+ } satisfies NormalActionApprove
100
+ }
101
+ case 'atomic-arbitrage': {
102
+ const transfers = action.transfers.filter(
103
+ (
104
+ transfer,
105
+ ): transfer is TransferCryptoCurrencyIn | TransferCryptoCurrencyOut =>
106
+ isTransferCryptoCurrencyIn(transfer) ||
107
+ isTransferCryptoCurrencyOut(transfer),
108
+ )
109
+ if (transfers.length !== action.transfers.length) {
110
+ throw new Error('Invalid action.transfers for atomic-arbitrage')
111
+ }
112
+ return {
113
+ ...action,
114
+ type: 'NormalAction',
115
+ action: 'atomic-arbitrage',
116
+ transfers,
117
+ } satisfies NormalActionAtomicArbitrage
118
+ }
119
+ case 'borrow': {
120
+ const transfers = action.transfers.filter(
121
+ (transfer): transfer is TransferCryptoCurrencyIn | TransferNftIn =>
122
+ isTransferCryptoCurrencyIn(transfer) || isTransferNftIn(transfer),
123
+ )
124
+ if (transfers.length !== action.transfers.length) {
125
+ throw new Error('Invalid action.transfers for borrow')
126
+ }
127
+ if (action.loanId === undefined) {
128
+ throw new Error('action.loandId is required for borrow')
129
+ }
130
+ return {
131
+ ...action,
132
+ type: 'LoanNormalAction',
133
+ action: 'borrow',
134
+ loanId: action.loanId,
135
+ transfers,
136
+ } satisfies NormalActionBorrow
137
+ }
138
+ case 'bridge-from': {
139
+ const transfers = action.transfers.filter(
140
+ (transfer): transfer is TransferCryptoCurrencyOut | TransferNftOut =>
141
+ isTransferCryptoCurrencyOut(transfer) || isTransferNftOut(transfer),
142
+ )
143
+ if (transfers.length !== action.transfers.length) {
144
+ throw new Error('Invalid action.transfers for bridge-from')
145
+ }
146
+ if (action.crossId === undefined) {
147
+ throw new Error('action.crossId is required for bridge-from')
148
+ }
149
+ if (action.crossType === undefined) {
150
+ throw new Error('action.crossType is required for bridge-from')
151
+ }
152
+ return {
153
+ ...action,
154
+ type: 'CrossNormalAction',
155
+ action: 'bridge-from',
156
+ crossId: action.crossId,
157
+ crossType: action.crossType,
158
+ transfers,
159
+ } satisfies NormalActionBridgeFrom
160
+ }
161
+ case 'bridge-to': {
162
+ const transfers = action.transfers.filter(
163
+ (transfer): transfer is TransferCryptoCurrencyIn | TransferNftIn =>
164
+ isTransferCryptoCurrencyIn(transfer) || isTransferNftIn(transfer),
165
+ )
166
+ if (transfers.length !== action.transfers.length) {
167
+ throw new Error('Invalid action.transfers for bridge-to')
168
+ }
169
+ if (action.crossId === undefined) {
170
+ throw new Error('action.crossId is required for bridge-to')
171
+ }
172
+ if (action.crossType === undefined) {
173
+ throw new Error('action.crossType is required for bridge-to')
174
+ }
175
+ return {
176
+ ...action,
177
+ type: 'CrossNormalAction',
178
+ action: 'bridge-to',
179
+ crossId: action.crossId,
180
+ crossType: action.crossType,
181
+ transfers,
182
+ } satisfies NormalActionBridgeTo
183
+ }
184
+ case 'buy-crypto': {
185
+ const transfers = action.transfers.filter(
186
+ (
187
+ transfer,
188
+ ): transfer is TransferCryptoCurrencyIn | TransferFiatCurrencyOut =>
189
+ isTransferCryptoCurrencyIn(transfer) ||
190
+ isTransferFiatCurrencyOut(transfer),
191
+ )
192
+ if (transfers.length !== action.transfers.length) {
193
+ throw new Error('Invalid action.transfers for buy-crypto')
194
+ }
195
+ return {
196
+ ...action,
197
+ type: 'NormalAction',
198
+ action: 'buy-crypto',
199
+ transfers,
200
+ } satisfies NormalActionBuyCrypto
201
+ }
202
+ case 'buy-nft': {
203
+ const transfers = action.transfers.filter(
204
+ (
205
+ transfer,
206
+ ): transfer is
207
+ | TransferNftIn
208
+ | TransferFiatCurrencyOut
209
+ | TransferCryptoCurrencyOut =>
210
+ isTransferNftIn(transfer) ||
211
+ isTransferFiatCurrencyOut(transfer) ||
212
+ isTransferCryptoCurrencyOut(transfer),
213
+ )
214
+ if (transfers.length !== action.transfers.length) {
215
+ throw new Error('Invalid action.transfers for buy-nft')
216
+ }
217
+ return {
218
+ ...action,
219
+ type: 'NormalAction',
220
+ action: 'buy-nft',
221
+ transfers,
222
+ } satisfies NormalActionBuyNft
223
+ }
224
+ case 'cross-replace': {
225
+ const transfers = action.transfers.filter(
226
+ (
227
+ transfer,
228
+ ): transfer is
229
+ | TransferCryptoCurrencyIn
230
+ | TransferNftIn
231
+ | TransferFiatCurrencyIn
232
+ | TransferCryptoCurrencyOut
233
+ | TransferNftOut
234
+ | TransferFiatCurrencyOut =>
235
+ isTransferCryptoCurrencyIn(transfer) ||
236
+ isTransferNftIn(transfer) ||
237
+ isTransferFiatCurrencyIn(transfer) ||
238
+ isTransferCryptoCurrencyOut(transfer) ||
239
+ isTransferNftOut(transfer) ||
240
+ isTransferFiatCurrencyOut(transfer),
241
+ )
242
+ if (transfers.length !== action.transfers.length) {
243
+ throw new Error('Invalid action.transfers for cross-replace')
244
+ }
245
+ if (action.crossId === undefined) {
246
+ throw new Error('action.crossId is required for cross-replace')
247
+ }
248
+ if (action.crossType === undefined) {
249
+ throw new Error('action.crossType is required for cross-replace')
250
+ }
251
+ return {
252
+ ...action,
253
+ type: 'CrossNormalAction',
254
+ action: 'cross-replace',
255
+ crossId: action.crossId,
256
+ crossType: action.crossType,
257
+ transfers,
258
+ } satisfies NormalActionCrossReplace
259
+ }
260
+ case 'cross-trade': {
261
+ const transfers = action.transfers.filter(
262
+ (
263
+ transfer,
264
+ ): transfer is
265
+ | TransferCryptoCurrencyIn
266
+ | TransferNftIn
267
+ | TransferFiatCurrencyIn
268
+ | TransferCryptoCurrencyOut
269
+ | TransferNftOut
270
+ | TransferFiatCurrencyOut =>
271
+ isTransferCryptoCurrencyIn(transfer) ||
272
+ isTransferNftIn(transfer) ||
273
+ isTransferFiatCurrencyIn(transfer) ||
274
+ isTransferCryptoCurrencyOut(transfer) ||
275
+ isTransferNftOut(transfer) ||
276
+ isTransferFiatCurrencyOut(transfer),
277
+ )
278
+ if (transfers.length !== action.transfers.length) {
279
+ throw new Error('Invalid action.transfers for cross-trade')
280
+ }
281
+ if (action.crossId === undefined) {
282
+ throw new Error('action.crossId is required for cross-trade')
283
+ }
284
+ if (action.crossType === undefined) {
285
+ throw new Error('action.crossType is required for cross-trade')
286
+ }
287
+ return {
288
+ ...action,
289
+ type: 'CrossNormalAction',
290
+ action: 'cross-trade',
291
+ crossId: action.crossId,
292
+ crossType: action.crossType,
293
+ transfers,
294
+ } satisfies NormalActionCrossTrade
295
+ }
296
+ case 'deposit': {
297
+ const transfers = action.transfers.filter(
298
+ (transfer): transfer is TransferCryptoCurrencyOut | TransferNftOut =>
299
+ isTransferCryptoCurrencyOut(transfer) || isTransferNftOut(transfer),
300
+ )
301
+ if (transfers.length !== action.transfers.length) {
302
+ throw new Error('Invalid action.transfers for deposit')
303
+ }
304
+ if (action.loanId === undefined) {
305
+ throw new Error('action.loandId is required for deposit')
306
+ }
307
+ return {
308
+ ...action,
309
+ type: 'LoanNormalAction',
310
+ action: 'deposit',
311
+ loanId: action.loanId,
312
+ transfers,
313
+ } satisfies NormalActionDeposit
314
+ }
315
+ case 'deposit-with-bond': {
316
+ const transfers = action.transfers.filter(
317
+ (
318
+ transfer,
319
+ ): transfer is
320
+ | TransferCryptoCurrencyIn
321
+ | TransferNftIn
322
+ | TransferCryptoCurrencyOut
323
+ | TransferNftOut =>
324
+ isTransferCryptoCurrencyIn(transfer) ||
325
+ isTransferNftIn(transfer) ||
326
+ isTransferCryptoCurrencyOut(transfer) ||
327
+ isTransferNftOut(transfer),
328
+ )
329
+ if (transfers.length !== action.transfers.length) {
330
+ throw new Error('Invalid action.transfers for deposit-with-bond')
331
+ }
332
+ if (action.loanId === undefined) {
333
+ throw new Error('action.loandId is required for deposit-with-bond')
334
+ }
335
+ return {
336
+ ...action,
337
+ type: 'LoanNormalAction',
338
+ action: 'deposit-with-bond',
339
+ loanId: action.loanId,
340
+ transfers,
341
+ } satisfies NormalActionDepositWithBond
342
+ }
343
+ case 'fail-tx': {
344
+ if (action.transfers.length > 0) {
345
+ throw new Error('Invalid action.transfers for fail-tx')
346
+ }
347
+ return {
348
+ ...action,
349
+ type: 'NormalAction',
350
+ action: 'fail-tx',
351
+ transfers: [],
352
+ } satisfies NormalActionFailTx
353
+ }
354
+ case 'fee': {
355
+ const transfers = action.transfers.filter(
356
+ (
357
+ transfer,
358
+ ): transfer is TransferCryptoCurrencyOut | TransferFiatCurrencyOut =>
359
+ isTransferCryptoCurrencyOut(transfer) ||
360
+ isTransferFiatCurrencyOut(transfer),
361
+ )
362
+ if (transfers.length !== action.transfers.length) {
363
+ throw new Error('Invalid action.transfers for fee')
364
+ }
365
+ return {
366
+ ...action,
367
+ type: 'NormalAction',
368
+ action: 'fee',
369
+ transfers,
370
+ } satisfies NormalActionFee
371
+ }
372
+ case 'free-mint-nft': {
373
+ const transfers = action.transfers.filter(
374
+ (transfer): transfer is TransferNftIn => isTransferNftIn(transfer),
375
+ )
376
+ if (transfers.length !== action.transfers.length) {
377
+ throw new Error('Invalid action.transfers for free-mint-nft')
378
+ }
379
+ return {
380
+ ...action,
381
+ type: 'NormalAction',
382
+ action: 'free-mint-nft',
383
+ transfers,
384
+ } satisfies NormalActionFreeMintNft
385
+ }
386
+ case 'income': {
387
+ const transfers = action.transfers.filter(
388
+ (
389
+ transfer,
390
+ ): transfer is
391
+ | TransferCryptoCurrencyIn
392
+ | TransferNftIn
393
+ | TransferFiatCurrencyIn =>
394
+ isTransferCryptoCurrencyIn(transfer) ||
395
+ isTransferNftIn(transfer) ||
396
+ isTransferFiatCurrencyIn(transfer),
397
+ )
398
+ if (transfers.length !== action.transfers.length) {
399
+ throw new Error('Invalid action.transfers for income')
400
+ }
401
+ return {
402
+ ...action,
403
+ type: 'NormalAction',
404
+ action: 'income',
405
+ transfers,
406
+ } satisfies NormalActionIncome
407
+ }
408
+ case 'mint-nft': {
409
+ const transfers = action.transfers.filter(
410
+ (
411
+ transfer,
412
+ ): transfer is
413
+ | TransferNftIn
414
+ | TransferFiatCurrencyOut
415
+ | TransferCryptoCurrencyOut =>
416
+ isTransferNftIn(transfer) ||
417
+ isTransferFiatCurrencyOut(transfer) ||
418
+ isTransferCryptoCurrencyOut(transfer),
419
+ )
420
+ if (transfers.length !== action.transfers.length) {
421
+ throw new Error('Invalid action.transfers for mint-nft')
422
+ }
423
+ return {
424
+ ...action,
425
+ type: 'NormalAction',
426
+ action: 'mint-nft',
427
+ transfers,
428
+ } satisfies NormalActionMintNft
429
+ }
430
+ case 'receive-from-cex': {
431
+ const transfers = action.transfers.filter(
432
+ (transfer): transfer is TransferCryptoCurrencyIn | TransferNftIn =>
433
+ isTransferCryptoCurrencyIn(transfer) || isTransferNftIn(transfer),
434
+ )
435
+ if (transfers.length !== action.transfers.length) {
436
+ throw new Error('Invalid action.transfers for receive-from-cex')
437
+ }
438
+ return {
439
+ ...action,
440
+ type: 'NormalAction',
441
+ action: 'receive-from-cex',
442
+ transfers,
443
+ } satisfies NormalActionReceiveFromCex
444
+ }
445
+ case 'remove-liquidity': {
446
+ const transfers = action.transfers.filter(
447
+ (
448
+ transfer,
449
+ ): transfer is
450
+ | TransferCryptoCurrencyIn
451
+ | TransferNftIn
452
+ | TransferCryptoCurrencyOut
453
+ | TransferNftOut =>
454
+ isTransferCryptoCurrencyIn(transfer) ||
455
+ isTransferNftIn(transfer) ||
456
+ isTransferCryptoCurrencyOut(transfer) ||
457
+ isTransferNftOut(transfer),
458
+ )
459
+ if (transfers.length !== action.transfers.length) {
460
+ throw new Error('Invalid action.transfers for remove-liquidity')
461
+ }
462
+ if (action.loanId === undefined) {
463
+ throw new Error('action.loandId is required for remove-liquidity')
464
+ }
465
+ return {
466
+ ...action,
467
+ type: 'LoanNormalAction',
468
+ action: 'remove-liquidity',
469
+ loanId: action.loanId,
470
+ transfers,
471
+ } satisfies NormalActionRemoveLiquidity
472
+ }
473
+ case 'repayment': {
474
+ const transfers = action.transfers.filter(
475
+ (transfer): transfer is TransferCryptoCurrencyOut | TransferNftOut =>
476
+ isTransferCryptoCurrencyOut(transfer) || isTransferNftOut(transfer),
477
+ )
478
+ if (transfers.length !== action.transfers.length) {
479
+ throw new Error('Invalid action.transfers for repayment')
480
+ }
481
+ if (action.loanId === undefined) {
482
+ throw new Error('action.loandId is required for repayment')
483
+ }
484
+ return {
485
+ ...action,
486
+ type: 'LoanNormalAction',
487
+ action: 'repayment',
488
+ loanId: action.loanId,
489
+ transfers,
490
+ } satisfies NormalActionRepayment
491
+ }
492
+ case 'repayment-with-debt': {
493
+ const transfers = action.transfers.filter(
494
+ (
495
+ transfer,
496
+ ): transfer is
497
+ | TransferCryptoCurrencyIn
498
+ | TransferNftIn
499
+ | TransferCryptoCurrencyOut
500
+ | TransferNftOut =>
501
+ isTransferCryptoCurrencyIn(transfer) ||
502
+ isTransferNftIn(transfer) ||
503
+ isTransferCryptoCurrencyOut(transfer) ||
504
+ isTransferNftOut(transfer),
505
+ )
506
+ if (transfers.length !== action.transfers.length) {
507
+ throw new Error('Invalid action.transfers for repayment-with-debt')
508
+ }
509
+ if (action.loanId === undefined) {
510
+ throw new Error('action.loandId is required for repayment-with-debt')
511
+ }
512
+ return {
513
+ ...action,
514
+ type: 'LoanNormalAction',
515
+ action: 'repayment-with-debt',
516
+ loanId: action.loanId,
517
+ transfers,
518
+ } satisfies NormalActionRepaymentWithDebt
519
+ }
520
+ case 'replace': {
521
+ const transfers = action.transfers.filter(
522
+ (
523
+ transfer,
524
+ ): transfer is
525
+ | TransferCryptoCurrencyIn
526
+ | TransferNftIn
527
+ | TransferCryptoCurrencyOut
528
+ | TransferNftOut =>
529
+ isTransferCryptoCurrencyIn(transfer) ||
530
+ isTransferNftIn(transfer) ||
531
+ isTransferCryptoCurrencyOut(transfer) ||
532
+ isTransferNftOut(transfer),
533
+ )
534
+ if (transfers.length !== action.transfers.length) {
535
+ throw new Error('Invalid action.transfers for replace')
536
+ }
537
+ return {
538
+ ...action,
539
+ type: 'NormalAction',
540
+ action: 'replace',
541
+ transfers,
542
+ } satisfies NormalActionReplace
543
+ }
544
+ case 'revoke': {
545
+ if (action.transfers.length > 0) {
546
+ throw new Error('Invalid action.transfers for revoke')
547
+ }
548
+ return {
549
+ ...action,
550
+ type: 'NormalAction',
551
+ action: 'revoke',
552
+ transfers: [],
553
+ } satisfies NormalActionRevoke
554
+ }
555
+ case 'sell-crypto': {
556
+ const transfers = action.transfers.filter(
557
+ (
558
+ transfer,
559
+ ): transfer is TransferFiatCurrencyIn | TransferCryptoCurrencyOut =>
560
+ isTransferFiatCurrencyIn(transfer) ||
561
+ isTransferCryptoCurrencyOut(transfer),
562
+ )
563
+ if (transfers.length !== action.transfers.length) {
564
+ throw new Error('Invalid action.transfers for sell-crypto')
565
+ }
566
+ return {
567
+ ...action,
568
+ type: 'NormalAction',
569
+ action: 'sell-crypto',
570
+ transfers,
571
+ } satisfies NormalActionSellCrypto
572
+ }
573
+ case 'sell-nft': {
574
+ const transfers = action.transfers.filter(
575
+ (
576
+ transfer,
577
+ ): transfer is
578
+ | TransferFiatCurrencyIn
579
+ | TransferCryptoCurrencyIn
580
+ | TransferNftOut =>
581
+ isTransferFiatCurrencyIn(transfer) ||
582
+ isTransferCryptoCurrencyIn(transfer) ||
583
+ isTransferNftOut(transfer),
584
+ )
585
+ if (transfers.length !== action.transfers.length) {
586
+ throw new Error('Invalid action.transfers for sell-nft')
587
+ }
588
+ return {
589
+ ...action,
590
+ type: 'NormalAction',
591
+ action: 'sell-nft',
592
+ transfers,
593
+ } satisfies NormalActionSellNft
594
+ }
595
+ case 'send-to-cex': {
596
+ const transfers = action.transfers.filter(
597
+ (transfer): transfer is TransferCryptoCurrencyOut | TransferNftOut =>
598
+ isTransferCryptoCurrencyOut(transfer) || isTransferNftOut(transfer),
599
+ )
600
+ if (transfers.length !== action.transfers.length) {
601
+ throw new Error('Invalid action.transfers for send-to-cex')
602
+ }
603
+ return {
604
+ ...action,
605
+ type: 'NormalAction',
606
+ action: 'send-to-cex',
607
+ transfers,
608
+ } satisfies NormalActionSendToCex
609
+ }
610
+ case 'spam': {
611
+ const transfers = action.transfers.filter(
612
+ (
613
+ transfer,
614
+ ): transfer is
615
+ | TransferCryptoCurrencyIn
616
+ | TransferNftIn
617
+ | TransferCryptoCurrencyOut
618
+ | TransferNftOut =>
619
+ isTransferCryptoCurrencyIn(transfer) ||
620
+ isTransferNftIn(transfer) ||
621
+ isTransferCryptoCurrencyOut(transfer) ||
622
+ isTransferNftOut(transfer),
623
+ )
624
+ if (transfers.length !== action.transfers.length) {
625
+ throw new Error('Invalid action.transfers for spam')
626
+ }
627
+ return {
628
+ ...action,
629
+ type: 'NormalAction',
630
+ action: 'spam',
631
+ transfers,
632
+ } satisfies NormalActionSpam
633
+ }
634
+ case 'stake': {
635
+ const transfers = action.transfers.filter(
636
+ (transfer): transfer is TransferCryptoCurrencyOut | TransferNftOut =>
637
+ isTransferCryptoCurrencyOut(transfer) || isTransferNftOut(transfer),
638
+ )
639
+ if (transfers.length !== action.transfers.length) {
640
+ throw new Error('Invalid action.transfers for stake')
641
+ }
642
+ if (action.loanId === undefined) {
643
+ throw new Error('action.loandId is required for stake')
644
+ }
645
+ return {
646
+ ...action,
647
+ type: 'LoanNormalAction',
648
+ action: 'stake',
649
+ loanId: action.loanId,
650
+ transfers,
651
+ } satisfies NormalActionStake
652
+ }
653
+ case 'swap-nft': {
654
+ const transfers = action.transfers.filter(
655
+ (transfer): transfer is TransferNftIn | TransferNftOut =>
656
+ isTransferNftIn(transfer) || isTransferNftOut(transfer),
657
+ )
658
+ if (transfers.length !== action.transfers.length) {
659
+ throw new Error('Invalid action.transfers for swap-nft')
660
+ }
661
+ return {
662
+ ...action,
663
+ type: 'NormalAction',
664
+ action: 'swap-nft',
665
+ transfers,
666
+ } satisfies NormalActionSwapNft
667
+ }
668
+ case 'transaction-fee': {
669
+ const transfers = action.transfers.filter(
670
+ (transfer): transfer is TransferCryptoCurrencyOut =>
671
+ isTransferCryptoCurrencyOut(transfer),
672
+ )
673
+ if (transfers.length !== action.transfers.length) {
674
+ throw new Error('Invalid action.transfers for transaction-fee')
675
+ }
676
+ return {
677
+ ...action,
678
+ type: 'NormalAction',
679
+ action: 'transaction-fee',
680
+ transfers,
681
+ } satisfies NormalActionTransactionFee
682
+ }
683
+ case 'trade': {
684
+ const transfers = action.transfers.filter(
685
+ (
686
+ transfer,
687
+ ): transfer is
688
+ | TransferCryptoCurrencyIn
689
+ | TransferNftIn
690
+ | TransferFiatCurrencyIn
691
+ | TransferCryptoCurrencyOut
692
+ | TransferNftOut
693
+ | TransferFiatCurrencyOut =>
694
+ isTransferCryptoCurrencyIn(transfer) ||
695
+ isTransferNftIn(transfer) ||
696
+ isTransferFiatCurrencyIn(transfer) ||
697
+ isTransferCryptoCurrencyOut(transfer) ||
698
+ isTransferNftOut(transfer) ||
699
+ isTransferFiatCurrencyOut(transfer),
700
+ )
701
+ if (transfers.length !== action.transfers.length) {
702
+ throw new Error('Invalid action.transfers for trade')
703
+ }
704
+ return {
705
+ ...action,
706
+ type: 'NormalAction',
707
+ action: 'trade',
708
+ transfers,
709
+ } satisfies NormalActionTrade
710
+ }
711
+ case 'transfer': {
712
+ return {
713
+ ...action,
714
+ type: 'NormalAction',
715
+ action: 'transfer',
716
+ transfers: [...action.transfers],
717
+ } satisfies NormalActionTransfer
718
+ }
719
+ case 'unstake': {
720
+ const transfers = action.transfers.filter(
721
+ (transfer): transfer is TransferCryptoCurrencyIn | TransferNftIn =>
722
+ isTransferCryptoCurrencyIn(transfer) || isTransferNftIn(transfer),
723
+ )
724
+ if (transfers.length !== action.transfers.length) {
725
+ throw new Error('Invalid action.transfers for unstake')
726
+ }
727
+ if (action.loanId === undefined) {
728
+ throw new Error('action.loandId is required for unstake')
729
+ }
730
+ return {
731
+ ...action,
732
+ type: 'LoanNormalAction',
733
+ action: 'unstake',
734
+ loanId: action.loanId,
735
+ transfers,
736
+ } satisfies NormalActionUnstake
737
+ }
738
+ case 'unwrap': {
739
+ const transfers = action.transfers.filter(
740
+ (
741
+ transfer,
742
+ ): transfer is TransferCryptoCurrencyIn | TransferCryptoCurrencyOut =>
743
+ isTransferCryptoCurrencyIn(transfer) ||
744
+ isTransferCryptoCurrencyOut(transfer),
745
+ )
746
+ if (transfers.length !== action.transfers.length) {
747
+ throw new Error('Invalid action.transfers for unwrap')
748
+ }
749
+ return {
750
+ ...action,
751
+ type: 'NormalAction',
752
+ action: 'unwrap',
753
+ transfers,
754
+ } satisfies NormalActionUnwrap
755
+ }
756
+ case 'valuedown': {
757
+ const transfers = action.transfers.filter(
758
+ (
759
+ transfer,
760
+ ): transfer is
761
+ | TransferCryptoCurrencyIn
762
+ | TransferNftIn
763
+ | TransferFiatCurrencyIn =>
764
+ isTransferCryptoCurrencyIn(transfer) ||
765
+ isTransferNftIn(transfer) ||
766
+ isTransferFiatCurrencyIn(transfer),
767
+ )
768
+ if (transfers.length !== action.transfers.length) {
769
+ throw new Error('Invalid action.transfers for valuedown')
770
+ }
771
+ if (action.target === undefined) {
772
+ throw new Error('action.target is required for valuedown')
773
+ }
774
+ return {
775
+ ...action,
776
+ type: 'NormalAction',
777
+ action: 'valuedown',
778
+ target: action.target,
779
+ transfers,
780
+ } satisfies NormalActionValuedown
781
+ }
782
+ case 'valueup': {
783
+ const transfers = action.transfers.filter(
784
+ (
785
+ transfer,
786
+ ): transfer is
787
+ | TransferCryptoCurrencyOut
788
+ | TransferNftOut
789
+ | TransferFiatCurrencyOut =>
790
+ isTransferCryptoCurrencyOut(transfer) ||
791
+ isTransferNftOut(transfer) ||
792
+ isTransferFiatCurrencyOut(transfer),
793
+ )
794
+ if (transfers.length !== action.transfers.length) {
795
+ throw new Error('Invalid action.transfers for valueup')
796
+ }
797
+ if (action.target === undefined) {
798
+ throw new Error('action.target is required for valueup')
799
+ }
800
+ return {
801
+ ...action,
802
+ type: 'NormalAction',
803
+ action: 'valueup',
804
+ target: action.target,
805
+ transfers,
806
+ } satisfies NormalActionValueup
807
+ }
808
+ case 'withdraw': {
809
+ const transfers = action.transfers.filter(
810
+ (transfer): transfer is TransferCryptoCurrencyIn | TransferNftIn =>
811
+ isTransferCryptoCurrencyIn(transfer) || isTransferNftIn(transfer),
812
+ )
813
+ if (transfers.length !== action.transfers.length) {
814
+ throw new Error('Invalid action.transfers for withdraw')
815
+ }
816
+ if (action.loanId === undefined) {
817
+ throw new Error('action.loandId is required for withdraw')
818
+ }
819
+ return {
820
+ ...action,
821
+ type: 'LoanNormalAction',
822
+ action: 'withdraw',
823
+ loanId: action.loanId,
824
+ transfers,
825
+ } satisfies NormalActionWithdraw
826
+ }
827
+ case 'withdraw-with-bond': {
828
+ const transfers = action.transfers.filter(
829
+ (
830
+ transfer,
831
+ ): transfer is
832
+ | TransferCryptoCurrencyIn
833
+ | TransferNftIn
834
+ | TransferCryptoCurrencyOut
835
+ | TransferNftOut =>
836
+ isTransferCryptoCurrencyIn(transfer) ||
837
+ isTransferNftIn(transfer) ||
838
+ isTransferCryptoCurrencyOut(transfer) ||
839
+ isTransferNftOut(transfer),
840
+ )
841
+ if (transfers.length !== action.transfers.length) {
842
+ throw new Error('Invalid action.transfers for withdraw-with-bond')
843
+ }
844
+ if (action.loanId === undefined) {
845
+ throw new Error('action.loandId is required for withdraw-with-bond')
846
+ }
847
+ return {
848
+ ...action,
849
+ type: 'LoanNormalAction',
850
+ action: 'withdraw-with-bond',
851
+ loanId: action.loanId,
852
+ transfers,
853
+ } satisfies NormalActionWithdrawWithBond
854
+ }
855
+ case 'wrap': {
856
+ const transfers = action.transfers.filter(
857
+ (
858
+ transfer,
859
+ ): transfer is TransferCryptoCurrencyIn | TransferCryptoCurrencyOut =>
860
+ isTransferCryptoCurrencyIn(transfer) ||
861
+ isTransferCryptoCurrencyOut(transfer),
862
+ )
863
+ if (transfers.length !== action.transfers.length) {
864
+ throw new Error('Invalid action.transfers for wrap')
865
+ }
866
+ return {
867
+ ...action,
868
+ type: 'NormalAction',
869
+ action: 'wrap',
870
+ transfers,
871
+ } satisfies NormalActionWrap
872
+ }
873
+ }
874
+ }