I am new smart contract and tried to create multi sender contract myself.
But can’t forward because below error:
“Error: VM Exception while processing transaction: revert Insufficient tokens in contract
for distribution”
Here’s my code: TestContract.sol
<code>contract TestContract is ERC20, Ownable {
constructor(address _tokenAddr, string memory _name, string memory _symbol ) ERC20(_name, _symbol) {
_mint(msg.sender, 1000 * 10**18);
tokenAddress = _tokenAddr;
}
function multisend(address[] calldata _recipients, uint256[] calldata _amounts) external onlyOwner {
require(_recipients.length == _amounts.length, "Arrays must be of equal length");
for (uint256 i = 0; i < _recipients.length; i++) {
require(_recipients[i] != address(0), "Cannot send tokens to the zero address");
require(_amounts[i] > 0, "Amount must be greater than zero");
// Ensure the contract has enough tokens to distribute
require(_amounts[i] <= balanceOf(tokenAddress), "Insufficient tokens in contract for distribution");
// Transfer tokens from the contract to the recipient
_transfer(tokenAddress, _recipients[i], _amounts[i]);
}
}
}
</code>
<code>contract TestContract is ERC20, Ownable {
constructor(address _tokenAddr, string memory _name, string memory _symbol ) ERC20(_name, _symbol) {
_mint(msg.sender, 1000 * 10**18);
tokenAddress = _tokenAddr;
}
function multisend(address[] calldata _recipients, uint256[] calldata _amounts) external onlyOwner {
require(_recipients.length == _amounts.length, "Arrays must be of equal length");
for (uint256 i = 0; i < _recipients.length; i++) {
require(_recipients[i] != address(0), "Cannot send tokens to the zero address");
require(_amounts[i] > 0, "Amount must be greater than zero");
// Ensure the contract has enough tokens to distribute
require(_amounts[i] <= balanceOf(tokenAddress), "Insufficient tokens in contract for distribution");
// Transfer tokens from the contract to the recipient
_transfer(tokenAddress, _recipients[i], _amounts[i]);
}
}
}
</code>
contract TestContract is ERC20, Ownable {
constructor(address _tokenAddr, string memory _name, string memory _symbol ) ERC20(_name, _symbol) {
_mint(msg.sender, 1000 * 10**18);
tokenAddress = _tokenAddr;
}
function multisend(address[] calldata _recipients, uint256[] calldata _amounts) external onlyOwner {
require(_recipients.length == _amounts.length, "Arrays must be of equal length");
for (uint256 i = 0; i < _recipients.length; i++) {
require(_recipients[i] != address(0), "Cannot send tokens to the zero address");
require(_amounts[i] > 0, "Amount must be greater than zero");
// Ensure the contract has enough tokens to distribute
require(_amounts[i] <= balanceOf(tokenAddress), "Insufficient tokens in contract for distribution");
// Transfer tokens from the contract to the recipient
_transfer(tokenAddress, _recipients[i], _amounts[i]);
}
}
}
_tokenAddr is my wallet address
I tried to test it locally with truffle and ganache-cli
I am not sure what’s problem.
Please help me.
This is my test js
TestContract.js
<code>contract("TestContract", accounts => {
it("should deploy the contract and mint initial tokens", async () => {
const instance = await TestContract.deployed();
const balance = await instance.balanceOf(accounts[0]);
assert.equal(balance.toString(), "1000000000000000000000"); // 1000 tokens with 18 decimals
});
it("should allow owner to multisend tokens", async () => {
const instance = await TestContract.deployed();
const recipients = [accounts[1], accounts[2], accounts[3]];
const amounts = ["50000000000000000000", "20000000000000000000", "30000000000000000000"]; // 50, 20, 30 tokens with 18 decimals
await instance.multisend(recipients, amounts, { from: accounts[0] });
const balance1 = await instance.balanceOf(accounts[1]);
const balance2 = await instance.balanceOf(accounts[2]);
const balance3 = await instance.balanceOf(accounts[3]);
assert.equal(balance1.toString(), "150000000000000000000"); // 150 tokens with 18 decimals
assert.equal(balance2.toString(), "20000000000000000000"); // 20 tokens with 18 decimals
assert.equal(balance3.toString(), "30000000000000000000"); // 30 tokens with 18 decimals
});
});
</code>
<code>contract("TestContract", accounts => {
it("should deploy the contract and mint initial tokens", async () => {
const instance = await TestContract.deployed();
const balance = await instance.balanceOf(accounts[0]);
assert.equal(balance.toString(), "1000000000000000000000"); // 1000 tokens with 18 decimals
});
it("should allow owner to multisend tokens", async () => {
const instance = await TestContract.deployed();
const recipients = [accounts[1], accounts[2], accounts[3]];
const amounts = ["50000000000000000000", "20000000000000000000", "30000000000000000000"]; // 50, 20, 30 tokens with 18 decimals
await instance.multisend(recipients, amounts, { from: accounts[0] });
const balance1 = await instance.balanceOf(accounts[1]);
const balance2 = await instance.balanceOf(accounts[2]);
const balance3 = await instance.balanceOf(accounts[3]);
assert.equal(balance1.toString(), "150000000000000000000"); // 150 tokens with 18 decimals
assert.equal(balance2.toString(), "20000000000000000000"); // 20 tokens with 18 decimals
assert.equal(balance3.toString(), "30000000000000000000"); // 30 tokens with 18 decimals
});
});
</code>
contract("TestContract", accounts => {
it("should deploy the contract and mint initial tokens", async () => {
const instance = await TestContract.deployed();
const balance = await instance.balanceOf(accounts[0]);
assert.equal(balance.toString(), "1000000000000000000000"); // 1000 tokens with 18 decimals
});
it("should allow owner to multisend tokens", async () => {
const instance = await TestContract.deployed();
const recipients = [accounts[1], accounts[2], accounts[3]];
const amounts = ["50000000000000000000", "20000000000000000000", "30000000000000000000"]; // 50, 20, 30 tokens with 18 decimals
await instance.multisend(recipients, amounts, { from: accounts[0] });
const balance1 = await instance.balanceOf(accounts[1]);
const balance2 = await instance.balanceOf(accounts[2]);
const balance3 = await instance.balanceOf(accounts[3]);
assert.equal(balance1.toString(), "150000000000000000000"); // 150 tokens with 18 decimals
assert.equal(balance2.toString(), "20000000000000000000"); // 20 tokens with 18 decimals
assert.equal(balance3.toString(), "30000000000000000000"); // 30 tokens with 18 decimals
});
});