MultiToken API
This module provides the full MultiToken module API.
For an overview of the module, read the MultiToken guide.
import "./node_modules/@openzeppelin/compact-contracts/token/MultiToken";Ledger
_isInitialized: Boolean
ledger
#Initialization flag, tracked per-module to avoid the compiler's shared transitive-dependency state bug (LFDT-Minokawa/compact#270). See the Initializable module for rationale.
_balances: Map<Uint<128>, Map<Either<Bytes<32>, ContractAddress>, Uint<128>>>
ledger
#Mapping from token ID to account balances.
_operatorApprovals: Map<Either<Bytes<32>, ContractAddress>, Map<Either<Bytes<32>, ContractAddress>, Boolean>>
ledger
#Mapping from account to operator approvals.
_uri: Opaque<"string">
ledger
#Base URI for computing token URIs. Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/`id`.json
Witnesses
wit_MultiTokenSK() → Bytes<32>
witness
#Returns the caller's secret key used in deriving the account identifier.
The same key produces the same account identifier across all contracts. Users who desire cross-contract unlinkability should use different keys per contract.
Circuits
initialize(uri_: Opaque<"string">) → []
circuit
#Initializes the contract by setting the base URI for all tokens.
Requirements:
- Must be called in the contract's constructor.
- Contract is not initialized.
uri(id: Uint<128>) → Opaque<"string">
circuit
#This implementation returns the same URI for all token types. It relies
on the token type ID substitution mechanism defined in the EIP:
https://eips.ethereum.org/EIPS/eip-1155#metadata.
Clients calling this function must replace the \{id\} substring with the
actual token type ID.
Requirements:
- Contract is initialized.
balanceOf(
account: Either<Bytes<32>, ContractAddress>,
id: Uint<128>
) → Uint<128>circuit
#Returns the amount of id tokens owned by account.
Requirements:
- Contract is initialized.
setApprovalForAll(
operator: Either<Bytes<32>, ContractAddress>,
approved: Boolean
) → []circuit
#Enables or disables approval for operator to manage all of the caller's assets.
In the case of an external (non-contract) caller, the caller's identity is derived from the wit_MultiTokenSK
witness as persistentHash(secretKey).
Requirements:
- Contract is initialized.
operatoris not zero.
isApprovedForAll(
account: Either<Bytes<32>, ContractAddress>,
operator: Either<Bytes<32>, ContractAddress>
) → Booleancircuit
#Queries if operator is an authorized operator for account.
Requirements:
- Contract is initialized.
transferFrom(
fromAddress: Either<Bytes<32>, ContractAddress>,
to: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Transfers ownership of value amount of id tokens from fromAddress to to.
The caller must be fromAddress or approved to transfer on their behalf.
In the case of an external (non-contract) caller, the caller's identity is derived from the wit_MultiTokenSK
witness as persistentHash(secretKey).
Transfers to contract addresses are currently disallowed until contract-to-contract interactions are supported in Compact. This restriction prevents assets from being inadvertently locked in contracts that cannot currently handle token receipt.
Requirements:
- Contract is initialized.
tois not a ContractAddress.tois not zero.fromAddressis not zero.- Caller must be
fromAddressor approved via setApprovalForAll. fromAddressmust have anidbalance of at leastvalue.
_transfer(
fromAddress: Either<Bytes<32>, ContractAddress>,
to: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Transfers ownership of value amount of id tokens from fromAddress to to.
Does not impose restrictions on the caller, making it suitable for composition
in higher-level contract logic.
Transfers to contract addresses are currently disallowed until contract-to-contract interactions are supported in Compact. This restriction prevents assets from being inadvertently locked in contracts that cannot currently handle token receipt.
Requirements:
- Contract is initialized.
tois not a ContractAddress.tois not zero.fromAddressis not zero.fromAddressmust have anidbalance of at leastvalue.
_unsafeTransferFrom(
fromAddress: Either<Bytes<32>, ContractAddress>,
to: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Unsafe variant of transferFrom which allows transfers to contract addresses.
The caller must be fromAddress or approved to transfer on their behalf.
In the case of an external (non-contract) caller, the caller's identity is derived from the wit_MultiTokenSK
witness as persistentHash(secretKey).
Transfers to contract addresses are considered unsafe because contract-to-contract calls are not currently supported. Tokens sent to a contract address may become irretrievable. Once contract-to-contract calls are supported, this circuit may be deprecated.
Requirements:
- Contract is initialized.
tois not zero.fromAddressis not zero.- Caller must be
fromAddressor approved via setApprovalForAll. fromAddressmust have anidbalance of at leastvalue.
_unsafeTransfer(
fromAddress: Either<Bytes<32>, ContractAddress>,
to: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Unsafe variant of _transfer which allows transfers to contract addresses. Does not impose restrictions on the caller, making it suitable as a low-level building block for advanced contract logic.
Transfers to contract addresses are considered unsafe because contract-to-contract calls are not currently supported. Tokens sent to a contract address may become irretrievable. Once contract-to-contract calls are supported, this circuit may be deprecated.
Requirements:
- Contract is initialized.
fromAddressis not zero.tois not zero.fromAddressmust have anidbalance of at leastvalue.
_setURI(newURI: Opaque<"string">) → []
circuit
#Sets a new URI for all token types, by relying on the token type ID substitution mechanism defined in the MultiToken standard. See https://eips.ethereum.org/EIPS/eip-1155#metadata.
By this mechanism, any occurrence of the \{id\} substring in either the
URI or any of the values in the JSON file at said URI will be replaced by
clients with the token type ID.
For example, the https://token-cdn-domain/\{id\}.json URI would be
interpreted by clients as
https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json
for token type ID 0x4cce0.
Requirements:
- Contract is initialized.
_mint(
to: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Creates a value amount of tokens of type id, and assigns them to to.
Transfers to contract addresses are currently disallowed until contract-to-contract interactions are supported in Compact. This restriction prevents assets from being inadvertently locked in contracts that cannot currently handle token receipt.
Requirements:
- Contract is initialized.
tois not zero.tois not a ContractAddress.
_unsafeMint(
to: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Unsafe variant of _mint which allows transfers to contract addresses.
Transfers to contract addresses are considered unsafe because contract-to-contract calls are not currently supported. Tokens sent to a contract address may become irretrievable. Once contract-to-contract calls are supported, this circuit may be deprecated.
Requirements:
- Contract is initialized.
tois not zero.
_burn(
fromAddress: Either<Bytes<32>, ContractAddress>,
id: Uint<128>,
value: Uint<128>
) → []circuit
#Destroys a value amount of tokens of type id from fromAddress.
Requirements:
- Contract is initialized.
fromAddressis not zero.fromAddressmust have anidbalance of at leastvalue.
_setApprovalForAll(
owner: Either<Bytes<32>, ContractAddress>,
operator: Either<Bytes<32>, ContractAddress>,
approved: Boolean
) → []circuit
#Enables or disables approval for operator to manage all of owner's assets.
This circuit does not check for access permissions but can be useful as a building block for more complex contract logic.
Requirements:
- Contract is initialized.
owneris not zero.operatoris not zero.