Skip to main content
Glama

OpenZeppelin Contracts MCP Server

Official
by OpenZeppelin
erc1155.test.ts.md78.4 kB
# Snapshot report for `src/erc1155.test.ts` The actual snapshot is saved in `erc1155.test.ts.snap`. Generated by [AVA](https://avajs.dev). ## basic non-upgradeable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use starknet::ContractAddress;␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ }␊ ` ## basic > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## basic + roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ accesscontrol: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ AccessControlEvent: AccessControlComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ default_admin: ContractAddress,␊ uri_setter: ContractAddress,␊ upgrader: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.accesscontrol.initializer();␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## no updatable uri > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## burnable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ let caller = get_caller_address();␊ if account != caller {␊ assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ }␊ self.erc1155.burn(account, token_id, value);␊ }␊ ␊ #[external(v0)]␊ fn batch_burn(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ ) {␊ let caller = get_caller_address();␊ if account != caller {␊ assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ }␊ self.erc1155.batch_burn(account, token_ids, values);␊ }␊ ␊ #[external(v0)]␊ fn batchBurn(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ ) {␊ self.batch_burn(account, tokenIds, values);␊ }␊ ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## pausable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::erc1155::ERC1155Component;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl PausableInternalImpl = PausableComponent::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ PausableEvent: PausableComponent::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait<ContractState> {␊ fn before_update(␊ ref self: ERC1155Component::ComponentState<ContractState>,␊ from: ContractAddress,␊ to: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ ) {␊ let contract_state = self.get_contract();␊ contract_state.pausable.assert_not_paused();␊ }␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ self.ownable.assert_only_owner();␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ self.ownable.assert_only_owner();␊ self.pausable.unpause();␊ }␊ ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## mintable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_id: u256,␊ value: u256,␊ data: Span<felt252>,␊ ) {␊ self.ownable.assert_only_owner();␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ #[external(v0)]␊ fn batch_mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.ownable.assert_only_owner();␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ #[external(v0)]␊ fn batchMint(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.batch_mint(account, tokenIds, values, data);␊ }␊ ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## mintable + roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{MINTER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ accesscontrol: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ AccessControlEvent: AccessControlComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ default_admin: ContractAddress,␊ minter: ContractAddress,␊ uri_setter: ContractAddress,␊ upgrader: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.accesscontrol.initializer();␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_id: u256,␊ value: u256,␊ data: Span<felt252>,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ #[external(v0)]␊ fn batch_mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ #[external(v0)]␊ fn batchMint(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.batch_mint(account, tokenIds, values, data);␊ }␊ ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## royalty info disabled > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(ref self: ContractState, owner: ContractAddress) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## royalty info enabled default + ownable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981Impl = ERC2981Component::ERC2981Impl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ impl ERC2981InternalImpl = ERC2981Component::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ #[flat]␊ ERC2981Event: ERC2981Component::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ owner: ContractAddress,␊ default_royalty_receiver: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## royalty info enabled default + roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981Impl = ERC2981Component::ERC2981Impl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ impl ERC2981InternalImpl = ERC2981Component::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ accesscontrol: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ AccessControlEvent: AccessControlComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ #[flat]␊ ERC2981Event: ERC2981Component::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ default_admin: ContractAddress,␊ uri_setter: ContractAddress,␊ upgrader: ContractAddress,␊ default_royalty_receiver: ContractAddress,␊ royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.accesscontrol.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## royalty info enabled custom + ownable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::ownable::OwnableComponent;␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::ERC2981Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981Impl = ERC2981Component::ERC2981Impl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981AdminOwnableImpl = ERC2981Component::ERC2981AdminOwnableImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ impl ERC2981InternalImpl = ERC2981Component::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ ownable: OwnableComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ OwnableEvent: OwnableComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ #[flat]␊ ERC2981Event: ERC2981Component::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ owner: ContractAddress,␊ default_royalty_receiver: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.ownable.initializer(owner);␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ }␊ ␊ impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.ownable.assert_only_owner();␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.ownable.assert_only_owner();␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## royalty info enabled custom + roles > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::token::common::erc2981::ERC2981Component;␊ use openzeppelin::token::erc1155::{ERC1155Component, ERC1155HooksEmptyImpl};␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress};␊ use super::{UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981Impl = ERC2981Component::ERC2981Impl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ impl ERC2981InternalImpl = ERC2981Component::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ accesscontrol: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ AccessControlEvent: AccessControlComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ #[flat]␊ ERC2981Event: ERC2981Component::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ default_admin: ContractAddress,␊ uri_setter: ContractAddress,␊ upgrader: ContractAddress,␊ default_royalty_receiver: ContractAddress,␊ royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.accesscontrol.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 15125);␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC2981ImmutableConfig of ERC2981Component::ImmutableConfig {␊ const FEE_DENOMINATOR: u128 = 100000;␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ ` ## full non-upgradeable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc1155::ERC1155Component;␊ use starknet::{ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981Impl = ERC2981Component::ERC2981Impl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl PausableInternalImpl = PausableComponent::InternalImpl<ContractState>;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊ impl ERC2981InternalImpl = ERC2981Component::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ accesscontrol: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ PausableEvent: PausableComponent::Event,␊ #[flat]␊ AccessControlEvent: AccessControlComponent::Event,␊ #[flat]␊ ERC2981Event: ERC2981Component::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ default_admin: ContractAddress,␊ pauser: ContractAddress,␊ minter: ContractAddress,␊ uri_setter: ContractAddress,␊ default_royalty_receiver: ContractAddress,␊ royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.accesscontrol.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait<ContractState> {␊ fn before_update(␊ ref self: ERC1155Component::ComponentState<ContractState>,␊ from: ContractAddress,␊ to: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ ) {␊ let contract_state = self.get_contract();␊ contract_state.pausable.assert_not_paused();␊ }␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ #[external(v0)]␊ fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ let caller = get_caller_address();␊ if account != caller {␊ assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ }␊ self.erc1155.burn(account, token_id, value);␊ }␊ ␊ #[external(v0)]␊ fn batch_burn(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ ) {␊ let caller = get_caller_address();␊ if account != caller {␊ assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ }␊ self.erc1155.batch_burn(account, token_ids, values);␊ }␊ ␊ #[external(v0)]␊ fn batchBurn(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ ) {␊ self.batch_burn(account, tokenIds, values);␊ }␊ ␊ #[external(v0)]␊ fn mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_id: u256,␊ value: u256,␊ data: Span<felt252>,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ #[external(v0)]␊ fn batch_mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ #[external(v0)]␊ fn batchMint(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.batch_mint(account, tokenIds, values, data);␊ }␊ ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ }␊ ` ## full upgradeable > Snapshot 1 `// SPDX-License-Identifier: MIT␊ // Compatible with OpenZeppelin Contracts for Cairo ^2.0.0␊ ␊ const PAUSER_ROLE: felt252 = selector!("PAUSER_ROLE");␊ const MINTER_ROLE: felt252 = selector!("MINTER_ROLE");␊ const URI_SETTER_ROLE: felt252 = selector!("URI_SETTER_ROLE");␊ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊ ␊ #[starknet::contract]␊ mod MyToken {␊ use openzeppelin::access::accesscontrol::{AccessControlComponent, DEFAULT_ADMIN_ROLE};␊ use openzeppelin::introspection::src5::SRC5Component;␊ use openzeppelin::security::pausable::PausableComponent;␊ use openzeppelin::token::common::erc2981::{DefaultConfig, ERC2981Component};␊ use openzeppelin::token::erc1155::ERC1155Component;␊ use openzeppelin::upgrades::interface::IUpgradeable;␊ use openzeppelin::upgrades::UpgradeableComponent;␊ use starknet::{ClassHash, ContractAddress, get_caller_address};␊ use super::{MINTER_ROLE, PAUSER_ROLE, UPGRADER_ROLE, URI_SETTER_ROLE};␊ ␊ component!(path: ERC1155Component, storage: erc1155, event: ERC1155Event);␊ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊ component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊ component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊ component!(path: ERC2981Component, storage: erc2981, event: ERC2981Event);␊ ␊ // External␊ #[abi(embed_v0)]␊ impl ERC1155MixinImpl = ERC1155Component::ERC1155MixinImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl PausableImpl = PausableComponent::PausableImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlImpl = AccessControlComponent::AccessControlImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlCamelImpl = AccessControlComponent::AccessControlCamelImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl AccessControlWithDelayImpl = AccessControlComponent::AccessControlWithDelayImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981Impl = ERC2981Component::ERC2981Impl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981InfoImpl = ERC2981Component::ERC2981InfoImpl<ContractState>;␊ #[abi(embed_v0)]␊ impl ERC2981AdminAccessControlImpl = ERC2981Component::ERC2981AdminAccessControlImpl<ContractState>;␊ ␊ // Internal␊ impl ERC1155InternalImpl = ERC1155Component::InternalImpl<ContractState>;␊ impl PausableInternalImpl = PausableComponent::InternalImpl<ContractState>;␊ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊ impl ERC2981InternalImpl = ERC2981Component::InternalImpl<ContractState>;␊ ␊ #[storage]␊ struct Storage {␊ #[substorage(v0)]␊ erc1155: ERC1155Component::Storage,␊ #[substorage(v0)]␊ src5: SRC5Component::Storage,␊ #[substorage(v0)]␊ pausable: PausableComponent::Storage,␊ #[substorage(v0)]␊ accesscontrol: AccessControlComponent::Storage,␊ #[substorage(v0)]␊ upgradeable: UpgradeableComponent::Storage,␊ #[substorage(v0)]␊ erc2981: ERC2981Component::Storage,␊ }␊ ␊ #[event]␊ #[derive(Drop, starknet::Event)]␊ enum Event {␊ #[flat]␊ ERC1155Event: ERC1155Component::Event,␊ #[flat]␊ SRC5Event: SRC5Component::Event,␊ #[flat]␊ PausableEvent: PausableComponent::Event,␊ #[flat]␊ AccessControlEvent: AccessControlComponent::Event,␊ #[flat]␊ UpgradeableEvent: UpgradeableComponent::Event,␊ #[flat]␊ ERC2981Event: ERC2981Component::Event,␊ }␊ ␊ #[constructor]␊ fn constructor(␊ ref self: ContractState,␊ default_admin: ContractAddress,␊ pauser: ContractAddress,␊ minter: ContractAddress,␊ uri_setter: ContractAddress,␊ upgrader: ContractAddress,␊ default_royalty_receiver: ContractAddress,␊ royalty_admin: ContractAddress,␊ ) {␊ self.erc1155.initializer("https://gateway.pinata.cloud/ipfs/QmcP9hxrnC1T5ATPmq2saFeAM1ypFX9BnAswCdHB9JCjLA/");␊ self.accesscontrol.initializer();␊ self.erc2981.initializer(default_royalty_receiver, 500);␊ ␊ self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊ self.accesscontrol._grant_role(PAUSER_ROLE, pauser);␊ self.accesscontrol._grant_role(MINTER_ROLE, minter);␊ self.accesscontrol._grant_role(URI_SETTER_ROLE, uri_setter);␊ self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊ self.accesscontrol._grant_role(ERC2981Component::ROYALTY_ADMIN_ROLE, royalty_admin);␊ }␊ ␊ impl ERC1155HooksImpl of ERC1155Component::ERC1155HooksTrait<ContractState> {␊ fn before_update(␊ ref self: ERC1155Component::ComponentState<ContractState>,␊ from: ContractAddress,␊ to: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ ) {␊ let contract_state = self.get_contract();␊ contract_state.pausable.assert_not_paused();␊ }␊ }␊ ␊ #[generate_trait]␊ #[abi(per_item)]␊ impl ExternalImpl of ExternalTrait {␊ #[external(v0)]␊ fn pause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable.pause();␊ }␊ ␊ #[external(v0)]␊ fn unpause(ref self: ContractState) {␊ self.accesscontrol.assert_only_role(PAUSER_ROLE);␊ self.pausable.unpause();␊ }␊ ␊ #[external(v0)]␊ fn burn(ref self: ContractState, account: ContractAddress, token_id: u256, value: u256) {␊ let caller = get_caller_address();␊ if account != caller {␊ assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ }␊ self.erc1155.burn(account, token_id, value);␊ }␊ ␊ #[external(v0)]␊ fn batch_burn(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ ) {␊ let caller = get_caller_address();␊ if account != caller {␊ assert(self.erc1155.is_approved_for_all(account, caller), ERC1155Component::Errors::UNAUTHORIZED);␊ }␊ self.erc1155.batch_burn(account, token_ids, values);␊ }␊ ␊ #[external(v0)]␊ fn batchBurn(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ ) {␊ self.batch_burn(account, tokenIds, values);␊ }␊ ␊ #[external(v0)]␊ fn mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_id: u256,␊ value: u256,␊ data: Span<felt252>,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc1155.mint_with_acceptance_check(account, token_id, value, data);␊ }␊ ␊ #[external(v0)]␊ fn batch_mint(␊ ref self: ContractState,␊ account: ContractAddress,␊ token_ids: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.accesscontrol.assert_only_role(MINTER_ROLE);␊ self.erc1155.batch_mint_with_acceptance_check(account, token_ids, values, data);␊ }␊ ␊ #[external(v0)]␊ fn batchMint(␊ ref self: ContractState,␊ account: ContractAddress,␊ tokenIds: Span<u256>,␊ values: Span<u256>,␊ data: Span<felt252>,␊ ) {␊ self.batch_mint(account, tokenIds, values, data);␊ }␊ ␊ #[external(v0)]␊ fn set_base_uri(ref self: ContractState, base_uri: ByteArray) {␊ self.accesscontrol.assert_only_role(URI_SETTER_ROLE);␊ self.erc1155._set_base_uri(base_uri);␊ }␊ ␊ #[external(v0)]␊ fn setBaseUri(ref self: ContractState, baseUri: ByteArray) {␊ self.set_base_uri(baseUri);␊ }␊ }␊ ␊ //␊ // Upgradeable␊ //␊ ␊ #[abi(embed_v0)]␊ impl UpgradeableImpl of IUpgradeable<ContractState> {␊ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊ self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊ self.upgradeable.upgrade(new_class_hash);␊ }␊ }␊ }␊ `

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