bitbadgesjs-sdk 0.31.0 → 0.31.2
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/dist/cjs/api-indexer/BitBadgesCollection.d.ts +1 -0
- package/dist/cjs/api-indexer/BitBadgesCollection.d.ts.map +1 -1
- package/dist/cjs/api-indexer/BitBadgesCollection.js +4 -1
- package/dist/cjs/api-indexer/BitBadgesCollection.js.map +1 -1
- package/dist/cjs/core/approval-utils.spec.d.ts +2 -0
- package/dist/cjs/core/approval-utils.spec.d.ts.map +1 -0
- package/dist/cjs/core/approval-utils.spec.js +240 -0
- package/dist/cjs/core/approval-utils.spec.js.map +1 -0
- package/dist/cjs/core/approvals.spec.js +96 -0
- package/dist/cjs/core/approvals.spec.js.map +1 -1
- package/dist/cjs/core/bids.spec.d.ts +2 -0
- package/dist/cjs/core/bids.spec.d.ts.map +1 -0
- package/dist/cjs/core/bids.spec.js +201 -0
- package/dist/cjs/core/bids.spec.js.map +1 -0
- package/dist/cjs/core/blockin.spec.d.ts +2 -0
- package/dist/cjs/core/blockin.spec.d.ts.map +1 -0
- package/dist/cjs/core/blockin.spec.js +163 -0
- package/dist/cjs/core/blockin.spec.js.map +1 -0
- package/dist/cjs/core/coin.spec.d.ts +2 -0
- package/dist/cjs/core/coin.spec.d.ts.map +1 -0
- package/dist/cjs/core/coin.spec.js +80 -0
- package/dist/cjs/core/coin.spec.js.map +1 -0
- package/dist/cjs/core/cosmos-wrappers.spec.d.ts +2 -0
- package/dist/cjs/core/cosmos-wrappers.spec.d.ts.map +1 -0
- package/dist/cjs/core/cosmos-wrappers.spec.js +623 -0
- package/dist/cjs/core/cosmos-wrappers.spec.js.map +1 -0
- package/dist/cjs/core/managersplitter.spec.d.ts +2 -0
- package/dist/cjs/core/managersplitter.spec.d.ts.map +1 -0
- package/dist/cjs/core/managersplitter.spec.js +170 -0
- package/dist/cjs/core/managersplitter.spec.js.map +1 -0
- package/dist/cjs/core/overlaps.spec.js +201 -0
- package/dist/cjs/core/overlaps.spec.js.map +1 -1
- package/dist/cjs/core/permission-utils.spec.d.ts +2 -0
- package/dist/cjs/core/permission-utils.spec.d.ts.map +1 -0
- package/dist/cjs/core/permission-utils.spec.js +192 -0
- package/dist/cjs/core/permission-utils.spec.js.map +1 -0
- package/dist/cjs/core/permissions.js +4 -4
- package/dist/cjs/core/permissions.js.map +1 -1
- package/dist/cjs/core/permissions.spec.d.ts +2 -0
- package/dist/cjs/core/permissions.spec.d.ts.map +1 -0
- package/dist/cjs/core/permissions.spec.js +2051 -0
- package/dist/cjs/core/permissions.spec.js.map +1 -0
- package/dist/cjs/core/transfers.d.ts.map +1 -1
- package/dist/cjs/core/transfers.js +11 -7
- package/dist/cjs/core/transfers.js.map +1 -1
- package/dist/cjs/core/transfers.spec.js +647 -0
- package/dist/cjs/core/transfers.spec.js.map +1 -1
- package/dist/cjs/core/userBalances.spec.d.ts +2 -0
- package/dist/cjs/core/userBalances.spec.d.ts.map +1 -0
- package/dist/cjs/core/userBalances.spec.js +184 -0
- package/dist/cjs/core/userBalances.spec.js.map +1 -0
- package/dist/cjs/core/validate-utils.spec.d.ts +2 -0
- package/dist/cjs/core/validate-utils.spec.d.ts.map +1 -0
- package/dist/cjs/core/validate-utils.spec.js +202 -0
- package/dist/cjs/core/validate-utils.spec.js.map +1 -0
- package/dist/cjs/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/api-indexer/BitBadgesCollection.d.ts +1 -0
- package/dist/esm/api-indexer/BitBadgesCollection.d.ts.map +1 -1
- package/dist/esm/api-indexer/BitBadgesCollection.js +4 -1
- package/dist/esm/api-indexer/BitBadgesCollection.js.map +1 -1
- package/dist/esm/core/approval-utils.spec.d.ts +2 -0
- package/dist/esm/core/approval-utils.spec.d.ts.map +1 -0
- package/dist/esm/core/approval-utils.spec.js +238 -0
- package/dist/esm/core/approval-utils.spec.js.map +1 -0
- package/dist/esm/core/approvals.spec.js +97 -1
- package/dist/esm/core/approvals.spec.js.map +1 -1
- package/dist/esm/core/bids.spec.d.ts +2 -0
- package/dist/esm/core/bids.spec.d.ts.map +1 -0
- package/dist/esm/core/bids.spec.js +199 -0
- package/dist/esm/core/bids.spec.js.map +1 -0
- package/dist/esm/core/blockin.spec.d.ts +2 -0
- package/dist/esm/core/blockin.spec.d.ts.map +1 -0
- package/dist/esm/core/blockin.spec.js +161 -0
- package/dist/esm/core/blockin.spec.js.map +1 -0
- package/dist/esm/core/coin.spec.d.ts +2 -0
- package/dist/esm/core/coin.spec.d.ts.map +1 -0
- package/dist/esm/core/coin.spec.js +78 -0
- package/dist/esm/core/coin.spec.js.map +1 -0
- package/dist/esm/core/cosmos-wrappers.spec.d.ts +2 -0
- package/dist/esm/core/cosmos-wrappers.spec.d.ts.map +1 -0
- package/dist/esm/core/cosmos-wrappers.spec.js +621 -0
- package/dist/esm/core/cosmos-wrappers.spec.js.map +1 -0
- package/dist/esm/core/managersplitter.spec.d.ts +2 -0
- package/dist/esm/core/managersplitter.spec.d.ts.map +1 -0
- package/dist/esm/core/managersplitter.spec.js +168 -0
- package/dist/esm/core/managersplitter.spec.js.map +1 -0
- package/dist/esm/core/overlaps.spec.js +202 -1
- package/dist/esm/core/overlaps.spec.js.map +1 -1
- package/dist/esm/core/permission-utils.spec.d.ts +2 -0
- package/dist/esm/core/permission-utils.spec.d.ts.map +1 -0
- package/dist/esm/core/permission-utils.spec.js +190 -0
- package/dist/esm/core/permission-utils.spec.js.map +1 -0
- package/dist/esm/core/permissions.js +4 -4
- package/dist/esm/core/permissions.js.map +1 -1
- package/dist/esm/core/permissions.spec.d.ts +2 -0
- package/dist/esm/core/permissions.spec.d.ts.map +1 -0
- package/dist/esm/core/permissions.spec.js +2049 -0
- package/dist/esm/core/permissions.spec.js.map +1 -0
- package/dist/esm/core/transfers.d.ts.map +1 -1
- package/dist/esm/core/transfers.js +11 -7
- package/dist/esm/core/transfers.js.map +1 -1
- package/dist/esm/core/transfers.spec.js +648 -1
- package/dist/esm/core/transfers.spec.js.map +1 -1
- package/dist/esm/core/userBalances.spec.d.ts +2 -0
- package/dist/esm/core/userBalances.spec.d.ts.map +1 -0
- package/dist/esm/core/userBalances.spec.js +182 -0
- package/dist/esm/core/userBalances.spec.js.map +1 -0
- package/dist/esm/core/validate-utils.spec.d.ts +2 -0
- package/dist/esm/core/validate-utils.spec.d.ts.map +1 -0
- package/dist/esm/core/validate-utils.spec.js +200 -0
- package/dist/esm/core/validate-utils.spec.js.map +1 -0
- package/dist/esm/tsconfig-esm.build.tsbuildinfo +1 -1
- package/package.json +4 -5
|
@@ -3,6 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const addressLists_spec_js_1 = require("./addressLists.spec.js");
|
|
4
4
|
const transfers_js_1 = require("./transfers.js");
|
|
5
5
|
const uintRanges_js_1 = require("./uintRanges.js");
|
|
6
|
+
const string_numbers_js_1 = require("../common/string-numbers.js");
|
|
7
|
+
const misc_js_1 = require("./misc.js");
|
|
6
8
|
BigInt.prototype.toJSON = function () {
|
|
7
9
|
return this.toString();
|
|
8
10
|
};
|
|
@@ -385,6 +387,651 @@ describe('Transfers', () => {
|
|
|
385
387
|
const allBalances = (0, transfers_js_1.getAllBalancesToBeTransferred)(transfersWithIncrements, currentTime);
|
|
386
388
|
expect(allBalances.length).toBeGreaterThan(0);
|
|
387
389
|
});
|
|
390
|
+
it('should compute end time as blockTime + duration - 1 (matching on-chain behavior) via slow path', () => {
|
|
391
|
+
const blockTime = 1000000n;
|
|
392
|
+
const duration = 50000n;
|
|
393
|
+
const expectedEnd = blockTime + duration - 1n;
|
|
394
|
+
const startingBalances = [
|
|
395
|
+
{
|
|
396
|
+
amount: 1n,
|
|
397
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
398
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
399
|
+
}
|
|
400
|
+
];
|
|
401
|
+
const transfersWithIncrements = [
|
|
402
|
+
{
|
|
403
|
+
from: 'Mint',
|
|
404
|
+
balances: [
|
|
405
|
+
{
|
|
406
|
+
amount: 1n,
|
|
407
|
+
tokenIds: [{ start: 1n, end: 2n }],
|
|
408
|
+
ownershipTimes: [{ start: blockTime, end: expectedEnd }]
|
|
409
|
+
}
|
|
410
|
+
],
|
|
411
|
+
toAddresses: [(0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)()],
|
|
412
|
+
incrementTokenIdsBy: 3n,
|
|
413
|
+
incrementOwnershipTimesBy: 0n,
|
|
414
|
+
durationFromTimestamp: duration
|
|
415
|
+
}
|
|
416
|
+
];
|
|
417
|
+
const balancesAfterTransfers = (0, transfers_js_1.getBalancesAfterTransfers)(startingBalances, transfersWithIncrements, blockTime);
|
|
418
|
+
const remaining = balancesAfterTransfers.filterZeroBalances();
|
|
419
|
+
expect(remaining.length).toBeGreaterThan(0);
|
|
420
|
+
});
|
|
421
|
+
it('should compute end time as blockTime + duration - 1 via fast path', () => {
|
|
422
|
+
const blockTime = 1000000n;
|
|
423
|
+
const duration = 50000n;
|
|
424
|
+
const expectedEnd = blockTime + duration - 1n;
|
|
425
|
+
const startingBalances = [
|
|
426
|
+
{
|
|
427
|
+
amount: 1n,
|
|
428
|
+
tokenIds: [{ start: 1n, end: 100n }],
|
|
429
|
+
ownershipTimes: [{ start: blockTime, end: expectedEnd }]
|
|
430
|
+
}
|
|
431
|
+
];
|
|
432
|
+
const transfersWithIncrements = [
|
|
433
|
+
{
|
|
434
|
+
from: 'Mint',
|
|
435
|
+
balances: [
|
|
436
|
+
{
|
|
437
|
+
amount: 1n,
|
|
438
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
439
|
+
ownershipTimes: [{ start: 0n, end: 100000n }]
|
|
440
|
+
}
|
|
441
|
+
],
|
|
442
|
+
toAddresses: [],
|
|
443
|
+
toAddressesLength: 100n,
|
|
444
|
+
incrementTokenIdsBy: 1n,
|
|
445
|
+
incrementOwnershipTimesBy: 0n,
|
|
446
|
+
durationFromTimestamp: duration
|
|
447
|
+
}
|
|
448
|
+
];
|
|
449
|
+
const allBalances = (0, transfers_js_1.getAllBalancesToBeTransferred)(transfersWithIncrements, blockTime);
|
|
450
|
+
expect(allBalances.length).toBeGreaterThan(0);
|
|
451
|
+
for (const balance of allBalances) {
|
|
452
|
+
for (const ownershipTime of balance.ownershipTimes) {
|
|
453
|
+
expect(ownershipTime.start).toBe(blockTime);
|
|
454
|
+
expect(ownershipTime.end).toBe(expectedEnd);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
const balancesAfterTransfers = (0, transfers_js_1.getBalancesAfterTransfers)(startingBalances, transfersWithIncrements, blockTime);
|
|
458
|
+
expect(balancesAfterTransfers.filterZeroBalances().length).toBe(0);
|
|
459
|
+
});
|
|
460
|
+
it('should NOT match if end time were blockTime + duration (without -1)', () => {
|
|
461
|
+
const blockTime = 1000000n;
|
|
462
|
+
const duration = 50000n;
|
|
463
|
+
const wrongEnd = blockTime + duration;
|
|
464
|
+
const allBalances = (0, transfers_js_1.getAllBalancesToBeTransferred)([
|
|
465
|
+
{
|
|
466
|
+
from: 'Mint',
|
|
467
|
+
balances: [
|
|
468
|
+
{
|
|
469
|
+
amount: 1n,
|
|
470
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
471
|
+
ownershipTimes: [{ start: 0n, end: 100000n }]
|
|
472
|
+
}
|
|
473
|
+
],
|
|
474
|
+
toAddresses: [(0, addressLists_spec_js_1.genTestAddress)()],
|
|
475
|
+
incrementTokenIdsBy: 0n,
|
|
476
|
+
incrementOwnershipTimesBy: 0n,
|
|
477
|
+
durationFromTimestamp: duration
|
|
478
|
+
}
|
|
479
|
+
], blockTime);
|
|
480
|
+
for (const balance of allBalances) {
|
|
481
|
+
for (const ownershipTime of balance.ownershipTimes) {
|
|
482
|
+
expect(ownershipTime.end).not.toBe(wrongEnd);
|
|
483
|
+
expect(ownershipTime.end).toBe(wrongEnd - 1n);
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
});
|
|
487
|
+
it('should give all recipients the same duration-based ownership times', () => {
|
|
488
|
+
const blockTime = 1000000n;
|
|
489
|
+
const duration = 86400000n;
|
|
490
|
+
const recipients = [(0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)()];
|
|
491
|
+
const transfers = (0, transfers_js_1.getTransfersFromTransfersWithIncrements)([
|
|
492
|
+
{
|
|
493
|
+
from: 'Mint',
|
|
494
|
+
toAddresses: recipients,
|
|
495
|
+
balances: [
|
|
496
|
+
{
|
|
497
|
+
amount: 1n,
|
|
498
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
499
|
+
ownershipTimes: [{ start: 0n, end: 100000n }]
|
|
500
|
+
}
|
|
501
|
+
],
|
|
502
|
+
durationFromTimestamp: duration
|
|
503
|
+
}
|
|
504
|
+
], blockTime);
|
|
505
|
+
expect(transfers.length).toBe(3);
|
|
506
|
+
const expectedStart = blockTime;
|
|
507
|
+
const expectedEnd = blockTime + duration - 1n;
|
|
508
|
+
for (let i = 0; i < transfers.length; i++) {
|
|
509
|
+
expect(transfers[i].balances[0].ownershipTimes[0].start).toBe(expectedStart);
|
|
510
|
+
expect(transfers[i].balances[0].ownershipTimes[0].end).toBe(expectedEnd);
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
});
|
|
514
|
+
describe('Transfer class', () => {
|
|
515
|
+
it('should construct a Transfer with required fields', () => {
|
|
516
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
517
|
+
const addr2 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
518
|
+
const transfer = new transfers_js_1.Transfer({
|
|
519
|
+
from: addr1,
|
|
520
|
+
toAddresses: [addr2],
|
|
521
|
+
balances: [
|
|
522
|
+
{
|
|
523
|
+
amount: 10n,
|
|
524
|
+
tokenIds: [{ start: 1n, end: 5n }],
|
|
525
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
526
|
+
}
|
|
527
|
+
]
|
|
528
|
+
});
|
|
529
|
+
expect(transfer.from).toBe(addr1);
|
|
530
|
+
expect(transfer.toAddresses).toEqual([addr2]);
|
|
531
|
+
expect(transfer.balances.length).toBe(1);
|
|
532
|
+
expect(transfer.balances[0].amount).toBe(10n);
|
|
533
|
+
});
|
|
534
|
+
it('should construct with optional memo', () => {
|
|
535
|
+
const transfer = new transfers_js_1.Transfer({
|
|
536
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
537
|
+
toAddresses: [(0, addressLists_spec_js_1.genTestAddress)()],
|
|
538
|
+
balances: [],
|
|
539
|
+
memo: 'test memo'
|
|
540
|
+
});
|
|
541
|
+
expect(transfer.memo).toBe('test memo');
|
|
542
|
+
});
|
|
543
|
+
it('should return empty number field names', () => {
|
|
544
|
+
const transfer = new transfers_js_1.Transfer({
|
|
545
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
546
|
+
toAddresses: [],
|
|
547
|
+
balances: []
|
|
548
|
+
});
|
|
549
|
+
expect(transfer.getNumberFieldNames()).toEqual([]);
|
|
550
|
+
});
|
|
551
|
+
it('should convert between number types', () => {
|
|
552
|
+
const transfer = new transfers_js_1.Transfer({
|
|
553
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
554
|
+
toAddresses: [(0, addressLists_spec_js_1.genTestAddress)()],
|
|
555
|
+
balances: [
|
|
556
|
+
{
|
|
557
|
+
amount: 100n,
|
|
558
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
559
|
+
ownershipTimes: [{ start: 1n, end: 1000n }]
|
|
560
|
+
}
|
|
561
|
+
]
|
|
562
|
+
});
|
|
563
|
+
const stringified = transfer.convert(string_numbers_js_1.Stringify);
|
|
564
|
+
expect(stringified.balances[0].amount).toBe('100');
|
|
565
|
+
expect(stringified.balances[0].tokenIds[0].start).toBe('1');
|
|
566
|
+
expect(stringified.balances[0].tokenIds[0].end).toBe('10');
|
|
567
|
+
});
|
|
568
|
+
it('should handle optional fields being undefined', () => {
|
|
569
|
+
const transfer = new transfers_js_1.Transfer({
|
|
570
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
571
|
+
toAddresses: [],
|
|
572
|
+
balances: []
|
|
573
|
+
});
|
|
574
|
+
expect(transfer.precalculateBalancesFromApproval).toBeUndefined();
|
|
575
|
+
expect(transfer.merkleProofs).toBeUndefined();
|
|
576
|
+
expect(transfer.ethSignatureProofs).toBeUndefined();
|
|
577
|
+
expect(transfer.memo).toBeUndefined();
|
|
578
|
+
expect(transfer.prioritizedApprovals).toBeUndefined();
|
|
579
|
+
expect(transfer.onlyCheckPrioritizedCollectionApprovals).toBeUndefined();
|
|
580
|
+
expect(transfer.onlyCheckPrioritizedIncomingApprovals).toBeUndefined();
|
|
581
|
+
expect(transfer.onlyCheckPrioritizedOutgoingApprovals).toBeUndefined();
|
|
582
|
+
});
|
|
583
|
+
});
|
|
584
|
+
describe('TransferWithIncrements class', () => {
|
|
585
|
+
it('should construct with increment fields', () => {
|
|
586
|
+
const twi = new transfers_js_1.TransferWithIncrements({
|
|
587
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
588
|
+
toAddresses: [(0, addressLists_spec_js_1.genTestAddress)()],
|
|
589
|
+
balances: [
|
|
590
|
+
{
|
|
591
|
+
amount: 1n,
|
|
592
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
593
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
594
|
+
}
|
|
595
|
+
],
|
|
596
|
+
incrementTokenIdsBy: 1n,
|
|
597
|
+
incrementOwnershipTimesBy: 0n,
|
|
598
|
+
toAddressesLength: 100n,
|
|
599
|
+
durationFromTimestamp: 0n
|
|
600
|
+
});
|
|
601
|
+
expect(twi.incrementTokenIdsBy).toBe(1n);
|
|
602
|
+
expect(twi.incrementOwnershipTimesBy).toBe(0n);
|
|
603
|
+
expect(twi.toAddressesLength).toBe(100n);
|
|
604
|
+
expect(twi.durationFromTimestamp).toBe(0n);
|
|
605
|
+
});
|
|
606
|
+
it('should return correct number field names', () => {
|
|
607
|
+
const twi = new transfers_js_1.TransferWithIncrements({
|
|
608
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
609
|
+
toAddresses: [],
|
|
610
|
+
balances: []
|
|
611
|
+
});
|
|
612
|
+
expect(twi.getNumberFieldNames()).toEqual([
|
|
613
|
+
'toAddressesLength',
|
|
614
|
+
'incrementTokenIdsBy',
|
|
615
|
+
'incrementOwnershipTimesBy',
|
|
616
|
+
'durationFromTimestamp'
|
|
617
|
+
]);
|
|
618
|
+
});
|
|
619
|
+
it('should convert between number types', () => {
|
|
620
|
+
const twi = new transfers_js_1.TransferWithIncrements({
|
|
621
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
622
|
+
toAddresses: [],
|
|
623
|
+
balances: [
|
|
624
|
+
{
|
|
625
|
+
amount: 50n,
|
|
626
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
627
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
628
|
+
}
|
|
629
|
+
],
|
|
630
|
+
incrementTokenIdsBy: 5n,
|
|
631
|
+
toAddressesLength: 20n
|
|
632
|
+
});
|
|
633
|
+
const stringified = twi.convert(string_numbers_js_1.Stringify);
|
|
634
|
+
expect(stringified.incrementTokenIdsBy).toBe('5');
|
|
635
|
+
expect(stringified.toAddressesLength).toBe('20');
|
|
636
|
+
expect(stringified.balances[0].amount).toBe('50');
|
|
637
|
+
});
|
|
638
|
+
it('should handle undefined optional increment fields', () => {
|
|
639
|
+
const twi = new transfers_js_1.TransferWithIncrements({
|
|
640
|
+
from: (0, addressLists_spec_js_1.genTestAddress)(),
|
|
641
|
+
toAddresses: [],
|
|
642
|
+
balances: []
|
|
643
|
+
});
|
|
644
|
+
expect(twi.incrementTokenIdsBy).toBeUndefined();
|
|
645
|
+
expect(twi.incrementOwnershipTimesBy).toBeUndefined();
|
|
646
|
+
expect(twi.toAddressesLength).toBeUndefined();
|
|
647
|
+
expect(twi.durationFromTimestamp).toBeUndefined();
|
|
648
|
+
});
|
|
649
|
+
});
|
|
650
|
+
describe('getBalanceAfterTransfer (single)', () => {
|
|
651
|
+
it('should subtract a single transfer from balance', () => {
|
|
652
|
+
const startBalance = [
|
|
653
|
+
{
|
|
654
|
+
amount: 100n,
|
|
655
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
656
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
657
|
+
}
|
|
658
|
+
];
|
|
659
|
+
const result = (0, transfers_js_1.getBalanceAfterTransfer)(startBalance, 1n, 10n, 1n, 18446744073709551615n, 10n, 1n);
|
|
660
|
+
expect(result[0].amount).toBe(90n);
|
|
661
|
+
});
|
|
662
|
+
it('should multiply amount by numRecipients', () => {
|
|
663
|
+
const startBalance = [
|
|
664
|
+
{
|
|
665
|
+
amount: 100n,
|
|
666
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
667
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
668
|
+
}
|
|
669
|
+
];
|
|
670
|
+
const result = (0, transfers_js_1.getBalanceAfterTransfer)(startBalance, 1n, 1n, 1n, 18446744073709551615n, 10n, 5n);
|
|
671
|
+
expect(result[0].amount).toBe(50n);
|
|
672
|
+
});
|
|
673
|
+
it('should throw on underflow without allowUnderflow', () => {
|
|
674
|
+
const startBalance = [
|
|
675
|
+
{
|
|
676
|
+
amount: 10n,
|
|
677
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
678
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
679
|
+
}
|
|
680
|
+
];
|
|
681
|
+
expect(() => (0, transfers_js_1.getBalanceAfterTransfer)(startBalance, 1n, 1n, 1n, 18446744073709551615n, 20n, 1n, false)).toThrow();
|
|
682
|
+
});
|
|
683
|
+
it('should allow underflow when flag is set', () => {
|
|
684
|
+
const startBalance = [
|
|
685
|
+
{
|
|
686
|
+
amount: 10n,
|
|
687
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
688
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
689
|
+
}
|
|
690
|
+
];
|
|
691
|
+
const result = (0, transfers_js_1.getBalanceAfterTransfer)(startBalance, 1n, 1n, 1n, 18446744073709551615n, 20n, 1n, true);
|
|
692
|
+
expect(result[0].amount).toBe(-10n);
|
|
693
|
+
});
|
|
694
|
+
it('should return empty array when balance is fully depleted', () => {
|
|
695
|
+
const startBalance = [
|
|
696
|
+
{
|
|
697
|
+
amount: 50n,
|
|
698
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
699
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
700
|
+
}
|
|
701
|
+
];
|
|
702
|
+
const result = (0, transfers_js_1.getBalanceAfterTransfer)(startBalance, 1n, 1n, 1n, 18446744073709551615n, 50n, 1n);
|
|
703
|
+
const filtered = result.filter((b) => b.amount > 0n);
|
|
704
|
+
expect(filtered.length).toBe(0);
|
|
705
|
+
});
|
|
706
|
+
it('should only subtract from matching token ID range', () => {
|
|
707
|
+
const startBalance = [
|
|
708
|
+
{
|
|
709
|
+
amount: 100n,
|
|
710
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
711
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
712
|
+
}
|
|
713
|
+
];
|
|
714
|
+
const result = (0, transfers_js_1.getBalanceAfterTransfer)(startBalance, 5n, 5n, 1n, 18446744073709551615n, 50n, 1n);
|
|
715
|
+
const totalNonZero = result.filter((b) => b.amount > 0n);
|
|
716
|
+
expect(totalNonZero.length).toBeGreaterThan(0);
|
|
717
|
+
});
|
|
718
|
+
});
|
|
719
|
+
describe('convertOffChainBalancesMap', () => {
|
|
720
|
+
it('should convert balances map between number types', () => {
|
|
721
|
+
const bigintMap = {
|
|
722
|
+
[(0, addressLists_spec_js_1.genTestAddress)()]: [
|
|
723
|
+
{
|
|
724
|
+
amount: 100n,
|
|
725
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
726
|
+
ownershipTimes: [{ start: 1n, end: 1000n }]
|
|
727
|
+
}
|
|
728
|
+
]
|
|
729
|
+
};
|
|
730
|
+
const stringMap = (0, transfers_js_1.convertOffChainBalancesMap)(bigintMap, string_numbers_js_1.Stringify);
|
|
731
|
+
const keys = Object.keys(stringMap);
|
|
732
|
+
expect(keys.length).toBe(1);
|
|
733
|
+
expect(stringMap[keys[0]][0].amount).toBe('100');
|
|
734
|
+
expect(stringMap[keys[0]][0].tokenIds[0].start).toBe('1');
|
|
735
|
+
});
|
|
736
|
+
it('should handle empty map', () => {
|
|
737
|
+
const result = (0, transfers_js_1.convertOffChainBalancesMap)({}, string_numbers_js_1.Stringify);
|
|
738
|
+
expect(Object.keys(result).length).toBe(0);
|
|
739
|
+
});
|
|
740
|
+
it('should handle map with multiple addresses', () => {
|
|
741
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
742
|
+
const addr2 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
743
|
+
const bigintMap = {
|
|
744
|
+
[addr1]: [
|
|
745
|
+
{
|
|
746
|
+
amount: 50n,
|
|
747
|
+
tokenIds: [{ start: 1n, end: 5n }],
|
|
748
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
749
|
+
}
|
|
750
|
+
],
|
|
751
|
+
[addr2]: [
|
|
752
|
+
{
|
|
753
|
+
amount: 200n,
|
|
754
|
+
tokenIds: [{ start: 10n, end: 20n }],
|
|
755
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
756
|
+
}
|
|
757
|
+
]
|
|
758
|
+
};
|
|
759
|
+
const stringMap = (0, transfers_js_1.convertOffChainBalancesMap)(bigintMap, string_numbers_js_1.Stringify);
|
|
760
|
+
expect(stringMap[addr1][0].amount).toBe('50');
|
|
761
|
+
expect(stringMap[addr2][0].amount).toBe('200');
|
|
762
|
+
});
|
|
763
|
+
});
|
|
764
|
+
describe('createBalanceMapForOffChainBalances - error paths', () => {
|
|
765
|
+
it('should throw when durationFromTimestamp is used', () => {
|
|
766
|
+
const transfers = [
|
|
767
|
+
{
|
|
768
|
+
from: 'Mint',
|
|
769
|
+
balances: [
|
|
770
|
+
{
|
|
771
|
+
amount: 1n,
|
|
772
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
773
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
774
|
+
}
|
|
775
|
+
],
|
|
776
|
+
toAddresses: [(0, addressLists_spec_js_1.genTestAddress)()],
|
|
777
|
+
durationFromTimestamp: 86400000n
|
|
778
|
+
}
|
|
779
|
+
];
|
|
780
|
+
expect(() => (0, transfers_js_1.createBalanceMapForOffChainBalances)(transfers)).toThrow('durationFromTimestamp is not supported in createBalanceMapForOffChainBalances');
|
|
781
|
+
});
|
|
782
|
+
});
|
|
783
|
+
describe('getTransfersFromTransfersWithIncrements', () => {
|
|
784
|
+
it('should return single transfer when no increments', () => {
|
|
785
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
786
|
+
const addr2 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
787
|
+
const transfers = (0, transfers_js_1.getTransfersFromTransfersWithIncrements)([
|
|
788
|
+
{
|
|
789
|
+
from: addr1,
|
|
790
|
+
toAddresses: [addr2],
|
|
791
|
+
balances: [
|
|
792
|
+
{
|
|
793
|
+
amount: 10n,
|
|
794
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
795
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
796
|
+
}
|
|
797
|
+
]
|
|
798
|
+
}
|
|
799
|
+
], 0n);
|
|
800
|
+
expect(transfers.length).toBe(1);
|
|
801
|
+
expect(transfers[0].toAddresses).toEqual([addr2]);
|
|
802
|
+
});
|
|
803
|
+
it('should create N transfers when incrementTokenIdsBy is set', () => {
|
|
804
|
+
const recipients = [(0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)()];
|
|
805
|
+
const transfers = (0, transfers_js_1.getTransfersFromTransfersWithIncrements)([
|
|
806
|
+
{
|
|
807
|
+
from: 'Mint',
|
|
808
|
+
toAddresses: recipients,
|
|
809
|
+
balances: [
|
|
810
|
+
{
|
|
811
|
+
amount: 1n,
|
|
812
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
813
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
814
|
+
}
|
|
815
|
+
],
|
|
816
|
+
incrementTokenIdsBy: 1n
|
|
817
|
+
}
|
|
818
|
+
], 0n);
|
|
819
|
+
expect(transfers.length).toBe(3);
|
|
820
|
+
expect(transfers[0].balances[0].tokenIds[0].start).toBe(1n);
|
|
821
|
+
expect(transfers[0].balances[0].tokenIds[0].end).toBe(1n);
|
|
822
|
+
expect(transfers[1].balances[0].tokenIds[0].start).toBe(2n);
|
|
823
|
+
expect(transfers[2].balances[0].tokenIds[0].start).toBe(3n);
|
|
824
|
+
});
|
|
825
|
+
it('should create N transfers when incrementOwnershipTimesBy is set', () => {
|
|
826
|
+
const recipients = [(0, addressLists_spec_js_1.genTestAddress)(), (0, addressLists_spec_js_1.genTestAddress)()];
|
|
827
|
+
const transfers = (0, transfers_js_1.getTransfersFromTransfersWithIncrements)([
|
|
828
|
+
{
|
|
829
|
+
from: 'Mint',
|
|
830
|
+
toAddresses: recipients,
|
|
831
|
+
balances: [
|
|
832
|
+
{
|
|
833
|
+
amount: 1n,
|
|
834
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
835
|
+
ownershipTimes: [{ start: 1000n, end: 2000n }]
|
|
836
|
+
}
|
|
837
|
+
],
|
|
838
|
+
incrementOwnershipTimesBy: 5000n
|
|
839
|
+
}
|
|
840
|
+
], 0n);
|
|
841
|
+
expect(transfers.length).toBe(2);
|
|
842
|
+
expect(transfers[0].balances[0].ownershipTimes[0].start).toBe(1000n);
|
|
843
|
+
expect(transfers[0].balances[0].ownershipTimes[0].end).toBe(2000n);
|
|
844
|
+
expect(transfers[1].balances[0].ownershipTimes[0].start).toBe(6000n);
|
|
845
|
+
expect(transfers[1].balances[0].ownershipTimes[0].end).toBe(7000n);
|
|
846
|
+
});
|
|
847
|
+
it('should handle empty transfers array', () => {
|
|
848
|
+
const transfers = (0, transfers_js_1.getTransfersFromTransfersWithIncrements)([], 0n);
|
|
849
|
+
expect(transfers.length).toBe(0);
|
|
850
|
+
});
|
|
851
|
+
it('should use toAddressesLength over toAddresses.length when both are set', () => {
|
|
852
|
+
const addr = (0, addressLists_spec_js_1.genTestAddress)();
|
|
853
|
+
const transfers = (0, transfers_js_1.getTransfersFromTransfersWithIncrements)([
|
|
854
|
+
{
|
|
855
|
+
from: 'Mint',
|
|
856
|
+
toAddresses: [addr],
|
|
857
|
+
balances: [
|
|
858
|
+
{
|
|
859
|
+
amount: 1n,
|
|
860
|
+
tokenIds: [{ start: 1n, end: 1n }],
|
|
861
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
862
|
+
}
|
|
863
|
+
]
|
|
864
|
+
}
|
|
865
|
+
], 0n);
|
|
866
|
+
expect(transfers.length).toBe(1);
|
|
867
|
+
});
|
|
868
|
+
});
|
|
869
|
+
describe('Transfer class - proto/JSON serialization', () => {
|
|
870
|
+
it('should convert to proto and back via fromProto', () => {
|
|
871
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
872
|
+
const addr2 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
873
|
+
const original = new transfers_js_1.Transfer({
|
|
874
|
+
from: addr1,
|
|
875
|
+
toAddresses: [addr2],
|
|
876
|
+
balances: [
|
|
877
|
+
{
|
|
878
|
+
amount: 42n,
|
|
879
|
+
tokenIds: [{ start: 1n, end: 10n }],
|
|
880
|
+
ownershipTimes: [{ start: 1n, end: 1000n }]
|
|
881
|
+
}
|
|
882
|
+
]
|
|
883
|
+
});
|
|
884
|
+
const proto = original.toProto();
|
|
885
|
+
expect(proto).toBeTruthy();
|
|
886
|
+
const restored = transfers_js_1.Transfer.fromProto(proto, string_numbers_js_1.BigIntify);
|
|
887
|
+
expect(restored.from).toBe(addr1);
|
|
888
|
+
expect(restored.toAddresses).toEqual([addr2]);
|
|
889
|
+
expect(restored.balances[0].amount).toBe(42n);
|
|
890
|
+
expect(restored.balances[0].tokenIds[0].start).toBe(1n);
|
|
891
|
+
expect(restored.balances[0].tokenIds[0].end).toBe(10n);
|
|
892
|
+
});
|
|
893
|
+
it('should round-trip through fromJson', () => {
|
|
894
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
895
|
+
const addr2 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
896
|
+
const original = new transfers_js_1.Transfer({
|
|
897
|
+
from: addr1,
|
|
898
|
+
toAddresses: [addr2],
|
|
899
|
+
balances: [
|
|
900
|
+
{
|
|
901
|
+
amount: 10n,
|
|
902
|
+
tokenIds: [{ start: 5n, end: 5n }],
|
|
903
|
+
ownershipTimes: [{ start: 1n, end: 100n }]
|
|
904
|
+
}
|
|
905
|
+
],
|
|
906
|
+
memo: 'hello'
|
|
907
|
+
});
|
|
908
|
+
const proto = original.toProto();
|
|
909
|
+
const jsonVal = proto.toJson();
|
|
910
|
+
const restored = transfers_js_1.Transfer.fromJson(jsonVal, string_numbers_js_1.BigIntify);
|
|
911
|
+
expect(restored.from).toBe(addr1);
|
|
912
|
+
expect(restored.balances[0].amount).toBe(10n);
|
|
913
|
+
expect(restored.memo).toBe('hello');
|
|
914
|
+
});
|
|
915
|
+
it('should round-trip through fromJsonString', () => {
|
|
916
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
917
|
+
const original = new transfers_js_1.Transfer({
|
|
918
|
+
from: addr1,
|
|
919
|
+
toAddresses: [],
|
|
920
|
+
balances: [
|
|
921
|
+
{
|
|
922
|
+
amount: 7n,
|
|
923
|
+
tokenIds: [{ start: 3n, end: 3n }],
|
|
924
|
+
ownershipTimes: uintRanges_js_1.UintRangeArray.FullRanges()
|
|
925
|
+
}
|
|
926
|
+
]
|
|
927
|
+
});
|
|
928
|
+
const jsonStr = original.toProto().toJsonString();
|
|
929
|
+
const restored = transfers_js_1.Transfer.fromJsonString(jsonStr, string_numbers_js_1.BigIntify);
|
|
930
|
+
expect(restored.from).toBe(addr1);
|
|
931
|
+
expect(restored.balances[0].amount).toBe(7n);
|
|
932
|
+
});
|
|
933
|
+
it('should construct Transfer with prioritizedApprovals', () => {
|
|
934
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
935
|
+
const transfer = new transfers_js_1.Transfer({
|
|
936
|
+
from: addr1,
|
|
937
|
+
toAddresses: [],
|
|
938
|
+
balances: [],
|
|
939
|
+
prioritizedApprovals: [
|
|
940
|
+
new misc_js_1.ApprovalIdentifierDetails({
|
|
941
|
+
approvalId: 'approval-1',
|
|
942
|
+
approvalLevel: 'collection',
|
|
943
|
+
approverAddress: '',
|
|
944
|
+
version: 0n
|
|
945
|
+
})
|
|
946
|
+
],
|
|
947
|
+
onlyCheckPrioritizedCollectionApprovals: true,
|
|
948
|
+
onlyCheckPrioritizedIncomingApprovals: false,
|
|
949
|
+
onlyCheckPrioritizedOutgoingApprovals: true
|
|
950
|
+
});
|
|
951
|
+
expect(transfer.prioritizedApprovals).toBeDefined();
|
|
952
|
+
expect(transfer.prioritizedApprovals.length).toBe(1);
|
|
953
|
+
expect(transfer.prioritizedApprovals[0].approvalId).toBe('approval-1');
|
|
954
|
+
expect(transfer.onlyCheckPrioritizedCollectionApprovals).toBe(true);
|
|
955
|
+
expect(transfer.onlyCheckPrioritizedOutgoingApprovals).toBe(true);
|
|
956
|
+
});
|
|
957
|
+
it('should convert Transfer with prioritizedApprovals to proto and back', () => {
|
|
958
|
+
const addr1 = (0, addressLists_spec_js_1.genTestAddress)();
|
|
959
|
+
const transfer = new transfers_js_1.Transfer({
|
|
960
|
+
from: addr1,
|
|
961
|
+
toAddresses: [],
|
|
962
|
+
balances: [],
|
|
963
|
+
prioritizedApprovals: [
|
|
964
|
+
new misc_js_1.ApprovalIdentifierDetails({
|
|
965
|
+
approvalId: 'approval-x',
|
|
966
|
+
approvalLevel: 'outgoing',
|
|
967
|
+
approverAddress: addr1,
|
|
968
|
+
version: 0n
|
|
969
|
+
})
|
|
970
|
+
]
|
|
971
|
+
});
|
|
972
|
+
const proto = transfer.toProto();
|
|
973
|
+
const restored = transfers_js_1.Transfer.fromProto(proto, string_numbers_js_1.BigIntify);
|
|
974
|
+
expect(restored.prioritizedApprovals).toBeDefined();
|
|
975
|
+
expect(restored.prioritizedApprovals[0].approvalId).toBe('approval-x');
|
|
976
|
+
});
|
|
977
|
+
it('should toBech32Addresses convert address formats', () => {
|
|
978
|
+
const addr = (0, addressLists_spec_js_1.genTestAddress)();
|
|
979
|
+
const transfer = new transfers_js_1.Transfer({
|
|
980
|
+
from: addr,
|
|
981
|
+
toAddresses: [addr],
|
|
982
|
+
balances: []
|
|
983
|
+
});
|
|
984
|
+
const converted = transfer.toBech32Addresses('bb');
|
|
985
|
+
expect(converted.from).toBeTruthy();
|
|
986
|
+
expect(converted.toAddresses.length).toBe(1);
|
|
987
|
+
});
|
|
988
|
+
it('should toBech32Addresses with prioritizedApprovals (covers line 107)', () => {
|
|
989
|
+
const addr = (0, addressLists_spec_js_1.genTestAddress)();
|
|
990
|
+
const transfer = new transfers_js_1.Transfer({
|
|
991
|
+
from: addr,
|
|
992
|
+
toAddresses: [],
|
|
993
|
+
balances: [],
|
|
994
|
+
prioritizedApprovals: [
|
|
995
|
+
new misc_js_1.ApprovalIdentifierDetails({
|
|
996
|
+
approvalId: 'test',
|
|
997
|
+
approvalLevel: 'collection',
|
|
998
|
+
approverAddress: '',
|
|
999
|
+
version: 0n
|
|
1000
|
+
})
|
|
1001
|
+
]
|
|
1002
|
+
});
|
|
1003
|
+
const converted = transfer.toBech32Addresses('bb');
|
|
1004
|
+
expect(converted.prioritizedApprovals).toBeDefined();
|
|
1005
|
+
expect(converted.prioritizedApprovals.length).toBe(1);
|
|
1006
|
+
});
|
|
1007
|
+
it('should round-trip Transfer with merkleProofs through proto (covers lines 88-89)', () => {
|
|
1008
|
+
const addr = (0, addressLists_spec_js_1.genTestAddress)();
|
|
1009
|
+
const transfer = new transfers_js_1.Transfer({
|
|
1010
|
+
from: addr,
|
|
1011
|
+
toAddresses: [],
|
|
1012
|
+
balances: [],
|
|
1013
|
+
merkleProofs: [
|
|
1014
|
+
new misc_js_1.MerkleProof({
|
|
1015
|
+
aunts: [],
|
|
1016
|
+
leaf: 'leaf-value',
|
|
1017
|
+
leafSignature: 'sig'
|
|
1018
|
+
})
|
|
1019
|
+
],
|
|
1020
|
+
ethSignatureProofs: [
|
|
1021
|
+
new misc_js_1.ETHSignatureProof({
|
|
1022
|
+
nonce: 'nonce-123',
|
|
1023
|
+
signature: '0x1234'
|
|
1024
|
+
})
|
|
1025
|
+
]
|
|
1026
|
+
});
|
|
1027
|
+
const proto = transfer.toProto();
|
|
1028
|
+
const restored = transfers_js_1.Transfer.fromProto(proto, string_numbers_js_1.BigIntify);
|
|
1029
|
+
expect(restored.merkleProofs).toBeDefined();
|
|
1030
|
+
expect(restored.merkleProofs.length).toBe(1);
|
|
1031
|
+
expect(restored.merkleProofs[0].leaf).toBe('leaf-value');
|
|
1032
|
+
expect(restored.ethSignatureProofs).toBeDefined();
|
|
1033
|
+
expect(restored.ethSignatureProofs[0].nonce).toBe('nonce-123');
|
|
1034
|
+
});
|
|
388
1035
|
});
|
|
389
1036
|
});
|
|
390
1037
|
//# sourceMappingURL=transfers.spec.js.map
|