Skip to main content
Glama

OpenZeppelin Contracts MCP Server

Official
by OpenZeppelin
erc721.test.ts.md27.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)␊ }␊ }␊ `

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