erc721.test.ts.md•27.4 kB
# Snapshot report for `src/erc721.test.ts`
The actual snapshot is saved in `erc721.test.ts.snap`.
Generated by [AVA](https://avajs.dev).
## basic erc721
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Stylus ^0.2.0␊
␊
#![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊
extern crate alloc;␊
␊
use alloc::vec::Vec;␊
use openzeppelin_stylus::token::erc721::{self, Erc721, IErc721};␊
use openzeppelin_stylus::utils::introspection::erc165::IErc165;␊
use stylus_sdk::abi::Bytes;␊
use stylus_sdk::alloy_primitives::{Address, FixedBytes, U256};␊
use stylus_sdk::prelude::*;␊
␊
#[entrypoint]␊
#[storage]␊
struct MyToken {␊
erc721: Erc721,␊
}␊
␊
#[public]␊
#[implements(IErc721<Error = erc721::Error>, IErc165)]␊
impl MyToken {}␊
␊
#[public]␊
impl IErc721 for MyToken {␊
type Error = erc721::Error;␊
␊
fn balance_of(&self, owner: Address) -> Result<U256, Self::Error> {␊
Ok(self.erc721.balance_of(owner)?)␊
}␊
␊
fn owner_of(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.owner_of(token_id)?)␊
}␊
␊
fn safe_transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.safe_transfer_from(from, to, token_id)?)␊
}␊
␊
#[selector(name = "safeTransferFrom")]␊
fn safe_transfer_from_with_data(&mut self, from: Address, to: Address, token_id: U256, data: Bytes) -> Result<(), Self::Error> {␊
Ok(self.erc721.safe_transfer_from_with_data(from, to, token_id, data)?)␊
}␊
␊
fn transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.transfer_from(from, to, token_id)?)␊
}␊
␊
fn approve(&mut self, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.approve(to, token_id)?)␊
}␊
␊
fn set_approval_for_all(&mut self, operator: Address, approved: bool) -> Result<(), Self::Error> {␊
Ok(self.erc721.set_approval_for_all(operator, approved)?)␊
}␊
␊
fn get_approved(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.get_approved(token_id)?)␊
}␊
␊
fn is_approved_for_all(&self, owner: Address, operator: Address) -> bool {␊
self.erc721.is_approved_for_all(owner, operator)␊
}␊
}␊
␊
#[public]␊
impl IErc165 for MyToken {␊
fn supports_interface(&self, interface_id: FixedBytes<4>) -> bool {␊
self.erc721.supports_interface(interface_id)␊
}␊
}␊
`
## erc721 burnable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Stylus ^0.2.0␊
␊
#![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊
extern crate alloc;␊
␊
use alloc::vec::Vec;␊
use openzeppelin_stylus::token::erc721::extensions::burnable::IErc721Burnable;␊
use openzeppelin_stylus::token::erc721::{self, Erc721, IErc721};␊
use openzeppelin_stylus::utils::introspection::erc165::IErc165;␊
use stylus_sdk::abi::Bytes;␊
use stylus_sdk::alloy_primitives::{Address, FixedBytes, U256};␊
use stylus_sdk::prelude::*;␊
␊
#[entrypoint]␊
#[storage]␊
struct MyToken {␊
erc721: Erc721,␊
}␊
␊
#[public]␊
#[implements(IErc721<Error = erc721::Error>, IErc721Burnable<Error = erc721::Error>, IErc165)]␊
impl MyToken {}␊
␊
#[public]␊
impl IErc721 for MyToken {␊
type Error = erc721::Error;␊
␊
fn balance_of(&self, owner: Address) -> Result<U256, Self::Error> {␊
Ok(self.erc721.balance_of(owner)?)␊
}␊
␊
fn owner_of(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.owner_of(token_id)?)␊
}␊
␊
fn safe_transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.safe_transfer_from(from, to, token_id)?)␊
}␊
␊
#[selector(name = "safeTransferFrom")]␊
fn safe_transfer_from_with_data(&mut self, from: Address, to: Address, token_id: U256, data: Bytes) -> Result<(), Self::Error> {␊
Ok(self.erc721.safe_transfer_from_with_data(from, to, token_id, data)?)␊
}␊
␊
fn transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.transfer_from(from, to, token_id)?)␊
}␊
␊
fn approve(&mut self, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.approve(to, token_id)?)␊
}␊
␊
fn set_approval_for_all(&mut self, operator: Address, approved: bool) -> Result<(), Self::Error> {␊
Ok(self.erc721.set_approval_for_all(operator, approved)?)␊
}␊
␊
fn get_approved(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.get_approved(token_id)?)␊
}␊
␊
fn is_approved_for_all(&self, owner: Address, operator: Address) -> bool {␊
self.erc721.is_approved_for_all(owner, operator)␊
}␊
}␊
␊
#[public]␊
impl IErc721Burnable for MyToken {␊
type Error = erc721::Error;␊
␊
fn burn(&mut self, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.burn(token_id)?)␊
}␊
}␊
␊
#[public]␊
impl IErc165 for MyToken {␊
fn supports_interface(&self, interface_id: FixedBytes<4>) -> bool {␊
self.erc721.supports_interface(interface_id)␊
}␊
}␊
`
## erc721 enumerable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Stylus ^0.2.0␊
␊
#![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊
extern crate alloc;␊
␊
use alloc::vec::Vec;␊
use openzeppelin_stylus::token::erc721::extensions::enumerable::{␊
self, Erc721Enumerable, IErc721Enumerable␊
};␊
use openzeppelin_stylus::token::erc721::{self, Erc721, IErc721};␊
use openzeppelin_stylus::utils::introspection::erc165::IErc165;␊
use stylus_sdk::abi::Bytes;␊
use stylus_sdk::alloy_primitives::{Address, FixedBytes, U256};␊
use stylus_sdk::prelude::*;␊
␊
#[derive(SolidityError, Debug)]␊
enum Error {␊
InvalidOwner(erc721::ERC721InvalidOwner),␊
NonexistentToken(erc721::ERC721NonexistentToken),␊
IncorrectOwner(erc721::ERC721IncorrectOwner),␊
InvalidSender(erc721::ERC721InvalidSender),␊
InvalidReceiver(erc721::ERC721InvalidReceiver),␊
InvalidReceiverWithReason(erc721::InvalidReceiverWithReason),␊
InsufficientApproval(erc721::ERC721InsufficientApproval),␊
InvalidApprover(erc721::ERC721InvalidApprover),␊
InvalidOperator(erc721::ERC721InvalidOperator),␊
OutOfBoundsIndex(enumerable::ERC721OutOfBoundsIndex),␊
EnumerableForbiddenBatchMint(enumerable::ERC721EnumerableForbiddenBatchMint),␊
}␊
␊
impl From<erc721::Error> for Error {␊
fn from(error: erc721::Error) -> Self {␊
match error {␊
erc721::Error::InvalidOwner(e) => Error::InvalidOwner(e),␊
erc721::Error::NonexistentToken(e) => Error::NonexistentToken(e),␊
erc721::Error::IncorrectOwner(e) => Error::IncorrectOwner(e),␊
erc721::Error::InvalidSender(e) => Error::InvalidSender(e),␊
erc721::Error::InvalidReceiver(e) => Error::InvalidReceiver(e),␊
erc721::Error::InvalidReceiverWithReason(e) => Error::InvalidReceiverWithReason(e),␊
erc721::Error::InsufficientApproval(e) => Error::InsufficientApproval(e),␊
erc721::Error::InvalidApprover(e) => Error::InvalidApprover(e),␊
erc721::Error::InvalidOperator(e) => Error::InvalidOperator(e),␊
}␊
}␊
}␊
␊
impl From<enumerable::Error> for Error {␊
fn from(error: enumerable::Error) -> Self {␊
match error {␊
enumerable::Error::OutOfBoundsIndex(e) => Error::OutOfBoundsIndex(e),␊
enumerable::Error::EnumerableForbiddenBatchMint(e) => Error::EnumerableForbiddenBatchMint(e),␊
}␊
}␊
}␊
␊
#[entrypoint]␊
#[storage]␊
struct MyToken {␊
erc721: Erc721,␊
enumerable: Erc721Enumerable,␊
}␊
␊
#[public]␊
#[implements(IErc721<Error = Error>, IErc721Enumerable<Error = Error>, IErc165)]␊
impl MyToken {}␊
␊
#[public]␊
impl IErc721 for MyToken {␊
type Error = Error;␊
␊
fn balance_of(&self, owner: Address) -> Result<U256, Self::Error> {␊
Ok(self.erc721.balance_of(owner)?)␊
}␊
␊
fn owner_of(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.owner_of(token_id)?)␊
}␊
␊
fn safe_transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.safe_transfer_from(from, to, token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
#[selector(name = "safeTransferFrom")]␊
fn safe_transfer_from_with_data(&mut self, from: Address, to: Address, token_id: U256, data: Bytes) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.safe_transfer_from_with_data(from, to, token_id, data)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
fn transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.transfer_from(from, to, token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
fn approve(&mut self, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.approve(to, token_id)?)␊
}␊
␊
fn set_approval_for_all(&mut self, operator: Address, approved: bool) -> Result<(), Self::Error> {␊
Ok(self.erc721.set_approval_for_all(operator, approved)?)␊
}␊
␊
fn get_approved(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.get_approved(token_id)?)␊
}␊
␊
fn is_approved_for_all(&self, owner: Address, operator: Address) -> bool {␊
self.erc721.is_approved_for_all(owner, operator)␊
}␊
}␊
␊
#[public]␊
impl IErc721Enumerable for MyToken {␊
type Error = Error;␊
␊
fn token_of_owner_by_index(&self, owner: Address, index: U256) -> Result<U256, Self::Error> {␊
Ok(self.enumerable.token_of_owner_by_index(owner, index)?)␊
}␊
␊
fn total_supply(&self) -> U256 {␊
self.enumerable.total_supply()␊
}␊
␊
fn token_by_index(&self, index: U256) -> Result<U256, Self::Error> {␊
Ok(self.enumerable.token_by_index(index)?)␊
}␊
}␊
␊
#[public]␊
impl IErc165 for MyToken {␊
fn supports_interface(&self, interface_id: FixedBytes<4>) -> bool {␊
self.erc721.supports_interface(interface_id)␊
|| self.enumerable.supports_interface(interface_id)␊
}␊
}␊
`
## erc721 burnable enumerable
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Stylus ^0.2.0␊
␊
#![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊
extern crate alloc;␊
␊
use alloc::vec::Vec;␊
use openzeppelin_stylus::token::erc721::extensions::burnable::IErc721Burnable;␊
use openzeppelin_stylus::token::erc721::extensions::enumerable::{␊
self, Erc721Enumerable, IErc721Enumerable␊
};␊
use openzeppelin_stylus::token::erc721::{self, Erc721, IErc721};␊
use openzeppelin_stylus::utils::introspection::erc165::IErc165;␊
use stylus_sdk::abi::Bytes;␊
use stylus_sdk::alloy_primitives::{Address, FixedBytes, U256};␊
use stylus_sdk::prelude::*;␊
␊
#[derive(SolidityError, Debug)]␊
enum Error {␊
InvalidOwner(erc721::ERC721InvalidOwner),␊
NonexistentToken(erc721::ERC721NonexistentToken),␊
IncorrectOwner(erc721::ERC721IncorrectOwner),␊
InvalidSender(erc721::ERC721InvalidSender),␊
InvalidReceiver(erc721::ERC721InvalidReceiver),␊
InvalidReceiverWithReason(erc721::InvalidReceiverWithReason),␊
InsufficientApproval(erc721::ERC721InsufficientApproval),␊
InvalidApprover(erc721::ERC721InvalidApprover),␊
InvalidOperator(erc721::ERC721InvalidOperator),␊
OutOfBoundsIndex(enumerable::ERC721OutOfBoundsIndex),␊
EnumerableForbiddenBatchMint(enumerable::ERC721EnumerableForbiddenBatchMint),␊
}␊
␊
impl From<erc721::Error> for Error {␊
fn from(error: erc721::Error) -> Self {␊
match error {␊
erc721::Error::InvalidOwner(e) => Error::InvalidOwner(e),␊
erc721::Error::NonexistentToken(e) => Error::NonexistentToken(e),␊
erc721::Error::IncorrectOwner(e) => Error::IncorrectOwner(e),␊
erc721::Error::InvalidSender(e) => Error::InvalidSender(e),␊
erc721::Error::InvalidReceiver(e) => Error::InvalidReceiver(e),␊
erc721::Error::InvalidReceiverWithReason(e) => Error::InvalidReceiverWithReason(e),␊
erc721::Error::InsufficientApproval(e) => Error::InsufficientApproval(e),␊
erc721::Error::InvalidApprover(e) => Error::InvalidApprover(e),␊
erc721::Error::InvalidOperator(e) => Error::InvalidOperator(e),␊
}␊
}␊
}␊
␊
impl From<enumerable::Error> for Error {␊
fn from(error: enumerable::Error) -> Self {␊
match error {␊
enumerable::Error::OutOfBoundsIndex(e) => Error::OutOfBoundsIndex(e),␊
enumerable::Error::EnumerableForbiddenBatchMint(e) => Error::EnumerableForbiddenBatchMint(e),␊
}␊
}␊
}␊
␊
#[entrypoint]␊
#[storage]␊
struct MyToken {␊
erc721: Erc721,␊
enumerable: Erc721Enumerable,␊
}␊
␊
#[public]␊
#[implements(IErc721<Error = Error>, IErc721Enumerable<Error = Error>, IErc721Burnable<Error = Error>, IErc165)]␊
impl MyToken {}␊
␊
#[public]␊
impl IErc721 for MyToken {␊
type Error = Error;␊
␊
fn balance_of(&self, owner: Address) -> Result<U256, Self::Error> {␊
Ok(self.erc721.balance_of(owner)?)␊
}␊
␊
fn owner_of(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.owner_of(token_id)?)␊
}␊
␊
fn safe_transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.safe_transfer_from(from, to, token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
#[selector(name = "safeTransferFrom")]␊
fn safe_transfer_from_with_data(&mut self, from: Address, to: Address, token_id: U256, data: Bytes) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.safe_transfer_from_with_data(from, to, token_id, data)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
fn transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.transfer_from(from, to, token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
fn approve(&mut self, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.approve(to, token_id)?)␊
}␊
␊
fn set_approval_for_all(&mut self, operator: Address, approved: bool) -> Result<(), Self::Error> {␊
Ok(self.erc721.set_approval_for_all(operator, approved)?)␊
}␊
␊
fn get_approved(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.get_approved(token_id)?)␊
}␊
␊
fn is_approved_for_all(&self, owner: Address, operator: Address) -> bool {␊
self.erc721.is_approved_for_all(owner, operator)␊
}␊
}␊
␊
#[public]␊
impl IErc721Enumerable for MyToken {␊
type Error = Error;␊
␊
fn token_of_owner_by_index(&self, owner: Address, index: U256) -> Result<U256, Self::Error> {␊
Ok(self.enumerable.token_of_owner_by_index(owner, index)?)␊
}␊
␊
fn total_supply(&self) -> U256 {␊
self.enumerable.total_supply()␊
}␊
␊
fn token_by_index(&self, index: U256) -> Result<U256, Self::Error> {␊
Ok(self.enumerable.token_by_index(index)?)␊
}␊
}␊
␊
#[public]␊
impl IErc721Burnable for MyToken {␊
type Error = Error;␊
␊
fn burn(&mut self, token_id: U256) -> Result<(), Self::Error> {␊
let owner = self.erc721.owner_of(token_id)?;␊
self.erc721.burn(token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(owner, token_id, &self.erc721)?;␊
self.enumerable._remove_token_from_all_tokens_enumeration(token_id);␊
Ok(())␊
}␊
}␊
␊
#[public]␊
impl IErc165 for MyToken {␊
fn supports_interface(&self, interface_id: FixedBytes<4>) -> bool {␊
self.erc721.supports_interface(interface_id)␊
|| self.enumerable.supports_interface(interface_id)␊
}␊
}␊
`
## erc721 full - complex name
> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Stylus ^0.2.0␊
␊
#![cfg_attr(not(any(test, feature = "export-abi")), no_main)]␊
extern crate alloc;␊
␊
use alloc::vec::Vec;␊
use openzeppelin_stylus::token::erc721::extensions::burnable::IErc721Burnable;␊
use openzeppelin_stylus::token::erc721::extensions::enumerable::{␊
self, Erc721Enumerable, IErc721Enumerable␊
};␊
use openzeppelin_stylus::token::erc721::{self, Erc721, IErc721};␊
use openzeppelin_stylus::utils::introspection::erc165::IErc165;␊
use stylus_sdk::abi::Bytes;␊
use stylus_sdk::alloy_primitives::{Address, FixedBytes, U256};␊
use stylus_sdk::prelude::*;␊
␊
#[derive(SolidityError, Debug)]␊
enum Error {␊
InvalidOwner(erc721::ERC721InvalidOwner),␊
NonexistentToken(erc721::ERC721NonexistentToken),␊
IncorrectOwner(erc721::ERC721IncorrectOwner),␊
InvalidSender(erc721::ERC721InvalidSender),␊
InvalidReceiver(erc721::ERC721InvalidReceiver),␊
InvalidReceiverWithReason(erc721::InvalidReceiverWithReason),␊
InsufficientApproval(erc721::ERC721InsufficientApproval),␊
InvalidApprover(erc721::ERC721InvalidApprover),␊
InvalidOperator(erc721::ERC721InvalidOperator),␊
OutOfBoundsIndex(enumerable::ERC721OutOfBoundsIndex),␊
EnumerableForbiddenBatchMint(enumerable::ERC721EnumerableForbiddenBatchMint),␊
}␊
␊
impl From<erc721::Error> for Error {␊
fn from(error: erc721::Error) -> Self {␊
match error {␊
erc721::Error::InvalidOwner(e) => Error::InvalidOwner(e),␊
erc721::Error::NonexistentToken(e) => Error::NonexistentToken(e),␊
erc721::Error::IncorrectOwner(e) => Error::IncorrectOwner(e),␊
erc721::Error::InvalidSender(e) => Error::InvalidSender(e),␊
erc721::Error::InvalidReceiver(e) => Error::InvalidReceiver(e),␊
erc721::Error::InvalidReceiverWithReason(e) => Error::InvalidReceiverWithReason(e),␊
erc721::Error::InsufficientApproval(e) => Error::InsufficientApproval(e),␊
erc721::Error::InvalidApprover(e) => Error::InvalidApprover(e),␊
erc721::Error::InvalidOperator(e) => Error::InvalidOperator(e),␊
}␊
}␊
}␊
␊
impl From<enumerable::Error> for Error {␊
fn from(error: enumerable::Error) -> Self {␊
match error {␊
enumerable::Error::OutOfBoundsIndex(e) => Error::OutOfBoundsIndex(e),␊
enumerable::Error::EnumerableForbiddenBatchMint(e) => Error::EnumerableForbiddenBatchMint(e),␊
}␊
}␊
}␊
␊
#[entrypoint]␊
#[storage]␊
struct CustomToken {␊
erc721: Erc721,␊
enumerable: Erc721Enumerable,␊
}␊
␊
#[public]␊
#[implements(IErc721<Error = Error>, IErc721Enumerable<Error = Error>, IErc721Burnable<Error = Error>, IErc165)]␊
impl CustomToken {}␊
␊
#[public]␊
impl IErc721 for CustomToken {␊
type Error = Error;␊
␊
fn balance_of(&self, owner: Address) -> Result<U256, Self::Error> {␊
Ok(self.erc721.balance_of(owner)?)␊
}␊
␊
fn owner_of(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.owner_of(token_id)?)␊
}␊
␊
fn safe_transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.safe_transfer_from(from, to, token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
#[selector(name = "safeTransferFrom")]␊
fn safe_transfer_from_with_data(&mut self, from: Address, to: Address, token_id: U256, data: Bytes) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.safe_transfer_from_with_data(from, to, token_id, data)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
fn transfer_from(&mut self, from: Address, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
let previous_owner = self.erc721.owner_of(token_id)?;␊
self.erc721.transfer_from(from, to, token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(previous_owner, token_id, &self.erc721)?;␊
self.enumerable._add_token_to_owner_enumeration(to, token_id, &self.erc721)?;␊
Ok(())␊
}␊
␊
fn approve(&mut self, to: Address, token_id: U256) -> Result<(), Self::Error> {␊
Ok(self.erc721.approve(to, token_id)?)␊
}␊
␊
fn set_approval_for_all(&mut self, operator: Address, approved: bool) -> Result<(), Self::Error> {␊
Ok(self.erc721.set_approval_for_all(operator, approved)?)␊
}␊
␊
fn get_approved(&self, token_id: U256) -> Result<Address, Self::Error> {␊
Ok(self.erc721.get_approved(token_id)?)␊
}␊
␊
fn is_approved_for_all(&self, owner: Address, operator: Address) -> bool {␊
self.erc721.is_approved_for_all(owner, operator)␊
}␊
}␊
␊
#[public]␊
impl IErc721Enumerable for CustomToken {␊
type Error = Error;␊
␊
fn token_of_owner_by_index(&self, owner: Address, index: U256) -> Result<U256, Self::Error> {␊
Ok(self.enumerable.token_of_owner_by_index(owner, index)?)␊
}␊
␊
fn total_supply(&self) -> U256 {␊
self.enumerable.total_supply()␊
}␊
␊
fn token_by_index(&self, index: U256) -> Result<U256, Self::Error> {␊
Ok(self.enumerable.token_by_index(index)?)␊
}␊
}␊
␊
#[public]␊
impl IErc721Burnable for CustomToken {␊
type Error = Error;␊
␊
fn burn(&mut self, token_id: U256) -> Result<(), Self::Error> {␊
let owner = self.erc721.owner_of(token_id)?;␊
self.erc721.burn(token_id)?;␊
self.enumerable._remove_token_from_owner_enumeration(owner, token_id, &self.erc721)?;␊
self.enumerable._remove_token_from_all_tokens_enumeration(token_id);␊
Ok(())␊
}␊
}␊
␊
#[public]␊
impl IErc165 for CustomToken {␊
fn supports_interface(&self, interface_id: FixedBytes<4>) -> bool {␊
self.erc721.supports_interface(interface_id)␊
|| self.enumerable.supports_interface(interface_id)␊
}␊
}␊
`