erc1155.test.ts.md•78.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);␊
}␊
}␊
}␊
`