doroidpanic.com

Cordova ( web3js, infura, ethereumjs-tx.js) でsendSignedTransaction



self.sendTransaction = function( account , toaddress , amountEth ) {
    var   deferred  = $q.defer();
    const amountWei = self.web3.utils.toWei( amountEth , 'ether');

    var tx = {
        from  : account.address,
        to    : toaddress,
        value : amountWei,
    };

    self.web3.eth.estimateGas( tx ).then( ( gasLimit ) => {
        // Gasを前もって仮計算するけど、その瞬間なのでちょっと多めにする。
        tx.gasLimit = self.web3.utils.toHex( gasLimit + 10000 );
        return self.web3.eth.getGasPrice();
    }).then( ( gasPrice ) => {
        // Gasを設定して、nonceを取得(Metamaskでこれが困ったことがあった..)
        tx.gasPrice = self.web3.utils.toHex( gasPrice );
        return self.web3.eth.getTransactionCount( account.address );
    }).then( ( count ) => {
        // 今回は1トランザクションだけど、複数送信の場合は注意
        tx.nonce = count;

        const transaction = new ethereumjs.Tx( tx );
        var privatekey  = account.privateKey;
        // keystoreから復元したら秘密鍵に0xが付いてたけど0xあるとsignで失敗する
        var prefix  = "0x";
        if( privatekey.indexOf( prefix ) === 0 ){
            privatekey = privatekey.slice( prefix.length ) ;
        }
        transaction.sign( ethereumjs.Buffer.Buffer.from( privatekey , 'hex' ) );
        const transactionHex = '0x'+transaction.serialize().toString( 'hex' )
        self.web3.eth.sendSignedTransaction( transactionHex ).once('transactionHash', (hash) => {
                console.log('transaction Hash', 'https://ropsten.etherscan.io/tx/' + hash);
              }).once('receipt', ( receipt ) => {
                console.log('receipt' , receipt );
              })
              .on('confirmation' , (confirmationNumber, receipt) => {
                console.log('confirmation', confirmationNumber, receipt);
              })
              .on('error', console.error );
        });

confirmationをonceにしたから、confirmationずっと流れると思ったけど24で終了した?
解除ってどうやるんだろう、それかonだけにするしかないかな。