import Web3 from 'web3/dist/web3.min.js'; import {ContractABI} from "db://assets/scripts/WalletSDK/ABI"; /** * Predefined variables * Name = WalletUtils * DateTime = Fri Aug 26 2022 18:07:14 GMT+0800 (中国标准时间) * Author = 阿离我的 * FileBasename = WalletUtils.ts * FileBasenameNoExtension = WalletUtils * URL = db://assets/scripts/WalletSdk/WalletUtils.ts * ManualUrl = https://docs.cocos.com/creator/3.4/manual/zh/ * */ // 钱包sdk类型 export enum WalletSdkType { Web, // 网页端 mobile pc Native, // 原生端 android ios } // 钱包连接类型 export enum WalletConnectType { Api, // api连接 QRCode, // 二维码连接 } // 钱包类型 export enum WalletType { MetaMask, TronLink, IMToken, TokenPocket, } export interface IWalletSdk { init(): Promise; connect(): any; customSignRequest(): any; customRequest(from: string, contractAddress: string, fnName: string, ...args: any[]): any; } const web3 = new Web3(); // 补齐64位,不够前面用0补齐 function addPreZero(num: string) { return num.toString().padStart(64, '0'); } /** * 发起合约请求 * @param from 调用者的地址 * @param contractAddress 合约地址 * @param fnName ABI内type为function的可调用函数名 * @param args 参数列表 */ export function createRequestData(from: string, contractAddress: string, fnName: string, ...args: any[]) { // 查找对应方法并获取对应的函数签名 const functionInfo = ContractABI.find((item) => item.type === 'function' && item.name === fnName); // @ts-ignore const functionSignature = web3.eth.abi.encodeFunctionSignature(functionInfo); // 发起请求 return { // 注意这里是代币合约地址 from, to: contractAddress, // 调用合约转账value这里留空 value: "", // data的组成,由:0x + 要调用的合约方法的function signature + 要传递的方法参数,每个参数都为64位(去掉前面0x,然后补齐为64位) data: functionSignature + args.map((v) => addPreZero(web3.utils.toHex(v).substring(2))).join(''), }; }