Использование смарт-контракта с web3 - не удалось успешно отправить транзакцию

Пробовал отправить эфир с мультиадреса, для этого создал один контракт. Контракт успешно развернут в тестовой сети ropsten.

Я запустил службу в фоновом режиме с помощью этой команды.

parity --warp --chain ropsten --rpcapi 'eth,net,web3,personal'

Код контракта:

pragma solidity ^0.4.20;

contract ERC20 {
  function transfer(address _recipient, uint256 _value) public returns (bool success);
}

contract Airdrop {
  function drop(ERC20 token, address[] recipients, uint256[] values) public {
    for (uint256 i = 0; i < recipients.length; i++) {
      token.transfer(recipients[i], values[i]);
    }
  }
}

URL-адрес развернутого контракта: https://ropsten.etherscan.io/address/0x84265173B2386D674ABA59b35D8C2A77C8A88181

Пытался применить send_transaction с помощью Web3Js, но не смог добиться успеха.

const Web3 = require('web3')
const abi = require('human-standard-token-abi') 

const web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"));


// Define the contract addresses and the contract instance
const contractAddress = '0x84265173B2386D674ABA59b35D8C2A77C8A88181'
//const contract = new web3.eth.contract(abi, contractAddress)

var contractAbi = web3.eth.contract(abi);
var contract = contractAbi.at(contractAddress);
// suppose you want to call a function named myFunction of myContract

/*console.log(web3.eth.accounts[0]);
return false;*/

contract.drop.sendTransaction('0x627306090abaB3A6e1400e9345bC60c78a8BEf57',["0x2885f9904f3d1790ba53009bc9e0baae377d67df","0x7b7cd7d5cee9fb36b7995a3d81df0122a0b1af4a"],[100,200],{
    from:web3.eth.accounts[0],
    gas:4000000},function (error, result){ //get callback from function which is your transaction key
    if(!error){
        console.log(result);
    } else{
        console.log(error);
    }
})

Пожалуйста, дайте мне знать, что не так в этом шаге. Что я пропустил со своей стороны. Я не могу отправить свою транзакцию на мультиадрес, используя контракт.

В настоящее время я получаю эту ошибку:

TypeError: name.match is not a function
    at SolidityTypeAddress.isType (/var/www/html/BlockChain/parity/node_modules/web3/lib/solidity/address.js:23:19)
    at /var/www/html/BlockChain/parity/node_modules/web3/lib/solidity/coder.js:57:18
    at Array.filter (<anonymous>)
    at SolidityCoder._requireType (/var/www/html/BlockChain/parity/node_modules/web3/lib/solidity/coder.js:56:36)
    at /var/www/html/BlockChain/parity/node_modules/web3/lib/solidity/coder.js:231:21
    at Array.map (<anonymous>)
    at SolidityCoder.getSolidityTypes (/var/www/html/BlockChain/parity/node_modules/web3/lib/solidity/coder.js:230:18)
    at SolidityCoder.encodeParams (/var/www/html/BlockChain/parity/node_modules/web3/lib/solidity/coder.js:88:30)
    at SolidityFunction.toPayload (/var/www/html/BlockChain/parity/node_modules/web3/lib/web3/function.js:92:52)
    at SolidityFunction.sendTransaction (/var/www/html/BlockChain/parity/node_modules/web3/lib/web3/function.js:163:24)

Но я не думаю, что это связано с контрактом. Я что-то упускаю или иду не тем путем?

Пожалуйста, помогите мне срочно, чтобы я мог продолжить свою работу на основе этого.

Ответы (1)

Вы проходите human-standard-token-abi(который является ABI контракта ERC20), чтобы создать свой Airdropконтракт, который имеет совершенно другие функции.

ABI для контракта Airdrop:

[
    {
      "constant": false,
      "inputs": [
        {
          "name": "token",
          "type": "address"
        },
        {
          "name": "recipients",
          "type": "address[]"
        },
        {
          "name": "values",
          "type": "uint256[]"
        }
      ],
      "name": "drop",
      "outputs": [],
      "payable": false,
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ]

Это ABI, к которому вам нужно перейти, web3.eth.contract(abi);чтобы создать экземпляр вашего объекта контракта.

Здравствуйте, @Andrey, я изменил ABI, как вы дали, и он застрял в блокировке учетной записи, поэтому я разблокировал, но теперь он не возвращает никакого вывода или не возвращает никакой ошибки в функции sendTransaction. Я думаю, что что-то не так в функции sendTransaction. Не могли бы вы проверить один раз? это правильно или нет?
Ваша функция выглядит нормально. Функция обратного вызова вообще вызывается? Если до if(!error)того, как сделать линию и позвонить console.log(result); console.log(error);- что-нибудь выводит?
Да, я проверил его, но он ничего не получает. @Андрей
Транзакция завершена, но она терпит неудачу. ropsten.etherscan.io/tx/… Почему не работает?