观前提示:
©版权所有:本教程由先圣编写,如需转载,请标明出处。
本文受众: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
|
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 { String url = "https://goerli.infura.io/v3/72cc4dbd0f0749089cb4da266cf833bf"; String key = "f866c2e8c812819299e58794502eb71b0324aee71894328171f81b375339cf17"; String toAddress = "0x0017eEC9A38a98372D33D23722A73E2D68a4b838"; String contractAddress = "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984"; BigInteger amount = BigInteger.valueOf(100_0000_0000_0000_0000L);
Web3j web3j = Web3j.build(new HttpService(url)); Credentials credentials = Credentials.create(key); ERC20 token = ERC20.load(contractAddress, web3j, credentials, new DefaultGasProvider()); String fromAddress = credentials.getAddress(); 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
| <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