package com.ichaoj.ams.script; import cn.hutool.core.thread.ThreadUtil; import com.ichaoj.ams.script.model.AirdropParam; import com.ichaoj.ams.script.model.AirdropWallet; import com.ichaoj.ams.script.util.Web3Util; import io.zksync.protocol.ZkSync; import lombok.SneakyThrows; import org.web3j.crypto.Credentials; import org.web3j.crypto.RawTransaction; import org.web3j.crypto.TransactionEncoder; import org.web3j.protocol.Web3j; import org.web3j.protocol.core.DefaultBlockParameterName; import org.web3j.protocol.core.Response; import org.web3j.protocol.core.methods.response.EthSendTransaction; import org.web3j.protocol.core.methods.response.EthTransaction; import org.web3j.protocol.core.methods.response.Transaction; import org.web3j.protocol.core.methods.response.TransactionReceipt; import org.web3j.utils.Convert; import org.web3j.utils.Numeric; import java.math.BigInteger; import java.util.Map; import java.util.Optional; import java.util.concurrent.TimeUnit; /** * 脚本接口 * * @author wren */ public abstract class IScript { /** * 运行脚本 * * @param params 参数 * @return txId */ public abstract SResult run(Map params, AirdropWallet airdropWallet); @SneakyThrows protected SResult sendTxForEvm(AirdropWallet airdropWallet, Web3j web3j, RawTransaction etherTransaction) { Credentials credentials = Web3Util.getCredentials(airdropWallet); byte[] signMessage = TransactionEncoder.signMessage(etherTransaction, credentials); String hexValue = Numeric.toHexString(signMessage); EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send(); Response.Error error = ethSendTransaction.getError(); BigInteger balance1 = web3j.ethGetBalance(airdropWallet.getAddress(), DefaultBlockParameterName.LATEST).send().getBalance(); System.out.println("balance1:" + balance1); if (error != null) { throw new RuntimeException(error.getMessage()); } TransactionReceipt receipt = null; long currentTimeMillis = System.currentTimeMillis(); while (true) { if (currentTimeMillis + 600000 < System.currentTimeMillis()) { throw new RuntimeException("transaction time out"); } Optional receiptOptional = web3j .ethGetTransactionReceipt(ethSendTransaction.getTransactionHash()).send().getTransactionReceipt(); if (receiptOptional.isPresent()) { receipt = receiptOptional.get(); break; } else { ThreadUtil.sleep(3, TimeUnit.SECONDS); } } EthTransaction ethTransaction = web3j.ethGetTransactionByHash(receipt.getTransactionHash()).send(); Transaction transaction = ethTransaction.getTransaction().get(); BigInteger gasAmount = receipt.getGasUsed().multiply(transaction.getGasPrice()); SResult sResult = new SResult(); BigInteger balance = web3j.ethGetBalance(airdropWallet.getAddress(), DefaultBlockParameterName.LATEST).send().getBalance(); sResult.setGas(Convert.fromWei(gasAmount.toString(), Convert.Unit.ETHER).toString()); sResult.setTxId(transaction.getHash()); sResult.setStatus("0x1".equals(receipt.getStatus()) ? 1 : 2); sResult.setCurrentBalance(Convert.fromWei(balance.toString(), Convert.Unit.ETHER).toString()); return sResult; } }