0

I have an airdrop function that allow the owner input array of addresses and an amount to give. It work well with small number of addresses about (100) but bigger than that, gaz limit is reached.

I wonder, is it my code that block that or just the fact that it cost X amount to airdrop X token multiply by the array length so it's just costing a lot to send and the gaz limit really reached?

I tried to find answer here and over the web but I'm not sure how to format my question. Like, is there any limit of an address array as argument?

Here is my code :

function airDrop(address[] recipients,uint amount ) public {

      require(msg.sender == owner);
          require(amount > 0);

         uint256 supposedDropAmount = (recipients.length).mul(amount);
      //be sure it's not over the limit

      uint256 checkedSupply = dropAmount.add(supposedDropAmount);

      // return money if something goes wrong

     require(checkedSupply <= AirdropCap); // block airdrop 

      //require date time
       require(now > airdropTime);

      for( uint256 i = 0 ; i < recipients.length ; i++ ) {

           assert(token.mint(recipients[i], amount));
          emit  TokenDrop( recipients[i], amount );
      }
    numDrops = numDrops.add(recipients.length);
    dropAmount = dropAmount.add(recipients.length.mul(amount));
}

Notice the token.mint is external in another contract, and that airdropTime is much in the past than now. As I said, it work with small array of address.

btc4cash
  • 538
  • 4
  • 14

2 Answers2

2

Not only are you connecting to an external contract, but that you are also responsible for the storage costs to said contract as well as your contract...

It's definitely the gas limit...and unfortunately, using a smaller array of addresses is the only option.

ReyHaynes
  • 1,515
  • 7
  • 12
  • what do you mean by "but that you are also responsible for the storage costs to said contract as well as your contract"? I didn't understand sorry. Also, would making the external part in the same contract would help? – btc4cash Mar 19 '18 at 22:02
  • @btc4cash Well, you are minting tokens to an external token contract. That contract has to also store that data within itself. The gas cost of storing token data on that contract is passed to the user of the airDrop function. You also seem to store data in this contract...which also adds to your gas cost. – ReyHaynes Mar 19 '18 at 22:09
  • so way to allow this function to accept more addresses as arguments would be putting the function in the external contract itself, so it would cost less gaz calling it since less data stored and no external call? – btc4cash Mar 19 '18 at 22:10
  • @btc4cash That'll squeeze you a few more addresses...but the most expensive performance on EVM is storage cost. A direct storage costs about 20,000 gas if saving from a zero value. Adding 500 new addresses would essentially cost 10 million gas, but the limit on the mainnet is 3 million. – ReyHaynes Mar 19 '18 at 22:15
  • But mate, I have no plan storing theses address! I just want to use them as destination, give them token, that's it! Do you mean I just can't use that much of array data for anything in the EVM? – btc4cash Mar 19 '18 at 22:16
  • @btc4cash The amount of tokens you mint to an address will go on the token contracts stored data. It's the only way to keep track of the amount of tokens an address has. To the addresses that never had that token before, you'd pay 20k gas per address. To the addresses that had the token before and they don't have zero, you'd pay 5k per address. – ReyHaynes Mar 19 '18 at 22:21
  • @btc4cash You can use a large array set in EVM...but if any storage is involved, you'll have gas limitations...and unfortunately, you are using storage, directly and indirectly. – ReyHaynes Mar 19 '18 at 22:22
0

Use IPFS to store that data and then call your array from IPFS

haribo
  • 1
  • According to what I know and https://ethereum.stackexchange.com/q/7664/19037 IPSF not fetchable from the solidity contract, I would need to use oracle which is costly in gaz. This is much more complicate solution for the probleme I have – btc4cash Mar 22 '18 at 02:07