@zebec-network/zebec-stake-sdk 1.0.5 → 1.0.7

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.
package/README.md CHANGED
@@ -17,3 +17,19 @@ To build the package
17
17
  ```
18
18
  yarn build
19
19
  ```
20
+
21
+ To run specific test filess
22
+
23
+ ```
24
+ yarn test <test file path> -f "<regex for test name>"
25
+ // example:
26
+ // yarn test ./test/e2e/getLockupInfo.test.ts
27
+ ```
28
+
29
+ ## publish
30
+
31
+ Build package and bump package version to specific need and publish
32
+
33
+ ```
34
+ npm publish --access public
35
+ ```
@@ -9,16 +9,7 @@
9
9
  "instructions": [
10
10
  {
11
11
  "name": "init_lockup",
12
- "discriminator": [
13
- 6,
14
- 96,
15
- 207,
16
- 185,
17
- 103,
18
- 62,
19
- 239,
20
- 168
21
- ],
12
+ "discriminator": [6, 96, 207, 185, 103, 62, 239, 168],
22
13
  "accounts": [
23
14
  {
24
15
  "name": "creator",
@@ -32,20 +23,7 @@
32
23
  "seeds": [
33
24
  {
34
25
  "kind": "const",
35
- "value": [
36
- 122,
37
- 101,
38
- 98,
39
- 101,
40
- 99,
41
- 95,
42
- 108,
43
- 111,
44
- 99,
45
- 107,
46
- 117,
47
- 112
48
- ]
26
+ "value": [122, 101, 98, 101, 99, 95, 108, 111, 99, 107, 117, 112]
49
27
  },
50
28
  {
51
29
  "kind": "arg",
@@ -61,19 +39,7 @@
61
39
  "seeds": [
62
40
  {
63
41
  "kind": "const",
64
- "value": [
65
- 115,
66
- 116,
67
- 97,
68
- 107,
69
- 101,
70
- 95,
71
- 118,
72
- 97,
73
- 117,
74
- 108,
75
- 116
76
- ]
42
+ "value": [115, 116, 97, 107, 101, 95, 118, 97, 117, 108, 116]
77
43
  },
78
44
  {
79
45
  "kind": "account",
@@ -89,20 +55,7 @@
89
55
  "seeds": [
90
56
  {
91
57
  "kind": "const",
92
- "value": [
93
- 114,
94
- 101,
95
- 119,
96
- 97,
97
- 114,
98
- 100,
99
- 95,
100
- 118,
101
- 97,
102
- 117,
103
- 108,
104
- 116
105
- ]
58
+ "value": [114, 101, 119, 97, 114, 100, 95, 118, 97, 117, 108, 116]
106
59
  },
107
60
  {
108
61
  "kind": "account",
@@ -143,16 +96,7 @@
143
96
  },
144
97
  {
145
98
  "name": "stake_zbcn",
146
- "discriminator": [
147
- 93,
148
- 162,
149
- 156,
150
- 54,
151
- 43,
152
- 11,
153
- 15,
154
- 122
155
- ],
99
+ "discriminator": [93, 162, 156, 54, 43, 11, 15, 122],
156
100
  "accounts": [
157
101
  {
158
102
  "name": "staker",
@@ -166,20 +110,7 @@
166
110
  "seeds": [
167
111
  {
168
112
  "kind": "const",
169
- "value": [
170
- 122,
171
- 101,
172
- 98,
173
- 101,
174
- 99,
175
- 95,
176
- 108,
177
- 111,
178
- 99,
179
- 107,
180
- 117,
181
- 112
182
- ]
113
+ "value": [122, 101, 98, 101, 99, 95, 108, 111, 99, 107, 117, 112]
183
114
  },
184
115
  {
185
116
  "kind": "account",
@@ -240,38 +171,8 @@
240
171
  {
241
172
  "kind": "const",
242
173
  "value": [
243
- 6,
244
- 221,
245
- 246,
246
- 225,
247
- 215,
248
- 101,
249
- 161,
250
- 147,
251
- 217,
252
- 203,
253
- 225,
254
- 70,
255
- 206,
256
- 235,
257
- 121,
258
- 172,
259
- 28,
260
- 180,
261
- 133,
262
- 237,
263
- 95,
264
- 91,
265
- 55,
266
- 145,
267
- 58,
268
- 140,
269
- 245,
270
- 133,
271
- 126,
272
- 255,
273
- 0,
274
- 169
174
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
175
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
275
176
  ]
276
177
  },
277
178
  {
@@ -282,38 +183,8 @@
282
183
  "program": {
283
184
  "kind": "const",
284
185
  "value": [
285
- 140,
286
- 151,
287
- 37,
288
- 143,
289
- 78,
290
- 36,
291
- 137,
292
- 241,
293
- 187,
294
- 61,
295
- 16,
296
- 41,
297
- 20,
298
- 142,
299
- 13,
300
- 131,
301
- 11,
302
- 90,
303
- 19,
304
- 153,
305
- 218,
306
- 255,
307
- 16,
308
- 132,
309
- 4,
310
- 142,
311
- 123,
312
- 216,
313
- 219,
314
- 233,
315
- 248,
316
- 89
186
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
187
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
317
188
  ]
318
189
  }
319
190
  }
@@ -325,19 +196,7 @@
325
196
  "seeds": [
326
197
  {
327
198
  "kind": "const",
328
- "value": [
329
- 115,
330
- 116,
331
- 97,
332
- 107,
333
- 101,
334
- 95,
335
- 118,
336
- 97,
337
- 117,
338
- 108,
339
- 116
340
- ]
199
+ "value": [115, 116, 97, 107, 101, 95, 118, 97, 117, 108, 116]
341
200
  },
342
201
  {
343
202
  "kind": "account",
@@ -358,38 +217,8 @@
358
217
  {
359
218
  "kind": "const",
360
219
  "value": [
361
- 6,
362
- 221,
363
- 246,
364
- 225,
365
- 215,
366
- 101,
367
- 161,
368
- 147,
369
- 217,
370
- 203,
371
- 225,
372
- 70,
373
- 206,
374
- 235,
375
- 121,
376
- 172,
377
- 28,
378
- 180,
379
- 133,
380
- 237,
381
- 95,
382
- 91,
383
- 55,
384
- 145,
385
- 58,
386
- 140,
387
- 245,
388
- 133,
389
- 126,
390
- 255,
391
- 0,
392
- 169
220
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
221
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
393
222
  ]
394
223
  },
395
224
  {
@@ -400,38 +229,8 @@
400
229
  "program": {
401
230
  "kind": "const",
402
231
  "value": [
403
- 140,
404
- 151,
405
- 37,
406
- 143,
407
- 78,
408
- 36,
409
- 137,
410
- 241,
411
- 187,
412
- 61,
413
- 16,
414
- 41,
415
- 20,
416
- 142,
417
- 13,
418
- 131,
419
- 11,
420
- 90,
421
- 19,
422
- 153,
423
- 218,
424
- 255,
425
- 16,
426
- 132,
427
- 4,
428
- 142,
429
- 123,
430
- 216,
431
- 219,
432
- 233,
433
- 248,
434
- 89
232
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
233
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
435
234
  ]
436
235
  }
437
236
  }
@@ -462,16 +261,7 @@
462
261
  },
463
262
  {
464
263
  "name": "unstake_zbcn",
465
- "discriminator": [
466
- 90,
467
- 202,
468
- 101,
469
- 187,
470
- 218,
471
- 99,
472
- 244,
473
- 1
474
- ],
264
+ "discriminator": [90, 202, 101, 187, 218, 99, 244, 1],
475
265
  "accounts": [
476
266
  {
477
267
  "name": "staker",
@@ -485,20 +275,7 @@
485
275
  "seeds": [
486
276
  {
487
277
  "kind": "const",
488
- "value": [
489
- 122,
490
- 101,
491
- 98,
492
- 101,
493
- 99,
494
- 95,
495
- 108,
496
- 111,
497
- 99,
498
- 107,
499
- 117,
500
- 112
501
- ]
278
+ "value": [122, 101, 98, 101, 99, 95, 108, 111, 99, 107, 117, 112]
502
279
  },
503
280
  {
504
281
  "kind": "account",
@@ -546,38 +323,8 @@
546
323
  {
547
324
  "kind": "const",
548
325
  "value": [
549
- 6,
550
- 221,
551
- 246,
552
- 225,
553
- 215,
554
- 101,
555
- 161,
556
- 147,
557
- 217,
558
- 203,
559
- 225,
560
- 70,
561
- 206,
562
- 235,
563
- 121,
564
- 172,
565
- 28,
566
- 180,
567
- 133,
568
- 237,
569
- 95,
570
- 91,
571
- 55,
572
- 145,
573
- 58,
574
- 140,
575
- 245,
576
- 133,
577
- 126,
578
- 255,
579
- 0,
580
- 169
326
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
327
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
581
328
  ]
582
329
  },
583
330
  {
@@ -588,38 +335,8 @@
588
335
  "program": {
589
336
  "kind": "const",
590
337
  "value": [
591
- 140,
592
- 151,
593
- 37,
594
- 143,
595
- 78,
596
- 36,
597
- 137,
598
- 241,
599
- 187,
600
- 61,
601
- 16,
602
- 41,
603
- 20,
604
- 142,
605
- 13,
606
- 131,
607
- 11,
608
- 90,
609
- 19,
610
- 153,
611
- 218,
612
- 255,
613
- 16,
614
- 132,
615
- 4,
616
- 142,
617
- 123,
618
- 216,
619
- 219,
620
- 233,
621
- 248,
622
- 89
338
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
339
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
623
340
  ]
624
341
  }
625
342
  }
@@ -636,38 +353,8 @@
636
353
  {
637
354
  "kind": "const",
638
355
  "value": [
639
- 6,
640
- 221,
641
- 246,
642
- 225,
643
- 215,
644
- 101,
645
- 161,
646
- 147,
647
- 217,
648
- 203,
649
- 225,
650
- 70,
651
- 206,
652
- 235,
653
- 121,
654
- 172,
655
- 28,
656
- 180,
657
- 133,
658
- 237,
659
- 95,
660
- 91,
661
- 55,
662
- 145,
663
- 58,
664
- 140,
665
- 245,
666
- 133,
667
- 126,
668
- 255,
669
- 0,
670
- 169
356
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
357
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
671
358
  ]
672
359
  },
673
360
  {
@@ -678,38 +365,8 @@
678
365
  "program": {
679
366
  "kind": "const",
680
367
  "value": [
681
- 140,
682
- 151,
683
- 37,
684
- 143,
685
- 78,
686
- 36,
687
- 137,
688
- 241,
689
- 187,
690
- 61,
691
- 16,
692
- 41,
693
- 20,
694
- 142,
695
- 13,
696
- 131,
697
- 11,
698
- 90,
699
- 19,
700
- 153,
701
- 218,
702
- 255,
703
- 16,
704
- 132,
705
- 4,
706
- 142,
707
- 123,
708
- 216,
709
- 219,
710
- 233,
711
- 248,
712
- 89
368
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
369
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
713
370
  ]
714
371
  }
715
372
  }
@@ -721,19 +378,7 @@
721
378
  "seeds": [
722
379
  {
723
380
  "kind": "const",
724
- "value": [
725
- 115,
726
- 116,
727
- 97,
728
- 107,
729
- 101,
730
- 95,
731
- 118,
732
- 97,
733
- 117,
734
- 108,
735
- 116
736
- ]
381
+ "value": [115, 116, 97, 107, 101, 95, 118, 97, 117, 108, 116]
737
382
  },
738
383
  {
739
384
  "kind": "account",
@@ -749,20 +394,7 @@
749
394
  "seeds": [
750
395
  {
751
396
  "kind": "const",
752
- "value": [
753
- 114,
754
- 101,
755
- 119,
756
- 97,
757
- 114,
758
- 100,
759
- 95,
760
- 118,
761
- 97,
762
- 117,
763
- 108,
764
- 116
765
- ]
397
+ "value": [114, 101, 119, 97, 114, 100, 95, 118, 97, 117, 108, 116]
766
398
  },
767
399
  {
768
400
  "kind": "account",
@@ -783,38 +415,8 @@
783
415
  {
784
416
  "kind": "const",
785
417
  "value": [
786
- 6,
787
- 221,
788
- 246,
789
- 225,
790
- 215,
791
- 101,
792
- 161,
793
- 147,
794
- 217,
795
- 203,
796
- 225,
797
- 70,
798
- 206,
799
- 235,
800
- 121,
801
- 172,
802
- 28,
803
- 180,
804
- 133,
805
- 237,
806
- 95,
807
- 91,
808
- 55,
809
- 145,
810
- 58,
811
- 140,
812
- 245,
813
- 133,
814
- 126,
815
- 255,
816
- 0,
817
- 169
418
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
419
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
818
420
  ]
819
421
  },
820
422
  {
@@ -825,38 +427,8 @@
825
427
  "program": {
826
428
  "kind": "const",
827
429
  "value": [
828
- 140,
829
- 151,
830
- 37,
831
- 143,
832
- 78,
833
- 36,
834
- 137,
835
- 241,
836
- 187,
837
- 61,
838
- 16,
839
- 41,
840
- 20,
841
- 142,
842
- 13,
843
- 131,
844
- 11,
845
- 90,
846
- 19,
847
- 153,
848
- 218,
849
- 255,
850
- 16,
851
- 132,
852
- 4,
853
- 142,
854
- 123,
855
- 216,
856
- 219,
857
- 233,
858
- 248,
859
- 89
430
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
431
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
860
432
  ]
861
433
  }
862
434
  }
@@ -873,38 +445,8 @@
873
445
  {
874
446
  "kind": "const",
875
447
  "value": [
876
- 6,
877
- 221,
878
- 246,
879
- 225,
880
- 215,
881
- 101,
882
- 161,
883
- 147,
884
- 217,
885
- 203,
886
- 225,
887
- 70,
888
- 206,
889
- 235,
890
- 121,
891
- 172,
892
- 28,
893
- 180,
894
- 133,
895
- 237,
896
- 95,
897
- 91,
898
- 55,
899
- 145,
900
- 58,
901
- 140,
902
- 245,
903
- 133,
904
- 126,
905
- 255,
906
- 0,
907
- 169
448
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
449
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
908
450
  ]
909
451
  },
910
452
  {
@@ -915,38 +457,8 @@
915
457
  "program": {
916
458
  "kind": "const",
917
459
  "value": [
918
- 140,
919
- 151,
920
- 37,
921
- 143,
922
- 78,
923
- 36,
924
- 137,
925
- 241,
926
- 187,
927
- 61,
928
- 16,
929
- 41,
930
- 20,
931
- 142,
932
- 13,
933
- 131,
934
- 11,
935
- 90,
936
- 19,
937
- 153,
938
- 218,
939
- 255,
940
- 16,
941
- 132,
942
- 4,
943
- 142,
944
- 123,
945
- 216,
946
- 219,
947
- 233,
948
- 248,
949
- 89
460
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
461
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
950
462
  ]
951
463
  }
952
464
  }
@@ -967,38 +479,8 @@
967
479
  {
968
480
  "kind": "const",
969
481
  "value": [
970
- 6,
971
- 221,
972
- 246,
973
- 225,
974
- 215,
975
- 101,
976
- 161,
977
- 147,
978
- 217,
979
- 203,
980
- 225,
981
- 70,
982
- 206,
983
- 235,
984
- 121,
985
- 172,
986
- 28,
987
- 180,
988
- 133,
989
- 237,
990
- 95,
991
- 91,
992
- 55,
993
- 145,
994
- 58,
995
- 140,
996
- 245,
997
- 133,
998
- 126,
999
- 255,
1000
- 0,
1001
- 169
482
+ 6, 221, 246, 225, 215, 101, 161, 147, 217, 203, 225, 70, 206, 235, 121, 172, 28, 180, 133, 237, 95,
483
+ 91, 55, 145, 58, 140, 245, 133, 126, 255, 0, 169
1002
484
  ]
1003
485
  },
1004
486
  {
@@ -1009,38 +491,8 @@
1009
491
  "program": {
1010
492
  "kind": "const",
1011
493
  "value": [
1012
- 140,
1013
- 151,
1014
- 37,
1015
- 143,
1016
- 78,
1017
- 36,
1018
- 137,
1019
- 241,
1020
- 187,
1021
- 61,
1022
- 16,
1023
- 41,
1024
- 20,
1025
- 142,
1026
- 13,
1027
- 131,
1028
- 11,
1029
- 90,
1030
- 19,
1031
- 153,
1032
- 218,
1033
- 255,
1034
- 16,
1035
- 132,
1036
- 4,
1037
- 142,
1038
- 123,
1039
- 216,
1040
- 219,
1041
- 233,
1042
- 248,
1043
- 89
494
+ 140, 151, 37, 143, 78, 36, 137, 241, 187, 61, 16, 41, 20, 142, 13, 131, 11, 90, 19, 153, 218, 255, 16,
495
+ 132, 4, 142, 123, 216, 219, 233, 248, 89
1044
496
  ]
1045
497
  }
1046
498
  }
@@ -1067,16 +519,7 @@
1067
519
  },
1068
520
  {
1069
521
  "name": "whitelist_staker",
1070
- "discriminator": [
1071
- 13,
1072
- 211,
1073
- 22,
1074
- 179,
1075
- 35,
1076
- 177,
1077
- 63,
1078
- 155
1079
- ],
522
+ "discriminator": [13, 211, 22, 179, 35, 177, 63, 155],
1080
523
  "accounts": [
1081
524
  {
1082
525
  "name": "admin",
@@ -1090,20 +533,7 @@
1090
533
  "seeds": [
1091
534
  {
1092
535
  "kind": "const",
1093
- "value": [
1094
- 122,
1095
- 101,
1096
- 98,
1097
- 101,
1098
- 99,
1099
- 95,
1100
- 108,
1101
- 111,
1102
- 99,
1103
- 107,
1104
- 117,
1105
- 112
1106
- ]
536
+ "value": [122, 101, 98, 101, 99, 95, 108, 111, 99, 107, 117, 112]
1107
537
  },
1108
538
  {
1109
539
  "kind": "account",
@@ -1175,42 +605,15 @@
1175
605
  "accounts": [
1176
606
  {
1177
607
  "name": "Lockup",
1178
- "discriminator": [
1179
- 1,
1180
- 45,
1181
- 32,
1182
- 32,
1183
- 57,
1184
- 81,
1185
- 88,
1186
- 67
1187
- ]
608
+ "discriminator": [1, 45, 32, 32, 57, 81, 88, 67]
1188
609
  },
1189
610
  {
1190
611
  "name": "UserNonce",
1191
- "discriminator": [
1192
- 235,
1193
- 133,
1194
- 1,
1195
- 243,
1196
- 18,
1197
- 135,
1198
- 88,
1199
- 224
1200
- ]
612
+ "discriminator": [235, 133, 1, 243, 18, 135, 88, 224]
1201
613
  },
1202
614
  {
1203
615
  "name": "UserStakeData",
1204
- "discriminator": [
1205
- 105,
1206
- 207,
1207
- 3,
1208
- 141,
1209
- 114,
1210
- 114,
1211
- 232,
1212
- 147
1213
- ]
616
+ "discriminator": [105, 207, 3, 141, 114, 114, 232, 147]
1214
617
  }
1215
618
  ],
1216
619
  "errors": [
package/dist/index.d.ts CHANGED
@@ -3,3 +3,4 @@ export * from "./artifacts";
3
3
  export * from "./service";
4
4
  export * from "./providers";
5
5
  export * from "./pda";
6
+ export * from "./rateLimitQueue";
package/dist/index.js CHANGED
@@ -19,3 +19,4 @@ __exportStar(require("./artifacts"), exports);
19
19
  __exportStar(require("./service"), exports);
20
20
  __exportStar(require("./providers"), exports);
21
21
  __exportStar(require("./pda"), exports);
22
+ __exportStar(require("./rateLimitQueue"), exports);
@@ -0,0 +1,12 @@
1
+ export declare class RateLimitedQueue {
2
+ private queue;
3
+ private running;
4
+ private maxConcurrent;
5
+ private minDelay;
6
+ private lastRequestTime;
7
+ constructor(maxConcurrent?: number, minDelayMs?: number);
8
+ add<T>(task: () => Promise<T>): Promise<T>;
9
+ private processQueue;
10
+ getQueueLength(): number;
11
+ getRunningCount(): number;
12
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RateLimitedQueue = void 0;
4
+ class RateLimitedQueue {
5
+ queue = [];
6
+ running = 0;
7
+ maxConcurrent;
8
+ minDelay;
9
+ lastRequestTime = 0;
10
+ constructor(maxConcurrent = 3, minDelayMs = 200) {
11
+ this.maxConcurrent = maxConcurrent;
12
+ this.minDelay = minDelayMs;
13
+ }
14
+ async add(task) {
15
+ return new Promise((resolve, reject) => {
16
+ this.queue.push(async () => {
17
+ try {
18
+ // Ensure minimum delay between requests
19
+ const now = Date.now();
20
+ const timeSinceLastRequest = now - this.lastRequestTime;
21
+ if (timeSinceLastRequest < this.minDelay) {
22
+ await new Promise((resolve) => setTimeout(resolve, this.minDelay - timeSinceLastRequest));
23
+ }
24
+ this.lastRequestTime = Date.now();
25
+ const result = await task();
26
+ resolve(result);
27
+ }
28
+ catch (error) {
29
+ reject(error);
30
+ }
31
+ });
32
+ this.processQueue();
33
+ });
34
+ }
35
+ async processQueue() {
36
+ if (this.running >= this.maxConcurrent || this.queue.length === 0) {
37
+ return;
38
+ }
39
+ this.running++;
40
+ const task = this.queue.shift();
41
+ try {
42
+ await task();
43
+ }
44
+ finally {
45
+ this.running--;
46
+ this.processQueue(); // Process next item
47
+ }
48
+ }
49
+ // Test helper methods
50
+ getQueueLength() {
51
+ return this.queue.length;
52
+ }
53
+ getRunningCount() {
54
+ return this.running;
55
+ }
56
+ }
57
+ exports.RateLimitedQueue = RateLimitedQueue;
package/dist/service.d.ts CHANGED
@@ -71,19 +71,13 @@ export declare class StakeService {
71
71
  getLockupInfo(lockupAddress: Address): Promise<LockupInfo | null>;
72
72
  getStakeInfo(stakeAddress: Address, lockupAddress: Address): Promise<StakeInfo | null>;
73
73
  getUserNonceInfo(userNonceAddress: Address): Promise<UserNonceInfo | null>;
74
- getAllStakesInfo(userAdress: Address, lockupAddress: Address): Promise<{
75
- address: string;
76
- nonce: bigint;
77
- createdTime: number;
78
- stakedAmount: string;
79
- rewardAmount: string;
80
- stakeClaimed: boolean;
81
- lockPeriod: number;
82
- staker: string;
83
- lockup: string;
84
- hash: string;
85
- }[]>;
86
- getTotalStakeCount(lockupAddress: Address): Promise<number>;
74
+ getAllStakesInfoOfUser(userAdress: Address, lockupAddress: Address, options?: {
75
+ minDelayMs?: number;
76
+ maxConcurrent?: number;
77
+ }): Promise<StakeInfoWithHash[]>;
78
+ getAllStakesCount(lockupAddress: Address): Promise<number>;
79
+ getStakeSignatureForStake(stakeInfo: StakeInfo): Promise<string | null>;
80
+ getAllStakesInfo(lockupAddress: Address): Promise<StakeInfo[]>;
87
81
  }
88
82
  export type InitLockupInstructionData = {
89
83
  rewardSchemes: ParsedRewardScheme[];
package/dist/service.js CHANGED
@@ -14,6 +14,7 @@ const artifacts_1 = require("./artifacts");
14
14
  const constants_1 = require("./constants");
15
15
  const pda_1 = require("./pda");
16
16
  const providers_1 = require("./providers");
17
+ const rateLimitQueue_1 = require("./rateLimitQueue");
17
18
  const utils_1 = require("./utils");
18
19
  /**
19
20
  * StakeServiceBuilder is a builder class for creating a StakeService instance.
@@ -320,7 +321,7 @@ class StakeService {
320
321
  nonce: BigInt(userNonceAccount.nonce.toString()),
321
322
  };
322
323
  }
323
- async getAllStakesInfo(userAdress, lockupAddress) {
324
+ async getAllStakesInfoOfUser(userAdress, lockupAddress, options = {}) {
324
325
  const lockupAccount = await this.program.account.lockup.fetchNullable(lockupAddress, this.provider.connection.commitment);
325
326
  if (!lockupAccount) {
326
327
  throw new Error("Lockup account does not exists for address: " + lockupAddress);
@@ -358,23 +359,20 @@ class StakeService {
358
359
  };
359
360
  return info;
360
361
  });
361
- // Your mapping with exponential backoff applied to the API call.
362
- const promises = stakeAccountsInfo.map(async (stakeInfo) => {
363
- // Wrap the asynchronous call with our exponential backoff helper.
364
- const signatures = await (0, utils_1.callWithExponentialBackoff)(async () => this.provider.connection.getSignaturesForAddress((0, anchor_1.translateAddress)(stakeInfo.address), {}, "finalized"));
365
- const stakeSignatures = signatures.filter((s) => {
366
- return !s.err && (s.blockTime ?? 0) === stakeInfo.createdTime;
367
- });
368
- const signatureInfo = stakeSignatures[stakeSignatures.length - 1];
369
- const info = {
370
- hash: signatureInfo ? signatureInfo.signature : "",
362
+ let stakesWithHash = new Array(stakeAccountsInfo.length);
363
+ const { maxConcurrent = 3, minDelayMs = 400 } = options;
364
+ const queue = new rateLimitQueue_1.RateLimitedQueue(maxConcurrent, minDelayMs); // Max 3 concurrent, 300ms between requests
365
+ const promises = stakeAccountsInfo.map((stakeInfo, index) => queue.add(async () => {
366
+ const signature = await this.getStakeSignatureForStake(stakeInfo);
367
+ stakesWithHash[index] = {
368
+ hash: signature ? signature : "",
371
369
  ...stakeInfo,
372
370
  };
373
- return info;
374
- });
375
- return Promise.all(promises);
371
+ }));
372
+ await Promise.all(promises);
373
+ return stakesWithHash;
376
374
  }
377
- async getTotalStakeCount(lockupAddress) {
375
+ async getAllStakesCount(lockupAddress) {
378
376
  const dataSize = this.program.account.userStakeData.size;
379
377
  const accountInfos = await this.provider.connection.getProgramAccounts(this.program.programId, {
380
378
  commitment: "finalized",
@@ -396,5 +394,55 @@ class StakeService {
396
394
  });
397
395
  return accountInfos.length;
398
396
  }
397
+ async getStakeSignatureForStake(stakeInfo) {
398
+ const signatures = await (0, utils_1.callWithEnhancedBackoff)(async () => this.provider.connection.getSignaturesForAddress((0, anchor_1.translateAddress)(stakeInfo.address), {}, "finalized"));
399
+ const stakeSignatures = signatures.filter((s) => {
400
+ return !s.err && (s.blockTime ?? 0) === stakeInfo.createdTime;
401
+ });
402
+ const signatureInfo = stakeSignatures[stakeSignatures.length - 1];
403
+ return signatureInfo ? signatureInfo.signature : null;
404
+ }
405
+ async getAllStakesInfo(lockupAddress) {
406
+ const lockupAccount = await this.program.account.lockup.fetchNullable(lockupAddress, this.provider.connection.commitment);
407
+ if (!lockupAccount) {
408
+ throw new Error("Lockup account does not exists for address: " + lockupAddress);
409
+ }
410
+ const stakeTokenAddress = lockupAccount.stakedToken.tokenAddress;
411
+ const rewardTokenAddress = lockupAccount.rewardToken.tokenAddress;
412
+ const stakeTokenDecimals = await (0, solana_common_1.getMintDecimals)(this.provider.connection, stakeTokenAddress);
413
+ const rewardTokenDecimals = await (0, solana_common_1.getMintDecimals)(this.provider.connection, rewardTokenAddress);
414
+ const UNITS_PER_STAKE_TOKEN = constants_1.TEN_BIGNUM.pow(stakeTokenDecimals);
415
+ const UNITS_PER_REWARD_TOKEN = constants_1.TEN_BIGNUM.pow(rewardTokenDecimals);
416
+ const dataSize = this.program.account.userStakeData.size;
417
+ const accountInfos = await this.provider.connection.getProgramAccounts(this.program.programId, {
418
+ commitment: "finalized",
419
+ filters: [
420
+ {
421
+ dataSize,
422
+ },
423
+ {
424
+ memcmp: {
425
+ bytes: lockupAddress.toString(),
426
+ offset: 81,
427
+ },
428
+ },
429
+ ],
430
+ });
431
+ return accountInfos.map((accountInfo) => {
432
+ const stakeAccount = this.program.coder.accounts.decode(this.program.idl.accounts[2].name, accountInfo.account.data);
433
+ const info = {
434
+ address: accountInfo.pubkey.toString(),
435
+ nonce: BigInt(stakeAccount.nonce.toString()),
436
+ createdTime: stakeAccount.createdTime.toNumber(),
437
+ stakedAmount: (0, bignumber_js_1.BigNumber)(stakeAccount.stakedAmount.toString()).div(UNITS_PER_STAKE_TOKEN).toFixed(),
438
+ rewardAmount: (0, bignumber_js_1.BigNumber)(stakeAccount.rewardAmount.toString()).div(UNITS_PER_REWARD_TOKEN).toFixed(),
439
+ stakeClaimed: stakeAccount.stakeClaimed,
440
+ lockPeriod: stakeAccount.lockPeriod.toNumber(),
441
+ lockup: stakeAccount.lockup.toString(),
442
+ staker: stakeAccount.staker.toString(),
443
+ };
444
+ return info;
445
+ });
446
+ }
399
447
  }
400
448
  exports.StakeService = StakeService;
package/dist/utils.d.ts CHANGED
@@ -1 +1 @@
1
- export declare function callWithExponentialBackoff<T>(fn: () => T, attemptsLeft?: number, delay?: number): Promise<T>;
1
+ export declare function callWithEnhancedBackoff<T>(fn: () => Promise<T>, maxRetries?: number, backoffFactor?: number, baseDelay?: number, maxDelay?: number): Promise<T>;
package/dist/utils.js CHANGED
@@ -1,24 +1,31 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.callWithExponentialBackoff = callWithExponentialBackoff;
3
+ exports.callWithEnhancedBackoff = callWithEnhancedBackoff;
4
+ const core_utils_1 = require("@zebec-network/core-utils");
4
5
  // Set your backoff parameters
5
- const MAX_ATTEMPTS = 5;
6
- const INITIAL_DELAY = 100; // in milliseconds
6
+ const MAX_RETRIES = 5;
7
+ const MIN_DELAY = 200; // in milliseconds
7
8
  const BACKOFF_FACTOR = 2;
9
+ const MAX_DELAY = 30000;
8
10
  // Helper function that wraps an async operation with exponential backoff.
9
- async function callWithExponentialBackoff(fn, attemptsLeft = MAX_ATTEMPTS, delay = INITIAL_DELAY) {
10
- try {
11
- return await fn();
12
- }
13
- catch (error) {
14
- if (attemptsLeft === 1) {
15
- // If no attempts remain, rethrow the error.
16
- throw error;
11
+ async function callWithEnhancedBackoff(fn, maxRetries = MAX_RETRIES, backoffFactor = BACKOFF_FACTOR, baseDelay = MIN_DELAY, maxDelay = MAX_DELAY) {
12
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
13
+ try {
14
+ return await fn();
15
+ }
16
+ catch (error) {
17
+ if (attempt === maxRetries)
18
+ throw error;
19
+ let delay = Math.min(baseDelay * Math.pow(backoffFactor, attempt), maxDelay);
20
+ // Handle 429 specifically with longer delays
21
+ if (error?.status === 429 || error?.code === 429 || error?.message?.includes("429")) {
22
+ delay = Math.min(delay * backoffFactor, maxDelay); // Double delay for rate limits
23
+ console.warn(`Rate limit hit, waiting ${delay}ms before retry ${attempt + 1}/${maxRetries}`);
24
+ }
25
+ // Add jitter to prevent thundering herd
26
+ const jitter = Math.random() * 0.3 * delay;
27
+ await (0, core_utils_1.sleep)(delay + jitter);
17
28
  }
18
- console.warn(`Error encountered: ${error instanceof Error ? error.message : "Unknown error"}. Retrying in ${delay} ms... (${attemptsLeft - 1} attempts left)`);
19
- // Wait for the delay period.
20
- await new Promise((resolve) => setTimeout(resolve, delay));
21
- // Try again with one fewer attempt and an exponentially increased delay.
22
- return callWithExponentialBackoff(fn, attemptsLeft - 1, delay * BACKOFF_FACTOR);
23
29
  }
30
+ throw new Error("Max retries exceeded");
24
31
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zebec-network/zebec-stake-sdk",
3
- "version": "1.0.5",
3
+ "version": "1.0.7",
4
4
  "description": "An SDK for zebec network stake solana program",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",