This is full contract and test code:
Contract:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "hardhat/console.sol";
contract Matrix is ERC20 {
address USDTAddress;
address BUSDAddress;
address BoxAddress;
IERC20 public USDTToken;
IERC20 public BUSDToken;
IERC20 public MXToken;
constructor(address _BoxAddress, address _USDTAddress, address _BUSDAddress) ERC20("Matrix", "XUSD") {
BoxAddress = _BoxAddress;
USDTAddress = _USDTAddress;
BUSDAddress = _BUSDAddress;
MXToken = ERC20(address(this));
USDTToken = ERC20(USDTAddress);
BUSDToken = ERC20(BUSDAddress);
}
function depositUSDT(uint _amount) payable public {
USDTToken.transferFrom(msg.sender, BoxAddress, _amount);
_mint(msg.sender, _amount);
}
function withdrawUSDT(uint _amount) payable public {
// USDTToken.approve(BoxAddress, _amount);
USDTToken.transferFrom(BoxAddress, msg.sender, _amount);
_burn(msg.sender, _amount);
}
function depositBUSD(uint _amount) payable public {
BUSDToken.transferFrom(msg.sender, BoxAddress, _amount);
_mint(msg.sender, _amount);
}
// function withdrawBUSD(uint _amount) payable public {
// BUSDToken.transferFrom(msg.sender, BoxAddress, _amount);
// _mint(msg.sender, _amount);
// }
}
Test:
const { expect } = require("chai")
const { ethers, waffle } = require('hardhat')
const { deployContract } = waffle
// contracts
const Matrix = require('../artifacts/contracts/Matrix.sol/Matrix.json')
const MockUSDT = require('../artifacts/contracts/mocks/mockUSDT.sol/MockUSDT.json')
const MockBUSD = require('../artifacts/contracts/mocks/mockBUSD.sol/MockBUSD.json')
// BUSD: https://testnet.bscscan.com/token/0xeD24FC36d5Ee211Ea25A80239Fb8C4Cfd80f12Ee
// USDT: https://testnet.bscscan.com/token/0x337610d27c682E347C9cD60BD4b3b107C9d34dDd
// BUSD and USDT all have 18 decimals
const prepare = async () => {
const [
deployerUSDT,
deployerBUSD,
deployerMatrix,
commonWallet,
userWallet
] = await ethers.getSigners()
const tokenUSDT = await deployContract(deployerUSDT, MockUSDT)
const tokenBUSD = await deployContract(deployerBUSD, MockBUSD)
const tokenMatrix = await deployContract(deployerMatrix, Matrix, [
commonWallet.address,
tokenUSDT.address,
tokenBUSD.address,
])
return {
deployerUSDT,
deployerBUSD,
deployerMatrix,
commonWallet,
userWallet,
tokenUSDT,
tokenBUSD,
tokenMatrix,
}
}
describe('Deposit/withdraw BUSD and USDT with Matrix.sol', _ => {
it('Deposit and withdraw USDT', async () => {
const {
deployerUSDT,
commonWallet,
userWallet,
tokenUSDT,
tokenMatrix,
} = await prepare()
await tokenUSDT.connect(deployerUSDT).transfer(userWallet.address, 11)
let balance = await tokenUSDT.balanceOf(userWallet.address)
expect(balance).to.equal(11) // ok
await tokenUSDT.connect(userWallet).approve(tokenMatrix.address, 9)
await tokenMatrix.connect(userWallet).depositUSDT(9)
let usdtBalance = await tokenUSDT.balanceOf(userWallet.address)
expect(usdtBalance).to.equal(2)
let mxTokenBalance = await tokenUSDT.balanceOf(commonWallet.address)
expect(mxTokenBalance).to.equal(9)
let mxUserBalance = await tokenMatrix.balanceOf(userWallet.address)
expect(mxUserBalance).to.equal(9)
// await tokenUSDT.connect(userWallet).approve(tokenMatrix.address, 9)
// await tokenMatrix.connect(userWallet).depositUSDT(9)
await tokenMatrix.connect(userWallet).approve(userWallet.address, 9)
await tokenMatrix.connect(userWallet).withdrawUSDT(9)
}).timeout(20000)
it('Deposit and withdraw BUSD', async () => {
const {
deployerBUSD,
commonWallet,
userWallet,
tokenBUSD,
tokenMatrix,
} = await prepare()
await tokenBUSD.connect(deployerBUSD).transfer(userWallet.address, 11)
let balance = await tokenBUSD.balanceOf(userWallet.address)
expect(balance).to.equal(11) // ok
await tokenBUSD.connect(userWallet).approve(tokenMatrix.address, 9)
await tokenMatrix.connect(userWallet).depositBUSD(9)
let busdBalance = await tokenBUSD.balanceOf(userWallet.address)
expect(busdBalance).to.equal(2)
let mxTokenBalance = await tokenBUSD.balanceOf(commonWallet.address)
expect(mxTokenBalance).to.equal(9)
let mxUserBalance = await tokenMatrix.balanceOf(userWallet.address)
expect(mxUserBalance).to.equal(9)
}).timeout(20000)
})