Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约

这篇具有很好参考价值的文章主要介绍了Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Magician-ContractsTools是一个用于调用智能合约的工具包,你可以非常容易地在Java程序中调用智能合约进行查询和写入操作。

有三个内置的标准合约模板,分别是ERC20、ERC721和ERC1155,如果你需要调用这三个合约中的标准函数,可以帮助你非常快速地完成工作。除了内置的合同模板外,如果你需要调用自定义的合同函数也是很容易的。

一、导入依赖

<dependency>
    <groupId>com.github.yuyenews</groupId>
    <artifactId>Magician-ContractsTools</artifactId>
    <version>1.0.0</version>
</dependency>

<!-- This is the logging package, you must have it or the console will not see anything, any logging package that can bridge with slf4j is supported -->
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-jdk14</artifactId>
    <version>1.7.12</version>
</dependency>

二、合约查询 以及 写入

String privateKey = ""; // 私钥
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-1-s1.binance.org:8545/")); // 链的RPC地址
String contractAddress = "";

EthContractUtil ethContractUtil = EthContractUtil.builder(web3j);

// 查询
List<Type> result = ethContractUtil.select(
            contractAddress, // 合约地址
            EthAbiCodecTool.getInputData(
                    "balanceOf", // 要调用的方法名称
                    new Address(toAddress) // 方法的参数,如果有多个,可以继续传入下一个参数
            ),  // 要调用的方法的inputData
            new TypeReference<Uint256>() {} // 方法的返回类型,如果有多个返回值,可以继续传入下一个参数
        );

// 往合约里写入数据
// gasPrice,gasLimit 两个参数,如果想用默认值可以不传,或者传null
// 如果不传的话,两个参数都必须不传,要传就一起传, 如果设置为null的话,可以一个为null,一个有值
SendResultModel sendResultModel = ethContractUtil.sendRawTransaction(
                    senderAddress, // 调用者的地址
                    contractAddress, // 合约地址
                    privateKey, // senderAddress的私钥
                    new BigInteger("1200000"), // gasPrice,如果想用默认值 可以直接传null,或者不传这个参数
                    new BigInteger("800000"), // gasLimit,如果想用默认值 可以直接传null,或者不传这个参数
                    EthAbiCodecTool.getInputData(
                            "transfer", // 要调用的方法名称
                            new Address(toAddress), // 方法的参数,如果有多个,可以继续传入下一个参数
                            new Uint256(new BigInteger("1000000000000000000")) // 方法的参数,如果有多个,可以继续传入下一个参数
                    ) // 要调用的方法的inputData
            );

sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

三、调用ERC20合约

查询

提供合约地址查询view方法,比如totalSupply总量,balanceOf余额,allowance授权等信息。

Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));

String contractAddress = "";

ERC20Contract erc20Contract = ERC20Contract.builder(web3j, contractAddress);


// 调用合约的 totalSupply 函数
BigInteger total = erc20Contract.totalSupply();

// 调用合约的 balanceOf 函数
BigInteger amount = erc20Contract.balanceOf("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");

// 调用合约的 allowance 函数
BigInteger amount = erc20Contract.allowance("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");
写入

可以发起transfertransferFrom等函数,可自定义gasPricegasLimit等参数值。交易发起成功后可查询交易结果。

Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));

String contractAddress = "";

ERC20Contract erc20Contract = ERC20Contract.builder(web3j, contractAddress);


// 调用合约的 transfer 函数
SendResultModel sendResultModel = erc20Contract.transfer(
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                new BigInteger("1000000000000000000"), // 转账金额
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用合约的 transferFrom 函数
SendResultModel sendResultModel = erc20Contract.transferFrom(
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                new BigInteger("1000000000000000000"), // 转账金额
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用合约的 approve 函数
SendResultModel sendResultModel = erc20Contract.approve(
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人
                new BigInteger("1000000000000000000"), // 授权金额
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

四、调用ERC721合约

查询
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));

String contractAddress = "";

ERC721Contract erc721Contract = ERC721Contract.builder(web3j, contractAddress);

// 调用合约的 balanceOf 函数
BigInteger amount = erc20Contract.balanceOf("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");

// 调用合约的 ownerOf 函数
String ownerAddress = erc721Contract.ownerOf(new BigInteger("1002"));

// 调用 isApprovedForAll 函数
Boolean result = erc1155Contract.isApprovedForAll("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");

// 调用 getApproved 函数
String approvedAddress = erc721Contract.getApproved(new BigInteger("1002"));

写入
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));

String contractAddress = "";

ERC721Contract erc721Contract = ERC721Contract.builder(web3j, contractAddress);

// 调用 approve 函数
SendResultModel sendResultModel = erc721Contract.approve(
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人
                new BigInteger("1002"), // 授权的tokenId
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用合约的 transferFrom 函数
SendResultModel sendResultModel = erc20Contract.transferFrom(
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                new BigInteger("1002"), // tokenId
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用合约的 safeTransferFrom 函数(没有data参数的那个)
SendResultModel sendResultModel = erc20Contract.safeTransferFrom(
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                new BigInteger("1002"), // tokenId
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用合约的 safeTransferFrom 函数(有data参数的那个)
SendResultModel sendResultModel = erc20Contract.safeTransferFrom(
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                new BigInteger("1002"), // tokenId
                new byte[0], // data
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用 setApprovalForAll 函数
SendResultModel sendResultModel = erc1155Contract.setApprovalForAll(
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人
                true, // 是否授权全部
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

五、调用ERC1155合约

查询
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));

String contractAddress = "";

ERC1155Contract erc1155Contract = ERC1155Contract.builder(web3j, contractAddress);

// 调用 balanceOf 函数
BigInteger amount = erc1155Contract.balanceOf("0x552115849813d334C58f2757037F68E2963C4c5e", new BigInteger("0"));

// 调用 balanceOfBatch 函数
List<String> address = new ArrayList<>();
address.add("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");
address.add("0x552115849813d334C58f2757037F68E2963C4c5e");

List<BigInteger> tokenId = new ArrayList<>();
tokenId.add(new BigInteger("0"));
tokenId.add(new BigInteger("0"));

List<BigInteger> amounts = erc1155Contract.balanceOfBatch(address, tokenId);

// 调用 isApprovedForAll 函数
Boolean result = erc1155Contract.isApprovedForAll("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");
写入
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));

String contractAddress = "";

ERC1155Contract erc1155Contract = ERC1155Contract.builder(web3j, contractAddress);

// 调用 setApprovalForAll 函数
SendResultModel sendResultModel = erc1155Contract.setApprovalForAll(
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 被授权人
                true, // 是否授权全部
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用 safeTransferFrom 函数
SendResultModel sendResultModel = erc1155Contract.safeTransferFrom(
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                new BigInteger("1002"), // tokenId
                new BigInteger("1"), // 数量
                new byte[0], // data
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

// 调用 safeBatchTransferFrom 函数
List<BigInteger> tokenIds = new ArrayList<>();
tokenIds.add(new BigInteger("1002"));
tokenIds.add(new BigInteger("1003"));

List<BigInteger> amounts = new ArrayList<>();
amounts.add(new BigInteger("1"));
amounts.add(new BigInteger("10"));

SendResultModel sendResultModel = erc1155Contract.safeBatchTransferFrom(
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 转账付款人
                "0x552115849813d334C58f2757037F68E2963C4c5e", // 转账接收人
                tokenIds, // tokenId 集合
                amounts, // 数量 集合
                new byte[0], // data
                "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 调用者的地址
                "", // 调用者的私钥
                null, // gasPrice,如果传null,自动使用默认值
                null // gasLimit,如果传null,自动使用默认值
        );
sendResultModel.getEthSendTransaction(); // 发送交易后的结果
sendResultModel.getEthGetTransactionReceipt(); // 交易成功上链后的结果

六、InputData 编解码

// 编码
String inputData = EthAbiCodecTool.getInputData(
            "transfer", // 方法名
            new Address(toAddress), // 参数1
            new Uint256(new BigInteger("1000000000000000000")) // 参数2,如果还有其他参数,可以继续传入下一个
    );

// 解码
List<Type> result = EthAbiCodecTool.decoderInputData(
            "0x" + inputData.substring(10), // 去除方法签名的inputData
            new TypeReference<Address>() {}, // 被编码的方法的参数1 类型
            new TypeReference<Uint256>() {} // 被编码的方法的参数2 类型, 如果还有其他参数,可以继续传入下一个
    );

for(Type type : result){
    System.out.println(type.getValue());
}

// 获取方法签名,其实就是inputData的前十位
String functionCode = EthAbiCodecTool.getFunAbiCode(
            "transfer", // 方法名
            new Address(toAddress), // 参数1,值随意传,反正我们要的方法签名,不是完整的inputData
            new Uint256(new BigInteger("1000000000000000000")) // 参数2,值随意传,反正我们要的方法签名,不是完整的inputData,如果还有其他参数,可以继续传入下一个
    );

七、主链币查询以及转账

提供地址的私钥可以完成对该钱包的余额查询和发起转账等操作。文章来源地址https://www.toymoban.com/news/detail-507842.html

String privateKey = ""; // 私钥
Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-1-s1.binance.org:8545/")); // 链的RPC地址

// 这种方式是单例的
EthHelper ethHelper =  MagicianWeb3.getEthBuilder().getEth(web3j);
// 如果你想创建多个EthHelper对象,可以用这种方式
EthHelper ethHelper = EthHelper.builder(web3j);

// 余额查询
BigInteger balance = ethHelper.balanceOf(fromAddress);

// 转账
TransactionReceipt transactionReceipt = ethHelper.transfer(
            toAddress,
            privateKey, 
            BigDecimal.valueOf(1),
            Convert.Unit.ETHER
);

到了这里,关于Java智能合约工具包|Java调用智能合约|Java调用ERC20、ERC721、ERC1155合约的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • oneAPI人工智能分析工具包实现图像处理

    oneAPI人工智能分析工具包实现图像处理

    oneAPI是一个由英特尔(Intel)主导的、面向异构计算的开放标准和平台。它旨在简化和加速跨多种硬件架构的应用程序开发,包括CPU、GPU、FPGA和其他加速器。 以下是关于oneAPI发展的一些要点: 1.创立背景和目标: oneAPI的发展始于英特尔意识到在异构计算时代,开发者面临的

    2024年02月11日
    浏览(14)
  • 关于以太坊ERC-20通证智能合约协议

    ERC代表“Etuereum Request for Comment”,以太坊社区为了创建一个以太坊平台的标准,开发人员提交了一个以太坊改进方案(EIP),改进方案中包括协议规范和合约标准。最终确定的EIP为以太坊开发者提供了一套可实施的标准。这使得智能合约可以遵循这些通用的接口标准来构建。可

    2024年02月04日
    浏览(11)
  • 智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击

    Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 ERC777 进行了全面的解释,涵盖了所有必要的细节。深入研究 ERC777 代币的具体细节的资源

    2024年02月04日
    浏览(7)
  • 【Java】YAML读写常用工具包及使用示例

    YAML是一种常用的数据序列化格式,在Java应用程序中读写YAML数据是常见的任务。本文介绍了三个受欢迎的Java工具包:SnakeYAML、Jackson Dataformat YAML和YAMLBeans,它们都提供了读写YAML数据的功能。本文将逐一介绍这些工具包的特点、Maven依赖配置,并给出使用示例。最后,本文总结

    2024年02月04日
    浏览(10)
  • 前端VUE使用web3调用小狐狸(metamask)和合约(ERC20)交互

    前端VUE使用web3调用小狐狸(metamask)和合约(ERC20)交互

    1.创建vue项目 2.安装web3 npm install web3 3.项目web3 main.js 项目结构 页面代码中引用web3,倒入ERC20代币的abi 项目页面   调用小狐狸metamask演示   项目任何难题,可以加入qq群:981921011      

    2024年02月15日
    浏览(12)
  • 以太坊怎么扫块?推荐你一个Java工具包

    Magician-web3,开发语言是 java ,底层依赖了 Web3J , 废话不多说,直接上示例 监听器 可以创建多个,根据你的需求 分别设置监听条件

    2024年02月16日
    浏览(12)
  • 通过metamask与合约交互(发送ERC20 TOKEN/原生TOKEN/方法调用) javascrpt实现

    通过metamask与合约交互(发送ERC20 TOKEN/原生TOKEN/方法调用) javascrpt实现

    1. 首先引入web3.js最新版本 ,再引入 jquery 遇到合约有ABI文件.个人习惯单独保存ABI文件.通过jquery远程读取. 实例化合约后直接在链上与合约交互 通过按钮什么的触发后就可以通过代码转账了.  2. 无ABI与合约交互,因为有的合约闭源了,所以我们直接手工构造data参数内容,免去了实

    2024年02月16日
    浏览(10)
  • Java扫描区块链的工具包|Java扫块|监听token转账

    Magician-Scanning是一个用Java开发的扫描区块链的工具包,当我们在程序中需要一些功能时,它可以派上用场,比如说。 当一个地址收到ETH时,程序中的一个方法会被自动触发,这个交易会被传入该方法。 当一个合约的某个功能被调用时(比如 ERC20 转账),它会自动触发程序中

    2024年01月17日
    浏览(7)
  • Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示

    Java+GeoTools(开源的Java GIS工具包)快速入门-实现读取shp文件并显示

    GeoTools 是一个开源的 Java GIS 工具包,可利用它来开发符合标准的地理信息系统。 GeoTools 提供了 OGC (Open Geospatial Consortium) 规范的一个实现来作为他们的开发。 官网地址: GeoTools The Open Source Java GIS Toolkit — GeoTools 参考其quick start教程,实现集成到maven项目中并运行示例代码。

    2024年02月08日
    浏览(11)
  • JAVA深化篇_26——Apache commons-io工具包的使用

    Apache基金会介绍 Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。在它所支持的Apache项目与子项目中,所发行的软件产品都遵循Apache许可证(Apache License)。 官方网址为:www.apache.org 。 很多著名的Java开源项目

    2024年02月06日
    浏览(24)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包