# Rarible ile mint etme

Rarible, birkaç EVM ağı üzerinde NFT uygulamaları oluşturmak için SDK'lar ve API'ler sunan çok zincirli bir NFT protokolü ve pazaryeridir.

NFT basımı için [Rarible Multichain SDK](https://docs.rarible.org/reference/getting-started) kendi veya paylaşılan koleksiyonlarınıza basım yapmanıza ve hemen satış emirleri oluşturmanıza olanak tanır.

Rarible SDK, IPFS yüklemesini işlemediği için, buradaki örneklerimiz [Pinata](https://pinata.cloud/) bir IPFS barındırıcısı olarak kullanır. Bir JWT anahtarı elde etmek için bir Pinata hesabına ihtiyacınız olacak.

Ayrıca sizden şunlara sahip olmanız istenecek:

* Chiliz Chain üzerinde önceden dağıtılmış bir ERC-721 kontratı. Bir [OpenZeppelin ERC-721 kontratı](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol) Chiliz Chain üzerine kendiniz dağıtmanız gerekir. [Remix IDE](https://remix.ethereum.org/) bunu tarayıcı içinde yapmanızı sağlar. Kontratı bir blok gezgini kullanarak doğrulamayı unutmayın!
* Bir Rarible API anahtarı. Bir tane nasıl elde edeceğinizi öğrenmek için Getting Started bölümüne bakın:

{% embed url="<https://docs.rarible.org/docs/rarible-protocol>" %}

Rarible SDK'yı kullanmak için birkaç kurulum yapmamız gerekiyor:

```bash
npm i @rarible/sdk @rarible/types ethers dotenv pinata
```

{% hint style="warning" %}
Şunu kullandığımızı fark edeceksiniz: `ethers`, bu da `viem` yerine bir alternatiftir; bunu diğer bölümlerde kullandık.\
Gerçekten de, [Rarible,](https://docs.rarible.org/reference/getting-started#interacting-with-evm-wallets) geliştiricilere Web3 cüzdanlarıyla çalışmak için ethers.js veya web3.js kullanmalarını önerir — ve [web3.js](https://web3js.org/#/) [Mart 2025'te kullanımdan kaldırıldı](https://blog.chainsafe.io/web3-js-sunset/), geriye yalnızca `ethers` fiili tercih olarak kalıyor.
{% endhint %}

## NFT koleksiyonu basma

İlk olarak, .env dosyanızı oluşturun:

```
# Chiliz RPC
RPC_URL=https://spicy-rpc.chiliz.com       # veya bir Mainnet RPC
PRIVATE_KEY=0xabc...                       # basıcının anahtarı (SADECE sunucu tarafında)

# Rarible
RARIBLE_API_KEY=your_rarible_api_key
COLLECTION_ADDRESS=0xYourCollectionOnChiliz
SUPPLY=1                                   # 1 = ERC-721, >1 = ERC-1155

# Pinata
PINATA_JWT=eyJhbGciOi...                   # panodan alınan Pinata JWT
PINATA_GATEWAY=your-subdomain.mypinata.cloud

# Medya / metadata girdileri
IMAGE_PATH=./art/image.png
NAME=My Chiliz NFT
DESCRIPTION=Rarible SDK aracılığıyla zincir üstünde basıldı

```

Tercih ettiğimiz iş akışı şudur:

1. Medyayı Pinata aracılığıyla IPFS'ye yükle
2. Metadata dosyasını oluştur ve yükle
3. Rarible SDK + zincir üstü basım

İlham alabileceğiniz tam örnek betik burada:

{% code overflow="wrap" lineNumbers="true" fullWidth="true" %}

```bash
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() {
  // Medyayı IPFS'ye yükle
  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)

  // Metadata dosyasını oluştur ve yükle
  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 zincir üstü basım
  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 ID'leri "<BLOCKCHAIN>:<address>" biçimini kullanır — burada 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), // 721 için 1, 1155 için >1
  })

  const { hash } = await transaction.wait()
  console.log('Basılan öğe:', itemId, 'tx:', hash)
}

main().catch((e) => (console.error(e), process.exit(1)))

```

{% endcode %}

## Bir NFT koleksiyonunu lazy mint etme

Lazy Minting, bir NFT'yi satışa koymadan önce basmanın peşin maliyetini ödemek istemeyenler için bir seçenektir. NFT'lerini satın alınmak üzere listeleyebilir, ardından yalnızca satın alındığında veya transfer edildiğinde basabilirler. Bu nedenle gas ücretleri basım sürecinin bir parçasıdır ve alıcı tarafından ödenir.

Kısacası, lazy minting, NFT'nin blok zincirine satın alma gerçekleşmeden önce değil, ancak biri NFT'yi satın aldığında eklenmesi demektir.

Düzgün tanımlanmış bir .env dosyasına ihtiyacınız olacak:

```
# Chiliz RPC / cüzdan
RPC_URL=https://spicy-rpc.chiliz.com
PRIVATE_KEY=0xabc...                         # oluşturucunun anahtarı (gizli tutun)

# Rarible
RARIBLE_API_KEY=your_rarible_api_key
COLLECTION_ADDRESS=0xYourCollectionOnChiliz   # ERC-721 veya ERC-1155

# Pinata
PINATA_JWT=eyJhbGciOi...                      # panodan alınan Pinata JWT
PINATA_GATEWAY=your-subdomain.mypinata.cloud  # isteğe bağlı (önizlemeler için)

# Medya / metadata
IMAGE_PATH=./art/image.png
NAME=My Chiliz NFT
DESCRIPTION=Rarible üzerinde lazy-minted (Chiliz)
SUPPLY=1                                      # 721 için 1; 1155 edisyonları için >1

```

Ve şimdi projenizi lazy mint etmek için örnek kod:

{% code overflow="wrap" lineNumbers="true" fullWidth="true" %}

```typescript
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() {
  // Medyayı IPFS'ye yükle
  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}`)

  // Lazy mint'i hazırla ve gönder (zincir dışı öğe; alıcı satın alırken basar)
  const prepared = await sdk.nft.mint.prepare({ collectionId })
  const result = await prepared.submit({
    uri: metadataUri,
    supply: Number(process.env.SUPPLY || 1),     // 721 için 1; 1155 için >1
    lazyMint: true,                              // Evet, lütfen lazy olsun
    creators: [{ account: creator, value: 10000 }], // %100'ü cüzdanınıza gider
    royalties: [],                               // ör. %5 için [{ account: creator, value: 500 }]
  })

  // console.log('Lazy itemId:', result.itemId)
}

main().catch((e) => (console.error(e), process.exit(1)))

```

{% endcode %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.chiliz.com/tr-ai/develop/advanced/work-with-nfts/minting-with-rarible.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
