Skip to main content

Pack

Learn how to interact with your Pack contract in the SDK.

Create a Pack Contract

Deploys a new Pack contract
const sdk = useSDK();

const contractAddress = await sdk.deployer.deployPack({
name: "My Pack",
primary_sale_recipient: "your-address",
});

Getting the contract in your application

To start using your Pack contract inside your application, you'll need to use its contract address. You can get the contract address from the dashboard.

import { usePack } from '@thirdweb-dev/react'

export default function Component() {
const pack = usePack("<YOUR-CONTRACT-ADDRESS>")

// Now you can use the pack contract in the rest of the component
}

Setting Royalty Fees

Configure royalties
// royalties on the whole contract
contract.royalties.setDefaultRoyaltyInfo({
seller_fee_basis_points: 100, // 1%
fee_recipient: "0x..."
});
// override royalty for a particular pack
contract.royalties.setTokenRoyaltyInfo(packId, {
seller_fee_basis_points: 500, // 5%
fee_recipient: "0x..."
});

Create a Pack

You can bundle any number of ERC20, ERC721, or ERC1155 tokens into a set quantity of ERC1155 pack NFTs.

When you create a pack, it is minted as a new NFT in the smart contract.

const pack = {
// The metadata for the pack NFT itself
packMetadata: {
name: "My Pack",
description: "This is a new pack",
image: "ipfs://...",
},
// ERC20 rewards to be included in the pack
erc20Rewards: [
{
assetContract: "0x...",
quantityPerReward: 5,
quantity: 100,
totalRewards: 20,
}
],
// ERC721 rewards to be included in the pack
erc721Rewards: [
{
assetContract: "0x...",
tokenId: 0,
}
],
// ERC1155 rewards to be included in the pack
erc1155Rewards: [
{
assetContract: "0x...",
tokenId: 0,
quantityPerReward: 1,
totalRewards: 100,
}
],
openStartTime: new Date(), // the date that packs can start to be opened, defaults to now
rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1
}

const tx = await contract.createTo("0x...", pack);

Airdrop a Pack

Airdrop multiple NFTs
// The token ID of the NFT you want to airdrop
const tokenId = "0";
// Array of objects of addresses and quantities to airdrop NFTs to
const addresses = [
{
address: "0x...",
quantity: 2,
},
{
address: "0x...",
quantity: 3,
},
];
await contract.airdrop(tokenId, addresses);

// You can also pass an array of addresses, it will airdrop 1 NFT per address
const tokenId = "0";
const addresses = [
"0x...", "0x...", "0x...",
]
await contract.airdrop(tokenId, addresses);

View Packs

One

Get a single NFT Metadata
const { contract } = useContract(<ContractAddress>);
const { data: nft, isLoading, error } = useNFT(contract?.nft, <tokenId>);
View in React SDK Documentation

All

Get All Packs
const { contract } = useContract(<ContractAddress>);
const { data: nfts, isLoading, error } = useNFTs(contract?.nft, { start: 0, count: 100 });
View in React SDK Documentation

Owned by a specific wallet

Get Owned Packs
const { contract } = useContract(<ContractAddress>);
const { data: ownedNFTs, isLoading, error } = useOwnedNFTs(contract?.nft, <OwnerWalletAddress>);
View in React SDK Documentation

Amount owned by a specific wallet

Get NFT Balance
const { contract } = useContract(<ContractAddress>);
const { data: ownerBalance, isLoading, error } = useNFTBalance(contract?.nft, <OwnerWalletAddress>);
View in React SDK Documentation

View Pack Contents

You can view all of the rewards that were bundled to create the packs, but not the contents of each individual pack.

const packId = 0;
const contents = await contract.getPackContents(packId);
console.log(contents.erc20Rewards);
console.log(contents.erc721Rewards);
console.log(contents.erc1155Rewards);

Open Pack

When you open a pack, you receive the tokens within it and burn the pack NFT.

Only the owner of a pack can open it.

Multiple of the same pack can be opened at once.

const tokenId = 0
const amount = 1
const tx = await contract.open(tokenId, amount);

Transferring NFTs

You must be the owner of the pack you're trying to transfer for this to be successful.

// Address of the wallet you want to send the NFT to
const toAddress = "{{wallet_address}}";
const tokenId = "0"; // The token ID of the NFT you want to send
const amount = 3; // How many copies of the NFTs to transfer
await contract.transfer(toAddress, tokenId, amount);