1

I'm trying to iterate through receiver array to send ERC20 token in bulk.

I tried to debug with console.log and seems like the problem is line const tx = await contract.transfer(receiver[i], ammount)

Then I tried running the script outside of the map (as comment) and it's work.

So it must be something with map function (I even tried to console.log(addr === receiver[0]) and it returned true)

Zintea.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract Zintea is ERC20 {
    uint constant _initial_supply = 1000 * (10**18);
    
    constructor() ERC20("Zintea", "ZIN"){
        _mint(msg.sender, _initial_supply);
    }

}

transfer.js

const { ethers } = require('hardhat');

require('dotenv').config();

const CONTRACT_ADDRESS = "0x0e6e60EA3D66421dfBCfB17a6F7f5844059c4948"
const receiver = ["0xAf29CeBfb433925A114f53dE2f347fdD50393443", "0x98Ed91465dD68fBeC574805eC9B6da63eeA380C0"]

async function main() {
    const [signer] = await ethers.getSigners();
    const contract = await ethers.getContractAt("Zintea", CONTRACT_ADDRESS, signer);
    console.log("Balance of sender: ", await contract.balanceOf(signer.getAddress()) / (10**18), "$ZIN" )

    await receiver.map(async (addr) => {
        console.log("Transfering to ", addr)
        const ammount = ethers.utils.parseUnits("10", 18)
        const tx = await contract.transfer(addr, ammount)
        await tx.wait()
        console.log(tx)
        console.log(`Transfered ${10} $ZIN to ${addr} `)
    })

    // Worked
    // console.log("Transfering to ", receiver[0])
    // const ammount = ethers.utils.parseUnits("1", 18)
    // const transfered = await contract.transfer(receiver[1], ammount );
    // await transfered.wait();
    // console.log(`Transfered to ${receiver[0]} `);
    
    console.log("Balance of sender: ", await contract.balanceOf(signer.getAddress()) / (10**18), "$ZIN" )
}

main()
.then(() => process.exit(0))
.catch((error) => {
  console.error(error);
  process.exit(1);
});

Console

Balance of sender:  974 $ZIN
Transfering to  0xAf29CeBfb433925A114f53dE2f347fdD50393443
Transfering to  0x98Ed91465dD68fBeC574805eC9B6da63eeA380C0
Balance of sender:  974 $ZIN

1 Answer 1

0

map is not designed to handle promises directly it is not recommended to use it with async/await. Instead, I recommend you to use a for..of loop to iterate through receiver array and execute the transfers.

I also recommend you for better clarity to rename receiver to receivers

  for (const receiver of receivers) {
    console.log("Transfering to ", receiver);
    const amount = ethers.utils.parseUnits("10", 18);
    const tx = await contract.transfer(receiver, amount);
    await tx.wait();
    console.log(tx);
    console.log(`Transfered ${10} $ZIN to ${receiver}`);
  }

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.