import { describe, expect, it } from "vitest"; import { ANVIL_CHAIN } from "~test/chains.js"; import { TEST_CONTRACT_URI } from "~test/ipfs-uris.js"; import { render, screen } from "~test/react-render.js"; import { TEST_CLIENT } from "~test/test-clients.js"; import { TEST_ACCOUNT_A } from "~test/test-wallets.js"; import { getContract } from "../../../../../../contract/contract.js"; import { deployERC20Contract } from "../../../../../../extensions/prebuilts/deploy-erc20.js"; import { deployERC721Contract } from "../../../../../../extensions/prebuilts/deploy-erc721.js"; import { deployERC1155Contract } from "../../../../../../extensions/prebuilts/deploy-erc1155.js"; import { ClaimButton, getERC20ClaimTo, getERC721ClaimTo, getERC1155ClaimTo, } from "./index.js"; const account = TEST_ACCOUNT_A; const client = TEST_CLIENT; const chain = ANVIL_CHAIN; /** * The ClaimButton uses TransactionButton under the hood * So all we need to test is whether it gives the correct PreparedTransaction to the TransactionButton */ describe.runIf(process.env.TW_SECRET_KEY)("ClaimButton", () => { // ERC721 it("should work for an NFT Drop contract", async () => { const address = await deployERC721Contract({ account, chain, client, params: { contractURI: TEST_CONTRACT_URI, name: "", }, type: "DropERC721", }); const contract = getContract({ address, chain, client }); const result = await getERC721ClaimTo({ account, claimParams: { quantity: 1n, type: "ERC721" }, contract, }); expect(result.to).toBe(address); expect(result.chain.id).toBe(chain.id); expect(result.client.clientId).toBe(client.clientId); expect("data" in result).toBe(true); // should also render render( Claim , ); expect(screen.queryByText("Claim")).toBeInTheDocument(); expect(screen.getByRole("button")).toBeInTheDocument(); }); it("should work for an Edition Drop contract", async () => { const address = await deployERC1155Contract({ account, chain, client, params: { contractURI: TEST_CONTRACT_URI, name: "", }, type: "DropERC1155", }); const contract = getContract({ address, chain, client }); const result = await getERC1155ClaimTo({ account, claimParams: { quantity: 1n, tokenId: 0n, type: "ERC1155" }, contract, }); expect(result.to).toBe(address); expect(result.chain.id).toBe(chain.id); expect(result.client.clientId).toBe(client.clientId); expect("data" in result).toBe(true); // should also render render( Claim , ); expect(screen.queryByText("Claim")).toBeInTheDocument(); expect(screen.getByRole("button")).toBeInTheDocument(); }); it("should throw an error if claim quantity / quantityInWei is not passed", async () => { const address = await deployERC20Contract({ account, chain, client, params: { contractURI: TEST_CONTRACT_URI, name: "", }, type: "DropERC20", }); const contract = getContract({ address, chain, client }); await expect( getERC20ClaimTo({ account, // @ts-ignore Intended for the test claimParams: { type: "ERC20" }, contract, }), ).rejects.toThrowError("Missing quantity or quantityInWei"); }); it("should work for an Token Drop contract + quantity", async () => { const address = await deployERC20Contract({ account, chain, client, params: { contractURI: TEST_CONTRACT_URI, name: "", }, type: "DropERC20", }); const contract = getContract({ address, chain, client }); const result = await getERC20ClaimTo({ account, claimParams: { quantity: "1", type: "ERC20" }, contract, }); expect(result.to).toBe(address); expect(result.chain.id).toBe(chain.id); expect(result.client.clientId).toBe(client.clientId); expect("data" in result).toBe(true); // should also render render( Claim , ); expect(screen.queryByText("Claim")).toBeInTheDocument(); expect(screen.getByRole("button")).toBeInTheDocument(); }); it("should work for an Token Drop contract + quantityInWei", async () => { const address = await deployERC20Contract({ account, chain, client, params: { contractURI: TEST_CONTRACT_URI, name: "", }, type: "DropERC20", }); const contract = getContract({ address, chain, client }); const result = await getERC20ClaimTo({ account, claimParams: { quantityInWei: 1000000n, type: "ERC20" }, contract, }); expect(result.to).toBe(address); expect(result.chain.id).toBe(chain.id); expect(result.client.clientId).toBe(client.clientId); expect("data" in result).toBe(true); // should also render render( Claim , ); expect(screen.queryByText("Claim")).toBeInTheDocument(); expect(screen.getByRole("button")).toBeInTheDocument(); }); });