Mintar com Rarible
Minte NFTs na Chiliz Chain usando o Rarible Multichain SDK com hospedagem IPFS via Pinata e um contrato OpenZeppelin ERC-721 implantado, incluindo criação de ordens de venda.
Atualizado
Isto foi útil?
Isto foi útil?
npm i @rarible/sdk @rarible/types ethers dotenv pinata# Chiliz RPC
RPC_URL=https://spicy-rpc.chiliz.com # ou um RPC da Mainnet
PRIVATE_KEY=0xabc... # chave do mintador (somente lado do servidor)
# Rarible
RARIBLE_API_KEY=your_rarible_api_key
COLLECTION_ADDRESS=0xYourCollectionOnChiliz
SUPPLY=1 # 1 = ERC-721, >1 = ERC-1155
# Pinata
PINATA_JWT=eyJhbGciOi... # JWT do Pinata do dashboard
PINATA_GATEWAY=your-subdomain.mypinata.cloud
# Entradas de mídia / metadados
IMAGE_PATH=./art/image.png
NAME=My Chiliz NFT
DESCRIPTION=Minted on-chain via Rarible SDKimport '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 de mídia para o 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)
// Construir e fazer upload do arquivo de metadados
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)
// Mint on-chain com Rarible
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! })
// IDs Union usam "<BLOCKCHAIN>:<address>" — aqui BLOCKCHAIN é "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 para 721, >1 para 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... # chave do criador (mantenha em segredo)
# Rarible
RARIBLE_API_KEY=your_rarible_api_key
COLLECTION_ADDRESS=0xYourCollectionOnChiliz # ERC-721 ou ERC-1155
# Pinata
PINATA_JWT=eyJhbGciOi... # JWT do Pinata do dashboard
PINATA_GATEWAY=your-subdomain.mypinata.cloud # opcional (para pré-visualizações)
# Mídia / metadados
IMAGE_PATH=./art/image.png
NAME=My Chiliz NFT
DESCRIPTION=Lazy-minted on Rarible (Chiliz)
SUPPLY=1 # 1 para 721; >1 para edições 1155import '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 de mídia para o 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}`
// Lazy mint com Rarible
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}`)
// Preparar e enviar lazy mint (item off-chain; comprador minta na compra)
const prepared = await sdk.nft.mint.prepare({ collectionId })
const result = await prepared.submit({
uri: metadataUri,
supply: Number(process.env.SUPPLY || 1), // 1 para 721; >1 para 1155
lazyMint: true, // Sim, lazy mint por favor
creators: [{ account: creator, value: 10000 }], // 100% vai para sua carteira
royalties: [], // ex.: [{ account: creator, value: 500 }] para 5%
})
// console.log('Lazy itemId:', result.itemId)
}
main().catch((e) => (console.error(e), process.exit(1)))