0%

Java×以太坊 4Goerli测试网转账REC20代币UNI

观前提示:

©版权所有:本教程由先圣编写,如需转载,请标明出处。

本文受众:Web3从业人员、程序员

浏览推荐:为了最佳观感,本文地址为:https://blog.120.show/2023/11

正文开始:

我默认你已经有一定的Java基础和看过我之前的三篇文章。(没有的话请先观看)

直接上代码SendRECToken:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/**
* @author HMB-XS
* @date 2023年09月12日20:07:30
**/
import java.math.BigInteger;

import org.web3j.contracts.eip20.generated.ERC20;
import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.gas.DefaultGasProvider;
import org.web3j.utils.Convert;

public class SendERCToken {
public static void main(String[] args) throws Exception {
// 填写你的infura个人key
String url = "https://goerli.infura.io/v3/72cc4dbd0f0749089cb4da266cf833bf";
// 填写的的私钥,建议新建小号测试
String key = "f866c2e8c812819299e58794502eb71b0324aee71894328171f81b375339cf17";
// 填入目标地址 此处可随机
String toAddress = "0x0017eEC9A38a98372D33D23722A73E2D68a4b838";
// 填入代币的合约地址 UNI合约地址
String contractAddress = "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984";
// 代币金额,以代币的最小单位为准,下面代码表示一个18位的代币
BigInteger amount = BigInteger.valueOf(100_0000_0000_0000_0000L);

// 初始化web3j客户端
Web3j web3j = Web3j.build(new HttpService(url));
// 填入您的以太坊钱包私钥
Credentials credentials = Credentials.create(key);
// 加载ERC20代币合约
ERC20 token = ERC20.load(contractAddress, web3j, credentials, new DefaultGasProvider());
// 获取账号地址
String fromAddress = credentials.getAddress();
// 检查代币余额 18位可以和wei一样转化
BigInteger balance = token.balanceOf(toAddress).send();
System.out.println("对方原代币余额:" + Convert.fromWei(String.valueOf(balance),Convert.Unit.ETHER));
// 构建代币转账交易
TransactionReceipt tx = token.transfer(toAddress,amount).send();
// 交易哈希
String transactionHash = tx.getTransactionHash();
String from = tx.getFrom(); // 获取发送方
String to = tx.getTo(); // 获取接收方
// 输出结果
System.out.println("交易哈希:" + transactionHash);
System.out.println("发送方:" + from);
System.out.println("接收方:" + to);
// 查询对方是否收到
BigInteger balance2 = token.balanceOf(toAddress).send();
System.out.println("对方现代币余额:" + Convert.fromWei(String.valueOf(balance2),Convert.Unit.ETHER));
}
}

如果没有找到ERC20这个类,请在pom.xml中添加依赖:

1
2
3
4
5
6
<!-- web3J合约依赖 -->
<dependency>
<groupId>org.web3j</groupId>
<artifactId>contracts</artifactId>
<version>4.8.7</version>
</dependency>

如果遇到这种错误:Package ‘java.lang‘ is declared in module ‘java.base‘, which is not in the module graph

可以尝试把JDK版本降到1.8:文件、项目结构、模块、语言级别、JDK1.8

比起上一篇,我们新建了一个ERC20对象,用该对象查询、发起交易,在语法上要简洁一些。

值得注意的是,发送的金额默认为该合约代币的最小值,一般情况下是18位,作者偷懒用Convert.fromWei转换了一下。

本文使用的合约代币UNI可以去:https://app.uniswap.org/#/swap

小狐狸把网络切换为Goerli后再连接即可,默认交换的代币就有UNI。

测试结果:

对方原代币余额:0
交易哈希:0x89dd6feeaf9726224dc8b5d5f7b4ad75381a76a445175deca4bf8ac57836e31f
发送方:0x529f273e5831581bf531a74915400263dc07c4fa
接收方:0x1f9840a85d5af5bf1d1762f925bdaddc4201f984
对方现代币余额:1

参考资料:

AI-ChatGPT问答

Java×以太坊 1批量生成以太坊钱包

Java×以太坊 2利用infura连接到以太坊Goerli测试网

Java×以太坊 3Goerli测试网转账GETH