use crate::{eip165::ERC165, versatus_rust::Address};
use anyhow::Result;
use ethnum::U256;
use serde_derive::{Deserialize, Serialize};
pub trait ERC721: ERC165 {
fn balance_of(&self, owner: Address) -> Result<U256>;
fn owner_of(&self, token_id: U256) -> Result<Address>;
fn safe_transfer_with_data(
&self,
from: Address,
to: Address,
token_id: U256,
data: &[u8],
) -> Result<()>;
fn safe_transfer_from(&self, from: Address, to: Address, token_id: U256) -> Result<()> {
self.safe_transfer_with_data(from, to, token_id, &[])
}
fn transfer_from(&self, from: Address, to: Address, token_id: U256) -> Result<()>;
fn approve(&self, approved: Address, token_id: U256) -> Result<()>;
fn set_approval_for_all(&self, operator: Address, approved: bool) -> Result<()>;
fn get_approved(&self, token_id: U256) -> Result<Address>;
fn is_approved_for_all(&self, owner: Address, operator: Address) -> Result<bool>;
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub enum Erc721Event {
Transfer {
from: Address,
to: Address,
token_id: U256,
},
Approval {
owner: Address,
approved: Address,
token_id: U256,
},
ApprovalForAll {
owner: Address,
operator: Address,
approved: bool,
},
}
pub trait ERC721TokenReceiver {
fn on_erc721_received(
&self,
operator: Address,
from: Address,
token_id: U256,
data: &[u8],
) -> Result<&[u8; 4]>;
}
pub trait ERC721Metadata: ERC721 {
fn name(&self) -> Result<String>;
fn symbol(&self) -> Result<String>;
fn token_uri(&self, token_id: U256) -> Result<String>;
}