From 1a56b2ae7eb7438d933068e80ecd432d20d6a107 Mon Sep 17 00:00:00 2001 From: Michael Danenberg <56533526+danenbm@users.noreply.github.com> Date: Tue, 20 Feb 2024 16:14:13 -0800 Subject: [PATCH] Add burn tests --- clients/js/test/burn.test.ts | 87 ++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 clients/js/test/burn.test.ts diff --git a/clients/js/test/burn.test.ts b/clients/js/test/burn.test.ts new file mode 100644 index 00000000..34348f63 --- /dev/null +++ b/clients/js/test/burn.test.ts @@ -0,0 +1,87 @@ +import { assertAccountExists, generateSigner, sol} from '@metaplex-foundation/umi'; +import test from 'ava'; +// import { base58 } from '@metaplex-foundation/umi/serializers'; +import { Asset, DataState, create, fetchAsset, burn, Key } from '../src'; +import { createUmi } from './_setup'; + +test('it can burn an asset as the owner', async (t) => { + // Given a Umi instance and a new signer. + const umi = await createUmi(); + const assetAddress = generateSigner(umi); + + // When we create a new account. + await create(umi, { + dataState: DataState.AccountState, + assetAddress, + name: 'Test Bread', + uri: 'https://example.com/bread', + }).sendAndConfirm(umi); + + // Then an account was created with the correct data. + const beforeAsset = await fetchAsset(umi, assetAddress.publicKey); + // console.log("Account State:", beforeAsset); + t.like(beforeAsset, { + publicKey: assetAddress.publicKey, + updateAuthority: umi.identity.publicKey, + owner: umi.identity.publicKey, + name: 'Test Bread', + uri: 'https://example.com/bread', + }); + + await burn(umi, { + assetAddress: assetAddress.publicKey, + compressionProof: null + }).sendAndConfirm(umi); + + // And the asset address still exists but was resized to 1. + const afterAsset = await umi.rpc.getAccount(assetAddress.publicKey); + t.true(afterAsset.exists); + assertAccountExists(afterAsset); + t.deepEqual(afterAsset.lamports, sol(0.00089784)); + t.is(afterAsset.data.length, 1); + t.is(afterAsset.data[0], Key.Uninitialized); +}); + +test('it cannot burn an asset if not the owner', async (t) => { + // Given a Umi instance and a new signer. + const umi = await createUmi(); + const assetAddress = generateSigner(umi); + const attacker = generateSigner(umi); + + // When we create a new account. + await create(umi, { + dataState: DataState.AccountState, + assetAddress, + name: 'Test Bread', + uri: 'https://example.com/bread', + }).sendAndConfirm(umi); + + // Then an account was created with the correct data. + const beforeAsset = await fetchAsset(umi, assetAddress.publicKey); + // console.log("Account State:", beforeAsset); + t.like(beforeAsset, { + publicKey: assetAddress.publicKey, + updateAuthority: umi.identity.publicKey, + owner: umi.identity.publicKey, + name: 'Test Bread', + uri: 'https://example.com/bread', + }); + + const result = burn(umi, { + assetAddress: assetAddress.publicKey, + compressionProof: null, + authority: attacker, + }).sendAndConfirm(umi); + + await t.throwsAsync(result, { name: 'InvalidAuthority' }) + + const afterAsset = await fetchAsset(umi, assetAddress.publicKey); + // console.log("Account State:", afterAsset); + t.like(afterAsset, { + publicKey: assetAddress.publicKey, + updateAuthority: umi.identity.publicKey, + owner: umi.identity.publicKey, + name: 'Test Bread', + uri: 'https://example.com/bread', + }); +});