小试牛刀-区块链代币锁仓(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'

image.gif

然后通过以下代码对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);
      }
    }

image.gif

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')
      }
    }

image.gif

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);
      }
    }

image.gif

4.1.3 显示当前锁仓列表

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

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

image.gif

4.1.4 显示锁仓历史记录

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

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

image.gif

4.1.5 显示我的锁仓列表、

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

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

image.gif

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')
      });
    }

image.gif

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')
     });
    }

image.gif

5.测试

5.1 测试截图

image.gif 编辑

image.gif 编辑

5.2测试视频

录屏_选择区域_20240225093939

image.gif

6.页面源码

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

image.gif 编辑

目录
相关文章
|
存储 Linux 开发工具
Rockchip系列之浅度分析UART接口系列(1)
Rockchip系列之浅度分析UART接口系列(1)
1618 1
|
7月前
|
区块链
小试牛刀-区块链Solana多签账户
在 Solana 区块链中,多签账户(Multisig Account)是一种智能合约账户,允许多个签名者共同管理和控制账户上的资产或操作。这种机制增强了账户的安全性和灵活性,特别适用于需要多个权限共同批准的操作场景,如资产管理、资金转移、或项目治理。
382 1
|
8月前
|
开发工具
【HarmonyOS 5】使用openCustomDialog如何禁止手势关闭的方案
openCustomDialog提供了onWillDismiss回调函数,当用户尝试通过滑动、点击外部、返回键等操作关闭弹窗时,会触发该回调。通过在回调中判断关闭原因并拦截操作,即可实现禁止手势关闭的效果。
233 1
|
7月前
|
数据处理 Apache 流计算
Flink Forward Asia 2025 城市巡回 · 上海站
Flink Forward Asia 2025 城市巡回上海站重磅来袭!8月16日,顶尖技术专家齐聚,共探实时计算前沿趋势与行业实践。大会涵盖技术分享、实战案例与开源生态共建,支持线上直播预约。立即报名,共赴技术盛宴!
492 0
Flink Forward Asia 2025 城市巡回 · 上海站
|
7月前
|
边缘计算 5G 图形学
webgl和实时云渲染的原理是什么,分别适用于什么场景?有什么区别
本文对比分析云渲染(点量云流)与WebGL技术在大型3D内容呈现中的差异,涵盖技术原理、性能画质、适用场景及选型建议,助力开发者选择最优方案。
280 0
|
10月前
|
消息中间件 Java 数据管理
RocketMQ原理—2.源码设计简单分析上
本文介绍了NameServer的启动脚本、启动时会解析哪些配置、如何初始化Netty网络服务器、如何启动Netty网络服务器,介绍了Broker启动时是如何初始化配置的、BrokerController的创建以及包含的组件、BrokerController的初始化、启动、Broker如何把自己注册到NameServer上、BrokerOuterAPI是如何发送注册请求的,介绍了NameServer如何处理Broker的注册请求、Broker如何发送定时心跳
|
机器学习/深度学习 人工智能 移动开发
一文搞懂 FFN / RNN / CNN 的参数量计算公式 !!
一文搞懂 FFN / RNN / CNN 的参数量计算公式 !!
1212 3
|
机器学习/深度学习 JSON JavaScript
LangChain-21 Text Splitters 内容切分器 支持多种格式 HTML JSON md Code(JS/Py/TS/etc) 进行切分并输出 方便将数据进行结构化后检索
LangChain-21 Text Splitters 内容切分器 支持多种格式 HTML JSON md Code(JS/Py/TS/etc) 进行切分并输出 方便将数据进行结构化后检索
636 0
|
存储 关系型数据库 MySQL
MySQL8 中文参考(二十四)(2)
MySQL8 中文参考(二十四)
273 1
|
Kubernetes 网络协议 网络虚拟化
WireGuard 系列文章(九):基于 K3S+WireGuard+Kilo 搭建跨多云的统一 K8S 集群
WireGuard 系列文章(九):基于 K3S+WireGuard+Kilo 搭建跨多云的统一 K8S 集群