UNPKG

sequence-cli

Version:

CLI for Sequence

1,676 lines (1,671 loc) 368 kB
#!/usr/bin/env node import { Command } from 'commander'; import { input, password, number } from '@inquirer/prompts'; import { Wallet, ethers } from 'ethers'; import { findSupportedNetwork } from '@0xsequence/network'; import shell from 'shelljs'; import chalk from 'chalk'; import { createWalletClient, http, getContract } from 'viem'; import { Session } from '@0xsequence/auth'; import { extractProjectIdFromAccessKey } from '@0xsequence/utils'; import figlet from 'figlet'; function isValidPrivateKey(privateKey) { try { new Wallet(privateKey); return true; } catch (error) { return false; } } const cliConsole = { error: (message) => { console.log(chalk.red(message)); }, errorFieldInBlank: () => { cliConsole.error("You cannot leave this field in blank. Please try again."); }, warning: (message) => { console.log(chalk.yellow(`⚠️ ${message}`)); }, info: (message) => { console.log(chalk.blue(`ℹ️ ${message}`)); }, success: (message) => { console.log(chalk.green(`✅ ${message}`)); }, loading: (message) => { console.log(chalk.gray(`⏳ ${message}...`)); }, done: (message) => { console.log(chalk.greenBright(`🎉 ${message}`)); }, lineBreak: () => { console.log('\n'); }, sectionTitle: (title) => { console.log(chalk.magenta.bold(`\n=== ${title.toUpperCase()} ===\n`)); }, }; async function promptForKeyWithLogs(prompt, logs) { if (!prompt.key) { logs.forEach((log) => console.log(log)); const inputKey = await input({ message: prompt.inputMessage, }); console.log(""); return inputKey || prompt.key; } return prompt.key; } async function executePromptWithRetry(promptFn, params, logs, options = { allowEmptyInput: true }) { const promptResult = await promptFn(params, logs); if (!promptResult && !options.allowEmptyInput) { cliConsole.errorFieldInBlank(); return await executePromptWithRetry(promptFn, params, logs, options); } return promptResult; } async function promptForProjectAccessKeyWithLogs(projectAccessKey, options = { allowEmptyInput: true }) { const logsArray = [ "Please provide the Project Access Key for your project.", "Your access key can be found at https://sequence.build under the project settings." ]; if (options.allowEmptyInput) { logsArray.push("To skip and use the default test access key, press enter."); } return await executePromptWithRetry(promptForKeyWithLogs, { key: projectAccessKey, inputMessage: "Project Access Key:" }, logsArray, options); } async function promptForWaaSConfigKeyWithLogs(waasConfigKey, options = { allowEmptyInput: true }) { const logsArray = [ "Please provide the WaaS Config Key for your project.", "Your config key can be found at https://sequence.build under the embedded wallet settings.", ]; if (options.allowEmptyInput) { logsArray.push("To skip and use the default test config key, press enter."); } return await executePromptWithRetry(promptForKeyWithLogs, { key: waasConfigKey, inputMessage: "WaaS Config Key:" }, logsArray, options); } async function promptForGoogleClientIdWithLogs(googleClientId, options = { allowEmptyInput: true }) { const logsArray = [ "Please provide the Google Client ID for your project.", "Your client ID can be found at https://console.cloud.google.com/apis/credentials.", ]; if (options.allowEmptyInput) { logsArray.push("To skip and use the default test client ID, press enter."); } return await executePromptWithRetry(promptForKeyWithLogs, { key: googleClientId, inputMessage: "Google Client ID:" }, logsArray, options); } async function promptForAppleClientIdWithLogs(appleClientId, options = { allowEmptyInput: true }) { const logsArray = [ "Please provide the Apple Client ID for your project.", "Your client ID can be found at https://developer.apple.com/account/resources/identifiers/list/serviceId", ]; if (options.allowEmptyInput) { logsArray.push("To skip and use the default test client ID, press enter."); } return await executePromptWithRetry(promptForKeyWithLogs, { key: appleClientId, inputMessage: "Apple Client ID:" }, logsArray, options); } async function promptForWalletConnectIdWithLogs(walletConnectId, options = { allowEmptyInput: true }) { const logsArray = [ "Please provide the Wallet Connect ID for your project.", ]; if (options.allowEmptyInput) { logsArray.push("To skip and use the default test client ID, press enter."); } return await executePromptWithRetry(promptForKeyWithLogs, { key: walletConnectId, inputMessage: "Wallet Connect ID:" }, logsArray, options); } async function promptForJwtAccessKeyWithLogs(jwtAccessKey, options = { allowEmptyInput: true }) { const logsArray = [ "To get your jwt access key follow the first step in https://docs.sequence.xyz/guides/metadata-guide/", ]; if (options.allowEmptyInput) { logsArray.push("To skip and use the default jwt access key, press enter."); } return await executePromptWithRetry(promptForKeyWithLogs, { key: jwtAccessKey, inputMessage: "JWT Access Key:" }, logsArray, options); } function writeToEnvFile(envKeys, options) { Object.entries(envKeys).forEach(([key, value]) => { if (value && value !== "") { shell.exec(`echo ${key}=${value} >> ${options.pathToWrite ? options.pathToWrite : ".env"}`, { silent: !options.verbose }); } }); } function writeDefaultKeysToEnvFileIfMissing(envExampleLines, envKeys, options) { const missingKeys = Object.entries(envKeys) .filter(([_, value]) => value === undefined || value === "") .map(([key, _]) => key); const envFilePath = options.pathToWrite ? options.pathToWrite : ".env"; const envFileContent = shell.cat(envFilePath).toString(); envExampleLines.forEach((line) => { if (missingKeys.some((key) => line.includes(key))) { if (!envFileContent.includes(line)) { shell.exec(`echo ${line} >> ${envFilePath}`, { silent: !options.verbose }); } } }); } function writeToWranglerEnvFile(envKeys, options) { Object.entries(envKeys).forEach(([key, value]) => { if (value && value !== "") { const formattedValue = typeof value === "string" ? `"${value}"` : value; shell.exec(`echo ${key} = ${formattedValue} >> ${options.pathToWrite ? options.pathToWrite : "wrangler.toml"}`, { silent: !options.verbose }); } }); } function appendToWranglerConfig(section, wranglerConfigPath, verbose) { const command = `echo ${section} >> ${wranglerConfigPath}`; shell.exec(command, { silent: !verbose }); } function addVarsToWranglerConfig(wranglerConfigPath, verbose) { appendToWranglerConfig('[vars]', wranglerConfigPath, verbose); } function addDevToWranglerConfig(wranglerConfigPath, verbose) { appendToWranglerConfig('[dev]', wranglerConfigPath, verbose); } function checkIfDirectoryExists(path) { return shell.test('-d', path); } const ERC1155_ABI = [ { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "_owner", type: "address", }, { indexed: true, internalType: "address", name: "_operator", type: "address", }, { indexed: false, internalType: "bool", name: "_approved", type: "bool", }, ], name: "ApprovalForAll", type: "event", }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "_operator", type: "address", }, { indexed: true, internalType: "address", name: "_from", type: "address", }, { indexed: true, internalType: "address", name: "_to", type: "address", }, { indexed: false, internalType: "uint256[]", name: "_ids", type: "uint256[]", }, { indexed: false, internalType: "uint256[]", name: "_amounts", type: "uint256[]", }, ], name: "TransferBatch", type: "event", }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "_operator", type: "address", }, { indexed: true, internalType: "address", name: "_from", type: "address", }, { indexed: true, internalType: "address", name: "_to", type: "address", }, { indexed: false, internalType: "uint256", name: "_id", type: "uint256", }, { indexed: false, internalType: "uint256", name: "_amount", type: "uint256", }, ], name: "TransferSingle", type: "event", }, { inputs: [ { internalType: "address", name: "_owner", type: "address", }, { internalType: "uint256", name: "_id", type: "uint256", }, ], name: "balanceOf", outputs: [ { internalType: "uint256", name: "", type: "uint256", }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "address[]", name: "_owners", type: "address[]", }, { internalType: "uint256[]", name: "_ids", type: "uint256[]", }, ], name: "balanceOfBatch", outputs: [ { internalType: "uint256[]", name: "", type: "uint256[]", }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint256", name: "_id", type: "uint256", }, ], name: "getIDBinIndex", outputs: [ { internalType: "uint256", name: "bin", type: "uint256", }, { internalType: "uint256", name: "index", type: "uint256", }, ], stateMutability: "pure", type: "function", }, { inputs: [ { internalType: "uint256", name: "_binValues", type: "uint256", }, { internalType: "uint256", name: "_index", type: "uint256", }, ], name: "getValueInBin", outputs: [ { internalType: "uint256", name: "", type: "uint256", }, ], stateMutability: "pure", type: "function", }, { inputs: [ { internalType: "address", name: "_owner", type: "address", }, { internalType: "address", name: "_operator", type: "address", }, ], name: "isApprovedForAll", outputs: [ { internalType: "bool", name: "isOperator", type: "bool", }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "address", name: "_from", type: "address", }, { internalType: "address", name: "_to", type: "address", }, { internalType: "uint256[]", name: "_ids", type: "uint256[]", }, { internalType: "uint256[]", name: "_amounts", type: "uint256[]", }, { internalType: "bytes", name: "_data", type: "bytes", }, ], name: "safeBatchTransferFrom", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { internalType: "address", name: "_from", type: "address", }, { internalType: "address", name: "_to", type: "address", }, { internalType: "uint256", name: "_id", type: "uint256", }, { internalType: "uint256", name: "_amount", type: "uint256", }, { internalType: "bytes", name: "_data", type: "bytes", }, ], name: "safeTransferFrom", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { internalType: "address", name: "_operator", type: "address", }, { internalType: "bool", name: "_approved", type: "bool", }, ], name: "setApprovalForAll", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { internalType: "bytes4", name: "_interfaceID", type: "bytes4", }, ], name: "supportsInterface", outputs: [ { internalType: "bool", name: "", type: "bool", }, ], stateMutability: "pure", type: "function", }, ]; const SequenceMarketplace_V1_ABI = [ { inputs: [{ internalType: "address", name: "_owner", type: "address" }], stateMutability: "nonpayable", type: "constructor", }, { inputs: [], name: "InvalidAdditionalFees", type: "error" }, { inputs: [], name: "InvalidBatchRequest", type: "error" }, { inputs: [], name: "InvalidCurrency", type: "error" }, { inputs: [ { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "address", name: "owner", type: "address" }, ], name: "InvalidCurrencyApproval", type: "error", }, { inputs: [], name: "InvalidExpiry", type: "error" }, { inputs: [], name: "InvalidPrice", type: "error" }, { inputs: [], name: "InvalidQuantity", type: "error" }, { inputs: [{ internalType: "uint256", name: "requestId", type: "uint256" }], name: "InvalidRequestId", type: "error", }, { inputs: [], name: "InvalidRoyalty", type: "error" }, { inputs: [ { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "address", name: "owner", type: "address" }, ], name: "InvalidTokenApproval", type: "error", }, { inputs: [ { internalType: "address", name: "contractAddress", type: "address" }, { internalType: "bytes4", name: "interfaceId", type: "bytes4" }, ], name: "UnsupportedContractInterface", type: "error", }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "tokenContract", type: "address", }, { indexed: false, internalType: "address", name: "recipient", type: "address", }, { indexed: false, internalType: "uint96", name: "fee", type: "uint96" }, ], name: "CustomRoyaltyChanged", type: "event", }, { anonymous: false, inputs: [ { indexed: true, internalType: "address", name: "previousOwner", type: "address", }, { indexed: true, internalType: "address", name: "newOwner", type: "address", }, ], name: "OwnershipTransferred", type: "event", }, { anonymous: false, inputs: [ { indexed: true, internalType: "uint256", name: "requestId", type: "uint256", }, { indexed: true, internalType: "address", name: "buyer", type: "address", }, { indexed: true, internalType: "address", name: "tokenContract", type: "address", }, { indexed: false, internalType: "address", name: "receiver", type: "address", }, { indexed: false, internalType: "uint256", name: "quantity", type: "uint256", }, { indexed: false, internalType: "uint256", name: "quantityRemaining", type: "uint256", }, ], name: "RequestAccepted", type: "event", }, { anonymous: false, inputs: [ { indexed: true, internalType: "uint256", name: "requestId", type: "uint256", }, { indexed: true, internalType: "address", name: "tokenContract", type: "address", }, ], name: "RequestCancelled", type: "event", }, { anonymous: false, inputs: [ { indexed: true, internalType: "uint256", name: "requestId", type: "uint256", }, { indexed: true, internalType: "address", name: "creator", type: "address", }, { indexed: true, internalType: "address", name: "tokenContract", type: "address", }, { indexed: false, internalType: "uint256", name: "tokenId", type: "uint256", }, { indexed: false, internalType: "bool", name: "isListing", type: "bool" }, { indexed: false, internalType: "uint256", name: "quantity", type: "uint256", }, { indexed: false, internalType: "address", name: "currency", type: "address", }, { indexed: false, internalType: "uint256", name: "pricePerToken", type: "uint256", }, { indexed: false, internalType: "uint256", name: "expiry", type: "uint256", }, ], name: "RequestCreated", type: "event", }, { inputs: [ { internalType: "uint256", name: "requestId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "address", name: "receiver", type: "address" }, { internalType: "uint256[]", name: "additionalFees", type: "uint256[]" }, { internalType: "address[]", name: "additionalFeeReceivers", type: "address[]", }, ], name: "acceptRequest", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { internalType: "uint256[]", name: "requestIds", type: "uint256[]" }, { internalType: "uint256[]", name: "quantities", type: "uint256[]" }, { internalType: "address[]", name: "receivers", type: "address[]" }, { internalType: "uint256[]", name: "additionalFees", type: "uint256[]" }, { internalType: "address[]", name: "additionalFeeReceivers", type: "address[]", }, ], name: "acceptRequestBatch", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [{ internalType: "uint256", name: "requestId", type: "uint256" }], name: "cancelRequest", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { internalType: "uint256[]", name: "requestIds", type: "uint256[]" }, ], name: "cancelRequestBatch", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { components: [ { internalType: "bool", name: "isListing", type: "bool" }, { internalType: "bool", name: "isERC1155", type: "bool" }, { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "uint96", name: "expiry", type: "uint96" }, { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "pricePerToken", type: "uint256" }, ], internalType: "struct ISequenceMarketStorage.RequestParams", name: "request", type: "tuple", }, ], name: "createRequest", outputs: [{ internalType: "uint256", name: "requestId", type: "uint256" }], stateMutability: "nonpayable", type: "function", }, { inputs: [ { components: [ { internalType: "bool", name: "isListing", type: "bool" }, { internalType: "bool", name: "isERC1155", type: "bool" }, { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "uint96", name: "expiry", type: "uint96" }, { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "pricePerToken", type: "uint256" }, ], internalType: "struct ISequenceMarketStorage.RequestParams[]", name: "requests", type: "tuple[]", }, ], name: "createRequestBatch", outputs: [ { internalType: "uint256[]", name: "requestIds", type: "uint256[]" }, ], stateMutability: "nonpayable", type: "function", }, { inputs: [{ internalType: "address", name: "", type: "address" }], name: "customRoyalties", outputs: [ { internalType: "address", name: "recipient", type: "address" }, { internalType: "uint96", name: "fee", type: "uint96" }, ], stateMutability: "view", type: "function", }, { inputs: [{ internalType: "uint256", name: "requestId", type: "uint256" }], name: "getRequest", outputs: [ { components: [ { internalType: "address", name: "creator", type: "address" }, { internalType: "bool", name: "isListing", type: "bool" }, { internalType: "bool", name: "isERC1155", type: "bool" }, { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "uint96", name: "expiry", type: "uint96" }, { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "pricePerToken", type: "uint256" }, ], internalType: "struct ISequenceMarketStorage.Request", name: "request", type: "tuple", }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint256[]", name: "requestIds", type: "uint256[]" }, ], name: "getRequestBatch", outputs: [ { components: [ { internalType: "address", name: "creator", type: "address" }, { internalType: "bool", name: "isListing", type: "bool" }, { internalType: "bool", name: "isERC1155", type: "bool" }, { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "uint96", name: "expiry", type: "uint96" }, { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "pricePerToken", type: "uint256" }, ], internalType: "struct ISequenceMarketStorage.Request[]", name: "requests", type: "tuple[]", }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "cost", type: "uint256" }, ], name: "getRoyaltyInfo", outputs: [ { internalType: "address", name: "recipient", type: "address" }, { internalType: "uint256", name: "royalty", type: "uint256" }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint256", name: "requestId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, ], name: "isRequestValid", outputs: [ { internalType: "bool", name: "valid", type: "bool" }, { components: [ { internalType: "address", name: "creator", type: "address" }, { internalType: "bool", name: "isListing", type: "bool" }, { internalType: "bool", name: "isERC1155", type: "bool" }, { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "uint96", name: "expiry", type: "uint96" }, { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "pricePerToken", type: "uint256" }, ], internalType: "struct ISequenceMarketStorage.Request", name: "request", type: "tuple", }, ], stateMutability: "view", type: "function", }, { inputs: [ { internalType: "uint256[]", name: "requestIds", type: "uint256[]" }, { internalType: "uint256[]", name: "quantities", type: "uint256[]" }, ], name: "isRequestValidBatch", outputs: [ { internalType: "bool[]", name: "valid", type: "bool[]" }, { components: [ { internalType: "address", name: "creator", type: "address" }, { internalType: "bool", name: "isListing", type: "bool" }, { internalType: "bool", name: "isERC1155", type: "bool" }, { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "uint256", name: "tokenId", type: "uint256" }, { internalType: "uint256", name: "quantity", type: "uint256" }, { internalType: "uint96", name: "expiry", type: "uint96" }, { internalType: "address", name: "currency", type: "address" }, { internalType: "uint256", name: "pricePerToken", type: "uint256" }, ], internalType: "struct ISequenceMarketStorage.Request[]", name: "requests", type: "tuple[]", }, ], stateMutability: "view", type: "function", }, { inputs: [], name: "owner", outputs: [{ internalType: "address", name: "", type: "address" }], stateMutability: "view", type: "function", }, { inputs: [], name: "renounceOwnership", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [ { internalType: "address", name: "tokenContract", type: "address" }, { internalType: "address", name: "recipient", type: "address" }, { internalType: "uint96", name: "fee", type: "uint96" }, ], name: "setRoyaltyInfo", outputs: [], stateMutability: "nonpayable", type: "function", }, { inputs: [{ internalType: "address", name: "newOwner", type: "address" }], name: "transferOwnership", outputs: [], stateMutability: "nonpayable", type: "function", }, ]; const ERC721_ABI = [ { "type": "constructor", "inputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "DEFAULT_ADMIN_ROLE", "inputs": [], "outputs": [ { "name": "", "type": "bytes32", "internalType": "bytes32" } ], "stateMutability": "view" }, { "type": "function", "name": "approve", "inputs": [ { "name": "to", "type": "address", "internalType": "address" }, { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [], "stateMutability": "payable" }, { "type": "function", "name": "balanceOf", "inputs": [ { "name": "owner", "type": "address", "internalType": "address" } ], "outputs": [ { "name": "", "type": "uint256", "internalType": "uint256" } ], "stateMutability": "view" }, { "type": "function", "name": "batchBurn", "inputs": [ { "name": "tokenIds", "type": "uint256[]", "internalType": "uint256[]" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "burn", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "contractURI", "inputs": [], "outputs": [ { "name": "", "type": "string", "internalType": "string" } ], "stateMutability": "view" }, { "type": "function", "name": "explicitOwnershipOf", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "tuple", "internalType": "struct IERC721A.TokenOwnership", "components": [ { "name": "addr", "type": "address", "internalType": "address" }, { "name": "startTimestamp", "type": "uint64", "internalType": "uint64" }, { "name": "burned", "type": "bool", "internalType": "bool" }, { "name": "extraData", "type": "uint24", "internalType": "uint24" } ] } ], "stateMutability": "view" }, { "type": "function", "name": "explicitOwnershipsOf", "inputs": [ { "name": "tokenIds", "type": "uint256[]", "internalType": "uint256[]" } ], "outputs": [ { "name": "", "type": "tuple[]", "internalType": "struct IERC721A.TokenOwnership[]", "components": [ { "name": "addr", "type": "address", "internalType": "address" }, { "name": "startTimestamp", "type": "uint64", "internalType": "uint64" }, { "name": "burned", "type": "bool", "internalType": "bool" }, { "name": "extraData", "type": "uint24", "internalType": "uint24" } ] } ], "stateMutability": "view" }, { "type": "function", "name": "getApproved", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "address", "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", "name": "getRoleAdmin", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" } ], "outputs": [ { "name": "", "type": "bytes32", "internalType": "bytes32" } ], "stateMutability": "view" }, { "type": "function", "name": "getRoleMember", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" }, { "name": "index", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "address", "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", "name": "getRoleMemberCount", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" } ], "outputs": [ { "name": "", "type": "uint256", "internalType": "uint256" } ], "stateMutability": "view" }, { "type": "function", "name": "grantRole", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" }, { "name": "account", "type": "address", "internalType": "address" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "hasRole", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" }, { "name": "account", "type": "address", "internalType": "address" } ], "outputs": [ { "name": "", "type": "bool", "internalType": "bool" } ], "stateMutability": "view" }, { "type": "function", "name": "initialize", "inputs": [ { "name": "owner", "type": "address", "internalType": "address" }, { "name": "tokenName", "type": "string", "internalType": "string" }, { "name": "tokenSymbol", "type": "string", "internalType": "string" }, { "name": "tokenBaseURI", "type": "string", "internalType": "string" }, { "name": "tokenContractURI", "type": "string", "internalType": "string" }, { "name": "royaltyReceiver", "type": "address", "internalType": "address" }, { "name": "royaltyFeeNumerator", "type": "uint96", "internalType": "uint96" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "isApprovedForAll", "inputs": [ { "name": "owner", "type": "address", "internalType": "address" }, { "name": "operator", "type": "address", "internalType": "address" } ], "outputs": [ { "name": "", "type": "bool", "internalType": "bool" } ], "stateMutability": "view" }, { "type": "function", "name": "mint", "inputs": [ { "name": "to", "type": "address", "internalType": "address" }, { "name": "amount", "type": "uint256", "internalType": "uint256" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "name", "inputs": [], "outputs": [ { "name": "", "type": "string", "internalType": "string" } ], "stateMutability": "view" }, { "type": "function", "name": "ownerOf", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "address", "internalType": "address" } ], "stateMutability": "view" }, { "type": "function", "name": "renounceRole", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" }, { "name": "account", "type": "address", "internalType": "address" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "revokeRole", "inputs": [ { "name": "role", "type": "bytes32", "internalType": "bytes32" }, { "name": "account", "type": "address", "internalType": "address" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "royaltyInfo", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" }, { "name": "salePrice", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "address", "internalType": "address" }, { "name": "", "type": "uint256", "internalType": "uint256" } ], "stateMutability": "view" }, { "type": "function", "name": "safeTransferFrom", "inputs": [ { "name": "from", "type": "address", "internalType": "address" }, { "name": "to", "type": "address", "internalType": "address" }, { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [], "stateMutability": "payable" }, { "type": "function", "name": "safeTransferFrom", "inputs": [ { "name": "from", "type": "address", "internalType": "address" }, { "name": "to", "type": "address", "internalType": "address" }, { "name": "tokenId", "type": "uint256", "internalType": "uint256" }, { "name": "_data", "type": "bytes", "internalType": "bytes" } ], "outputs": [], "stateMutability": "payable" }, { "type": "function", "name": "setApprovalForAll", "inputs": [ { "name": "operator", "type": "address", "internalType": "address" }, { "name": "approved", "type": "bool", "internalType": "bool" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "setBaseMetadataURI", "inputs": [ { "name": "tokenBaseURI", "type": "string", "internalType": "string" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "setContractURI", "inputs": [ { "name": "tokenContractURI", "type": "string", "internalType": "string" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "setDefaultRoyalty", "inputs": [ { "name": "receiver", "type": "address", "internalType": "address" }, { "name": "feeNumerator", "type": "uint96", "internalType": "uint96" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "setNameAndSymbol", "inputs": [ { "name": "tokenName", "type": "string", "internalType": "string" }, { "name": "tokenSymbol", "type": "string", "internalType": "string" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "setTokenRoyalty", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" }, { "name": "receiver", "type": "address", "internalType": "address" }, { "name": "feeNumerator", "type": "uint96", "internalType": "uint96" } ], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "supportsInterface", "inputs": [ { "name": "interfaceId", "type": "bytes4", "internalType": "bytes4" } ], "outputs": [ { "name": "", "type": "bool", "internalType": "bool" } ], "stateMutability": "view" }, { "type": "function", "name": "symbol", "inputs": [], "outputs": [ { "name": "", "type": "string", "internalType": "string" } ], "stateMutability": "view" }, { "type": "function", "name": "tokenURI", "inputs": [ { "name": "tokenId", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "string", "internalType": "string" } ], "stateMutability": "view" }, { "type": "function", "name": "tokensOfOwner", "inputs": [ { "name": "owner", "type": "address", "internalType": "address" } ], "outputs": [ { "name": "", "type": "uint256[]", "internalType": "uint256[]" } ], "stateMutability": "view" }, { "type": "function", "name": "tokensOfOwnerIn", "inputs": [ { "name": "owner", "type": "address", "internalType": "address" }, {