Skip to content

Commit ef2630d

Browse files
committed
数字藏品
0 parents  commit ef2630d

File tree

3 files changed

+196
-0
lines changed

3 files changed

+196
-0
lines changed

generate_metadata.js

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
const fs = require("fs");
2+
const path = require("path");
3+
const { loadImage } = require("canvas");
4+
5+
const basePath = process.cwd();
6+
const buildDir = `${basePath}/build/json`;
7+
const inputDir = `${basePath}/build/images`;
8+
const namePrefix = "sneaker";
9+
const description = "sneakernft world";
10+
const baseUri = "ipfs://NewUriToReplace";
11+
const console = require("console");
12+
13+
const metadataList = [];
14+
15+
const buildSetup = () => {
16+
if (fs.existsSync(buildDir)) {
17+
fs.rmdirSync(buildDir, { recursive: true });
18+
}
19+
fs.mkdirSync(buildDir);
20+
};
21+
22+
const getImages = (_dir) => {
23+
try {
24+
return fs
25+
.readdirSync(_dir)
26+
.filter((item) => {
27+
let extension = path.extname(`${_dir}${item}`);
28+
if (extension == ".png" || extension == ".jpg") {
29+
return item;
30+
}
31+
})
32+
.map((i) => {
33+
return {
34+
filename: i,
35+
path: `${_dir}/${i}`,
36+
};
37+
});
38+
} catch {
39+
return null;
40+
}
41+
};
42+
43+
const loadImgData = async (_imgObject) => {
44+
try {
45+
const image = await loadImage(`${_imgObject.path}`);
46+
return {
47+
imgObject: _imgObject,
48+
loadedImage: image,
49+
};
50+
} catch (error) {
51+
console.error("Error loading image:", error);
52+
}
53+
};
54+
55+
56+
57+
const saveMetadata = (_loadedImageObject) => {
58+
let shortName = _loadedImageObject.imgObject.filename.replace(
59+
/\.[^/.]+$/,
60+
""
61+
);
62+
63+
64+
65+
let tempMetadata = {
66+
name: `${namePrefix} #${shortName}`,
67+
description: description,
68+
image: `${baseUri}/${shortName}.png`,
69+
};
70+
fs.writeFileSync(
71+
`${buildDir}/${shortName}.json`,
72+
JSON.stringify(tempMetadata, null, 2)
73+
);
74+
metadataList.push(tempMetadata);
75+
};
76+
77+
const writeMetaData = (_data) => {
78+
fs.writeFileSync(`${buildDir}/_metadata.json`, _data);
79+
};
80+
81+
const startCreating = async () => {
82+
const images = getImages(inputDir);
83+
if (images == null) {
84+
console.log("Please generate collection first.");
85+
return;
86+
}
87+
let loadedImageObjects = [];
88+
images.forEach((imgObject) => {
89+
loadedImageObjects.push(loadImgData(imgObject));
90+
});
91+
await Promise.all(loadedImageObjects).then((loadedImageObjectArray) => {
92+
loadedImageObjectArray.forEach((loadedImageObject) => {
93+
94+
saveMetadata(loadedImageObject);
95+
console.log(
96+
`Created metadata for image: ${loadedImageObject.imgObject.filename}`
97+
);
98+
});
99+
});
100+
writeMetaData(JSON.stringify(metadataList, null, 2));
101+
};
102+
103+
buildSetup();
104+
startCreating();

sneaker.sol

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// SPDX-License-Identifier: MIT;
2+
3+
pragma solidity ^0.8.0;
4+
5+
import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";
6+
import "@openzeppelin/contracts/utils/Counters.sol";
7+
8+
9+
contract Sneaker is ERC1155 {
10+
11+
using Counters for Counters.Counter;
12+
Counters.Counter private _tokenId;
13+
14+
mapping(uint => string) private _tokenURIs;
15+
16+
constructor() ERC1155("ipfs://bafybeiglsd5it3st6h3znasju72rz7lndyz7325x2nez6g6jcvetsuvrom/") {}
17+
18+
function mint(address _recipient,uint _amount, string memory _tokenUrl) public returns(uint _mintTokenId){
19+
require(bytes(_tokenUrl).length > 0,"The _tokenUrl must be have");
20+
require(_amount > 0,"The _amount must be have");
21+
_tokenId.increment();
22+
uint newTokenId = _tokenId.current();
23+
_mint(_recipient, newTokenId,_amount,"");
24+
_tokenURIs[newTokenId] = _tokenUrl;
25+
return newTokenId;
26+
}
27+
28+
function mintBatch(address _recipient,uint[] memory _amounts,string[] memory _tokenUrls) public returns(uint[] memory _mintTokenIds){
29+
require(_amounts.length > 0,"The _amounts must be have");
30+
require(_tokenUrls.length > 0,"The _tokenUrls must be have");
31+
require(_amounts.length == _tokenUrls.length,"The _tokenUrl length must be Equal _amounts length");
32+
33+
uint newTokenId;
34+
uint[] memory returnTokenUrls = new uint[](_amounts.length);
35+
36+
for(uint256 i = 0; i < _amounts.length; i++){
37+
_tokenId.increment();
38+
newTokenId = _tokenId.current();
39+
_tokenURIs[newTokenId] = _tokenUrls[i];
40+
returnTokenUrls[i] = newTokenId;
41+
}
42+
43+
_mintBatch(_recipient, returnTokenUrls,_amounts,"");
44+
45+
return returnTokenUrls;
46+
}
47+
48+
function uri(uint256 _id) public view override returns(string memory _tokenUrl){
49+
return _tokenURIs[_id];
50+
51+
}
52+
53+
function uriBatch(uint[] memory _tokenIds) public view returns(string[] memory _tokenUrls){
54+
require(_tokenIds.length > 0,"The _tokenId must be have");
55+
56+
string[] memory returnTokenUrl = new string[](_tokenIds.length);
57+
58+
for(uint256 i=0;i<_tokenIds.length;i++){
59+
returnTokenUrl[i] = _tokenURIs[_tokenIds[i]];
60+
}
61+
62+
return returnTokenUrl;
63+
}
64+
65+
}

storeDirectory.mjs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { NFTStorage } from 'nft.storage'
2+
import { filesFromPath } from 'files-from-path'
3+
import path from 'path'
4+
5+
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDQwNmZBM0VGMDI3N0M3ODBFMUE4RUIyODlDN2QxYjI4OGUxQ0ExOEQiLCJpc3MiOiJuZnQtc3RvcmFnZSIsImlhdCI6MTY2MTQwNzEzMzgwNywibmFtZSI6ImNyc2UifQ.-G1OkaAjDt0yQgW243oGWqE9TX-iVVYfFUgVVW6t39I'
6+
7+
async function main() {
8+
// you'll probably want more sophisticated argument parsing in a real app
9+
if (process.argv.length !== 3) {
10+
console.error(`usage: ${process.argv[0]} ${process.argv[1]} <directory-path>`)
11+
}
12+
const directoryPath = process.argv[2]
13+
const files = filesFromPath(directoryPath, {
14+
pathPrefix: path.resolve(directoryPath), // see the note about pathPrefix below
15+
hidden: true, // use the default of false if you want to ignore files that start with '.'
16+
})
17+
18+
const storage = new NFTStorage({ token })
19+
20+
console.log(`storing file(s) from ${path}`)
21+
const cid = await storage.storeDirectory(files)
22+
console.log({ cid })
23+
24+
const status = await storage.status(cid)
25+
console.log(status)
26+
}
27+
main()

0 commit comments

Comments
 (0)