エーテル元とトークンの残高と価格を調べ、エーテル元とトークンの振替を行い、取引記録を取得する。

38846 ワード

エーテル元とトークンの残高と価格を調べ、エーテル元とトークンの振替を行い、取引記録を取得する。
1 //   64 ,     0  
2 function addPreZero(num){
3   var t = (num+'').length,
4   s = '';
5   for(var i=0; i<64-t; i++){
6     s += '0';
7   }
8   return s+num;
9 }
一、web 3.jsを使います
  照会方法は、私鎖と主鎖での方法は同じです。以下の点を説明します。
  • プライマリチェーンアドレスです。infuraに行って
  • を申請してもいいです。
  • contractAbi。契約のabi。行ってもいいですhttps://etherscan.io取得すると、トークン契約がcodeを提供すると、abi
  • があります。
     1,リンクweb 3.js
     1 import Web3 from 'web3'
     2 let getWeb3 = new Promise(function(resolve, reject) {
     3     var web3 = window.web3
     4     if (typeof web3 !== 'undefined') {
     5         web3 = new Web3(web3.currentProvider)
     6         results = {web3: web3}
     7         console.log('Injected web3 detected.');
     8         resolve(results)
     9     } else {
    10         var provider = new Web3.providers.HttpProvider('https://mainnet.infura.io/v3/apikey')
    11         web3 = new Web3(provider)
    12         results = {web3: web3}
    13         resolve(results)
    14     }
    15 })
    2,エーテルとトークンの価格とgasLimitを調べます。
     1 getWeb3.then(function (server) {
     2             server.web3.eth.getGasPrice(function (error, result) {//      
     3                 if (!error) {
     4                     alert(result.toNumber())
     5                     server.web3.eth.getBlock("latest", function (error1, info) {//gasLimit
     6                         if (!error1) {
     7               alert(JSON.stringify(info.gasLimit))
     8                           
     9                         }
    10 
    11                     })
    12                 }
    13             });
    14         });
    3,エーテルとトークンの残高を調べます。
     1 const BigNumber = require('bignumber.js');
     2 const Ether = new BigNumber(10e+17);
     3 //       
     4 balanceOfETH = (address) => {
     5         let self = this;
     6         getWeb3.then(function (server) {
     7             let filter = server.web3.eth.filter('latest')
     8           valueOfgetBalance(server, address, 0)
     9          valueOfgetBalanceOther(server, address)
    10             filter.watch(function (error, result) {
    11 
    12                 if (!error) {
    13                   valueOfgetBalance(server, address, 0)
    14                   valueOfgetBalanceOther(server, address)
    15                 }
    16             }, function (err) {
    17                 console.log(err);
    18             });
    19         })
    20     }
    21 valueOfgetBalance = (server, address, num) => {
    22         let self = this;
    23         const balance = server.web3.eth.getBalance(address, (err2, bal) => {
    24             if (!err2) {
    25                 let ret = new BigNumber(bal);
    26               alert(ret.dividedBy(Ether)).toFixed(2))//     
    27             }
    28 
    29         });
    30 
    31     }
    32 //      
    33 valueOfgetBalanceOther= (server, address) => {
    34         let self = this;
    35         const balance = server.web3.eth.getBalance(address, (err2, bal) => {
    36             if (!err2) {
    37                 let contractother = 
    38         server.web3.eth.contract(contractabi).at(contractaddress);
    39                 contractother.balanceOf(address, (error2, bal) => {
    40                     if (!error2) {
    41                         let ret = new BigNumber(bal);
    42             alert(ret.dividedBy(Ether)).toFixed(2))//     
    43                     }
    44 
    45                 })
    46             }
    47         });
    48     }
    4,私用チェーンで振替するのはエーテル円とトークンです。
     1 //      
     2 web3.eth.sendTransaction({
     3     from: currentAccount,
     4     to: receiverAccount,
     5     value: '1000000000000000'
     6 })
     7 .then(function(receipt){
     8     console.log(receipt);
     9 });
    10 
    11 //     
    12 myContract.methods.transfer(to, amount).send({from: currentAccount}), function(error, transactionHash){
    13     if(!error) {
    14        console.log('transactionHash is ' + transactionHash);
    15     } else {
    16        console.log(error);
    17     }
    18 });
    5,メインチェーンで振替するエーテルとトークン
    上記の方法は私鎖だけに適用されます。なぜなら、あなたの秘密チェーンのアカウントは、ローカルに秘密鍵があるからです。一方、プライマリチェーンにデータを書き込む方法は、アカウントの秘密鍵を取得し、取引に署名する必要があるので、web3.eth.sendSignedTransaction方法を使用する。
    文書http://web3js.readthedocs.io/en/1.0/web3-eth.html#sendsignedtransaction npmが'ethere umjs-tx'をインストールする必要があります。
    1 npm install ethereumjs-tx
    振替の方法
     1 //   ethereumjs-tx
     2 var tx = require('ethereumjs-tx');
     3 transfer = (recipientAddress, balance, privateKey) => {
     4         // ethGasLimit
     5         let self = this;
     6         getWeb3.then(function (server) {
     7             let address =WalletaA;//       
     8      
     9             server.web3.eth.getTransactionCount(address, function (err, nonce) {
    10               
    11                 let balanceEth = parseFloat(balance) * Ether;//   ETH       
    12                 let rawTx = {}
    13                 if (self.state.token == 'ETH') {//     
    14                     //      
    15                     rawTx = {
    16                         nonce: server.web3.toHex(nonce++),//nonce      
    17                         gasPrice: server.web3.toHex(10e9),
    18                         from: address, // keystore address    
    19                         gasLimit: server.web3.toHex(99000), //gasLimit  
    20                         to: recipientAddress, // recipientAddress  
    21                         value: balanceEth//valueEth
    22                     }
    23                 } else {//    
    24                     // data   , :0x +          function signature +         ,      64 ( transfer  ,            0x,         16    ,    0x,     64 )
    25                     let data = '0x' + 'a9059cbb' + addPreZero(recipientAddress.substr(2)) + addPreZero(server.web3.toHex(balanceEth).substr(2))
    26                     rawTx = {
    27                         nonce: server.web3.toHex(nonce++),
    28                         gasLimit: server.web3.toHex(9900),
    29                         gasPrice: server.web3.toHex(10e9),
    30                         //                
    31                         to:address,
    32                         from: address,
    33                         //       value    
    34                         value: '0x00',
    35                         // data   , :0x +          function signature +         ,      64 ( transfer  ,            0x,         16    ,    0x,     64 )
    36                         data: data
    37                     }
    38                 }
    39                 let tx = new ethTX(rawTx);
    40                 let keyBuf = Buffer.from(privateKey, 'hex');
    41                 //       
    42                 tx.sign(keyBuf);
    43                 if (tx.verifySignature()) {
    44                     console.log('Signature Checks out!')
    45                 }
    46                 let serializedTxHex = '0x' + tx.serialize().toString('hex');
    47                 server.web3.eth.sendRawTransaction(serializedTxHex, function (err, transactionHash) {
    48                     //    transctionHash    web3.eth.getTransaction(transactionHash)      
    49                     //alert(address + '  ' + nonce + '   ' + err + ';  ' + transactionHash)
    50                     //alert('      ==' + transactionHash + '        ==' + JSON.stringify(err));
    51                   
    52                 });
    53             });
    54         });
    55         //});
    56     }
    二、エーテル坊
      1,エーテルとトークンの価格とgasLimitを調べます。
     1 fetch(`https://api.etherscan.io/api?module=proxy&action=eth_gasPrice&apikey=apikey`)
     2             .then(result => result.json())
     3             .then(result => {
     4                 // alert(JSON.stringify(parseInt(result.result, 16))/ 1e9)
     5                 // if (result.status == 1) {
     6                 let parseIntresult = parseInt(result.result, 16)
     7               
     8                 //alert(result.result+'===0x'+parseIntresult.toString(16))
     9                
    10                 fetch(`https://api.etherscan.io/api?module=proxy&action=eth_getBlockByNumber&tag=0x10d4f&boolean=true&apikey=apikey`) 
    11 .then(info => info.json()) 
    12 .then(info => { 
    13 // alert(JSON.stringify(info)) 
    14 let parseIntinfo = parseInt(info.result.gasLimit, 16) 
    15 
    16  }) 
    17 .catch(e => { 
    18   }) 
    19  }) 
    20 .catch(e => { 
    21  })
      2,エーテルとトークンの残高を調べます。
     1 //     
     2 return fetch(`https://api.etherscan.io/api?module=account&action=balance&address=${address}&tag=latest&apikey=apikey`)
     3         .then(result => result.json())
     4         .then(result => {
     5             if (result.status == 1) {
     6                 let ret = new BigNumber(result.result);
     7               alert(ret.dividedBy(Ether)).toFixed(2);//     
     8                
     9             }
    10         })
    11         .catch(e => {
    12 
    13         })
    14 
    15 //    
    16   return fetch(`https://api.etherscan.io/api?module=account&action=tokenbalance&contractaddress=${contactaddress}&address=${address}&tag=latest&apikey=apikey`)
    17              .then(result => result.json())
    18             .then(result => {
    19                 if (result.status == 1) {
    20                      let ret = new BigNumber(result.result);
    21                   alert(ret.dividedBy(Ether)).toFixed(2);
    22        
    23                  }
    24              })
    25              .catch(e => {
    26 
    27             })
    3,メインチェーンで振替します。エーテルとトークンです。
     1 transfer = (recipientAddress, balance, privateKey) => {
     2         // ethGasLimit
     3         let self = this;
     4         let address = WalletaA;//       
     5         fetch(`https://api.etherscan.io/api?module=proxy&action=eth_getTransactionCount&address=${address}&tag=latest&apikey=apikey`)
     6        .then(result => result.json())
     7         .then(result => {
     8                 let nonce = parseInt(result.result, 16)+1
     9                 let gasPrice = 10e9;//gas  
    10                 let gasLimit = 9900;//gas  
    11                 let balanceEth = parseFloat(balance) * Ether;//   ETH       
    12                 let rawTx = {}
    13                 if (self.state.token == 'ETH') {
    14                     //      
    15                     rawTx = {
    16                         nonce: '0x'+nonce.toString(16),//nonce      
    17                         gasPrice: '0x'+gasPrice.toString(16),
    18                         from: address, // keystore address    
    19                         gasLimit: '0x'+gasLimit.toString(16), //gasLimit  
    20                         to: recipientAddress, // recipientAddress  
    21                         value: balanceEth//valueEth
    22                     }
    23                 } else {
    24                     // data   , :0x +          function signature +         ,      64 ( transfer  ,            0x,         16    ,    0x,     64 )
    25                     let data = '0x' + 'a9059cbb' + addPreZero(recipientAddress.substr(2)) + addPreZero(balanceEth.toString(16))
    26                     rawTx = {
    27                         nonce: '0x'+nonce.toString(16),
    28                         gasLimit: '0x'+gasLimit.toString(16),
    29                         gasPrice: '0x'+gasPrice.toString(16),
    30                         //                
    31                         to: hrcjson.address,
    32                         from: address,
    33                         //       value    
    34                         value: '0x00',
    35                         // data   , :0x +          function signature +         ,      64 ( transfer  ,            0x,         16    ,    0x,     64 )
    36                         data: data
    37                     }
    38                 }
    39                 let tx = new ethTX(rawTx);
    40                 let keyBuf = Buffer.from(privateKey, 'hex');
    41                 //       
    42                 tx.sign(keyBuf);
    43                 if (tx.verifySignature()) {
    44                     console.log('Signature Checks out!')
    45                 }
    46 
    47                 let serializedTxHex = '0x' + tx.serialize().toString('hex');
    48                 fetch(`https://api.etherscan.io/api?module=proxy&action=eth_sendRawTransaction&hex=${serializedTxHex}&apikey=apikey`)
    49                 .then(info => info.json())
    50                  .then(info => {
    51                     alert('    =='+JSON.stringify(info))
    52                   
    53         })
    54         .catch(e => {
    55 
    56         })
    57     }
    取引記録の取得
     1 fetch(`https://api.etherscan.io/api?module=account&action=tokentx&contractaddress=${contractaddress}&address=${address}&page=1&offset=20&sort=desc&apikey=apikey`)
     2         .then(transactionList => transactionList.json())
     3             .then(transactionList => {
     4                 if (transactionList.status == 1) {
     5                     let value = transactionList.result[transactionList.result.length - 1].value
     6                     transactionList = transactionList.result;
     7                     
     8                     // const txnIn = transactionList.filter(t => t.to === address);
     9                     // const txnOut = transactionList.filter(t => t.from === address);
    10                     //
    11                 }
    12               
    13 
    14             }).catch(err => {});