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

difftreelog

Merge pull request #777 from UniqueNetwork/fix/recompute_consumed_space

ut-akuznetsov2022-12-15parents: #42f53fc #8336ec9.patch.diff
in: master
Fix/recompute consumed space

3 files changed

modifiedprimitives/data-structs/src/lib.rsdiffbeforeafterboth
1328 return Err(PropertiesError::NoSpaceForProperty);1328 return Err(PropertiesError::NoSpaceForProperty);
1329 }1329 }
13301330
1331 let value_len = value_len as u32;
1331 let old_value = self.map.try_scoped_set(scope, key, value)?;1332 let old_value = self.map.try_scoped_set(scope, key, value)?;
1333
1334 let old_value_len = old_value.as_ref().map(|v| v.len() as u32).unwrap_or(0);
13321335
1333 if old_value.is_none() {1336 if value_len > old_value_len {
1337 self.consumed_space += value_len - old_value_len;
1338 } else {
1334 self.consumed_space += value_len as u32;1339 self.consumed_space -= old_value_len - value_len;
1335 }1340 }
13361341
1337 Ok(old_value)1342 Ok(old_value)
modifiedtests/src/nesting/collectionProperties.test.tsdiffbeforeafterboth
25 before(async () => {25 before(async () => {
26 await usingPlaygrounds(async (helper, privateKey) => {26 await usingPlaygrounds(async (helper, privateKey) => {
27 const donor = await privateKey({filename: __filename});27 const donor = await privateKey({filename: __filename});
28 [alice, bob] = await helper.arrange.createAccounts([100n, 10n], donor);28 [alice, bob] = await helper.arrange.createAccounts([200n, 10n], donor);
29 });29 });
30 });30 });
31 31
138 {mode: 'nft' as const, requiredPallets: []},138 {mode: 'nft' as const, requiredPallets: []},
139 {mode: 'rft' as const, requiredPallets: [Pallets.ReFungible]}, 139 {mode: 'rft' as const, requiredPallets: [Pallets.ReFungible]},
140 ].map(testCase =>140 ].map(testCase =>
141 itSub.ifWithPallets(`Allows modifying a collection property multiple times (${testCase.mode})`, testCase.requiredPallets, async({helper}) => {141 itSub.ifWithPallets(`Allows modifying a collection property multiple times with the same size (${testCase.mode})`, testCase.requiredPallets, async({helper}) => {
142 const propKey = 'tok-prop';142 const propKey = 'tok-prop';
143143
144 const collection = await helper[testCase.mode].mintCollection(alice);144 const collection = await helper[testCase.mode].mintCollection(alice);
192 expect(consumedSpace).to.be.equal(originalSpace);192 expect(consumedSpace).to.be.equal(originalSpace);
193 }));193 }));
194
195 [
196 // TODO enable properties for FT collection in Substrate (release 040)
197 // {mode: 'ft' as const, requiredPallets: []},
198 {mode: 'nft' as const, requiredPallets: []},
199 {mode: 'rft' as const, requiredPallets: [Pallets.ReFungible]},
200 ].map(testCase =>
201 itSub.ifWithPallets(`Modifying a collection property with different sizes correctly changes the consumed space (${testCase.mode})`, testCase.requiredPallets, async({helper}) => {
202 const propKey = 'tok-prop';
203
204 const collection = await helper[testCase.mode].mintCollection(alice);
205 const originalSpace = await collection.getPropertiesConsumedSpace();
206
207 const initPropDataSize = 4096;
208 const biggerPropDataSize = 5000;
209 const smallerPropDataSize = 4000;
210
211 const initPropData = 'a'.repeat(initPropDataSize);
212 const biggerPropData = 'b'.repeat(biggerPropDataSize);
213 const smallerPropData = 'c'.repeat(smallerPropDataSize);
214
215 let consumedSpace;
216 let expectedConsumedSpaceDiff;
217
218 await collection.setProperties(alice, [{key: propKey, value: initPropData}]);
219 consumedSpace = await collection.getPropertiesConsumedSpace();
220 expectedConsumedSpaceDiff = initPropDataSize - originalSpace;
221 expect(consumedSpace).to.be.equal(originalSpace + expectedConsumedSpaceDiff);
222
223 await collection.setProperties(alice, [{key: propKey, value: biggerPropData}]);
224 consumedSpace = await collection.getPropertiesConsumedSpace();
225 expectedConsumedSpaceDiff = biggerPropDataSize - initPropDataSize;
226 expect(consumedSpace).to.be.equal(initPropDataSize + expectedConsumedSpaceDiff);
227
228 await collection.setProperties(alice, [{key: propKey, value: smallerPropData}]);
229 consumedSpace = await collection.getPropertiesConsumedSpace();
230 expectedConsumedSpaceDiff = biggerPropDataSize - smallerPropDataSize;
231 expect(consumedSpace).to.be.equal(biggerPropDataSize - expectedConsumedSpaceDiff);
232 }));
194});233});
195 234
196describe('Negative Integration Test: Collection Properties', () => {235describe('Negative Integration Test: Collection Properties', () => {
modifiedtests/src/nesting/tokenProperties.test.tsdiffbeforeafterboth
325 {mode: 'nft' as const, storage: 'nonfungible' as const, pieces: undefined, requiredPallets: []},325 {mode: 'nft' as const, storage: 'nonfungible' as const, pieces: undefined, requiredPallets: []},
326 {mode: 'rft' as const, storage: 'refungible' as const, pieces: 100n, requiredPallets: [Pallets.ReFungible]}, 326 {mode: 'rft' as const, storage: 'refungible' as const, pieces: 100n, requiredPallets: [Pallets.ReFungible]},
327 ].map(testCase =>327 ].map(testCase =>
328 itSub.ifWithPallets(`Allows modifying a token property multiple times (${testCase.mode})`, testCase.requiredPallets, async({helper}) => {328 itSub.ifWithPallets(`Allows modifying a token property multiple times with the same size (${testCase.mode})`, testCase.requiredPallets, async({helper}) => {
329 const propKey = 'tok-prop';329 const propKey = 'tok-prop';
330330
331 const collection = await helper[testCase.mode].mintCollection(alice, {331 const collection = await helper[testCase.mode].mintCollection(alice, {
435 expect(recomputedSpace).to.be.equal(originalSpace);435 expect(recomputedSpace).to.be.equal(originalSpace);
436 }));436 }));
437
438 [
439 {mode: 'nft' as const, pieces: undefined, requiredPallets: []},
440 {mode: 'rft' as const, pieces: 100n, requiredPallets: [Pallets.ReFungible]},
441 ].map(testCase =>
442 itSub.ifWithPallets(`Modifying a token property with different sizes correctly changes the consumed space (${testCase.mode})`, testCase.requiredPallets, async({helper}) => {
443 const propKey = 'tok-prop';
444
445 const collection = await helper[testCase.mode].mintCollection(alice, {
446 tokenPropertyPermissions: [
447 {
448 key: propKey,
449 permission: {mutable: true, tokenOwner: true},
450 },
451 ],
452 });
453 const token = await (
454 testCase.pieces
455 ? collection.mintToken(alice, testCase.pieces)
456 : collection.mintToken(alice)
457 );
458 const originalSpace = await token.getTokenPropertiesConsumedSpace();
459
460 const initPropDataSize = 4096;
461 const biggerPropDataSize = 5000;
462 const smallerPropDataSize = 4000;
463
464 const initPropData = 'a'.repeat(initPropDataSize);
465 const biggerPropData = 'b'.repeat(biggerPropDataSize);
466 const smallerPropData = 'c'.repeat(smallerPropDataSize);
467
468 let consumedSpace;
469 let expectedConsumedSpaceDiff;
470
471 await token.setProperties(alice, [{key: propKey, value: initPropData}]);
472 consumedSpace = await token.getTokenPropertiesConsumedSpace();
473 expectedConsumedSpaceDiff = initPropDataSize - originalSpace;
474 expect(consumedSpace).to.be.equal(originalSpace + expectedConsumedSpaceDiff);
475
476 await token.setProperties(alice, [{key: propKey, value: biggerPropData}]);
477 consumedSpace = await token.getTokenPropertiesConsumedSpace();
478 expectedConsumedSpaceDiff = biggerPropDataSize - initPropDataSize;
479 expect(consumedSpace).to.be.equal(initPropDataSize + expectedConsumedSpaceDiff);
480
481 await token.setProperties(alice, [{key: propKey, value: smallerPropData}]);
482 consumedSpace = await token.getTokenPropertiesConsumedSpace();
483 expectedConsumedSpaceDiff = biggerPropDataSize - smallerPropDataSize;
484 expect(consumedSpace).to.be.equal(biggerPropDataSize - expectedConsumedSpaceDiff);
485 }));
437});486});
438487
439describe('Negative Integration Test: Token Properties', () => {488describe('Negative Integration Test: Token Properties', () => {