首页 > 其他分享 >使用hardhat + ganache进行本地solidity开发

使用hardhat + ganache进行本地solidity开发

时间:2023-12-11 09:35:44浏览次数:24  
标签:await name solidity ganache address hardhat type internalType

hardhat是有本地开发网络的,但ganache是个有界面的程序,也是在本地模拟一个以太坊链,但是界面比较漂亮一些。

hardhat.config.js

require("@nomicfoundation/hardhat-toolbox");

/** @type import('hardhat/config').HardhatUserConfig */
module.exports = {
  solidity: "0.8.19",

  networks: {
    ganache: {
      url: "http://127.0.0.1:7545",
      accounts: ["0x624cfb2cb9b9c3212abfa2800fd8de8e2501c84500336007f4459c50198c69f7"]
    }
  }
};

如上,本地装好ganache并启动以后,我们在里边找一个账户对应的私钥0x624cfb2cb9b9c3212abfa2800fd8de8e2501c84500336007f4459c50198c69f7,把他配置到hardhat.config.js里,ganache的rpc地址默认是http://127.0.0.1:7545,以上我们命名一个名叫ganache的网络。

这样我们就可以部署并测试合约了,例如:npx hardhat run scripts/testcall.js --network ganache
以及: npx hardhat run scripts/deploy.js --network ganache

合约的编写、测试、部署,参照hardhat官方的tuitorial的Token合约:https://hardhat.org/tutorial

这里再补充一个合约部署好以后如何对方法进行调用测试的例子:
scripts/testcall.js

const { ethers } = require("hardhat");

const contractABI = [
    {
      "inputs": [],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        }
      ],
      "name": "Transfer",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "name",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "symbol",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "transfer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ];

async function main(){
    const contractAddress = "0xFb9f331194eE63630f3d2A7B76Aa1f9C94D18878";
    const provider = ethers.getDefaultProvider("http://localhost:7545/");

    //获取地址有多少ETH,获取当前区块高度
    const queryAddress = "0xF7A1938Fecc594aaF126d46fd173cE74A659ad9A";
    let ethBalance = await provider.getBalance(queryAddress);
    console.log("地址%s有%s个ETH", queryAddress, ethBalance);
    let blockNumber = await provider.getBlockNumber();
    console.log("当前链上区块高度%s", blockNumber);

    //调用合约方法
    //查询(调用合约的balanceOf方法)
    let tokenContract = await new ethers.Contract(contractAddress, contractABI, provider);
    let tokenBalance = await tokenContract.balanceOf(queryAddress);
    console.log("地址%s有%s个Token", queryAddress, tokenBalance);
    tokenBalance = await tokenContract.balanceOf("0x72BbA0fE9D0dA19b27705BCdDAb783BeED24bbDb");
    console.log("地址%s有%s个Token", "0x72BbA0fE9D0dA19b27705BCdDAb783BeED24bbDb", tokenBalance);
    //写(调用合约的transfer方法)
    let signer = await new ethers.Wallet("0x624cfb2cb9b9c3212abfa2800fd8de8e2501c84500336007f4459c50198c69f7", provider);
    let tokenContractConnected = await tokenContract.connect(signer);
    let txn = await tokenContractConnected.transfer("0x72BbA0fE9D0dA19b27705BCdDAb783BeED24bbDb", 100);

    //再次查询
    tokenBalance = await tokenContract.balanceOf(queryAddress);
    console.log("地址%s有%s个Token", queryAddress, tokenBalance);
    tokenBalance = await tokenContract.balanceOf("0x72BbA0fE9D0dA19b27705BCdDAb783BeED24bbDb");
    console.log("地址%s有%s个Token", "0x72BbA0fE9D0dA19b27705BCdDAb783BeED24bbDb", tokenBalance);
}

main()
.then(() => {
    process.exit(0);
})
.catch((error) => {
    console.error(error);
    process.exit(1);
});

标签:await,name,solidity,ganache,address,hardhat,type,internalType
From: https://www.cnblogs.com/lyhero11/p/17893673.html

相关文章

  • Solidity基本语法学习4
    文档:https://solidity-by-example.org/视频教程:https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p说明:本文内容:FunctionModifier,Events,Constructor,Inheritance,ShadowingInheritedStateVariables,CallingParentCon......
  • Solidity基本语法学习3
    文档:https://solidity-by-example.org/视频教程:https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p说明:本文内容:Enum,struct,datalocation,function,ViewandPureFunction,ErrorEnum(枚举)Solidity支持枚举,这对modelch......
  • Solidity基本概念学习2
    文档:https://solidity-by-example.org/视频教程:https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-p说明看视频没注意有文档,前面写了一篇好多废话,之后结合文档+视频去做笔记和写代码,做记录...常量(constant)常量是不能修改的......
  • Solidity初学
    https://www.youtube.com/watch?v=xv9OmztShIw&list=PLO5VPQH6OWdVQwpQfw9rZ67O6Pjfo6q-phelloworld//SPDX-License-Identifier:MIT//如果没有上面的license就会出现黄色warning,挺难看的..pragmasolidity^0.8;//指定solidity编译版本,带了^号说明要在该版本(0.8)......
  • solidity--time
    1//SPDX-License-Identifier:GPL-3.0-or-later23pragmasolidity>=0.8.0;45contractdatetime{67constructor(){89}101112functiongetBlockTime()publicviewreturns(uint256){1314returnbl......
  • 使用hardhat框架,将合约部署到Sepolia测试网中
    1.在hardhat.config.js中写入sepolia的测试网路径,以及自己私有钱包的密钥将自己的默认网络设置为测试网的网络,注意solidity的版本号要保持一致 2.在.env文件中填写基本参数,添加dotenv便于读  3.在etherscan.io/myapikey里面获取自己的apikey并添加到.env中 注意:在用ha......
  • Web3.0热门领域NFT项目实战-深度掌握Solidity合约开发,助力Web3.0工程师
    Web3.0热门领域NFT项目实战-深度掌握Solidity合约开发,助力Web3.0工程师免费自动批量生成NFT图片和批量部署NFT一、环境准备1.注意:需合理上网2.准备素材:准备一套多个属性元素的不一样的图层素材,比如10张背景图、10张face图、10张眼睛图层、10张头发图层等,每张图特性不一样,像......
  • solidity入门
    1.solidity简介Solidity(中文名称:Solidity语言)是一种面向智能合约(SmartContracts)的高级编程语言,最初由以太坊(Ethereum)的团队开发并用于以太坊平台上的智能合约编写。Solidity的设计目标是简化以太坊智能合约的开发,使开发者能够创建安全、可靠的去中心化应用程序(DApps)。以下......
  • 【从0学习Solidity】14. 抽象合约和接口
    【从0学习Solidity】14.抽象合约和接口博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于......
  • 【从0学习Solidity】13. 继承
    【从0学习Solidity】13.继承博主简介:不写代码没饭吃,一名全栈领域的创作者,专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构,分享一些项目实战经验以及前沿技术的见解。关注我们的主页,探索全栈开发,期待与您一起在移动开发的世界中,不断进步和创造!本文收录于不写代码没......