diff --git a/test/hardhat/e2e/setup.ts b/test/hardhat/e2e/setup.ts index 4ce985110..1259b8864 100644 --- a/test/hardhat/e2e/setup.ts +++ b/test/hardhat/e2e/setup.ts @@ -2,8 +2,10 @@ import hre from "hardhat"; import { network } from "hardhat"; -import { GroupingModule, IPAssetRegistry, LicenseRegistry, LicenseToken, LicensingModule, PILicenseTemplate, RoyaltyPolicyLAP, MockERC20, RoyaltyPolicyLRP, AccessController } from "./constants"; +import { GroupingModule, IPAssetRegistry, LicenseRegistry, LicenseToken, LicensingModule, PILicenseTemplate, RoyaltyPolicyLAP, MockERC20, RoyaltyPolicyLRP, AccessController, RoyaltyModule } from "./constants"; import { terms } from "./licenseTermsTemplate"; +import { approveSpender, checkAndApproveSpender, getAllowance, mintAmount } from "./utils/erc20Helper"; +import { check } from "prettier"; before(async function () { console.log(`================= Load Contract =================`); @@ -24,7 +26,7 @@ before(async function () { console.log("chainId: ", this.chainId); console.log(`================= Register non-commercial PIL license terms =================`); - await this.licenseTemplate.registerLicenseTerms(terms); + await this.licenseTemplate.registerLicenseTerms(terms).then((tx : any) => tx.wait()); this.nonCommericialLicenseId = await this.licenseTemplate.getLicenseTermsId(terms); console.log("Non-commercial licenseTermsId: ", this.nonCommericialLicenseId); @@ -34,7 +36,7 @@ before(async function () { testTerms.defaultMintingFee = 30; testTerms.commercialUse = true; testTerms.currency = MockERC20; - await this.licenseTemplate.registerLicenseTerms(testTerms); + await this.licenseTemplate.registerLicenseTerms(testTerms).then((tx : any) => tx.wait()); this.commericialUseLicenseId = await this.licenseTemplate.getLicenseTermsId(testTerms); console.log("Commercial-use licenseTermsId: ", this.commericialUseLicenseId); @@ -45,7 +47,16 @@ before(async function () { testTerms.commercialUse = true; testTerms.commercialRevShare = 100; testTerms.currency = MockERC20; - await this.licenseTemplate.registerLicenseTerms(testTerms); + await this.licenseTemplate.registerLicenseTerms(testTerms).then((tx : any) => tx.wait()); this.commericialRemixLicenseId = await this.licenseTemplate.getLicenseTermsId(testTerms); console.log("Commercial-remix licenseTermsId: ", this.commericialRemixLicenseId); + + console.log(`================= ERC20 approve spender =================`); + const amountToCheck = BigInt(2057 * 10 ** 18); + await checkAndApproveSpender(this.owner, RoyaltyPolicyLAP, amountToCheck); + await checkAndApproveSpender(this.owner, RoyaltyPolicyLRP, amountToCheck); + await checkAndApproveSpender(this.owner, RoyaltyModule, amountToCheck); + await checkAndApproveSpender(this.user1, RoyaltyPolicyLAP, amountToCheck); + await checkAndApproveSpender(this.user1, RoyaltyPolicyLRP, amountToCheck); + await checkAndApproveSpender(this.user1, RoyaltyModule, amountToCheck); }); diff --git a/test/hardhat/e2e/utils/erc20Helper.ts b/test/hardhat/e2e/utils/erc20Helper.ts new file mode 100644 index 000000000..1126d0d99 --- /dev/null +++ b/test/hardhat/e2e/utils/erc20Helper.ts @@ -0,0 +1,106 @@ +// mockERC20 - mint, approveSpender, Allowance + +import hre from "hardhat" +import { MockERC20 } from "../constants"; +import { ethers } from "ethers"; + +// mockERC20 - approveSpender +export async function approveSpender(spender: string, amount: bigint, singer: ethers.Wallet):Promise { + const contractAbi = [ + { + type: "function", + inputs: [ + { name: "spender", internalType: "address", type: "address" }, + { name: "amount", internalType: "uint256", type: "uint256" }, + ], + name: "approve", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + stateMutability: "nonpayable", + } + ]; + + const contract = new hre.ethers.Contract(MockERC20, contractAbi, singer); + + // approveSpender + try { + const tx = await contract.approve( + spender, + amount + ); + await tx.wait(); + console.log("hash", tx.hash); + console.log("approveSpender done"); + return tx.hash; + } catch (error) { + console.error("Error approveSpender:", error); + throw error; + }; +}; + +// mockERC20 - mint +export async function mintAmount(toAddress: string, amount: bigint, singer: ethers.Wallet):Promise { + const contractAbi = [ + { + type: "function", + inputs: [ + { name: "to", internalType: "address", type: "address" }, + { name: "amount", internalType: "uint256", type: "uint256" }, + ], + name: "mint", + outputs: [{ name: "", internalType: "bool", type: "bool" }], + stateMutability: "nonpayable", + } + ]; + + const contract = new hre.ethers.Contract(MockERC20, contractAbi, singer); + + // mintAmount + try { + const tx = await contract.mint( + toAddress, + amount + ); + await tx.wait(); + console.log("hash", tx.hash); + return tx.hash; + } catch (error) { + console.error("Error mintAmount:", error); + throw error; + }; +}; + +// mockERC20 - Allowance +export async function getAllowance(owner: string, spender: string, singer: ethers.Wallet):Promise { + const contractAbi = [ + { + type: "function", + inputs: [ + { name: "owner", internalType: "address", type: "address" }, + { name: "spender", internalType: "address", type: "address" }, + ], + name: "allowance", + outputs: [{ name: "", internalType: "uint256", type: "uint256" }], + stateMutability: "view", + } + ]; + + const contract = new hre.ethers.Contract(MockERC20, contractAbi, singer); + + // getAllowance + try { + const tx = await contract.allowance(owner, spender); + console.log("Allowance", tx); + return tx; + } catch (error) { + console.error("Error getAllowance:", error); + throw error; + }; +}; + +export async function checkAndApproveSpender(owner: any, spender: any, amount: bigint) { + const currentAllowance = await getAllowance(owner.address, spender, owner); + if (currentAllowance < amount) { + await mintAmount(owner.address, amount, owner); + await approveSpender(spender, amount, owner); + } +};