Skip to content

Instantly share code, notes, and snippets.

@adamgall
Created October 30, 2018 11:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save adamgall/52d9cb970e09de3022aabdd39bd4c3b7 to your computer and use it in GitHub Desktop.
Save adamgall/52d9cb970e09de3022aabdd39bd4c3b7 to your computer and use it in GitHub Desktop.
const BigNumber = require('bignumber.js');
const fs = require('fs');
const fastCsv = require('fast-csv');
const web3utils = require('web3-utils');
function drop(instance, filePath) {
return prepareTransfers(filePath)
.then(transfers => checkBalances(instance, transfers))
.then(transfers => filterAccounts(transfers))
.then(transfers => makeTransactions(instance, transfers))
}
function prepareTransfers(filePath) {
return new Promise((resolve) => {
const transfers = [];
const fastCsvStream = fastCsv()
.on("data", function(data) {
let address = data[0], value = data[1];
if (web3utils.isAddress(address) && address != null && address != "" && value > 0) {
transfers.push({ address, value });
}
})
.on("end", function() {
return resolve(transfers);
});
fs.createReadStream(filePath).pipe(fastCsvStream);
});
}
function checkBalances(instance, transfers) {
let balances = transfers.map(transfer => checkBalance(instance, transfer));
return new Promise((resolve, reject) => {
Promise.all(balances)
.then((transfers) => resolve(transfers))
.catch((error) => reject(error));
});
}
function checkBalance(instance, transfer) {
return new Promise((resolve, reject) => {
instance.balanceOf(transfer.address)
.then((balance) => resolve({ address: transfer.address, value: transfer.value, current: balance.toNumber() }))
.catch((error) => reject(error));
});
}
function filterAccounts(transfers) {
return transfers.filter(entry => entry.current === 0);
}
function promiseSerial(funcs) {
return funcs.reduce((promise, func) =>
promise.then(result => func().then(Array.prototype.concat.bind(result))),
Promise.resolve([])
)
}
function makeTransactions(instance, transfers) {
let airdrops = transfers.map(transfer => makeTransaction(instance, transfer));
return promiseSerial(airdrops)
.catch(console.error.bind(console))
}
function makeTransaction(instance, entry) {
return function() {
return new Promise((resolve, reject) => {
const decimals = new BigNumber(10).exponentiatedBy(18);
const bigValue = new BigNumber(entry.value).times(decimals);
return instance.transfer(entry.address, bigValue.toString())
.then((response) => resolve(response))
.catch((error) => reject(error));
});
};
}
module.exports = { drop };
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment