以太坊智能合約實現批量轉賬(空投)可轉代幣或者以太幣


現成工具:CoinTool.App


參考資料

solidity .批量轉賬,存入eth

以太坊合約實現批量轉賬(空投)原理解析  

以太坊智能合約之批量轉幣

專門用於批量空投的 ETH 智能合約(該鏈接需要梯子)

教你一招 如何批量發送eth 或者代幣


使用智能合約轉代幣是比較容易理解的,上面的鏈接中基本都有,直接拿來可以用。

但是轉eth就有點蒙了。 上面就最后一個鏈接給了代碼,網上查了好幾個地方都是那個代碼,然后再remix中部署,卻沒用- -

單單弄這個批量轉eth搞了好幾天!!!

說明:上面那個代碼實際是有用的,不過是我開始對概念不夠懂..! 上面代碼實際是通過智能合約來轉幣,也就是說,需要智能合約中有eth,才能調用_to.transfer(msg.value); 否則,都沒幣,怎么轉!

之后又糾結於,如何給智能合約地址轉幣...  如果通過其他方式轉給智能合約eth,然后再調用智能合約的批量方法,這就是兩個步驟了,顯然達不到要求...

又糾結了大半天, 最后在一個群友的提示下, 突然想到了remix編輯器右上角有個value...  代碼轉幣的時候也是有個value(轉代幣的時候都是填0x0;

好了,廢話了好多...

下面發直接能用的代碼

合約工具代碼


 
  1. pragma solidity ^0.4.24;

  2. contract TransferTool {

  3. address owner = 0x0;

  4. function TransferTool () public payable{//添加payable,支持在創建合約的時候,value往合約里面傳eth

  5. owner = msg.sender;

  6. }

  7. //批量轉賬

  8. function transferEthsAvg(address[] _tos) payable public returns (bool) {//添加payable,支持在調用方法的時候,value往合約里面傳eth,注意該value最終平分發給所有賬戶

  9. require(_tos.length > 0);

  10. require(msg.sender == owner);

  11. var vv = this.balance/_tos.length;

  12. for(uint32 i=0;i<_tos.length;i++){

  13. _tos[i].transfer(vv);

  14. }

  15. return true;

  16. }

  17. function transferEths(address[] _tos,uint256[] values) payable public returns (bool) {//添加payable,支持在調用方法的時候,value往合約里面傳eth,注意該value最終平分發給所有賬戶

  18. require(_tos.length > 0);

  19. require(msg.sender == owner);

  20. for(uint32 i=0;i<_tos.length;i++){

  21. _tos[i].transfer(values[i]);

  22. }

  23. return true;

  24. }

  25. //直接轉賬

  26. function transferEth(address _to) payable public returns (bool){

  27. require(_to != address(0));

  28. require(msg.sender == owner);

  29. _to.transfer(msg.value);

  30. return true;

  31. }

  32. function checkBalance() public view returns (uint) {

  33. return address(this).balance;

  34. }

  35. function () payable public {//添加payable,用於直接往合約地址轉eth,如使用metaMask往合約轉賬

  36. }

  37. function destroy() public {

  38. require(msg.sender == owner);

  39. selfdestruct(msg.sender);

  40. }

  41. function transferTokensAvg(address from,address caddress,address[] _tos,uint v)public returns (bool){

  42. require(_tos.length > 0);

  43. bytes4 id=bytes4(keccak256("transferFrom(address,address,uint256)"));

  44. for(uint i=0;i<_tos.length;i++){

  45. caddress.call(id,from,_tos[i],v);

  46. }

  47. return true;

  48. }

  49. function transferTokens(address from,address caddress,address[] _tos,uint[] values)public returns (bool){

  50. require(_tos.length > 0);

  51. require(values.length > 0);

  52. require(values.length == _tos.length);

  53. bytes4 id=bytes4(keccak256("transferFrom(address,address,uint256)"));

  54. for(uint i=0;i<_tos.length;i++){

  55. caddress.call(id,from,_tos[i],values[i]);

  56. }

  57. return true;

  58. }

  59. }

測試結果圖

 

 

node代碼

批量轉代幣,代碼里面的x,自行修改成自己對應的地址參數 

(注意,轉代幣需要先調用approve授權,)


 
  1. let contract = new ConfigInit.getWeb3().eth.Contract(TOOLabi, TOOLaddr);

  2. let destAddr = 'x';

  3. let tos = ["x", "x"];

  4. let value = ConfigInit.getWeb3().utils.toWei('26.2');

  5. let from = 'x';

  6. let pData = contract.methods.transfer(from,destAddr,tos,value).encodeABI();

  7. let prikey = 'x';

  8. TransferUtils.sendTokenOptions(from, prikey, TOOLaddr, '0x0', TOOLaddr, pData).then(function (hash) {

  9. console.log('------------- ' + hash);

  10. }).catch(function (e) {

  11. console.log('------------- ' + e.message);

  12. });

  13. res.send('===========');

批量轉eth


 
  1. router.get('/mulSendEth',function (req,res,next) {

  2. let contract = new ConfigInit.getWeb3().eth.Contract(ETHTOOLabi, ETHTOOLaddr);

  3. let tos = ["x","x","x","x"];

  4. let web3 = ConfigInit.getWeb3();

  5. let value = web3.utils.toWei('1');

  6. let from = 'x';

  7. let prikey = 'x';

  8. let pData = contract.methods.transferETHS(tos).encodeABI();

  9. let strvalue = web3.utils.toHex(value);

  10. TransferUtils.sendTokenOptions(from, prikey, ETHTOOLaddr, strvalue, ETHTOOLaddr, pData).then(function (hash) {

  11. console.log('------------- ' + hash);

  12. }).catch(function (e) {

  13. console.log('------------- ' + e.message);

  14. });

  15. res.send('===========');

  16. });

  17. router.get('/mulSendEth2',function (req,res,next) {

  18. let contract = new ConfigInit.getWeb3().eth.Contract(ETHTOOLabi, ETHTOOLaddr);

  19. let tos = ["x","x","x","x"];

  20. let tovalue = ["400000000000000000","100000000000000000","350000000000000000","150000000000000000"];

  21. let web3 = ConfigInit.getWeb3();

  22. let value = web3.utils.toWei('1');

  23. let from = 'x';

  24. let prikey = 'x';

  25. let pData = contract.methods.transferETHS(tos,tovalue).encodeABI();

  26. let strvalue = web3.utils.toHex(value);

  27. TransferUtils.sendTokenOptions(from, prikey, ETHTOOLaddr, strvalue, ETHTOOLaddr, pData).then(function (hash) {

  28. console.log('------------- ' + hash);

  29. }).catch(function (e) {

  30. console.log('------------- ' + e.message);

  31. });

  32. res.send('===========');

  33. });

sendTokenOptions 里面實際是

 
  1. function sendTranscation(tr, fromAddr, privatekey, to, value, data, nonce, gasLimit, gasPrice) {

  2. let rawTransaction = {

  3. from: fromAddr,

  4. to: to,

  5. value: value,

  6. gasLimit: toHex(gasLimit),

  7. gasPrice: toHex(gasPrice),

  8. data: data,

  9. nonce: nonce

  10. };

  11. let transaction = new Etx(rawTransaction);

  12. if (privatekey.startsWith('0x')) {

  13. privatekey = privatekey.substring(2);

  14. }

  15. transaction.sign(Buffer.from(privatekey, 'hex'));

  16. let serializedTx = transaction.serialize();

  17. console.log('0x' + serializedTx.toString('hex'));

  18. return new Promise(function (resolve, reject) {

  19. let nhash = '';

  20. console.log('sendsignedTransaction--- ');

  21. ConfigInit.getWeb3().eth.sendSignedTransaction('0x' + serializedTx.toString('hex')).on('transactionHash', function (hash) {

順便提一下如何使用測試節點。

https://www.rinkeby.io/#faucet

通過fb,或者twitter發布一條帶地址的推文

流程,

  1. 首先去創建一個錢包地址
    https://vintage.myetherwallet.com/ 注意右上角,選擇rinkeby(etherscan.io

  2.發推文 推薦使用twitter; fb特么的不知道怎么獲取單條信息的鏈接..浪費半天時間, 推文內容需要帶上面創建的地址     如類似  https://twitter.com/xxxx/status/113300000000000

3.將上面地址填入https://www.rinkeby.io/#faucet輸入框, 一會就eth到賬。

4.

可以自己搭節點,切換測試節點, 這點不熟。網上找了個...使用infura提供的節點
https://rinkeby.infura.io
可以查詢到剛才的錢包地址有余額
web = new Web3("https://rinkeby.infura.io");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM