<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Magician-ContractsTools智能合約工具包

          聯(lián)合創(chuàng)作 · 2023-09-18 15:00

           Magician-ContractsTools 是一個用于調(diào)用智能合約的工具包,你可以非常容易地在Java程序中調(diào)用智能合約進(jìn)行查詢和寫入操作。

          有三個內(nèi)置的標(biāo)準(zhǔn)合約模板,分別是ERC20、ERC721和ERC1155,如果你需要調(diào)用這三個合約中的標(biāo)準(zhǔn)函數(shù),可以幫助你非常快速地完成工作。除了內(nèi)置的合同模板外,如果你需要調(diào)用自定義的合同函數(shù)也是很容易的,以后我們還會繼續(xù)增加標(biāo)準(zhǔn)模板。

          此外,還有InputData解碼和ETH查詢和轉(zhuǎn)移的工具

          計劃支持三種鏈,ETH(BSC、POLYGON等)、SOL和TRON

          導(dǎo)入依賴

          <dependency>
              <groupId>com.github.yuyenews</groupId>
              <artifactId>Magician-ContractsTools</artifactId>
              <version>1.0.1</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", // 要調(diào)用的方法名稱
                              new Address(toAddress) // 方法的參數(shù),如果有多個,可以繼續(xù)傳入下一個參數(shù)
                      ),  // 要調(diào)用的方法的inputData
                      new TypeReference<Uint256>() {} // 方法的返回類型,如果有多個返回值,可以繼續(xù)傳入下一個參數(shù)
                  );
          

           寫入合約

          // 往合約里寫入數(shù)據(jù)
          SendResultModel sendResultModel = ethContractUtil.sendRawTransaction(
                          SendModel.builder()
                                  .setSenderAddress("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84") // 調(diào)用者的地址
                                  .setPrivateKey("")// senderAddress的私鑰
                                  .setToAddress("0x428862f821b1A5eFff5B258583572451229eEeA6") // 合約地址
                                  .setValue(new BigInteger("1000000000")) // 主鏈幣數(shù)量,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasPrice(new BigInteger("1000")) // gasPrice,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasLimit(new BigInteger("800000")) // gasLimit,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                          EthAbiCodecTool.getInputData(
                                  "transfer", // 要調(diào)用的方法名稱
                                  new Address(toAddress), // 方法的參數(shù),如果有多個,可以繼續(xù)傳入下一個參數(shù)
                                  new Uint256(new BigInteger("1000000000000000000")) // 方法的參數(shù),如果有多個,可以繼續(xù)傳入下一個參數(shù)
                          ) // 要調(diào)用的方法的inputData
                      );
          
          sendResultModel.getEthSendTransaction(); // 發(fā)送交易后的結(jié)果
          sendResultModel.getEthGetTransactionReceipt(); // 交易成功上鏈后的結(jié)果

          合約模板

          目前只有三種模板,后面會繼續(xù)增加,為了節(jié)約篇幅 所以這里只展示ERC20的用法,詳情可以看官網(wǎng)文檔

          調(diào)用ERC20合約

          初始化合約模板

          Web3j web3j = Web3j.build(new HttpService("https://data-seed-prebsc-2-s1.binance.org:8545"));
          
          String contractAddress = "";
          
          ERC20Contract erc20Contract = ERC20Contract.builder(web3j, contractAddress);

          查詢

          // 調(diào)用合約的 totalSupply 函數(shù)
          BigInteger total = erc20Contract.totalSupply();
          
          // 調(diào)用合約的 balanceOf 函數(shù)
          BigInteger amount = erc20Contract.balanceOf("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84");
          
          // 調(diào)用合約的 allowance 函數(shù)
          BigInteger amount = erc20Contract.allowance("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", "0x552115849813d334C58f2757037F68E2963C4c5e");

          寫入

          // 調(diào)用合約的 transfer 函數(shù)
          SendResultModel sendResultModel = erc20Contract.transfer(
                          "0x552115849813d334C58f2757037F68E2963C4c5e", // 轉(zhuǎn)賬接收人
                          new BigInteger("1000000000000000000"), // 轉(zhuǎn)賬金額
                          SendModel.builder()
                                  .setSenderAddress("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84") // 調(diào)用者的地址
                                  .setPrivateKey("")// senderAddress的私鑰
                                  .setValue(new BigInteger("1000000000")) // 主鏈幣數(shù)量,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasPrice(new BigInteger("1000")) // gasPrice,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasLimit(new BigInteger("800000")) // gasLimit,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                  );
          sendResultModel.getEthSendTransaction(); // 發(fā)送交易后的結(jié)果
          sendResultModel.getEthGetTransactionReceipt(); // 交易成功上鏈后的結(jié)果
          
          // 調(diào)用合約的 transferFrom 函數(shù)
          SendResultModel sendResultModel = erc20Contract.transferFrom(
                          "0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84", // 轉(zhuǎn)賬付款人
                          "0x552115849813d334C58f2757037F68E2963C4c5e", // 轉(zhuǎn)賬接收人
                          new BigInteger("1000000000000000000"), // 轉(zhuǎn)賬金額
                          SendModel.builder()
                                  .setSenderAddress("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84") // 調(diào)用者的地址
                                  .setPrivateKey("")// senderAddress的私鑰
                                  .setValue(new BigInteger("1000000000")) // 主鏈幣數(shù)量,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasPrice(new BigInteger("1000")) // gasPrice,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasLimit(new BigInteger("800000")) // gasLimit,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                  );
          sendResultModel.getEthSendTransaction(); // 發(fā)送交易后的結(jié)果
          sendResultModel.getEthGetTransactionReceipt(); // 交易成功上鏈后的結(jié)果
          
          // 調(diào)用合約的 approve 函數(shù)
          SendResultModel sendResultModel = erc20Contract.approve(
                          "0x552115849813d334C58f2757037F68E2963C4c5e", // 被授權(quán)人
                          new BigInteger("1000000000000000000"), // 授權(quán)金額
                          SendModel.builder()
                                  .setSenderAddress("0xb4e32492E9725c3215F1662Cf28Db1862ed1EE84") // 調(diào)用者的地址
                                  .setPrivateKey("")// senderAddress的私鑰
                                  .setValue(new BigInteger("1000000000")) // 主鏈幣數(shù)量,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasPrice(new BigInteger("1000")) // gasPrice,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                                  .setGasLimit(new BigInteger("800000")) // gasLimit,如果想用默認(rèn)值 可以直接傳null,或者不傳這個參數(shù)
                  );
          sendResultModel.getEthSendTransaction(); // 發(fā)送交易后的結(jié)果
          sendResultModel.getEthGetTransactionReceipt(); // 交易成功上鏈后的結(jié)果

          InputData 編解碼

          // 編碼
          String inputData = EthAbiCodecTool.getInputData(
                      "transfer", // 方法名
                      new Address(toAddress), // 參數(shù)1
                      new Uint256(new BigInteger("1000000000000000000")) // 參數(shù)2,如果還有其他參數(shù),可以繼續(xù)傳入下一個
              );
          
          // 解碼
          List<Type> result = EthAbiCodecTool.decoderInputData(
                      "0x" + inputData.substring(10), // 去除方法簽名的inputData
                      new TypeReference<Address>() {}, // 被編碼的方法的參數(shù)1 類型
                      new TypeReference<Uint256>() {} // 被編碼的方法的參數(shù)2 類型, 如果還有其他參數(shù),可以繼續(xù)傳入下一個
              );
          
          for(Type type : result){
              System.out.println(type.getValue());
          }
          
          // 獲取方法簽名,其實就是inputData的前十位
          String functionCode = EthAbiCodecTool.getFunAbiCode(
                      "transfer", // 方法名
                      new Address(toAddress), // 參數(shù)1,值隨意傳,反正我們要的方法簽名,不是完整的inputData
                      new Uint256(new BigInteger("1000000000000000000")) // 參數(shù)2,值隨意傳,反正我們要的方法簽名,不是完整的inputData,如果還有其他參數(shù),可以繼續(xù)傳入下一個
              );

          文檔地址

          https://magician-io.com/chain

           

           

           

          瀏覽 27
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          編輯 分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  自拍偷拍在 | 日本最大黄色视频网站 | 日本三级高清视频组 | a毛一级a一级a免费观看视频 | 国产操美女|