Rarible로 민팅
Pinata IPFS 호스팅과 배포된 OpenZeppelin ERC-721 컨트랙트를 사용하여 Rarible Multichain SDK로 Chiliz Chain에 NFT를 민팅하고 판매 주문을 생성합니다.
마지막 업데이트
도움이 되었나요?
도움이 되었나요?
npm i @rarible/sdk @rarible/types ethers dotenv pinata# Chiliz RPC
RPC_URL=https://spicy-rpc.chiliz.com # or a Mainnet RPC
PRIVATE_KEY=0xabc... # minter's key (server-side ONLY)
# Rarible
RARIBLE_API_KEY=your_rarible_api_key
COLLECTION_ADDRESS=0xYourCollectionOnChiliz
SUPPLY=1 # 1 = ERC-721, >1 = ERC-1155
# Pinata
PINATA_JWT=eyJhbGciOi... # Pinata JWT from dashboard
PINATA_GATEWAY=your-subdomain.mypinata.cloud
# Media / metadata inputs
IMAGE_PATH=./art/image.png
NAME=My Chiliz NFT
DESCRIPTION=Minted on-chain via Rarible SDK
import 'dotenv/config'
import fs from 'fs'
import path from 'path'
import { Wallet, JsonRpcProvider } from 'ethers'
import { createRaribleSdk } from '@rarible/sdk'
import { toCollectionId, toUnionAddress } from '@rarible/types'
import { PinataSDK } from 'pinata'
function guessMime(p: string) {
const ext = path.extname(p).toLowerCase()
if (ext === '.png') return 'image/png'
if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg'
if (ext === '.webp') return 'image/webp'
if (ext === '.gif') return 'image/gif'
if (ext === '.mp4') return 'video/mp4'
if (ext === '.webm') return 'video/webm'
return 'application/octet-stream'
}
async function main() {
// Upload media to IPFS
const pinata = new PinataSDK({
pinataJwt: process.env.PINATA_JWT!,
})
const mediaPath = process.env.IMAGE_PATH!
const mediaBlob = new Blob([fs.readFileSync(mediaPath)], { type: guessMime(mediaPath) })
const mediaFile = new File([mediaBlob], path.basename(mediaPath), { type: guessMime(mediaPath) })
const mediaUpload = await pinata.upload.public.file(mediaFile)
const imageUri = `ipfs://${mediaUpload.cid}`
// console.log('imageUri:', imageUri)
// Build & upload metadata file
const metadata = {
name: process.env.NAME!,
description: process.env.DESCRIPTION!,
image: imageUri,
// animation_url: "ipfs://<cid>/video.mp4",
// attributes: [{ trait_type: "Tier", value: "Gold" }],
}
const metaUpload = await pinata.upload.public.json(metadata)
const metadataUri = `ipfs://${metaUpload.cid}`
// console.log('metadataUri:', metadataUri)
// Rarible on-chain mint
const provider = new JsonRpcProvider(process.env.RPC_URL!)
const wallet = new Wallet(process.env.PRIVATE_KEY!, provider)
const sdk = createRaribleSdk(wallet, 'prod', { apiKey: process.env.RARIBLE_API_KEY! })
// Union IDs use "<BLOCKCHAIN>:<address>" — here BLOCKCHAIN is "CHILIZ"
const collectionId = toCollectionId(`CHILIZ:${process.env.COLLECTION_ADDRESS}`)
const creator = toUnionAddress(`CHILIZ:${wallet.address}`)
const { transaction, itemId } = await sdk.nft.mint({
collectionId,
uri: metadataUri,
supply: Number(process.env.SUPPLY || 1), // 1 for 721, >1 for 1155
})
const { hash } = await transaction.wait()
console.log('Minted item:', itemId, 'tx:', hash)
}
main().catch((e) => (console.error(e), process.exit(1)))
# Chiliz RPC / wallet
RPC_URL=https://spicy-rpc.chiliz.com
PRIVATE_KEY=0xabc... # creator key (keep secret)
# Rarible
RARIBLE_API_KEY=your_rarible_api_key
COLLECTION_ADDRESS=0xYourCollectionOnChiliz # ERC-721 or ERC-1155
# Pinata
PINATA_JWT=eyJhbGciOi... # Pinata JWT from dashboard
PINATA_GATEWAY=your-subdomain.mypinata.cloud # optional (for previews)
# Media / metadata
IMAGE_PATH=./art/image.png
NAME=My Chiliz NFT
DESCRIPTION=Lazy-minted on Rarible (Chiliz)
SUPPLY=1 # 1 for 721; >1 for 1155 editions
import 'dotenv/config'
import fs from 'fs'
import path from 'path'
import { Wallet, JsonRpcProvider } from 'ethers'
import { createRaribleSdk } from '@rarible/sdk'
import { toCollectionId, toUnionAddress } from '@rarible/types'
import { PinataSDK } from 'pinata'
function guessMime(p: string) {
const ext = path.extname(p).toLowerCase()
if (ext === '.png') return 'image/png'
if (ext === '.jpg' || ext === '.jpeg') return 'image/jpeg'
if (ext === '.webp') return 'image/webp'
if (ext === '.gif') return 'image/gif'
if (ext === '.mp4') return 'video/mp4'
if (ext === '.webm') return 'video/webm'
return 'application/octet-stream'
}
async function main() {
// Upload media to IPFS
const pinata = new PinataSDK({
pinataJwt: process.env.PINATA_JWT!,
})
const mediaPath = process.env.IMAGE_PATH!
const mediaBlob = new Blob([fs.readFileSync(mediaPath)], { type: guessMime(mediaPath) })
const mediaFile = new File([mediaBlob], path.basename(mediaPath), { type: guessMime(mediaPath) })
const mediaUp = await pinata.upload.public.file(mediaFile)
const imageUri = `ipfs://${mediaUp.cid}`
const metadata = {
name: process.env.NAME!,
description: process.env.DESCRIPTION!,
image: imageUri,
// animation_url: "ipfs://<cid>/video.mp4",
// attributes: [{ trait_type: "Tier", value: "Gold" }],
}
const metaUp = await pinata.upload.public.json(metadata)
const metadataUri = `ipfs://${metaUp.cid}`
// Rarible lazy mint
const provider = new JsonRpcProvider(process.env.RPC_URL!)
const wallet = new Wallet(process.env.PRIVATE_KEY!, provider)
const sdk = createRaribleSdk(wallet, 'prod', { apiKey: process.env.RARIBLE_API_KEY! })
const collectionId = toCollectionId(`CHILIZ:${process.env.COLLECTION_ADDRESS}`)
const creator = toUnionAddress(`CHILIZ:${wallet.address}`)
// Prepare & submit lazy mint (off-chain item; buyer mints on purchase)
const prepared = await sdk.nft.mint.prepare({ collectionId })
const result = await prepared.submit({
uri: metadataUri,
supply: Number(process.env.SUPPLY || 1), // 1 for 721; >1 for 1155
lazyMint: true, // Yes, make it lazy please
creators: [{ account: creator, value: 10000 }], // 100% go to your wallet
royalties: [], // e.g. [{ account: creator, value: 500 }] for 5%
})
// console.log('Lazy itemId:', result.itemId)
}
main().catch((e) => (console.error(e), process.exit(1)))