Web3.0的测试题

news2024/11/29 20:41:34

任务: 在前端开发一个查询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>
  );
}

效果图:

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【GEE】6、在 Google 地球引擎中构建各种遥感指数

1简介 在本模块中&#xff0c;我们将讨论以下概念&#xff1a; 如何在 GEE 中重命名图像的波段。如何使用已有的遥感指数。如何使用波段数学生成自己的遥感指数。 一个田地已经灌溉的年数的卫星图像。灌溉水最可能的来源是奥加拉拉含水层。图片来自科罗拉多州霍利奥克附近。资料…

测试开发路线大纲与总结

一、什么是测试开发&#xff1f; 测试开发&#xff08;Test Development&#xff09;是一种结合软件测试和软件开发的角色和实践。测试开发人员负责设计、开发和维护自动化测试工具、测试框架和测试脚本&#xff0c;以支持测试流程的自动化和优化。他们与开发团队和质量保证&a…

云尘靶场 Medium_Socnet 内网为docker 无站代理 不存在gcc的提权方式 解决ldd过高无法执行exp 指定so文件

首先我们可以通过 arp-scan 扫描当前内网中的存活 但是不知道为什么扫不出来 然后我们使用fscan可以获取存活 这里大致扫描只开了22端口 所以我们使用nmap进行信息收集扫描 nmap -sS -sV -A -p- 172.25.0.13通过tcp 进行 版本服务扫描 并且检测系统版本 全端口 这里我们可以…

VUE多语言i18n配置

1、i18n官网 格式化 | Vue I18n 2、安装i18n 8---指版本号 // vue2必须安装8版本的i18n包&#xff0c;vue3必须安装9版本的i18n包。 npm i vue-i18n8 3、卸载i18n npm uninstall vue-i18n 4、安装 js-cookie npm install vue-cookies --save 5、代码 5.1 main.js /…

睿思BI已支持3D图形

从睿思BI旗舰版V5.3开始&#xff0c;系统支持如下3D图形&#xff1a; 3D地球 3D地图 飞线图 3D金字塔 睿思BI采用ThreeJS实现3D功能&#xff0c;用户也可以基于系统接口&#xff0c;采用ThreeJS在数据大屏中实现自己的3D图形。 系统演示地址&#xff1a;睿思BI旗舰版https://…

BI数据可视化:不要重复做报表,只需更新数据

BI数据可视化是一种将大量数据转化为视觉形式的过程&#xff0c;使得用户可以更容易地理解和分析数据。然而&#xff0c;传统的报表制作过程往往需要手动操作&#xff0c;不仅耗时还容易出错。为了解决这个问题&#xff0c;BI数据可视化工具通常会提供一些自动化的数据更新功能…

台灯应该买什么样的才能护眼?一篇学会如果挑选护眼台灯

家里顶灯太暗了且高度太高&#xff0c;还是原始的LED灯&#xff0c;晚上用着眼睛都有点难受&#xff0c;还好遇到了儿童护眼灯。下面小编为大家介绍下儿童护眼灯哪个牌子好&#xff1f;什么护眼台灯比较专业 护眼台灯怎么样选择 1、照度级别 台灯照度级别分为 A 级和 AA 级。…

多模态情感分析——Twitter15和Twitter17数据集

一、原始数据集介绍 数据集链接&#xff1a; https://pan.baidu.com/s/1JLkaSerBgKe--GBaU0ZkFg?pwdfqyo提取码&#xff1a;fqyo 数据集介绍&#xff1a;原始的被划分为了训练集&#xff08;60%&#xff09;、验证集&#xff08;20%&#xff09;、测试集&#xff08;20%&am…

【Java SE】详解数组

前言&#xff1a;在C语言中我们已经学习过数组&#xff0c;接下来&#xff0c;我们再主要学习一下Java中的数组&#xff0c;在Java中&#xff0c;数组变得更加高效和使用。 1. 数组的基本概念 1.1 什么是数组&#xff1f; 数组&#xff1a;可以看成是相同类型元素的一个集合。…

【计算机网络】HTTP 协议

文章目录 前言什么是 HTTP理解 HTTP 请求和响应格式HTTP 的请求格式1. 首行2. 请求头3. 空行4. 正文&#xff08;body&#xff09; HTTP 的响应格式1. 首行2. 响应头3. 空行4. 正文&#xff08;body&#xff09; 首行GET 和 POST 方法有什么区别针对 GET 方法和 POST 方法的区别…

Java——》CAS

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

【MongoDB】索引 – 文本索引

一、准备工作 这里准备一些数据 db.books.insertMany([{_id: 1, name: "Java", description: "java 入门图书", translation: [{ language: "english", description: "java basic book" }]},{_id: 2, name: "C", descript…

七年老程序员的九十月总结:上热榜、社区分享

作者简介&#xff1a;张拭心&#xff0c;Android GDE&#xff08;Google Developer Expert&#xff09;&#xff0c;CSDN 博客专家如果感觉博主的文章还不错的话&#xff0c;请三连&#xff08;点赞留言转发&#xff09;支持一下博主哦联系方式&#xff1a;godblesszsx&#xf…

第二证券:政策效应逐步显现 A股修复行情有望持续演绎

上星期&#xff0c;A股商场延续企稳反弹的态势&#xff0c;上证指数震荡上涨0.43%&#xff1b;沪深两市日均成交额回升至8700亿元左右&#xff1b;北向资金近一个月初次转为周净买入5.57亿元。 安排观点一起认为&#xff0c;在稳增加、稳预期相关政策持续发力&#xff0c;上市…

linux 查看驱动模块(lsmod)和 驱动设备(ls /dev)

一、lsmod lsmod 命令&#xff0c;用于列出当前 linux 系统中加载的模块。当驱动开发人员编写好驱动代码&#xff0c;并生成驱动代码对应的驱动模块后&#xff0c;可以通过 insmod xxx.ko 将驱动模块&#xff08;.ko&#xff09;加载到 linux 操作系统中。最后&#xff0c;通过…

基于ruoyi框架项目-部署到服务器上

基于ruoyi框架项目-部署到服务器上 文章目录 基于ruoyi框架项目-部署到服务器上1.前端vue编译&#xff0c;后的dist下内容打包&#xff08;前后端分离版本需要&#xff09;2.后端打包成jar包&#xff08;如果是thymeleaf仅需打包jar&#xff09;3.上传到服务器目录下4. docker部…

什么是MySQL的执行计划(Explain关键字)?

什么是Explain Explain被称为执行计划&#xff0c;在语句之前增加 explain 关键字&#xff0c;MySQL 会在查询上设置一个标记&#xff0c;模拟MySQL优化器来执行SQL语句&#xff0c;执行查询时&#xff0c;会返回执行计划的信息&#xff0c;并不执行这条SQL。&#xff08;注意&…

SAM 微调在医学上的尝试

1、2023下半年 1、 UNet与SAM结合的正确的道路SAMUS,一路SOTA没对手&#xff01; https://github.com/xianlin7/SAMUS 2、 本文提出 SonoSAM&#xff1a;一种用于分割超声图像上感兴趣对象的快速基础模型。 https://zhuanlan.zhihu.com/p/663988684 未开源 绿色是预测的&…

周大福开启“超越时光”天然钻石之旅,将非常钻石领入日常人生

&#xff08;2023年11月6日&#xff09;创立于1929年的周大福凭借独具匠心的设计、超凡卓越的品质和历史悠久的底蕴&#xff0c;成为了中国传统文化与现代审美相融合的知名珠宝品牌。周大福不仅在黄金珠宝领域声名显赫&#xff0c;在天然钻石方面也拥有独树一帜的专业实力。早在…

【广州华锐互动】3D全景虚拟旅游在文旅行业的应用场景

随着科技的不断发展&#xff0c;3D全景虚拟旅游正在成为一种新兴的旅游体验方式&#xff0c;它可以帮助旅游者更加深入地了解旅游信息&#xff0c;提升旅游体验。下面我们将详细介绍3D全景虚拟旅游可以应用于哪些场景。 一、旅游规划 3D全景虚拟旅游可以帮助旅游者更加直观地进…