git.delta.rocks / unique-network / refs/commits / b0dd2cce6bf1

difftreelog

Add balances.locked checks

Max Andreev2022-12-08parent: #0f81ecc.patch.diff
in: master

2 files changed

modifiedtests/src/app-promotion.test.tsdiffbeforeafterboth
51 // Staker balance is: miscFrozen: 100, feeFrozen: 100, reserved: 0n...51 // Staker balance is: miscFrozen: 100, feeFrozen: 100, reserved: 0n...
52 // ...so he can not transfer 90052 // ...so he can not transfer 900
53 expect (await helper.balance.getSubstrateFull(staker.address)).to.contain({miscFrozen: 100n * nominal, feeFrozen: 100n * nominal, reserved: 0n});53 expect(await helper.balance.getSubstrateFull(staker.address)).to.contain({miscFrozen: 100n * nominal, feeFrozen: 100n * nominal, reserved: 0n});
54 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'appstake', amount: 100n * nominal, reasons: 'All'}]);
54 await expect(helper.balance.transferToSubstrate(staker, recepient.address, 900n * nominal)).to.be.rejectedWith('balances.LiquidityRestrictions');55 await expect(helper.balance.transferToSubstrate(staker, recepient.address, 900n * nominal)).to.be.rejectedWith('balances.LiquidityRestrictions');
55 56
56 expect(await helper.staking.getTotalStaked({Substrate: staker.address})).to.be.equal(100n * nominal);57 expect(await helper.staking.getTotalStaked({Substrate: staker.address})).to.be.equal(100n * nominal);
621 const stakerBalanceBefore = await helper.balance.getSubstrateFull(staker.address);622 const stakerBalanceBefore = await helper.balance.getSubstrateFull(staker.address);
622 expect(stakerBalanceBefore).to.contain({miscFrozen: VESTED_TRANSFER + STAKE, feeFrozen: VESTED_TRANSFER + STAKE, reserved: 0n});623 expect(stakerBalanceBefore).to.contain({miscFrozen: VESTED_TRANSFER + STAKE, feeFrozen: VESTED_TRANSFER + STAKE, reserved: 0n});
623 expect(stakerBalanceBefore.free / nominal).to.eq(1299n);624 expect(stakerBalanceBefore.free / nominal).to.eq(1299n);
625 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'appstake', amount: STAKE, reasons: 'All'}, {id: 'ormlvest', amount: VESTED_TRANSFER, reasons: 'All'}]);
624626
625 await helper.wait.forRelayBlockNumber(rewardAvailableInBlock(stake.block));627 await helper.wait.forRelayBlockNumber(rewardAvailableInBlock(stake.block));
626 await helper.admin.payoutStakers(palletAdmin, 100);628 await helper.admin.payoutStakers(palletAdmin, 100);
632 const stakerBalanceAfterReward = await helper.balance.getSubstrateFull(staker.address);634 const stakerBalanceAfterReward = await helper.balance.getSubstrateFull(staker.address);
633 expect(stakerBalanceAfterReward).to.contain({miscFrozen: VESTED_TRANSFER + income, feeFrozen: VESTED_TRANSFER + income, reserved: 0n});635 expect(stakerBalanceAfterReward).to.contain({miscFrozen: VESTED_TRANSFER + income, feeFrozen: VESTED_TRANSFER + income, reserved: 0n});
634 expect(stakerBalanceAfterReward.free > stakerBalanceBefore.free).to.be.true;636 expect(stakerBalanceAfterReward.free > stakerBalanceBefore.free).to.be.true;
637 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'appstake', amount: income, reasons: 'All'}, {id: 'ormlvest', amount: VESTED_TRANSFER, reasons: 'All'}]);
635638
636 // Act: Staker can claim:639 // Act: Staker can claim:
637 await helper.balance.claim(staker);640 await helper.balance.claim(staker);
638 // Assert: Staker's frozen balance reduced on {VESTED_TRANSFER} amount641 // Assert: Staker's frozen balance reduced on {VESTED_TRANSFER} amount
639 const stakerBalanceAfterClaim = await helper.balance.getSubstrateFull(staker.address);642 const stakerBalanceAfterClaim = await helper.balance.getSubstrateFull(staker.address);
640 expect(stakerBalanceAfterClaim).to.contain({miscFrozen: income, feeFrozen: income, reserved: 0n});643 expect(stakerBalanceAfterClaim).to.contain({miscFrozen: income, feeFrozen: income, reserved: 0n});
641 expect(stakerBalanceAfterClaim.free).to.eq(stakerBalanceAfterReward.free);644 expect(stakerBalanceAfterClaim.free).to.eq(stakerBalanceAfterReward.free);
645 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'appstake', amount: income, reasons: 'All'}]);
642646
643 // Act: Staker receives another vested transfer647 // Act: Staker receives another vested transfer
644 await helper.balance.vestedTransfer(sender, staker.address, {start: 1000n, period: 10n, periodCount: 1n, perPeriod: VESTED_TRANSFER});648 await helper.balance.vestedTransfer(sender, staker.address, {start: 1000n, period: 10n, periodCount: 1n, perPeriod: VESTED_TRANSFER});
645 // Assert: vested transfer included in balance649 // Assert: vested transfer included in balance
646 const stakerBalanceAfterSecondVestedTransfer = await helper.balance.getSubstrateFull(staker.address);650 const stakerBalanceAfterSecondVestedTransfer = await helper.balance.getSubstrateFull(staker.address);
647 expect(stakerBalanceAfterSecondVestedTransfer).to.contain({miscFrozen: VESTED_TRANSFER + income, feeFrozen: VESTED_TRANSFER + income, reserved: 0n});651 expect(stakerBalanceAfterSecondVestedTransfer).to.contain({miscFrozen: VESTED_TRANSFER + income, feeFrozen: VESTED_TRANSFER + income, reserved: 0n});
648 expect(stakerBalanceAfterSecondVestedTransfer.free / nominal).to.eq(1599n);652 expect(stakerBalanceAfterSecondVestedTransfer.free / nominal).to.eq(1599n);
653 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'appstake', amount: income, reasons: 'All'}, {id: 'ormlvest', amount: VESTED_TRANSFER, reasons: 'All'}]);
649654
650 // Act: Staker can unstake655 // Act: Staker can unstake
651 await helper.staking.unstake(staker);656 await helper.staking.unstake(staker);
652 // Assert: Staker's frozen balance reduced on {income} amount657 // Assert: Staker's frozen balance reduced on {income} amount
653 const stakerBalanceAfterUnstake = await helper.balance.getSubstrateFull(staker.address);658 const stakerBalanceAfterUnstake = await helper.balance.getSubstrateFull(staker.address);
654 expect(stakerBalanceAfterUnstake).to.contain({miscFrozen: VESTED_TRANSFER, feeFrozen: VESTED_TRANSFER, reserved: income});659 expect(stakerBalanceAfterUnstake).to.contain({miscFrozen: VESTED_TRANSFER, feeFrozen: VESTED_TRANSFER, reserved: income});
655 expect(stakerBalanceAfterUnstake.free / nominal).to.eq(1599n);660 expect(stakerBalanceAfterUnstake.free / nominal).to.eq(1599n);
661 // FIXME: should remove app staking instantly or after unlocking period ends?
662 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'appstake', amount: income, reasons: 'All'}, {id: 'ormlvest', amount: VESTED_TRANSFER, reasons: 'All'}]);
663
656 // Assert: Balance after unstaking period ends664 // Assert: Balance after unstaking period ends
657 const [pendingUnstake] = await helper.staking.getPendingUnstakePerBlock({Substrate: staker.address}); 665 const [pendingUnstake] = await helper.staking.getPendingUnstakePerBlock({Substrate: staker.address});
658 await helper.wait.forParachainBlockNumber(pendingUnstake.block);666 await helper.wait.forParachainBlockNumber(pendingUnstake.block);
659 const stakerBalanceAfterUnstakeFinished = await helper.balance.getSubstrateFull(staker.address);667 const stakerBalanceAfterUnstakeFinished = await helper.balance.getSubstrateFull(staker.address);
660 expect(stakerBalanceAfterUnstakeFinished).to.contain({miscFrozen: VESTED_TRANSFER, feeFrozen: VESTED_TRANSFER, reserved: 0n});668 expect(stakerBalanceAfterUnstakeFinished).to.contain({miscFrozen: VESTED_TRANSFER, feeFrozen: VESTED_TRANSFER, reserved: 0n});
661 expect(stakerBalanceAfterUnstakeFinished.free > stakerBalanceAfterUnstake.free).to.be.true;669 expect(stakerBalanceAfterUnstakeFinished.free > stakerBalanceAfterUnstake.free).to.be.true;
670 expect(await helper.balance.getLocked(staker.address)).to.deep.eq([{id: 'ormlvest', amount: VESTED_TRANSFER, reasons: 'All'}]);
662 });671 });
663 672
664 itSub('should bring compound interest', async ({helper}) => {673 itSub('should bring compound interest', async ({helper}) => {
modifiedtests/src/util/playgrounds/unique.tsdiffbeforeafterboth
2213 return {free: accountInfo.free.toBigInt(), miscFrozen: accountInfo.miscFrozen.toBigInt(), feeFrozen: accountInfo.feeFrozen.toBigInt(), reserved: accountInfo.reserved.toBigInt()};2213 return {free: accountInfo.free.toBigInt(), miscFrozen: accountInfo.miscFrozen.toBigInt(), feeFrozen: accountInfo.feeFrozen.toBigInt(), reserved: accountInfo.reserved.toBigInt()};
2214 }2214 }
2215
2216 async getLocked(address: TSubstrateAccount): Promise<[{id: string, amount: bigint, reason: string}]> {
2217 const locks = (await this.helper.callRpc('api.query.balances.locks', [address])).toHuman();
2218 return locks.map((lock: any) => {return {id: lock.id, amount: BigInt(lock.amount.replace(/,/g, '')), reasons: lock.reasons};});
2219 }
2215}2220}
22162221
2217class EthereumBalanceGroup<T extends ChainHelperBase> extends HelperGroup<T> {2222class EthereumBalanceGroup<T extends ChainHelperBase> extends HelperGroup<T> {
2295 return this.subBalanceGroup.getSubstrateFull(address);2300 return this.subBalanceGroup.getSubstrateFull(address);
2296 }2301 }
2302
2303 /**
2304 * Get locked balances
2305 * @param address substrate address
2306 * @returns locked balances with reason via api.query.balances.locks
2307 */
2308 getLocked(address: TSubstrateAccount) {
2309 return this.subBalanceGroup.getLocked(address);
2310 }
22972311
2298 /**2312 /**
2299 * Get ethereum address balance2313 * Get ethereum address balance