export class ContractClient { contractAddress: string; wallet: any; account: any; contract: any; cfxClient: any; constructor(address: string, abi: string, wallet: any) { this.contractAddress = address; this.wallet = wallet; this.cfxClient = this.wallet.provider.cfxClient this.contract = this.cfxClient.Contract({ abi, address }); this.account = this.wallet.account; } async mint(walletAddress: string, ItemId: number) { return this.contract .safeMint(walletAddress, ItemId) .sendTransaction({ from: this.account.address }) .executed(); } async transfer(fromAddress: string = "", toAddress: string, ItemId: number) { if (fromAddress === "") { fromAddress = this.account.address } return this.contract .safeTransferFrom(fromAddress, toAddress, ItemId) .sendTransaction({ from: this.account.address }) .executed(); } async balanceOf(walletAddress: string) { return this.contract.balanceOf(walletAddress) } async getAssets(walletAddress: string) { const number = await this.contract.balanceOf(walletAddress); const list = []; for (let i = 0; i < Number(number); i++) { const id = await this.contract.tokenOfOwnerByIndex(walletAddress, i); list.push(id); } return list; } async isSponsored(walletAddress: string) { const contract = this.cfxClient.InternalContract("SponsorWhitelistControl"); let receipt = await contract.isWhitelisted(this.contractAddress, walletAddress); return receipt } async checkSponsor() { const contract = this.cfxClient.InternalContract("SponsorWhitelistControl"); let sponsorForGas = await contract.getSponsorForGas(this.contractAddress); let sponsoredBalanceForGas = await contract.getSponsoredBalanceForGas(this.contractAddress); let sponsoredGasFeeUpperBound = await contract.getSponsoredGasFeeUpperBound(this.contractAddress); let sponsorForCollateral = await contract.getSponsorForCollateral(this.contractAddress); let sponsoredBalanceForCollateral = await contract.getSponsoredBalanceForCollateral(this.contractAddress); return { "sponsorForGas": sponsorForGas, "sponsoredBalanceForGas": sponsoredBalanceForGas, "sponsoredGasFeeUpperBound": sponsoredGasFeeUpperBound, "sponsorForCollateral": sponsorForCollateral, "sponsoredBalanceForCollateral": sponsoredBalanceForCollateral } } async addSponsored(walletAddress: string) { const contract = this.cfxClient.InternalContract("SponsorWhitelistControl"); let receipt = await contract .addPrivilegeByAdmin(this.contractAddress, [walletAddress]) .sendTransaction({ from: this.account.address }) //transaction sponsorship fund (1000x maximum) .executed(); return receipt } }