12345678use codec::{Decode, Encode};910pub use pallet_contracts::chain_extension::RetVal;11use pallet_contracts::chain_extension::{12 ChainExtension, Environment, Ext, InitState, SysConfig, UncheckedFrom,13};1415pub use frame_support::debug;16use frame_support::dispatch::DispatchError;1718extern crate pallet_nft;19pub use pallet_nft::*;20use crate::Runtime;21use sp_runtime::AccountId32;22use crate::Vec;23use frame_system::Origin;242526#[derive(Debug, PartialEq, Encode, Decode)]27pub struct NFTExtTransfer<E: Ext> {28 pub recipient: <E::T as SysConfig>::AccountId,29 pub collection_id: u32,30 pub token_id: u32,31 pub amount: u128,32}333435pub struct NFTExtension;3637impl ChainExtension for NFTExtension {38 fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>39 where40 <E::T as SysConfig>::AccountId: UncheckedFrom<<E::T as SysConfig>::Hash> + AsRef<[u8]>,41 {42 43 match func_id {44 0 => {45 let mut env = env.buf_in_buf_out();46 let input: NFTExtTransfer<E> = env.read_as()?;4748 49 let mut bytesSender: [u8; 32] = [0; 32];50 let addrVecSender: Vec<u8> = env.ext().caller().encode();51 for i in 0..32 {52 bytesSender[i] = addrVecSender[i];53 }54 let sender = AccountId32::from(bytesSender);5556 57 let mut bytesRec: [u8; 32] = [0; 32];58 let addrVecRec: Vec<u8> = input.recipient.encode();59 for i in 0..32 {60 bytesRec[i] = addrVecRec[i];61 }62 let recipient = AccountId32::from(bytesRec);6364 match pallet_nft::Module::<Runtime>::transfer_internal(sender, recipient, input.collection_id, input.token_id, input.amount) {65 Ok(_) => Ok(RetVal::Converging(func_id)),66 DispatchError => Err(DispatchError::Other("Transfer error"))67 }68 },69 _ => {70 panic!("Passed unknown func_id to test chain extension: {}", func_id);71 }72 }73 }74}75