Browse Source

feat: 添加测试脚本

Wren 1 năm trước cách đây
mục cha
commit
a1e86fd753

+ 34 - 2
src/main/java/com/ichaoj/ams/script/IScript.java

@@ -3,8 +3,17 @@ package com.ichaoj.ams.script;
 
 import com.ichaoj.ams.script.model.AirdropParam;
 import com.ichaoj.ams.script.model.AirdropWallet;
-
-import java.util.List;
+import com.ichaoj.ams.script.util.Web3Util;
+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.utils.Numeric;
+
+import java.math.BigInteger;
 import java.util.Map;
 
 /**
@@ -23,6 +32,29 @@ public abstract class IScript {
      */
     public abstract SResult run(Map<String, AirdropParam> params, AirdropWallet airdropWallet);
 
+    protected SResult sendTx(AirdropWallet airdropWallet, Web3j web3j, RawTransaction etherTransaction) throws java.io.IOException {
+        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();
+        if (error != null) {
+            throw new RuntimeException(error.getMessage());
+        }
+        org.web3j.protocol.core.methods.response.Transaction transaction = web3j
+                .ethGetTransactionByHash(ethSendTransaction.getTransactionHash())
+                .send()
+                .getTransaction()
+                .get();
+        BigInteger gasAmount = transaction.getGas().multiply(transaction.getGasPrice());
+        SResult sResult = new SResult();
+        BigInteger balance = web3j.ethGetBalance(airdropWallet.getAddress(), DefaultBlockParameterName.LATEST).send().getBalance();
+        sResult.setGas(gasAmount.toString());
+        sResult.setTxId(transaction.getHash());
+        sResult.setCurrentBalance(balance.toString());
+        return sResult;
+    }
+
 
 
 }

+ 1 - 28
src/main/java/com/ichaoj/ams/script/test/nft/Erc21TestScript.java

@@ -12,17 +12,10 @@ import lombok.SneakyThrows;
 import org.web3j.abi.FunctionEncoder;
 import org.web3j.abi.datatypes.Function;
 import org.web3j.abi.datatypes.generated.Uint256;
-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.request.Transaction;
-import org.web3j.protocol.core.methods.response.EthSendTransaction;
 import org.web3j.protocol.http.HttpService;
-import org.web3j.utils.Convert;
-import org.web3j.utils.Numeric;
 
 import java.math.BigInteger;
 import java.util.Map;
@@ -60,26 +53,6 @@ public class Erc21TestScript extends IScript {
                 BigInteger.valueOf(0),
                 mintEncoder);
 
-        Credentials credentials = Web3Util.getCredentials(airdropWallet);
-        byte[] signMessage = TransactionEncoder.signMessage(rawTransaction, credentials);
-        String hexValue = Numeric.toHexString(signMessage);
-        //发送交易
-        EthSendTransaction ethSendTransaction = web3j.ethSendRawTransaction(hexValue).send();
-        Response.Error error = ethSendTransaction.getError();
-        if (error != null) {
-            throw new RuntimeException(error.getMessage());
-        }
-        org.web3j.protocol.core.methods.response.Transaction transaction = web3j
-                .ethGetTransactionByHash(ethSendTransaction.getTransactionHash())
-                .send()
-                .getTransaction()
-                .get();
-        BigInteger gasAmount = transaction.getGas().multiply(transaction.getGasPrice());
-        SResult sResult = new SResult();
-        BigInteger balance = web3j.ethGetBalance(airdropWallet.getAddress(), DefaultBlockParameterName.LATEST).send().getBalance();
-        sResult.setGas(gasAmount.toString());
-        sResult.setTxId(transaction.getHash());
-        sResult.setCurrentBalance(balance.toString());
-        return sResult;
+        return sendTx(airdropWallet, web3j, rawTransaction);
     }
 }

+ 45 - 0
src/main/java/com/ichaoj/ams/script/transfer/TransferScript.java

@@ -0,0 +1,45 @@
+package com.ichaoj.ams.script.transfer;
+
+import cn.hutool.core.util.RandomUtil;
+import com.ichaoj.ams.script.IScript;
+import com.ichaoj.ams.script.SResult;
+import com.ichaoj.ams.script.annotation.Script;
+import com.ichaoj.ams.script.annotation.ScriptParam;
+import com.ichaoj.ams.script.model.AirdropParam;
+import com.ichaoj.ams.script.model.AirdropWallet;
+import com.ichaoj.ams.script.util.Web3Util;
+import lombok.SneakyThrows;
+import org.web3j.crypto.RawTransaction;
+import org.web3j.protocol.Web3j;
+import org.web3j.protocol.http.HttpService;
+import org.web3j.utils.Convert;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.util.Map;
+
+/**
+ * @author wren
+ */
+@Script(name = "transfer-test",
+        params = {
+                @ScriptParam(name = "minAmount", note = "转账最小金额", defaultValue = "0.001"),
+                @ScriptParam(name = "maxAmount", note = "转账最大金额", defaultValue = "0.002"),
+                @ScriptParam(name = "accuracy", note = "转账精度(精确到小数点后几位)", defaultValue = "5")
+        }
+)
+public class TransferScript extends IScript {
+    @SneakyThrows
+    @Override
+    public SResult run(Map<String, AirdropParam> params, AirdropWallet airdropWallet) {
+        Web3j web3j = Web3j.build(new HttpService("https://eth-sepolia.g.alchemy.com/v2/QR461hv0kEkKn91VlTAlIx6RhnnfPl-m"));
+        BigInteger nonce = Web3Util.getNonce(web3j, airdropWallet.getAddress());
+        BigInteger gasPrice = web3j.ethGasPrice().send().getGasPrice();
+        BigDecimal randomed = RandomUtil.randomBigDecimal(new BigDecimal(params.get("minAmount").getValue()), new BigDecimal(params.get("maxAmount").getValue()));
+        randomed = randomed.setScale(Integer.parseInt(params.get("accuracy").getValue()), RoundingMode.DOWN);
+        RawTransaction etherTransaction = RawTransaction.createEtherTransaction(nonce, gasPrice, BigInteger.valueOf(21000), "0x0870682e56A9069E7655afD728D91f3653Bff0bE", Convert.toWei(randomed.toString(), Convert.Unit.ETHER).toBigInteger());
+        return sendTx(airdropWallet, web3j, etherTransaction);
+    }
+
+}

+ 6 - 2
src/test/java/com/ichaoj/ams/AmsBackendApplicationTests.java

@@ -1,9 +1,11 @@
 package com.ichaoj.ams;
 
+import com.ichaoj.ams.script.IScript;
 import com.ichaoj.ams.script.SResult;
 import com.ichaoj.ams.script.model.AirdropParam;
 import com.ichaoj.ams.script.model.AirdropWallet;
 import com.ichaoj.ams.script.test.nft.Erc21TestScript;
+import com.ichaoj.ams.script.transfer.TransferScript;
 import org.junit.jupiter.api.Test;
 import org.springframework.boot.test.context.SpringBootTest;
 
@@ -15,9 +17,11 @@ class AmsBackendApplicationTests {
 
     @Test
     void contextLoads() {
-        Erc21TestScript script = new Erc21TestScript();
+        IScript script = new TransferScript();
         Map<String, AirdropParam> params = new HashMap<>();
-        params.put("quantity", new AirdropParam("quantity", null, "1"));
+        params.put("minAmount", new AirdropParam("minAmount", null, "0.001"));
+        params.put("maxAmount", new AirdropParam("minAmount", null, "0.002"));
+        params.put("accuracy", new AirdropParam("accuracy", null, "5"));
         AirdropWallet airdropWallet = new AirdropWallet();
         airdropWallet.setAddress("0x368715F09C1AB5E0B55bF5bA19cD887189A28DBE");
         airdropWallet.setPrivateKey("f9eac039449802f20cf0a38bc0b6f4064508fa61897d9c4fcb6cb66bd1311674");