From 0b8fe44ff09efde6a262e07e40c75a88cd515202 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Mon, 13 Jun 2022 22:35:31 -0400 Subject: [PATCH 01/12] Add pack contract implementation --- package.json | 2 +- src/contracts/pack.ts | 678 ++++++++++++------------------- src/schema/tokens/common/wrap.ts | 31 ++ src/schema/tokens/index.ts | 1 + src/schema/tokens/pack.ts | 63 +++ src/types/index.ts | 1 - src/types/packs.ts | 52 --- yarn.lock | 8 +- 8 files changed, 356 insertions(+), 480 deletions(-) create mode 100644 src/schema/tokens/common/wrap.ts create mode 100644 src/schema/tokens/pack.ts delete mode 100644 src/types/packs.ts diff --git a/package.json b/package.json index 6f6a58fec..df2cf4bc0 100644 --- a/package.json +++ b/package.json @@ -105,7 +105,7 @@ "ethers": "^5" }, "dependencies": { - "@thirdweb-dev/contracts": "2.3.14", + "@thirdweb-dev/contracts": "2.3.15-0", "@web-std/file": "^3.0.0", "cbor": "^8.1.0", "cross-fetch": "^3.1.5", diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 674ded1e8..27209ee3a 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -1,39 +1,41 @@ -import { UpdateableNetwork } from "../core/interfaces/contract"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { ContractInterceptor } from "../core/classes/contract-interceptor"; import { IStorage } from "../core/interfaces/IStorage"; import { NetworkOrSignerOrProvider, - TransactionResult, TransactionResultWithId, } from "../core/types"; import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractEncoder } from "../core/classes/contract-encoder"; import { SDKOptions } from "../schema/sdk-options"; -import { IERC1155, IERC20, Pack as PackContract } from "contracts"; +import { Pack as PackContract } from "contracts"; import { PacksContractSchema } from "../schema/contracts/packs"; import { ContractRoles } from "../core/classes/contract-roles"; -import { NFTMetadata } from "../schema/tokens/common"; -import { BigNumber, BigNumberish, BytesLike, Contract, ethers } from "ethers"; -import { fetchTokenMetadataForContract } from "../common/nft"; -import { - IPackBatchArgs, - IPackCreateArgs, - PackMetadata, - PackMetadataWithBalance, - PackNFTMetadata, -} from "../types/packs"; -import { NotFoundError } from "../common"; -import { CurrencyValue } from "../types/currency"; -import { fetchCurrencyValue } from "../common/currency"; -import { ChainlinkVrf } from "../constants/chainlink"; import { ContractRoyalty } from "../core/classes/contract-royalty"; -import { GasCostEstimator } from "../core/classes"; +import { Erc1155 } from "../core/classes/erc-1155"; +import { GasCostEstimator } from "../core/classes/gas-cost-estimator"; import { ContractEvents } from "../core/classes/contract-events"; -import { PackAddedEvent, PackOpenRequestedEvent } from "contracts/Pack"; -import ERC1155Abi from "../../abis/IERC1155.json"; -import ERC20Abi from "../../abis/IERC20.json"; import { ContractAnalytics } from "../core/classes/contract-analytics"; +import { + PackMetadataInput, + PackMetadataInputSchema, + PackMetadataOutput, + PackRewards, +} from "../schema/tokens/pack"; +import { + ITokenBundle, + PackCreatedEvent, + PackOpenedEvent, +} from "contracts/Pack"; +import { ethers } from "ethers"; +import { + fetchCurrencyMetadata, + hasERC20Allowance, + normalizePriceValue, +} from "../common/currency"; +import { isTokenApprovedForTransfer } from "../common/marketplace"; +import { uploadOrExtractURI } from "../common/nft"; +import { EditionMetadata } from "../schema"; /** * Create lootboxes of NFTs with rarity based open mechanics. @@ -49,7 +51,7 @@ import { ContractAnalytics } from "../core/classes/contract-analytics"; * * @public */ -export class Pack implements UpdateableNetwork { +export class Pack extends Erc1155 { static contractType = "pack" as const; static contractRoles = ["admin", "minter", "pauser", "transfer"] as const; static contractAbi = require("../../abis/Pack.json"); @@ -57,9 +59,7 @@ export class Pack implements UpdateableNetwork { * @internal */ static schema = PacksContractSchema; - - private contractWrapper: ContractWrapper; - private storage: IStorage; + // TODO: Change schema and deployment public metadata: ContractMetadata; public roles: ContractRoles; @@ -105,8 +105,7 @@ export class Pack implements UpdateableNetwork { options, ), ) { - this.contractWrapper = contractWrapper; - this.storage = storage; + super(contractWrapper, storage, options); this.metadata = new ContractMetadata( this.contractWrapper, Pack.schema, @@ -121,448 +120,283 @@ export class Pack implements UpdateableNetwork { this.interceptor = new ContractInterceptor(this.contractWrapper); } - onNetworkUpdated(network: NetworkOrSignerOrProvider) { - this.contractWrapper.updateSignerOrProvider(network); - } - - getAddress(): string { - return this.contractWrapper.readContract.address; - } - /** ****************************** - * READ FUNCTIONS + * WRITE FUNCTIONS *******************************/ /** - * Get a pack by id - * @param packId - the id of the pack to fetch - * @returns the pack metadata - */ - public async get(packId: BigNumberish): Promise { - const [meta, state, supply] = await Promise.all([ - fetchTokenMetadataForContract( - this.getAddress(), - this.contractWrapper.getProvider(), - packId, - this.storage, - ), - this.contractWrapper.readContract.packs(packId), - this.contractWrapper.readContract - .totalSupply(packId) - .catch(() => BigNumber.from("0")), - ]); - return { - id: BigNumber.from(packId).toString(), - metadata: meta, - creator: state.creator, - currentSupply: supply, - openStart: state.openStart.gt(0) - ? new Date(state.openStart.toNumber() * 1000) - : null, - }; - } - - /** - * Get Pack Data - * - * @remarks Get data associated with every pack in this contract. - * - * @example - * ```javascript - * const packs = await contract.getAll(); - * console.log(packs); - * ``` - * - * @returns The NFT metadata for all NFTs in the contract. - */ - public async getAll(): Promise { - const maxId = ( - await this.contractWrapper.readContract.nextTokenId() - ).toNumber(); - return await Promise.all( - Array.from(Array(maxId).keys()).map((i) => this.get(i.toString())), - ); - } - - /** - * Get Pack Reward Data - * - * @remarks Get data associated with the rewards inside a specified pack - * - * @example - * ```javascript - * // The pack ID of the pack whos rewards you want to get - * const packId = 0; - * - * const nfts = await contract.getNFTs(packId); - * console.log(nfts); - * ``` + * Create Pack + * @remarks Create a new pack with the given metadata and rewards and mint it to the connected wallet. * - * @returns The NFT metadata for all NFTs in the contract. + * @param metadataWithRewards - the metadata and rewards to include in the pack */ - public async getNFTs(packId: string): Promise { - const packReward = - await this.contractWrapper.readContract.getPackWithRewards(packId); - if (!packReward.source) { - throw new NotFoundError(); - } - const rewards = await Promise.all( - packReward.tokenIds.map((tokenId) => - fetchTokenMetadataForContract( - packReward.source, - this.contractWrapper.getProvider(), - tokenId.toString(), - this.storage, - ), - ), - ); - return rewards.map((reward, i) => ({ - supply: packReward.amountsPacked[i], - metadata: reward, - })); + public async create(metadataWithRewards: PackMetadataInput) { + const signerAddress = await this.contractWrapper.getSignerAddress(); + return this.createTo(signerAddress, metadataWithRewards); } /** - * Get Pack Balance + * Create Pack To Wallet + * @remarks Create a new pack with the given metadata and rewards and mint it to the specified address. * - * @remarks Get a wallets pack balance (number of a specific packs in this contract owned by the wallet). + * @param to - the address to mint the pack to + * @param metadataWithRewards - the metadata and rewards to include in the pack * * @example * ```javascript - * // Address of the wallet to check pack balance - * const address = "{{wallet_address}}"; - * // The token ID of the pack you want to check the wallets balance of - * const tokenId = "0" + * const packMetadata = { + * // The metadata for the pack NFT itself + * metadata: { + * name: "My Pack", + * description: "This is a new pack", + * image: "ipfs://...", + * }, + * // ERC20 rewards to be included in the pack + * erc20Rewards: [ + * { + * assetContract: "0x...", + * quantity: 100, + * } + * ], + * // 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, + * quantity: 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 balance = await contract.balanceOf(address, tokenId); - * console.log(balance); + * const tx = await contract.createTo("0x...", packMetadata); * ``` */ - public async balanceOf(address: string, tokenId: string): Promise { - return await this.contractWrapper.readContract.balanceOf(address, tokenId); - } - - public async balance(tokenId: string): Promise { - return await this.balanceOf( - await this.contractWrapper.getSignerAddress(), - tokenId, + public async createTo( + to: string, + metadataWithRewards: PackMetadataInput, + ): Promise> { + const uri = await uploadOrExtractURI( + metadataWithRewards.metadata, + this.storage, ); - } - public async isApproved(address: string, operator: string): Promise { - return await this.contractWrapper.readContract.isApprovedForAll( - address, - operator, + const parsedMetadata = PackMetadataInputSchema.parse(metadataWithRewards); + const { contents, numOfRewardUnits } = await this.toPackContentArgs( + parsedMetadata, ); - } - public async getLinkBalance(): Promise { - const chainId = await this.contractWrapper.getChainID(); - const chainlink = ChainlinkVrf[chainId]; - const erc20 = new Contract( - chainlink.linkTokenAddress, - ERC20Abi, - this.contractWrapper.getProvider(), - ) as IERC20; - return await fetchCurrencyValue( - this.contractWrapper.getProvider(), - chainlink.linkTokenAddress, - await erc20.balanceOf(this.getAddress()), - ); - } - - /** - * `getOwned` is a convenience method for getting all owned tokens - * for a particular wallet. - * - * @param _address - The address to check for token ownership - * @returns An array of PackMetadataWithBalance objects that are owned by the address - */ - public async getOwned(_address?: string): Promise { - const address = _address - ? _address - : await this.contractWrapper.getSignerAddress(); - const maxId = await this.contractWrapper.readContract.nextTokenId(); - const balances = await this.contractWrapper.readContract.balanceOfBatch( - Array(maxId.toNumber()).fill(address), - Array.from(Array(maxId.toNumber()).keys()), - ); + const receipt = await this.contractWrapper.sendTransaction("createPack", [ + contents, + numOfRewardUnits, + uri, + parsedMetadata.openStartTime, + parsedMetadata.rewardsPerPack, + to, + ]); - const ownedBalances = balances - .map((b, i) => { - return { - tokenId: i, - balance: b, - }; - }) - .filter((b) => b.balance.gt(0)); - return await Promise.all( - ownedBalances.map(async ({ tokenId, balance }) => { - const token = await this.get(tokenId.toString()); - return { ...token, ownedByAddress: balance }; - }), + const event = this.contractWrapper.parseLogs( + "PackCreated", + receipt?.logs, ); + if (event.length === 0) { + throw new Error("PackCreated event not found"); + } + const packId = event[0].args.packId; + return { + id: packId, + receipt, + data: () => this.get(packId), + }; } - /** ****************************** - * WRITE FUNCTIONS - *******************************/ - /** * Open Pack * - * @remarks Open a pack to burn it and obtain the reward asset inside. + * @remarks - Open a pack to reveal the contained rewards. This will burn the specified pack and + * the contained assets will be transferred to the opening users wallet. + * + * @param tokenId - the token ID of the pack you want to open + * @param amount - the amount of packs you want to open * * @example * ```javascript - * // The pack ID of the asset you want to buy - * const packId = "0"; - * const tx = await contract.open(packId); - * const receipt = tx.receipt; // the transaction receipt - * const packId = tx.id; // the id of the pack that was opened - * const rewards = tx.data(); // the contents of the opened pack + * const tokenId = 0 + * const amount = 1 + * const tx = await contract.open(tokenId, amount); * ``` */ - public async open( - packId: string, - ): Promise[]> { + public async open(tokenId: number, amount = 1): Promise { const receipt = await this.contractWrapper.sendTransaction("openPack", [ - packId, + tokenId, + amount, ]); - const logs = this.contractWrapper.parseLogs( - "PackOpenRequested", + const event = this.contractWrapper.parseLogs( + "PackOpened", receipt?.logs, ); - if (logs.length === 0) { - throw new Error("Failed to open pack"); + if (event.length === 0) { + throw new Error("PackOpened event not found"); + } + const rewards = event[0].args.rewardUnitsDistributed; + + const erc20Rewards = []; + const erc721Rewards = []; + const erc1155Rewards = []; + + for (const reward of rewards) { + switch (reward.tokenType) { + case 0: { + const tokenMetadata = await fetchCurrencyMetadata( + this.contractWrapper.getProvider(), + reward.assetContract, + ); + erc20Rewards.push({ + contractAddress: reward.assetContract, + quantity: ethers.utils.formatUnits( + reward.totalAmount, + tokenMetadata.decimals, + ), + }); + break; + } + case 1: { + erc721Rewards.push({ + contractAddress: reward.assetContract, + tokenId: reward.tokenId.toNumber(), + }); + break; + } + case 2: { + erc1155Rewards.push({ + contractAddress: reward.assetContract, + tokenId: reward.tokenId.toNumber(), + quantity: reward.totalAmount.toNumber(), + }); + break; + } + } } - const event = logs[0]; - - const requestId = event.args.requestId; - const opener = event.args.opener; - - // TODO type this - const fulfillEvent: any = await new Promise((resolve) => { - this.contractWrapper.readContract.once( - this.contractWrapper.readContract.filters.PackOpenFulfilled( - null, - opener, - ), - (_packId, _opener, _requestId, rewardContract, rewardIds) => { - if (requestId === _requestId) { - resolve({ - packId: _packId, - opener: _opener, - requestId, - rewardContract, - rewardIds, - }); - } - }, - ); - }); - - const { rewardIds, rewardContract } = fulfillEvent; - return rewardIds.map((rewardId: BigNumber) => ({ - id: packId, - receipt, - data: () => - fetchTokenMetadataForContract( - rewardContract, - this.contractWrapper.getProvider(), - rewardId.toString(), - this.storage, - ), - })); + return { + erc20Rewards, + erc721Rewards, + erc1155Rewards, + }; } - /** - * Create Pack - * - * @remarks Create a new pack with its own rewards. - * - * @example - * ```javascript - * // Data to create the pack - * const pack = { - * // The address of the contract that holds the rewards you want to include - * assetContract: "0x...", - * // The metadata of the pack - * metadata: { - * name: "Cool Pack", - * description: "This is a cool pack", - * // This can be an image url or image file - * image: readFileSync("path/to/image.png"), - * }, - * // The NFTs you want to include in the pack - * assets: [ - * { - * tokenId: 0, // The token ID of the asset you want to add - * amount: 1, // The amount of the asset you want to add - * }, { - * tokenId: 1, - * amount: 1, - * } - * ], - * }; - * - * await contract.create(pack); - * ``` - * - * @param args - Args for the pack creation - * @returns - The newly created pack metadata - */ - public async create( - args: IPackCreateArgs, - ): Promise> { - const asset = new Contract( - args.assetContract, - ERC1155Abi, - this.contractWrapper.getSigner() || this.contractWrapper.getProvider(), - ) as IERC1155; - - const from = await this.contractWrapper.getSignerAddress(); - const ids = args.assets.map((a) => a.tokenId); - const amounts = args.assets.map((a) => a.amount); - const uri = await this.storage.uploadMetadata(args.metadata); - - const packParams = ethers.utils.defaultAbiCoder.encode( - ["string", "uint256", "uint256"], - [uri, args.secondsUntilOpenStart || 0, args.rewardsPerOpen || 1], - ); + /** ***************************** + * PRIVATE FUNCTIONS + *******************************/ + private async toPackContentArgs(metadataWithRewards: PackMetadataOutput) { + const contents: ITokenBundle.TokenStruct[] = []; + const numOfRewardUnits = []; + const { erc20Rewards, erc721Rewards, erc1155Rewards } = metadataWithRewards; + + const provider = this.contractWrapper.getProvider(); + const owner = await this.contractWrapper.getSignerAddress(); + + for (const erc20 of erc20Rewards) { + const normalizedQuantity = await normalizePriceValue( + provider, + erc20.quantity, + erc20.contractAddress, + ); + // Multiply the quantity of one reward by the number of rewards + const totalQuantity = normalizedQuantity.mul(erc20.totalRewards); + const hasAllowance = await hasERC20Allowance( + this.contractWrapper, + erc20.contractAddress, + totalQuantity, + ); + if (!hasAllowance) { + throw new Error( + `ERC20 token with contract address "${ + erc20.contractAddress + }" does not have enough allowance to transfer.\n\nYou can set allowance to the multiwrap contract to transfer these tokens by running:\n\nawait sdk.getToken("${ + erc20.contractAddress + }").setAllowance("${this.getAddress()}", ${totalQuantity});\n\n`, + ); + } + + numOfRewardUnits.push(erc20.totalRewards); + contents.push({ + assetContract: erc20.contractAddress, + tokenType: 0, + totalAmount: totalQuantity, + tokenId: 0, + }); + } - // TODO: make it gasless - const tx = await asset.safeBatchTransferFrom( - from, - this.getAddress(), - ids, - amounts, - packParams, - await this.contractWrapper.getCallOverrides(), - ); + for (const erc721 of erc721Rewards) { + const isApproved = await isTokenApprovedForTransfer( + this.contractWrapper.getProvider(), + this.getAddress(), + erc721.contractAddress, + erc721.tokenId, + owner, + ); - const receipt = await tx.wait(); - const log = this.contractWrapper.parseLogs( - "PackAdded", - receipt.logs, - ); - if (log.length === 0) { - throw new Error("PackCreated event not found"); + if (!isApproved) { + throw new Error( + `ERC721 token "${erc721.tokenId}" with contract address "${ + erc721.contractAddress + }" is not approved for transfer.\n\nYou can give approval the multiwrap contract to transfer this token by running:\n\nawait sdk.getNFTCollection("${ + erc721.contractAddress + }").setApprovalForToken("${this.getAddress()}", ${ + erc721.tokenId + });\n\n`, + ); + } + + numOfRewardUnits.push(1); + contents.push({ + assetContract: erc721.contractAddress, + tokenType: 1, + totalAmount: 1, + tokenId: erc721.tokenId, + }); } - const packId = log[0].args.packId; - return { id: packId, receipt, data: () => this.get(packId.toString()) }; - } - /** - * Transfer Pack - * - * @remarks Transfer a pack from the connected wallet to another wallet. - * - * @example - * ```javascript - * // Address of the wallet you want to send the pack to - * const toAddress = "0x..."; - * - * // The token ID of the pack you want to send - * const tokenId = "0"; - * - * // The number of packs you want to send - * const amount = 1; - * - * await contract.transfer(toAddress, tokenId, amount); - * ``` - */ - public async transfer( - to: string, - tokenId: string, - amount: BigNumber, - ): Promise { - return { - receipt: await this.contractWrapper.sendTransaction("safeTransferFrom", [ - await this.contractWrapper.getSignerAddress(), - to, - tokenId, - amount, - [0], - ]), - }; - } - - public async transferFrom( - from: string, - to: string, - args: IPackBatchArgs, - data: BytesLike = [0], - ): Promise { - return { - receipt: await this.contractWrapper.sendTransaction("safeTransferFrom", [ - from, - to, - args.tokenId, - args.amount, - data, - ]), - }; - } + for (const erc1155 of erc1155Rewards) { + const isApproved = await isTokenApprovedForTransfer( + this.contractWrapper.getProvider(), + this.getAddress(), + erc1155.contractAddress, + erc1155.tokenId, + owner, + ); - public async transferBatchFrom( - from: string, - to: string, - args: IPackBatchArgs[], - data: BytesLike = [0], - ): Promise { - const ids = args.map((a) => a.tokenId); - const amounts = args.map((a) => a.amount); - return { - receipt: await this.contractWrapper.sendTransaction( - "safeBatchTransferFrom", - [from, to, ids, amounts, data], - ), - }; - } + if (!isApproved) { + throw new Error( + `ERC1155 token "${erc1155.tokenId}" with contract address "${ + erc1155.contractAddress + }" is not approved for transfer.\n\nYou can give approval the multiwrap contract to transfer this token by running:\n\nawait sdk.getEdition("${ + erc1155.contractAddress + }").setApprovalForAll("${this.getAddress()}", true);\n\n`, + ); + } + + numOfRewardUnits.push(erc1155.totalRewards); + contents.push({ + assetContract: erc1155.contractAddress, + tokenType: 2, + totalAmount: erc1155.quantity * erc1155.totalRewards, + tokenId: erc1155.tokenId, + }); + } - public async setApproval( - operator: string, - approved = true, - ): Promise { return { - receipt: await this.contractWrapper.sendTransaction("setApprovalForAll", [ - operator, - approved, - ]), + contents, + numOfRewardUnits, }; } - - public async depositLink(amount: BigNumberish): Promise { - const chainId = await this.contractWrapper.getChainID(); - const chainlink = ChainlinkVrf[chainId]; - const erc20 = new Contract( - chainlink.linkTokenAddress, - ERC20Abi, - this.contractWrapper.getProvider(), - ) as IERC20; - // TODO: make it gasless - const tx = await erc20.transfer( - this.getAddress(), - amount, - await this.contractWrapper.getCallOverrides(), - ); - return { receipt: await tx.wait() }; - } - - // TODO new withdraw LINK function in contract - // public async withdrawLink(to: string, amount: BigNumberish) { - // const chainId = await this.contractWrapper.getChainID(); - // const chainlink = ChainlinkVrf[chainId]; - // await this.contractWrapper.sendTransaction("transferERC20", [ - // chainlink.linkTokenAddress, - // to, - // amount, - // ]); - // } - - /** ****************************** - * PRIVATE FUNCTIONS - *******************************/ } diff --git a/src/schema/tokens/common/wrap.ts b/src/schema/tokens/common/wrap.ts new file mode 100644 index 000000000..ddd264eb8 --- /dev/null +++ b/src/schema/tokens/common/wrap.ts @@ -0,0 +1,31 @@ +import { z } from "zod"; +import { AddressSchema, PriceSchema } from "../../shared"; + +/** + * @internal + */ +const CommonWrappableSchema = z.object({ + contractAddress: AddressSchema, +}); + +/** + * @internal + */ +export const ERC20WrappableSchema = CommonWrappableSchema.extend({ + quantity: PriceSchema, +}); + +/** + * @internal + */ +export const ERC721WrappableSchema = CommonWrappableSchema.extend({ + tokenId: z.number(), +}); + +/** + * @internal + */ +export const ERC1155WrappableSchema = CommonWrappableSchema.extend({ + tokenId: z.number(), + quantity: z.number(), +}); diff --git a/src/schema/tokens/index.ts b/src/schema/tokens/index.ts index ef8f3418e..21981a215 100644 --- a/src/schema/tokens/index.ts +++ b/src/schema/tokens/index.ts @@ -1,3 +1,4 @@ export * from "./common"; export * from "./edition"; export * from "./token"; +export * from "./pack"; diff --git a/src/schema/tokens/pack.ts b/src/schema/tokens/pack.ts new file mode 100644 index 000000000..97d3db59b --- /dev/null +++ b/src/schema/tokens/pack.ts @@ -0,0 +1,63 @@ +import { z } from "zod"; +import { RawDateSchema } from "../shared"; +import { NFTInputOrUriSchema } from "./common"; +import { + ERC1155WrappableSchema, + ERC20WrappableSchema, + ERC721WrappableSchema, +} from "./common/wrap"; + +/** + * @internal + */ +const ERC20RewardContentsSchema = ERC20WrappableSchema.extend({ + totalRewards: z.number().default(1), +}); + +/** + * @internal + */ +const ERC721RewardContentsSchema = ERC721WrappableSchema; + +/** + * @internal + */ +const ERC1155RewardContentsSchema = ERC1155WrappableSchema.extend({ + totalRewards: z.number().default(1), +}); + +/** + * @internal + */ +export const PackRewardsSchema = z.object({ + erc20Rewards: z.array(ERC20WrappableSchema).default([]), + erc721Rewards: z.array(ERC721WrappableSchema).default([]), + erc1155Rewards: z.array(ERC1155WrappableSchema).default([]), +}); + +/** + * @internal + */ +export const PackMetadataInputSchema = z.object({ + metadata: NFTInputOrUriSchema, + erc20Rewards: z.array(ERC20RewardContentsSchema).default([]), + erc721Rewards: z.array(ERC721RewardContentsSchema).default([]), + erc1155Rewards: z.array(ERC1155RewardContentsSchema).default([]), + rewardsPerPack: z.number().default(1), + openStartTime: RawDateSchema.default(new Date()), +}); + +/** + * @public + */ +export type PackMetadataInput = z.input; + +/** + * @public + */ +export type PackMetadataOutput = z.output; + +/** + * @public + */ +export type PackRewards = z.input; diff --git a/src/types/index.ts b/src/types/index.ts index 07828fa9a..2592655a7 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -4,7 +4,6 @@ export * from "./marketplace"; export * from "./currency"; export * from "./delayed-reveal"; export * from "./vote"; -export * from "./packs"; export * from "./SplitRecipient"; export * from "./QueryParams"; export * from "./deploy"; diff --git a/src/types/packs.ts b/src/types/packs.ts deleted file mode 100644 index ececde39e..000000000 --- a/src/types/packs.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { NFTMetadata, NFTMetadataInput } from "../schema/tokens/common"; -import { BigNumber, BigNumberish } from "ethers"; - -export interface PackMetadata { - id: string; - creator: string; - currentSupply: BigNumber; - openStart: Date | null; - metadata: NFTMetadata; -} - -/** - * @public - */ -export interface PackNFTMetadata { - supply: BigNumber; - metadata: NFTMetadata; -} - -/** - * @public - */ -export interface PackMetadataWithBalance extends PackMetadata { - ownedByAddress: BigNumber; -} - -export enum UnderlyingType { - None = 0, - ERC20 = 1, - ERC721 = 2, -} - -// TODO zodify -export interface IPackCreateArgs { - assetContract: string; - metadata: NFTMetadataInput; - assets: { - tokenId: BigNumberish; - amount: BigNumberish; - }[]; - secondsUntilOpenStart?: BigNumberish; - rewardsPerOpen?: BigNumberish; -} - -/** - * @beta - */ -// TODO zodify -export interface IPackBatchArgs { - tokenId: BigNumberish; - amount: BigNumberish; -} diff --git a/yarn.lock b/yarn.lock index aa37cd590..f411501a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -815,10 +815,10 @@ "@swc/core-win32-ia32-msvc" "1.2.197" "@swc/core-win32-x64-msvc" "1.2.197" -"@thirdweb-dev/contracts@2.3.14": - version "2.3.14" - resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-2.3.14.tgz#46cb582b5593a4f2fd49d953894729aa6ec42f35" - integrity sha512-aQ7NGvU+1JDLh1Ha13m3DQpqfhmHzJUcbOOS93I0nKJOLKNUaQL2oQpg+3GBpMzZWIsScDztlfqwJ3wltaNYgQ== +"@thirdweb-dev/contracts@2.3.15-0": + version "2.3.15-0" + resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-2.3.15-0.tgz#9ea4aa8500b213356acc1772c18222c8085087c0" + integrity sha512-hm6qK5GSp776ctXV3NeA6jvHHfkolJjTLXQ/ed9gZVBLVD5Bl1ofLRZ30wG3lf8eMMxFoJCEqOsoQlB95M+qOw== "@tsconfig/node10@^1.0.7": version "1.0.8" From d5484a6a2a63844fd9488da5d3575c9a01aad312 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Mon, 13 Jun 2022 22:43:07 -0400 Subject: [PATCH 02/12] Update pack deployment arguments --- src/core/classes/factory.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/core/classes/factory.ts b/src/core/classes/factory.ts index 253271a58..c173ed717 100644 --- a/src/core/classes/factory.ts +++ b/src/core/classes/factory.ts @@ -212,7 +212,6 @@ export class ContractFactory extends ContractWrapper { ]; case Pack.contractType: const packsMetadata = Pack.schema.deploy.parse(metadata); - const vrf = ChainlinkVrf[await this.getChainID()]; return [ await this.getSignerAddress(), packsMetadata.name, @@ -221,8 +220,6 @@ export class ContractFactory extends ContractWrapper { trustedForwarders, packsMetadata.fee_recipient, packsMetadata.seller_fee_basis_points, - vrf.fees, - vrf.keyHash, ]; default: return []; From 652539bd4f361ef72a1d14cefa0774736a2e1ad0 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Mon, 13 Jun 2022 22:52:06 -0400 Subject: [PATCH 03/12] Update number types to BigNumberish --- src/schema/tokens/common/wrap.ts | 8 ++++---- src/schema/tokens/pack.ts | 8 ++++---- test/pack.test.ts | 28 ++++++++++++++++------------ 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/schema/tokens/common/wrap.ts b/src/schema/tokens/common/wrap.ts index ddd264eb8..2bababd6b 100644 --- a/src/schema/tokens/common/wrap.ts +++ b/src/schema/tokens/common/wrap.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { AddressSchema, PriceSchema } from "../../shared"; +import { AddressSchema, BigNumberishSchema, PriceSchema } from "../../shared"; /** * @internal @@ -19,13 +19,13 @@ export const ERC20WrappableSchema = CommonWrappableSchema.extend({ * @internal */ export const ERC721WrappableSchema = CommonWrappableSchema.extend({ - tokenId: z.number(), + tokenId: BigNumberishSchema, }); /** * @internal */ export const ERC1155WrappableSchema = CommonWrappableSchema.extend({ - tokenId: z.number(), - quantity: z.number(), + tokenId: BigNumberishSchema, + quantity: BigNumberishSchema, }); diff --git a/src/schema/tokens/pack.ts b/src/schema/tokens/pack.ts index 97d3db59b..ec8ce95c9 100644 --- a/src/schema/tokens/pack.ts +++ b/src/schema/tokens/pack.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { RawDateSchema } from "../shared"; +import { BigNumberishSchema, RawDateSchema } from "../shared"; import { NFTInputOrUriSchema } from "./common"; import { ERC1155WrappableSchema, @@ -11,7 +11,7 @@ import { * @internal */ const ERC20RewardContentsSchema = ERC20WrappableSchema.extend({ - totalRewards: z.number().default(1), + totalRewards: BigNumberishSchema.default("1"), }); /** @@ -23,7 +23,7 @@ const ERC721RewardContentsSchema = ERC721WrappableSchema; * @internal */ const ERC1155RewardContentsSchema = ERC1155WrappableSchema.extend({ - totalRewards: z.number().default(1), + totalRewards: BigNumberishSchema.default("1"), }); /** @@ -43,7 +43,7 @@ export const PackMetadataInputSchema = z.object({ erc20Rewards: z.array(ERC20RewardContentsSchema).default([]), erc721Rewards: z.array(ERC721RewardContentsSchema).default([]), erc1155Rewards: z.array(ERC1155RewardContentsSchema).default([]), - rewardsPerPack: z.number().default(1), + rewardsPerPack: BigNumberishSchema.default("1"), openStartTime: RawDateSchema.default(new Date()), }); diff --git a/test/pack.test.ts b/test/pack.test.ts index e661b8c81..550075305 100644 --- a/test/pack.test.ts +++ b/test/pack.test.ts @@ -55,19 +55,21 @@ describe("Pack Contract", async () => { const createPacks = async (): Promise => { const packOne = await packContract.create({ - assetContract: bundleContract.getAddress(), - assets: [ + erc1155Rewards: [ { + contractAddress: bundleContract.getAddress(), tokenId: "0", - amount: BigNumber.from(50), + quantity: BigNumber.from(50), }, { + contractAddress: bundleContract.getAddress(), tokenId: "1", - amount: BigNumber.from(50), + quantity: BigNumber.from(50), }, { + contractAddress: bundleContract.getAddress(), tokenId: "2", - amount: BigNumber.from(50), + quantity: BigNumber.from(50), }, ], metadata: { @@ -76,25 +78,27 @@ describe("Pack Contract", async () => { }); const packTwo = await packContract.create({ - assetContract: bundleContract.getAddress(), - assets: [ + erc1155Rewards: [ { + contractAddress: bundleContract.getAddress(), tokenId: "0", - amount: BigNumber.from(50), + quantity: BigNumber.from(50), }, { + contractAddress: bundleContract.getAddress(), tokenId: "1", - amount: BigNumber.from(50), + quantity: BigNumber.from(50), }, { + contractAddress: bundleContract.getAddress(), tokenId: "2", - amount: BigNumber.from(50), + quantity: BigNumber.from(50), }, ], metadata: { name: "Pack", }, - rewardsPerOpen: BigNumber.from(2), + rewardsPerPack: 2, }); return [await packOne.data(), await packTwo.data()]; @@ -164,7 +168,7 @@ describe("Pack Contract", async () => { const pack = await createPacks(); // TODO how can we test this with VRF in the way? const result = await packContract.open(pack[0].id); - assert.equal(result.length, 1); + assert.equal(result.erc1155Rewards?.length, 1); }); }); From 4d41d0e22a86e7332457d29960145b1ca99e6bb3 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Mon, 13 Jun 2022 23:20:58 -0400 Subject: [PATCH 04/12] Add getAll and getPackContents --- src/contracts/pack.ts | 106 ++++++++++++++++++++++++++++++++++---- src/schema/tokens/pack.ts | 15 +++++- 2 files changed, 110 insertions(+), 11 deletions(-) diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 27209ee3a..4b6c1dc40 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -21,13 +21,14 @@ import { PackMetadataInputSchema, PackMetadataOutput, PackRewards, + PackRewardsOutput, } from "../schema/tokens/pack"; import { ITokenBundle, PackCreatedEvent, PackOpenedEvent, } from "contracts/Pack"; -import { ethers } from "ethers"; +import { BigNumber, BigNumberish, ethers } from "ethers"; import { fetchCurrencyMetadata, hasERC20Allowance, @@ -36,6 +37,8 @@ import { import { isTokenApprovedForTransfer } from "../common/marketplace"; import { uploadOrExtractURI } from "../common/nft"; import { EditionMetadata } from "../schema"; +import { Erc1155Enumerable } from "../core/classes/erc-1155-enumerable"; +import { QueryAllParams } from "../types"; /** * Create lootboxes of NFTs with rarity based open mechanics. @@ -93,6 +96,8 @@ export class Pack extends Erc1155 { */ public interceptor: ContractInterceptor; + private _query = this.query as Erc1155Enumerable; + constructor( network: NetworkOrSignerOrProvider, address: string, @@ -120,6 +125,87 @@ export class Pack extends Erc1155 { this.interceptor = new ContractInterceptor(this.contractWrapper); } + /** ****************************** + * READ FUNCTIONS + *******************************/ + + /** + * Get All Packs + * + * @remarks Get all the data associated with every token bundle in this contract. + * + * By default, returns the first 100 NFTs, use queryParams to fetch more. + * + * @example + * ```javascript + * const wrappedBundles = await contract.getAll(); + * console.log(wrappedBundles); + * ``` + * @param queryParams - optional filtering to only fetch a subset of results. + * @returns The NFT metadata for all NFTs queried. + */ + public async getAll( + queryParams?: QueryAllParams, + ): Promise { + return this._query.all(queryParams); + } + + public async getPackContents( + packId: BigNumberish, + ): Promise { + const { contents, perUnitAmounts } = + await this.contractWrapper.readContract.getPackContents(packId); + + const erc20Rewards = []; + const erc721Rewards = []; + const erc1155Rewards = []; + + for (let i = 0; i < contents.length; i++) { + const reward = contents[i]; + const amount = perUnitAmounts[i]; + switch (reward.tokenType) { + case 0: { + const tokenMetadata = await fetchCurrencyMetadata( + this.contractWrapper.getProvider(), + reward.assetContract, + ); + const rewardAmount = ethers.utils.formatUnits( + reward.totalAmount, + tokenMetadata.decimals, + ); + erc20Rewards.push({ + contractAddress: reward.assetContract, + quantity: BigNumber.from(rewardAmount).div(amount).toString(), + totalRewards: amount.toString(), + }); + break; + } + case 1: { + erc721Rewards.push({ + contractAddress: reward.assetContract, + tokenId: reward.tokenId.toString(), + }); + break; + } + case 2: { + erc1155Rewards.push({ + contractAddress: reward.assetContract, + tokenId: reward.tokenId.toString(), + quantity: BigNumber.from(reward.totalAmount).div(amount).toString(), + totalRewards: amount.toString(), + }); + break; + } + } + } + + return { + erc20Rewards, + erc721Rewards, + erc1155Rewards, + }; + } + /** ****************************** * WRITE FUNCTIONS *******************************/ @@ -261,25 +347,24 @@ export class Pack extends Erc1155 { ); erc20Rewards.push({ contractAddress: reward.assetContract, - quantity: ethers.utils.formatUnits( - reward.totalAmount, - tokenMetadata.decimals, - ), + quantity: ethers.utils + .formatUnits(reward.totalAmount, tokenMetadata.decimals) + .toString(), }); break; } case 1: { erc721Rewards.push({ contractAddress: reward.assetContract, - tokenId: reward.tokenId.toNumber(), + tokenId: reward.tokenId.toString(), }); break; } case 2: { erc1155Rewards.push({ contractAddress: reward.assetContract, - tokenId: reward.tokenId.toNumber(), - quantity: reward.totalAmount.toNumber(), + tokenId: reward.tokenId.toString(), + quantity: reward.totalAmount.toString(), }); break; } @@ -296,6 +381,7 @@ export class Pack extends Erc1155 { /** ***************************** * PRIVATE FUNCTIONS *******************************/ + private async toPackContentArgs(metadataWithRewards: PackMetadataOutput) { const contents: ITokenBundle.TokenStruct[] = []; const numOfRewardUnits = []; @@ -389,7 +475,9 @@ export class Pack extends Erc1155 { contents.push({ assetContract: erc1155.contractAddress, tokenType: 2, - totalAmount: erc1155.quantity * erc1155.totalRewards, + totalAmount: BigNumber.from(erc1155.quantity).mul( + BigNumber.from(erc1155.totalRewards), + ), tokenId: erc1155.tokenId, }); } diff --git a/src/schema/tokens/pack.ts b/src/schema/tokens/pack.ts index ec8ce95c9..d227c9db5 100644 --- a/src/schema/tokens/pack.ts +++ b/src/schema/tokens/pack.ts @@ -38,11 +38,17 @@ export const PackRewardsSchema = z.object({ /** * @internal */ -export const PackMetadataInputSchema = z.object({ - metadata: NFTInputOrUriSchema, +export const PackRewardsOutputSchema = z.object({ erc20Rewards: z.array(ERC20RewardContentsSchema).default([]), erc721Rewards: z.array(ERC721RewardContentsSchema).default([]), erc1155Rewards: z.array(ERC1155RewardContentsSchema).default([]), +}); + +/** + * @internal + */ +export const PackMetadataInputSchema = PackRewardsOutputSchema.extend({ + metadata: NFTInputOrUriSchema, rewardsPerPack: BigNumberishSchema.default("1"), openStartTime: RawDateSchema.default(new Date()), }); @@ -61,3 +67,8 @@ export type PackMetadataOutput = z.output; * @public */ export type PackRewards = z.input; + +/** + * @public + */ +export type PackRewardsOutput = z.output; From cfe9f2bea67c2054c19fa893e9227560ec8df77b Mon Sep 17 00:00:00 2001 From: adam-maj Date: Tue, 14 Jun 2022 13:48:26 -0400 Subject: [PATCH 05/12] Update test cases and fix unit amounts --- docs/sdk.ipackbatchargs.amount.md | 14 -- docs/sdk.ipackbatchargs.md | 23 --- docs/sdk.ipackbatchargs.tokenid.md | 14 -- docs/sdk.ipackcreateargs.assetcontract.md | 11 -- docs/sdk.ipackcreateargs.assets.md | 14 -- docs/sdk.ipackcreateargs.md | 22 --- docs/sdk.ipackcreateargs.metadata.md | 11 -- docs/sdk.ipackcreateargs.rewardsperopen.md | 11 -- ...k.ipackcreateargs.secondsuntilopenstart.md | 11 -- docs/sdk.md | 6 - docs/sdk.pack.balanceof.md | 42 ----- docs/sdk.pack.create.md | 52 ++---- docs/sdk.pack.createto.md | 69 +++++++ docs/sdk.pack.depositlink.md | 22 --- docs/sdk.pack.get.md | 26 --- docs/sdk.pack.getaddress.md | 15 -- docs/sdk.pack.getall.md | 21 ++- docs/sdk.pack.getlinkbalance.md | 15 -- docs/sdk.pack.getnfts.md | 41 ---- docs/sdk.pack.getowned.md | 23 ++- ...balance.md => sdk.pack.getpackcontents.md} | 10 +- docs/sdk.pack.isapproved.md | 23 --- docs/sdk.pack.md | 27 +-- docs/sdk.pack.onnetworkupdated.md | 22 --- docs/sdk.pack.open.md | 18 +- docs/sdk.pack.setapproval.md | 23 --- docs/sdk.pack.transfer.md | 46 ----- docs/sdk.pack.transferbatchfrom.md | 25 --- docs/sdk.pack.transferfrom.md | 25 --- docs/sdk.packmetadata.creator.md | 11 -- docs/sdk.packmetadata.currentsupply.md | 11 -- docs/sdk.packmetadata.id.md | 11 -- docs/sdk.packmetadata.md | 22 --- docs/sdk.packmetadata.metadata.md | 11 -- docs/sdk.packmetadata.openstart.md | 11 -- docs/sdk.packmetadatawithbalance.md | 20 -- ....packmetadatawithbalance.ownedbyaddress.md | 11 -- docs/sdk.packnftmetadata.md | 20 -- docs/sdk.packnftmetadata.metadata.md | 11 -- docs/sdk.packnftmetadata.supply.md | 11 -- docs/sdk.thirdwebsdk.getcontractlist.md | 4 +- docs/sdk.underlyingtype.md | 20 -- docs/snippets.json | 74 +++++--- etc/sdk.api.md | 137 +++----------- src/constants/chainlink.ts | 55 ------ src/constants/index.ts | 1 - src/contracts/pack.ts | 52 ++++-- src/core/classes/factory.ts | 1 - src/schema/contracts/packs.ts | 14 +- test/before-setup.ts | 8 - test/pack.test.ts | 176 ++++++++---------- 51 files changed, 336 insertions(+), 1038 deletions(-) delete mode 100644 docs/sdk.ipackbatchargs.amount.md delete mode 100644 docs/sdk.ipackbatchargs.md delete mode 100644 docs/sdk.ipackbatchargs.tokenid.md delete mode 100644 docs/sdk.ipackcreateargs.assetcontract.md delete mode 100644 docs/sdk.ipackcreateargs.assets.md delete mode 100644 docs/sdk.ipackcreateargs.md delete mode 100644 docs/sdk.ipackcreateargs.metadata.md delete mode 100644 docs/sdk.ipackcreateargs.rewardsperopen.md delete mode 100644 docs/sdk.ipackcreateargs.secondsuntilopenstart.md delete mode 100644 docs/sdk.pack.balanceof.md create mode 100644 docs/sdk.pack.createto.md delete mode 100644 docs/sdk.pack.depositlink.md delete mode 100644 docs/sdk.pack.get.md delete mode 100644 docs/sdk.pack.getaddress.md delete mode 100644 docs/sdk.pack.getlinkbalance.md delete mode 100644 docs/sdk.pack.getnfts.md rename docs/{sdk.pack.balance.md => sdk.pack.getpackcontents.md} (51%) delete mode 100644 docs/sdk.pack.isapproved.md delete mode 100644 docs/sdk.pack.onnetworkupdated.md delete mode 100644 docs/sdk.pack.setapproval.md delete mode 100644 docs/sdk.pack.transfer.md delete mode 100644 docs/sdk.pack.transferbatchfrom.md delete mode 100644 docs/sdk.pack.transferfrom.md delete mode 100644 docs/sdk.packmetadata.creator.md delete mode 100644 docs/sdk.packmetadata.currentsupply.md delete mode 100644 docs/sdk.packmetadata.id.md delete mode 100644 docs/sdk.packmetadata.md delete mode 100644 docs/sdk.packmetadata.metadata.md delete mode 100644 docs/sdk.packmetadata.openstart.md delete mode 100644 docs/sdk.packmetadatawithbalance.md delete mode 100644 docs/sdk.packmetadatawithbalance.ownedbyaddress.md delete mode 100644 docs/sdk.packnftmetadata.md delete mode 100644 docs/sdk.packnftmetadata.metadata.md delete mode 100644 docs/sdk.packnftmetadata.supply.md delete mode 100644 docs/sdk.underlyingtype.md delete mode 100644 src/constants/chainlink.ts diff --git a/docs/sdk.ipackbatchargs.amount.md b/docs/sdk.ipackbatchargs.amount.md deleted file mode 100644 index d2e55738b..000000000 --- a/docs/sdk.ipackbatchargs.amount.md +++ /dev/null @@ -1,14 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackBatchArgs](./sdk.ipackbatchargs.md) > [amount](./sdk.ipackbatchargs.amount.md) - -## IPackBatchArgs.amount property - -> This API is provided as a preview for developers and may change based on feedback that we receive. Do not use this API in a production environment. -> - -Signature: - -```typescript -amount: BigNumberish; -``` diff --git a/docs/sdk.ipackbatchargs.md b/docs/sdk.ipackbatchargs.md deleted file mode 100644 index 1997eeddd..000000000 --- a/docs/sdk.ipackbatchargs.md +++ /dev/null @@ -1,23 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackBatchArgs](./sdk.ipackbatchargs.md) - -## IPackBatchArgs interface - -> This API is provided as a preview for developers and may change based on feedback that we receive. Do not use this API in a production environment. -> - - -Signature: - -```typescript -export interface IPackBatchArgs -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [amount](./sdk.ipackbatchargs.amount.md) | BigNumberish | (BETA) | -| [tokenId](./sdk.ipackbatchargs.tokenid.md) | BigNumberish | (BETA) | - diff --git a/docs/sdk.ipackbatchargs.tokenid.md b/docs/sdk.ipackbatchargs.tokenid.md deleted file mode 100644 index f99f55635..000000000 --- a/docs/sdk.ipackbatchargs.tokenid.md +++ /dev/null @@ -1,14 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackBatchArgs](./sdk.ipackbatchargs.md) > [tokenId](./sdk.ipackbatchargs.tokenid.md) - -## IPackBatchArgs.tokenId property - -> This API is provided as a preview for developers and may change based on feedback that we receive. Do not use this API in a production environment. -> - -Signature: - -```typescript -tokenId: BigNumberish; -``` diff --git a/docs/sdk.ipackcreateargs.assetcontract.md b/docs/sdk.ipackcreateargs.assetcontract.md deleted file mode 100644 index 08fbad5ba..000000000 --- a/docs/sdk.ipackcreateargs.assetcontract.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackCreateArgs](./sdk.ipackcreateargs.md) > [assetContract](./sdk.ipackcreateargs.assetcontract.md) - -## IPackCreateArgs.assetContract property - -Signature: - -```typescript -assetContract: string; -``` diff --git a/docs/sdk.ipackcreateargs.assets.md b/docs/sdk.ipackcreateargs.assets.md deleted file mode 100644 index 7cb106474..000000000 --- a/docs/sdk.ipackcreateargs.assets.md +++ /dev/null @@ -1,14 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackCreateArgs](./sdk.ipackcreateargs.md) > [assets](./sdk.ipackcreateargs.assets.md) - -## IPackCreateArgs.assets property - -Signature: - -```typescript -assets: { - tokenId: BigNumberish; - amount: BigNumberish; - }[]; -``` diff --git a/docs/sdk.ipackcreateargs.md b/docs/sdk.ipackcreateargs.md deleted file mode 100644 index 5bbe0bceb..000000000 --- a/docs/sdk.ipackcreateargs.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackCreateArgs](./sdk.ipackcreateargs.md) - -## IPackCreateArgs interface - -Signature: - -```typescript -export interface IPackCreateArgs -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [assetContract](./sdk.ipackcreateargs.assetcontract.md) | string | | -| [assets](./sdk.ipackcreateargs.assets.md) | { tokenId: BigNumberish; amount: BigNumberish; }\[\] | | -| [metadata](./sdk.ipackcreateargs.metadata.md) | [NFTMetadataInput](./sdk.nftmetadatainput.md) | | -| [rewardsPerOpen?](./sdk.ipackcreateargs.rewardsperopen.md) | BigNumberish | (Optional) | -| [secondsUntilOpenStart?](./sdk.ipackcreateargs.secondsuntilopenstart.md) | BigNumberish | (Optional) | - diff --git a/docs/sdk.ipackcreateargs.metadata.md b/docs/sdk.ipackcreateargs.metadata.md deleted file mode 100644 index ff163b6fe..000000000 --- a/docs/sdk.ipackcreateargs.metadata.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackCreateArgs](./sdk.ipackcreateargs.md) > [metadata](./sdk.ipackcreateargs.metadata.md) - -## IPackCreateArgs.metadata property - -Signature: - -```typescript -metadata: NFTMetadataInput; -``` diff --git a/docs/sdk.ipackcreateargs.rewardsperopen.md b/docs/sdk.ipackcreateargs.rewardsperopen.md deleted file mode 100644 index b6c480363..000000000 --- a/docs/sdk.ipackcreateargs.rewardsperopen.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackCreateArgs](./sdk.ipackcreateargs.md) > [rewardsPerOpen](./sdk.ipackcreateargs.rewardsperopen.md) - -## IPackCreateArgs.rewardsPerOpen property - -Signature: - -```typescript -rewardsPerOpen?: BigNumberish; -``` diff --git a/docs/sdk.ipackcreateargs.secondsuntilopenstart.md b/docs/sdk.ipackcreateargs.secondsuntilopenstart.md deleted file mode 100644 index 82ca21f39..000000000 --- a/docs/sdk.ipackcreateargs.secondsuntilopenstart.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [IPackCreateArgs](./sdk.ipackcreateargs.md) > [secondsUntilOpenStart](./sdk.ipackcreateargs.secondsuntilopenstart.md) - -## IPackCreateArgs.secondsUntilOpenStart property - -Signature: - -```typescript -secondsUntilOpenStart?: BigNumberish; -``` diff --git a/docs/sdk.md b/docs/sdk.md index bcde785bc..a1c2b91d8 100644 --- a/docs/sdk.md +++ b/docs/sdk.md @@ -67,7 +67,6 @@ | [EventType](./sdk.eventtype.md) | | | [ListingType](./sdk.listingtype.md) | | | [ProposalState](./sdk.proposalstate.md) | | -| [UnderlyingType](./sdk.underlyingtype.md) | | | [VoteType](./sdk.votetype.md) | | ## Functions @@ -85,8 +84,6 @@ | [BatchToReveal](./sdk.batchtoreveal.md) | | | [DirectListing](./sdk.directlisting.md) | Represents a marketplace direct listing. | | [GaslessTransaction](./sdk.gaslesstransaction.md) | transaction message contains information that's needed to execute a gasless transaction | -| [IPackBatchArgs](./sdk.ipackbatchargs.md) | (BETA) | -| [IPackCreateArgs](./sdk.ipackcreateargs.md) | | | [IStorage](./sdk.istorage.md) | Interface for any storage provider | | [MarketplaceContractDeployMetadata](./sdk.marketplacecontractdeploymetadata.md) | Options for deploying a Marketplace contract | | [MarketplaceFilter](./sdk.marketplacefilter.md) | | @@ -96,9 +93,6 @@ | [NewDirectListing](./sdk.newdirectlisting.md) | Represents a new marketplace direct listing. | | [NFTContractDeployMetadata](./sdk.nftcontractdeploymetadata.md) | Options for deploying an NFT contract | | [Offer](./sdk.offer.md) | | -| [PackMetadata](./sdk.packmetadata.md) | | -| [PackMetadataWithBalance](./sdk.packmetadatawithbalance.md) | | -| [PackNFTMetadata](./sdk.packnftmetadata.md) | | | [Proposal](./sdk.proposal.md) | | | [ProposalExecutable](./sdk.proposalexecutable.md) | | | [ProposalVote](./sdk.proposalvote.md) | | diff --git a/docs/sdk.pack.balanceof.md b/docs/sdk.pack.balanceof.md deleted file mode 100644 index 16da33215..000000000 --- a/docs/sdk.pack.balanceof.md +++ /dev/null @@ -1,42 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [balanceOf](./sdk.pack.balanceof.md) - -## Pack.balanceOf() method - -Get Pack Balance - -Signature: - -```typescript -balanceOf(address: string, tokenId: string): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| address | string | | -| tokenId | string | | - -Returns: - -Promise<BigNumber> - -## Remarks - -Get a wallets pack balance (number of a specific packs in this contract owned by the wallet). - -## Example - - -```javascript -// Address of the wallet to check pack balance -const address = "{{wallet_address}}"; -// The token ID of the pack you want to check the wallets balance of -const tokenId = "0" - -const balance = await contract.balanceOf(address, tokenId); -console.log(balance); -``` - diff --git a/docs/sdk.pack.create.md b/docs/sdk.pack.create.md index 7670e744b..4026e3e96 100644 --- a/docs/sdk.pack.create.md +++ b/docs/sdk.pack.create.md @@ -9,52 +9,32 @@ Create Pack Signature: ```typescript -create(args: IPackCreateArgs): Promise>; +create(metadataWithRewards: PackMetadataInput): Promise>; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| args | [IPackCreateArgs](./sdk.ipackcreateargs.md) | Args for the pack creation | +| metadataWithRewards | PackMetadataInput | the metadata and rewards to include in the pack | Returns: -Promise<[TransactionResultWithId](./sdk.transactionresultwithid.md)<[PackMetadata](./sdk.packmetadata.md)>> - -- The newly created pack metadata +Promise<[TransactionResultWithId](./sdk.transactionresultwithid.md)<{ metadata: { \[x: string\]: import("../core/types").[Json](./sdk.json.md); name?: string \| undefined; description?: string \| null \| undefined; image?: string \| null \| undefined; external\_url?: string \| null \| undefined; animation\_url?: string \| null \| undefined; uri: string; id: BigNumber; }; supply: BigNumber; }>> ## Remarks -Create a new pack with its own rewards. - -## Example - - -```javascript -// Data to create the pack -const pack = { - // The address of the contract that holds the rewards you want to include - assetContract: "0x...", - // The metadata of the pack - metadata: { - name: "Cool Pack", - description: "This is a cool pack", - // This can be an image url or image file - image: readFileSync("path/to/image.png"), - }, - // The NFTs you want to include in the pack - assets: [ - { - tokenId: 0, // The token ID of the asset you want to add - amount: 1, // The amount of the asset you want to add - }, { - tokenId: 1, - amount: 1, - } - ], -}; - -await contract.create(pack); -``` +Create a new pack with the given metadata and rewards and mint it to the connected wallet. diff --git a/docs/sdk.pack.createto.md b/docs/sdk.pack.createto.md new file mode 100644 index 000000000..a66601fa6 --- /dev/null +++ b/docs/sdk.pack.createto.md @@ -0,0 +1,69 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [createTo](./sdk.pack.createto.md) + +## Pack.createTo() method + +Create Pack To Wallet + +Signature: + +```typescript +createTo(to: string, metadataWithRewards: PackMetadataInput): Promise>; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| to | string | the address to mint the pack to | +| metadataWithRewards | PackMetadataInput | the metadata and rewards to include in the pack | + +Returns: + +Promise<[TransactionResultWithId](./sdk.transactionresultwithid.md)<[EditionMetadata](./sdk.editionmetadata.md)>> + +## Remarks + +Create a new pack with the given metadata and rewards and mint it to the specified address. + +## Example + + +```javascript +const packMetadata = { + // The metadata for the pack NFT itself + metadata: { + name: "My Pack", + description: "This is a new pack", + image: "ipfs://...", + }, + // ERC20 rewards to be included in the pack + erc20Rewards: [ + { + assetContract: "0x...", + quantity: 100, + } + ], + // 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, + quantity: 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...", packMetadata); +``` + diff --git a/docs/sdk.pack.depositlink.md b/docs/sdk.pack.depositlink.md deleted file mode 100644 index c6ffc307d..000000000 --- a/docs/sdk.pack.depositlink.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [depositLink](./sdk.pack.depositlink.md) - -## Pack.depositLink() method - -Signature: - -```typescript -depositLink(amount: BigNumberish): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| amount | BigNumberish | | - -Returns: - -Promise<[TransactionResult](./sdk.transactionresult.md)> - diff --git a/docs/sdk.pack.get.md b/docs/sdk.pack.get.md deleted file mode 100644 index f4832f71d..000000000 --- a/docs/sdk.pack.get.md +++ /dev/null @@ -1,26 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [get](./sdk.pack.get.md) - -## Pack.get() method - -Get a pack by id - -Signature: - -```typescript -get(packId: BigNumberish): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| packId | BigNumberish | the id of the pack to fetch | - -Returns: - -Promise<[PackMetadata](./sdk.packmetadata.md)> - -the pack metadata - diff --git a/docs/sdk.pack.getaddress.md b/docs/sdk.pack.getaddress.md deleted file mode 100644 index 5d1425c08..000000000 --- a/docs/sdk.pack.getaddress.md +++ /dev/null @@ -1,15 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [getAddress](./sdk.pack.getaddress.md) - -## Pack.getAddress() method - -Signature: - -```typescript -getAddress(): string; -``` -Returns: - -string - diff --git a/docs/sdk.pack.getall.md b/docs/sdk.pack.getall.md index 134ae0449..1bd9ee76c 100644 --- a/docs/sdk.pack.getall.md +++ b/docs/sdk.pack.getall.md @@ -4,28 +4,37 @@ ## Pack.getAll() method -Get Pack Data +Get All Packs Signature: ```typescript -getAll(): Promise; +getAll(queryParams?: QueryAllParams): Promise; ``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| queryParams | [QueryAllParams](./sdk.queryallparams.md) | (Optional) optional filtering to only fetch a subset of results. | + Returns: -Promise<[PackMetadata](./sdk.packmetadata.md)\[\]> +Promise<[EditionMetadata](./sdk.editionmetadata.md)\[\]> -The NFT metadata for all NFTs in the contract. +The pack metadata for all packs queried. ## Remarks -Get data associated with every pack in this contract. +Get all the data associated with every pack in this contract. + +By default, returns the first 100 packs, use queryParams to fetch more. ## Example ```javascript const packs = await contract.getAll(); -console.log(packs); +console.log(packs; ``` diff --git a/docs/sdk.pack.getlinkbalance.md b/docs/sdk.pack.getlinkbalance.md deleted file mode 100644 index db3b7fc55..000000000 --- a/docs/sdk.pack.getlinkbalance.md +++ /dev/null @@ -1,15 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [getLinkBalance](./sdk.pack.getlinkbalance.md) - -## Pack.getLinkBalance() method - -Signature: - -```typescript -getLinkBalance(): Promise; -``` -Returns: - -Promise<[CurrencyValue](./sdk.currencyvalue.md)> - diff --git a/docs/sdk.pack.getnfts.md b/docs/sdk.pack.getnfts.md deleted file mode 100644 index 1253e98f0..000000000 --- a/docs/sdk.pack.getnfts.md +++ /dev/null @@ -1,41 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [getNFTs](./sdk.pack.getnfts.md) - -## Pack.getNFTs() method - -Get Pack Reward Data - -Signature: - -```typescript -getNFTs(packId: string): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| packId | string | | - -Returns: - -Promise<[PackNFTMetadata](./sdk.packnftmetadata.md)\[\]> - -The NFT metadata for all NFTs in the contract. - -## Remarks - -Get data associated with the rewards inside a specified pack - -## Example - - -```javascript -// The pack ID of the pack whos rewards you want to get -const packId = 0; - -const nfts = await contract.getNFTs(packId); -console.log(nfts); -``` - diff --git a/docs/sdk.pack.getowned.md b/docs/sdk.pack.getowned.md index c52a40341..4a0222db3 100644 --- a/docs/sdk.pack.getowned.md +++ b/docs/sdk.pack.getowned.md @@ -4,23 +4,36 @@ ## Pack.getOwned() method -`getOwned` is a convenience method for getting all owned tokens for a particular wallet. +Get Owned Packs Signature: ```typescript -getOwned(_address?: string): Promise; +getOwned(walletAddress?: string): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| \_address | string | (Optional) The address to check for token ownership | +| walletAddress | string | (Optional) | Returns: -Promise<[PackMetadataWithBalance](./sdk.packmetadatawithbalance.md)\[\]> +Promise<[EditionMetadataOwner](./sdk.editionmetadataowner.md)\[\]> -An array of PackMetadataWithBalance objects that are owned by the address +The pack metadata for all the owned packs in the contract. + +## Remarks + +Get all the data associated with the packs owned by a specific wallet. + +## Example + + +```javascript +// Address of the wallet to get the packs of +const address = "{{wallet_address}}"; +const packss = await contract.getOwned(address); +``` diff --git a/docs/sdk.pack.balance.md b/docs/sdk.pack.getpackcontents.md similarity index 51% rename from docs/sdk.pack.balance.md rename to docs/sdk.pack.getpackcontents.md index 988939256..028d9c8db 100644 --- a/docs/sdk.pack.balance.md +++ b/docs/sdk.pack.getpackcontents.md @@ -1,22 +1,22 @@ -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [balance](./sdk.pack.balance.md) +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [getPackContents](./sdk.pack.getpackcontents.md) -## Pack.balance() method +## Pack.getPackContents() method Signature: ```typescript -balance(tokenId: string): Promise; +getPackContents(packId: BigNumberish): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| tokenId | string | | +| packId | BigNumberish | | Returns: -Promise<BigNumber> +Promise<PackRewardsOutput> diff --git a/docs/sdk.pack.isapproved.md b/docs/sdk.pack.isapproved.md deleted file mode 100644 index 5eb323ea3..000000000 --- a/docs/sdk.pack.isapproved.md +++ /dev/null @@ -1,23 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [isApproved](./sdk.pack.isapproved.md) - -## Pack.isApproved() method - -Signature: - -```typescript -isApproved(address: string, operator: string): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| address | string | | -| operator | string | | - -Returns: - -Promise<boolean> - diff --git a/docs/sdk.pack.md b/docs/sdk.pack.md index b3dd2453f..609a9aaed 100644 --- a/docs/sdk.pack.md +++ b/docs/sdk.pack.md @@ -9,9 +9,9 @@ Create lootboxes of NFTs with rarity based open mechanics. Signature: ```typescript -export declare class Pack implements UpdateableNetwork +export declare class Pack extends Erc1155 ``` -Implements: UpdateableNetwork +Extends: [Erc1155](./sdk.erc1155.md)<PackContract ## Example @@ -47,21 +47,10 @@ const contract = sdk.getPack("{{contract_address}}"); | Method | Modifiers | Description | | --- | --- | --- | -| [balance(tokenId)](./sdk.pack.balance.md) | | | -| [balanceOf(address, tokenId)](./sdk.pack.balanceof.md) | | Get Pack Balance | -| [create(args)](./sdk.pack.create.md) | | Create Pack | -| [depositLink(amount)](./sdk.pack.depositlink.md) | | | -| [get(packId)](./sdk.pack.get.md) | | Get a pack by id | -| [getAddress()](./sdk.pack.getaddress.md) | | | -| [getAll()](./sdk.pack.getall.md) | | Get Pack Data | -| [getLinkBalance()](./sdk.pack.getlinkbalance.md) | | | -| [getNFTs(packId)](./sdk.pack.getnfts.md) | | Get Pack Reward Data | -| [getOwned(\_address)](./sdk.pack.getowned.md) | | getOwned is a convenience method for getting all owned tokens for a particular wallet. | -| [isApproved(address, operator)](./sdk.pack.isapproved.md) | | | -| [onNetworkUpdated(network)](./sdk.pack.onnetworkupdated.md) | | | -| [open(packId)](./sdk.pack.open.md) | | Open Pack | -| [setApproval(operator, approved)](./sdk.pack.setapproval.md) | | | -| [transfer(to, tokenId, amount)](./sdk.pack.transfer.md) | | Transfer Pack | -| [transferBatchFrom(from, to, args, data)](./sdk.pack.transferbatchfrom.md) | | | -| [transferFrom(from, to, args, data)](./sdk.pack.transferfrom.md) | | | +| [create(metadataWithRewards)](./sdk.pack.create.md) | | Create Pack | +| [createTo(to, metadataWithRewards)](./sdk.pack.createto.md) | | Create Pack To Wallet | +| [getAll(queryParams)](./sdk.pack.getall.md) | | Get All Packs | +| [getOwned(walletAddress)](./sdk.pack.getowned.md) | | Get Owned Packs | +| [getPackContents(packId)](./sdk.pack.getpackcontents.md) | | | +| [open(tokenId, amount)](./sdk.pack.open.md) | | Open Pack | diff --git a/docs/sdk.pack.onnetworkupdated.md b/docs/sdk.pack.onnetworkupdated.md deleted file mode 100644 index 8e9c1498f..000000000 --- a/docs/sdk.pack.onnetworkupdated.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [onNetworkUpdated](./sdk.pack.onnetworkupdated.md) - -## Pack.onNetworkUpdated() method - -Signature: - -```typescript -onNetworkUpdated(network: NetworkOrSignerOrProvider): void; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | - -Returns: - -void - diff --git a/docs/sdk.pack.open.md b/docs/sdk.pack.open.md index ef3707c49..170074f34 100644 --- a/docs/sdk.pack.open.md +++ b/docs/sdk.pack.open.md @@ -9,32 +9,30 @@ Open Pack Signature: ```typescript -open(packId: string): Promise[]>; +open(tokenId: number, amount?: number): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| packId | string | | +| tokenId | number | the token ID of the pack you want to open | +| amount | number | (Optional) the amount of packs you want to open | Returns: -Promise<[TransactionResultWithId](./sdk.transactionresultwithid.md)<[NFTMetadata](./sdk.nftmetadata.md)>\[\]> +Promise<PackRewards> ## Remarks -Open a pack to burn it and obtain the reward asset inside. +- Open a pack to reveal the contained rewards. This will burn the specified pack and the contained assets will be transferred to the opening users wallet. ## Example ```javascript -// The pack ID of the asset you want to buy -const packId = "0"; -const tx = await contract.open(packId); -const receipt = tx.receipt; // the transaction receipt -const packId = tx.id; // the id of the pack that was opened -const rewards = tx.data(); // the contents of the opened pack +const tokenId = 0 +const amount = 1 +const tx = await contract.open(tokenId, amount); ``` diff --git a/docs/sdk.pack.setapproval.md b/docs/sdk.pack.setapproval.md deleted file mode 100644 index 35e57cd1b..000000000 --- a/docs/sdk.pack.setapproval.md +++ /dev/null @@ -1,23 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [setApproval](./sdk.pack.setapproval.md) - -## Pack.setApproval() method - -Signature: - -```typescript -setApproval(operator: string, approved?: boolean): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| operator | string | | -| approved | boolean | (Optional) | - -Returns: - -Promise<[TransactionResult](./sdk.transactionresult.md)> - diff --git a/docs/sdk.pack.transfer.md b/docs/sdk.pack.transfer.md deleted file mode 100644 index 4a28f5e10..000000000 --- a/docs/sdk.pack.transfer.md +++ /dev/null @@ -1,46 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [transfer](./sdk.pack.transfer.md) - -## Pack.transfer() method - -Transfer Pack - -Signature: - -```typescript -transfer(to: string, tokenId: string, amount: BigNumber): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| to | string | | -| tokenId | string | | -| amount | BigNumber | | - -Returns: - -Promise<[TransactionResult](./sdk.transactionresult.md)> - -## Remarks - -Transfer a pack from the connected wallet to another wallet. - -## Example - - -```javascript -// Address of the wallet you want to send the pack to -const toAddress = "0x..."; - -// The token ID of the pack you want to send -const tokenId = "0"; - -// The number of packs you want to send -const amount = 1; - -await contract.transfer(toAddress, tokenId, amount); -``` - diff --git a/docs/sdk.pack.transferbatchfrom.md b/docs/sdk.pack.transferbatchfrom.md deleted file mode 100644 index 879c97fd2..000000000 --- a/docs/sdk.pack.transferbatchfrom.md +++ /dev/null @@ -1,25 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [transferBatchFrom](./sdk.pack.transferbatchfrom.md) - -## Pack.transferBatchFrom() method - -Signature: - -```typescript -transferBatchFrom(from: string, to: string, args: IPackBatchArgs[], data?: BytesLike): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| from | string | | -| to | string | | -| args | [IPackBatchArgs](./sdk.ipackbatchargs.md)\[\] | | -| data | BytesLike | (Optional) | - -Returns: - -Promise<[TransactionResult](./sdk.transactionresult.md)> - diff --git a/docs/sdk.pack.transferfrom.md b/docs/sdk.pack.transferfrom.md deleted file mode 100644 index 50fb41fc5..000000000 --- a/docs/sdk.pack.transferfrom.md +++ /dev/null @@ -1,25 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [transferFrom](./sdk.pack.transferfrom.md) - -## Pack.transferFrom() method - -Signature: - -```typescript -transferFrom(from: string, to: string, args: IPackBatchArgs, data?: BytesLike): Promise; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| from | string | | -| to | string | | -| args | [IPackBatchArgs](./sdk.ipackbatchargs.md) | | -| data | BytesLike | (Optional) | - -Returns: - -Promise<[TransactionResult](./sdk.transactionresult.md)> - diff --git a/docs/sdk.packmetadata.creator.md b/docs/sdk.packmetadata.creator.md deleted file mode 100644 index 1ce07b698..000000000 --- a/docs/sdk.packmetadata.creator.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadata](./sdk.packmetadata.md) > [creator](./sdk.packmetadata.creator.md) - -## PackMetadata.creator property - -Signature: - -```typescript -creator: string; -``` diff --git a/docs/sdk.packmetadata.currentsupply.md b/docs/sdk.packmetadata.currentsupply.md deleted file mode 100644 index 2ab49cdb0..000000000 --- a/docs/sdk.packmetadata.currentsupply.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadata](./sdk.packmetadata.md) > [currentSupply](./sdk.packmetadata.currentsupply.md) - -## PackMetadata.currentSupply property - -Signature: - -```typescript -currentSupply: BigNumber; -``` diff --git a/docs/sdk.packmetadata.id.md b/docs/sdk.packmetadata.id.md deleted file mode 100644 index 2e15e3403..000000000 --- a/docs/sdk.packmetadata.id.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadata](./sdk.packmetadata.md) > [id](./sdk.packmetadata.id.md) - -## PackMetadata.id property - -Signature: - -```typescript -id: string; -``` diff --git a/docs/sdk.packmetadata.md b/docs/sdk.packmetadata.md deleted file mode 100644 index 50008531d..000000000 --- a/docs/sdk.packmetadata.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadata](./sdk.packmetadata.md) - -## PackMetadata interface - -Signature: - -```typescript -export interface PackMetadata -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [creator](./sdk.packmetadata.creator.md) | string | | -| [currentSupply](./sdk.packmetadata.currentsupply.md) | BigNumber | | -| [id](./sdk.packmetadata.id.md) | string | | -| [metadata](./sdk.packmetadata.metadata.md) | [NFTMetadata](./sdk.nftmetadata.md) | | -| [openStart](./sdk.packmetadata.openstart.md) | Date \| null | | - diff --git a/docs/sdk.packmetadata.metadata.md b/docs/sdk.packmetadata.metadata.md deleted file mode 100644 index b8b9f9006..000000000 --- a/docs/sdk.packmetadata.metadata.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadata](./sdk.packmetadata.md) > [metadata](./sdk.packmetadata.metadata.md) - -## PackMetadata.metadata property - -Signature: - -```typescript -metadata: NFTMetadata; -``` diff --git a/docs/sdk.packmetadata.openstart.md b/docs/sdk.packmetadata.openstart.md deleted file mode 100644 index 41af67fc7..000000000 --- a/docs/sdk.packmetadata.openstart.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadata](./sdk.packmetadata.md) > [openStart](./sdk.packmetadata.openstart.md) - -## PackMetadata.openStart property - -Signature: - -```typescript -openStart: Date | null; -``` diff --git a/docs/sdk.packmetadatawithbalance.md b/docs/sdk.packmetadatawithbalance.md deleted file mode 100644 index 3befc8034..000000000 --- a/docs/sdk.packmetadatawithbalance.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadataWithBalance](./sdk.packmetadatawithbalance.md) - -## PackMetadataWithBalance interface - - -Signature: - -```typescript -export interface PackMetadataWithBalance extends PackMetadata -``` -Extends: [PackMetadata](./sdk.packmetadata.md) - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [ownedByAddress](./sdk.packmetadatawithbalance.ownedbyaddress.md) | BigNumber | | - diff --git a/docs/sdk.packmetadatawithbalance.ownedbyaddress.md b/docs/sdk.packmetadatawithbalance.ownedbyaddress.md deleted file mode 100644 index f44e8de2f..000000000 --- a/docs/sdk.packmetadatawithbalance.ownedbyaddress.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackMetadataWithBalance](./sdk.packmetadatawithbalance.md) > [ownedByAddress](./sdk.packmetadatawithbalance.ownedbyaddress.md) - -## PackMetadataWithBalance.ownedByAddress property - -Signature: - -```typescript -ownedByAddress: BigNumber; -``` diff --git a/docs/sdk.packnftmetadata.md b/docs/sdk.packnftmetadata.md deleted file mode 100644 index ce11b15d5..000000000 --- a/docs/sdk.packnftmetadata.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackNFTMetadata](./sdk.packnftmetadata.md) - -## PackNFTMetadata interface - - -Signature: - -```typescript -export interface PackNFTMetadata -``` - -## Properties - -| Property | Type | Description | -| --- | --- | --- | -| [metadata](./sdk.packnftmetadata.metadata.md) | [NFTMetadata](./sdk.nftmetadata.md) | | -| [supply](./sdk.packnftmetadata.supply.md) | BigNumber | | - diff --git a/docs/sdk.packnftmetadata.metadata.md b/docs/sdk.packnftmetadata.metadata.md deleted file mode 100644 index 41838dd48..000000000 --- a/docs/sdk.packnftmetadata.metadata.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackNFTMetadata](./sdk.packnftmetadata.md) > [metadata](./sdk.packnftmetadata.metadata.md) - -## PackNFTMetadata.metadata property - -Signature: - -```typescript -metadata: NFTMetadata; -``` diff --git a/docs/sdk.packnftmetadata.supply.md b/docs/sdk.packnftmetadata.supply.md deleted file mode 100644 index eae1abead..000000000 --- a/docs/sdk.packnftmetadata.supply.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [PackNFTMetadata](./sdk.packnftmetadata.md) > [supply](./sdk.packnftmetadata.supply.md) - -## PackNFTMetadata.supply property - -Signature: - -```typescript -supply: BigNumber; -``` diff --git a/docs/sdk.thirdwebsdk.getcontractlist.md b/docs/sdk.thirdwebsdk.getcontractlist.md index cd860a893..97d738bb5 100644 --- a/docs/sdk.thirdwebsdk.getcontractlist.md +++ b/docs/sdk.thirdwebsdk.getcontractlist.md @@ -11,7 +11,7 @@ Return all the contracts deployed by the specified address ```typescript getContractList(walletAddress: string): Promise<{ address: string; - contractType: "custom" | "token" | "pack" | "split" | "edition" | "edition-drop" | "token-drop" | "vote" | "marketplace" | "nft-drop" | "signature-drop" | "multiwrap" | "nft-collection"; + contractType: "custom" | "token" | "split" | "edition" | "edition-drop" | "token-drop" | "vote" | "marketplace" | "pack" | "nft-drop" | "signature-drop" | "multiwrap" | "nft-collection"; metadata: () => Promise; }[]>; ``` @@ -24,5 +24,5 @@ getContractList(walletAddress: string): Promise<{ Returns: -Promise<{ address: string; contractType: "custom" \| "token" \| "pack" \| "split" \| "edition" \| "edition-drop" \| "token-drop" \| "vote" \| "marketplace" \| "nft-drop" \| "signature-drop" \| "multiwrap" \| "nft-collection"; metadata: () => Promise<any>; }\[\]> +Promise<{ address: string; contractType: "custom" \| "token" \| "split" \| "edition" \| "edition-drop" \| "token-drop" \| "vote" \| "marketplace" \| "pack" \| "nft-drop" \| "signature-drop" \| "multiwrap" \| "nft-collection"; metadata: () => Promise<any>; }\[\]> diff --git a/docs/sdk.underlyingtype.md b/docs/sdk.underlyingtype.md deleted file mode 100644 index 398ca00cb..000000000 --- a/docs/sdk.underlyingtype.md +++ /dev/null @@ -1,20 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UnderlyingType](./sdk.underlyingtype.md) - -## UnderlyingType enum - -Signature: - -```typescript -export declare enum UnderlyingType -``` - -## Enumeration Members - -| Member | Value | Description | -| --- | --- | --- | -| ERC20 | 1 | | -| ERC721 | 2 | | -| None | 0 | | - diff --git a/docs/snippets.json b/docs/snippets.json index e1264c807..e9f046dfd 100644 --- a/docs/snippets.json +++ b/docs/snippets.json @@ -890,58 +890,76 @@ }, "methods": [ { - "name": "balanceOf", - "summary": "Get Pack Balance\n\n", - "remarks": "\n\nGet a wallets pack balance (number of a specific packs in this contract owned by the wallet).\n\n", - "examples": { - "javascript": "// Address of the wallet to check pack balance\nconst address = \"{{wallet_address}}\";\n// The token ID of the pack you want to check the wallets balance of\nconst tokenId = \"0\"\n\nconst balance = await contract.balanceOf(address, tokenId);\nconsole.log(balance);" - }, - "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.balanceOf" - }, - { - "name": "create", - "summary": "Create Pack\n\n", - "remarks": "\n\nCreate a new pack with its own rewards.\n\n", + "name": "createTo", + "summary": "Create Pack To Wallet\n\n", + "remarks": "\n\nCreate a new pack with the given metadata and rewards and mint it to the specified address.\n\n", "examples": { - "javascript": "// Data to create the pack\nconst pack = {\n // The address of the contract that holds the rewards you want to include\n assetContract: \"0x...\",\n // The metadata of the pack\n metadata: {\n name: \"Cool Pack\",\n description: \"This is a cool pack\",\n // This can be an image url or image file\n image: readFileSync(\"path/to/image.png\"),\n },\n // The NFTs you want to include in the pack\n assets: [\n {\n tokenId: 0, // The token ID of the asset you want to add\n amount: 1, // The amount of the asset you want to add\n }, {\n tokenId: 1,\n amount: 1,\n }\n ],\n};\n\nawait contract.create(pack);" + "javascript": "const packMetadata = {\n // The metadata for the pack NFT itself\n metadata: {\n name: \"My Pack\",\n description: \"This is a new pack\",\n image: \"ipfs://...\",\n },\n // ERC20 rewards to be included in the pack\n erc20Rewards: [\n {\n assetContract: \"0x...\",\n quantity: 100,\n }\n ],\n // ERC721 rewards to be included in the pack\n erc721Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n }\n ],\n // ERC1155 rewards to be included in the pack\n erc1155Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n quantity: 100,\n }\n ],\n openStartTime: new Date(), // the date that packs can start to be opened, defaults to now\n rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1\n}\n\nconst tx = await contract.createTo(\"0x...\", packMetadata);" }, - "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.create" + "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.createTo" }, { "name": "getAll", - "summary": "Get Pack Data\n\n", - "remarks": "\n\nGet data associated with every pack in this contract.\n\n", + "summary": "Get All Packs\n\n", + "remarks": "\n\nGet all the data associated with every pack in this contract.\n\nBy default, returns the first 100 packs, use queryParams to fetch more.\n\n", "examples": { - "javascript": "const packs = await contract.getAll();\nconsole.log(packs);" + "javascript": "const packs = await contract.getAll();\nconsole.log(packs;" }, "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.getAll" }, { - "name": "getNFTs", - "summary": "Get Pack Reward Data\n\n", - "remarks": "\n\nGet data associated with the rewards inside a specified pack\n\n", + "name": "getOwned", + "summary": "Get Owned Packs\n\n", + "remarks": "\n\nGet all the data associated with the packs owned by a specific wallet.\n\n", "examples": { - "javascript": "// The pack ID of the pack whos rewards you want to get\nconst packId = 0;\n\nconst nfts = await contract.getNFTs(packId);\nconsole.log(nfts);" + "javascript": "// Address of the wallet to get the packs of\nconst address = \"{{wallet_address}}\";\nconst packss = await contract.getOwned(address);" }, - "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.getNFTs" + "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.getOwned" }, { "name": "open", "summary": "Open Pack\n\n", - "remarks": "\n\nOpen a pack to burn it and obtain the reward asset inside.\n\n", + "remarks": "\n\n- Open a pack to reveal the contained rewards. This will burn the specified pack and the contained assets will be transferred to the opening users wallet.\n\n", "examples": { - "javascript": "// The pack ID of the asset you want to buy\nconst packId = \"0\";\nconst tx = await contract.open(packId);\nconst receipt = tx.receipt; // the transaction receipt\nconst packId = tx.id; // the id of the pack that was opened\nconst rewards = tx.data(); // the contents of the opened pack" + "javascript": "const tokenId = 0\nconst amount = 1\nconst tx = await contract.open(tokenId, amount);" }, "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.open" }, + { + "name": "airdrop", + "summary": "Airdrop multiple NFTs\n\n", + "remarks": "\n\nAirdrop one or multiple NFTs to the provided wallet addresses.\n\n", + "examples": { + "javascript": "// Array of objects of addresses and quantities to airdrop NFTs to\nconst addresses = [\n {\n address: \"0x...\",\n quantity: 2,\n },\n {\n address: \"0x...\",\n quantity: 3,\n },\n];\nconst tokenId = \"0\";\nawait contract.airdrop(addresses, tokenId);\n\n// You can also pass an array of addresses, it will airdrop 1 NFT per address\nconst addresses = [\n \"0x...\", \"0x...\", \"0x...\",\n]\nconst tokenId = \"0\";\nawait contract.airdrop(addresses, tokenId);" + }, + "reference": "https://docs.thirdweb.com/typescript/sdk.Erc1155.airdrop" + }, + { + "name": "balanceOf", + "summary": "Get NFT Balance\n\n", + "remarks": "\n\nGet a wallets NFT balance (number of NFTs in this contract owned by the wallet).\n\n", + "examples": { + "javascript": "// Address of the wallet to check NFT balance\nconst walletAddress = \"{{wallet_address}}\";\nconst tokenId = 0; // Id of the NFT to check\nconst balance = await contract.balanceOf(walletAddress, tokenId);" + }, + "reference": "https://docs.thirdweb.com/typescript/sdk.Erc1155.balanceOf" + }, + { + "name": "get", + "summary": "Get a single NFT Metadata\n\n", + "remarks": null, + "examples": { + "javascript": "const nft = await contract.get(\"0\");" + }, + "reference": "https://docs.thirdweb.com/typescript/sdk.Erc1155.get" + }, { "name": "transfer", - "summary": "Transfer Pack\n\n", - "remarks": "\n\nTransfer a pack from the connected wallet to another wallet.\n\n", + "summary": "Transfer a single NFT\n\n", + "remarks": "\n\nTransfer an NFT from the connected wallet to another wallet.\n\n", "examples": { - "javascript": "// Address of the wallet you want to send the pack to\nconst toAddress = \"0x...\";\n\n// The token ID of the pack you want to send\nconst tokenId = \"0\";\n\n// The number of packs you want to send\nconst amount = 1;\n\nawait contract.transfer(toAddress, tokenId, amount);" + "javascript": "// Address of the wallet you want to send the NFT to\nconst toAddress = \"{{wallet_address}}\";\nconst tokenId = \"0\"; // The token ID of the NFT you want to send\nconst amount = 3; // How many copies of the NFTs to transfer\nawait contract.transfer(toAddress, tokenId, amount);" }, - "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.transfer" + "reference": "https://docs.thirdweb.com/typescript/sdk.Erc1155.transfer" } ], "properties": [ diff --git a/etc/sdk.api.md b/etc/sdk.api.md index e5c08163c..11a312873 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -190,21 +190,6 @@ export enum ChainId { xDai = 100 } -// Warning: (ae-internal-missing-underscore) The name "ChainlinkInfo" should be prefixed with an underscore because the declaration is marked as @internal -// -// @internal (undocumented) -export type ChainlinkInfo = { - vrfCoordinator: string; - linkTokenAddress: string; - keyHash: string; - fees: BigNumber; -}; - -// Warning: (ae-internal-missing-underscore) The name "ChainlinkVrf" should be prefixed with an underscore because the declaration is marked as @internal -// -// @internal (undocumented) -export const ChainlinkVrf: Record; - // Warning: (ae-internal-missing-underscore) The name "ChainOrRpc" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) @@ -2045,31 +2030,6 @@ export class InvalidAddressError extends Error { constructor(address?: string); } -// @beta (undocumented) -export interface IPackBatchArgs { - // (undocumented) - amount: BigNumberish; - // (undocumented) - tokenId: BigNumberish; -} - -// @public (undocumented) -export interface IPackCreateArgs { - // (undocumented) - assetContract: string; - // (undocumented) - assets: { - tokenId: BigNumberish; - amount: BigNumberish; - }[]; - // (undocumented) - metadata: NFTMetadataInput; - // (undocumented) - rewardsPerOpen?: BigNumberish; - // (undocumented) - secondsUntilOpenStart?: BigNumberish; -} - // @public export class IpfsStorage implements IStorage { // Warning: (ae-forgotten-export) The symbol "IpfsUploader" needs to be exported by the entry point index.d.ts @@ -2947,48 +2907,52 @@ export const OptionalPropertiesInput: z.ZodOptional { constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; // (undocumented) - balance(tokenId: string): Promise; - balanceOf(address: string, tokenId: string): Promise; - // (undocumented) static contractAbi: any; // (undocumented) static contractRoles: readonly ["admin", "minter", "pauser", "transfer"]; // (undocumented) static contractType: "pack"; - create(args: IPackCreateArgs): Promise>; - // (undocumented) - depositLink(amount: BigNumberish): Promise; + // Warning: (ae-forgotten-export) The symbol "PackMetadataInput" needs to be exported by the entry point index.d.ts + create(metadataWithRewards: PackMetadataInput): Promise>; + createTo(to: string, metadataWithRewards: PackMetadataInput): Promise>; // (undocumented) encoder: ContractEncoder; // (undocumented) estimator: GasCostEstimator; // (undocumented) events: ContractEvents; - get(packId: BigNumberish): Promise; - // (undocumented) - getAddress(): string; - getAll(): Promise; + getAll(queryParams?: QueryAllParams): Promise; + getOwned(walletAddress?: string): Promise; + // Warning: (ae-forgotten-export) The symbol "PackRewardsOutput" needs to be exported by the entry point index.d.ts + // // (undocumented) - getLinkBalance(): Promise; - getNFTs(packId: string): Promise; - getOwned(_address?: string): Promise; + getPackContents(packId: BigNumberish): Promise; // @internal (undocumented) interceptor: ContractInterceptor; // (undocumented) - isApproved(address: string, operator: string): Promise; - // Warning: (ae-forgotten-export) The symbol "Pack" needs to be exported by the entry point index.d.ts - // - // (undocumented) metadata: ContractMetadata; - // (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; - open(packId: string): Promise[]>; + // Warning: (ae-forgotten-export) The symbol "PackRewards" needs to be exported by the entry point index.d.ts + open(tokenId: number, amount?: number): Promise; // (undocumented) roles: ContractRoles; royalties: ContractRoyalty; @@ -3091,45 +3055,6 @@ export class Pack implements UpdateableNetwork { name: string; }>; }; - // (undocumented) - setApproval(operator: string, approved?: boolean): Promise; - transfer(to: string, tokenId: string, amount: BigNumber): Promise; - // Warning: (ae-incompatible-release-tags) The symbol "transferBatchFrom" is marked as @public, but its signature references "IPackBatchArgs" which is marked as @beta - // - // (undocumented) - transferBatchFrom(from: string, to: string, args: IPackBatchArgs[], data?: BytesLike): Promise; - // Warning: (ae-incompatible-release-tags) The symbol "transferFrom" is marked as @public, but its signature references "IPackBatchArgs" which is marked as @beta - // - // (undocumented) - transferFrom(from: string, to: string, args: IPackBatchArgs, data?: BytesLike): Promise; -} - -// @public (undocumented) -export interface PackMetadata { - // (undocumented) - creator: string; - // (undocumented) - currentSupply: BigNumber; - // (undocumented) - id: string; - // (undocumented) - metadata: NFTMetadata; - // (undocumented) - openStart: Date | null; -} - -// @public (undocumented) -export interface PackMetadataWithBalance extends PackMetadata { - // (undocumented) - ownedByAddress: BigNumber; -} - -// @public (undocumented) -export interface PackNFTMetadata { - // (undocumented) - metadata: NFTMetadata; - // (undocumented) - supply: BigNumber; } // Warning: (ae-internal-missing-underscore) The name "PartialClaimConditionInputSchema" should be prefixed with an underscore because the declaration is marked as @internal @@ -5071,7 +4996,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { getContractFromAbi(address: string, abi: ContractInterface): SmartContract; getContractList(walletAddress: string): Promise<{ address: string; - contractType: "custom" | "token" | "pack" | "split" | "edition" | "edition-drop" | "token-drop" | "vote" | "marketplace" | "nft-drop" | "signature-drop" | "multiwrap" | "nft-collection"; + contractType: "custom" | "token" | "split" | "edition" | "edition-drop" | "token-drop" | "vote" | "marketplace" | "pack" | "nft-drop" | "signature-drop" | "multiwrap" | "nft-collection"; metadata: () => Promise; }[]>; getEdition(address: string): Edition; @@ -5448,16 +5373,6 @@ export type TransactionResultWithId = TransactionResult & { // @internal (undocumented) export const TW_IPFS_SERVER_URL = "https://upload.nftlabs.co"; -// @public (undocumented) -export enum UnderlyingType { - // (undocumented) - ERC20 = 1, - // (undocumented) - ERC721 = 2, - // (undocumented) - None = 0 -} - // Warning: (ae-internal-missing-underscore) The name "UploadError" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) diff --git a/src/constants/chainlink.ts b/src/constants/chainlink.ts deleted file mode 100644 index 566cd5299..000000000 --- a/src/constants/chainlink.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { BigNumber, ethers } from "ethers"; -import { ChainId } from "./chains"; - -/** - * - * @internal - */ -export type ChainlinkInfo = { - vrfCoordinator: string; - linkTokenAddress: string; - keyHash: string; - fees: BigNumber; -}; - -/** - * - * @internal - */ -export const ChainlinkVrf: Record = { - [ChainId.Polygon]: { - vrfCoordinator: "0x3d2341ADb2D31f1c5530cDC622016af293177AE0", - linkTokenAddress: "0xb0897686c545045aFc77CF20eC7A532E3120E0F1", - keyHash: - "0xf86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da", - fees: ethers.utils.parseEther("0.0001"), - }, - [ChainId.Mumbai]: { - vrfCoordinator: "0x8C7382F9D8f56b33781fE506E897a4F1e2d17255", - linkTokenAddress: "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", - keyHash: - "0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4", - fees: ethers.utils.parseEther("0.0001"), - }, - [ChainId.Rinkeby]: { - vrfCoordinator: "0xb3dCcb4Cf7a26f6cf6B120Cf5A73875B7BBc655B", - linkTokenAddress: "0x01be23585060835e02b77ef475b0cc51aa1e0709", - keyHash: - "0x2ed0feb3e7fd2022120aa84fab1945545a9f2ffc9076fd6156fa96eaff4c1311", - fees: ethers.utils.parseEther("0.1"), - }, - [ChainId.Mainnet]: { - vrfCoordinator: "0xf0d54349aDdcf704F77AE15b96510dEA15cb7952", - linkTokenAddress: "0x514910771AF9Ca656af840dff83E8264EcF986CA", - keyHash: - "0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445", - fees: ethers.utils.parseEther("2"), - }, - [ChainId.Hardhat]: { - vrfCoordinator: "0x8C7382F9D8f56b33781fE506E897a4F1e2d17255", - linkTokenAddress: "0x326C977E6efc84E512bB9C30f76E30c160eD06FB", - keyHash: - "0x6e75b569a01ef56d18cab6a8e71e6600d6ce853834d4a5748b720d06f878b3a4", - fees: ethers.utils.parseEther("0.0001"), - }, -}; diff --git a/src/constants/index.ts b/src/constants/index.ts index ad714a09d..674d7bf15 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,5 +1,4 @@ export * from "./addresses"; -export * from "./chainlink"; export * from "./chains"; export * from "./contract"; export * from "./currency"; diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 4b6c1dc40..304bb6fb9 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -9,7 +9,7 @@ import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractEncoder } from "../core/classes/contract-encoder"; import { SDKOptions } from "../schema/sdk-options"; import { Pack as PackContract } from "contracts"; -import { PacksContractSchema } from "../schema/contracts/packs"; +import { PackContractSchema } from "../schema/contracts/packs"; import { ContractRoles } from "../core/classes/contract-roles"; import { ContractRoyalty } from "../core/classes/contract-royalty"; import { Erc1155 } from "../core/classes/erc-1155"; @@ -36,7 +36,7 @@ import { } from "../common/currency"; import { isTokenApprovedForTransfer } from "../common/marketplace"; import { uploadOrExtractURI } from "../common/nft"; -import { EditionMetadata } from "../schema"; +import { EditionMetadata, EditionMetadataOwner } from "../schema"; import { Erc1155Enumerable } from "../core/classes/erc-1155-enumerable"; import { QueryAllParams } from "../types"; @@ -61,7 +61,7 @@ export class Pack extends Erc1155 { /** * @internal */ - static schema = PacksContractSchema; + static schema = PackContractSchema; // TODO: Change schema and deployment public metadata: ContractMetadata; @@ -132,17 +132,17 @@ export class Pack extends Erc1155 { /** * Get All Packs * - * @remarks Get all the data associated with every token bundle in this contract. + * @remarks Get all the data associated with every pack in this contract. * - * By default, returns the first 100 NFTs, use queryParams to fetch more. + * By default, returns the first 100 packs, use queryParams to fetch more. * * @example * ```javascript - * const wrappedBundles = await contract.getAll(); - * console.log(wrappedBundles); + * const packs = await contract.getAll(); + * console.log(packs; * ``` * @param queryParams - optional filtering to only fetch a subset of results. - * @returns The NFT metadata for all NFTs queried. + * @returns The pack metadata for all packs queried. */ public async getAll( queryParams?: QueryAllParams, @@ -150,6 +150,26 @@ export class Pack extends Erc1155 { return this._query.all(queryParams); } + /** + * Get Owned Packs + * + * @remarks Get all the data associated with the packs owned by a specific wallet. + * + * @example + * ```javascript + * // Address of the wallet to get the packs of + * const address = "{{wallet_address}}"; + * const packss = await contract.getOwned(address); + * ``` + * + * @returns The pack metadata for all the owned packs in the contract. + */ + public async getOwned( + walletAddress?: string, + ): Promise { + return this._query.owned(walletAddress); + } + public async getPackContents( packId: BigNumberish, ): Promise { @@ -175,8 +195,8 @@ export class Pack extends Erc1155 { ); erc20Rewards.push({ contractAddress: reward.assetContract, - quantity: BigNumber.from(rewardAmount).div(amount).toString(), - totalRewards: amount.toString(), + quantity: amount.toString(), + totalRewards: BigNumber.from(rewardAmount).div(amount).toString(), }); break; } @@ -191,8 +211,10 @@ export class Pack extends Erc1155 { erc1155Rewards.push({ contractAddress: reward.assetContract, tokenId: reward.tokenId.toString(), - quantity: BigNumber.from(reward.totalAmount).div(amount).toString(), - totalRewards: amount.toString(), + quantity: amount.toString(), + totalRewards: BigNumber.from(reward.totalAmount) + .div(amount) + .toString(), }); break; } @@ -297,6 +319,7 @@ export class Pack extends Erc1155 { throw new Error("PackCreated event not found"); } const packId = event[0].args.packId; + return { id: packId, receipt, @@ -320,7 +343,10 @@ export class Pack extends Erc1155 { * const tx = await contract.open(tokenId, amount); * ``` */ - public async open(tokenId: number, amount = 1): Promise { + public async open( + tokenId: BigNumberish, + amount: BigNumberish = 1, + ): Promise { const receipt = await this.contractWrapper.sendTransaction("openPack", [ tokenId, amount, diff --git a/src/core/classes/factory.ts b/src/core/classes/factory.ts index c173ed717..66cabb0d8 100644 --- a/src/core/classes/factory.ts +++ b/src/core/classes/factory.ts @@ -17,7 +17,6 @@ import { IStorage } from "../interfaces/IStorage"; import { NetworkOrSignerOrProvider, ValidContractClass } from "../types"; import { ContractWrapper } from "./contract-wrapper"; -import { ChainlinkVrf } from "../../constants/chainlink"; import { CONTRACT_ADDRESSES, getContractAddressByChainId, diff --git a/src/schema/contracts/packs.ts b/src/schema/contracts/packs.ts index 1e76ae039..d80e0f55f 100644 --- a/src/schema/contracts/packs.ts +++ b/src/schema/contracts/packs.ts @@ -7,20 +7,20 @@ import { CommonTrustedForwarderSchema, } from "./common"; -export const PacksContractInput = +export const PackContractInput = CommonContractSchema.merge(CommonRoyaltySchema).merge(CommonSymbolSchema); -export const PacksContractOutput = +export const PackContractOutput = CommonContractOutputSchema.merge(CommonRoyaltySchema).merge( CommonSymbolSchema, ); -export const PacksContractDeploy = PacksContractInput.merge( +export const PackContractDeploy = PackContractInput.merge( CommonPlatformFeeSchema, ).merge(CommonTrustedForwarderSchema); -export const PacksContractSchema = { - deploy: PacksContractDeploy, - output: PacksContractOutput, - input: PacksContractInput, +export const PackContractSchema = { + deploy: PackContractDeploy, + output: PackContractOutput, + input: PackContractInput, }; diff --git a/test/before-setup.ts b/test/before-setup.ts index 38480f3f7..5a9fa85da 100644 --- a/test/before-setup.ts +++ b/test/before-setup.ts @@ -48,7 +48,6 @@ import { } from "../src"; import { MockStorage } from "./mock/MockStorage"; import { ChainId } from "../src/constants/chains"; -import { ChainlinkVrf } from "../src/constants/chainlink"; const RPC_URL = "http://localhost:8545"; @@ -172,13 +171,6 @@ before(async () => { nativeTokenWrapperAddress, thirdwebFeeDeployer.address, ); - case Pack.contractType: - const vrf = ChainlinkVrf[ChainId.Hardhat]; - return await contractFactory.deploy( - vrf.vrfCoordinator, - vrf.linkTokenAddress, - thirdwebFeeDeployer.address, - ); default: return await contractFactory.deploy(thirdwebFeeDeployer.address); } diff --git a/test/pack.test.ts b/test/pack.test.ts index 550075305..68db6e782 100644 --- a/test/pack.test.ts +++ b/test/pack.test.ts @@ -4,11 +4,9 @@ import { sdk, signers } from "./before-setup"; import { assert } from "chai"; import { BigNumber } from "ethers"; import { EditionMetadataInput, Pack, Edition } from "../src"; -import { PackMetadata } from "../src/types/packs"; global.fetch = require("cross-fetch"); -// TODO: Write some actual pack contract tests describe("Pack Contract", async () => { let packContract: Pack; let bundleContract: Edition; @@ -21,6 +19,20 @@ describe("Pack Contract", async () => { [adminWallet, samWallet, bobWallet] = signers; }); + const createBundles = async () => { + const batch: EditionMetadataInput[] = []; + for (let i = 0; i < 5; i++) { + batch.push({ + metadata: { + name: `NFT ${i}`, + }, + supply: BigNumber.from(1000), + }); + } + + await bundleContract.mintBatch(batch); + }; + beforeEach(async () => { sdk.updateSignerOrProvider(adminWallet); packContract = sdk.getPack( @@ -37,39 +49,31 @@ describe("Pack Contract", async () => { primary_sale_recipient: adminWallet.address, }), ); - }); - const createBundles = async () => { - const batch: EditionMetadataInput[] = []; - for (let i = 0; i < 5; i++) { - batch.push({ - metadata: { - name: `NFT ${i}`, - }, - supply: BigNumber.from(1000), - }); - } - - await bundleContract.mintBatch(batch); - }; + await bundleContract.setApprovalForAll(packContract.getAddress(), true); + await createBundles(); + }); - const createPacks = async (): Promise => { + const createPacks = async () => { const packOne = await packContract.create({ erc1155Rewards: [ { contractAddress: bundleContract.getAddress(), tokenId: "0", - quantity: BigNumber.from(50), + quantity: 1, + totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "1", - quantity: BigNumber.from(50), + quantity: 1, + totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "2", - quantity: BigNumber.from(50), + quantity: 1, + totalRewards: 50, }, ], metadata: { @@ -82,17 +86,20 @@ describe("Pack Contract", async () => { { contractAddress: bundleContract.getAddress(), tokenId: "0", - quantity: BigNumber.from(50), + quantity: 1, + totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "1", - quantity: BigNumber.from(50), + quantity: 1, + totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "2", - quantity: BigNumber.from(50), + quantity: 1, + totalRewards: 50, }, ], metadata: { @@ -101,97 +108,68 @@ describe("Pack Contract", async () => { rewardsPerPack: 2, }); - return [await packOne.data(), await packTwo.data()]; + return [packOne, packTwo]; }; - describe("Pack Creation", () => { - beforeEach(async () => { - await createBundles(); - }); + it("should allow you to create a batch of packs", async () => { + const [pack] = await createPacks(); + const data = await pack.data(); - it("should allow you to create a batch of packs", async () => { - const [pack] = await createPacks(); + assert.equal(data.metadata.name, "Pack"); + }); - assert.equal(pack.creator, adminWallet.address); - assert.equal(pack.id.toString(), "0"); - assert.equal(pack.metadata.name, "Pack"); - }); + it("should return the correct rewards", async () => { + const [pack] = await createPacks(); + const rewards = await packContract.getPackContents(pack.id); - it("should return the correct rewards", async () => { - const [pack] = await createPacks(); - const rewards = await packContract.getNFTs(pack.id); - - const first = rewards.find( - (reward) => - reward.metadata.id.toString() === "0" && - reward.supply.toNumber() === 50 && - reward.metadata.name === "NFT 0", - ); - - const second = rewards.find( - (reward) => - reward.metadata.id.toString() === "1" && - reward.supply.toNumber() === 50 && - reward.metadata.name === "NFT 1", - ); - - const third = rewards.find( - (reward) => - reward.metadata.id.toString() === "2" && - reward.supply.toNumber() === 50 && - reward.metadata.name === "NFT 2", - ); - - assert.isDefined(first, "First NFT not found"); - assert.isDefined(second, "Second NFT not found"); - assert.isDefined(third, "Third NFT not found"); - }); + const first = rewards.erc1155Rewards.find( + (reward) => reward.tokenId === "0" && reward.totalRewards === "50", + ); - it("should return correct pack supply", async () => { - const [packOne, packTwo] = await createPacks(); - const balanceOne = await packContract.balance(packOne.id); - const balanceTwo = await packContract.balance(packTwo.id); + const second = rewards.erc1155Rewards.find( + (reward) => reward.tokenId === "1" && reward.totalRewards === "50", + ); - assert.equal("150", packOne.currentSupply.toString()); - assert.equal("150", balanceOne.toString()); - assert.equal("75", packTwo.currentSupply.toString()); - assert.equal("75", balanceTwo.toString()); - }); + const third = rewards.erc1155Rewards.find( + (reward) => reward.tokenId === "2" && reward.totalRewards === "50", + ); + + assert.isDefined(first, "First NFT not found"); + assert.isDefined(second, "Second NFT not found"); + assert.isDefined(third, "Third NFT not found"); }); - describe("Open Pack", async () => { - beforeEach(async () => { - await createBundles(); - }); + it("should return correct pack supply", async () => { + const [packOne, packTwo] = await createPacks(); + const balanceOne = await packContract.balance(packOne.id); + const balanceTwo = await packContract.balance(packTwo.id); - it.skip("pack open returns valid reward", async () => { - const pack = await createPacks(); - // TODO how can we test this with VRF in the way? - const result = await packContract.open(pack[0].id); - assert.equal(result.erc1155Rewards?.length, 1); - }); + assert.equal("150", balanceOne.toString()); + assert.equal("75", balanceTwo.toString()); }); - describe("Get owned packs", async () => { - beforeEach(async () => { - await createBundles(); - }); + it("pack open returns valid reward", async () => { + const [packOne, packTwo] = await createPacks(); + let result = await packContract.open(packOne.id); + assert.equal(result.erc1155Rewards?.length, 1); + result = await packContract.open(packTwo.id); + assert.equal(result.erc1155Rewards?.length, 2); + }); - it("get owned returns pack metadata and balances", async () => { - const pack = await createPacks(); + it("get owned returns pack metadata and balances", async () => { + await createPacks(); - let adminOwned = await packContract.getOwned(); - assert.equal(adminOwned.length, 2); - assert.equal(adminOwned[0].ownedByAddress.toString(), "150"); - assert.equal(adminOwned[1].ownedByAddress.toString(), "75"); + let adminOwned = await packContract.getOwned(); + assert.equal(adminOwned.length, 2); + assert.equal(adminOwned[0].quantityOwned.toString(), "150"); + assert.equal(adminOwned[1].quantityOwned.toString(), "75"); - await packContract.transfer(samWallet.address, "0", BigNumber.from(50)); - const samOwned = await packContract.getOwned(samWallet.address); - assert.equal(samOwned.length, 1); - assert.equal(samOwned[0].ownedByAddress.toString(), "50"); + await packContract.transfer(samWallet.address, "0", BigNumber.from(50)); + const samOwned = await packContract.getOwned(samWallet.address); + assert.equal(samOwned.length, 1); + assert.equal(samOwned[0].quantityOwned.toString(), "50"); - adminOwned = await packContract.getOwned(); - assert.equal(adminOwned[0].ownedByAddress.toString(), "100"); - }); + adminOwned = await packContract.getOwned(); + assert.equal(adminOwned[0].quantityOwned.toString(), "100"); }); }); From 35828d52de9862abe5769d2ff7787a1dab1c3262 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Tue, 14 Jun 2022 14:55:12 -0400 Subject: [PATCH 06/12] Add standard top level functions --- src/contracts/pack.ts | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 304bb6fb9..5c9111648 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -39,6 +39,7 @@ import { uploadOrExtractURI } from "../common/nft"; import { EditionMetadata, EditionMetadataOwner } from "../schema"; import { Erc1155Enumerable } from "../core/classes/erc-1155-enumerable"; import { QueryAllParams } from "../types"; +import { getRoleHash } from "../common/role"; /** * Create lootboxes of NFTs with rarity based open mechanics. @@ -170,6 +171,42 @@ export class Pack extends Erc1155 { return this._query.owned(walletAddress); } + /** + * Get the number of packs created + * @returns the total number of packs minted in this contract + * @public + */ + public async getTotalCount(): Promise { + return this._query.totalCount(); + } + + /** + * Get whether users can transfer packs from this contract + */ + public async isTransferRestricted(): Promise { + const anyoneCanTransfer = await this.contractWrapper.readContract.hasRole( + getRoleHash("transfer"), + ethers.constants.AddressZero, + ); + return !anyoneCanTransfer; + } + + /** + * Get Pack Contents + * @remarks Get the rewards contained inside a pack. + * + * @param packId - The id of the pack to get the contents of. + * @returns - The contents of the pack. + * + * @example + * ```javascript + * const packId = 0; + * const contents = await contract.getPackContents(packId); + * console.log(contents.erc20Rewards); + * console.log(contents.erc721Rewards); + * console.log(contents.erc1155Rewards); + * ``` + */ public async getPackContents( packId: BigNumberish, ): Promise { From 813caa28c4c50cd734bacdc99afa3d3d788a34f8 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Tue, 14 Jun 2022 15:05:41 -0400 Subject: [PATCH 07/12] Use quantityPerReward --- src/contracts/pack.ts | 12 ++++++------ src/schema/tokens/pack.ts | 37 ++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 5c9111648..44edd3cc6 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -232,7 +232,7 @@ export class Pack extends Erc1155 { ); erc20Rewards.push({ contractAddress: reward.assetContract, - quantity: amount.toString(), + quantityPerReward: amount.toString(), totalRewards: BigNumber.from(rewardAmount).div(amount).toString(), }); break; @@ -248,7 +248,7 @@ export class Pack extends Erc1155 { erc1155Rewards.push({ contractAddress: reward.assetContract, tokenId: reward.tokenId.toString(), - quantity: amount.toString(), + quantityPerReward: amount.toString(), totalRewards: BigNumber.from(reward.totalAmount) .div(amount) .toString(), @@ -410,7 +410,7 @@ export class Pack extends Erc1155 { ); erc20Rewards.push({ contractAddress: reward.assetContract, - quantity: ethers.utils + quantityPerReward: ethers.utils .formatUnits(reward.totalAmount, tokenMetadata.decimals) .toString(), }); @@ -427,7 +427,7 @@ export class Pack extends Erc1155 { erc1155Rewards.push({ contractAddress: reward.assetContract, tokenId: reward.tokenId.toString(), - quantity: reward.totalAmount.toString(), + quantityPerReward: reward.totalAmount.toString(), }); break; } @@ -456,7 +456,7 @@ export class Pack extends Erc1155 { for (const erc20 of erc20Rewards) { const normalizedQuantity = await normalizePriceValue( provider, - erc20.quantity, + erc20.quantityPerReward, erc20.contractAddress, ); // Multiply the quantity of one reward by the number of rewards @@ -538,7 +538,7 @@ export class Pack extends Erc1155 { contents.push({ assetContract: erc1155.contractAddress, tokenType: 2, - totalAmount: BigNumber.from(erc1155.quantity).mul( + totalAmount: BigNumber.from(erc1155.quantityPerReward).mul( BigNumber.from(erc1155.totalRewards), ), tokenId: erc1155.tokenId, diff --git a/src/schema/tokens/pack.ts b/src/schema/tokens/pack.ts index d227c9db5..3735aa27c 100644 --- a/src/schema/tokens/pack.ts +++ b/src/schema/tokens/pack.ts @@ -1,5 +1,5 @@ import { z } from "zod"; -import { BigNumberishSchema, RawDateSchema } from "../shared"; +import { BigNumberishSchema, PriceSchema, RawDateSchema } from "../shared"; import { NFTInputOrUriSchema } from "./common"; import { ERC1155WrappableSchema, @@ -10,19 +10,42 @@ import { /** * @internal */ -const ERC20RewardContentsSchema = ERC20WrappableSchema.extend({ +const ERC20RewardSchema = ERC20WrappableSchema.omit({ + quantity: true, +}).extend({ + quantityPerReward: PriceSchema, +}); + +/** + * @internal + */ +const ERC721RewardSchema = ERC721WrappableSchema; + +/** + * @internal + */ +const ERC1155RewardSchema = ERC1155WrappableSchema.omit({ + quantity: true, +}).extend({ + quantityPerReward: BigNumberishSchema, +}); + +/** + * @internal + */ +const ERC20RewardContentsSchema = ERC20RewardSchema.extend({ totalRewards: BigNumberishSchema.default("1"), }); /** * @internal */ -const ERC721RewardContentsSchema = ERC721WrappableSchema; +const ERC721RewardContentsSchema = ERC721RewardSchema; /** * @internal */ -const ERC1155RewardContentsSchema = ERC1155WrappableSchema.extend({ +const ERC1155RewardContentsSchema = ERC1155RewardSchema.extend({ totalRewards: BigNumberishSchema.default("1"), }); @@ -30,9 +53,9 @@ const ERC1155RewardContentsSchema = ERC1155WrappableSchema.extend({ * @internal */ export const PackRewardsSchema = z.object({ - erc20Rewards: z.array(ERC20WrappableSchema).default([]), - erc721Rewards: z.array(ERC721WrappableSchema).default([]), - erc1155Rewards: z.array(ERC1155WrappableSchema).default([]), + erc20Rewards: z.array(ERC20RewardSchema).default([]), + erc721Rewards: z.array(ERC721RewardSchema).default([]), + erc1155Rewards: z.array(ERC1155RewardSchema).default([]), }); /** From 03385912cfde5e2f661179b55032a02d5ac8dd1e Mon Sep 17 00:00:00 2001 From: adam-maj Date: Tue, 14 Jun 2022 15:09:01 -0400 Subject: [PATCH 08/12] Update pack test --- test/pack.test.ts | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/test/pack.test.ts b/test/pack.test.ts index 68db6e782..c85b2a6c2 100644 --- a/test/pack.test.ts +++ b/test/pack.test.ts @@ -60,19 +60,19 @@ describe("Pack Contract", async () => { { contractAddress: bundleContract.getAddress(), tokenId: "0", - quantity: 1, + quantityPerReward: 1, totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "1", - quantity: 1, + quantityPerReward: 1, totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "2", - quantity: 1, + quantityPerReward: 1, totalRewards: 50, }, ], @@ -86,19 +86,19 @@ describe("Pack Contract", async () => { { contractAddress: bundleContract.getAddress(), tokenId: "0", - quantity: 1, + quantityPerReward: 1, totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "1", - quantity: 1, + quantityPerReward: 1, totalRewards: 50, }, { contractAddress: bundleContract.getAddress(), tokenId: "2", - quantity: 1, + quantityPerReward: 1, totalRewards: 50, }, ], @@ -123,15 +123,24 @@ describe("Pack Contract", async () => { const rewards = await packContract.getPackContents(pack.id); const first = rewards.erc1155Rewards.find( - (reward) => reward.tokenId === "0" && reward.totalRewards === "50", + (reward) => + reward.tokenId === "0" && + reward.totalRewards === "50" && + reward.quantityPerReward === "1", ); const second = rewards.erc1155Rewards.find( - (reward) => reward.tokenId === "1" && reward.totalRewards === "50", + (reward) => + reward.tokenId === "1" && + reward.totalRewards === "50" && + reward.quantityPerReward === "1", ); const third = rewards.erc1155Rewards.find( - (reward) => reward.tokenId === "2" && reward.totalRewards === "50", + (reward) => + reward.tokenId === "2" && + reward.totalRewards === "50" && + reward.quantityPerReward === "1", ); assert.isDefined(first, "First NFT not found"); From 4634ca5380342ed9aa208021b904bf5733fcbdf1 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Tue, 14 Jun 2022 15:40:37 -0400 Subject: [PATCH 09/12] Update docs --- docs/sdk.pack.getpackcontents.md | 21 ++++++++++++++++++++- docs/sdk.pack.gettotalcount.md | 19 +++++++++++++++++++ docs/sdk.pack.istransferrestricted.md | 17 +++++++++++++++++ docs/sdk.pack.md | 4 +++- docs/sdk.pack.open.md | 6 +++--- docs/snippets.json | 9 +++++++++ etc/sdk.api.md | 6 +++--- 7 files changed, 74 insertions(+), 8 deletions(-) create mode 100644 docs/sdk.pack.gettotalcount.md create mode 100644 docs/sdk.pack.istransferrestricted.md diff --git a/docs/sdk.pack.getpackcontents.md b/docs/sdk.pack.getpackcontents.md index 028d9c8db..10b287399 100644 --- a/docs/sdk.pack.getpackcontents.md +++ b/docs/sdk.pack.getpackcontents.md @@ -4,6 +4,8 @@ ## Pack.getPackContents() method +Get Pack Contents + Signature: ```typescript @@ -14,9 +16,26 @@ getPackContents(packId: BigNumberish): Promise; | Parameter | Type | Description | | --- | --- | --- | -| packId | BigNumberish | | +| packId | BigNumberish | The id of the pack to get the contents of. | Returns: Promise<PackRewardsOutput> +- The contents of the pack. + +## Remarks + +Get the rewards contained inside a pack. + +## Example + + +```javascript +const packId = 0; +const contents = await contract.getPackContents(packId); +console.log(contents.erc20Rewards); +console.log(contents.erc721Rewards); +console.log(contents.erc1155Rewards); +``` + diff --git a/docs/sdk.pack.gettotalcount.md b/docs/sdk.pack.gettotalcount.md new file mode 100644 index 000000000..0c35663fb --- /dev/null +++ b/docs/sdk.pack.gettotalcount.md @@ -0,0 +1,19 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [getTotalCount](./sdk.pack.gettotalcount.md) + +## Pack.getTotalCount() method + +Get the number of packs created + +Signature: + +```typescript +getTotalCount(): Promise; +``` +Returns: + +Promise<BigNumber> + +the total number of packs minted in this contract + diff --git a/docs/sdk.pack.istransferrestricted.md b/docs/sdk.pack.istransferrestricted.md new file mode 100644 index 000000000..2b1a10f37 --- /dev/null +++ b/docs/sdk.pack.istransferrestricted.md @@ -0,0 +1,17 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Pack](./sdk.pack.md) > [isTransferRestricted](./sdk.pack.istransferrestricted.md) + +## Pack.isTransferRestricted() method + +Get whether users can transfer packs from this contract + +Signature: + +```typescript +isTransferRestricted(): Promise; +``` +Returns: + +Promise<boolean> + diff --git a/docs/sdk.pack.md b/docs/sdk.pack.md index 609a9aaed..cf70dd4fc 100644 --- a/docs/sdk.pack.md +++ b/docs/sdk.pack.md @@ -51,6 +51,8 @@ const contract = sdk.getPack("{{contract_address}}"); | [createTo(to, metadataWithRewards)](./sdk.pack.createto.md) | | Create Pack To Wallet | | [getAll(queryParams)](./sdk.pack.getall.md) | | Get All Packs | | [getOwned(walletAddress)](./sdk.pack.getowned.md) | | Get Owned Packs | -| [getPackContents(packId)](./sdk.pack.getpackcontents.md) | | | +| [getPackContents(packId)](./sdk.pack.getpackcontents.md) | | Get Pack Contents | +| [getTotalCount()](./sdk.pack.gettotalcount.md) | | Get the number of packs created | +| [isTransferRestricted()](./sdk.pack.istransferrestricted.md) | | Get whether users can transfer packs from this contract | | [open(tokenId, amount)](./sdk.pack.open.md) | | Open Pack | diff --git a/docs/sdk.pack.open.md b/docs/sdk.pack.open.md index 170074f34..41ea60040 100644 --- a/docs/sdk.pack.open.md +++ b/docs/sdk.pack.open.md @@ -9,15 +9,15 @@ Open Pack Signature: ```typescript -open(tokenId: number, amount?: number): Promise; +open(tokenId: BigNumberish, amount?: BigNumberish): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| tokenId | number | the token ID of the pack you want to open | -| amount | number | (Optional) the amount of packs you want to open | +| tokenId | BigNumberish | the token ID of the pack you want to open | +| amount | BigNumberish | (Optional) the amount of packs you want to open | Returns: diff --git a/docs/snippets.json b/docs/snippets.json index e9f046dfd..14bb33b3f 100644 --- a/docs/snippets.json +++ b/docs/snippets.json @@ -916,6 +916,15 @@ }, "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.getOwned" }, + { + "name": "getPackContents", + "summary": "Get Pack Contents\n\n", + "remarks": "\n\nGet the rewards contained inside a pack.\n\n", + "examples": { + "javascript": "const packId = 0;\nconst contents = await contract.getPackContents(packId);\nconsole.log(contents.erc20Rewards);\nconsole.log(contents.erc721Rewards);\nconsole.log(contents.erc1155Rewards);" + }, + "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.getPackContents" + }, { "name": "open", "summary": "Open Pack\n\n", diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 11a312873..8aa10274a 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -2944,15 +2944,15 @@ export class Pack extends Erc1155 { getAll(queryParams?: QueryAllParams): Promise; getOwned(walletAddress?: string): Promise; // Warning: (ae-forgotten-export) The symbol "PackRewardsOutput" needs to be exported by the entry point index.d.ts - // - // (undocumented) getPackContents(packId: BigNumberish): Promise; + getTotalCount(): Promise; // @internal (undocumented) interceptor: ContractInterceptor; + isTransferRestricted(): Promise; // (undocumented) metadata: ContractMetadata; // Warning: (ae-forgotten-export) The symbol "PackRewards" needs to be exported by the entry point index.d.ts - open(tokenId: number, amount?: number): Promise; + open(tokenId: BigNumberish, amount?: BigNumberish): Promise; // (undocumented) roles: ContractRoles; royalties: ContractRoyalty; From 2c32179b9ef6f102cc4015cbd8e8c6003efe6667 Mon Sep 17 00:00:00 2001 From: adam-maj Date: Tue, 14 Jun 2022 23:57:43 -0400 Subject: [PATCH 10/12] Update packMetadata and TODO --- src/contracts/pack.ts | 3 +-- src/schema/tokens/pack.ts | 2 +- test/pack.test.ts | 4 ++-- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 44edd3cc6..f58d88e38 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -63,7 +63,6 @@ export class Pack extends Erc1155 { * @internal */ static schema = PackContractSchema; - // TODO: Change schema and deployment public metadata: ContractMetadata; public roles: ContractRoles; @@ -330,7 +329,7 @@ export class Pack extends Erc1155 { metadataWithRewards: PackMetadataInput, ): Promise> { const uri = await uploadOrExtractURI( - metadataWithRewards.metadata, + metadataWithRewards.packMetadata, this.storage, ); diff --git a/src/schema/tokens/pack.ts b/src/schema/tokens/pack.ts index 3735aa27c..dc4fcda89 100644 --- a/src/schema/tokens/pack.ts +++ b/src/schema/tokens/pack.ts @@ -71,7 +71,7 @@ export const PackRewardsOutputSchema = z.object({ * @internal */ export const PackMetadataInputSchema = PackRewardsOutputSchema.extend({ - metadata: NFTInputOrUriSchema, + packMetadata: NFTInputOrUriSchema, rewardsPerPack: BigNumberishSchema.default("1"), openStartTime: RawDateSchema.default(new Date()), }); diff --git a/test/pack.test.ts b/test/pack.test.ts index c85b2a6c2..45f3ca75e 100644 --- a/test/pack.test.ts +++ b/test/pack.test.ts @@ -76,7 +76,7 @@ describe("Pack Contract", async () => { totalRewards: 50, }, ], - metadata: { + packMetadata: { name: "Pack", }, }); @@ -102,7 +102,7 @@ describe("Pack Contract", async () => { totalRewards: 50, }, ], - metadata: { + packMetadata: { name: "Pack", }, rewardsPerPack: 2, From f64852beb0e320bac8923d3487cd4f22af77adee Mon Sep 17 00:00:00 2001 From: adam-maj Date: Wed, 15 Jun 2022 12:28:27 -0400 Subject: [PATCH 11/12] Update docs --- docs/sdk.pack.create.md | 2 +- docs/sdk.pack.createto.md | 6 +++--- docs/snippets.json | 2 +- src/contracts/pack.ts | 7 ++++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/docs/sdk.pack.create.md b/docs/sdk.pack.create.md index 4026e3e96..3b01784d3 100644 --- a/docs/sdk.pack.create.md +++ b/docs/sdk.pack.create.md @@ -36,5 +36,5 @@ Promise<[TransactionResultWithId](./sdk.transactionresultwithid.md)&l ## Remarks -Create a new pack with the given metadata and rewards and mint it to the connected wallet. +See [Pack.createTo()](./sdk.pack.createto.md) diff --git a/docs/sdk.pack.createto.md b/docs/sdk.pack.createto.md index a66601fa6..b731ec872 100644 --- a/docs/sdk.pack.createto.md +++ b/docs/sdk.pack.createto.md @@ -31,9 +31,9 @@ Create a new pack with the given metadata and rewards and mint it to the specifi ```javascript -const packMetadata = { +const metadata = { // The metadata for the pack NFT itself - metadata: { + packMetadata: { name: "My Pack", description: "This is a new pack", image: "ipfs://...", @@ -64,6 +64,6 @@ const packMetadata = { rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1 } -const tx = await contract.createTo("0x...", packMetadata); +const tx = await contract.createTo("0x...", metadata); ``` diff --git a/docs/snippets.json b/docs/snippets.json index 145402a63..0c31b5c52 100644 --- a/docs/snippets.json +++ b/docs/snippets.json @@ -894,7 +894,7 @@ "summary": "Create Pack To Wallet\n\n", "remarks": "\n\nCreate a new pack with the given metadata and rewards and mint it to the specified address.\n\n", "examples": { - "javascript": "const packMetadata = {\n // The metadata for the pack NFT itself\n metadata: {\n name: \"My Pack\",\n description: \"This is a new pack\",\n image: \"ipfs://...\",\n },\n // ERC20 rewards to be included in the pack\n erc20Rewards: [\n {\n assetContract: \"0x...\",\n quantity: 100,\n }\n ],\n // ERC721 rewards to be included in the pack\n erc721Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n }\n ],\n // ERC1155 rewards to be included in the pack\n erc1155Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n quantity: 100,\n }\n ],\n openStartTime: new Date(), // the date that packs can start to be opened, defaults to now\n rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1\n}\n\nconst tx = await contract.createTo(\"0x...\", packMetadata);" + "javascript": "const metadata = {\n // The metadata for the pack NFT itself\n packMetadata: {\n name: \"My Pack\",\n description: \"This is a new pack\",\n image: \"ipfs://...\",\n },\n // ERC20 rewards to be included in the pack\n erc20Rewards: [\n {\n assetContract: \"0x...\",\n quantity: 100,\n }\n ],\n // ERC721 rewards to be included in the pack\n erc721Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n }\n ],\n // ERC1155 rewards to be included in the pack\n erc1155Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n quantity: 100,\n }\n ],\n openStartTime: new Date(), // the date that packs can start to be opened, defaults to now\n rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1\n}\n\nconst tx = await contract.createTo(\"0x...\", metadata);" }, "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.createTo" }, diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index f58d88e38..27c06dbc0 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -271,6 +271,7 @@ export class Pack extends Erc1155 { /** * Create Pack * @remarks Create a new pack with the given metadata and rewards and mint it to the connected wallet. + * @remarks See {@link Pack.createTo} * * @param metadataWithRewards - the metadata and rewards to include in the pack */ @@ -288,9 +289,9 @@ export class Pack extends Erc1155 { * * @example * ```javascript - * const packMetadata = { + * const metadata = { * // The metadata for the pack NFT itself - * metadata: { + * packMetadata: { * name: "My Pack", * description: "This is a new pack", * image: "ipfs://...", @@ -321,7 +322,7 @@ export class Pack extends Erc1155 { * rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1 * } * - * const tx = await contract.createTo("0x...", packMetadata); + * const tx = await contract.createTo("0x...", metadata); * ``` */ public async createTo( From b0e97a58802f16228df1bebb321b2427ede4d63f Mon Sep 17 00:00:00 2001 From: adam-maj Date: Wed, 15 Jun 2022 12:44:31 -0400 Subject: [PATCH 12/12] Update metadata to pack --- docs/sdk.pack.createto.md | 4 ++-- docs/snippets.json | 2 +- src/contracts/pack.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/sdk.pack.createto.md b/docs/sdk.pack.createto.md index b731ec872..2f4118267 100644 --- a/docs/sdk.pack.createto.md +++ b/docs/sdk.pack.createto.md @@ -31,7 +31,7 @@ Create a new pack with the given metadata and rewards and mint it to the specifi ```javascript -const metadata = { +const pack = { // The metadata for the pack NFT itself packMetadata: { name: "My Pack", @@ -64,6 +64,6 @@ const metadata = { rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1 } -const tx = await contract.createTo("0x...", metadata); +const tx = await contract.createTo("0x...", pack); ``` diff --git a/docs/snippets.json b/docs/snippets.json index 0c31b5c52..2b4f3016d 100644 --- a/docs/snippets.json +++ b/docs/snippets.json @@ -894,7 +894,7 @@ "summary": "Create Pack To Wallet\n\n", "remarks": "\n\nCreate a new pack with the given metadata and rewards and mint it to the specified address.\n\n", "examples": { - "javascript": "const metadata = {\n // The metadata for the pack NFT itself\n packMetadata: {\n name: \"My Pack\",\n description: \"This is a new pack\",\n image: \"ipfs://...\",\n },\n // ERC20 rewards to be included in the pack\n erc20Rewards: [\n {\n assetContract: \"0x...\",\n quantity: 100,\n }\n ],\n // ERC721 rewards to be included in the pack\n erc721Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n }\n ],\n // ERC1155 rewards to be included in the pack\n erc1155Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n quantity: 100,\n }\n ],\n openStartTime: new Date(), // the date that packs can start to be opened, defaults to now\n rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1\n}\n\nconst tx = await contract.createTo(\"0x...\", metadata);" + "javascript": "const pack = {\n // The metadata for the pack NFT itself\n packMetadata: {\n name: \"My Pack\",\n description: \"This is a new pack\",\n image: \"ipfs://...\",\n },\n // ERC20 rewards to be included in the pack\n erc20Rewards: [\n {\n assetContract: \"0x...\",\n quantity: 100,\n }\n ],\n // ERC721 rewards to be included in the pack\n erc721Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n }\n ],\n // ERC1155 rewards to be included in the pack\n erc1155Rewards: [\n {\n assetContract: \"0x...\",\n tokenId: 0,\n quantity: 100,\n }\n ],\n openStartTime: new Date(), // the date that packs can start to be opened, defaults to now\n rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1\n}\n\nconst tx = await contract.createTo(\"0x...\", pack);" }, "reference": "https://docs.thirdweb.com/typescript/sdk.Pack.createTo" }, diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 27c06dbc0..806a62984 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -289,7 +289,7 @@ export class Pack extends Erc1155 { * * @example * ```javascript - * const metadata = { + * const pack = { * // The metadata for the pack NFT itself * packMetadata: { * name: "My Pack", @@ -322,7 +322,7 @@ export class Pack extends Erc1155 { * rewardsPerPack: 1, // the number of rewards in each pack, defaults to 1 * } * - * const tx = await contract.createTo("0x...", metadata); + * const tx = await contract.createTo("0x...", pack); * ``` */ public async createTo(