Compare commits

...
Author SHA1 Message Date
github-actions[bot]GitHubgithub-actions[bot] <github-actions[bot]@users.noreply.github.com>
7129aef6e1 Version Packages (#370)
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2022-11-11 08:51:19 -08:00
Joaquim VergesandGitHub f50b74819d [SDK] make isConnected sync, remove useless fn (#381) 2022-11-11 06:14:24 +00:00
Joaquim VergesandGitHub 3eba69afd7 [SDK] expose signer's chain id via sdk.wallet (#380) 2022-11-11 00:42:05 +00:00
Jarrod WattsandGitHub 98c2253e8f [SDK] Docs - Add await before sdk.getContract snippets (#379) 2022-11-10 16:08:31 -08:00
32d91ef709 [REACT] Fix Border Radius for Safari (#378)
Co-authored-by: Jarrod Watts <[email protected]>
2022-11-10 09:53:17 -08:00
Adam MajmudarandGitHub b79dc18f7a Add event filtering on topics (#377) 2022-11-09 11:51:13 -05:00
Adam MajmudarandGitHub 4af785c37c Add TokensClaimed event to tiered-drop (#376) 2022-11-08 20:34:45 +00:00
Adam MajmudarandGitHub 6f818f393e Updated tiered-drop contract (#373) 2022-11-03 17:03:00 -07:00
Adam MajmudarandGitHub 97ed4779a9 Update nft drop claimTo documentation (#372) 2022-11-03 22:42:42 +00:00
Nacho IacovinoandGitHub 2d3fca5237 [React] Add useClaimerProofs hook (#369) 2022-11-03 01:17:15 +01:00
35 changed files with 280 additions and 77 deletions
+2
View File
@@ -1,5 +1,7 @@
# @thirdweb-dev/auth
## 2.0.29
## 2.0.28
## 2.0.27
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/auth",
"version": "2.0.28",
"version": "2.0.29",
"exports": {
"./next": {
"module": "./next/dist/thirdweb-dev-auth-next.esm.js",
+7
View File
@@ -1,5 +1,12 @@
# thirdweb
## 0.8.15
### Patch Changes
- Updated dependencies [[`3eba69a`](https://github.com/thirdweb-dev/js/commit/3eba69afd78b7aa472a9c00c9d4220bb69ad1d3e), [`4af785c`](https://github.com/thirdweb-dev/js/commit/4af785c37c831ecd7087c1c9eb9095922cac0855), [`6f818f3`](https://github.com/thirdweb-dev/js/commit/6f818f393eb9023b53a3358d62d60ec23a9246bd), [`b79dc18`](https://github.com/thirdweb-dev/js/commit/b79dc18f7ab5155bbf4af02dc1a953546160bad0)]:
- @thirdweb-dev/sdk@3.5.2
## 0.8.14
### Patch Changes
+1 -1
View File
@@ -1,7 +1,7 @@
{
"name": "thirdweb",
"main": "dist/cli/index.js",
"version": "0.8.14",
"version": "0.8.15",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/cli",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
+8
View File
@@ -1,5 +1,13 @@
# @thirdweb-dev/contracts-js
## 1.2.1
### Patch Changes
- [#376](https://github.com/thirdweb-dev/js/pull/376) [`4af785c`](https://github.com/thirdweb-dev/js/commit/4af785c37c831ecd7087c1c9eb9095922cac0855) Thanks [@adam-maj](https://github.com/adam-maj)! - Update tiered-drop with tokens claimed
- [#373](https://github.com/thirdweb-dev/js/pull/373) [`6f818f3`](https://github.com/thirdweb-dev/js/commit/6f818f393eb9023b53a3358d62d60ec23a9246bd) Thanks [@adam-maj](https://github.com/adam-maj)! - Update tiered-drop contract version
## 1.2.0
### Minor Changes
+2 -2
View File
@@ -1,12 +1,12 @@
{
"name": "@thirdweb-dev/contracts-js",
"version": "1.2.0",
"version": "1.2.1",
"main": "dist/thirdweb-dev-contracts-js.cjs.js",
"module": "dist/thirdweb-dev-contracts-js.esm.js",
"license": "Apache-2.0",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/contracts-js",
"dependencies": {
"@thirdweb-dev/contracts": "3.2.0-4"
"@thirdweb-dev/contracts": "^3.2.2"
},
"devDependencies": {
"@babel/preset-env": "^7.18.10",
+10
View File
@@ -1,5 +1,15 @@
# @thirdweb-dev/react
## 3.5.2
### Patch Changes
- [#369](https://github.com/thirdweb-dev/js/pull/369) [`2d3fca5`](https://github.com/thirdweb-dev/js/commit/2d3fca52373046c88392139922e9c9da79f9a2d4) Thanks [@nachoiacovino](https://github.com/nachoiacovino)! - Add useClaimerProofs hook
- [#378](https://github.com/thirdweb-dev/js/pull/378) [`32d91ef`](https://github.com/thirdweb-dev/js/commit/32d91ef709c8fb92a903e52c65b27538a80ea4eb) Thanks [@mykcryptodev](https://github.com/mykcryptodev)! - round borders for buttons and menus on safari
- [#377](https://github.com/thirdweb-dev/js/pull/377) [`b79dc18`](https://github.com/thirdweb-dev/js/commit/b79dc18f7ab5155bbf4af02dc1a953546160bad0) Thanks [@adam-maj](https://github.com/adam-maj)! - Add event filters
## 3.5.1
## 3.5.0
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/react",
"version": "3.5.1",
"version": "3.5.2",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/react",
"author": "thirdweb eng <[email protected]>",
"license": "Apache-2.0",
@@ -37,8 +37,19 @@ const BaseButton = styled.button<BaseButtonProps>`
cursor: not-allowed;
}
&:focus {
outline: 2px solid ${(props) => (props.theme as TwUiTheme).colors.accent};
outline-offset: 1px;
position: relative;
border-radius: 0.5em;
outline: 0;
}
&:focus:after {
content: "";
position: absolute;
top: -5px;
right: -5px;
bottom: -5px;
left: -5px;
border: 2px solid ${(props) => (props.theme as TwUiTheme).colors.accent};
border-radius: 11px;
}
`;
@@ -8,10 +8,23 @@ export const Menu = styled.ul<MenuProps>`
margin: 0;
background: ${(props) => (props.theme as TwUiTheme).colors.background};
color: ${(props) => (props.theme as TwUiTheme).colors.text};
outline-color: ${(props) => (props.theme as TwUiTheme).colors.accent};
outline-style: solid;
outline-offset: 0px;
list-style: none;
border-radius: 0.5em;
overflow: hidden;
position: relative;
pointer-events: auto;
&:focus {
outline: 0;
}
&:after {
content: "";
position: absolute;
border: 1px solid ${(props) => (props.theme as TwUiTheme).colors.accent};
border-radius: 0.5em;
pointer-events: none;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
`;
@@ -45,7 +45,7 @@ export type SetClaimConditionsParams = {
/** **********************/
/**
* Use this to get the active claim conditon for ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work.
* Use this to get the active claim condition for ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work.
*
* @example
* ```javascript
@@ -60,7 +60,7 @@ export type SetClaimConditionsParams = {
* const { data: activeClaimCondition, isLoading, error } = useActiveClaimCondition(<YourERC1155ContractInstance>, <tokenId>);
* ```
*
* @param contract - an instance of a contract that extends the ERC721 or ERC1155 spec and implements the `claimConditions` extension.
* @param contract - an instance of a contract that extends the ERC721, ERC1155 or ERC20 spec and implements the `claimConditions` extension.
* @param tokenId - the id of the token to fetch the claim conditions for (if the contract is an ERC1155 contract)
* @returns a response object with the currently active claim condition
* @twfeature ERC721ClaimableWithConditions | ERC1155ClaimableWithConditions | ERC20ClaimableWithConditions
@@ -106,7 +106,70 @@ export function useActiveClaimCondition(
}
/**
* Use this to get all claim conditons for ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work.
* Use this to get the claimer proofs for an adddress for ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work.
*
* @example
* ```javascript
* const { data: claimerProofs, isLoading, error } = useClaimerProofs(<YourERC20ContractInstance>);
* ```
* @example
* ```javascript
* const { data: claimerProofs, isLoading, error } = useClaimerProofs(<YourERC721ContractInstance>);
* ```
* @example
* ```javascript
* const { data: claimerProofs, isLoading, error } = useClaimerProofs(<YourERC1155ContractInstance>, <tokenId>);
* ```
*
* @param contract - an instance of a contract that extends the ERC721, ERC1155 or ERC20 spec and implements the `claimConditions` extension.
* @param claimerAddress - the address of the claimer to fetch the claimer proofs for
* @param tokenId - the id of the token to fetch the claimer proofs for (if the contract is an ERC1155 contract)
* @param claimConditionId - optional the claim condition id to get the proofs for
* @returns a response object with the snapshot for the provided address
* @twfeature ERC721ClaimableWithConditions | ERC1155ClaimableWithConditions | ERC20ClaimableWithConditions
* @beta
*/
export function useClaimerProofs(
contract: RequiredParam<DropContract>,
claimerAddress: string,
tokenId?: BigNumberish,
claimConditionId?: BigNumberish,
) {
const contractAddress = contract?.getAddress();
const { erc1155, erc721, erc20 } = getErcs(contract);
return useQueryWithNetwork(
cacheKeys.extensions.claimConditions.getClaimerProofs(
contractAddress,
tokenId,
),
() => {
if (erc1155) {
requiredParamInvariant(
tokenId,
"tokenId is required for ERC1155 claim conditions",
);
return erc1155.claimConditions.getClaimerProofs(tokenId, claimerAddress, claimConditionId);
}
if (erc721) {
return erc721.claimConditions.getClaimerProofs(claimerAddress, claimConditionId);
}
if (erc20) {
return erc20.claimConditions.getClaimerProofs(claimerAddress, claimConditionId);
}
throw new Error("Contract must be ERC721, ERC1155 or ERC20");
},
{
// Checks that happen here:
// 1. if the contract is based on ERC1155 contract => tokenId cannot be `undefined`
// 2. if the contract is NOT based on ERC1155 => we have to have either an ERC721 or ERC20 contract
enabled: erc1155 ? tokenId !== undefined : !!erc721 || !!erc20,
},
);
}
/**
* Use this to get all claim conditions for ERC20, ERC721 or ERC1155 based contracts. They need to extend the `claimCondition` extension for this hook to work.
*
* @example
* ```javascript
@@ -121,7 +184,7 @@ export function useActiveClaimCondition(
* const { data: claimConditions, isLoading, error } = useClaimConditions(<YourERC1155ContractInstance>, <tokenId>);
* ```
*
* @param contract - an instance of a contract that extends the ERC721 or ERC1155 spec and implements the `claimConditions` extension.
* @param contract - an instance of a contract that extends the ERC721, ERC1155 or ERC20 spec and implements the `claimConditions` extension.
* @param tokenId - the id of the token to fetch the claim conditions for (if the contract is an ERC1155 contract)
* @returns a response object with the list of claim conditions
* @twfeature ERC721ClaimableWithConditions | ERC1155ClaimableWithConditions | ERC20ClaimableWithConditions
@@ -23,7 +23,7 @@ import {
ContractEvent,
ContractForPrebuiltContractType,
ContractType,
EventQueryFilter,
EventQueryOptions,
PrebuiltContractType,
SUPPORTED_CHAIN_ID,
ThirdwebSDK,
@@ -346,7 +346,7 @@ export function useContractMetadataUpdate(
export function useContractEvents(
contract: RequiredParam<ValidContractInstance>,
eventName?: string,
options: { queryFilter?: EventQueryFilter; subscribe?: boolean } = {
options: { queryFilter?: EventQueryOptions; subscribe?: boolean } = {
subscribe: true,
},
) {
@@ -11,7 +11,7 @@ import { useContract } from "../async/contracts";
* import { useContract } from '@thirdweb-dev/react'
*
* export default function Component() {
* const { contract } = useNFTCollection("<YOUR-CONTRACT-ADDRESS>", "nft-collection")
* const { contract, isLoading, error } = useContract("<YOUR-CONTRACT-ADDRESS>", "nft-collection")
*
* // Now you can use the nftCollection contract in the rest of the component
*
@@ -287,6 +287,16 @@ export const cacheKeys = {
? ["claimConditions", "getAll", { tokenId }, options]
: ["claimConditions", "getAll", options],
),
getClaimerProofs: (
contractAddress: RequiredParam<ContractAddress>,
tokenId?: BigNumberish,
) =>
createContractCacheKey(
contractAddress,
tokenId
? ["claimConditions", "getClaimerProofs", { tokenId }]
: ["claimConditions", "getClaimerProofs"],
),
getClaimIneligibilityReasons: (
contractAddress: RequiredParam<ContractAddress>,
params: { walletAddress?: WalletAddress; quantity: string | number },
+15
View File
@@ -1,5 +1,20 @@
# @thirdweb-dev/sdk
## 3.5.2
### Patch Changes
- [#380](https://github.com/thirdweb-dev/js/pull/380) [`3eba69a`](https://github.com/thirdweb-dev/js/commit/3eba69afd78b7aa472a9c00c9d4220bb69ad1d3e) Thanks [@joaquim-verges](https://github.com/joaquim-verges)! - Expose sdk.wallet.getChainId()
- [#376](https://github.com/thirdweb-dev/js/pull/376) [`4af785c`](https://github.com/thirdweb-dev/js/commit/4af785c37c831ecd7087c1c9eb9095922cac0855) Thanks [@adam-maj](https://github.com/adam-maj)! - Update tiered-drop with tokens claimed
- [#373](https://github.com/thirdweb-dev/js/pull/373) [`6f818f3`](https://github.com/thirdweb-dev/js/commit/6f818f393eb9023b53a3358d62d60ec23a9246bd) Thanks [@adam-maj](https://github.com/adam-maj)! - Update tiered-drop contract version
- [#377](https://github.com/thirdweb-dev/js/pull/377) [`b79dc18`](https://github.com/thirdweb-dev/js/commit/b79dc18f7ab5155bbf4af02dc1a953546160bad0) Thanks [@adam-maj](https://github.com/adam-maj)! - Add event filters
- Updated dependencies [[`4af785c`](https://github.com/thirdweb-dev/js/commit/4af785c37c831ecd7087c1c9eb9095922cac0855), [`6f818f3`](https://github.com/thirdweb-dev/js/commit/6f818f393eb9023b53a3358d62d60ec23a9246bd)]:
- @thirdweb-dev/contracts-js@1.2.1
## 3.5.1
### Patch Changes
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@thirdweb-dev/sdk",
"version": "3.5.1",
"version": "3.5.2",
"description": "The main thirdweb SDK.",
"repository": "https://github.com/thirdweb-dev/js/tree/main/packages/sdk",
"license": "Apache-2.0",
@@ -39,7 +39,7 @@ import { BigNumber, BigNumberish, CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "edition-drop");
* const contract = await sdk.getContract("{{contract_address}}", "edition-drop");
* ```
*
* @public
@@ -37,7 +37,7 @@ import { BigNumber, BigNumberish, CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "edition");
* const contract = await sdk.getContract("{{contract_address}}", "edition");
* ```
*
* @public
@@ -3,10 +3,7 @@ import { ListingNotFoundError } from "../../common";
import { isNativeToken } from "../../common/currency";
import { mapOffer } from "../../common/marketplace";
import { getRoleHash } from "../../common/role";
import {
NATIVE_TOKENS,
SUPPORTED_CHAIN_ID,
} from "../../constants";
import { NATIVE_TOKENS, SUPPORTED_CHAIN_ID } from "../../constants";
import { ContractEncoder } from "../../core/classes/contract-encoder";
import { ContractEvents } from "../../core/classes/contract-events";
import { ContractInterceptor } from "../../core/classes/contract-interceptor";
@@ -42,7 +39,7 @@ import invariant from "tiny-invariant";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "marketplace");
* const contract = await sdk.getContract("{{contract_address}}", "marketplace");
* ```
*
* @public
@@ -47,7 +47,7 @@ import { BigNumberish, CallOverrides, ethers } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "multiwrap");
* const contract = await sdk.getContract("{{contract_address}}", "multiwrap");
* ```
*
* @beta
@@ -35,7 +35,7 @@ import { BigNumberish, CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "nft-collection");
* const contract = await sdk.getContract("{{contract_address}}", "nft-collection");
* ```
*
* @public
@@ -44,7 +44,7 @@ import { BigNumber, BigNumberish, CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "nft-drop");
* const contract = await sdk.getContract("{{contract_address}}", "nft-drop");
* ```
*
* @public
@@ -409,9 +409,9 @@ export class NFTDrop extends StandardErc721<PrebuiltNFTDrop> {
* const quantity = 1; // how many unique NFTs you want to claim
*
* const tx = await contract.claimTo(address, quantity);
* const receipt = tx.receipt; // the transaction receipt
* const claimedTokenId = tx.id; // the id of the NFT claimed
* const claimedNFT = await tx.data(); // (optional) get the claimed NFT metadata
* const receipt = tx[0].receipt; // the transaction receipt
* const claimedTokenId = tx[0].id; // the id of the NFT claimed
* const claimedNFT = await tx[0].data(); // (optional) get the claimed NFT metadata
* ```
*
* @param destinationAddress - Address you want to send the token to
@@ -52,7 +52,7 @@ import { BigNumber, BigNumberish, CallOverrides, ethers } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "pack");
* const contract = await sdk.getContract("{{contract_address}}", "pack");
* ```
*
* @public
@@ -47,7 +47,7 @@ import { BigNumber, BigNumberish, CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "signature-drop");
* const contract = await sdk.getContract("{{contract_address}}", "signature-drop");
* ```
*
* @public
@@ -30,7 +30,7 @@ import { BigNumber, CallOverrides, Contract } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "split");
* const contract = await sdk.getContract("{{contract_address}}", "split");
* ```
*
* @public
@@ -28,7 +28,7 @@ import { CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "token-drop");
* const contract = await sdk.getContract("{{contract_address}}", "token-drop");
* ```
*
*/
@@ -30,7 +30,7 @@ import { CallOverrides, constants } from "ethers";
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "token");
* const contract = await sdk.getContract("{{contract_address}}", "token");
* ```
*
* @public
@@ -46,7 +46,7 @@ import {
* import { ThirdwebSDK } from "@thirdweb-dev/sdk";
*
* const sdk = new ThirdwebSDK("{{chainName}}");
* const contract = sdk.getContract("{{contract_address}}", "vote");
* const contract = await sdk.getContract("{{contract_address}}", "vote");
* ```
*
* @public
@@ -1,5 +1,5 @@
import { EventType } from "../../constants";
import { ContractEvent, EventQueryFilter } from "../../types/index";
import { ContractEvent, EventQueryOptions } from "../../types/index";
import { ContractWrapper } from "./contract-wrapper";
import { EventFragment } from "@ethersproject/abi";
import { BaseContract, Event, providers } from "ethers";
@@ -198,7 +198,7 @@ export class ContractEvents<TContract extends BaseContract> {
* @returns The event objects of the events emitted with event names and data for each event
*/
public async getAllEvents<TEvent extends Record<string, any>>(
filters: EventQueryFilter = {
filters: Omit<EventQueryOptions, "filters"> = {
fromBlock: 0,
toBlock: "latest",
order: "desc",
@@ -226,23 +226,34 @@ export class ContractEvents<TContract extends BaseContract> {
* ```javascript
* // The name of the event to get logs for
* const eventName = "Transfer";
* // Optionally pass in filters to limit the blocks from which events are retrieved
* const filters = {
*
* // Optionally pass in options to limit the blocks from which events are retrieved
* const options = {
* fromBlock: 0,
* toBlock: 1000000,
* }
* const events = await contract.events.getEvents(eventName, filters);
* toBlock: 1000000, // can also pass "latest"
* order: "desc",
* // Configure event filters (filter on indexed event parameters)
* filters: {
* from: "0x...",
* to: "0x..."
* }
* };
*
* const events = await contract.events.getEvents(eventName, options);
* console.log(events[0].eventName);
* console.log(events[0].data);
* ```
*
* @param eventName - The name of the event to get logs for
* @param filters - Specify the from and to block numbers to get events for, defaults to all blocks. @see EventQueryFilter
* @param options - Specify the from and to block numbers to get events for, defaults to all blocks. @see EventQueryOptions
* @returns The requested event objects with event data
*/
public async getEvents<TEvent extends Record<string, any>>(
public async getEvents<
TEvent extends Record<string, any> = Record<string, any>,
TFilter extends Record<string, any> = Record<string, any>,
>(
eventName: string,
filters: EventQueryFilter = {
options: EventQueryOptions<TFilter> = {
fromBlock: 0,
toBlock: "latest",
order: "desc",
@@ -251,24 +262,32 @@ export class ContractEvents<TContract extends BaseContract> {
const event = this.contractWrapper.readContract.interface.getEvent(
eventName as string,
);
const filter = this.contractWrapper.readContract.filters[event.name];
const eventInterface =
this.contractWrapper.readContract.interface.getEvent(eventName);
const args = options.filters
? eventInterface.inputs.map((e) => (options.filters as TFilter)[e.name])
: [];
const filter = this.contractWrapper.readContract.filters[event.name](
...args,
);
const events = await this.contractWrapper.readContract.queryFilter(
filter(),
filters.fromBlock,
filters.toBlock,
filter,
options.fromBlock,
options.toBlock,
);
const orderedEvents = events.sort((a, b) => {
return filters.order === "desc"
return options.order === "desc"
? b.blockNumber - a.blockNumber
: a.blockNumber - b.blockNumber;
});
return this.parseEvents(orderedEvents);
return this.parseEvents<TEvent>(orderedEvents);
}
private parseEvents<TEvent extends Record<string, any>>(
private parseEvents<TEvent = Record<string, any>>(
events: Event[],
): ContractEvent<TEvent>[] {
return events.map((e) => {
@@ -77,7 +77,7 @@ export class Erc721Claimable implements DetectableFeature {
* const quantity = 1; // how many NFTs you want to claim
*
* const tx = await contract.erc721.claimTo(address, tokenId, quantity);
* const receipt = tx.receipt; // the transaction receipt
* const receipt = tx[0].receipt; // the transaction receipt
* ```
*
* @param destinationAddress - Address you want to send the token to
@@ -21,7 +21,10 @@ import { TransactionResult, TransactionResultWithId } from "../types";
import { ContractWrapper } from "./contract-wrapper";
import { Erc721 } from "./erc-721";
import type { TieredDrop, ISignatureAction } from "@thirdweb-dev/contracts-js";
import { TokensLazyMintedEvent } from "@thirdweb-dev/contracts-js/dist/declarations/src/TieredDrop";
import {
TokensLazyMintedEvent,
TokensClaimedEvent,
} from "@thirdweb-dev/contracts-js/dist/declarations/src/TieredDrop";
import { ThirdwebStorage } from "@thirdweb-dev/storage";
import { BigNumberish, ethers } from "ethers";
import invariant from "tiny-invariant";
@@ -46,12 +49,16 @@ export class Erc721TieredDrop implements DetectableFeature {
public async getMetadataInTier(
tier: string,
): Promise<Omit<NFTMetadata, "id">[]> {
const batches = await this.contractWrapper.readContract.getMetadataInTier(
tier,
);
const tiers =
await this.contractWrapper.readContract.getMetadataForAllTiers();
const batches = tiers.find((t) => t.tier === tier);
if (!batches) {
throw new Error("Tier not found in contract.");
}
const nfts = await Promise.all(
batches.tokens
batches.ranges
.map((range, i) => {
const nftsInRange = [];
const baseUri = batches.baseURIs[i];
@@ -133,8 +140,9 @@ export class Erc721TieredDrop implements DetectableFeature {
"TokensLazyMinted",
receipt?.logs,
);
const startingIndex = event[0].args.startTokenId;
const endingIndex = event[0].args.endTokenId;
const startingIndex = event[0].args[1];
const endingIndex = event[0].args[2];
const results: TransactionResultWithId<NFTMetadata>[] = [];
for (let id = startingIndex; id.lte(endingIndex); id = id.add(1)) {
results.push({
@@ -214,8 +222,8 @@ export class Erc721TieredDrop implements DetectableFeature {
"TokensLazyMinted",
receipt?.logs,
);
const startingIndex = event[0].args.startTokenId;
const endingIndex = event[0].args.endTokenId;
const startingIndex = event[0].args[1];
const endingIndex = event[0].args[2];
const results: TransactionResultWithId<NFTMetadata>[] = [];
for (let id = startingIndex; id.lte(endingIndex); id = id.add(1)) {
results.push({
@@ -314,7 +322,7 @@ export class Erc721TieredDrop implements DetectableFeature {
public async claimWithSignature(
signedPayload: TieredDropPayloadWithSignature,
): Promise<TransactionResult> {
): Promise<TransactionResultWithId<NFT>[]> {
const message = await this.mapPayloadToContractStruct(
signedPayload.payload,
);
@@ -338,9 +346,22 @@ export class Erc721TieredDrop implements DetectableFeature {
[message, signedPayload.signature],
overrides,
);
const event = this.contractWrapper.parseLogs<TokensClaimedEvent>(
"TokensClaimed",
receipt?.logs,
);
const startingIndex = event[0].args.startTokenId;
const endingIndex = startingIndex.add(event[0].args.quantityClaimed);
const results: TransactionResultWithId<NFT>[] = [];
for (let id = startingIndex; id.lt(endingIndex); id = id.add(1)) {
results.push({
id,
receipt,
data: () => this.erc721.get(id),
});
}
// TODO: Listen for TokensClaimed event once it gets emitted
return { receipt };
return results;
}
private async mapPayloadToContractStruct(
+24 -3
View File
@@ -139,10 +139,31 @@ export class UserWallet {
* const address = await sdk.wallet.getAddress();
* ```
*/
async getAddress(): Promise<string> {
public async getAddress(): Promise<string> {
return await this.requireWallet().getAddress();
}
/**
* Get the currently connected wallet's chainId
* @internal
*/
public async getChainId(): Promise<number> {
return await this.requireWallet().getChainId();
}
/**
* Checks whether there's a signer connected with the SDK
* @internal
*/
public isConnected(): boolean {
try {
this.requireWallet();
return true;
} catch (e) {
return false;
}
}
/**
* Sign any message with the connected wallet private key
* @param message - the message to sign
@@ -157,7 +178,7 @@ export class UserWallet {
* const signature = await sdk.wallet.sign(message);
* ```
*/
async sign(message: string): Promise<string> {
public async sign(message: string): Promise<string> {
const signer = this.requireWallet();
return await signer.signMessage(message);
}
@@ -187,7 +208,7 @@ export class UserWallet {
* Send a raw transaction to the blockchain from the connected wallet
* @param transactionRequest - raw transaction data to send to the blockchain
*/
async sendRawTransaction(
public async sendRawTransaction(
transactionRequest: providers.TransactionRequest,
): Promise<TransactionResult> {
const signer = this.requireWallet();
+4 -1
View File
@@ -37,8 +37,11 @@ export type ContractEvent<TEvent = Record<string, any>> = {
/**
* Filters for querying past events
*/
export interface EventQueryFilter {
export interface EventQueryOptions<
TFilter extends Record<string, any> = Record<string, any>,
> {
fromBlock?: string | number;
toBlock?: string | number;
order?: "asc" | "desc";
filters?: TFilter;
}
+5 -2
View File
@@ -13,7 +13,7 @@ describe("Tiered Drop Contract", async () => {
async function deployTieredDrop() {
// This needs to match the release for the currently used ABI
const releaseUri =
"ipfs://QmTK2dpcDMiePacs6bNh6LhQdPB9RkxXHmx9CtrPLPRBuS/0";
"ipfs://QmXu9ezFNgXBX1juLZ7kwdf5KpTD1x9GPHnk14QB2NpUvK/0";
const address = await sdk.deployer.deployContractFromUri(releaseUri, [], {
forceDirectDeploy: true,
});
@@ -103,7 +103,10 @@ describe("Tiered Drop Contract", async () => {
assert.isTrue(isValid);
sdk.updateSignerOrProvider(claimerWallet);
await contract.erc721.tieredDrop.claimWithSignature(signedPayload);
const txs = await contract.erc721.tieredDrop.claimWithSignature(
signedPayload,
);
expect((await txs[0].data()).metadata.name).to.equal("NFT #1");
});
it("Should get tokens in tier", async () => {
+4 -4
View File
@@ -4437,10 +4437,10 @@
"@tanstack/query-core" "4.3.4"
use-sync-external-store "^1.2.0"
"@thirdweb-dev/[email protected].0-4":
version "3.2.0-4"
resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.2.0-4.tgz#b696bdaae1dee7cf448549ac10bb78e55c622272"
integrity sha512-Mc3VvBB6rqTMKKH04UQbDabAlVPT7PiKBQrJDuhAPjOxBYWwn9pHi7amXJt2tJOkmHAj+w+oT76q7IqWv3QHhw==
"@thirdweb-dev/contracts@^3.2.2":
version "3.2.2"
resolved "https://registry.yarnpkg.com/@thirdweb-dev/contracts/-/contracts-3.2.2.tgz#dac0587337258369081fa1e2edb2570f79d61e95"
integrity sha512-s5ZHZBF8iyoWtEKFJJDdpdwQ2TMuF0sCGdvIYxLLdoRsEtW1gPOp2icis+LTtdvly5+uaSF8ZW3RVdX9A/b4Nw==
"@tootallnate/once@1":
version "1.1.2"