Skip to main content
Glama

OpenZeppelin Contracts MCP Server

Official
by OpenZeppelin
non-fungible.test.ts4.05 kB
import test from 'ava'; import type { NonFungibleOptions } from './non-fungible'; import { buildNonFungible } from './non-fungible'; import { printContract } from './print'; import { OptionsError } from './error'; import { nonFungible } from '.'; function testNonFungible(title: string, opts: Partial<NonFungibleOptions>) { test(title, t => { const c = buildNonFungible({ name: 'MyToken', symbol: 'MTK', ...opts, }); t.snapshot(printContract(c)); }); } /** * Tests external API for equivalence with internal API */ function testAPIEquivalence(title: string, opts?: NonFungibleOptions) { test(title, t => { t.is( nonFungible.print(opts), printContract( buildNonFungible({ name: 'MyToken', symbol: 'MTK', ...opts, }), ), ); }); } // Error validation tests test('throws error when enumerable and consecutive are both enabled', t => { const error = t.throws( () => buildNonFungible({ name: 'MyToken', symbol: 'MTK', enumerable: true, consecutive: true, }), { instanceOf: OptionsError }, ); t.is(error?.messages.enumerable, 'Enumerable cannot be used with Consecutive extension'); t.is(error?.messages.consecutive, 'Consecutive cannot be used with Enumerable extension'); }); test('throws error when consecutive and mintable are both enabled', t => { const error = t.throws( () => buildNonFungible({ name: 'MyToken', symbol: 'MTK', consecutive: true, mintable: true, }), { instanceOf: OptionsError }, ); t.is(error?.messages.consecutive, 'Consecutive cannot be used with Mintable extension'); t.is(error?.messages.mintable, 'Mintable cannot be used with Consecutive extension'); }); test('throws error when consecutive and sequential are both enabled', t => { const error = t.throws( () => buildNonFungible({ name: 'MyToken', symbol: 'MTK', consecutive: true, sequential: true, }), { instanceOf: OptionsError }, ); t.is(error?.messages.consecutive, 'Consecutive cannot be used with Sequential minting'); t.is(error?.messages.sequential, 'Sequential minting cannot be used with Consecutive extension'); }); testNonFungible('basic non-fungible', {}); testNonFungible('non-fungible burnable', { burnable: true, }); testNonFungible('non-fungible pausable', { pausable: true, }); testNonFungible('non-fungible burnable pausable', { burnable: true, pausable: true, }); testNonFungible('non-fungible mintable', { mintable: true, }); testNonFungible('non-fungible enumerable', { enumerable: true, }); testNonFungible('non-fungible consecutive', { consecutive: true, }); testNonFungible('non-fungible consecutive burnable', { consecutive: true, burnable: true, }); testNonFungible('non-fungible consecutive pausable', { consecutive: true, pausable: true, }); testNonFungible('non-fungible consecutive burnable pausable', { consecutive: true, burnable: true, pausable: true, }); testNonFungible('non-fungible sequential', { sequential: true, }); testNonFungible('non-fungible upgradeable', { upgradeable: true, }); // Revised test with valid combinations testNonFungible('non-fungible with compatible options', { access: 'ownable', burnable: true, mintable: true, pausable: true, enumerable: true, upgradeable: true, }); testNonFungible('non-fungible - complex name', { name: 'Custom $ Token', access: 'ownable', burnable: true, pausable: true, }); testAPIEquivalence('non-fungible API default'); testAPIEquivalence('non-fungible API basic', { name: 'CustomToken', symbol: 'CTK' }); testAPIEquivalence('non-fungible API full', { name: 'CustomToken', symbol: 'CTK', burnable: true, mintable: true, pausable: true, enumerable: true, upgradeable: true, }); test('non-fungible API assert defaults', async t => { t.is(nonFungible.print(nonFungible.defaults), nonFungible.print()); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/OpenZeppelin/contracts-wizard'

If you have feedback or need assistance with the MCP directory API, please join our Discord server