Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
JavaScript
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306/** * Keeps FA2 v4 Contract - Read-Only Tests * * These tests verify the production contract via TzKT API without making any transactions. * Safe to run against mainnet contract: KT1ER1GyoeRNhkv6E57yKbBbEKi5ynKbaH3W */
import { getContract, CONTRACTS, EXPECTED_STORAGE, stringToBytes } from './helpers/keeps-test-helper.mjs';import { getContractStorage, getContractEntrypoints, getTokenMetadata, getAllTokens, getOperations, getBigMapKeys} from './helpers/tzkt-helper.mjs';
const RUN_KEEPS_NETWORK_TESTS = process.env.RUN_KEEPS_NETWORK_TESTS === 'true' || process.env.RUN_KEEPS_V4_NETWORK_TESTS === 'true';const describeIfNetworkEnabled = RUN_KEEPS_NETWORK_TESTS ? describe : xdescribe;
if (!RUN_KEEPS_NETWORK_TESTS) { console.log( 'โญ๏ธ Skipping keeps network read-only tests (set RUN_KEEPS_NETWORK_TESTS=true to enable)' );}
describeIfNetworkEnabled("๐ Keeps FA2 v4 Contract - Read-Only Tests", () => { let contract, address; const network = 'mainnet';
beforeAll(async () => { console.log('\n๐งช Starting Keeps v4 read-only test suite...\n'); console.log(`๐ฏ Target contract: ${CONTRACTS.mainnet}`); console.log(`๐ฏ Expected admin: ${EXPECTED_STORAGE.mainnet.administrator}`); ({ contract, address } = await getContract(network, false)); });
afterAll(() => { console.log('\nโ
Read-only test suite complete!\n'); });
describe("๐ Contract Configuration", () => { it("should have correct contract address", () => { expect(address).toBe(CONTRACTS.mainnet); });
it("should have correct administrator", async () => { const storage = await getContractStorage(address, network); expect(storage.administrator).toBe(EXPECTED_STORAGE.mainnet.administrator); });
it("should have default royalty of 10%", async () => { const storage = await getContractStorage(address, network); expect(parseInt(storage.default_royalty_bps)).toBe(EXPECTED_STORAGE.mainnet.default_royalty_bps); });
it("should not be paused", async () => { const storage = await getContractStorage(address, network); expect(storage.paused).toBe(EXPECTED_STORAGE.mainnet.paused); });
it("should have keep_fee configured", async () => { const storage = await getContractStorage(address, network); expect(storage.keep_fee).toBeDefined(); console.log(` ๐ Current keep fee: ${storage.keep_fee} mutez`); });
it("should have contract metadata", async () => { const storage = await getContractStorage(address, network); expect(storage.metadata).toBeDefined(); });
it("should have contract_metadata_locked flag", async () => { const storage = await getContractStorage(address, network); expect(typeof storage.contract_metadata_locked).toBe('boolean'); }); });
describe("๐ฏ Contract Entrypoints", () => { let entrypoints;
beforeAll(async () => { entrypoints = await getContractEntrypoints(address, network); });
it("should have all 12 custom Keeps entrypoints", () => { const customEntrypoints = [ 'keep', 'edit_metadata', 'lock_metadata', 'set_contract_metadata', 'lock_contract_metadata', 'set_keep_fee', 'withdraw_fees', 'burn_keep', 'pause', 'unpause', 'set_default_royalty', 'admin_transfer' ];
const entrypointNames = entrypoints.map(ep => ep.name); customEntrypoints.forEach(name => { expect(entrypointNames).toContain(name); });
console.log(` โ
Found ${customEntrypoints.length} custom entrypoints`); });
it("should have all 6 FA2 standard entrypoints", () => { const fa2Entrypoints = [ 'transfer', 'update_operators', 'balance_of', 'mint', 'burn', 'set_administrator' ];
const entrypointNames = entrypoints.map(ep => ep.name); fa2Entrypoints.forEach(name => { expect(entrypointNames).toContain(name); });
console.log(` โ
Found ${fa2Entrypoints.length} FA2 standard entrypoints`); });
it("should have v4 entrypoints (pause, unpause, set_default_royalty, admin_transfer)", () => { const v4Entrypoints = ['pause', 'unpause', 'set_default_royalty', 'admin_transfer']; const entrypointNames = entrypoints.map(ep => ep.name);
v4Entrypoints.forEach(name => { expect(entrypointNames).toContain(name); });
console.log(` โ
Found all 4 v4-specific entrypoints`); }); });
describe("๐ช Token Metadata", () => { it("should have minted tokens", async () => { const storage = await getContractStorage(address, network); const nextTokenId = parseInt(storage.next_token_id);
expect(nextTokenId).toBeGreaterThan(0); console.log(` ๐ Total tokens minted: ${nextTokenId}`); });
it("should fetch token metadata from TzKT", async () => { const storage = await getContractStorage(address, network); const nextTokenId = parseInt(storage.next_token_id);
if (nextTokenId > 0) { // Fetch first token const tokens = await getTokenMetadata(address, 0, network);
expect(tokens.length).toBeGreaterThan(0); expect(tokens[0].metadata).toBeDefined(); console.log(` โ
Token #0 metadata: ${tokens[0].metadata.name}`); } else { console.log(` โ ๏ธ No tokens minted yet, skipping metadata test`); } });
it("should have proper token metadata structure (TZIP-21)", async () => { const storage = await getContractStorage(address, network); const nextTokenId = parseInt(storage.next_token_id);
if (nextTokenId > 0) { const tokens = await getTokenMetadata(address, 0, network); const metadata = tokens[0].metadata;
// Check TZIP-21 required fields expect(metadata.name).toBeDefined(); expect(metadata.symbol).toBeDefined(); expect(metadata.decimals).toBeDefined();
// Check Keeps-specific fields expect(metadata.artifactUri).toBeDefined(); expect(metadata.displayUri).toBeDefined(); expect(metadata.thumbnailUri).toBeDefined();
console.log(` โ
Token metadata follows TZIP-21 standard`); } }); });
describe("๐พ Storage BigMaps", () => { it("should have content_hashes bigmap", async () => { const storage = await getContractStorage(address, network); expect(storage.content_hashes).toBeDefined(); console.log(` ๐ Content hashes bigmap ID: ${storage.content_hashes}`); });
it("should have token_creators bigmap", async () => { const storage = await getContractStorage(address, network); expect(storage.token_creators).toBeDefined(); console.log(` ๐ Token creators bigmap ID: ${storage.token_creators}`); });
it("should have metadata_locked bigmap", async () => { const storage = await getContractStorage(address, network); expect(storage.metadata_locked).toBeDefined(); console.log(` ๐ Metadata locked bigmap ID: ${storage.metadata_locked}`); });
it("should have ledger bigmap", async () => { const storage = await getContractStorage(address, network); expect(storage.ledger).toBeDefined(); console.log(` ๐ Ledger bigmap ID: ${storage.ledger}`); });
it("should have token_metadata bigmap", async () => { const storage = await getContractStorage(address, network); expect(storage.token_metadata).toBeDefined(); console.log(` ๐ Token metadata bigmap ID: ${storage.token_metadata}`); });
it("should have operators bigmap", async () => { const storage = await getContractStorage(address, network); expect(storage.operators).toBeDefined(); console.log(` ๐ Operators bigmap ID: ${storage.operators}`); }); });
describe("๐ Operation History", () => { it("should have mint operations (keep entrypoint)", async () => { const operations = await getOperations(address, 'keep', network, 5);
if (operations.length > 0) { console.log(` โ
Found ${operations.length} mint operations`); console.log(` ๐ Latest mint: ${operations[0].hash} (block ${operations[0].level})`); } else { console.log(` โ ๏ธ No mint operations found yet`); } });
it("should verify all operations were successful", async () => { const operations = await getOperations(address, 'keep', network, 10);
operations.forEach(op => { expect(op.status).toBe('applied'); });
if (operations.length > 0) { console.log(` โ
All ${operations.length} operations successful`); } });
it("should have operation sender information", async () => { const operations = await getOperations(address, 'keep', network, 1);
if (operations.length > 0) { const op = operations[0]; expect(op.sender).toBeDefined(); expect(op.sender.address).toBeDefined(); console.log(` ๐ Latest mint sender: ${op.sender.address}`); } }); });
describe("๐ Contract Verification", () => { it("should be a valid FA2 contract", async () => { const storage = await getContractStorage(address, network);
// Check FA2 required storage expect(storage.ledger).toBeDefined(); expect(storage.operators).toBeDefined(); expect(storage.token_metadata).toBeDefined();
console.log(` โ
Contract has FA2 storage structure`); });
it("should have v4-specific storage (pause, royalty)", async () => { const storage = await getContractStorage(address, network);
// v4 specific fields expect(storage.paused).toBeDefined(); expect(storage.default_royalty_bps).toBeDefined();
console.log(` โ
Contract has v4-specific storage fields`); });
it("should have creator tracking (v3 feature)", async () => { const storage = await getContractStorage(address, network); expect(storage.token_creators).toBeDefined(); console.log(` โ
Contract has creator tracking (v3 feature)`); });
it("should have content hash deduplication (v3 feature)", async () => { const storage = await getContractStorage(address, network); expect(storage.content_hashes).toBeDefined(); console.log(` โ
Contract has content hash deduplication (v3 feature)`); });
it("should have metadata locking support (v3 feature)", async () => { const storage = await getContractStorage(address, network); expect(storage.metadata_locked).toBeDefined(); expect(storage.contract_metadata_locked).toBeDefined(); console.log(` โ
Contract has metadata locking support (v3 feature)`); }); });});