Skip to content

🍬 Multiple erc20 token airdrop consumes one time gas

License

Notifications You must be signed in to change notification settings

lordlessio/airdrop

Folders and files

NameName
Last commit message
Last commit date

Latest commit

f1ac004 Β· Jun 22, 2018

History

11 Commits
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 6, 2018
Jun 22, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018
Jun 5, 2018

Repository files navigation

ERC20 Token Airdrop

Build Status license

Airdrop effect 🍬

Multiple airdrop consumes one time gas FYI : https://etherscan.io/tx/0x061e701609d23e6755253fdb55ed1a31d2b253610b9f478600a0c1ad8b1f178e

source code

pragma solidity ^0.4.21;

import "../node_modules/openzeppelin-solidity/contracts/ownership/Ownable.sol";
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";


contract Airdrop is Ownable {
  /**
   * @dev daAirdrop to address
   * @param _tokenAddr address the erc20 token address
   * @param dests address[] addresses to airdrop
   * @param values uint256[] value(in ether) to airdrop
   */
  function doAirdrop(address _tokenAddr, address[] dests, uint256[] values) onlyOwner public
    returns (uint256) {
    uint256 i = 0;
    while (i < dests.length) {
      ERC20(_tokenAddr).transferFrom(msg.sender, dests[i], values[i] * (10 ** 18));
      i += 1;
    }
    return(i);
  }

usage

const SimpleToken = artifacts.require('SimpleToken');
const Airdrop = artifacts.require('Airdrop');
const BigNumber = web3.BigNumber;
require('chai')
  .use(require('chai-as-promised'))
  .use(require('chai-bignumber')(BigNumber))
  .should();

contract('Airdrop', function (accounts) {
  before(async function () {
    this.simpleToken = await SimpleToken.new({ from: accounts[0] });
    this.airdrop = await Airdrop.new({ from: accounts[0] });
    this.airdropAmount = 666
    this.mockdata = {
      addresses: accounts,
      tokenAmounts: Array(10).fill(this.airdropAmount.toString()),
    }
  });

  describe('Airdrop basic test', function () {
    it('should airdrop to addresses', async function () {
      await this.simpleToken.approve(this.airdrop.address, 1e27);
      await this.airdrop.doAirdrop(
        this.simpleToken.address,
        this.mockdata.addresses,
        this.mockdata.tokenAmounts
      );
      const balance = (await this.simpleToken.balanceOf(accounts[1])).toNumber();
      await balance.should.be.equal(parseInt(await web3.toWei(this.airdropAmount)));
    });
  });
})
# test

npm run test

About

🍬 Multiple erc20 token airdrop consumes one time gas

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published