Передача массивов в web3. js из файла данных - PullRequest
0 голосов
/ 07 мая 2020

Я пытаюсь написать клиентский скрипт, который вызывает функцию смарт-контракта ethereum ER C -20, которую я вызываю transferMultiple. Эта функция похожа на функцию transfer в том смысле, что она передает токены ER C -20 нескольким пользователям одновременно. Я определяю его твердо следующим образом:

function transferMultiple(address[] memory recipients, uint256[] memory amounts) public virtual returns (bool) {
    uint256 i=0;
    for(i; i < recipients.length; i++){
        _transfer(_msgSender(),recipients[i],amounts[i]);
    }
    return true;
}

Я пытаюсь прочитать данные из файла .csv с двумя столбцами (адресами и токенами) в два массива (const address = []; и const tokens = [];), поэтому я могу передать их в качестве параметров в моем сценарии со следующим кодом:

  web3.eth.getTransactionCount(account1, (err, txCount) => {  

    const txObject = {
      nonce:    web3.utils.toHex(txCount),
      gasLimit: web3.utils.toHex(800000), 
      gasPrice: web3.utils.toHex(web3.utils.toWei('20', 'Gwei')),
      to: contractAddress,
      data: contract.methods.transferMultiple(addresses,tokens).encodeABI()      
    }

    const tx = new Tx(txObject, {chain:'ropsten', hardfork: 'petersburg'})
    tx.sign(privateKey1)

    const serializedTx = tx.serialize()
    const raw = '0x' + serializedTx.toString('hex')

    web3.eth.sendSignedTransaction(raw, (err, txHash) => {
      console.log('err:', err, 'txHash:', txHash)
    })
  })

Я много искал, чтобы найти способ сделать это. Кажется, есть два пути: синхронный и асинхронный. Код, который пока лучше всего работает для меня:

var csv = require('ya-csv');
var reader = csv.createCsvFileReader('data.csv', { 'separator': ',' });

reader.setColumnNames([ 'col1', 'col2' ]);
    const address = [];
    const tokens = [];
reader.addListener('data', function(data) {
    address.push(data.col1);
    tokens.push(data.col2);
});

Однако, когда я помещаю этот сегмент кода перед сегментом создания транзакции, массивы передаются пустыми. Я немного запутался в том, как объединить оба сегмента, чтобы он работал правильно. Может кто-нибудь объяснить, что я делаю неправильно. И если для этого есть другой более действенный способ.

...