difftreelog
Add int.test for createItem rate limiting and some changes to rate limiting logic
in: master
2 files changed
pallets/nft/src/lib.rsdiffbeforeafterboth--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -419,7 +419,7 @@
pub AddressTokens get(fn address_tokens): double_map hasher(identity) CollectionId, hasher(twox_64_concat) T::AccountId => Vec<TokenId>;
/// Tokens transfer baskets
- pub CreateItemBasket get(fn create_item_basket): map hasher(identity) CollectionId => T::BlockNumber;
+ pub CreateItemBasket get(fn create_item_basket): map hasher(twox_64_concat) (CollectionId, T::AccountId) => T::BlockNumber;
pub NftTransferBasket get(fn nft_transfer_basket): double_map hasher(identity) CollectionId, hasher(identity) TokenId => T::BlockNumber;
pub FungibleTransferBasket get(fn fungible_transfer_basket): double_map hasher(identity) CollectionId, hasher(twox_64_concat) T::AccountId => T::BlockNumber;
pub ReFungibleTransferBasket get(fn refungible_transfer_basket): double_map hasher(identity) CollectionId, hasher(identity) TokenId => T::BlockNumber;
@@ -2303,15 +2303,15 @@
let limit = <Collection<T>>::get(collection_id).limits.sponsor_transfer_timeout;
let mut sponsored = true;
- if <CreateItemBasket<T>>::contains_key(collection_id) {
- let last_tx_block = <CreateItemBasket<T>>::get(collection_id);
+ if <CreateItemBasket<T>>::contains_key((collection_id, &who)) {
+ let last_tx_block = <CreateItemBasket<T>>::get((collection_id, &who));
let limit_time = last_tx_block + limit.into();
if block_number <= limit_time {
sponsored = false;
}
}
if sponsored {
- <CreateItemBasket<T>>::insert(collection_id, block_number);
+ <CreateItemBasket<T>>::insert((collection_id, who.clone()), block_number);
}
// check free create limit
tests/src/confirmSponsorship.test.tsdiffbeforeafterboth170 });170 });171 });171 });172172173 it('NFT: Sponsoring is rate limited', async () => {173 it('NFT: Sponsoring of transfers is rate limited', async () => {174 const collectionId = await createCollectionExpectSuccess();174 const collectionId = await createCollectionExpectSuccess();175 await setCollectionSponsorExpectSuccess(collectionId, bob.address);175 await setCollectionSponsorExpectSuccess(collectionId, bob.address);176 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');176 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');209 });209 });210 });210 });211211212 it('Fungible: Sponsoring is rate limited', async () => {212 it('Fungible: Sponsoring of transfers is rate limited', async () => {213 const collectionId = await createCollectionExpectSuccess({mode: 'Fungible'});213 const collectionId = await createCollectionExpectSuccess({mode: 'Fungible'});214 await setCollectionSponsorExpectSuccess(collectionId, bob.address);214 await setCollectionSponsorExpectSuccess(collectionId, bob.address);215 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');215 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');246 });246 });247 });247 });248248249 it('ReFungible: Sponsoring is rate limited', async () => {249 it('ReFungible: Sponsoring of transfers is rate limited', async () => {250 const collectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});250 const collectionId = await createCollectionExpectSuccess({mode: 'ReFungible'});251 await setCollectionSponsorExpectSuccess(collectionId, bob.address);251 await setCollectionSponsorExpectSuccess(collectionId, bob.address);252 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');252 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');285 });285 });286 });286 });287288 it('NFT: Sponsoring of createItem is rate limited', async () => {289 const collectionId = await createCollectionExpectSuccess();290 await setCollectionSponsorExpectSuccess(collectionId, bob.address);291 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');292293 // Enable collection white list 294 await enableWhiteListExpectSuccess(alice, collectionId);295296 // Enable public minting297 await enablePublicMintingExpectSuccess(alice, collectionId);298299 await usingApi(async (api) => {300 // Find unused address301 const zeroBalance = await findUnusedAddress(api);302303 // Add zeroBalance address to white list304 await addToWhiteListExpectSuccess(alice, collectionId, zeroBalance.address);305306 // Mint token using unused address as signer - gets sponsored307 await createItemExpectSuccess(zeroBalance, collectionId, 'NFT', zeroBalance.address);308309 // Second mint should fail310 const AsponsorBalance = new BigNumber((await api.query.system.account(bob.address)).data.free.toString());311 312 const consoleError = console.error;313 const consoleLog = console.log;314 console.error = () => {};315 console.log = () => {};316 const badTransaction = async function () { 317 await createItemExpectSuccess(zeroBalance, collectionId, 'NFT', zeroBalance.address);318 };319 await expect(badTransaction()).to.be.rejectedWith("Inability to pay some fees");320 console.error = consoleError;321 console.log = consoleLog;322 const BsponsorBalance = new BigNumber((await api.query.system.account(bob.address)).data.free.toString());323324 // Try again after Zero gets some balance - now it should succeed325 const balancetx = api.tx.balances.transfer(zeroBalance.address, 1e15);326 await submitTransactionAsync(alice, balancetx);327 await createItemExpectSuccess(zeroBalance, collectionId, 'NFT', zeroBalance.address);328329 expect(BsponsorBalance.isEqualTo(AsponsorBalance)).to.be.true;330 });331 });287332288});333});289334