首页>>资讯>>学院

DApp实战之ERC20从前端到合约

2024-02-29 15:24:35 247

本次将从合约到前端,从零到一构建ERC20的Dapp。对于合约,这里选择openzeppelin第三方库和hardhat构建工具来做开发;对于前端,这里选择React和wagmi来与合约交互。


「注意:node和npm相关内容这里不做陈述」


前置工作

安装node环境。

安装metamask插件。


harthat启动,添加到metamask网络中


npn初始化项目,会生成package.json文件。


npm init -y


npm安装hardhat和@nomicfoundation/hardhat-toolbox。


npm install --save-dev hardhat @nomicfoundation/hardhat-toolbox


新建hardhat.config.js,配置solidity版本。更多hardhat配置可参考官网。


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

module.exports = {

  solidity: "0.8.24",

};


启动hardhat本地节点,可以看到WebSocket JSON-RPC server at http://127.0.0.1:8545/


npx hardhat node


添加到metamask网络中,如下图:

1.png

添加账号到metamask,私钥可在启动hardhat本地节点时获得。


wagmi链接metamask


构建react项目。(如何启动项目可以上网搜一下,如果实在不会可以私信作者)


npx create-react-app erc20front


安装wagmi。


npm install wagmi viem@2.x @tanstack/react-query


新建wagmi.config.js配置文件


import { http, createConfig } from"wagmi";

import { hardhat } from"wagmi/chains";


exportconst config = createConfig({

  chains: [hardhat],

  transports: {

    [hardhat.id]: http(),

  },

});


新建wallet-option.js,代码这里不展示。


app.js引入wagmi相关组件以及wallet-option组件。


import { QueryClient, QueryClientProvider } from"@tanstack/react-query";

import { WagmiProvider } from"wagmi";

import { config } from"./wagmi.config";


import { WalletOptions } from"./wallet-options";


const queryClient = new QueryClient();


function App() {

  return (

    <WagmiProvider config={config}>

      <QueryClientProvider client={queryClient}>

        <WalletOptions></WalletOptions>

      </QueryClientProvider>

    </WagmiProvider>

  );

}


exportdefault App;


当点击按钮时,效果如下:

1.png

编写并部署ERC20合约


在harhat项目下安装@openzeppelin/contracts。

npm install @openzeppelin/contracts


创建contracts/MyToken.sol文件。


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;


import"@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract MyToken is ERC20 {

    constructor() ERC20("DogWangCoin","DWC"){

        _mint(msg.sender,1000000 * 10 ** decimals());

    }

}


编译合约,成功编译之后会生成abi文件。


npx hardhat compile


新建scripts/index.js脚本,用于部署合约。


import { ethers } from"hardhat";


asyncfunction main() {

  const MyToken = await ethers.getContractFactory("MyToken");

  const myToken = await MyToken.deploy();

  const address = await myToken.getAddress();

  console.log(address);

}


main();


部署合约到本地节点,会生成一个合约地址。


npx hardhat run scripts/index.js --network localhost


address:0x31403b1e52051883f2Ce1B1b4C89f36034e1221D


前端合约交互


查询余额


const balanceOf = useReadContract({

    address: "0x31403b1e52051883f2Ce1B1b4C89f36034e1221D",

    abi: MyTokenJSON.abi,

    functionName: "balanceOf",

    args: [value],

});


const getBalance = async () => {

    const { data } = await balanceOf.refetch(value);

    setData(formatEther(data));

};


转账


const { writeContract } = useWriteContract();


const res = await writeContract({

        address: "0x31403b1e52051883f2Ce1B1b4C89f36034e1221D",

        abi: MyTokenJSON.abi,

        functionName: "transfer",

        args: [to, amount],

});


其他操作与之类似,更多前端代码可查看github:「https://github.com/wmjchf/erc20front」

声明:本网站所有相关资料如有侵权请联系站长删除,资料仅供用户学习及研究之用,不构成任何投资建议!