Pack
Create lootboxes of NFTs with rarity based open mechanics.
import { ThirdwebSDK } from "@thirdweb-dev/sdk"; const sdk = new ThirdwebSDK("{{chainName}}");const contract = await sdk.getContract( "{{contract_address}}", "pack",);
class Pack extends StandardErc1155<PackContract> {}
function constructor(network: NetworkInput, address: string, storage: ThirdwebStorage<IpfsUploadBatchOptions>, options: undefined | ({ clientId?: string; gasSettings?: { maxPriceInGwei?: number; speed?: "standard" | "fast" | "fastest" }; gasless?: ({ experimentalChainlessSupport?: boolean; openzeppelin: { domainName?: string; domainSeparatorVersion?: string; domainVersion?: string; relayerForwarderAddress?: string; relayerUrl: string; useEOAForwarder?: boolean } }) | ({ biconomy: { apiId: string; apiKey: string; deadlineSeconds?: number } }) | ({ engine: { domainName?: string; domainSeparatorVersion?: string; domainVersion?: string; relayerForwarderAddress?: string; relayerUrl: string }; experimentalChainlessSupport?: boolean }); gatewayUrls?: Array<string>; readonlySettings?: { chainId?: number; rpcUrl: string }; rpcBatchSettings?: { sizeLimit?: number; timeLimit?: number }; secretKey?: string; supportedChains?: Array<{ chainId: number; nativeCurrency: { decimals: number; name: string; symbol: string }; rpc: Array<string>; slug: string }> }), abi: Array<objectInputType<{ inputs: ZodDefault<ZodArray<ZodObject<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<ZodObject<..., ..., ..., ..., ...>, "many">>; stateMutability: ZodOptional<ZodString> }>, "strip", ZodAny, objectOutputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">, objectInputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">>, "many">>; name: ZodDefault<ZodString>; outputs: ZodDefault<ZodArray<ZodObject<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<ZodObject<..., ..., ..., ..., ...>, "many">>; stateMutability: ZodOptional<ZodString> }>, "strip", ZodAny, objectOutputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">, objectInputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">>, "many">>; type: ZodString }, ZodAny, "strip">>, chainId: number, contractWrapper: ContractWrapper<Pack>) : Pack
let options: | undefined | { clientId?: string; gasSettings?: { maxPriceInGwei?: number; speed?: "standard" | "fast" | "fastest"; }; gasless?: | { experimentalChainlessSupport?: boolean; openzeppelin: { domainName?: string; domainSeparatorVersion?: string; domainVersion?: string; relayerForwarderAddress?: string; relayerUrl: string; useEOAForwarder?: boolean; }; } | { biconomy: { apiId: string; apiKey: string; deadlineSeconds?: number; }; } | { engine: { domainName?: string; domainSeparatorVersion?: string; domainVersion?: string; relayerForwarderAddress?: string; relayerUrl: string; }; experimentalChainlessSupport?: boolean; }; gatewayUrls?: Array<string>; readonlySettings?: { chainId?: number; rpcUrl: string }; rpcBatchSettings?: { sizeLimit?: number; timeLimit?: number }; secretKey?: string; supportedChains?: Array<{ chainId: number; nativeCurrency: { decimals: number; name: string; symbol: string; }; rpc: Array<string>; slug: string; }>; };
let abi: Array<objectInputType<{ inputs: ZodDefault<ZodArray<ZodObject<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<ZodObject<..., ..., ..., ..., ...>, "many">>; stateMutability: ZodOptional<ZodString> }>, "strip", ZodAny, objectOutputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">, objectInputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">>, "many">>; name: ZodDefault<ZodString>; outputs: ZodDefault<ZodArray<ZodObject<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<ZodObject<..., ..., ..., ..., ...>, "many">>; stateMutability: ZodOptional<ZodString> }>, "strip", ZodAny, objectOutputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">, objectInputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">>, "many">>; type: ZodString }, ZodAny, "strip">>
Get a single Pack
Get all the data associated with every pack in this contract.
By default, returns the first 100 packs, use queryParams to fetch more.
const pack = await contract.get(0);console.log(packs;
Get All Packs
Get all the data associated with every pack in this contract.
By default, returns the first 100 packs, use queryParams to fetch more.
const packs = await contract.getAll();console.log(packs;
function getAll(queryParams?: { count?: number; start?: number;
The pack metadata for all packs queried.
Get Owned Packs
Get all the data associated with the packs owned by a specific wallet.
// Address of the wallet to get the packs ofconst address = "{{wallet_address}}";const packss = await contract.getOwned(address);
The pack metadata for all the owned packs in the contract.
Get Pack Contents
Get the rewards contained inside a pack.
const packId = 0;const contents = await contract.getPackContents(packId);console.log(contents.erc20Rewards);console.log(contents.erc721Rewards);console.log(contents.erc1155Rewards);
function getPackContents( packId: BigNumberish,): Promise<{ erc1155Rewards: Array<{ contractAddress: string; quantityPerReward: string; tokenId: string; totalRewards: string; }>; erc20Rewards: Array<{ contractAddress: string; quantityPerReward: string; totalRewards: string; }>; erc721Rewards: Array<{ contractAddress: string; tokenId: string }>;}>;
let returnType: Promise<{ erc1155Rewards: Array<{ contractAddress: string; quantityPerReward: string; tokenId: string; totalRewards: string; }>; erc20Rewards: Array<{ contractAddress: string; quantityPerReward: string; totalRewards: string; }>; erc721Rewards: Array<{ contractAddress: string; tokenId: string }>;}>;
The contents of the pack.
function addPackContents( packId: BigNumberish, packContents: { erc1155Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number | bigint | BigNumber; tokenId: string | number | bigint | BigNumber; }>; erc20Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number; }>; erc721Rewards?: Array<{ contractAddress: string; tokenId: string | number | bigint | BigNumber; }>; },): Promise<TResult>;
let packContents: { erc1155Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number | bigint | BigNumber; tokenId: string | number | bigint | BigNumber; }>; erc20Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number; }>; erc721Rewards?: Array<{ contractAddress: string; tokenId: string | number | bigint | BigNumber; }>;};
Preparable
You can also prepare the transaction without executing it by calling addPackContents.prepare()
with same arguments. Learn more
function airdrop( tokenId: BigNumberish, addresses: | Array<string> | Array<{ address: string; quantity?: string | number }>, fromAddress: string, data: BytesLike,): Promise<TResult>;
Preparable
You can also prepare the transaction without executing it by calling airdrop.prepare()
with same arguments. Learn more
function create(metadataWithRewards: { erc1155Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number | bigint | (BigNumber); tokenId: string | number | bigint | (BigNumber); totalRewards?: string | number | bigint | (BigNumber) }>; erc20Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number; totalRewards?: string | number | bigint | (BigNumber) }>; erc721Rewards?: Array<{ contractAddress: string; tokenId: string | number | bigint | (BigNumber) }>; openStartTime?: number | (Date); packMetadata: string | (objectInputType<extendShape<{ animation_url: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>>; description: ZodNullable<ZodOptional<ZodNullable<ZodString>>>; image: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; name: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>> }, { attributes: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; background_color: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; external_url: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; properties: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>> }>, ZodUnion<[ZodEffects<ZodUnion<[ZodBigInt, ZodType<..., ..., ...>, ZodType<..., ..., ...>]>, string, bigint | (BN) | (BigNumber)>, ZodUnknown]>, "strip">); rewardsPerPack?: string | number | bigint | (BigNumber) }) : Promise<TResult>
let metadataWithRewards: { erc1155Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number | bigint | (BigNumber); tokenId: string | number | bigint | (BigNumber); totalRewards?: string | number | bigint | (BigNumber) }>; erc20Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number; totalRewards?: string | number | bigint | (BigNumber) }>; erc721Rewards?: Array<{ contractAddress: string; tokenId: string | number | bigint | (BigNumber) }>; openStartTime?: number | (Date); packMetadata: string | (objectInputType<extendShape<{ animation_url: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>>; description: ZodNullable<ZodOptional<ZodNullable<ZodString>>>; image: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; name: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>> }, { attributes: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; background_color: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; external_url: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; properties: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>> }>, ZodUnion<[ZodEffects<ZodUnion<[ZodBigInt, ZodType<..., ..., ...>, ZodType<..., ..., ...>]>, string, bigint | (BN) | (BigNumber)>, ZodUnknown]>, "strip">); rewardsPerPack?: string | number | bigint | (BigNumber) }
Preparable
You can also prepare the transaction without executing it by calling create.prepare()
with same arguments. Learn more
function createTo(to: string, metadataWithRewards: { erc1155Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number | bigint | (BigNumber); tokenId: string | number | bigint | (BigNumber); totalRewards?: string | number | bigint | (BigNumber) }>; erc20Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number; totalRewards?: string | number | bigint | (BigNumber) }>; erc721Rewards?: Array<{ contractAddress: string; tokenId: string | number | bigint | (BigNumber) }>; openStartTime?: number | (Date); packMetadata: string | (objectInputType<extendShape<{ animation_url: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>>; description: ZodNullable<ZodOptional<ZodNullable<ZodString>>>; image: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; name: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>> }, { attributes: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; background_color: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; external_url: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; properties: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>> }>, ZodUnion<[ZodEffects<ZodUnion<[ZodBigInt, ZodType<..., ..., ...>, ZodType<..., ..., ...>]>, string, bigint | (BN) | (BigNumber)>, ZodUnknown]>, "strip">); rewardsPerPack?: string | number | bigint | (BigNumber) }) : Promise<TResult>
let metadataWithRewards: { erc1155Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number | bigint | (BigNumber); tokenId: string | number | bigint | (BigNumber); totalRewards?: string | number | bigint | (BigNumber) }>; erc20Rewards?: Array<{ contractAddress: string; quantityPerReward: string | number; totalRewards?: string | number | bigint | (BigNumber) }>; erc721Rewards?: Array<{ contractAddress: string; tokenId: string | number | bigint | (BigNumber) }>; openStartTime?: number | (Date); packMetadata: string | (objectInputType<extendShape<{ animation_url: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>>; description: ZodNullable<ZodOptional<ZodNullable<ZodString>>>; image: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; name: ZodNullable<ZodOptional<ZodUnion<[..., ...]>>> }, { attributes: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; background_color: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>>; external_url: ZodOptional<ZodNullable<ZodUnion<[..., ...]>>>; properties: ZodNullable<ZodOptional<ZodUnion<[..., ..., ...]>>> }>, ZodUnion<[ZodEffects<ZodUnion<[ZodBigInt, ZodType<..., ..., ...>, ZodType<..., ..., ...>]>, string, bigint | (BN) | (BigNumber)>, ZodUnknown]>, "strip">); rewardsPerPack?: string | number | bigint | (BigNumber) }
Preparable
You can also prepare the transaction without executing it by calling createTo.prepare()
with same arguments. Learn more
function open( tokenId: BigNumberish, amount: BigNumberish, gasLimit: any,): Promise<TResult>;
Preparable
You can also prepare the transaction without executing it by calling open.prepare()
with same arguments. Learn more
function transfer( to: string, tokenId: BigNumberish, amount: BigNumberish, data: BytesLike,): Promise<TResult>;
Preparable
You can also prepare the transaction without executing it by calling transfer.prepare()
with same arguments. Learn more
function transferBatch( to: string, tokenIds: Array<BigNumberish>, amounts: Array<BigNumberish>, fromAddress: string, data: BytesLike,): Promise<TResult>;
Preparable
You can also prepare the transaction without executing it by calling transferBatch.prepare()
with same arguments. Learn more
StandardErc1155.balanceOf
Get NFT Balance
Get a wallets NFT balance (number of NFTs in this contract owned by the wallet).
// Address of the wallet to check NFT balanceconst walletAddress = "{{wallet_address}}";const tokenId = 0; // Id of the NFT to checkconst balance = await contract.balanceOf(walletAddress, tokenId);
function balanceOf( address: string, tokenId: BigNumberish,): Promise<BigNumber>;
StandardErc1155.isApproved
Get whether this wallet has approved transfers from the given operator
function isApproved( address: string, operator: string,): Promise<boolean>;
let abi: Array<objectOutputType<{ inputs: ZodDefault<ZodArray<ZodObject<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<ZodObject<..., ..., ..., ..., ...>, "many">>; stateMutability: ZodOptional<ZodString> }>, "strip", ZodAny, objectOutputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">, objectInputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">>, "many">>; name: ZodDefault<ZodString>; outputs: ZodDefault<ZodArray<ZodObject<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<ZodObject<..., ..., ..., ..., ...>, "many">>; stateMutability: ZodOptional<ZodString> }>, "strip", ZodAny, objectOutputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">, objectInputType<extendShape<{ name: ZodDefault<ZodString>; type: ZodString }, { components: ZodOptional<ZodArray<..., ...>>; stateMutability: ZodOptional<ZodString> }>, ZodAny, "strip">>, "many">>; type: ZodString }, ZodAny, "strip">>
let metadata: ContractMetadata<Pack, { deploy: ZodObject<extendShape<extendShape<extendShape<extendShape<{ app_uri: ZodOptional<ZodString>; defaultAdmin: ZodOptional<ZodUnion<[..., ...]>>; description: ZodOptional<ZodString>; external_link: ZodOptional<ZodString>; image: ZodOptional<ZodUnion<[..., ...]>>; name: ZodString; social_urls: ZodOptional<ZodRecord<ZodString, ZodString>> }, { }>, { symbol: ZodDefault<ZodString> }>, { platform_fee_basis_points: ZodDefault<ZodNumber>; platform_fee_recipient: ZodDefault<ZodUnion<[ZodType<string, ZodTypeDef, string>, ZodType<`0x${...}`, ZodTypeDef, (...) | (...)>]>> }>, { trusted_forwarders: ZodDefault<ZodArray<ZodUnion<[ZodType<string, ZodTypeDef, string>, ZodType<`0x${...}`, ZodTypeDef, (...) | (...)>]>, "many">> }>, "strip", ZodTypeAny, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; platform_fee_basis_points: number; platform_fee_recipient: string; social_urls?: Record<string, string>; symbol: string; trusted_forwarders: Array<string> }, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; platform_fee_basis_points?: number; platform_fee_recipient?: string; social_urls?: Record<string, string>; symbol?: string; trusted_forwarders?: Array<string> }>; input: ZodObject<extendShape<extendShape<{ app_uri: ZodOptional<ZodString>; defaultAdmin: ZodOptional<ZodUnion<[ZodType<string, ZodTypeDef, string>, ZodType<`0x${...}`, ZodTypeDef, (...) | (...)>]>>; description: ZodOptional<ZodString>; external_link: ZodOptional<ZodString>; image: ZodOptional<ZodUnion<[ZodUnion<[..., ...]>, ZodString]>>; name: ZodString; social_urls: ZodOptional<ZodRecord<ZodString, ZodString>> }, { }>, { symbol: ZodDefault<ZodString> }>, "strip", ZodTypeAny, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; social_urls?: Record<string, string>; symbol: string }, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; social_urls?: Record<string, string>; symbol?: string }>; output: ZodObject<extendShape<extendShape<extendShape<{ app_uri: ZodOptional<ZodString>; defaultAdmin: ZodOptional<ZodUnion<[ZodType<..., ..., ...>, ZodType<..., ..., ...>]>>; description: ZodOptional<ZodString>; external_link: ZodOptional<ZodString>; image: ZodOptional<ZodUnion<[ZodUnion<...>, ZodString]>>; name: ZodString; social_urls: ZodOptional<ZodRecord<ZodString, ZodString>> }, { image: ZodOptional<ZodString> }>, { }>, { symbol: ZodDefault<ZodString> }>, "strip", ZodTypeAny, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: string; name: string; social_urls?: Record<string, string>; symbol: string }, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: string; name: string; social_urls?: Record<string, string>; symbol?: string }> }>
Pack, "transfer" | "minter" | "admin" | "asset">;
Configure royalties
let royalties: ContractRoyalty<Pack, { deploy: ZodObject<extendShape<extendShape<extendShape<extendShape<{ app_uri: ZodOptional<ZodString>; defaultAdmin: ZodOptional<ZodUnion<[..., ...]>>; description: ZodOptional<ZodString>; external_link: ZodOptional<ZodString>; image: ZodOptional<ZodUnion<[..., ...]>>; name: ZodString; social_urls: ZodOptional<ZodRecord<ZodString, ZodString>> }, { }>, { symbol: ZodDefault<ZodString> }>, { platform_fee_basis_points: ZodDefault<ZodNumber>; platform_fee_recipient: ZodDefault<ZodUnion<[ZodType<string, ZodTypeDef, string>, ZodType<`0x${...}`, ZodTypeDef, (...) | (...)>]>> }>, { trusted_forwarders: ZodDefault<ZodArray<ZodUnion<[ZodType<string, ZodTypeDef, string>, ZodType<`0x${...}`, ZodTypeDef, (...) | (...)>]>, "many">> }>, "strip", ZodTypeAny, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; platform_fee_basis_points: number; platform_fee_recipient: string; social_urls?: Record<string, string>; symbol: string; trusted_forwarders: Array<string> }, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; platform_fee_basis_points?: number; platform_fee_recipient?: string; social_urls?: Record<string, string>; symbol?: string; trusted_forwarders?: Array<string> }>; input: ZodObject<extendShape<extendShape<{ app_uri: ZodOptional<ZodString>; defaultAdmin: ZodOptional<ZodUnion<[ZodType<string, ZodTypeDef, string>, ZodType<`0x${...}`, ZodTypeDef, (...) | (...)>]>>; description: ZodOptional<ZodString>; external_link: ZodOptional<ZodString>; image: ZodOptional<ZodUnion<[ZodUnion<[..., ...]>, ZodString]>>; name: ZodString; social_urls: ZodOptional<ZodRecord<ZodString, ZodString>> }, { }>, { symbol: ZodDefault<ZodString> }>, "strip", ZodTypeAny, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; social_urls?: Record<string, string>; symbol: string }, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: any; name: string; social_urls?: Record<string, string>; symbol?: string }>; output: ZodObject<extendShape<extendShape<extendShape<{ app_uri: ZodOptional<ZodString>; defaultAdmin: ZodOptional<ZodUnion<[ZodType<..., ..., ...>, ZodType<..., ..., ...>]>>; description: ZodOptional<ZodString>; external_link: ZodOptional<ZodString>; image: ZodOptional<ZodUnion<[ZodUnion<...>, ZodString]>>; name: ZodString; social_urls: ZodOptional<ZodRecord<ZodString, ZodString>> }, { image: ZodOptional<ZodString> }>, { }>, { symbol: ZodDefault<ZodString> }>, "strip", ZodTypeAny, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: string; name: string; social_urls?: Record<string, string>; symbol: string }, { app_uri?: string; defaultAdmin?: string; description?: string; external_link?: string; image?: string; name: string; social_urls?: Record<string, string>; symbol?: string }> }>
let contractRoles: readonly ["admin", "minter", "asset", "transfer"];