Uso de contrato inteligente con web3: no se puede enviar la transacción con éxito

Intenté enviar ether desde varias direcciones, para eso creé un contrato. El contrato se implementa con éxito en ropsten testnet.

Inicié el servicio en segundo plano usando este comando.

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

Código de contrato:

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 implementada del contrato: https://ropsten.etherscan.io/address/0x84265173B2386D674ABA59b35D8C2A77C8A88181

Intenté aplicar send_transaction usando Web3Js pero no pude hacerlo correctamente.

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);
    }
})

Por favor, hágame saber lo que está mal en estos pasos. Lo que extrañaba de mi lado. No puedo enviar mi transacción a varias direcciones mediante contrato.

Actualmente estoy recibiendo este 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)

Pero no creo que esté relacionado con el contrato. ¿Me estoy perdiendo algo o voy por el camino equivocado?

Por favor, ayúdenme urgente para que pueda continuar mi trabajo en base a ello.

Respuestas (1)

Está pasando human-standard-token-abi(que es un contrato ABI ERC20) para crear su Airdropcontrato que tiene funciones completamente diferentes.

ABI para contrato 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"
    }
  ]

Esa es la ABI a la que debe pasar para web3.eth.contract(abi);crear una instancia de su objeto de contrato.

Hola, @Andrey, cambié el ABI según lo que diste y estaba bloqueada la cuenta de bloqueo, así que la desbloqueé, pero ahora no devuelve ningún resultado o no devuelve ningún error en la función de envío de transacciones. Creo que algo anda mal en la función sendTransaction. ¿Puedes comprobarlo una vez? ¿Es correcto o no?
Su función se ve bien. ¿Se está llamando a la función de devolución de llamada? Si antes if(!error)de hacer una línea y llamar console.log(result); console.log(error);, ¿alguna de las dos genera algo?
Sí, lo comprobé y todavía no obtiene nada. @Andrey
Transacción realizada pero está fallando. ropsten.etherscan.io/tx/… ¿Por qué falla?