实现mint操作(参考pancake)

2023-11-18

区块链发展越来越好,nft已经火了很久,今天写一下如何用js、web3js、调用合约,实现mint nft。

简单的调用:

//引入一些依赖 (根据需要,有一些是其他功能的)
import useActiveWeb3React from './web3/hooks/useActiveWeb3React';
import { getNftContract } from './web3/utils/contractHelpers';
import React, { useEffect, useState } from 'react';
import { useIntl, getLocale } from 'umi';
import { Web3Provider } from '@ethersproject/providers';
import Web3 from 'web3';
import { injected } from './web3';
import { useWeb3React } from '@web3-react/core';
import { Web3ReactProvider } from '@web3-react/core';
import { setupNetwork } from './web3/wallet';
import { InjectedConnector } from '@web3-react/injected-connector';
import { default as Abi } from './web3/abi/nft.json';
import type { AbiItem } from 'web3-utils';
import BigNumber from 'bignumber.js/bignumber';
import { useCallWithGasPrice } from './web3/hooks/useCallWithGasPrice';
  
const spenderAddress = '合约地址';
  const abiType = (abi: unknown): AbiItem => abi as AbiItem;//abi文件
  const contract = new web3.eth.Contract(abiType(Abi), spenderAddress);

// 可以获取一些数据
    const name = await contract.methods.name().call();
    const symbol = await contract.methods.symbol().call();
    const owner = await contract.methods.owner().call();
    // const balanceOf = await contract.methods.balanceOf(account).call();
    // const isApprovedForAll = await contract.methods
    //   .isApprovedForAll(account, spenderAddress)
    //   .call();
    // const isApprovedForAll = await contract.methods.isApprovedForAll(account, spenderAddress).call();

// mint
await depositContract.mintTo(account, {
   value: web3.utils.toWei('0.01', 'ether'),
   gasLimit: DEFAULT_GAS_LIMIT,
});

// 以上简单的调用就可以mint

下面是进阶版,使用了一些pancake的代码:

1.配置Web3ReactProvider

import React from 'react';
import { Web3Provider } from '@ethersproject/providers';
import { Web3ReactProvider } from '@web3-react/core';
import App from './app';

const Page = () => {
  const POLLING_INTERVAL = 12000;
  const getLibrary = (provider): Web3Provider => {
    const library = new Web3Provider(provider);
    library.pollingInterval = POLLING_INTERVAL;
    return library;
  };

  return (
    <Web3ReactProvider getLibrary={getLibrary}>
      <App />
    </Web3ReactProvider>
  );
};

export default Page;

2.功能页面:

import './app.less';
import { useMemo } from 'react';
import useActiveWeb3React from './web3/hooks/useActiveWeb3React';
import { getNftContract } from './web3/utils/contractHelpers';
import React, { useEffect, useState } from 'react';
import { useIntl, getLocale } from 'umi';
import styles from './app.less';
import { Button, message } from 'antd';
import { Web3Provider } from '@ethersproject/providers';
import { injected } from './web3';
import { useWeb3React } from '@web3-react/core';
import { setupNetwork } from './web3/wallet';
import BigNumber from 'bignumber.js/bignumber';
import { useCallWithGasPrice } from './web3/hooks/useCallWithGasPrice';

const DEFAULT_GAS_LIMIT = 380000;

const Page = () => {
  const intl = useIntl();
  const context = useWeb3React<Web3Provider>();
  const {
    connector,
    library,
    chainId,
    account,
    activate,
    deactivate,
    active,
    error,
  } = context;


  useEffect(() => {
    if (localStorage.getItem('isActivate')) {
      connect();
    }
  }, []);

  async function connect() {
    if (typeof window.ethereum === 'undefined') {
      message.warning({
        content: intl.formatMessage({ id: 'pass.text.metamask.install' }),
        style: {
          marginTop: '10vh',
        },
      });
    } else {
      try {
        const hasSetup = await setupNetwork();
        if (hasSetup) {
          await activate(injected);
          localStorage.setItem('isActivate', 'true');
        }
      } catch (ex) {
        console.log(ex);
      }
    }
  }



  const spenderAddress = '0xbfb6C22b363d06c64bdff5a890Ff73FB6Cb7242F';

  const BIG_TEN = new BigNumber(10);

  const useVault = (address: string) => {
    const { library } = useActiveWeb3React();
    return useMemo(
      () => getNftContract(address, library.getSigner()),
      [address, library],
    );
  };

  const mint = async () => {
    try {
      const amount = new BigNumber(1).times(BIG_TEN.pow(18)).toString();
      handleDeposit(amount);
    } catch (error) {
      if (error) {
        console.info('error', error);
      }
    }
  };

  const depositContract = useVault(spenderAddress);
  const { callWithGasPrice } = useCallWithGasPrice();


  const handleDeposit = async (depositAmount: any) => {
    const callOptionsETH = {
      gasLimit: DEFAULT_GAS_LIMIT,
      value: depositAmount.toString(),
    };

    try {

      const tx = await callWithGasPrice(
        depositContract,
        'mintTo',
        [account],
        callOptionsETH,
      );
      const receipt = await tx.wait();
      console.info(receipt);
      if (receipt.status) {
        message.success({
          content: intl.formatMessage({ id: 'pass.text.success' }),
          style: {
            marginTop: '10vh',
          },
        });
      }
    } catch (error) {
      console.info('error', error);
      message.error({
        content: intl.formatMessage({ id: 'pass.text.mint.error' }),
        style: {
          marginTop: '10vh',
        },
      });
    } finally {
    }
  };



  return (

    <>
      <div className={styles['wmx-pass-content1']}>
        <div className={styles['wmx-pass-content1-left']}>
          <div className={styles['wmx-pass-content1-left1']}>
            <div className={styles['wmx-pass-content1-left2']}>
              <p className={styles['wmx-pass-content1-price']}>
                {intl.formatMessage({
                  id: 'pass.text.price',
                })}
              </p>
              {active ? (
                <Button
                  className={styles['wmx-pass-content1-button1']}
                  onClick={mint}
                >
                  Mint
                </Button>
              ) : (
                <Button
                  className={styles['wmx-pass-content1-button']}
                  onClick={connect}
                >
                  {intl.formatMessage({
                    id: 'pass.text.metamask',
                  })}
                </Button>
              )}
            </div>
          </div>
        </div>
      </div>
    </>

  );
};

export default Page;

3.接下来是一些其他文件:

(省略,先不写了,感兴趣留言)

基本和开源代码一致

代码地址:https://github.com/Chhpearl/web3app_nft_using_ethers_test

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现mint操作(参考pancake) 的相关文章

  • 持续自适应信任(CAT)-企业零信任最佳范式|身份云研究院

    零信任安全治理理念不再是陌生的话题 随着社会面临更复杂的信息安全风险 不断变化的网络环境使得基于边界的安全架构不再具备抵御内外部安全威胁的能力 传统的以网络中心化的安全体系架构也逐步过渡到以身份为中心的网络访问控制理念 基于零信任理念衍生的

随机推荐

  • windows下以指定用户访问SMB服务器进行读写

    一 概述 最近遇到一个问题 linux 的 smb服务器开启匿名访问 windows访问linux文件夹不需要用户名密码就可以进去使用 但是存在一个问题 ssh连接到linux 后修改的文件 在windows已smb方式下打开某个文件修改
  • 【文献翻译】信息安全管理自动化的可能性 - Automation possibilities in information security management

    摘要 ISO 27001中定义的信息安全管理涉及建立 实施 操作 监控 审查 维护和改进信息安全管理系统 本文分析了信息安全管理自动化的可能性 该分析考虑了使用 i 风险管理中的安全本体 ii 用于某些安全控制自动运行的硬件和软件系统 以及
  • JVM3-类文件结构

    六 类文件结构 计算机到目前为止 都只能识别0和1 所以我们写的程序都需要被编译器翻译成0和1的二进制格式才能被计算机执行 很多程序语言选择了与操作系统和机器指令集无关的 平台中立的格式作为程序编译后的格式 而不再需要像最初那样把程序编译成
  • PMP课程笔记:第4章 项目整合管理

    目录 预测型生命周期 0 项目整合管理的基本概念 1 项目整合管理 2 整合的发展趋势 3 项目管理过程三从四德 4 项目整合管理实现过程 重要 1 制定项目章程 1 1 制定项目章程 输入 1 2 制定项目章程 输出 1 3 制定项目章程
  • 使用RPC对某者web端骑行数据进行爬取

    使用RPC技术hook web端JS 骑行app某者web端爬虫 2022 2 1 获取轨迹ID 通过更改年月 可以发现获取每个月轨迹ID 的方式 这个非常简单 只需要拷贝请求头headers就可以直接获取 2 获取轨迹详情 可以发现三个请
  • 主键和唯一索引

    主键和唯一索引 主键 主关键字 primary key 是表中的一个或多个字段 它的值用于唯一地标识表中的某一条记录 唯一索引 一种索引 不允许具有索引值相同的行 从而禁止重复的索引或键值 系统在创建该索引时检查是否有重复的键值 并在每次使
  • 【生信原理】初探芯片表达谱分析

    初探芯片表达谱分析 文章目录 初探芯片表达谱分析 实验目的 实验内容 实验题目 实验过程 数据的获取 解压与读取 数据预处理 背景纠正 标准化和探针信号汇总等 数据过滤 探针过滤 探针注释 添加基因注释信息 limma差异分析 差异表达基因
  • DM备份数据或者还原备份管道连接超时问题。

    问题 第一 必须以dmdba的用户执行 第二 启动DmAPService 服务 启动失败了 删掉管道文件再启动 启动成功 再执行就OK了
  • 【华为OD机试 2023 B卷

    在线OJ 已购买本专栏用户 请私信博主开通账号 在线刷题 运行出现 Runtime Error 0Aborted 请忽略 华为OD统一考试A卷 B卷 新题库说明 2023年5月份 华为官方已经将的 2022 0223Q 1 2 3 4 统一
  • linux C程序中获取shell脚本输出

    linux C程序中获取shell脚本输出 分类 linux C开发 2008 06 16 22 44 820人阅读 评论 0 收藏 举报 shell 脚本 linux c system cmd 目录 linux C程序中获取shell脚本
  • 【业务功能篇78】微服务-前端后端校验- 统一异常处理-JSR-303-validation注解

    5 前端校验 我们在前端提交的表单数据 我们也是需要对提交的数据做相关的校验的 Form 组件提供了表单验证的功能 只需要通过 rules 属性传入约定的验证规则 并将 Form Item 的 prop 属性设置为需校验的字段名即可 校验的
  • socket局域网测试是可以的,但是在腾讯云/阿里云上报错“[Errno 99] Cannot assign requested address”

    现在云服务器一般都是只有内网地址 通过公网IP访问时 由云服务器运营商映射到内部网络的 因此 如果部署socket服务时 配置server ip应该是内网IP 解决方法 服务端的ip填服务器的私网ip 客户端填公网ip
  • 【Django】Python+Django 图文教程

    Django新手图文教程 本文面向 有python基础 刚接触web框架的初学者 环境 windows7 python3 5 1 pycharm专业版 Django 1 10版 pip3 一 Django简介 百度百科 开放源代码的Web应
  • 字节跳动测试岗面试挂在2面,复盘后,我总结了失败原因,决定再战一次...

    先说下我基本情况 本科不是计算机专业 现在是学通信 然后做图像处理 可能面试官看我不是科班出身没有问太多计算机相关的问题 因为第一次找工作 字节的游戏专场又是最早开始的 就投递了 投递的是游戏测试开发岗 字节是自己投的第一家公司 也是第一家
  • 【NLP】通过迁移学习加速 AI 模型训练

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • Java机试题

    整理自Java经典编程50题 面试笔试机试 腾讯云开发者社区 腾讯云 1 回文数 public static boolean palindrom Integer integer String str1 String valueOf inte
  • Kibana在Centos上开机启动

    1 需要下载kibana 去官网下 2 解压到自己指定的目录下 我是放到了 usr local下 3 执行 vi usr lib systemd system kibana service 插入下面内容 Unit Description k
  • /dev/zero和/dev/null的区别

    可以通过使用dd if dev zero of archive test dbf bs 8k count 1000000 来测试磁盘的纯写入性能 使用dd if file of dev null 来测试磁盘的纯读取性能 使用dd if fi
  • 紫光同创 FPGA 开发跳坑指南(三)—— 联合 Modelsim 仿真

    Modelsim 是 FPGA 开发中重要的 EDA 设计仿真工具 主要用于验证数字电路设计是否正确 紫光 Pango Design Suite 开发套件支持联合 Modelsim 仿真 这里作简要的介绍 添加仿真库 方法一 打开 Pang
  • 实现mint操作(参考pancake)

    区块链发展越来越好 nft已经火了很久 今天写一下如何用js web3js 调用合约 实现mint nft 简单的调用 引入一些依赖 根据需要 有一些是其他功能的 import useActiveWeb3React from web3 ho