feat: Add Hardhat config, MockERC20 and tests for Smart Contract
This commit is contained in:
84
test/AyrisSplitter.test.ts
Normal file
84
test/AyrisSplitter.test.ts
Normal file
@@ -0,0 +1,84 @@
|
||||
import { expect } from "chai";
|
||||
import { ethers } from "hardhat";
|
||||
import { loadFixture } from "@nomicfoundation/hardhat-toolbox/network-helpers";
|
||||
|
||||
describe("AyrisSplitter", function () {
|
||||
async function deploySplitterFixture() {
|
||||
const [owner, platformAccount, merchantAccount, customerAccount] = await ethers.getSigners();
|
||||
|
||||
const Splitter = await ethers.getContractFactory("AyrisSplitter");
|
||||
const splitter = await Splitter.deploy(platformAccount.address);
|
||||
|
||||
const MockERC20 = await ethers.getContractFactory("MockERC20");
|
||||
const mockToken = await MockERC20.deploy("Tether USD", "USDT");
|
||||
|
||||
// Mint 1000 USDT to customer
|
||||
await mockToken.mint(customerAccount.address, ethers.parseUnits("1000", 18));
|
||||
|
||||
return { splitter, mockToken, owner, platformAccount, merchantAccount, customerAccount };
|
||||
}
|
||||
|
||||
describe("Deployment", function () {
|
||||
it("Should set the right platform address", async function () {
|
||||
const { splitter, platformAccount } = await loadFixture(deploySplitterFixture);
|
||||
expect(await splitter.platformAddress()).to.equal(platformAccount.address);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Native Payments (ETH/MATIC)", function () {
|
||||
it("Should split native currency exactly 99% to merchant and 1% to platform", async function () {
|
||||
const { splitter, merchantAccount, platformAccount, customerAccount } = await loadFixture(deploySplitterFixture);
|
||||
|
||||
const paymentAmount = ethers.parseEther("1.0"); // 1 ETH/MATIC
|
||||
|
||||
const initialMerchantBalance = await ethers.provider.getBalance(merchantAccount.address);
|
||||
const initialPlatformBalance = await ethers.provider.getBalance(platformAccount.address);
|
||||
|
||||
// Customer sends 1 ETH to contract using payNative
|
||||
await splitter.connect(customerAccount).payNative(merchantAccount.address, { value: paymentAmount });
|
||||
|
||||
const finalMerchantBalance = await ethers.provider.getBalance(merchantAccount.address);
|
||||
const finalPlatformBalance = await ethers.provider.getBalance(platformAccount.address);
|
||||
|
||||
// 1 ETH * 1% = 0.01 ETH
|
||||
const expectedPlatformShare = ethers.parseEther("0.01");
|
||||
// 1 ETH * 99% = 0.99 ETH
|
||||
const expectedMerchantShare = ethers.parseEther("0.99");
|
||||
|
||||
expect(finalMerchantBalance - initialMerchantBalance).to.equal(expectedMerchantShare);
|
||||
expect(finalPlatformBalance - initialPlatformBalance).to.equal(expectedPlatformShare);
|
||||
});
|
||||
});
|
||||
|
||||
describe("Token Payments (USDT/USDC)", function () {
|
||||
it("Should split ERC20 tokens exactly 99% to merchant and 1% to platform", async function () {
|
||||
const { splitter, mockToken, merchantAccount, platformAccount, customerAccount } = await loadFixture(deploySplitterFixture);
|
||||
|
||||
const paymentAmount = ethers.parseUnits("100", 18); // 100 USDT
|
||||
|
||||
// Customer must approve the splitter contract first
|
||||
await mockToken.connect(customerAccount).approve(await splitter.getAddress(), paymentAmount);
|
||||
|
||||
const initialMerchantBalance = await mockToken.balanceOf(merchantAccount.address);
|
||||
const initialPlatformBalance = await mockToken.balanceOf(platformAccount.address);
|
||||
|
||||
// Customer executes payment
|
||||
await splitter.connect(customerAccount).payToken(
|
||||
await mockToken.getAddress(),
|
||||
paymentAmount,
|
||||
merchantAccount.address
|
||||
);
|
||||
|
||||
const finalMerchantBalance = await mockToken.balanceOf(merchantAccount.address);
|
||||
const finalPlatformBalance = await mockToken.balanceOf(platformAccount.address);
|
||||
|
||||
// 100 USDT * 1% = 1 USDT
|
||||
const expectedPlatformShare = ethers.parseUnits("1", 18);
|
||||
// 100 USDT * 99% = 99 USDT
|
||||
const expectedMerchantShare = ethers.parseUnits("99", 18);
|
||||
|
||||
expect(finalMerchantBalance - initialMerchantBalance).to.equal(expectedMerchantShare);
|
||||
expect(finalPlatformBalance - initialPlatformBalance).to.equal(expectedPlatformShare);
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user