Web3.0的测试题

任务: 在前端开发一个查询UI,查询当前用户账户的ETH余额和指定ERC20合约中的余额

目标:

  • UI框架指定使用 MUI (https://mui.com)
  • 需要查询到当前账户的ETH余额并展示在UI界面上
  • 需要输入ERC20合约地址后,查询到到当前账户在此ERC20合约中的余额,并展示在UI界面上

提示:

  • 需要安装 Metamask 插件
  • 链接到 Sepolia 网络
  • ERC20 合约地址 0x7939C9b7cE8BFFc6cb791eCB129f4c385e05727a
时间要求:24小时内给出相应网页,可以部署到github或其他托管平台,也可以通过腾讯会议运行demo代码演示

参考资料

  • https://web3camp.us/
  • https://github.com/web3camp-labs

实现:

首先,确保安装了MUI库和Web3.js库:

npm install @mui/material @emotion/react @emotion/styled web3

你可以创建一个JavaScript文件,并编写如下代码:

import React, { useState } from "react";
import Web3 from "web3";
import { Container, TextField, Button, Typography } from "@mui/material";

// 创建Web3实例连接到以太坊网络
const web3 = new Web3(window.ethereum);

// 定义要查询的ERC20合约地址
// const erc20ContractAddress = "0x7939C9b7cE8BFFc6cb791eCB129f4c385e05727a";

export default function Web3View() {
  const [ethBalance, setEthBalance] = useState(null);
  const [erc20Balance, setERC20Balance] = useState(null);
  const [erc20Address, setERC20Address] = useState("");

  // 检查是否有提供者可用
  if (typeof window.ethereum !== "undefined") {
    // 使用以太坊提供者进行初始化
    web3.setProvider(window.ethereum);
  } else {
    console.error("无可用的以太坊提供者");
  }

  // 查询当前用户账户的ETH余额
  async function handleGetEthBalance() {
    try {
      // 获取当前用户的账户地址
      const accounts = await web3.eth.requestAccounts();
      const account = accounts[0];

      // 使用web3.eth.getBalance方法查询ETH余额
      const balanceWei = await web3.eth.getBalance(account);

      // 将余额从Wei转换为ETH单位
      const balanceEth = web3.utils.fromWei(balanceWei, "ether");
      setEthBalance(balanceEth);
    } catch (error) {
      console.error("获取ETH余额失败:", error);
    }
  }

  // 查询指定ERC20合约中的余额
  async function handleGetERC20Balance() {
    try {
      // 获取当前用户的账户地址
      const accounts = await web3.eth.requestAccounts();
      const account = accounts[0];

      // 加载ERC20合约的ABI(应用二进制接口)
      const erc20ABI = [
        // 方法1:获取代币总供应量
        {
          constant: true,
          inputs: [],
          name: "totalSupply",
          outputs: [
            {
              name: "",
              type: "uint256",
            },
          ],
          payable: false,
          stateMutability: "view",
          type: "function",
        },
        // 方法2:获取指定地址的代币余额
        {
          constant: true,
          inputs: [
            {
              name: "_owner",
              type: "address",
            },
          ],
          name: "balanceOf",
          outputs: [
            {
              name: "balance",
              type: "uint256",
            },
          ],
          payable: false,
          stateMutability: "view",
          type: "function",
        },
        // 方法3:转账代币到指定地址
        {
          constant: false,
          inputs: [
            {
              name: "_to",
              type: "address",
            },
            {
              name: "_value",
              type: "uint256",
            },
          ],
          name: "transfer",
          outputs: [
            {
              name: "",
              type: "bool",
            },
          ],
          payable: false,
          stateMutability: "nonpayable",
          type: "function",
        },
      ]; // ERC20合约的ABI定义

      // 创建ERC20合约实例
      const erc20Contract = new web3.eth.Contract(erc20ABI, erc20Address);
      // 使用合约实例的balanceOf方法查询余额
      const balance = await erc20Contract.methods.balanceOf(account).call();
      setERC20Balance(balance.toString());
    } catch (error) {
      console.error("获取ERC20合约余额失败:", error);
    }
  }

  return (
    <Container maxWidth="sm">
      <Typography variant="h4" align="center" gutterBottom>
        查询账户余额
      </Typography>

      <Button variant="contained" onClick={handleGetEthBalance}>
        查询ETH余额
      </Button>
      {ethBalance && (
        <Typography variant="body1" gutterBottom>
          当前ETH余额:{ethBalance} ETH
        </Typography>
      )}

      <TextField
        label="ERC20合约地址"
        value={erc20Address}
        onChange={(e) => setERC20Address(e.target.value)}
        fullWidth
        margin="normal"
      />
      <Button variant="contained" onClick={handleGetERC20Balance}>
        查询ERC20余额
      </Button>
      {erc20Balance !== null && (
        <Typography variant="body1" gutterBottom>
          当前ERC20余额:{erc20Balance}
        </Typography>
      )}
    </Container>
  );
}

效果图:

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/127154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Hadoop】YARN容量调度器详解

&#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341;&#x1fa81;&#x1f341; &#x1fa81;&#x1f341;&am…

Chrony的基本原理

介绍 &#xff08;1&#xff09;Chrony是一个用于计算机系统时钟同步的程序。它使用网络时间协议NTP来与远程时间服务器通信&#xff0c;根据这些服务器提供的时间信息来调整系统时钟。Chrony具有高精度&#xff0c;可配置&#xff0c;易使用等特点。 &#xff08;2&#xff…

集成MCU的OTP-2.4G合封芯片XL2401D,收发一体 上手简单

芯岭技术的XL2401D是一颗2.4G合封芯片&#xff0c;收发一体。合封芯片可以很好的节省PCB面积和开发成本。一颗芯片可以做到之前两颗芯片才能做到的事情。XL2401D内含MCU为九齐NY8A054E。有九齐MCU开发经验的话开发起来非常容易上手。 XL2401D芯片是工作在2.400~2.483GHz世界通…

11.7加减计数器,可置位~,数字钟分秒,串转并,串累加转并,24位串并128,流水乘法器,一些乘法器

信号发生器 方波&#xff0c;就是一段时间内都输出相同的信号 锯齿波就是递增 三角波就是先增后减 加减计数器 当mode为1则加&#xff0c;Mode为0则减&#xff1b;只要为0就输出zero 这样会出问题&#xff0c;因为要求是十进制&#xff0c;但是这里并没有考虑到9之后怎么办&a…

分享76个Python管理系统源代码总有一个是你想要的

分享76个Python管理系统源代码总有一个是你想要的 下载链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;8888 项目名称 cms是一个基于kubernetes官方python SDKkubernetes开发的一个容器运维系统 Django erp 后台管理系统&#xff0c;仅限学习使用&#xff0c;不…

边缘计算如何改变数据存储?

边缘计算在整个价值链中提供多种优势——从降低成本到提高效率再到安全数据传输。该技术允许在源头收集和分析相关数据&#xff0c;这有助于减少延迟和带宽成本&#xff0c;同时显著提高计算过程的冗余系数和效率。 通过降低数据传输成本和损失&#xff0c;边缘计算帮助企业实现…

【MySQL习题】各个视频的平均完播率【全网最详细教学】

目录 数据表描述 问题描述 输出示例 解题思路【重点】 正解代码 数据表描述 有以下两张表&#xff1a; 表1&#xff1a;用户-视频互动表tb_user_video_log 数据举例&#xff1a; 说明&#xff1a; uid-用户ID,video_id-视频ID start_time-开始观看时间end_time-结束观…

【AI】自回归 (AR) 模型使预测和深度学习变得简单

自回归 (AR) 模型是统计和时间序列模型&#xff0c;用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域&#xff0c;包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关&#xff0c;这使得它们可用于建模和预测时…

Unity 跑酷游戏全部脚本(完结)

脚本1 触发器脚本 这个脚本是主角身上的脚本&#xff0c;用于检测是否碰到其他触发器&#xff0c;并做出对应的行为 using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliidisonTrigger : MonoBehaviour { //触发检测 …

docker部署mysql nginx redis

一.创建网络 # 创建网络 docker network create liming # 查看网络 docker network ls二.部署mysql 删除并重新创建mysql容器&#xff0c;并完成本地目录挂载&#xff1a; 挂载/software/mysql/data到容器内的/var/lib/mysql目录挂载/software/mysql/init到容器内的/docker-…

玄子Share-HTML5知识手册

玄子Share-HTML5知识手册 前言&#xff1a; 这一版 HTML 笔记&#xff0c;算是我写的第四版了&#xff0c;第三版对照课本编写&#xff0c;第四版则是对照 MDN 官方文档编写&#xff0c;不论是术语亦或专业性&#xff0c;都更上一层 文章依托 MDN 文档&#xff0c;拓展了大量课…

网络营销利器:海外IP代理如何助力你的网络营销?如何选择?

在当今数字化的时代&#xff0c;网络营销已经成为企业营销策略的重要组成部分。而对于进去海外市场的跨境玩家来说&#xff0c;海外的推广营销是重中之重。然而&#xff0c;在开展网络营销的过程中&#xff0c;我们常常会遇到各种挑战&#xff0c;如地域限制、访问速度慢等。 …

理解透彻API接口电商API接口有哪些?你需要一分钟看这篇文章

什么是API呢&#xff1f;老实说啊&#xff0c;象征非常基础的概念&#xff0c;我原本以为大家都已经非常接楚&#xff0c;但是被突然这么一问呢&#xff0c;觉得有必要来认真复习一下这个概念&#xff0c;因为在我看来啊&#xff0c;技术上的问题呢&#xff0c;就没有高低贵贱之…

Docker Desktop 和 WSL2 位置迁移

迁移 WSL2 安装位置 WSL2 默认安装在 C 盘&#xff0c;我们可以通过以下步骤迁移安装位置 通过以下命令列出已安装的 Linux 发行版&#xff1a; wsl -l -v可以看到已安装了 Ubuntu-22.04&#xff0c;其运行状态为&#xff1a;Stopped 如果运行状态为 Running&#xff0c;需…

洛谷 Equalize the Remainders

洛谷没提供中文题面&#xff0c;这里大致翻译一下&#xff1a; 可以进行的操作&#xff1a;任选一个数加一。 一共有n个整数&#xff0c;还有一个约数m&#xff0c;n个数都对m进行求余&#xff0c;累计余数的数量&#xff0c;要求每个余数都有n/m个。 对于样例1的输入&#xff…

JavaScript使用Ajax

Ajax(Asynchronous JavaScript and XML)是使用JavaScript脚本&#xff0c;借助XMLHttpRequest插件&#xff0c;在客户端与服务器端之间实现异步通信的一种方法。2005年2月&#xff0c;Ajax第一次正式出现&#xff0c;从此以后Ajax成为JavaScript发起HTTP异步请求的代名词。2006…

bilibili快速升满级(使用Docker 容器脚本)

部署bilibili升级运行容器脚本 docker run --name"bili" -v /bili/Logs:/app/Logs -e Ray_DailyTaskConfig__Cron"30 9 * * *" -e Ray_LiveLotteryTaskConfig__Cron"40 9 * * *" -e Ray_UnfollowBatchedTaskConfig__Cron"…

传来喜讯,优维又获奖了!!!

优维科技作为国内DevOps领域的行业领先企业&#xff0c;从诞生之日起&#xff0c;就一直致力于为中国企业提供一流的数字化运维服务&#xff0c;不断深耕核心技术&#xff0c;向客户提供专业强大的产品与服务。多年来&#xff0c;不仅获得了大量客户认可&#xff0c;更是屡次获…

宠物商城系统

源码下载地址 支持&#xff1a;远程部署/安装/调试、讲解、二次开发/修改/定制 宠物商城系统&#xff0c;支持登录、注册、浏览、搜索、详情页、加入购物车。比较简单