小试牛刀-区块链代币锁仓(Web页面)

Welcome to Code Block's blog

本篇文章主要介绍了

[区跨链代币锁仓(Web页面)]
❤博主广交技术好友,喜欢我的文章的可以关注一下❤

目录

1.编写目的

2.开发环境

3.实现功能

4.代码实现

4.1 必要文件

4.1.1 ABI Json文件(LockerContractABI.json)

4.2 代码详解

ABI初始化

4.1.1 MetaMask连接到网站

4.1.2 显示锁仓数量、地址数、时间

4.1.3 显示当前锁仓列表

4.1.4 显示锁仓历史记录

4.1.5 显示我的锁仓列表、

4.1.6 锁仓

 4.1.7 解锁

5.测试

5.1 测试截图

 5.2测试视频

6.页面源码


1.编写目的

        本篇文章是小试牛刀-区块链代币锁仓合约实战的后续,记录前端页面的开发过程,分享前端页面代码,加深对前端页面理解,同时希望能帮到需要实现相关功能的朋友。

2.开发环境

        该网页使用Vue("vue": "^3.3.11",)实现,与合约的交互使用了web3("web3": "^4.3.0")组件,使用VsCode作为开发集成IDE.

3.实现功能

  1. MetaMask连到到网站
  2. 显示锁仓数量
  3. 显示锁仓人数
  4. 显示链上时间
  5. 显示当前锁仓列表
  6. 显示锁仓历史记录
  7. 显示我的锁仓列表
  8. 创建锁仓并锁定指定时间
  9. 超过锁仓时间后执行解锁

4.代码实现

4.1 必要文件

4.1.1 ABI Json文件(LockerContractABI.json)

        该文件是合约的ABI文件,是Json格式,其中为合约方法的名称和返回参数类型,web3.js组件只有通过这个ABI文件才能知道调用合约方法,以及返回的参数类型.(已在下载源码中包含.),同样可以通过这个链接进行下载.ABI文件

4.2 代码详解

ABI初始化

将ABI文件导入到使用的JS中.

import BabyBonkLoderABI from './LockerContractABI.json';
import BabyBonkABI from './BabyBonkContractABI.json'

然后通过以下代码对ABI文件进行初始化,这里lockerContractAddress变量为合约地址。accounts[0]即连接的MetaMusk地址.

    async initializeContract() {
      try {
        const accounts = await this.web3.eth.getAccounts();
        this.lockerContract = new this.web3.eth.Contract(BabyBonkLoderABI, this.lockerContractAddress, {
          from: accounts[0],
        });
        this.tokenContract=new this.web3.eth.Contract(BabyBonkABI,this.tokenContractAddress,{
          from: accounts[0]
        })
        this.address=accounts[0]
      } catch (error) {
        console.error('Error initializing contract:', error);
      }
    }

4.1.1 MetaMask连接到网站

        使用以下方法连接MetaMask,在连接之前先要对web3组件进行初始化,连接后即可获得链上地址并且通过初始化函数初始化合约内的方法,方便调用。


    async connectToMetaMask() {
      try {
        await window.ethereum.request({ method: 'eth_requestAccounts' });
        this.web3 = new Web3(window.ethereum);

        await this.initializeContract();
        ElMessage({
          message: 'connect wallet success!',
          type: 'success',
        })
      } catch (error) {
        ElMessage.error('Error connecting to MetaMask')
      }
    }

4.1.2 显示锁仓数量、地址数、时间

        这里调用合约内的getLockPool方法获取锁仓代币总量,调用getLockerSize方法获取地址数量,getTimestamp()方法获取链上时间戳,并通过格式转换方法将格式转换为字符串的格式方便在前端页面显示.

    async initLockInfo() {
      await this.initializeContract();
      try {
        const lockPool=await this.lockerContract.methods.getLockPool().call();
        this.lockPool=this.toBalance(lockPool);
        const lockSize=await this.lockerContract.methods.getLockerSize().call();
        this.lcokPoolSize=BigInt(lockSize).toString();
        const timestamp=await this.lockerContract.methods.getTimestamp().call();
        this.timestamp=parseInt(Number(timestamp)*1000);
        this.chainTime=this.formattedDateTime();
      } catch (error) {
        console.error('Error calling contract method:', error);
      }
    }

4.1.3 显示当前锁仓列表

调用合约getLockerList方法获取当前的锁仓列表。

    async getlockList(){
      await this.initializeContract();
      return await this.lockerContract.methods.getLockerList().call();
    }

4.1.4 显示锁仓历史记录

调用getLockerHistoryList方法获取当前的锁仓历史列表。

    async getLockerHistoryList(){
      await this.initializeContract();
      return await this.lockerContract.methods.getLockerHistoryList().call();
    }

4.1.5 显示我的锁仓列表、

调用getUserLock()方法获取当前连接的地址的锁仓列表。

    async getUserLock(){
      await this.initializeContract();
      return await this.lockerContract.methods.getUserLocker().call();
    }

4.1.6 锁仓

锁仓包授权和锁仓请求,当未进行授权时,需要完成授权(approve(数量))操作,授权完成后即可再次点击锁仓按钮请求合约(即lockAmountDuration(数量,时间)),合约会进行转移代币和记录锁仓信息.使用代码如下:

    async approve(amount){
      await this.initializeContract();
      const amountToApprove = BigInt(amount)*BigInt(1e9);
      this.tokenContract.methods.approve(this.lockerContractAddress,amountToApprove)
      .send({
        from: this.address,
        to:this.tokenContractAddress,
        gas: '300000', 
        gasPrice: '3000000000'
      }) 
      .on('transactionHash', function(hash) {
        ElMessage.success('send transaction success:'+hash)
      })
      .on('error', function(error) {
        ElMessage.error('Error send TransactionHash')
      });
    }
    async lockAmountDuration(amount,lockDuration){
       await this.initializeContract();
       this.lockerContract.methods.lockerToken(amount,lockDuration)
      .send({
        from: this.address,
        to:this.lockerContractAddress,
        gas: '300000', 
        gasPrice: '3000000000'
      })
      .on('transactionHash', function(hash) {
        ElMessage.success('LOCK success:'+hash)
      })
      .on('error', function(error) {
        ElMessage.error('LOCK ERROR')
      });
    }

 4.1.7 解锁

解锁即为请求合约unlockerToken方法,合约会通过记录的信息将相应的代币退回给用户。

    async unLockAmount(){
      await this.initializeContract();
      this.lockerContract.methods.unLockerToken()
     .send({
       from: this.address,
       to:this.lockerContractAddress,
       gas: '300000', 
       gasPrice: '3000000000',
     })
     .on('transactionHash', function(hash) {
       ElMessage.success('UN LOCK success:'+hash)
     })
     .on('error', function(error) {
       ElMessage.error('UNLOCK ERROR')
     });
    }

5.测试

5.1 测试截图

 5.2测试视频

录屏_选择区域_20240225093939

6.页面源码

源码已上传,可以在置顶或当前链接下载小试牛刀-区块链代币锁仓(Web页面).

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

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

相关文章

uniapp + vite中 uni.scss 使用 /deep/ 不生效(踩坑记录三)

vite 中使用 /deep/ 进行样式穿透报错 原因:vite 中不支持,换成 ::v-deep 或:deep即可

linux应用开发基础知识(八)——内存共享(mmap和system V)

mmap内存映射 内存共享定义 内存映射,简而言之就是将用户空间的一段内存区域映射到内核空间,映射成功后,用户对这段内存区域的修改可以直接反映到内核空间,同样,内核空间对这段区域的修改也直接反映用户空间。那么对…

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头,实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点(AP)工作模式–Arduino程序,当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…

如何快速掌握一门编程语言

学习一门新的编程语言可能是一个具有挑战性的过程,但通过一些系统的方法,可以大大加快这个过程。 目录 第一步:通过书籍和视频课程掌握基本语法1. **学习编程语言的基础知识**2. **掌握字符串处理**3. **掌握正则表达式和解析器**4. **掌握面…

停车场车牌识别计费系统,用Python如何实现?

关注星标,每天学习Python新技能 前段时间练习过的一个小项目,今天再看看,记录一下~ 项目结构 说明: datefile文件夹:保存车辆信息表的xlsx文件 file文件夹:保存图片文件夹。ic_launcher.jpg是窗体的右上角…

什么是 URL ?

统一资源定位符(URL)是一个字符串,它指定了一个资源在互联网上的位置以及如何访问它。URL 是由几部分组成的,每部分都有其特定的作用: 协议/方案:这是 URL 的开头部分,表明了用于访问资源的协议…

stm32F4库函数c++和C混合编程笔记20240626

1、有时候需要用到c的一些特性,封装,类等等。 2、研究一下如何更改之前c工程的内容,实现混合编程。 操作 1、keil设置 2、要重新建立一个main文件,后缀名是cpp,cpp才能调用cpp. 后面如果要用到c特性的,需要…

python sklearn机械学习-数据预处理

🌈所属专栏:【机械学习】✨作者主页: Mr.Zwq✔️个人简介:一个正在努力学技术的Python领域创作者,擅长爬虫,逆向,全栈方向,专注基础和实战分享,欢迎咨询! 您…

C++: 左值引用和右值引用

目录 概念: 理解: 左值引用,右值引用 左值引用能否给右值取别名? 右值引用能否给左值取别名? 引用的意义是什么? 左值和右值对自定义类型有什么区别吗? move的妙用! 没有优化…

统计信号处理基础 习题解答11-13

题目 如果是一个2x1的随机矢量,具有PDF 证明的PDF是一个随机变量。提可以因式分解成,其中是一个在4.5节描述的白化变换。 解答 首先: 因此,存在: 也就是是Hermitian矩阵。详细的性质可以参考: https://z…

Git使用[推送大于100M的文件后解救办法]

推送大于100M的文件后解救办法 本文摘录于:https://blog.csdn.net/u012150602/article/details/122687435只是做学习备份之用,绝无抄袭之意,有疑惑请联系本人! 当有文件大于100M的时候在提交的时候没有问题,但是在push的似乎就不行…

电影院售票管理系统(小白)大佬求解

最近在写一个关于电影院售票管理系统的sm项目,但是在买票的环节出现了问题及点击选座购票,没有数据渲染出来,我不知道什么情况,所以问问。有没有大佬可以帮我解决这个问题?下面是我的。控制层,服务层&#…

学校考场电子钟除了报时,还能做什么?-讯鹏时钟

在学校考场中,电子钟的存在似乎已经司空见惯,大多数人仅仅将其视为报时的工具。然而,学校考场电子钟的作用远不止于此,它具备众多优势和丰富的功能。 学校考场电子钟能够提供精准的时间参考,这是其最基础也是最关键的功…

Qt:5.QWidget属性介绍(Enabled属性-控件可用性设置、geometry属性-控件位置/大小设置)

目录 一、 QWidget属性的介绍: 二、Enabled属性-控件可用性设置: 2.1Enabled属性的介绍: 2.2获取控件当前可用状态的api——isEnabled(): 2.3设置控件当前的可用状态的api—— setEnabled() : 2.4 实例&#xff…

第二十一章 网络编程

​ 一、网络的相关概念 1. 网络通信 (1)网络通信:将 数据 通过网络从一台设备传输到另一台设备 (2)java.net 包下提供了一系列的类或接口,完成网络通信 2. 网络 概念:两台或多台设备通过一定…

VideoLLaMA 2:多模态视频理解新突破,音频理解能力再升级,挑战 GPT-4V

前言 近年来,人工智能技术飞速发展,尤其是大模型的出现,为视频理解和生成领域带来了前所未有的机遇。然而,现有的视频大模型(Video-LLM)在处理视频中复杂的时空信息和音频信息方面仍存在不足,例…

基于矩阵分解算法的评分预测实现---信息检索课设以及所涉及的深度学习原理

一、实验环境 Windows,Python 3 Python作为主要编程语言,使用Python的Pandas、NumPy、Matplotlib等库 二、实验内容 主要任务 查阅相关资料,了解矩阵分解算法的基本概念、应用场景及其难点。重点了解SVD(Singular Value Decomposition,奇异值分解)系列方法。掌握Pyth…

Python特征工程 — 1.4 特征归一化方法详解

目录 1 Min-Max归一化 方法1:自定义的Min-Max归一化封装函数 方法2: scikit-learn库中的MinMaxScaler 2 Z-score归一化 方法1:自定义的Z-score归一化封装函数 方法2: scikit-learn库中的StandardScaler 3 最大值归一化 4 L…

嵌入式c语言3——自定义数据类型

结构体struct,共用体union 结构体中定义变量,首尾地址相连 对于union,其包含变量对起始地址相同 由于其起始地址相同,则改变其中某一变量值时有可能使得另一个变量值发生改变 enum 枚举,可以用来定义一堆整形常量构成…

AzureDataFactory Dataverse connector自动处理了分页问题(单次查询上限5000条的限制)

众所周知,在用fetch执行D365的查询时,单次的查询是5000条,如果超过5000条则需要自己处理分页,添加额外的处理逻辑,但在ADF中,Dataverse connector已经自动处理了分页,我们可以很简单的做个POC. …