diff --git a/smart-contracts/assembly/contracts/website-deployer/__tests__/websiteDeployer.spec.ts b/smart-contracts/assembly/contracts/website-deployer/__tests__/websiteDeployer.spec.ts index 8bc07e6..b49851c 100644 --- a/smart-contracts/assembly/contracts/website-deployer/__tests__/websiteDeployer.spec.ts +++ b/smart-contracts/assembly/contracts/website-deployer/__tests__/websiteDeployer.spec.ts @@ -1,4 +1,9 @@ -import { Args, i32ToBytes, unwrapStaticArray } from '@massalabs/as-types'; +import { + Args, + i32ToBytes, + u64ToBytes, + unwrapStaticArray, +} from '@massalabs/as-types'; import { Storage, resetStorage, @@ -6,6 +11,7 @@ import { } from '@massalabs/massa-as-sdk'; import { NB_CHUNKS_KEY, + NONCE_KEY, appendBytesToWebsite, constructor, deleteWebsite, @@ -49,6 +55,7 @@ describe('website deployer tests', () => { } expect(Storage.get(NB_CHUNKS_KEY)).toStrictEqual(i32ToBytes(nbChunks)); + expect(Storage.get(NONCE_KEY)).toStrictEqual(u64ToBytes(0)); }); test('edit a website (upload missed chunks)', () => { @@ -63,6 +70,8 @@ describe('website deployer tests', () => { unwrapStaticArray(data), ); } + + expect(Storage.get(NONCE_KEY)).toStrictEqual(u64ToBytes(0)); }); test('delete website', () => { @@ -72,6 +81,8 @@ describe('website deployer tests', () => { for (let chunkId: i32 = 0; chunkId < nbChunks; chunkId++) { expect(Storage.has(i32ToBytes(chunkId))).toBeFalsy(); } + + expect(Storage.get(NONCE_KEY)).toStrictEqual(u64ToBytes(1)); }); test('update website', () => { @@ -89,5 +100,6 @@ describe('website deployer tests', () => { } expect(Storage.get(NB_CHUNKS_KEY)).toStrictEqual(i32ToBytes(nbChunks)); + expect(Storage.get(NONCE_KEY)).toStrictEqual(u64ToBytes(2)); }); }); diff --git a/smart-contracts/assembly/contracts/website-deployer/websiteStorer.ts b/smart-contracts/assembly/contracts/website-deployer/websiteStorer.ts index 4f20507..7b86c00 100644 --- a/smart-contracts/assembly/contracts/website-deployer/websiteStorer.ts +++ b/smart-contracts/assembly/contracts/website-deployer/websiteStorer.ts @@ -10,14 +10,17 @@ import { Storage, Context, generateEvent } from '@massalabs/massa-as-sdk'; import { Args, bytesToI32, + bytesToU64, i32ToBytes, stringToBytes, + u64ToBytes, } from '@massalabs/as-types'; import { onlyOwner } from '../utils'; import { _setOwner } from '../utils/ownership-internal'; import { isDeployingContract } from '@massalabs/massa-as-sdk/assembly/std/context'; export const NB_CHUNKS_KEY = stringToBytes('NB_CHUNKS'); +export const NONCE_KEY = stringToBytes('NONCE'); /** * Constructor function that initializes the contract owner. @@ -56,6 +59,14 @@ export function appendBytesToWebsite(binaryArgs: StaticArray): void { Storage.set(NB_CHUNKS_KEY, i32ToBytes(chunkNb + 1)); } + // if we are uploading a new website version, increment the nonce + if (!totalChunks) { + let nonce: u64 = Storage.has(NONCE_KEY) + ? bytesToU64(Storage.get(NONCE_KEY)) + 1 + : 0; + Storage.set(NONCE_KEY, u64ToBytes(nonce)); + } + generateEvent( `Website chunk ${chunkNb} deployed to ${Context.callee().toString()}`, ); @@ -84,5 +95,9 @@ export function deleteWebsite(_: StaticArray): void { } Storage.del(NB_CHUNKS_KEY); + // increment nonce + let nonce: u64 = bytesToU64(Storage.get(NONCE_KEY)); + Storage.set(NONCE_KEY, u64ToBytes(++nonce)); + generateEvent(`Website ${Context.callee().toString()} deleted successfully`); }