80 lines
2.2 KiB
TypeScript
80 lines
2.2 KiB
TypeScript
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<void>;
|
||
|
||
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(''),
|
||
};
|
||
}
|
||
|