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;363738394041424344454647484950515253545556impl ChainExtension for NFTExtension {57 fn call<E: Ext>(func_id: u32, env: Environment<E, InitState>) -> Result<RetVal, DispatchError>58 where59 <E::T as SysConfig>::AccountId: UncheckedFrom<<E::T as SysConfig>::Hash> + AsRef<[u8]>,60 {61 62 match func_id {63 0 => {64 let mut env = env.buf_in_buf_out();65 let input: NFTExtTransfer<E> = env.read_as()?;6667 68 let mut bytesSender: [u8; 32] = [0; 32];69 let addrVecSender: Vec<u8> = env.ext().caller().encode();70 for i in 0..32 {71 bytesSender[i] = addrVecSender[i];72 }73 let sender = AccountId32::from(bytesSender);7475 76 let mut bytesRec: [u8; 32] = [0; 32];77 let addrVecRec: Vec<u8> = input.recipient.encode();78 for i in 0..32 {79 bytesRec[i] = addrVecRec[i];80 }81 let recipient = AccountId32::from(bytesRec);82838485 match pallet_nft::Module::<Runtime>::transfer_internal(sender, recipient, input.collection_id, input.token_id, input.amount) {86 Ok(_) => Ok(RetVal::Converging(func_id)),87 DispatchError => Err(DispatchError::Other("Transfer error"))88 }8990 91 },92 _ => {93 panic!("Passed unknown func_id to test chain extension: {}", func_id);94 }95 }96 }97}98