IScript.java 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package com.ichaoj.ams.script;
  2. import cn.hutool.core.thread.ThreadUtil;
  3. import com.ichaoj.ams.script.model.AirdropParam;
  4. import com.ichaoj.ams.script.model.AirdropWallet;
  5. import com.ichaoj.ams.script.util.Web3Util;
  6. import io.zksync.protocol.ZkSync;
  7. import lombok.SneakyThrows;
  8. import org.web3j.crypto.Credentials;
  9. import org.web3j.crypto.RawTransaction;
  10. import org.web3j.crypto.TransactionEncoder;
  11. import org.web3j.protocol.Web3j;
  12. import org.web3j.protocol.core.DefaultBlockParameterName;
  13. import org.web3j.protocol.core.Response;
  14. import org.web3j.protocol.core.methods.response.EthSendTransaction;
  15. import org.web3j.protocol.core.methods.response.EthTransaction;
  16. import org.web3j.protocol.core.methods.response.Transaction;
  17. import org.web3j.protocol.core.methods.response.TransactionReceipt;
  18. import org.web3j.utils.Convert;
  19. import org.web3j.utils.Numeric;
  20. import java.math.BigInteger;
  21. import java.util.Map;
  22. import java.util.Optional;
  23. import java.util.concurrent.TimeUnit;
  24. /**
  25. * 脚本接口
  26. *
  27. * @author wren
  28. */
  29. public abstract class IScript {
  30. /**
  31. * 运行脚本
  32. *
  33. * @param params 参数
  34. * @return txId
  35. */
  36. public abstract SResult run(Map<String, AirdropParam> params, AirdropWallet airdropWallet);
  37. @SneakyThrows
  38. protected SResult sendTxForEvm(AirdropWallet airdropWallet, Web3j web3j, RawTransaction etherTransaction) {
  39. Credentials credentials = Web3Util.getCredentials(airdropWallet);
  40. byte[] signMessage = TransactionEncoder.signMessage(etherTransaction, credentials);
  41. String hexValue = Numeric.toHexString(signMessage);
  42. EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
  43. Response.Error error = ethSendTransaction.getError();
  44. BigInteger balance1 = web3j.ethGetBalance(airdropWallet.getAddress(), DefaultBlockParameterName.LATEST).send().getBalance();
  45. System.out.println("balance1:" + balance1);
  46. if (error != null) {
  47. throw new RuntimeException(error.getMessage());
  48. }
  49. TransactionReceipt receipt = null;
  50. long currentTimeMillis = System.currentTimeMillis();
  51. while (true) {
  52. if (currentTimeMillis + 600000 < System.currentTimeMillis()) {
  53. throw new RuntimeException("transaction time out");
  54. }
  55. Optional<TransactionReceipt> receiptOptional = web3j
  56. .ethGetTransactionReceipt(ethSendTransaction.getTransactionHash()).send().getTransactionReceipt();
  57. if (receiptOptional.isPresent()) {
  58. receipt = receiptOptional.get();
  59. break;
  60. } else {
  61. ThreadUtil.sleep(3, TimeUnit.SECONDS);
  62. }
  63. }
  64. EthTransaction ethTransaction = web3j.ethGetTransactionByHash(receipt.getTransactionHash()).send();
  65. Transaction transaction = ethTransaction.getTransaction().get();
  66. BigInteger gasAmount = receipt.getGasUsed().multiply(transaction.getGasPrice());
  67. SResult sResult = new SResult();
  68. BigInteger balance = web3j.ethGetBalance(airdropWallet.getAddress(), DefaultBlockParameterName.LATEST).send().getBalance();
  69. sResult.setGas(Convert.fromWei(gasAmount.toString(), Convert.Unit.ETHER).toString());
  70. sResult.setTxId(transaction.getHash());
  71. sResult.setStatus("0x1".equals(receipt.getStatus()) ? 1 : 2);
  72. sResult.setCurrentBalance(Convert.fromWei(balance.toString(), Convert.Unit.ETHER).toString());
  73. return sResult;
  74. }
  75. }