NFT + JAVA + 可更新合约

news2024/11/16 9:16:55

前言

合约部署参考:hardhat

合约开发参考:openzeppelin

钱包:metamask

部署链使用的是:sepolia

合约生成Java:solc

合约部署和测试自行处理

1. 合约

合约代码:ZhuZiNFTU.sol

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import "@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";


contract ZhuZiNFTU is ERC721URIStorageUpgradeable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

	function initialize() initializer public {
        __ERC721_init("ZhuZiUNFT", "ZZU");
		
	}

    function awardItem(address player, string memory tokenURI)
        public
        returns (uint256)
    {
        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        _tokenIds.increment();
        return newItemId;
    }
	
	
	function turl(uint256 tokenId) public view returns (string memory) {
        return tokenURI(tokenId);
    }
}

2. 合约生成Java文件

## 安装
npm install solc@0.4.26

## 生成 bin abi文件
cd node_modules/
./solc/solcjs ../contracts/ZhuZiNFTU.sol --bin --abi --optimize -o ../java/

## 转为java文件
cd ../
web3j generate solidity -b java/___contracts_ZhuZiNFTU_sol_ZhuZiNFTU.bin  -a java/___contracts_ZhuZiNFTU_sol_ZhuZiNFTU.abi -o java/  -p com.test

3. 调用Java操作Nft

package com.demo.web3.test;

import java.io.IOException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;

import org.web3j.crypto.Credentials;
import org.web3j.protocol.Web3j;
import org.web3j.protocol.core.DefaultBlockParameterName;
import org.web3j.protocol.core.methods.response.EthGetBalance;
import org.web3j.protocol.core.methods.response.TransactionReceipt;
import org.web3j.protocol.http.HttpService;
import org.web3j.tx.RawTransactionManager;
import org.web3j.tx.TransactionManager;
import org.web3j.tx.gas.ContractGasProvider;
import org.web3j.tx.gas.StaticGasProvider;
import org.web3j.utils.Convert;

import com.demo.web3.test3.Web3Util;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;

public class DemoZZU {
	static Credentials credentials = null;
    // sepolia 服务地址
	static Web3j web3j = Web3j.build(new HttpService("https://sepolia.infura.io/v3/"));
	// 私钥
	static String privateKey = "";

	private static void init() {
		try {
			credentials = Web3Util.getCredentials(privateKey);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void main(String[] args) throws Exception {
		init();
		// 合约地址
		String contractAddress = "0xBC43ACbDf62eeC2915035680d34c5B1Ac6D2B151";
		// 钱包地址
		String address1 = "0x5B42212e35702d336d63E20c30B9084919be5078";
		balanceOf(contractAddress, address1);
		
		String url = "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/1.png";
		createNftByUrl(contractAddress, address1, url);
		url = "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/2.png";
		createNftByUrl(contractAddress, address1, url);
		url = "https://storage.googleapis.com/opensea-prod.appspot.com/puffs/3.png";
		createNftByUrl(contractAddress, address1, url);
		
		balanceOf(contractAddress, address1);
	}
	
	public static void createNftByUrl(String contractAddress, String player, String url) throws Exception {
		JsonObject json = new JsonObject();
		json.addProperty("image", url);
		json.addProperty("name", "Opensea zhuzi Creatures");
		json.addProperty("description", "zhuzi Counters");
		JsonArray attributes = new JsonArray();
		JsonObject n = new JsonObject();
		n.addProperty("n", "yyyd");
		attributes.add(n);
//		json.add("attributes", attributes);
		
		String t = json.toString();

		t = "data:application/json;utf8," + t;
		System.out.println(t);
		createNft(contractAddress, player, t);
	}
	
	public static void createNft(String contractAddress, String player, String tokenURI) throws Exception {
		___contracts_ZhuZiNFTU_sol_ZhuZiNFTU zz = getZz(contractAddress);
		TransactionReceipt t = zz.awardItem(player, tokenURI).send();
		System.out.println("nft: " + t);
		System.out.println("tokenid: " + getTokenId(t));
	}
	
	
	
	private static BigInteger getTokenId(TransactionReceipt t) {
		try {
			List<String> ts = t.getLogs().get(0).getTopics();
			return toBigInteger(ts.get(ts.size()-1));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private static BigInteger toBigInteger(String str) {
		try {
			if(str.startsWith("0x")) {
				return new BigInteger(""+Integer.parseInt(str.replace("0x", ""), 16));
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private static ___contracts_ZhuZiNFTU_sol_ZhuZiNFTU getZz(String contractAddress) throws Exception {
		TransactionManager transactionManager = getRawTransactionManager();
		ContractGasProvider contractGasProvider = getContractGasProvider();
		___contracts_ZhuZiNFTU_sol_ZhuZiNFTU zz = ___contracts_ZhuZiNFTU_sol_ZhuZiNFTU.load(contractAddress, web3j,
				transactionManager, contractGasProvider);
		return zz;
	}
	
	private static void balanceOf(String contractAddress, String account) throws Exception {
		___contracts_ZhuZiNFTU_sol_ZhuZiNFTU zz = getZz(contractAddress);
		EthGetBalance balance = web3j.ethGetBalance(account, DefaultBlockParameterName.LATEST).send();
		BigDecimal balanceVaue = Convert.fromWei(balance.getBalance().toString(), Convert.Unit.ETHER);
		System.out.println("balance: " + balanceVaue.toString());
		
		BigInteger b = zz.balanceOf(account).send();
		System.out.println("nft balanceOf: " + b.longValue());
	}


	private static TransactionManager getRawTransactionManager() throws IOException {
		return getRawTransactionManager(credentials);
	}
	
	private static TransactionManager getRawTransactionManager(Credentials credentials) throws IOException {
		BigInteger chainId = web3j.ethChainId().send().getChainId();
		return new RawTransactionManager(web3j, credentials, chainId.longValue());
	}

	private static ContractGasProvider getContractGasProvider() {
		return new StaticGasProvider(BigInteger.valueOf(22_000_000_000l), BigInteger.valueOf(6_700_000l));
	}
}

4. 效果

查看链信息:https://sepolia.etherscan.io/address/0xBC43ACbDf62eeC2915035680d34c5B1Ac6D2B151

添加并查看钱包:

 

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

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

相关文章

STM32 Proteus UCOSII系统微波炉控制系统DS18B20-0057

STM32 Proteus UCOSII系统微波炉控制系统DS18B20-0057 Proteus仿真小实验&#xff1a; STM32 Proteus UCOSII系统微波炉控制系统DS18B20-0057 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD1602显示器多个按键蜂鸣器DS18B20温度传感器3个LED灯表示档位加热指…

[SDOI2008] 仪仗队 题解

注&#xff1a;在洛谷同时发布。 题目链接 解题思路 首先观察样例。似乎什么也观察不出来&#xff1f; 那就根据题目描述中所给的图表做。首先找到对角线&#xff0c;将图形沿着对角线一分为二。注意对角线上可以看到一个人&#xff0c;所以答案要加 1 1 1。 其次逐个分析…

-XX:SurvivorRatio

-XX:SurvivorRatio-XXSurvivorRatio eden &#xff1a;from eden &#xff1a;to默认-XXSurvivorRatio8&#xff0c;即 Eden : s0 : s1 8 : 1 : 1&#xff0c;Eden占了年轻代的8/10&#xff0c;不建议修改 case1: -XX:NewRatio4 -XX:SurvivorRatio8 启动参数-Xmx200m -Xms1…

探索Flutter的启动交响曲,详尽指南助力应用启动

Flutter启动流程主要步骤有哪些&#xff1f; 初始化应用程序创建Flutter引擎加载Dart代码构建Widget树创建渲染树更新渲染树呈现界面处理用户输入 Flutter启动需要那些&#xff1f; Dart虚拟机 Dart语言是由Google开发的一种通用编程语言&#xff0c;它可以在不同的平台上运…

基于单片机汽车防盗报警的设计与实现

功能介绍 以STM32单片机作为主控系统&#xff1b;LCD1602液晶显示当前温度信息和参数等功能&#xff1b;3个LED指示灯表示&#xff1a;震动指示灯、人体感应指示灯、防盗模式开启指示灯&#xff1b;按键用来开启防盗模式&#xff0c;设置温度上下限&#xff1b;开启防盗后检测到…

批量识别表格数据——Python调用百度云API

识别效果展示 原始表格 识别处理的表格&#xff0c;可以看到&#xff0c;效果是非常好的 获取KEY 百度智能云 (baidu.com) 产品——文字识别——通用场景 去领取 通用场景OCR——全部——0元领取 去创建 填应用名称——全选——最下面应用描述——立即创建——返回应用列表 …

抖音seo矩阵系统源码|需求文档编译说明(技术)

1.抖音seo矩阵系统文档开发流程 抖音SEO矩阵指的是一系列通过搜索引擎优化&#xff08;SEO&#xff09;技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上&#xff0c;用户可以通过搜索关键词来查找与其相关的视频和账号。因此&#xff0c;抖音SEO矩阵的主要目…

将Notes应用中的PDF附件转为图片

大家好&#xff0c;才是真的好。 好久没有写专门开发方面的知识&#xff0c;主要是因为看的人太少。嗯&#xff0c;当然&#xff0c;这是表面上的&#xff0c;实际上更重要的原因是&#xff0c;写得很麻烦&#xff0c;而且看的人少。 开发要调试&#xff0c;代码要反复测试&a…

Java入门--变量

变量是什么&#xff1f; 变量是用来记住程序要处理的数据的。 变量的定义格式&#xff1f; 数据类型 变量名 数据 注意&#xff1a;这里面的 是赋值的意思&#xff0c;把等号右边的赋值给左边 变量名命名规则&#xff1a; 以字母、下划线、$ 作为首字母由字母、数字、下…

map和set介绍及使用

目录 一、什么是关联式容器 二、set 1.set的介绍 2.set的使用方法 三、mutiset 四、map 1.map简介 2.map的使用 五、multimap 一、什么是关联式容器 在了解map、set之前&#xff0c;你肯定已经使用过vector、list、deque、forward_list(C11)等这些容器&#xff0c;而他…

Jtti:linux如何查看磁盘驱动器列表?

在Linux系统中&#xff0c;你可以使用以下命令之一来查看磁盘驱动器列表&#xff1a; 1.使用 fdisk 命令&#xff1a;运行以下命令来查看磁盘驱动器列表&#xff1a; 这会列出系统中所有的磁盘驱动器及其分区。 2.使用 lsblk 命令&#xff1a;运行以下命令来查看磁盘驱动器列表…

SpringSecurity学习总结

目录 一、简介 二、使用 引入 登录验证流程 完整流程 三、案例(登录验证) 三、设置密码加密和解密方式 三、自定义登录 四、定义JWT认证过滤器 简介 流程 JWT(当前未使用) 定义token过滤 配置过滤器为最前 再次总结流程 五、退出登录 六、一些中间配置 七、网关…

05-流式操作:使用 Flux 和 Mono 构建响应式数据流

1 通过 Flux 对象创建响应式流 基于各种工厂模式的静态创建方法编程的方式动态创建 Flux 相对而言&#xff0c;静态方法在使用上都比较简单&#xff0c;但不如动态方法来得灵活。我们来一起看一下。 2 通过静态方法创建 Flux Reactor 中静态创建 Flux 的方法常见的包括 jus…

机器学习、深度学习、人工智能三者之间究竟是什么关系?

1 什么是人工智能 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff1a;人工智能是一个广泛的概念&#xff0c;指的是使计算机系统具备像人类一样的智能和能力。人工智能涵盖了包括机器学习和深度学习在内的各种方法和技术&#xff0c;旨在让计算机能够感知、…

IPO观察丨黑芝麻智能递表港交所,车芯行业已迈向量产决战期?

虽然我国汽车芯片行业还处在发展初期&#xff0c;但已经迸发出无限潜力。 一方面&#xff0c;智能汽车的发展不断带动需求增长&#xff1b;另一方面&#xff0c;政策引导下&#xff0c;汽车芯片企业持续抢占高地。对此&#xff0c;在7月5日-7日举办的2023年中国汽车论坛上&…

【数据结构二叉树OJ系列】7、构建二叉树并中序遍历

目录 题述&#xff1a; 思路&#xff1a; 正确代码&#xff1a; 题述&#xff1a; 编写一程序&#xff0c;读入用户输出的一串先序遍历字符串&#xff0c;根据此字符串建立一个二叉树&#xff08;以指针方式存储&#xff09;。例如如下的先序遍历字符串&#xff1a;ABC##DE#…

C++通过回车结束循环输入

试想一个案例&#xff0c;假设需要你输入n行数字&#xff0c;而每一行输入的数字数量都未知&#xff08;不定&#xff09;&#xff0c;如何通过C来实现这一操作&#xff1f; 本贴笔者给出一个具体案例&#xff1a;首先规定输入的行数&#xff0c;而后在每一行输入不定量的数字&…

Scratch 足球打蛤蟆

Scratch 足球打蛤蟆 本程序转换为HTML后运行。“足球”角色和角色“麦克斯”跟随鼠标&#xff0c;点击鼠标时“足球”角色复制并向鼠标方向开始移动&#xff0c;碰到边缘反弹&#xff0c;移动一定步数后删除。“蛤蟆”角色每0.5秒在随机位置和方向生成&#xff0c;碰到足球角色…

精彩回顾 | 模型与数据驱动工业数智化——Modelica暨装备数字化研讨会(2023)圆满召开

2023年6月30日&#xff0c;以“模型与数据驱动工业数智化”为主题的Modelica暨装备数字化研讨会&#xff08;2023&#xff09;在江苏省苏州市隆重召开。会议由苏州同元软控信息技术有限公司&#xff08;简称“同元软控”&#xff09;与哈尔滨工业大学计算学部等单位联合主办&am…

信息文档管理与配置管理

目录 ​编辑 一、软件文档的分类 1.1 开发文档 1.2 产品文档 1.3 管理文档 二、文档质量等级划分 2.1 1级文档 2.2 内部文档(2级) 2.3 工作文档&#xff08;3级&#xff09; 2.4 正式文档&#xff08;4级&#xff09; 三、配置管理 3.1 配置管理的定义 3.2 配置管理的6个主要…