1#![cfg_attr(not(feature = "std"), no_std)]23use ink_lang as ink;4use ink_env::{Environment, DefaultEnvironment};56pub enum NftEnvironment {}78impl Environment for NftEnvironment {9 const MAX_EVENT_TOPICS: usize =10 <DefaultEnvironment as Environment>::MAX_EVENT_TOPICS;1112 type AccountId = <DefaultEnvironment as Environment>::AccountId;13 type Balance = <DefaultEnvironment as Environment>::Balance;14 type Hash = <DefaultEnvironment as Environment>::Hash;15 type BlockNumber = <DefaultEnvironment as Environment>::BlockNumber;16 type Timestamp = <DefaultEnvironment as Environment>::Timestamp;1718 type ChainExtension = NftChainExtension;19}202122#[derive(23 Debug, Copy, Clone, PartialEq, Eq, scale::Encode, scale::Decode,24)]25pub enum NftErrorCode {26 SomeError,27}2829impl ink_env::chain_extension::FromStatusCode for NftErrorCode {30 fn from_status_code(status_code: u32) -> Result<(), Self> {31 match status_code {32 0 => Ok(()),33 1 => Err(Self::SomeError),34 _ => panic!("encountered unknown status code"),35 }36 }37}3839#[ink::chain_extension]40pub trait NftChainExtension {41 type ErrorCode = NftErrorCode;4243 44 45 #[ink(extension = 0, returns_result = false)]46 fn transfer(recipient: <DefaultEnvironment as Environment>::AccountId, collection_id: u32, token_id: u32, amount: u128);47}4849#[ink::contract(env = crate::NftEnvironment)]50mod nft_transfer {5152 #[ink(storage)]53 pub struct NftTransfer {54 }5556 impl NftTransfer {57 58 59 60 #[ink(constructor)]61 pub fn default() -> Self {62 Self {}63 }6465 66 #[ink(message)]67 pub fn transfer(&mut self, recipient: AccountId, collection_id: u32, token_id: u32, amount: u128) {68 let _ = self.env()69 .extension()70 .transfer(recipient, collection_id, token_id, amount);71 }7273 }7475}