From 624d1e65b999cd96026100785abb634618ff9619 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Wed, 18 May 2022 22:51:09 -0700 Subject: [PATCH 01/20] Allow instantiating the SDK with just a chain name --- docs/sdk.contractevents.addeventlistener.md | 4 +- .../sdk.contractevents.removeeventlistener.md | 4 +- docs/sdk.gascostestimator.gascostof.md | 4 +- docs/sdk.thirdwebsdk._constructor_.md | 4 +- etc/sdk.api.md | 20 ++++++-- src/constants/urls.ts | 50 +++++++++++++++++++ src/core/classes/contract-events.ts | 4 +- src/core/classes/gas-cost-estimator.ts | 2 +- src/core/sdk.ts | 16 ++++-- 9 files changed, 88 insertions(+), 20 deletions(-) diff --git a/docs/sdk.contractevents.addeventlistener.md b/docs/sdk.contractevents.addeventlistener.md index 16e3b9055..fe99eb800 100644 --- a/docs/sdk.contractevents.addeventlistener.md +++ b/docs/sdk.contractevents.addeventlistener.md @@ -9,14 +9,14 @@ Subscribe to contract events Signature: ```typescript -addEventListener(eventName: keyof TContract["filters"] | string, listener: (event: Record) => void): void; +addEventListener(eventName: keyof TContract["filters"] | (string & {}), listener: (event: Record) => void): void; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| eventName | keyof TContract\["filters"\] \| string | the event name as defined in the contract | +| eventName | keyof TContract\["filters"\] \| (string & {}) | the event name as defined in the contract | | listener | (event: Record<string, any>) => void | the receiver that will be called on every new event | Returns: diff --git a/docs/sdk.contractevents.removeeventlistener.md b/docs/sdk.contractevents.removeeventlistener.md index 38f482053..fd63e4ec0 100644 --- a/docs/sdk.contractevents.removeeventlistener.md +++ b/docs/sdk.contractevents.removeeventlistener.md @@ -7,14 +7,14 @@ Signature: ```typescript -removeEventListener(eventName: keyof TContract["filters"] | string, listener: providers.Listener): void; +removeEventListener(eventName: keyof TContract["filters"] | (string & {}), listener: providers.Listener): void; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| eventName | keyof TContract\["filters"\] \| string | the event name as defined in the contract | +| eventName | keyof TContract\["filters"\] \| (string & {}) | the event name as defined in the contract | | listener | providers.Listener | the listener to unregister | Returns: diff --git a/docs/sdk.gascostestimator.gascostof.md b/docs/sdk.gascostestimator.gascostof.md index b59783073..fdcc849e7 100644 --- a/docs/sdk.gascostestimator.gascostof.md +++ b/docs/sdk.gascostestimator.gascostof.md @@ -9,14 +9,14 @@ Estimates the cost of gas in native token of the current chain Signature: ```typescript -gasCostOf(fn: keyof TContract["functions"] | string, args: Parameters | any[]): Promise; +gasCostOf(fn: keyof TContract["functions"] | (string & {}), args: Parameters | any[]): Promise; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| fn | keyof TContract\["functions"\] \| string | | +| fn | keyof TContract\["functions"\] \| (string & {}) | | | args | Parameters<TContract\["functions"\]\[typeof fn\]> \| any\[\] | | Returns: diff --git a/docs/sdk.thirdwebsdk._constructor_.md b/docs/sdk.thirdwebsdk._constructor_.md index 57164d9d3..3d89a9311 100644 --- a/docs/sdk.thirdwebsdk._constructor_.md +++ b/docs/sdk.thirdwebsdk._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `ThirdwebSDK` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, options?: SDKOptions, storage?: IStorage); +constructor(network: ChainOrRpc | SignerOrProvider, options?: SDKOptions, storage?: IStorage); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| network | ChainOrRpc \| [SignerOrProvider](./sdk.signerorprovider.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | | storage | [IStorage](./sdk.istorage.md) | (Optional) | diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 4d0783484..e8ddb2cb6 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -26,6 +26,7 @@ import type { Overrides } from 'ethers'; import type { PayableOverrides } from 'ethers'; import type { PopulatedTransaction } from 'ethers'; import type { Provider } from '@ethersproject/providers'; +import { Provider as Provider_2 } from '@ethersproject/abstract-provider'; import { providers } from 'ethers'; import type { Result } from '@ethersproject/abi'; import { Signer } from 'ethers'; @@ -205,6 +206,11 @@ export type ChainlinkInfo = { // @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) +export type ChainOrRpc = "mumbai" | "polygon" | "rinkeby" | "goerli" | "mainnet" | "fantom" | "avalanche" | `https://${string}`; + // Warning: (ae-incompatible-release-tags) The symbol "ClaimCondition" is marked as @public, but its signature references "ClaimConditionOutputSchema" which is marked as @internal // // @public @@ -590,11 +596,11 @@ export class ContractEncoder { // @public export class ContractEvents { constructor(contractWrapper: ContractWrapper); - addEventListener(eventName: keyof TContract["filters"] | string, listener: (event: Record) => void): void; + addEventListener(eventName: keyof TContract["filters"] | (string & {}), listener: (event: Record) => void): void; addTransactionListener(listener: ListenerFn): void; removeAllListeners(): void; // (undocumented) - removeEventListener(eventName: keyof TContract["filters"] | string, listener: providers.Listener): void; + removeEventListener(eventName: keyof TContract["filters"] | (string & {}), listener: providers.Listener): void; removeTransactionListener(listener: ListenerFn): void; } @@ -1820,7 +1826,7 @@ export class FunctionDeprecatedError extends Error { export class GasCostEstimator { constructor(contractWrapper: ContractWrapper); currentGasPriceInGwei(): Promise; - gasCostOf(fn: keyof TContract["functions"] | string, args: Parameters | any[]): Promise; + gasCostOf(fn: keyof TContract["functions"] | (string & {}), args: Parameters | any[]): Promise; } // @public @@ -1856,6 +1862,11 @@ export function getContractAddressByChainId(chainId: SUPPORTED_CHAIN_ID | ChainI // @public export function getNativeTokenByChainId(chainId: ChainId): NativeToken; +// Warning: (ae-internal-missing-underscore) The name "getProviderForNetwork" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export function getProviderForNetwork(network: ChainOrRpc | SignerOrProvider): `https://${string}` | Signer | Provider_2; + // Warning: (ae-internal-missing-underscore) The name "getRoleHash" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) @@ -4197,7 +4208,8 @@ export const SUPPORTED_CHAIN_IDS: SUPPORTED_CHAIN_ID[]; // @public export class ThirdwebSDK extends RPCConnectionHandler { - constructor(network: NetworkOrSignerOrProvider, options?: SDKOptions, storage?: IStorage); + // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal + constructor(network: ChainOrRpc | SignerOrProvider, options?: SDKOptions, storage?: IStorage); deployer: ContractDeployer; // @internal (undocumented) getBuiltInContract(address: string, contractType: TContractType): ContractForContractType; diff --git a/src/constants/urls.ts b/src/constants/urls.ts index 03f4b6038..de1b6f14f 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -1,3 +1,4 @@ +import { SignerOrProvider } from "../core/types"; /** * @internal */ @@ -18,3 +19,52 @@ export const TW_IPFS_SERVER_URL = "https://upload.nftlabs.co"; * @internal */ export const PINATA_IPFS_URL = `https://api.pinata.cloud/pinning/pinFileToIPFS`; + +/** + * @internal + */ +export type ChainOrRpc = + | "mumbai" + | "polygon" + | "rinkeby" + | "goerli" + | "mainnet" + | "fantom" + | "avalanche" + | `https://${string}`; + +/** + * @internal + * @param network - the chain name or rpc url + * @returns the rpc url for that chain + */ +export function getProviderForNetwork(network: ChainOrRpc | SignerOrProvider) { + if (typeof network !== "string") { + console.warn( + "Passing a signer or provider to the ThirdwebSDK is deprecated, use `sdk.wallet.connect()` instead.", + ); + return network; + } + switch (network) { + case "mumbai": + return "https://polygon-mumbai.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + case "rinkeby": + return "https://eth-rinkeby.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + case "goerli": + return "https://eth-goerli.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + case "polygon": + return "https://polygon-mainnet.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + case "mainnet": + return "https://eth-mainnet.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + case "fantom": + return "https://rpc.ftm.tools"; + case "avalanche": + return "https://rpc.ankr.com/avalanche"; + default: + if (network.startsWith("http")) { + return network; + } else { + throw new Error(`Unrecognized chain name or RPC url: ${network}`); + } + } +} diff --git a/src/core/classes/contract-events.ts b/src/core/classes/contract-events.ts index 26fd5c5b5..568ed8e39 100644 --- a/src/core/classes/contract-events.ts +++ b/src/core/classes/contract-events.ts @@ -55,7 +55,7 @@ export class ContractEvents { * @param listener - the receiver that will be called on every new event */ public addEventListener( - eventName: keyof TContract["filters"] | string, + eventName: keyof TContract["filters"] | (string & {}), listener: (event: Record) => void, ) { // validates event, throws error if not found @@ -91,7 +91,7 @@ export class ContractEvents { * @param listener - the listener to unregister */ public removeEventListener( - eventName: keyof TContract["filters"] | string, + eventName: keyof TContract["filters"] | (string & {}), listener: providers.Listener, ) { // validates event, throws error if not found diff --git a/src/core/classes/gas-cost-estimator.ts b/src/core/classes/gas-cost-estimator.ts index 345bd4f1b..4559cd485 100644 --- a/src/core/classes/gas-cost-estimator.ts +++ b/src/core/classes/gas-cost-estimator.ts @@ -17,7 +17,7 @@ export class GasCostEstimator { * @returns the estimated price in native currency (ETH, MATIC, etc) of calling this function */ public async gasCostOf( - fn: keyof TContract["functions"] | string, + fn: keyof TContract["functions"] | (string & {}), args: Parameters | any[], ): Promise { const price = await this.contractWrapper.getPreferredGasPrice(); diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 22d0b8349..86c450bbe 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -20,6 +20,7 @@ import type { ContractForContractType, ContractType, NetworkOrSignerOrProvider, + SignerOrProvider, ValidContractInstance, } from "./types"; import { IThirdwebContract__factory } from "contracts"; @@ -29,7 +30,11 @@ import invariant from "tiny-invariant"; import { TokenDrop } from "../contracts/token-drop"; import { ContractPublisher } from "./classes/contract-publisher"; import { ContractMetadata } from "./classes"; -import { getContractAddressByChainId } from "../constants"; +import { + ChainOrRpc, + getContractAddressByChainId, + getProviderForNetwork, +} from "../constants"; import { UserWallet } from "./wallet/UserWallet"; /** @@ -64,14 +69,15 @@ export class ThirdwebSDK extends RPCConnectionHandler { public wallet: UserWallet; constructor( - network: NetworkOrSignerOrProvider, + network: ChainOrRpc | SignerOrProvider, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ) { - super(network, options); + const rpc = getProviderForNetwork(network); + super(rpc, options); this.storage = storage; - this.deployer = new ContractDeployer(network, options, storage); - this.wallet = new UserWallet(network, options); + this.deployer = new ContractDeployer(rpc, options, storage); + this.wallet = new UserWallet(rpc, options); } /** From 665429fbe6c8814c429411608420dc07b09be075 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Wed, 18 May 2022 22:54:07 -0700 Subject: [PATCH 02/20] extract constant --- src/constants/urls.ts | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/constants/urls.ts b/src/constants/urls.ts index de1b6f14f..ebc4c9278 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -33,6 +33,12 @@ export type ChainOrRpc = | "avalanche" | `https://${string}`; +/** + * @internal + * This is a community API key that is subject to rate limiting. Please use your own key. + */ +const DEFAULT_API_KEY = "_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + /** * @internal * @param network - the chain name or rpc url @@ -47,15 +53,15 @@ export function getProviderForNetwork(network: ChainOrRpc | SignerOrProvider) { } switch (network) { case "mumbai": - return "https://polygon-mumbai.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + return `https://polygon-mumbai.g.alchemy.com/v2/${DEFAULT_API_KEY}`; case "rinkeby": - return "https://eth-rinkeby.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + return `https://eth-rinkeby.g.alchemy.com/v2/${DEFAULT_API_KEY}`; case "goerli": - return "https://eth-goerli.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + return `https://eth-goerli.g.alchemy.com/v2/${DEFAULT_API_KEY}`; case "polygon": - return "https://polygon-mainnet.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + return `https://polygon-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`; case "mainnet": - return "https://eth-mainnet.g.alchemy.com/v2/_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; + return `https://eth-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`; case "fantom": return "https://rpc.ftm.tools"; case "avalanche": From 483967fe65afecaa7b85e2ed7f0b8b6e1af24b2d Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Thu, 19 May 2022 00:19:57 -0700 Subject: [PATCH 03/20] WIP refactor to separate signer and providers --- package.json | 1 + src/constants/urls.ts | 57 ++++++++++-- src/contracts/marketplace.ts | 6 +- src/contracts/pack.ts | 13 ++- src/contracts/smart-contract.ts | 6 +- src/contracts/split.ts | 6 +- src/contracts/vote.ts | 6 +- src/core/classes/contract-deployer.ts | 32 ++++--- src/core/classes/contract-wrapper.ts | 37 +++++--- src/core/classes/erc-1155.ts | 6 +- src/core/classes/erc-20.ts | 16 +--- src/core/classes/erc-721.ts | 6 +- src/core/classes/registry.ts | 3 +- src/core/classes/rpc-connection-handler.ts | 100 ++------------------- src/core/interfaces/contract.ts | 4 +- src/core/sdk.ts | 50 +++++++---- src/core/wallet/UserWallet.ts | 43 ++++++--- yarn.lock | 5 ++ 18 files changed, 206 insertions(+), 191 deletions(-) diff --git a/package.json b/package.json index 820a1f31b..70be58afb 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "form-data": "^4.0.0", "keccak256": "^1.0.6", "merkletreejs": "^0.2.24", + "strict-event-emitter-types": "^2.0.0", "tiny-invariant": "^1.2.0", "uuid": "^8.3.2", "zod": "^3.11.6" diff --git a/src/constants/urls.ts b/src/constants/urls.ts index ebc4c9278..45f27a370 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -1,4 +1,5 @@ import { SignerOrProvider } from "../core/types"; +import { ethers, providers, Signer } from "ethers"; /** * @internal */ @@ -49,28 +50,66 @@ export function getProviderForNetwork(network: ChainOrRpc | SignerOrProvider) { console.warn( "Passing a signer or provider to the ThirdwebSDK is deprecated, use `sdk.wallet.connect()` instead.", ); - return network; + return Signer.isSigner(network) + ? network.provider || ethers.getDefaultProvider() + : network; } + let rpcUrl: string; switch (network) { case "mumbai": - return `https://polygon-mumbai.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + rpcUrl = `https://polygon-mumbai.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + break; case "rinkeby": - return `https://eth-rinkeby.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + rpcUrl = `https://eth-rinkeby.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + break; case "goerli": - return `https://eth-goerli.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + rpcUrl = `https://eth-goerli.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + break; case "polygon": - return `https://polygon-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + rpcUrl = `https://polygon-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + break; case "mainnet": - return `https://eth-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + rpcUrl = `https://eth-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`; + break; case "fantom": - return "https://rpc.ftm.tools"; + rpcUrl = "https://rpc.ftm.tools"; + break; case "avalanche": - return "https://rpc.ankr.com/avalanche"; + rpcUrl = "https://rpc.ankr.com/avalanche"; + break; default: if (network.startsWith("http")) { - return network; + rpcUrl = network; } else { throw new Error(`Unrecognized chain name or RPC url: ${network}`); } } + return getReadOnlyProvider(rpcUrl); +} + +/** + * @internal + * @param network + * @param chainId + */ +function getReadOnlyProvider(network: string, chainId?: number) { + try { + const match = network.match(/^(ws|http)s?:/i); + // try the JSON batch provider if available + if (match) { + switch (match[1]) { + case "http": + return new providers.JsonRpcBatchProvider(network, chainId); + case "ws": + return new providers.WebSocketProvider(network, chainId); + default: + return ethers.getDefaultProvider(network); + } + } else { + return ethers.getDefaultProvider(network); + } + } catch (e) { + // fallback to the default provider + return ethers.getDefaultProvider(network); + } } diff --git a/src/contracts/marketplace.ts b/src/contracts/marketplace.ts index e1f28d636..872180dc4 100644 --- a/src/contracts/marketplace.ts +++ b/src/contracts/marketplace.ts @@ -13,7 +13,7 @@ import { UpdateableNetwork } from "../core/interfaces/contract"; import { MarketplaceContractSchema } from "../schema/contracts/marketplace"; import { AuctionListing, DirectListing } from "../types/marketplace"; import { ListingType } from "../enums"; -import { BigNumber, BigNumberish, constants } from "ethers"; +import { BigNumber, BigNumberish, constants, Signer } from "ethers"; import invariant from "tiny-invariant"; import { ListingNotFoundError } from "../common"; import { MarketplaceFilter } from "../types/marketplace/MarketPlaceFilter"; @@ -181,8 +181,8 @@ export class Marketplace implements UpdateableNetwork { this.interceptor = new ContractInterceptor(this.contractWrapper); } - onNetworkUpdated(network: NetworkOrSignerOrProvider) { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 08fb4af49..75dcee5de 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -14,7 +14,14 @@ import { IERC1155, IERC20, 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 { + BigNumber, + BigNumberish, + BytesLike, + Contract, + ethers, + Signer, +} from "ethers"; import { fetchTokenMetadataForContract } from "../common/nft"; import { IPackBatchArgs, @@ -123,8 +130,8 @@ export class Pack implements UpdateableNetwork { this.interceptor = new ContractInterceptor(this.contractWrapper); } - onNetworkUpdated(network: NetworkOrSignerOrProvider) { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/contracts/smart-contract.ts b/src/contracts/smart-contract.ts index b162b4da4..d3816b09b 100644 --- a/src/contracts/smart-contract.ts +++ b/src/contracts/smart-contract.ts @@ -23,7 +23,7 @@ import { } from "contracts"; import { CustomContractSchema } from "../schema/contracts/custom"; import { UpdateableNetwork } from "../core/interfaces/contract"; -import { ContractInterface } from "ethers"; +import { ContractInterface, Signer } from "ethers"; import { ALL_ROLES, detectContractFeature } from "../common"; import { ContractPlatformFee } from "../core/classes/contract-platform-fee"; import { ContractPublishedMetadata } from "../core/classes/contract-published-metadata"; @@ -157,8 +157,8 @@ export class SmartContract< // this.sigmint = this.detectSigmint(); } - onNetworkUpdated(network: NetworkOrSignerOrProvider): void { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/contracts/split.ts b/src/contracts/split.ts index 124e9a21a..840eff708 100644 --- a/src/contracts/split.ts +++ b/src/contracts/split.ts @@ -12,7 +12,7 @@ import { ContractEncoder } from "../core/classes/contract-encoder"; import { SDKOptions } from "../schema/sdk-options"; import { CurrencyValue } from "../types/currency"; import { fetchCurrencyValue } from "../common/currency"; -import { BigNumber, Contract } from "ethers"; +import { BigNumber, Contract, Signer } from "ethers"; import { SplitRecipient } from "../types/SplitRecipient"; import { SplitsContractSchema } from "../schema/contracts/splits"; import { GasCostEstimator } from "../core/classes"; @@ -86,8 +86,8 @@ export class Split implements UpdateableNetwork { this.interceptor = new ContractInterceptor(this.contractWrapper); } - onNetworkUpdated(network: NetworkOrSignerOrProvider) { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/contracts/vote.ts b/src/contracts/vote.ts index b840d829a..1e340a333 100644 --- a/src/contracts/vote.ts +++ b/src/contracts/vote.ts @@ -17,7 +17,7 @@ import { VoteSettings, } from "../types/vote"; import { fetchCurrencyMetadata, fetchCurrencyValue } from "../common/currency"; -import { BigNumber, BigNumberish, Contract, ethers } from "ethers"; +import { BigNumber, BigNumberish, Contract, ethers, Signer } from "ethers"; import { VoteType } from "../enums"; import deepEqual from "deep-equal"; import { CurrencyValue } from "../types/currency"; @@ -95,8 +95,8 @@ export class Vote implements UpdateableNetwork { this.interceptor = new ContractInterceptor(this.contractWrapper); } - onNetworkUpdated(network: NetworkOrSignerOrProvider) { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/core/classes/contract-deployer.ts b/src/core/classes/contract-deployer.ts index 0e9c8f949..e05e8ff70 100644 --- a/src/core/classes/contract-deployer.ts +++ b/src/core/classes/contract-deployer.ts @@ -25,6 +25,8 @@ import { VoteContractDeployMetadata, } from "../../types/deploy/deploy-metadata"; import { TokenDrop } from "../../contracts/token-drop"; +import { Provider } from "@ethersproject/providers"; +import { Signer } from "ethers"; /** * Handles deploying new contracts @@ -42,13 +44,11 @@ export class ContractDeployer extends RPCConnectionHandler { */ private _registry: Promise | undefined; private storage: IStorage; + private options: SDKOptions; - constructor( - network: NetworkOrSignerOrProvider, - options: SDKOptions, - storage: IStorage, - ) { - super(network, options); + constructor(network: Provider, options: SDKOptions, storage: IStorage) { + super(network); + this.options = options; this.storage = storage; } @@ -241,19 +241,23 @@ export class ContractDeployer extends RPCConnectionHandler { })); } - public override updateSignerOrProvider(network: NetworkOrSignerOrProvider) { - super.updateSignerOrProvider(network); - this.updateContractSignerOrProvider(); + public override updateProvider(provider: Provider) { + super.updateProvider(provider); + this._factory?.then((factory) => { + factory.updateProvider(provider); + }); + this._registry?.then((registry) => { + registry.updateProvider(provider); + }); } - private updateContractSignerOrProvider() { - // has to be promises now + public override updateSigner(signer: Signer | undefined) { + super.updateSigner(signer); this._factory?.then((factory) => { - factory.updateSignerOrProvider(this.getSignerOrProvider()); + factory.updateSigner(signer); }); - // has to be promises now this._registry?.then((registry) => { - registry.updateSignerOrProvider(this.getSignerOrProvider()); + registry.updateSigner(signer); }); } } diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index bfc310901..105fafd5d 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -8,13 +8,17 @@ import { ContractTransaction, ethers, providers, + Signer, } from "ethers"; import { RPCConnectionHandler } from "./rpc-connection-handler"; -import { SDKOptions } from "../../schema/sdk-options"; +import { + SDKOptions, + SDKOptionsOutput, + SDKOptionsSchema, +} from "../../schema/sdk-options"; import { ForwardRequestMessage, GaslessTransaction, - NetworkOrSignerOrProvider, PermitRequestMessage, } from "../types"; import { EventType } from "../../constants/events"; @@ -32,6 +36,7 @@ import { getPolygonGasPriorityFee } from "../../common/gas-price"; import { ChainId } from "../../constants"; import { convertToTWError } from "../../common"; import { isBrowser } from "../../common/utils"; +import { Provider } from "@ethersproject/providers"; /** * @internal @@ -41,6 +46,7 @@ export class ContractWrapper< > extends RPCConnectionHandler { private isValidContract = false; private customOverrides: () => CallOverrides = () => ({}); + protected options: SDKOptionsOutput; /** * @internal */ @@ -49,12 +55,13 @@ export class ContractWrapper< public abi; constructor( - network: NetworkOrSignerOrProvider, + network: Provider, + signer: Signer | undefined, contractAddress: string, contractAbi: ContractInterface, options: SDKOptions, ) { - super(network, options); + super(network, signer); this.abi = contractAbi; // set up the contract this.writeContract = new Contract( @@ -66,21 +73,25 @@ export class ContractWrapper< this.readContract = this.writeContract.connect( this.getProvider(), ) as TContract; + + try { + this.options = SDKOptionsSchema.parse(options) || {}; + } catch (optionParseError) { + console.error( + "invalid sdk options object passed, falling back to default options", + optionParseError, + ); + this.options = SDKOptionsSchema.parse({}); + } } - public override updateSignerOrProvider( - network: NetworkOrSignerOrProvider, - ): void { + public override updateSigner(signer: Signer | undefined): void { // update the underlying base class - super.updateSignerOrProvider(network); + super.updateSigner(signer); // re-connect the contract with the new signer / provider this.writeContract = this.writeContract.connect( this.getSignerOrProvider(), ) as TContract; - // setup the read only contract - this.readContract = this.writeContract.connect( - this.getProvider(), - ) as TContract; } /** @@ -274,6 +285,8 @@ export class ContractWrapper< } } + // TODO: check if write and read contracts are on the same network + if (!callOverrides) { callOverrides = await this.getCallOverrides(); } diff --git a/src/core/classes/erc-1155.ts b/src/core/classes/erc-1155.ts index ce5ed48cd..0f72febce 100644 --- a/src/core/classes/erc-1155.ts +++ b/src/core/classes/erc-1155.ts @@ -5,7 +5,7 @@ import { IMintableERC1155, TokenERC1155, } from "contracts"; -import { BigNumber, BigNumberish, BytesLike } from "ethers"; +import { BigNumber, BigNumberish, BytesLike, Signer } from "ethers"; import { NFTMetadata } from "../../schema/tokens/common"; import { IStorage } from "../interfaces"; import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; @@ -70,8 +70,8 @@ export class Erc1155< /** * @internal */ - onNetworkUpdated(network: NetworkOrSignerOrProvider): void { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/core/classes/erc-20.ts b/src/core/classes/erc-20.ts index 67393a0f0..34196172d 100644 --- a/src/core/classes/erc-20.ts +++ b/src/core/classes/erc-20.ts @@ -1,6 +1,6 @@ import { ContractWrapper } from "./contract-wrapper"; import { DropERC20, IMintableERC20, TokenERC20 } from "contracts"; -import { BigNumber, BigNumberish, ethers } from "ethers"; +import { BigNumber, BigNumberish, ethers, Signer } from "ethers"; import { IStorage } from "../interfaces"; import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; import { UpdateableNetwork } from "../interfaces/contract"; @@ -48,23 +48,15 @@ export class Erc20 ) { this.contractWrapper = contractWrapper; this.storage = storage; - try { - this.options = SDKOptionsSchema.parse(options); - } catch (optionParseError) { - console.error( - "invalid contract options object passed, falling back to default options", - optionParseError, - ); - this.options = SDKOptionsSchema.parse({}); - } + this.options = options; this.mint = this.detectErc20Mintable(); } /** * @internal */ - onNetworkUpdated(network: NetworkOrSignerOrProvider): void { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/core/classes/erc-721.ts b/src/core/classes/erc-721.ts index 37689138b..4cc2e7c32 100644 --- a/src/core/classes/erc-721.ts +++ b/src/core/classes/erc-721.ts @@ -1,5 +1,5 @@ import { ContractWrapper } from "./contract-wrapper"; -import { BigNumber, BigNumberish, constants } from "ethers"; +import { BigNumber, BigNumberish, constants, Signer } from "ethers"; import { NFTMetadata, NFTMetadataOwner } from "../../schema/tokens/common"; import { IStorage } from "../interfaces"; import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; @@ -64,8 +64,8 @@ export class Erc721< /** * @internal */ - onNetworkUpdated(network: NetworkOrSignerOrProvider): void { - this.contractWrapper.updateSignerOrProvider(network); + onSignerUpdated(signer: Signer | undefined): void { + this.contractWrapper.updateSigner(signer); } getAddress(): string { diff --git a/src/core/classes/registry.ts b/src/core/classes/registry.ts index 6c20383f7..dda8636c6 100644 --- a/src/core/classes/registry.ts +++ b/src/core/classes/registry.ts @@ -4,6 +4,7 @@ import { NetworkOrSignerOrProvider } from "../types"; import { ContractWrapper } from "./contract-wrapper"; import { constants, utils } from "ethers"; import { TransactionResult } from ".."; +import { Provider } from "@ethersproject/providers"; /** * @internal @@ -14,7 +15,7 @@ export class ContractRegistry extends ContractWrapper { constructor( registryAddress: string, byocRegistryAddress: string, - network: NetworkOrSignerOrProvider, + network: Provider, options?: SDKOptions, ) { super(network, registryAddress, TWRegistry__factory.abi, options); diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 2e2a39d7f..79a5c3e79 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -5,7 +5,9 @@ import { SDKOptionsOutput, SDKOptionsSchema, } from "../../schema/sdk-options"; -import { NetworkOrSignerOrProvider } from "../types"; +import { NetworkOrSignerOrProvider, SignerOrProvider } from "../types"; +import { ChainOrRpc } from "../../constants"; +import { Provider } from "@ethersproject/providers"; /** * @internal @@ -13,34 +15,24 @@ import { NetworkOrSignerOrProvider } from "../types"; export class RPCConnectionHandler extends EventEmitter2 { private provider: providers.Provider; private signer: Signer | undefined; - protected readonly options: SDKOptionsOutput; - constructor(network: NetworkOrSignerOrProvider, options: SDKOptions) { + constructor(provider: Provider, signer?: Signer) { super(); - const [signer, provider] = this.getSignerAndProvider(network, options); this.signer = signer; this.provider = provider; - - try { - this.options = SDKOptionsSchema.parse(options); - } catch (optionParseError) { - console.error( - "invalid sdk options object passed, falling back to default options", - optionParseError, - ); - this.options = SDKOptionsSchema.parse({}); - } } /** * The function to call whenever the network changes, such as when the users connects their wallet, disconnects their wallet, the connected chain changes, etc. * * @param network - a network, signer or provider that ethers js can interpret */ - public updateSignerOrProvider(network: NetworkOrSignerOrProvider) { - const [signer, provider] = this.getSignerAndProvider(network, this.options); - this.signer = signer; + public updateProvider(provider: Provider) { this.provider = provider; } + + public updateSigner(signer: Signer | undefined) { + this.signer = signer; + } /** * * @returns whether or not a signer is set, `true` if there is no signer so the class is in "read only" mode @@ -72,78 +64,4 @@ export class RPCConnectionHandler extends EventEmitter2 { public getSignerOrProvider(): Signer | providers.Provider { return this.getSigner() || this.getProvider(); } - - /** ******************** - * PRIVATE FUNCTIONS - *********************/ - - private getSignerAndProvider( - network: NetworkOrSignerOrProvider, - options: SDKOptions, - ): [Signer | undefined, providers.Provider] { - let signer: Signer | undefined; - let provider: providers.Provider | undefined; - - if (Signer.isSigner(network)) { - signer = network; - if (network.provider) { - provider = network.provider; - } - } - - if (options?.readonlySettings) { - provider = this.getReadOnlyProvider( - options.readonlySettings.rpcUrl, - options.readonlySettings.chainId, - ); - } - - if (!provider) { - if (providers.Provider.isProvider(network)) { - provider = network; - } else if (!Signer.isSigner(network)) { - if (typeof network === "string") { - provider = this.getReadOnlyProvider( - network, - options?.readonlySettings?.chainId, - ); - } else { - // no a signer, not a provider, not a string? try with default provider - provider = ethers.getDefaultProvider(network); - } - } - } - - if (!provider) { - // we should really never hit this case! - provider = ethers.getDefaultProvider(); - console.error( - "No provider found, using default provider on default chain!", - ); - } - - return [signer, provider]; - } - - private getReadOnlyProvider(network: string, chainId?: number) { - try { - const match = network.match(/^(ws|http)s?:/i); - // try the JSON batch provider if available - if (match) { - switch (match[1]) { - case "http": - return new providers.JsonRpcBatchProvider(network, chainId); - case "ws": - return new providers.WebSocketProvider(network, chainId); - default: - return ethers.getDefaultProvider(network); - } - } else { - return ethers.getDefaultProvider(network); - } - } catch (e) { - // fallback to the default provider - return ethers.getDefaultProvider(network); - } - } } diff --git a/src/core/interfaces/contract.ts b/src/core/interfaces/contract.ts index 143372e55..8653621f3 100644 --- a/src/core/interfaces/contract.ts +++ b/src/core/interfaces/contract.ts @@ -1,9 +1,9 @@ -import { NetworkOrSignerOrProvider } from "../types"; +import { Signer } from "ethers"; /** * @public */ export interface UpdateableNetwork { - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; getAddress(): string; } diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 86c450bbe..1c151bc19 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -13,13 +13,16 @@ import { Token, Vote, } from "../contracts"; -import { SDKOptions } from "../schema/sdk-options"; +import { + SDKOptions, + SDKOptionsOutput, + SDKOptionsSchema, +} from "../schema/sdk-options"; import { IpfsStorage } from "./classes/ipfs-storage"; import { RPCConnectionHandler } from "./classes/rpc-connection-handler"; import type { ContractForContractType, ContractType, - NetworkOrSignerOrProvider, SignerOrProvider, ValidContractInstance, } from "./types"; @@ -36,12 +39,14 @@ import { getProviderForNetwork, } from "../constants"; import { UserWallet } from "./wallet/UserWallet"; +import { Provider } from "@ethersproject/providers"; /** * The main entry point for the thirdweb SDK * @public */ export class ThirdwebSDK extends RPCConnectionHandler { + private options: SDKOptionsOutput; /** * @internal * the cache of contracts that we have already seen @@ -74,10 +79,22 @@ export class ThirdwebSDK extends RPCConnectionHandler { storage: IStorage = new IpfsStorage(), ) { const rpc = getProviderForNetwork(network); - super(rpc, options); + super(rpc); this.storage = storage; this.deployer = new ContractDeployer(rpc, options, storage); this.wallet = new UserWallet(rpc, options); + this.wallet.events.on("connected", (signer) => { + this.updateSigner(signer); + }); + try { + this.options = SDKOptionsSchema.parse(options); + } catch (optionParseError) { + console.error( + "invalid contract options object passed, falling back to default options", + optionParseError, + ); + this.options = SDKOptionsSchema.parse({}); + } } /** @@ -212,7 +229,13 @@ export class ThirdwebSDK extends RPCConnectionHandler { const newContract = new KNOWN_CONTRACTS_MAP[ contractType as keyof typeof KNOWN_CONTRACTS_MAP - ](this.getSignerOrProvider(), address, this.storage, this.options); + ]( + this.getProvider(), + this.getSigner(), + address, + this.storage, + this.options, + ); this.contractCache.set(address, newContract); @@ -298,17 +321,14 @@ export class ThirdwebSDK extends RPCConnectionHandler { * Update the active signer or provider for all contracts * @param network - the new signer or provider */ - public override updateSignerOrProvider(network: NetworkOrSignerOrProvider) { - super.updateSignerOrProvider(network); - this.updateContractSignerOrProvider(); - } - - private updateContractSignerOrProvider() { - this.wallet.onNetworkUpdated(this.getSignerOrProvider()); - this.deployer.updateSignerOrProvider(this.getSignerOrProvider()); - this._publisher?.then((publisher) => { - publisher.updateSignerOrProvider(this.getSignerOrProvider()); - }); + public switchChain(network: ChainOrRpc | Provider) { + const provider = getProviderForNetwork(network); + super.updateProvider(provider); + // TODO FIXME do these + // this.deployer.updateSignerOrProvider(this.getSignerOrProvider()); + // this._publisher?.then((publisher) => { + // publisher.updateSignerOrProvider(this.getSignerOrProvider()); + // }); for (const [, contract] of this.contractCache) { contract.onNetworkUpdated(this.getSignerOrProvider()); } diff --git a/src/core/wallet/UserWallet.ts b/src/core/wallet/UserWallet.ts index db163ecc6..22ec53859 100644 --- a/src/core/wallet/UserWallet.ts +++ b/src/core/wallet/UserWallet.ts @@ -12,7 +12,15 @@ import { NATIVE_TOKEN_ADDRESS } from "../../constants"; import ERC20Abi from "../../../abis/IERC20.json"; import { ContractWrapper } from "../classes/contract-wrapper"; import { IERC20 } from "contracts"; -import { BigNumber, providers } from "ethers"; +import { BigNumber, providers, Signer } from "ethers"; +import { EventEmitter2 } from "eventemitter2"; +import StrictEventEmitter from "strict-event-emitter-types"; +import { Provider } from "@ethersproject/providers"; + +interface WalletEvent { + connected: Signer; + disconnected: void; +} /** * Connect and Interact with a user wallet @@ -23,11 +31,15 @@ import { BigNumber, providers } from "ethers"; * @public */ export class UserWallet { - private connection: RPCConnectionHandler; + private readOnlyProvider: RPCConnectionHandler; + private signer: Signer | undefined; private options: SDKOptions; - constructor(network: NetworkOrSignerOrProvider, options: SDKOptions) { - this.connection = new RPCConnectionHandler(network, options); + public events: StrictEventEmitter = + new EventEmitter2(); + + constructor(network: Provider, options: SDKOptions) { + this.readOnlyProvider = new RPCConnectionHandler(network); this.options = options; } @@ -38,9 +50,14 @@ export class UserWallet { // TODO tokens() // TODO NFTs() - // TODO this will become the source of truth of the signer and have every contract read from it - onNetworkUpdated(network: NetworkOrSignerOrProvider): void { - this.connection.updateSignerOrProvider(network); + connect(signer: Signer) { + this.signer = signer; + this.events.emit("connected", signer); + } + + disconnect() { + this.signer = undefined; + this.events.emit("disconnected"); } /** @@ -63,7 +80,7 @@ export class UserWallet { ): Promise { const signer = await this.connectedWallet(); const amountInWei = await normalizePriceValue( - this.connection.getProvider(), + this.readOnlyProvider.getProvider(), amount, currencyAddress, ); @@ -103,18 +120,16 @@ export class UserWallet { async balance( currencyAddress = NATIVE_TOKEN_ADDRESS, ): Promise { - const signer = this.connection.getSigner(); - invariant(signer, "Wallet not connected"); let balance: BigNumber; if (isNativeToken(currencyAddress)) { - balance = await signer.getBalance(); + balance = await this.connectedWallet().getBalance(); } else { balance = await this.createErc20(currencyAddress).readContract.balanceOf( await this.address(), ); } return await fetchCurrencyValue( - this.connection.getProvider(), + this.readOnlyProvider.getProvider(), currencyAddress, balance, ); @@ -159,14 +174,14 @@ export class UserWallet { * ***********************/ private connectedWallet() { - const signer = this.connection.getSigner(); + const signer = this.signer; invariant(signer, "Wallet not connected"); return signer; } private createErc20(currencyAddress: string) { return new ContractWrapper( - this.connection.getSignerOrProvider(), + this.readOnlyProvider.getProvider(), currencyAddress, ERC20Abi, this.options, diff --git a/yarn.lock b/yarn.lock index cec33ea10..c44efb1a9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4353,6 +4353,11 @@ statuses@2.0.1: resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +strict-event-emitter-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f" + integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA== + string-argv@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" From 1beebba2af8af0086c16680e47db223ea36d6556 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 17 Jun 2022 14:48:29 -0700 Subject: [PATCH 04/20] it compiles - testing time --- docs/sdk.chainnametoid.md | 11 ++ docs/sdk.connectioninfo.md | 15 +++ docs/sdk.contractdeployer._constructor_.md | 4 +- docs/sdk.contractdeployer.md | 4 +- docs/sdk.contractdeployer.updatesigner.md | 22 +++ ...contractdeployer.updatesignerorprovider.md | 22 --- docs/sdk.defaultrpcmap.md | 11 ++ docs/sdk.edition._constructor_.md | 4 +- docs/sdk.edition.md | 2 +- docs/sdk.editiondrop._constructor_.md | 4 +- docs/sdk.editiondrop.md | 2 +- docs/sdk.marketplace._constructor_.md | 4 +- docs/sdk.marketplace.md | 4 +- docs/sdk.marketplace.onnetworkupdated.md | 22 --- docs/sdk.marketplace.onsignerupdated.md | 22 +++ docs/sdk.md | 3 + docs/sdk.multiwrap._constructor_.md | 4 +- docs/sdk.multiwrap.md | 2 +- docs/sdk.nftcollection._constructor_.md | 4 +- docs/sdk.nftcollection.md | 2 +- docs/sdk.nftdrop._constructor_.md | 4 +- docs/sdk.nftdrop.md | 2 +- docs/sdk.pack._constructor_.md | 4 +- docs/sdk.pack.md | 2 +- docs/sdk.smartcontract._constructor_.md | 4 +- docs/sdk.smartcontract.md | 4 +- ...d => sdk.smartcontract.onsignerupdated.md} | 8 +- docs/sdk.split._constructor_.md | 4 +- docs/sdk.split.md | 4 +- ...pdated.md => sdk.split.onsignerupdated.md} | 8 +- docs/sdk.thirdwebsdk._constructor_.md | 5 +- docs/sdk.thirdwebsdk.fromprivatekey.md | 2 +- docs/sdk.thirdwebsdk.fromsigner.md | 6 +- docs/sdk.thirdwebsdk.md | 3 +- .../sdk.thirdwebsdk.updatesignerorprovider.md | 24 ---- docs/sdk.token._constructor_.md | 4 +- docs/sdk.token.md | 2 +- docs/sdk.tokendrop._constructor_.md | 4 +- docs/sdk.tokendrop.md | 2 +- docs/sdk.userwallet._constructor_.md | 4 +- docs/sdk.userwallet.connect.md | 22 +++ docs/sdk.userwallet.disconnect.md | 15 +++ docs/sdk.userwallet.events.md | 11 ++ docs/sdk.userwallet.md | 11 +- docs/sdk.userwallet.onnetworkupdated.md | 22 --- docs/sdk.vote._constructor_.md | 4 +- docs/sdk.vote.md | 4 +- ...updated.md => sdk.vote.onsignerupdated.md} | 8 +- etc/sdk.api.md | 104 +++++++++------ package.json | 2 + src/common/currency.ts | 11 +- src/common/marketplace.ts | 12 +- src/constants/addresses.ts | 4 +- src/constants/urls.ts | 6 +- src/contracts/edition-drop.ts | 6 +- src/contracts/edition.ts | 6 +- src/contracts/marketplace.ts | 6 +- src/contracts/multiwrap.ts | 6 +- src/contracts/nft-collection.ts | 11 +- src/contracts/nft-drop.ts | 6 +- src/contracts/pack.ts | 9 +- src/contracts/signature-drop.ts | 6 +- src/contracts/smart-contract.ts | 8 +- src/contracts/split.ts | 6 +- src/contracts/token-drop.ts | 6 +- src/contracts/token.ts | 10 +- src/contracts/vote.ts | 6 +- src/core/classes/contract-analytics.ts | 22 +-- src/core/classes/contract-deployer.ts | 29 ++-- src/core/classes/contract-publisher.ts | 17 ++- src/core/classes/contract-wrapper.ts | 7 +- src/core/classes/drop-claim-conditions.ts | 2 +- .../classes/drop-erc1155-claim-conditions.ts | 2 +- .../classes/drop-single-claim-conditions.ts | 2 +- src/core/classes/erc-1155.ts | 4 +- src/core/classes/erc-20.ts | 4 +- src/core/classes/erc-721.ts | 2 +- src/core/classes/factory.ts | 11 +- src/core/classes/marketplace-auction.ts | 2 +- src/core/classes/marketplace-direct.ts | 2 +- src/core/classes/registry.ts | 7 +- src/core/classes/rpc-connection-handler.ts | 47 ++++--- src/core/sdk.ts | 126 ++++++------------ src/core/types.ts | 7 + src/core/wallet/UserWallet.ts | 10 +- test/before-setup.ts | 3 +- test/edition.test.ts | 2 +- yarn.lock | 10 ++ 88 files changed, 460 insertions(+), 454 deletions(-) create mode 100644 docs/sdk.chainnametoid.md create mode 100644 docs/sdk.connectioninfo.md create mode 100644 docs/sdk.contractdeployer.updatesigner.md delete mode 100644 docs/sdk.contractdeployer.updatesignerorprovider.md create mode 100644 docs/sdk.defaultrpcmap.md delete mode 100644 docs/sdk.marketplace.onnetworkupdated.md create mode 100644 docs/sdk.marketplace.onsignerupdated.md rename docs/{sdk.smartcontract.onnetworkupdated.md => sdk.smartcontract.onsignerupdated.md} (58%) rename docs/{sdk.split.onnetworkupdated.md => sdk.split.onsignerupdated.md} (50%) delete mode 100644 docs/sdk.thirdwebsdk.updatesignerorprovider.md create mode 100644 docs/sdk.userwallet.connect.md create mode 100644 docs/sdk.userwallet.disconnect.md create mode 100644 docs/sdk.userwallet.events.md delete mode 100644 docs/sdk.userwallet.onnetworkupdated.md rename docs/{sdk.vote.onnetworkupdated.md => sdk.vote.onsignerupdated.md} (50%) diff --git a/docs/sdk.chainnametoid.md b/docs/sdk.chainnametoid.md new file mode 100644 index 000000000..f9a881803 --- /dev/null +++ b/docs/sdk.chainnametoid.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [chainNameToId](./sdk.chainnametoid.md) + +## chainNameToId variable + +Signature: + +```typescript +chainNameToId: Record +``` diff --git a/docs/sdk.connectioninfo.md b/docs/sdk.connectioninfo.md new file mode 100644 index 000000000..60dbfa03a --- /dev/null +++ b/docs/sdk.connectioninfo.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ConnectionInfo](./sdk.connectioninfo.md) + +## ConnectionInfo type + +Signature: + +```typescript +export declare type ConnectionInfo = { + chainId: ChainOrRpc; + signer: Signer | undefined; + provider?: providers.Provider; +}; +``` diff --git a/docs/sdk.contractdeployer._constructor_.md b/docs/sdk.contractdeployer._constructor_.md index 16847269c..f2ef5dfac 100644 --- a/docs/sdk.contractdeployer._constructor_.md +++ b/docs/sdk.contractdeployer._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `ContractDeployer` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, options: SDKOptions, storage: IStorage); +constructor(connection: ConnectionInfo, options: SDKOptions, storage: IStorage); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | | | storage | [IStorage](./sdk.istorage.md) | | diff --git a/docs/sdk.contractdeployer.md b/docs/sdk.contractdeployer.md index 1bc017d75..e21c7e00d 100644 --- a/docs/sdk.contractdeployer.md +++ b/docs/sdk.contractdeployer.md @@ -17,7 +17,7 @@ export declare class ContractDeployer extends RPCConnectionHandler | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, options, storage)](./sdk.contractdeployer._constructor_.md) | | Constructs a new instance of the ContractDeployer class | +| [(constructor)(connection, options, storage)](./sdk.contractdeployer._constructor_.md) | | Constructs a new instance of the ContractDeployer class | ## Methods @@ -34,5 +34,5 @@ export declare class ContractDeployer extends RPCConnectionHandler | [deployToken(metadata)](./sdk.contractdeployer.deploytoken.md) | | Deploys a new Token contract | | [deployTokenDrop(metadata)](./sdk.contractdeployer.deploytokendrop.md) | | Deploys a new Token Drop contract | | [deployVote(metadata)](./sdk.contractdeployer.deployvote.md) | | Deploys a new Vote contract | -| [updateSignerOrProvider(network)](./sdk.contractdeployer.updatesignerorprovider.md) | | | +| [updateSigner(signer)](./sdk.contractdeployer.updatesigner.md) | | | diff --git a/docs/sdk.contractdeployer.updatesigner.md b/docs/sdk.contractdeployer.updatesigner.md new file mode 100644 index 000000000..face5c08a --- /dev/null +++ b/docs/sdk.contractdeployer.updatesigner.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ContractDeployer](./sdk.contractdeployer.md) > [updateSigner](./sdk.contractdeployer.updatesigner.md) + +## ContractDeployer.updateSigner() method + +Signature: + +```typescript +updateSigner(signer: Signer | undefined): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| signer | Signer \| undefined | | + +Returns: + +void + diff --git a/docs/sdk.contractdeployer.updatesignerorprovider.md b/docs/sdk.contractdeployer.updatesignerorprovider.md deleted file mode 100644 index c3ba79cba..000000000 --- a/docs/sdk.contractdeployer.updatesignerorprovider.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ContractDeployer](./sdk.contractdeployer.md) > [updateSignerOrProvider](./sdk.contractdeployer.updatesignerorprovider.md) - -## ContractDeployer.updateSignerOrProvider() method - -Signature: - -```typescript -updateSignerOrProvider(network: NetworkOrSignerOrProvider): void; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | - -Returns: - -void - diff --git a/docs/sdk.defaultrpcmap.md b/docs/sdk.defaultrpcmap.md new file mode 100644 index 000000000..87724d0fd --- /dev/null +++ b/docs/sdk.defaultrpcmap.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [defaultRPCMap](./sdk.defaultrpcmap.md) + +## defaultRPCMap variable + +Signature: + +```typescript +defaultRPCMap: Record +``` diff --git a/docs/sdk.edition._constructor_.md b/docs/sdk.edition._constructor_.md index fa7fc89a7..a07466668 100644 --- a/docs/sdk.edition._constructor_.md +++ b/docs/sdk.edition._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `Edition` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.edition.md b/docs/sdk.edition.md index 6557a552b..0766bff5c 100644 --- a/docs/sdk.edition.md +++ b/docs/sdk.edition.md @@ -27,7 +27,7 @@ const contract = sdk.getEdition("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.edition._constructor_.md) | | Constructs a new instance of the Edition class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.edition._constructor_.md) | | Constructs a new instance of the Edition class | ## Properties diff --git a/docs/sdk.editiondrop._constructor_.md b/docs/sdk.editiondrop._constructor_.md index 555d0b988..ce7a46b55 100644 --- a/docs/sdk.editiondrop._constructor_.md +++ b/docs/sdk.editiondrop._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `EditionDrop` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.editiondrop.md b/docs/sdk.editiondrop.md index c16da8d01..9afe1866a 100644 --- a/docs/sdk.editiondrop.md +++ b/docs/sdk.editiondrop.md @@ -27,7 +27,7 @@ const contract = sdk.getEditionDrop("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.editiondrop._constructor_.md) | | Constructs a new instance of the EditionDrop class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.editiondrop._constructor_.md) | | Constructs a new instance of the EditionDrop class | ## Properties diff --git a/docs/sdk.marketplace._constructor_.md b/docs/sdk.marketplace._constructor_.md index 850aa76a3..9005cc01c 100644 --- a/docs/sdk.marketplace._constructor_.md +++ b/docs/sdk.marketplace._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `Marketplace` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.marketplace.md b/docs/sdk.marketplace.md index 884b44f9c..85052da94 100644 --- a/docs/sdk.marketplace.md +++ b/docs/sdk.marketplace.md @@ -27,7 +27,7 @@ const contract = sdk.getMarketplace("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.marketplace._constructor_.md) | | Constructs a new instance of the Marketplace class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.marketplace._constructor_.md) | | Constructs a new instance of the Marketplace class | ## Properties @@ -60,7 +60,7 @@ const contract = sdk.getMarketplace("{{contract_address}}"); | [getTimeBufferInSeconds()](./sdk.marketplace.gettimebufferinseconds.md) | | get the buffer time in seconds between offers | | [getTotalCount()](./sdk.marketplace.gettotalcount.md) | | Get the total number of Listings | | [isRestrictedToListerRoleOnly()](./sdk.marketplace.isrestrictedtolisterroleonly.md) | | Get whether listing is restricted only to addresses with the Lister role | -| [onNetworkUpdated(network)](./sdk.marketplace.onnetworkupdated.md) | | | +| [onSignerUpdated(signer)](./sdk.marketplace.onsignerupdated.md) | | | | [setBidBufferBps(bufferBps)](./sdk.marketplace.setbidbufferbps.md) | | Set the Auction bid buffer | | [setTimeBufferInSeconds(bufferInSeconds)](./sdk.marketplace.settimebufferinseconds.md) | | Set the Auction Time buffer: | diff --git a/docs/sdk.marketplace.onnetworkupdated.md b/docs/sdk.marketplace.onnetworkupdated.md deleted file mode 100644 index fbca7e58f..000000000 --- a/docs/sdk.marketplace.onnetworkupdated.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Marketplace](./sdk.marketplace.md) > [onNetworkUpdated](./sdk.marketplace.onnetworkupdated.md) - -## Marketplace.onNetworkUpdated() method - -Signature: - -```typescript -onNetworkUpdated(network: NetworkOrSignerOrProvider): void; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | - -Returns: - -void - diff --git a/docs/sdk.marketplace.onsignerupdated.md b/docs/sdk.marketplace.onsignerupdated.md new file mode 100644 index 000000000..243919295 --- /dev/null +++ b/docs/sdk.marketplace.onsignerupdated.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Marketplace](./sdk.marketplace.md) > [onSignerUpdated](./sdk.marketplace.onsignerupdated.md) + +## Marketplace.onSignerUpdated() method + +Signature: + +```typescript +onSignerUpdated(signer: Signer | undefined): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| signer | Signer \| undefined | | + +Returns: + +void + diff --git a/docs/sdk.md b/docs/sdk.md index a1c2b91d8..b8b731517 100644 --- a/docs/sdk.md +++ b/docs/sdk.md @@ -110,6 +110,8 @@ | Variable | Description | | --- | --- | | [ALL\_ROLES](./sdk.all_roles.md) | | +| [chainNameToId](./sdk.chainnametoid.md) | | +| [defaultRPCMap](./sdk.defaultrpcmap.md) | | | [MintRequest1155](./sdk.mintrequest1155.md) | | | [MintRequest20](./sdk.mintrequest20.md) | | | [MintRequest721](./sdk.mintrequest721.md) | | @@ -129,6 +131,7 @@ | [ClaimCondition](./sdk.claimcondition.md) | Represents a claim condition fetched from the SDK | | [ClaimConditionInput](./sdk.claimconditioninput.md) | Input model to create a claim condition with optional snapshot of wallets | | [ClaimVerification](./sdk.claimverification.md) | | +| [ConnectionInfo](./sdk.connectioninfo.md) | | | [ContractEvent](./sdk.contractevent.md) | | | [ContractForContractType](./sdk.contractforcontracttype.md) | | | [ContractType](./sdk.contracttype.md) | | diff --git a/docs/sdk.multiwrap._constructor_.md b/docs/sdk.multiwrap._constructor_.md index a17677339..f95efce18 100644 --- a/docs/sdk.multiwrap._constructor_.md +++ b/docs/sdk.multiwrap._constructor_.md @@ -12,14 +12,14 @@ Constructs a new instance of the `Multiwrap` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.multiwrap.md b/docs/sdk.multiwrap.md index 9b95c325a..085266364 100644 --- a/docs/sdk.multiwrap.md +++ b/docs/sdk.multiwrap.md @@ -30,7 +30,7 @@ const contract = sdk.getMultiwrap("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.multiwrap._constructor_.md) | | (BETA) Constructs a new instance of the Multiwrap class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.multiwrap._constructor_.md) | | (BETA) Constructs a new instance of the Multiwrap class | ## Properties diff --git a/docs/sdk.nftcollection._constructor_.md b/docs/sdk.nftcollection._constructor_.md index 9425c38a7..aae702454 100644 --- a/docs/sdk.nftcollection._constructor_.md +++ b/docs/sdk.nftcollection._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `NFTCollection` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.nftcollection.md b/docs/sdk.nftcollection.md index 6fa85bf54..0cce63fbf 100644 --- a/docs/sdk.nftcollection.md +++ b/docs/sdk.nftcollection.md @@ -27,7 +27,7 @@ const contract = sdk.getNFTCollection("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.nftcollection._constructor_.md) | | Constructs a new instance of the NFTCollection class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.nftcollection._constructor_.md) | | Constructs a new instance of the NFTCollection class | ## Properties diff --git a/docs/sdk.nftdrop._constructor_.md b/docs/sdk.nftdrop._constructor_.md index de6d994fe..3395eff58 100644 --- a/docs/sdk.nftdrop._constructor_.md +++ b/docs/sdk.nftdrop._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `NFTDrop` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.nftdrop.md b/docs/sdk.nftdrop.md index 38e96f793..1d6512e85 100644 --- a/docs/sdk.nftdrop.md +++ b/docs/sdk.nftdrop.md @@ -27,7 +27,7 @@ const contract = sdk.getNFTDrop("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.nftdrop._constructor_.md) | | Constructs a new instance of the NFTDrop class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.nftdrop._constructor_.md) | | Constructs a new instance of the NFTDrop class | ## Properties diff --git a/docs/sdk.pack._constructor_.md b/docs/sdk.pack._constructor_.md index cc7698545..b09e91819 100644 --- a/docs/sdk.pack._constructor_.md +++ b/docs/sdk.pack._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `Pack` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.pack.md b/docs/sdk.pack.md index cf70dd4fc..33cbfac41 100644 --- a/docs/sdk.pack.md +++ b/docs/sdk.pack.md @@ -27,7 +27,7 @@ const contract = sdk.getPack("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.pack._constructor_.md) | | Constructs a new instance of the Pack class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.pack._constructor_.md) | | Constructs a new instance of the Pack class | ## Properties diff --git a/docs/sdk.smartcontract._constructor_.md b/docs/sdk.smartcontract._constructor_.md index 9157cdf11..cd8a1c6ab 100644 --- a/docs/sdk.smartcontract._constructor_.md +++ b/docs/sdk.smartcontract._constructor_.md @@ -12,14 +12,14 @@ Constructs a new instance of the `SmartContract` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, abi: ContractInterface, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, abi: ContractInterface, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | abi | ContractInterface | | | storage | [IStorage](./sdk.istorage.md) | | diff --git a/docs/sdk.smartcontract.md b/docs/sdk.smartcontract.md index 8ad89ce93..f35d226ef 100644 --- a/docs/sdk.smartcontract.md +++ b/docs/sdk.smartcontract.md @@ -42,7 +42,7 @@ const tx = await contract.nft.mint.to("0x...", { | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, abi, storage, options, contractWrapper)](./sdk.smartcontract._constructor_.md) | | (BETA) Constructs a new instance of the SmartContract class | +| [(constructor)(connection, address, abi, storage, options, contractWrapper)](./sdk.smartcontract._constructor_.md) | | (BETA) Constructs a new instance of the SmartContract class | ## Properties @@ -68,5 +68,5 @@ const tx = await contract.nft.mint.to("0x...", { | --- | --- | --- | | [call(functionName, args)](./sdk.smartcontract.call.md) | | (BETA) Call any function on this contract | | [getAddress()](./sdk.smartcontract.getaddress.md) | | (BETA) | -| [onNetworkUpdated(network)](./sdk.smartcontract.onnetworkupdated.md) | | (BETA) | +| [onSignerUpdated(signer)](./sdk.smartcontract.onsignerupdated.md) | | (BETA) | diff --git a/docs/sdk.smartcontract.onnetworkupdated.md b/docs/sdk.smartcontract.onsignerupdated.md similarity index 58% rename from docs/sdk.smartcontract.onnetworkupdated.md rename to docs/sdk.smartcontract.onsignerupdated.md index 79958e693..18ae22228 100644 --- a/docs/sdk.smartcontract.onnetworkupdated.md +++ b/docs/sdk.smartcontract.onsignerupdated.md @@ -1,8 +1,8 @@ -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [SmartContract](./sdk.smartcontract.md) > [onNetworkUpdated](./sdk.smartcontract.onnetworkupdated.md) +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [SmartContract](./sdk.smartcontract.md) > [onSignerUpdated](./sdk.smartcontract.onsignerupdated.md) -## SmartContract.onNetworkUpdated() method +## SmartContract.onSignerUpdated() method > 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. > @@ -10,14 +10,14 @@ Signature: ```typescript -onNetworkUpdated(network: NetworkOrSignerOrProvider): void; +onSignerUpdated(signer: Signer | undefined): void; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| signer | Signer \| undefined | | Returns: diff --git a/docs/sdk.split._constructor_.md b/docs/sdk.split._constructor_.md index 52f2e42fa..cb1f5f1a1 100644 --- a/docs/sdk.split._constructor_.md +++ b/docs/sdk.split._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `Split` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.split.md b/docs/sdk.split.md index c92678df7..48f6551ef 100644 --- a/docs/sdk.split.md +++ b/docs/sdk.split.md @@ -27,7 +27,7 @@ const contract = sdk.getSplit("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.split._constructor_.md) | | Constructs a new instance of the Split class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.split._constructor_.md) | | Constructs a new instance of the Split class | ## Properties @@ -53,7 +53,7 @@ const contract = sdk.getSplit("{{contract_address}}"); | [getAddress()](./sdk.split.getaddress.md) | | | | [getAllRecipients()](./sdk.split.getallrecipients.md) | | Get Recipients of this splits contract | | [getRecipientSplitPercentage(address)](./sdk.split.getrecipientsplitpercentage.md) | | Get the % of funds owed to a given address | -| [onNetworkUpdated(network)](./sdk.split.onnetworkupdated.md) | | | +| [onSignerUpdated(signer)](./sdk.split.onsignerupdated.md) | | | | [withdraw(walletAddress)](./sdk.split.withdraw.md) | | Withdraw Funds | | [withdrawToken(walletAddress, tokenAddress)](./sdk.split.withdrawtoken.md) | | Triggers a transfer to account of the amount of a given currency they are owed. | diff --git a/docs/sdk.split.onnetworkupdated.md b/docs/sdk.split.onsignerupdated.md similarity index 50% rename from docs/sdk.split.onnetworkupdated.md rename to docs/sdk.split.onsignerupdated.md index 9f4015607..e36e99859 100644 --- a/docs/sdk.split.onnetworkupdated.md +++ b/docs/sdk.split.onsignerupdated.md @@ -1,20 +1,20 @@ -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Split](./sdk.split.md) > [onNetworkUpdated](./sdk.split.onnetworkupdated.md) +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Split](./sdk.split.md) > [onSignerUpdated](./sdk.split.onsignerupdated.md) -## Split.onNetworkUpdated() method +## Split.onSignerUpdated() method Signature: ```typescript -onNetworkUpdated(network: NetworkOrSignerOrProvider): void; +onSignerUpdated(signer: Signer | undefined): void; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| signer | Signer \| undefined | | Returns: diff --git a/docs/sdk.thirdwebsdk._constructor_.md b/docs/sdk.thirdwebsdk._constructor_.md index 3d89a9311..383f2a09f 100644 --- a/docs/sdk.thirdwebsdk._constructor_.md +++ b/docs/sdk.thirdwebsdk._constructor_.md @@ -9,14 +9,15 @@ Constructs a new instance of the `ThirdwebSDK` class Signature: ```typescript -constructor(network: ChainOrRpc | SignerOrProvider, options?: SDKOptions, storage?: IStorage); +constructor(chainId: ChainOrRpc, signer?: Signer | undefined, options?: SDKOptions, storage?: IStorage); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | ChainOrRpc \| [SignerOrProvider](./sdk.signerorprovider.md) | | +| chainId | ChainOrRpc | | +| signer | Signer \| undefined | (Optional) | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | | storage | [IStorage](./sdk.istorage.md) | (Optional) | diff --git a/docs/sdk.thirdwebsdk.fromprivatekey.md b/docs/sdk.thirdwebsdk.fromprivatekey.md index 1ccae97f4..94ccdf34b 100644 --- a/docs/sdk.thirdwebsdk.fromprivatekey.md +++ b/docs/sdk.thirdwebsdk.fromprivatekey.md @@ -22,7 +22,7 @@ static fromPrivateKey(privateKey: string, network: ChainOrRpc, options?: SDKOpti | privateKey | string | the private key - \*\*DO NOT EXPOSE THIS TO THE PUBLIC\*\* | | network | ChainOrRpc | the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | -| storage | [IStorage](./sdk.istorage.md) | (Optional) | +| storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | Returns: diff --git a/docs/sdk.thirdwebsdk.fromsigner.md b/docs/sdk.thirdwebsdk.fromsigner.md index 6923c4dc7..e9a4c6f41 100644 --- a/docs/sdk.thirdwebsdk.fromsigner.md +++ b/docs/sdk.thirdwebsdk.fromsigner.md @@ -12,7 +12,7 @@ Get an instance of the thirdweb SDK based on an existing ethers signer Signature: ```typescript -static fromSigner(signer: Signer, network?: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; +static fromSigner(signer: Signer, network: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; ``` ## Parameters @@ -20,9 +20,9 @@ static fromSigner(signer: Signer, network?: ChainOrRpc, options?: SDKOptions, st | Parameter | Type | Description | | --- | --- | --- | | signer | Signer | a ethers Signer to be used for transactions | -| network | ChainOrRpc | (Optional) the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url | +| network | ChainOrRpc | the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | -| storage | [IStorage](./sdk.istorage.md) | (Optional) | +| storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | Returns: diff --git a/docs/sdk.thirdwebsdk.md b/docs/sdk.thirdwebsdk.md index c27f0f464..3cd64f115 100644 --- a/docs/sdk.thirdwebsdk.md +++ b/docs/sdk.thirdwebsdk.md @@ -17,7 +17,7 @@ export declare class ThirdwebSDK extends RPCConnectionHandler | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, options, storage)](./sdk.thirdwebsdk._constructor_.md) | | Constructs a new instance of the ThirdwebSDK class | +| [(constructor)(chainId, signer, options, storage)](./sdk.thirdwebsdk._constructor_.md) | | Constructs a new instance of the ThirdwebSDK class | ## Properties @@ -48,5 +48,4 @@ export declare class ThirdwebSDK extends RPCConnectionHandler | [getTokenDrop(address)](./sdk.thirdwebsdk.gettokendrop.md) | | Get an instance of a Token Drop contract | | [getVote(address)](./sdk.thirdwebsdk.getvote.md) | | Get an instance of a Vote contract | | [resolveContractType(contractAddress)](./sdk.thirdwebsdk.resolvecontracttype.md) | | | -| [updateSignerOrProvider(network)](./sdk.thirdwebsdk.updatesignerorprovider.md) | | Update the active signer or provider for all contracts | diff --git a/docs/sdk.thirdwebsdk.updatesignerorprovider.md b/docs/sdk.thirdwebsdk.updatesignerorprovider.md deleted file mode 100644 index c92d0c7d3..000000000 --- a/docs/sdk.thirdwebsdk.updatesignerorprovider.md +++ /dev/null @@ -1,24 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ThirdwebSDK](./sdk.thirdwebsdk.md) > [updateSignerOrProvider](./sdk.thirdwebsdk.updatesignerorprovider.md) - -## ThirdwebSDK.updateSignerOrProvider() method - -Update the active signer or provider for all contracts - -Signature: - -```typescript -updateSignerOrProvider(network: NetworkOrSignerOrProvider): void; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | the new signer or provider | - -Returns: - -void - diff --git a/docs/sdk.token._constructor_.md b/docs/sdk.token._constructor_.md index 339db0b4d..855afae69 100644 --- a/docs/sdk.token._constructor_.md +++ b/docs/sdk.token._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `Token` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.token.md b/docs/sdk.token.md index cfef4a879..2f1656b9b 100644 --- a/docs/sdk.token.md +++ b/docs/sdk.token.md @@ -27,7 +27,7 @@ const contract = sdk.getToken("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.token._constructor_.md) | | Constructs a new instance of the Token class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.token._constructor_.md) | | Constructs a new instance of the Token class | ## Properties diff --git a/docs/sdk.tokendrop._constructor_.md b/docs/sdk.tokendrop._constructor_.md index 4b34c72d1..bff17dd05 100644 --- a/docs/sdk.tokendrop._constructor_.md +++ b/docs/sdk.tokendrop._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `TokenDrop` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.tokendrop.md b/docs/sdk.tokendrop.md index f778f2b3a..16312fef4 100644 --- a/docs/sdk.tokendrop.md +++ b/docs/sdk.tokendrop.md @@ -27,7 +27,7 @@ const contract = sdk.getTokenDrop("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.tokendrop._constructor_.md) | | Constructs a new instance of the TokenDrop class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.tokendrop._constructor_.md) | | Constructs a new instance of the TokenDrop class | ## Properties diff --git a/docs/sdk.userwallet._constructor_.md b/docs/sdk.userwallet._constructor_.md index 37199ef5c..6193da8d2 100644 --- a/docs/sdk.userwallet._constructor_.md +++ b/docs/sdk.userwallet._constructor_.md @@ -9,13 +9,13 @@ Constructs a new instance of the `UserWallet` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, options: SDKOptions); +constructor(connection: ConnectionInfo, options: SDKOptions); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | | diff --git a/docs/sdk.userwallet.connect.md b/docs/sdk.userwallet.connect.md new file mode 100644 index 000000000..998334dee --- /dev/null +++ b/docs/sdk.userwallet.connect.md @@ -0,0 +1,22 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWallet](./sdk.userwallet.md) > [connect](./sdk.userwallet.connect.md) + +## UserWallet.connect() method + +Signature: + +```typescript +connect(signer: Signer): void; +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| signer | Signer | | + +Returns: + +void + diff --git a/docs/sdk.userwallet.disconnect.md b/docs/sdk.userwallet.disconnect.md new file mode 100644 index 000000000..d25420c27 --- /dev/null +++ b/docs/sdk.userwallet.disconnect.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWallet](./sdk.userwallet.md) > [disconnect](./sdk.userwallet.disconnect.md) + +## UserWallet.disconnect() method + +Signature: + +```typescript +disconnect(): void; +``` +Returns: + +void + diff --git a/docs/sdk.userwallet.events.md b/docs/sdk.userwallet.events.md new file mode 100644 index 000000000..9453ec884 --- /dev/null +++ b/docs/sdk.userwallet.events.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWallet](./sdk.userwallet.md) > [events](./sdk.userwallet.events.md) + +## UserWallet.events property + +Signature: + +```typescript +events: StrictEventEmitter; +``` diff --git a/docs/sdk.userwallet.md b/docs/sdk.userwallet.md index 1e48e4c0f..b3cfcc03b 100644 --- a/docs/sdk.userwallet.md +++ b/docs/sdk.userwallet.md @@ -23,15 +23,22 @@ const balance = await sdk.wallet.balance(); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, options)](./sdk.userwallet._constructor_.md) | | Constructs a new instance of the UserWallet class | +| [(constructor)(connection, options)](./sdk.userwallet._constructor_.md) | | Constructs a new instance of the UserWallet class | + +## Properties + +| Property | Modifiers | Type | Description | +| --- | --- | --- | --- | +| [events](./sdk.userwallet.events.md) | | StrictEventEmitter<EventEmitter2, WalletEvent> | | ## Methods | Method | Modifiers | Description | | --- | --- | --- | | [balance(currencyAddress)](./sdk.userwallet.balance.md) | | Fetch the native or ERC20 token balance of this wallet | +| [connect(signer)](./sdk.userwallet.connect.md) | | | +| [disconnect()](./sdk.userwallet.disconnect.md) | | | | [getAddress()](./sdk.userwallet.getaddress.md) | | Get the currently connected address | -| [onNetworkUpdated(network)](./sdk.userwallet.onnetworkupdated.md) | | | | [sendRawTransaction(transactionRequest)](./sdk.userwallet.sendrawtransaction.md) | | Send a raw transaction to the blockchain from the connected wallet | | [sign(message)](./sdk.userwallet.sign.md) | | Sign any message with the connected wallet private key | | [transfer(to, amount, currencyAddress)](./sdk.userwallet.transfer.md) | | Transfer native or ERC20 tokens from this wallet to another wallet | diff --git a/docs/sdk.userwallet.onnetworkupdated.md b/docs/sdk.userwallet.onnetworkupdated.md deleted file mode 100644 index aebbe6bbb..000000000 --- a/docs/sdk.userwallet.onnetworkupdated.md +++ /dev/null @@ -1,22 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWallet](./sdk.userwallet.md) > [onNetworkUpdated](./sdk.userwallet.onnetworkupdated.md) - -## UserWallet.onNetworkUpdated() method - -Signature: - -```typescript -onNetworkUpdated(network: NetworkOrSignerOrProvider): void; -``` - -## Parameters - -| Parameter | Type | Description | -| --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | - -Returns: - -void - diff --git a/docs/sdk.vote._constructor_.md b/docs/sdk.vote._constructor_.md index c670bac5f..c63f2498c 100644 --- a/docs/sdk.vote._constructor_.md +++ b/docs/sdk.vote._constructor_.md @@ -9,14 +9,14 @@ Constructs a new instance of the `Vote` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); +constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | address | string | | | storage | [IStorage](./sdk.istorage.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.vote.md b/docs/sdk.vote.md index e7741acf5..b5b9730e3 100644 --- a/docs/sdk.vote.md +++ b/docs/sdk.vote.md @@ -27,7 +27,7 @@ const contract = sdk.getVote("{{contract_address}}"); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, address, storage, options, contractWrapper)](./sdk.vote._constructor_.md) | | Constructs a new instance of the Vote class | +| [(constructor)(connection, address, storage, options, contractWrapper)](./sdk.vote._constructor_.md) | | Constructs a new instance of the Vote class | ## Properties @@ -53,7 +53,7 @@ const contract = sdk.getVote("{{contract_address}}"); | [getAll()](./sdk.vote.getall.md) | | Get All Proposals | | [getProposalVotes(proposalId)](./sdk.vote.getproposalvotes.md) | | Get the votes for a specific proposal | | [hasVoted(proposalId, account)](./sdk.vote.hasvoted.md) | | Check If Wallet Voted | -| [onNetworkUpdated(network)](./sdk.vote.onnetworkupdated.md) | | | +| [onSignerUpdated(signer)](./sdk.vote.onsignerupdated.md) | | | | [propose(description, executions)](./sdk.vote.propose.md) | | Create Proposal | | [settings()](./sdk.vote.settings.md) | | Get the Vote contract configuration | | [vote(proposalId, voteType, reason)](./sdk.vote.vote.md) | | Vote | diff --git a/docs/sdk.vote.onnetworkupdated.md b/docs/sdk.vote.onsignerupdated.md similarity index 50% rename from docs/sdk.vote.onnetworkupdated.md rename to docs/sdk.vote.onsignerupdated.md index 2d5de2e14..de4b0d217 100644 --- a/docs/sdk.vote.onnetworkupdated.md +++ b/docs/sdk.vote.onsignerupdated.md @@ -1,20 +1,20 @@ -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Vote](./sdk.vote.md) > [onNetworkUpdated](./sdk.vote.onnetworkupdated.md) +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Vote](./sdk.vote.md) > [onSignerUpdated](./sdk.vote.onsignerupdated.md) -## Vote.onNetworkUpdated() method +## Vote.onSignerUpdated() method Signature: ```typescript -onNetworkUpdated(network: NetworkOrSignerOrProvider): void; +onSignerUpdated(signer: Signer | undefined): void; ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| signer | Signer \| undefined | | Returns: diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 58c677987..2fe36bbab 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -15,7 +15,7 @@ import { ContractInterface } from 'ethers'; import type { ContractTransaction } from 'ethers'; import { ethers } from 'ethers'; import { Event as Event_2 } from 'ethers'; -import EventEmitter from 'eventemitter3'; +import { EventEmitter2 } from 'eventemitter2'; import type { EventFilter } from 'ethers'; import type { EventFragment } from '@ethersproject/abi'; import { extendShape } from 'zod'; @@ -25,11 +25,11 @@ import { ListenerFn } from 'eventemitter3'; import type { Overrides } from 'ethers'; import type { PayableOverrides } from 'ethers'; import type { PopulatedTransaction } from 'ethers'; -import type { Provider } from '@ethersproject/providers'; -import { Provider as Provider_2 } from '@ethersproject/abstract-provider'; +import { Provider } from '@ethersproject/providers'; import { providers } from 'ethers'; import type { Result } from '@ethersproject/abi'; import { Signer } from 'ethers'; +import StrictEventEmitter from 'strict-event-emitter-types'; import { TransactionReceipt } from '@ethersproject/abstract-provider'; import { utils } from 'ethers'; import { z } from 'zod'; @@ -189,10 +189,13 @@ export enum ChainId { Rinkeby = 4 } +// @public (undocumented) +export const chainNameToId: Record; + // Warning: (ae-internal-missing-underscore) The name "ChainOrRpc" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -export type ChainOrRpc = "mumbai" | "polygon" | "matic" | "rinkeby" | "goerli" | "mainnet" | "ethereum" | "fantom" | "avalanche" | "optimism" | "optimism-testnet" | "arbitrum" | "arbitrum-testnet" | (string & {}); +export type ChainOrRpc = "mumbai" | "polygon" | "matic" | "rinkeby" | "goerli" | "mainnet" | "ethereum" | "fantom" | "avalanche" | "optimism" | "optimism-testnet" | "arbitrum" | "arbitrum-testnet" | (string & {}) | (number & {}); // Warning: (ae-internal-missing-underscore) The name "CidWithFileName" should be prefixed with an underscore because the declaration is marked as @internal // @@ -204,11 +207,6 @@ export interface CidWithFileName { fileNames: string[]; } -// Warning: (ae-internal-missing-underscore) The name "ChainOrRpc" should be prefixed with an underscore because the declaration is marked as @internal -// -// @internal (undocumented) -export type ChainOrRpc = "mumbai" | "polygon" | "rinkeby" | "goerli" | "mainnet" | "fantom" | "avalanche" | `https://${string}`; - // Warning: (ae-incompatible-release-tags) The symbol "ClaimCondition" is marked as @public, but its signature references "ClaimConditionOutputSchema" which is marked as @internal // // @public @@ -549,6 +547,13 @@ export const CommonTrustedForwarderSchema: z.ZodObject<{ trusted_forwarders?: string[] | undefined; }>; +// @public (undocumented) +export type ConnectionInfo = { + chainId: ChainOrRpc; + signer: Signer | undefined; + provider?: providers.Provider; +}; + // Warning: (ae-internal-missing-underscore) The name "CONTRACT_ADDRESSES" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) @@ -566,7 +571,7 @@ export const CONTRACT_ADDRESSES: Record(contractType: TContract["contractType"], contractMetadata: z.input): Promise; deployEdition(metadata: NFTContractDeployMetadata): Promise; @@ -588,7 +593,7 @@ export class ContractDeployer extends RPCConnectionHandler { // @internal (undocumented) getRegistry(): Promise; // (undocumented) - updateSignerOrProvider(network: NetworkOrSignerOrProvider): void; + updateSigner(signer: Signer | undefined): void; } // @public @@ -851,6 +856,9 @@ export const DEFAULT_IPFS_GATEWAY = "https://gateway.ipfscdn.io/ipfs/"; // @internal (undocumented) export const DEFAULT_QUERY_ALL_COUNT = 100; +// @public (undocumented) +export const defaultRPCMap: Record; + // Warning: (ae-forgotten-export) The symbol "DropERC721" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "BaseDelayedRevealERC721" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "SignatureDrop" needs to be exported by the entry point index.d.ts @@ -955,7 +963,7 @@ export class DuplicateLeafsError extends Error { // // @public export class Edition extends Erc1155 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; burn(tokenId: BigNumberish, amount: BigNumberish): Promise; @@ -1100,7 +1108,7 @@ export class Edition extends Erc1155 { // @public export class EditionDrop extends Erc1155 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; burn(tokenId: BigNumberish, amount: BigNumberish): Promise; @@ -1555,7 +1563,7 @@ export class Erc1155 imp // @internal normalizeAmount(amount: Amount): Promise; // @internal (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; // (undocumented) protected options: SDKOptions; setAllowance(spender: string, amount: Amount): Promise; @@ -1714,7 +1722,7 @@ export class Erc721; // @internal (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; // (undocumented) protected options: SDKOptions; ownerOf(tokenId: BigNumberish): Promise; @@ -1977,23 +1985,24 @@ export function getContractPublisherAddress(): string; // @public export function getNativeTokenByChainId(chainId: ChainId): NativeToken; -// Warning: (ae-internal-missing-underscore) The name "getProviderForNetwork" should be prefixed with an underscore because the declaration is marked as @internal +// Warning: (ae-internal-missing-underscore) The name "getProviderForChain" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -<<<<<<< HEAD -export function getProviderForNetwork(network: ChainOrRpc | SignerOrProvider): `https://${string}` | Signer | Provider_2; -======= -export function getProviderForNetwork(network: ChainOrRpc | SignerOrProvider): string | ethers.Signer | ethers.providers.Provider; +export function getProviderForChain(network: ChainOrRpc): Provider; // @public (undocumented) export function getReadOnlyProvider(network: string, chainId?: number): ethers.providers.BaseProvider; ->>>>>>> main // Warning: (ae-internal-missing-underscore) The name "getRoleHash" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) export function getRoleHash(role: Role): BytesLike; +// Warning: (ae-internal-missing-underscore) The name "getRpcUrl" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export function getRpcUrl(network: ChainOrRpc, customRpcMap?: Record): string; + // Warning: (ae-internal-missing-underscore) The name "hasFunction" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) @@ -2145,7 +2154,7 @@ export enum ListingType { // @public export class Marketplace implements UpdateableNetwork { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); allowListingFromAnyAsset(): Promise; allowListingFromSpecificAssetOnly(contractAddress: string): Promise; // @internal (undocumented) @@ -2183,7 +2192,7 @@ export class Marketplace implements UpdateableNetwork { // (undocumented) metadata: ContractMetadata; // (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; // (undocumented) platformFees: ContractPlatformFee; // (undocumented) @@ -2370,7 +2379,7 @@ export class MissingRoleError extends Error { // @beta export class Multiwrap extends Erc721 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // (undocumented) static contractAbi: any; // (undocumented) @@ -2548,7 +2557,7 @@ export interface NewDirectListing { // @public export class NFTCollection extends Erc721 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; burn(tokenId: BigNumberish): Promise; @@ -2707,7 +2716,7 @@ export interface NFTContractDeployMetadata { // @public export class NFTDrop extends Erc721 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; burn(tokenId: BigNumberish): Promise; @@ -2921,7 +2930,7 @@ export const OZ_DEFENDER_FORWARDER_ADDRESS = "0xc82BbE41f2cF04e3a8efA18F7032BDD7 // // @public export class Pack extends Erc1155 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; // (undocumented) @@ -4274,7 +4283,7 @@ export const Signature721WithQuantityOutput: z.ZodObject { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // (undocumented) analytics: ContractAnalytics; burn(tokenId: BigNumberish): Promise; @@ -4467,7 +4476,7 @@ export type SignerOrProvider = Signer | providers.Provider; // @beta export class SmartContract implements UpdateableNetwork { - constructor(network: NetworkOrSignerOrProvider, address: string, abi: ContractInterface, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, abi: ContractInterface, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; call(functionName: string, ...args: unknown[] | [...unknown[], CallOverrides]): Promise; @@ -4488,7 +4497,7 @@ export class SmartContract; nft: Erc721 | undefined; // (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; // (undocumented) platformFees: ContractPlatformFee | undefined; // Warning: (ae-incompatible-release-tags) The symbol "publishedMetadata" is marked as @beta, but its signature references "ContractPublishedMetadata" which is marked as @internal @@ -4759,7 +4768,7 @@ export const SnapshotSchema: z.ZodObject<{ // @public export class Split implements UpdateableNetwork { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; balanceOf(address: string): Promise; @@ -4799,7 +4808,7 @@ export class Split implements UpdateableNetwork { // (undocumented) metadata: ContractMetadata; // (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; // @internal (undocumented) static schema: { deploy: ZodObject(address: string, contractType: TContractType): ContractForContractType; // @beta @@ -5030,13 +5039,12 @@ export class ThirdwebSDK extends RPCConnectionHandler { // (undocumented) resolveContractType(contractAddress: string): Promise; storage: RemoteStorage; - updateSignerOrProvider(network: NetworkOrSignerOrProvider): void; wallet: UserWallet; } // @public export class Token extends Erc20 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; burn(amount: Amount): Promise; @@ -5174,7 +5182,7 @@ export interface TokenContractDeployMetadata { // @public export class TokenDrop extends Erc20 { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; burn(amount: Amount): Promise; @@ -5404,11 +5412,17 @@ export type UploadResult = { // @public export class UserWallet { - constructor(network: NetworkOrSignerOrProvider, options: SDKOptions); + constructor(connection: ConnectionInfo, options: SDKOptions); balance(currencyAddress?: string): Promise; - getAddress(): Promise; // (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + connect(signer: Signer): void; + // (undocumented) + disconnect(): void; + // Warning: (ae-forgotten-export) The symbol "WalletEvent" needs to be exported by the entry point index.d.ts + // + // (undocumented) + events: StrictEventEmitter; + getAddress(): Promise; sendRawTransaction(transactionRequest: providers.TransactionRequest): Promise; sign(message: string): Promise; transfer(to: string, amount: Amount, currencyAddress?: string): Promise; @@ -5427,7 +5441,7 @@ export type ValueOf = T[keyof T]; // @public export class Vote implements UpdateableNetwork { - constructor(network: NetworkOrSignerOrProvider, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); + constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); // @internal (undocumented) analytics: ContractAnalytics; balance(): Promise; @@ -5457,7 +5471,7 @@ export class Vote implements UpdateableNetwork { // (undocumented) metadata: ContractMetadata; // (undocumented) - onNetworkUpdated(network: NetworkOrSignerOrProvider): void; + onSignerUpdated(signer: Signer | undefined): void; propose(description: string, executions?: ProposalExecutable[]): Promise; // @internal (undocumented) static schema: { @@ -5626,6 +5640,10 @@ export class WrongListingTypeError extends Error { constructor(marketplaceContractAddress: string, listingId?: string, actualType?: string, expectedType?: string); } +// Warnings were encountered during analysis: +// +// dist/src/core/types.d.ts:21:5 - (ae-incompatible-release-tags) The symbol "chainId" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal + // (No @packageDocumentation comment for this package) ``` diff --git a/package.json b/package.json index 31f0bbbe9..3aefb0bda 100644 --- a/package.json +++ b/package.json @@ -113,6 +113,8 @@ "fast-deep-equal": "^3.1.3", "form-data": "^4.0.0", "multihashes": "^4.0.3", + "eventemitter2": "^6.4.5", + "strict-event-emitter-types": "^2.0.0", "tiny-invariant": "^1.2.0", "uuid": "^8.3.2", "zod": "^3.11.6" diff --git a/src/common/currency.ts b/src/common/currency.ts index 9ec3a55e2..a77504b13 100644 --- a/src/common/currency.ts +++ b/src/common/currency.ts @@ -88,10 +88,8 @@ export async function setErc20Allowance( if (isNativeToken(currencyAddress)) { overrides["value"] = value; } else { - const signer = contractToApprove.getSigner(); - const provider = contractToApprove.getProvider(); const erc20 = new ContractWrapper( - signer || provider, + contractToApprove.getConnectionInfo(), currencyAddress, ERC20Abi, {}, @@ -115,10 +113,8 @@ export async function approveErc20Allowance( quantity: BigNumberish, tokenDecimals: number, ) { - const signer = contractToApprove.getSigner(); - const provider = contractToApprove.getProvider(); const erc20 = new ContractWrapper( - signer || provider, + contractToApprove.getConnectionInfo(), currencyAddress, ERC20Abi, {}, @@ -142,9 +138,8 @@ export async function hasERC20Allowance( currencyAddress: string, value: BigNumber, ) { - const provider = contractToApprove.getProvider(); const erc20 = new ContractWrapper( - provider, + contractToApprove.getConnectionInfo(), currencyAddress, ERC20Abi, {}, diff --git a/src/common/marketplace.ts b/src/common/marketplace.ts index 9dfc8eeda..1e07d0047 100644 --- a/src/common/marketplace.ts +++ b/src/common/marketplace.ts @@ -4,7 +4,6 @@ import { InterfaceId_IERC721, } from "../constants/contract"; import { ContractWrapper } from "../core/classes/contract-wrapper"; -import { SignerOrProvider } from "../core"; import { NewAuctionListing, NewDirectListing, @@ -17,6 +16,7 @@ import { IERC1155, IERC165, IERC721 } from "contracts"; import ERC1155Abi from "../../abis/IERC1155.json"; import ERC721Abi from "../../abis/IERC721.json"; import ERC165Abi from "../../abis/IERC165.json"; +import { RPCConnectionHandler } from "../core/classes/rpc-connection-handler"; /** * This method checks if the given token is approved for the transferrerContractAddress contract. @@ -75,19 +75,21 @@ export async function isTokenApprovedForTransfer( /** * Checks if the marketplace is approved to make transfers on the assetContract * If not, it tries to set the approval. - * @param signerOrProvider + * @param rpcConnectionHandler * @param marketplaceAddress * @param assetContract * @param tokenId * @param from + * @internal */ export async function handleTokenApproval( - signerOrProvider: SignerOrProvider, + rpcConnectionHandler: RPCConnectionHandler, marketplaceAddress: string, assetContract: string, tokenId: BigNumberish, from: string, ): Promise { + const signerOrProvider = rpcConnectionHandler.getSignerOrProvider(); const erc165 = new Contract( assetContract, ERC165Abi, @@ -98,7 +100,7 @@ export async function handleTokenApproval( // check for token approval if (isERC721) { const asset = new ContractWrapper( - signerOrProvider, + rpcConnectionHandler.getConnectionInfo(), assetContract, ERC721Abi, {}, @@ -121,7 +123,7 @@ export async function handleTokenApproval( } } else if (isERC1155) { const asset = new ContractWrapper( - signerOrProvider, + rpcConnectionHandler.getConnectionInfo(), assetContract, ERC1155Abi, {}, diff --git a/src/constants/addresses.ts b/src/constants/addresses.ts index a48ce266e..7a9405220 100644 --- a/src/constants/addresses.ts +++ b/src/constants/addresses.ts @@ -149,11 +149,11 @@ export const CONTRACT_ADDRESSES: Record< * @internal */ export function getContractAddressByChainId( - chainId: SUPPORTED_CHAIN_ID | ChainId.Hardhat, + chainId: SUPPORTED_CHAIN_ID | ChainId.Hardhat | ChainId.Localhost, contractName: keyof typeof CONTRACT_ADDRESSES[SUPPORTED_CHAIN_ID], ): string { // for testing only - if (chainId === ChainId.Hardhat) { + if (chainId === ChainId.Hardhat || chainId === ChainId.Localhost) { if (contractName === "twFactory") { return process.env.factoryAddress as string; } else if (contractName === "twRegistry") { diff --git a/src/constants/urls.ts b/src/constants/urls.ts index 9b96ee0c4..eda8577a2 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -1,5 +1,4 @@ import { ethers, providers } from "ethers"; -import { SignerOrProvider } from "../core/types"; import { Provider } from "@ethersproject/providers"; import { ChainId, SUPPORTED_CHAIN_ID } from "./chains"; /** @@ -114,10 +113,7 @@ export function getRpcUrl( * @param network - the chain name or rpc url * @returns the rpc url for that chain */ -export function getProviderForChain(network: ChainOrRpc | Provider): Provider { - if (typeof network !== "string" && typeof network !== "number") { - return network; - } +export function getProviderForChain(network: ChainOrRpc): Provider { const rpcUrl = getRpcUrl(network); return getReadOnlyProvider(rpcUrl); } diff --git a/src/contracts/edition-drop.ts b/src/contracts/edition-drop.ts index 2c360b36b..e62852395 100644 --- a/src/contracts/edition-drop.ts +++ b/src/contracts/edition-drop.ts @@ -7,7 +7,7 @@ import { ContractPrimarySale } from "../core/classes/contract-sales"; import { Erc1155Enumerable } from "../core/classes/erc-1155-enumerable"; import { IStorage } from "../core/interfaces/IStorage"; import { - NetworkOrSignerOrProvider, + ConnectionInfo, TransactionResult, TransactionResultWithId, } from "../core/types"; @@ -124,12 +124,12 @@ export class EditionDrop extends Erc1155 { public interceptor: ContractInterceptor; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, EditionDrop.contractAbi, options, diff --git a/src/contracts/edition.ts b/src/contracts/edition.ts index 621cae717..00440a577 100644 --- a/src/contracts/edition.ts +++ b/src/contracts/edition.ts @@ -7,7 +7,7 @@ import { ContractPrimarySale } from "../core/classes/contract-sales"; import { Erc1155Enumerable } from "../core/classes/erc-1155-enumerable"; import { IStorage } from "../core/interfaces/IStorage"; import { - NetworkOrSignerOrProvider, + ConnectionInfo, TransactionResult, TransactionResultWithId, } from "../core/types"; @@ -112,12 +112,12 @@ export class Edition extends Erc1155 { public interceptor: ContractInterceptor; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Edition.contractAbi, options, diff --git a/src/contracts/marketplace.ts b/src/contracts/marketplace.ts index d6d560f02..3b5cb1f66 100644 --- a/src/contracts/marketplace.ts +++ b/src/contracts/marketplace.ts @@ -3,7 +3,7 @@ import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractRoles } from "../core/classes/contract-roles"; import { ContractEncoder } from "../core/classes/contract-encoder"; import { IStorage } from "../core/interfaces/IStorage"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../core/types"; +import { ConnectionInfo, TransactionResult } from "../core/types"; import { SDKOptions } from "../schema/sdk-options"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { UpdateableNetwork } from "../core/interfaces/contract"; @@ -142,12 +142,12 @@ export class Marketplace implements UpdateableNetwork { public auction: MarketplaceAuction; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Marketplace.contractAbi, options, diff --git a/src/contracts/multiwrap.ts b/src/contracts/multiwrap.ts index a22b735c1..76767895c 100644 --- a/src/contracts/multiwrap.ts +++ b/src/contracts/multiwrap.ts @@ -1,5 +1,5 @@ import { - NetworkOrSignerOrProvider, + ConnectionInfo, TransactionResult, TransactionResultWithId, } from "../core/types"; @@ -90,12 +90,12 @@ export class Multiwrap extends Erc721 { private _query = this.query as Erc721Supply; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Multiwrap.contractAbi, options, diff --git a/src/contracts/nft-collection.ts b/src/contracts/nft-collection.ts index 372c299f1..36e995dce 100644 --- a/src/contracts/nft-collection.ts +++ b/src/contracts/nft-collection.ts @@ -1,9 +1,5 @@ import { IStorage } from "../core/interfaces/IStorage"; -import type { - NetworkOrSignerOrProvider, - TransactionResult, - TransactionResultWithId, -} from "../core/types"; +import type { TransactionResult, TransactionResultWithId } from "../core/types"; import { Erc721BatchMintable } from "../core/classes/erc-721-batch-mintable"; import { Erc721Enumerable } from "../core/classes/erc-721-enumerable"; import { Erc721Mintable } from "../core/classes/erc-721-mintable"; @@ -28,6 +24,7 @@ import { NFTMetadataOrUri, NFTMetadataOwner } from "../schema"; import { QueryAllParams } from "../types"; import { GasCostEstimator } from "../core/classes/gas-cost-estimator"; import { ContractAnalytics } from "../core/classes/contract-analytics"; +import { ConnectionInfo } from "../core/types"; /** * Create a collection of one-of-one NFTs. @@ -110,12 +107,12 @@ export class NFTCollection extends Erc721 { private _owned = this._query.owned as Erc721Enumerable; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, NFTCollection.contractAbi, options, diff --git a/src/contracts/nft-drop.ts b/src/contracts/nft-drop.ts index 20701564b..3cf2ba56e 100644 --- a/src/contracts/nft-drop.ts +++ b/src/contracts/nft-drop.ts @@ -12,7 +12,7 @@ import { ContractRoyalty } from "../core/classes/contract-royalty"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { IStorage } from "../core/interfaces/IStorage"; import { - NetworkOrSignerOrProvider, + ConnectionInfo, TransactionResult, TransactionResultWithId, } from "../core/types"; @@ -163,12 +163,12 @@ export class NFTDrop extends Erc721 { private _owned = this._query.owned as Erc721Enumerable; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, NFTDrop.contractAbi, options, diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 806a62984..22d805322 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -1,10 +1,7 @@ import { ContractWrapper } from "../core/classes/contract-wrapper"; import { ContractInterceptor } from "../core/classes/contract-interceptor"; import { IStorage } from "../core/interfaces/IStorage"; -import { - NetworkOrSignerOrProvider, - TransactionResultWithId, -} from "../core/types"; +import { ConnectionInfo, TransactionResultWithId } from "../core/types"; import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractEncoder } from "../core/classes/contract-encoder"; import { SDKOptions } from "../schema/sdk-options"; @@ -99,12 +96,12 @@ export class Pack extends Erc1155 { private _query = this.query as Erc1155Enumerable; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Pack.contractAbi, options, diff --git a/src/contracts/signature-drop.ts b/src/contracts/signature-drop.ts index eb1a8ce0a..ba44626ae 100644 --- a/src/contracts/signature-drop.ts +++ b/src/contracts/signature-drop.ts @@ -13,7 +13,7 @@ import { ContractRoyalty } from "../core/classes/contract-royalty"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { IStorage } from "../core/interfaces/IStorage"; import { - NetworkOrSignerOrProvider, + ConnectionInfo, TransactionResult, TransactionResultWithId, } from "../core/types"; @@ -179,12 +179,12 @@ export class SignatureDrop extends Erc721 { private _owned = this._query.owned as Erc721Enumerable; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, SignatureDrop.contractAbi, options, diff --git a/src/contracts/smart-contract.ts b/src/contracts/smart-contract.ts index ee33754be..fdba44598 100644 --- a/src/contracts/smart-contract.ts +++ b/src/contracts/smart-contract.ts @@ -1,5 +1,5 @@ import { ContractMetadata } from "../core/classes/contract-metadata"; -import { IStorage, NetworkOrSignerOrProvider } from "../core"; +import { ConnectionInfo, IStorage } from "../core"; import { ContractEvents } from "../core/classes/contract-events"; import { ContractInterceptor } from "../core/classes/contract-interceptor"; import { ContractPrimarySale } from "../core/classes/contract-sales"; @@ -21,7 +21,7 @@ import { } from "contracts"; import { CustomContractSchema } from "../schema/contracts/custom"; import { UpdateableNetwork } from "../core/interfaces/contract"; -import { CallOverrides, ContractInterface } from "ethers"; +import { CallOverrides, ContractInterface, Signer } from "ethers"; import { ALL_ROLES, detectContractFeature } from "../common"; import { ContractPlatformFee } from "../core/classes/contract-platform-fee"; import { ContractPublishedMetadata } from "../core/classes/contract-published-metadata"; @@ -101,13 +101,13 @@ export class SmartContract< public edition: Erc1155 | undefined; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, abi: ContractInterface, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, abi, options, diff --git a/src/contracts/split.ts b/src/contracts/split.ts index 3c5f10925..3795ded17 100644 --- a/src/contracts/split.ts +++ b/src/contracts/split.ts @@ -3,7 +3,7 @@ import { IERC20, Split as SplitContract } from "contracts"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { ContractInterceptor } from "../core/classes/contract-interceptor"; import { IStorage } from "../core/interfaces/IStorage"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../core/types"; +import { ConnectionInfo, TransactionResult } from "../core/types"; import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractEncoder } from "../core/classes/contract-encoder"; import { SDKOptions } from "../schema/sdk-options"; @@ -56,12 +56,12 @@ export class Split implements UpdateableNetwork { public analytics: ContractAnalytics; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Split.contractAbi, options, diff --git a/src/contracts/token-drop.ts b/src/contracts/token-drop.ts index dded3876c..326e522c0 100644 --- a/src/contracts/token-drop.ts +++ b/src/contracts/token-drop.ts @@ -1,6 +1,6 @@ import { DropERC20 } from "contracts"; import { IStorage } from "../core/interfaces/IStorage"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../core/types"; +import { ConnectionInfo, TransactionResult } from "../core/types"; import { SDKOptions } from "../schema/sdk-options"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { BigNumberish, BytesLike, constants, utils } from "ethers"; @@ -84,12 +84,12 @@ export class TokenDrop extends Erc20 { public interceptor: ContractInterceptor; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, TokenDrop.contractAbi, options, diff --git a/src/contracts/token.ts b/src/contracts/token.ts index ccb96809f..13805150a 100644 --- a/src/contracts/token.ts +++ b/src/contracts/token.ts @@ -2,11 +2,7 @@ import { TokenErc20ContractSchema } from "../schema/contracts/token-erc20"; import { TokenERC20 } from "contracts"; import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractRoles } from "../core/classes/contract-roles"; -import { - IStorage, - NetworkOrSignerOrProvider, - TransactionResult, -} from "../core"; +import { ConnectionInfo, IStorage, TransactionResult } from "../core"; import { SDKOptions } from "../schema/sdk-options"; import { ContractWrapper } from "../core/classes/contract-wrapper"; import { TokenMintInput } from "../schema/tokens/token"; @@ -82,12 +78,12 @@ export class Token extends Erc20 { public interceptor: ContractInterceptor; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Token.contractAbi, options, diff --git a/src/contracts/vote.ts b/src/contracts/vote.ts index 981ff6b28..7ee0e0c13 100644 --- a/src/contracts/vote.ts +++ b/src/contracts/vote.ts @@ -3,7 +3,7 @@ import { ContractMetadata } from "../core/classes/contract-metadata"; import { ContractInterceptor } from "../core/classes/contract-interceptor"; import { IStorage } from "../core/interfaces/IStorage"; import { - NetworkOrSignerOrProvider, + ConnectionInfo, TransactionResult, TransactionResultWithId, } from "../core/types"; @@ -67,12 +67,12 @@ export class Vote implements UpdateableNetwork { public interceptor: ContractInterceptor; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, address: string, storage: IStorage, options: SDKOptions = {}, contractWrapper = new ContractWrapper( - network, + connection, address, Vote.contractAbi, options, diff --git a/src/core/classes/contract-analytics.ts b/src/core/classes/contract-analytics.ts index 2ce847619..fbd2463db 100644 --- a/src/core/classes/contract-analytics.ts +++ b/src/core/classes/contract-analytics.ts @@ -1,5 +1,4 @@ -import { BaseContract, ethers, Event } from "ethers"; -import { ChainId } from "../../constants"; +import { BaseContract, Event } from "ethers"; import { ContractWrapper } from "./contract-wrapper"; export class ContractAnalytics { @@ -17,29 +16,14 @@ export class ContractAnalytics { ); const filter = this.contractWrapper.readContract.filters[event.name]; + // TODO limit the number of blocks queried const fromBlock = 0; const toBlock = await this.contractWrapper.readContract.provider.getBlockNumber(); - - const network = - await this.contractWrapper.readContract.provider.getNetwork(); - const alchemyContractWrapper = new ContractWrapper( - network.chainId === ChainId.Localhost || - network.chainId === ChainId.Hardhat - ? this.contractWrapper.readContract.provider - : new ethers.providers.AlchemyProvider(network.name), - this.contractWrapper.readContract.address, - this.contractWrapper.abi, - {}, - ); - - let events: Event[] = []; - events = await alchemyContractWrapper.readContract.queryFilter( + return await this.contractWrapper.readContract.queryFilter( filter(), fromBlock, toBlock, ); - - return events; } } diff --git a/src/core/classes/contract-deployer.ts b/src/core/classes/contract-deployer.ts index b885c60f9..1bfec431f 100644 --- a/src/core/classes/contract-deployer.ts +++ b/src/core/classes/contract-deployer.ts @@ -1,4 +1,4 @@ -import { NetworkOrSignerOrProvider, ValidContractClass } from "../types"; +import { ConnectionInfo, ValidContractClass } from "../types"; import { z } from "zod"; import { ContractRegistry } from "./registry"; import { getContractAddressByChainId } from "../../constants/addresses"; @@ -12,8 +12,8 @@ import { Marketplace, NFTCollection, NFTDrop, - SignatureDrop, Pack, + SignatureDrop, Split, Token, Vote, @@ -28,7 +28,7 @@ import { } from "../../types/deploy/deploy-metadata"; import { TokenDrop } from "../../contracts/token-drop"; import { Multiwrap } from "../../contracts/multiwrap"; -import { Provider } from "@ethersproject/providers"; +import { Signer } from "ethers"; /** * Handles deploying new contracts @@ -48,8 +48,12 @@ export class ContractDeployer extends RPCConnectionHandler { private storage: IStorage; private options: SDKOptions; - constructor(network: Provider, options: SDKOptions, storage: IStorage) { - super(network); + constructor( + connection: ConnectionInfo, + options: SDKOptions, + storage: IStorage, + ) { + super(connection); this.options = options; this.storage = storage; } @@ -363,7 +367,7 @@ export class ContractDeployer extends RPCConnectionHandler { ); return new ContractRegistry( registryAddress, - this.getSignerOrProvider(), + this.getConnectionInfo(), this.options, ); })); @@ -382,29 +386,20 @@ export class ContractDeployer extends RPCConnectionHandler { return (this._factory = this.getProvider() .getNetwork() .then(async ({ chainId }) => { + console.log("chainId", chainId); const factoryAddress = getContractAddressByChainId( chainId, "twFactory", ); return new ContractFactory( factoryAddress, - this.getSignerOrProvider(), + this.getConnectionInfo(), this.storage, this.options, ); })); } - public override updateProvider(provider: Provider) { - super.updateProvider(provider); - this._factory?.then((factory) => { - factory.updateProvider(provider); - }); - this._registry?.then((registry) => { - registry.updateProvider(provider); - }); - } - public override updateSigner(signer: Signer | undefined) { super.updateSigner(signer); this._factory?.then((factory) => { diff --git a/src/core/classes/contract-publisher.ts b/src/core/classes/contract-publisher.ts index 08e4e4246..5cd926b99 100644 --- a/src/core/classes/contract-publisher.ts +++ b/src/core/classes/contract-publisher.ts @@ -1,4 +1,4 @@ -import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; +import { ConnectionInfo, TransactionResult } from "../types"; import { SDKOptions } from "../../schema/sdk-options"; import { IStorage } from "../interfaces"; import { RPCConnectionHandler } from "./rpc-connection-handler"; @@ -8,6 +8,7 @@ import { constants, ContractInterface, ethers, + Signer, utils, } from "ethers"; import invariant from "tiny-invariant"; @@ -44,25 +45,23 @@ export class ContractPublisher extends RPCConnectionHandler { private publisher: ContractWrapper; constructor( - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, options: SDKOptions, storage: IStorage, ) { - super(network, options); + super(connection); this.storage = storage; this.publisher = new ContractWrapper( - network, + connection, getContractPublisherAddress(), ContractPublisherAbi, options, ); } - public override updateSignerOrProvider( - network: NetworkOrSignerOrProvider, - ): void { - super.updateSignerOrProvider(network); - this.publisher.updateSignerOrProvider(network); + public override updateSigner(signer: Signer | undefined): void { + super.updateSigner(signer); + this.publisher.updateSigner(signer); } /** diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index 0238306b5..661b70229 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -17,6 +17,7 @@ import { SDKOptionsSchema, } from "../../schema/sdk-options"; import { + ConnectionInfo, ForwardRequestMessage, GaslessTransaction, PermitRequestMessage, @@ -36,7 +37,6 @@ import { getPolygonGasPriorityFee } from "../../common/gas-price"; import { ChainId } from "../../constants"; import { convertToTWError } from "../../common"; import { isBrowser } from "../../common/utils"; -import { Provider } from "@ethersproject/providers"; /** * @internal @@ -55,13 +55,12 @@ export class ContractWrapper< public abi; constructor( - network: Provider, - signer: Signer | undefined, + network: ConnectionInfo, contractAddress: string, contractAbi: ContractInterface, options: SDKOptions, ) { - super(network, signer); + super(network); this.abi = contractAbi; // set up the contract this.writeContract = new Contract( diff --git a/src/core/classes/drop-claim-conditions.ts b/src/core/classes/drop-claim-conditions.ts index cdb5a0ca9..9f1d7cac6 100644 --- a/src/core/classes/drop-claim-conditions.ts +++ b/src/core/classes/drop-claim-conditions.ts @@ -292,7 +292,7 @@ export class DropClaimConditions< } } else { const erc20 = new ContractWrapper( - provider, + this.contractWrapper.getConnectionInfo(), claimCondition.currencyAddress, ERC20Abi, {}, diff --git a/src/core/classes/drop-erc1155-claim-conditions.ts b/src/core/classes/drop-erc1155-claim-conditions.ts index ef330a9bf..fff08770d 100644 --- a/src/core/classes/drop-erc1155-claim-conditions.ts +++ b/src/core/classes/drop-erc1155-claim-conditions.ts @@ -247,7 +247,7 @@ export class DropErc1155ClaimConditions { } } else { const erc20 = new ContractWrapper( - provider, + this.contractWrapper.getConnectionInfo(), claimCondition.currencyAddress, IERC20__factory.abi, {}, diff --git a/src/core/classes/drop-single-claim-conditions.ts b/src/core/classes/drop-single-claim-conditions.ts index 5ced02b8a..42d591ede 100644 --- a/src/core/classes/drop-single-claim-conditions.ts +++ b/src/core/classes/drop-single-claim-conditions.ts @@ -204,7 +204,7 @@ export class DropSingleClaimConditions { } } else { const erc20 = new ContractWrapper( - provider, + this.contractWrapper.getConnectionInfo(), claimCondition.currency, ERC20Abi, {}, diff --git a/src/core/classes/erc-1155.ts b/src/core/classes/erc-1155.ts index ebacea379..8c3833e01 100644 --- a/src/core/classes/erc-1155.ts +++ b/src/core/classes/erc-1155.ts @@ -8,7 +8,7 @@ import { import { BigNumber, BigNumberish, BytesLike, Signer } from "ethers"; import { NFTMetadata } from "../../schema/tokens/common"; import { IStorage } from "../interfaces"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; +import { TransactionResult } from "../types"; import { UpdateableNetwork } from "../interfaces/contract"; import { SDKOptions, SDKOptionsSchema } from "../../schema/sdk-options"; import { @@ -242,7 +242,7 @@ export class Erc1155< * const addresses = [ * "0x...", "0x...", "0x...", * ] - * + * * await contract.airdrop(tokenId, addresses); * ``` */ diff --git a/src/core/classes/erc-20.ts b/src/core/classes/erc-20.ts index 03f3e74ae..97620b6d4 100644 --- a/src/core/classes/erc-20.ts +++ b/src/core/classes/erc-20.ts @@ -2,9 +2,9 @@ import { ContractWrapper } from "./contract-wrapper"; import { DropERC20, IMintableERC20, TokenERC20 } from "contracts"; import { BigNumber, BigNumberish, ethers, Signer } from "ethers"; import { IStorage } from "../interfaces"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; import { UpdateableNetwork } from "../interfaces/contract"; -import { SDKOptions, SDKOptionsSchema } from "../../schema/sdk-options"; +import { TransactionResult } from "../types"; +import { SDKOptions } from "../../schema/sdk-options"; import { Amount, Currency, CurrencyValue } from "../../types/currency"; import { fetchCurrencyMetadata, diff --git a/src/core/classes/erc-721.ts b/src/core/classes/erc-721.ts index 4a6faf6a4..3b93f66ec 100644 --- a/src/core/classes/erc-721.ts +++ b/src/core/classes/erc-721.ts @@ -2,7 +2,7 @@ import { ContractWrapper } from "./contract-wrapper"; import { BigNumber, BigNumberish, constants, Signer } from "ethers"; import { NFTMetadata, NFTMetadataOwner } from "../../schema/tokens/common"; import { IStorage } from "../interfaces/IStorage"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; +import { TransactionResult } from "../types"; import { UpdateableNetwork } from "../interfaces/contract"; import { SDKOptions, SDKOptionsSchema } from "../../schema/sdk-options"; import { fetchTokenMetadata } from "../../common/nft"; diff --git a/src/core/classes/factory.ts b/src/core/classes/factory.ts index 66cabb0d8..8c68a7b54 100644 --- a/src/core/classes/factory.ts +++ b/src/core/classes/factory.ts @@ -14,7 +14,7 @@ import { Vote } from "../../contracts/vote"; import { Token } from "../../contracts/token"; import { SDKOptions } from "../../schema/sdk-options"; import { IStorage } from "../interfaces/IStorage"; -import { NetworkOrSignerOrProvider, ValidContractClass } from "../types"; +import { ConnectionInfo, ValidContractClass } from "../types"; import { ContractWrapper } from "./contract-wrapper"; import { @@ -36,11 +36,11 @@ export class ContractFactory extends ContractWrapper { constructor( factoryAddr: string, - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, storage: IStorage, options?: SDKOptions, ) { - super(network, factoryAddr, TWFactory__factory.abi, options); + super(connection, factoryAddr, TWFactory__factory.abi, options); this.storage = storage; } @@ -123,11 +123,6 @@ export class ContractFactory extends ContractWrapper { case SignatureDrop.contractType: const signatureDropmetadata = SignatureDrop.schema.deploy.parse(metadata); - const chainId = await this.getChainID(); - const signMintAddress = getContractAddressByChainId(chainId, "sigMint"); - if (signMintAddress === AddressZero) { - throw new Error("SignatureDrop contract not deployable yet"); - } return [ await this.getSignerAddress(), signatureDropmetadata.name, diff --git a/src/core/classes/marketplace-auction.ts b/src/core/classes/marketplace-auction.ts index d6e4aeb82..a49985a1e 100644 --- a/src/core/classes/marketplace-auction.ts +++ b/src/core/classes/marketplace-auction.ts @@ -200,7 +200,7 @@ export class MarketplaceAuction { validateNewListingParam(listing); await handleTokenApproval( - this.contractWrapper.getSignerOrProvider(), + this.contractWrapper, this.getAddress(), listing.assetContractAddress, listing.tokenId, diff --git a/src/core/classes/marketplace-direct.ts b/src/core/classes/marketplace-direct.ts index ef0f3f499..789b6bf70 100644 --- a/src/core/classes/marketplace-direct.ts +++ b/src/core/classes/marketplace-direct.ts @@ -161,7 +161,7 @@ export class MarketplaceDirect { validateNewListingParam(listing); await handleTokenApproval( - this.contractWrapper.getSignerOrProvider(), + this.contractWrapper, this.getAddress(), listing.assetContractAddress, listing.tokenId, diff --git a/src/core/classes/registry.ts b/src/core/classes/registry.ts index 28a6700c8..9348ebc7f 100644 --- a/src/core/classes/registry.ts +++ b/src/core/classes/registry.ts @@ -1,10 +1,9 @@ import { TWRegistry, TWRegistry__factory } from "contracts"; import { SDKOptions } from "../../schema/sdk-options"; -import { NetworkOrSignerOrProvider } from "../types"; +import { ConnectionInfo } from "../types"; import { ContractWrapper } from "./contract-wrapper"; import { constants, utils } from "ethers"; import { TransactionResult } from ".."; -import { Provider } from "@ethersproject/providers"; /** * @internal @@ -12,10 +11,10 @@ import { Provider } from "@ethersproject/providers"; export class ContractRegistry extends ContractWrapper { constructor( registryAddress: string, - network: NetworkOrSignerOrProvider, + connection: ConnectionInfo, options?: SDKOptions, ) { - super(network, registryAddress, TWRegistry__factory.abi, options); + super(connection, registryAddress, TWRegistry__factory.abi, options); } public async getContractAddresses(walletAddress: string) { diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index e8bdfab29..1e3ccaff9 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -1,36 +1,37 @@ -import { ethers, Signer, providers } from "ethers"; -import EventEmitter from "eventemitter3"; -import { getReadOnlyProvider } from "../../constants/urls"; -import { - SDKOptions, - SDKOptionsOutput, - SDKOptionsSchema, -} from "../../schema/sdk-options"; -import { NetworkOrSignerOrProvider, SignerOrProvider } from "../types"; +import { providers, Signer } from "ethers"; +import { getProviderForChain } from "../../constants/urls"; +import { ConnectionInfo } from "../types"; import { ChainOrRpc } from "../../constants"; -import { Provider } from "@ethersproject/providers"; +import { EventEmitter2 } from "eventemitter2"; /** * @internal */ -export class RPCConnectionHandler extends EventEmitter { +export class RPCConnectionHandler extends EventEmitter2 { + private chainId: ChainOrRpc; private provider: providers.Provider; private signer: Signer | undefined; - constructor(provider: Provider, signer?: Signer) { + // TODO (rpc) needs the options to be passed in to override RPC urls + constructor(connection: ConnectionInfo) { super(); - this.signer = signer; - this.provider = provider; + this.chainId = connection.chainId; + this.provider = connection.provider + ? connection.provider + : getProviderForChain(connection.chainId); + this.signer = connection.signer; } + + // TODO (rpc) see if we need to expose this + // public updateProvider(provider: Provider) { + // this.provider = provider; + // } + /** * The function to call whenever the network changes, such as when the users connects their wallet, disconnects their wallet, the connected chain changes, etc. * - * @param network - a network, signer or provider that ethers js can interpret + * @param signer */ - public updateProvider(provider: Provider) { - this.provider = provider; - } - public updateSigner(signer: Signer | undefined) { this.signer = signer; } @@ -65,6 +66,14 @@ export class RPCConnectionHandler extends EventEmitter { public getSignerOrProvider(): Signer | providers.Provider { return this.getSigner() || this.getProvider(); } + + public getConnectionInfo(): ConnectionInfo { + return { + chainId: this.chainId, + signer: this.getSigner(), + provider: this.getProvider(), + }; + } // // /** ******************** // * PRIVATE FUNCTIONS diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 69193cadf..25d47d868 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -23,13 +23,9 @@ import { import { IpfsStorage } from "./classes/ipfs-storage"; import { RPCConnectionHandler } from "./classes/rpc-connection-handler"; import type { + ConnectionInfo, ContractForContractType, ContractType, -<<<<<<< HEAD -======= - NetworkOrSignerOrProvider, ->>>>>>> main - SignerOrProvider, ValidContractInstance, } from "./types"; import { IThirdwebContract__factory } from "contracts"; @@ -39,21 +35,9 @@ import invariant from "tiny-invariant"; import { TokenDrop } from "../contracts/token-drop"; import { ContractPublisher } from "./classes/contract-publisher"; import { ContractMetadata } from "./classes"; -import { - ChainOrRpc, -<<<<<<< HEAD - getContractAddressByChainId, - getProviderForNetwork, -} from "../constants"; -import { UserWallet } from "./wallet/UserWallet"; -import { Provider } from "@ethersproject/providers"; -======= - getProviderForNetwork, - getReadOnlyProvider, -} from "../constants"; +import { ChainOrRpc, getProviderForChain } from "../constants"; import { UserWallet } from "./wallet/UserWallet"; import { Multiwrap } from "../contracts/multiwrap"; ->>>>>>> main /** * The main entry point for the thirdweb SDK @@ -76,18 +60,19 @@ export class ThirdwebSDK extends RPCConnectionHandler { * @param signer - a ethers Signer to be used for transactions * @param network - the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url * @param options - the SDK options to use + * @param storage - the storage handler to use * @returns an instance of the SDK * * @beta */ static fromSigner( signer: Signer, - network?: ChainOrRpc, + network: ChainOrRpc, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const sdk = new ThirdwebSDK(network || signer, options, storage); - sdk.updateSignerOrProvider(signer); + const sdk = new ThirdwebSDK(network, signer, options, storage); + sdk.updateSigner(signer); return sdk; } @@ -106,6 +91,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { * @param privateKey - the private key - **DO NOT EXPOSE THIS TO THE PUBLIC** * @param network - the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url * @param options - the SDK options to use + * @param storage - the storage handler to use * @returns an instance of the SDK * * @beta @@ -116,12 +102,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const signerOrProvider = getProviderForNetwork(network); - const provider = Signer.isSigner(signerOrProvider) - ? signerOrProvider.provider - : typeof signerOrProvider === "string" - ? getReadOnlyProvider(signerOrProvider) - : signerOrProvider; + const provider = undefined; // getProviderForChain(network); const signer = new ethers.Wallet(privateKey, provider); return ThirdwebSDK.fromSigner(signer, network, options, storage); } @@ -158,34 +139,34 @@ export class ThirdwebSDK extends RPCConnectionHandler { public storage: RemoteStorage; constructor( - networkOrProvider: ChainOrRpc | Provider, + chainId: ChainOrRpc, signer: Signer | undefined = undefined, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ) { - const provider = getProviderForNetwork(networkOrProvider); - super(provider, signer); - this.storageHandler = storage; - this.storage = new RemoteStorage(storage); - this.deployer = new ContractDeployer(signerOrProvider, options, storage); - this.wallet = new UserWallet(signerOrProvider, options); - this._publisher = new ContractPublisher( - signerOrProvider, - this.options, - this.storageHandler, - ); - this.wallet.events.on("connected", (signer) => { - this.updateSigner(signer); - }); + const connection: ConnectionInfo = { chainId, signer }; + super(connection); try { this.options = SDKOptionsSchema.parse(options); } catch (optionParseError) { console.error( - "invalid contract options object passed, falling back to default options", - optionParseError, + "invalid contract options object passed, falling back to default options", + optionParseError, ); this.options = SDKOptionsSchema.parse({}); } + this.storageHandler = storage; + this.storage = new RemoteStorage(storage); + this.deployer = new ContractDeployer(connection, options, storage); + this.wallet = new UserWallet(connection, options); + this._publisher = new ContractPublisher( + connection, + this.options, + this.storageHandler, + ); + this.wallet.events.on("connected", (s: Signer) => { + this.propagateSignerUpdated(s); + }); } /** @@ -346,17 +327,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { const newContract = new KNOWN_CONTRACTS_MAP[ contractType as keyof typeof KNOWN_CONTRACTS_MAP -<<<<<<< HEAD - ]( - this.getProvider(), - this.getSigner(), - address, - this.storage, - this.options, - ); -======= - ](this.getSignerOrProvider(), address, this.storageHandler, this.options); ->>>>>>> main + ](this.getConnectionInfo(), address, this.storageHandler, this.options); this.contractCache.set(address, newContract); @@ -438,35 +409,6 @@ export class ThirdwebSDK extends RPCConnectionHandler { }); } - /** - * Update the active signer or provider for all contracts - * @param network - the new signer or provider - */ -<<<<<<< HEAD - public switchChain(network: ChainOrRpc | Provider) { - const provider = getProviderForNetwork(network); - super.updateProvider(provider); - // TODO FIXME do these - // this.deployer.updateSignerOrProvider(this.getSignerOrProvider()); - // this._publisher?.then((publisher) => { - // publisher.updateSignerOrProvider(this.getSignerOrProvider()); - // }); -======= - public override updateSignerOrProvider(network: NetworkOrSignerOrProvider) { - super.updateSignerOrProvider(network); - this.updateContractSignerOrProvider(); - } - - private updateContractSignerOrProvider() { - this.wallet.onNetworkUpdated(this.getSignerOrProvider()); - this.deployer.updateSignerOrProvider(this.getSignerOrProvider()); - this._publisher.updateSignerOrProvider(this.getSignerOrProvider()); ->>>>>>> main - for (const [, contract] of this.contractCache) { - contract.onNetworkUpdated(this.getSignerOrProvider()); - } - } - /** * Get an instance of a Custom ThirdwebContract * @param address - the address of the deployed contract @@ -500,7 +442,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { return this.contractCache.get(address) as SmartContract; } const contract = new SmartContract( - this.getSignerOrProvider(), + this.getConnectionInfo(), address, abi, this.storageHandler, @@ -516,4 +458,18 @@ export class ThirdwebSDK extends RPCConnectionHandler { public getPublisher(): ContractPublisher { return this._publisher; } + + /** + * Update the active signer for all contracts + * @internal + * @param signer + */ + private propagateSignerUpdated(signer: Signer | undefined) { + this.updateSigner(signer); + this.deployer.updateSigner(this.getSigner()); + this._publisher.updateSigner(this.getSigner()); + for (const [, contract] of this.contractCache) { + contract.onSignerUpdated(this.getSigner()); + } + } } diff --git a/src/core/types.ts b/src/core/types.ts index 029f7b3fa..a83c337cd 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -1,5 +1,6 @@ import { BigNumber, BytesLike, CallOverrides, Signer, providers } from "ethers"; import type { CONTRACTS_MAP, KNOWN_CONTRACTS_MAP } from "../contracts/maps"; +import { ChainOrRpc } from "../constants/index"; // --- utility types extracted from from ts-toolbelt --- // @@ -40,6 +41,12 @@ export type ValueOf = T[keyof T]; export type SignerOrProvider = Signer | providers.Provider; +export type ConnectionInfo = { + chainId: ChainOrRpc; + signer: Signer | undefined; + provider?: providers.Provider; +}; + export type BufferOrStringWithName = { data: Buffer | string; name?: string; diff --git a/src/core/wallet/UserWallet.ts b/src/core/wallet/UserWallet.ts index 7ec88f97e..c72f00081 100644 --- a/src/core/wallet/UserWallet.ts +++ b/src/core/wallet/UserWallet.ts @@ -1,5 +1,5 @@ import { RPCConnectionHandler } from "../classes/rpc-connection-handler"; -import { NetworkOrSignerOrProvider, TransactionResult } from "../types"; +import { ConnectionInfo, TransactionResult } from "../types"; import { SDKOptions } from "../../schema"; import invariant from "tiny-invariant"; import { Amount, CurrencyValue } from "../../types"; @@ -15,7 +15,6 @@ import { IERC20 } from "contracts"; import { BigNumber, providers, Signer } from "ethers"; import { EventEmitter2 } from "eventemitter2"; import StrictEventEmitter from "strict-event-emitter-types"; -import { Provider } from "@ethersproject/providers"; interface WalletEvent { connected: Signer; @@ -38,8 +37,9 @@ export class UserWallet { public events: StrictEventEmitter = new EventEmitter2(); - constructor(network: Provider, options: SDKOptions) { - this.readOnlyProvider = new RPCConnectionHandler(network); + constructor(connection: ConnectionInfo, options: SDKOptions) { + this.readOnlyProvider = new RPCConnectionHandler(connection); + this.signer = connection.signer; this.options = options; } @@ -180,7 +180,7 @@ export class UserWallet { private createErc20(currencyAddress: string) { return new ContractWrapper( - this.readOnlyProvider.getProvider(), + this.readOnlyProvider.getConnectionInfo(), currencyAddress, ERC20Abi, this.options, diff --git a/test/before-setup.ts b/test/before-setup.ts index 5a9fa85da..980d63037 100644 --- a/test/before-setup.ts +++ b/test/before-setup.ts @@ -245,8 +245,9 @@ before(async () => { process.env.contractMetadataRegistryAddress = metadataRegistry.address; storage = new MockStorage(); - sdk = new ThirdwebSDK( + sdk = ThirdwebSDK.fromSigner( signer, + RPC_URL, { gasSettings: { maxPriceInGwei: 10000, diff --git a/test/edition.test.ts b/test/edition.test.ts index 3a3bd15b9..89a77a508 100644 --- a/test/edition.test.ts +++ b/test/edition.test.ts @@ -22,7 +22,7 @@ describe("Edition Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.updateSigner(adminWallet); const address = await sdk.deployer.deployEdition({ name: `Testing bundle from SDK`, description: "Test contract from tests", diff --git a/yarn.lock b/yarn.lock index f411501a4..41a92c5ce 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2553,6 +2553,11 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== +eventemitter2@^6.4.5: + version "6.4.5" + resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" + integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== + eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -4670,6 +4675,11 @@ stream-http@^3.2.0: readable-stream "^3.6.0" xtend "^4.0.2" +strict-event-emitter-types@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f" + integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA== + string-argv@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" From 3ff22c886ddf04465546f0744d48bc41e5ae915b Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 17 Jun 2022 15:49:28 -0700 Subject: [PATCH 05/20] tests passing --- etc/sdk.api.md | 2 +- src/constants/urls.ts | 2 +- src/core/classes/contract-deployer.ts | 1 - src/core/classes/factory.ts | 4 +- src/core/classes/rpc-connection-handler.ts | 60 +++---------------- src/core/sdk.ts | 28 ++++++--- test/analytics.test.ts | 2 +- test/before-setup.ts | 2 +- test/custom.test.ts | 7 +-- test/edition-drop.test.ts | 26 ++++----- test/edition.test.ts | 2 +- test/events.test.ts | 4 +- test/gasless.test.ts | 4 +- test/marketplace.test.ts | 68 +++++++++++----------- test/multiwrap.test.ts | 2 +- test/nft-drop.test.ts | 20 +++---- test/nft.test.ts | 6 +- test/pack.test.ts | 2 +- test/publisher.test.ts | 18 +++--- test/registry.test.ts | 4 +- test/roles.test.ts | 2 +- test/royalty.test.ts | 2 +- test/sigdroptest.ts | 24 ++++---- test/signature-mint-1155.test.ts | 16 ++--- test/signature-mint-20.test.ts | 8 +-- test/signature-mint-721.test.ts | 12 ++-- test/split.test.ts | 2 +- test/token-drop.test.ts | 20 +++---- test/token.test.ts | 4 +- test/vote.test.ts | 12 ++-- test/wallet.test.ts | 10 ++-- 31 files changed, 169 insertions(+), 207 deletions(-) diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 2fe36bbab..f23a926c3 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -1975,7 +1975,7 @@ export interface GaslessTransaction { // Warning: (ae-internal-missing-underscore) The name "getContractAddressByChainId" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -export function getContractAddressByChainId(chainId: SUPPORTED_CHAIN_ID | ChainId.Hardhat, contractName: keyof typeof CONTRACT_ADDRESSES[SUPPORTED_CHAIN_ID]): string; +export function getContractAddressByChainId(chainId: SUPPORTED_CHAIN_ID | ChainId.Hardhat | ChainId.Localhost, contractName: keyof typeof CONTRACT_ADDRESSES[SUPPORTED_CHAIN_ID]): string; // Warning: (ae-internal-missing-underscore) The name "getContractPublisherAddress" should be prefixed with an underscore because the declaration is marked as @internal // diff --git a/src/constants/urls.ts b/src/constants/urls.ts index eda8577a2..20372a06f 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -105,7 +105,7 @@ export function getRpcUrl( if (chainId in fullRpcMap) { return fullRpcMap[chainId]; } - throw new Error(`Unrecognized chain name or RPC url: ${network}`); + throw new Error(`Unrecognized chain name or RPC url: ${network}.`); } /** diff --git a/src/core/classes/contract-deployer.ts b/src/core/classes/contract-deployer.ts index 1bfec431f..66dd2ccd8 100644 --- a/src/core/classes/contract-deployer.ts +++ b/src/core/classes/contract-deployer.ts @@ -386,7 +386,6 @@ export class ContractDeployer extends RPCConnectionHandler { return (this._factory = this.getProvider() .getNetwork() .then(async ({ chainId }) => { - console.log("chainId", chainId); const factoryAddress = getContractAddressByChainId( chainId, "twFactory", diff --git a/src/core/classes/factory.ts b/src/core/classes/factory.ts index 8c68a7b54..a0740374e 100644 --- a/src/core/classes/factory.ts +++ b/src/core/classes/factory.ts @@ -1,7 +1,6 @@ import { TWFactory, TWFactory__factory } from "contracts"; import { BigNumber, Contract, ethers, constants } from "ethers"; import { z } from "zod"; -import { CONTRACTS_MAP, REMOTE_CONTRACT_NAME } from "../../contracts/maps"; import { Edition } from "../../contracts/edition"; import { EditionDrop } from "../../contracts/edition-drop"; import { NFTCollection } from "../../contracts/nft-collection"; @@ -16,17 +15,16 @@ import { SDKOptions } from "../../schema/sdk-options"; import { IStorage } from "../interfaces/IStorage"; import { ConnectionInfo, ValidContractClass } from "../types"; import { ContractWrapper } from "./contract-wrapper"; +import { CONTRACTS_MAP, REMOTE_CONTRACT_NAME } from "../../contracts/maps"; import { CONTRACT_ADDRESSES, - getContractAddressByChainId, OZ_DEFENDER_FORWARDER_ADDRESS, SUPPORTED_CHAIN_IDS, } from "../../constants"; import { TokenDrop } from "../../contracts/token-drop"; import { ProxyDeployedEvent } from "contracts/TWFactory"; import { Multiwrap } from "../../contracts/multiwrap"; -import { AddressZero } from "@ethersproject/constants"; /** * @internal diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 1e3ccaff9..ae2a66c6a 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -31,6 +31,7 @@ export class RPCConnectionHandler extends EventEmitter2 { * The function to call whenever the network changes, such as when the users connects their wallet, disconnects their wallet, the connected chain changes, etc. * * @param signer + * @internal */ public updateSigner(signer: Signer | undefined) { this.signer = signer; @@ -46,6 +47,7 @@ export class RPCConnectionHandler extends EventEmitter2 { /** * Explicitly get the active signer. * @returns the active signer, if there is one + * @internal */ public getSigner(): Signer | undefined { return this.signer; @@ -54,19 +56,23 @@ export class RPCConnectionHandler extends EventEmitter2 { /** * Explicitly get the active signer. * @returns the active provider + * @internal */ public getProvider(): providers.Provider { return this.provider; } /** - * * @returns the current signer if there is one, otherwise the active provider + * @internal */ public getSignerOrProvider(): Signer | providers.Provider { return this.getSigner() || this.getProvider(); } + /** + * @internal + */ public getConnectionInfo(): ConnectionInfo { return { chainId: this.chainId, @@ -74,56 +80,4 @@ export class RPCConnectionHandler extends EventEmitter2 { provider: this.getProvider(), }; } - // - // /** ******************** - // * PRIVATE FUNCTIONS - // *********************/ - // - // private getSignerAndProvider( - // network: NetworkOrSignerOrProvider, - // options: SDKOptions, - // ): [Signer | undefined, providers.Provider] { - // let signer: Signer | undefined; - // let provider: providers.Provider | undefined; - // - // if (Signer.isSigner(network)) { - // signer = network; - // if (network.provider) { - // provider = network.provider; - // } - // } - // - // if (options?.readonlySettings) { - // provider = getReadOnlyProvider( - // options.readonlySettings.rpcUrl, - // options.readonlySettings.chainId, - // ); - // } - // - // if (!provider) { - // if (providers.Provider.isProvider(network)) { - // provider = network; - // } else if (!Signer.isSigner(network)) { - // if (typeof network === "string") { - // provider = getReadOnlyProvider( - // network, - // options?.readonlySettings?.chainId, - // ); - // } else { - // // no a signer, not a provider, not a string? try with default provider - // provider = ethers.getDefaultProvider(network); - // } - // } - // } - // - // if (!provider) { - // // we should really never hit this case! - // provider = ethers.getDefaultProvider(); - // console.error( - // "No provider found, using default provider on default chain!", - // ); - // } - // - // return [signer, provider]; - // } } diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 25d47d868..c7198b661 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -1,4 +1,4 @@ -import { ContractInterface, ethers, Signer } from "ethers"; +import { ContractInterface, ethers, providers, Signer } from "ethers"; import { IStorage } from "./interfaces/IStorage"; import { RemoteStorage } from "./classes/remote-storage"; import { @@ -35,7 +35,7 @@ import invariant from "tiny-invariant"; import { TokenDrop } from "../contracts/token-drop"; import { ContractPublisher } from "./classes/contract-publisher"; import { ContractMetadata } from "./classes"; -import { ChainOrRpc, getProviderForChain } from "../constants"; +import { ChainOrRpc } from "../constants"; import { UserWallet } from "./wallet/UserWallet"; import { Multiwrap } from "../contracts/multiwrap"; @@ -71,9 +71,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const sdk = new ThirdwebSDK(network, signer, options, storage); - sdk.updateSigner(signer); - return sdk; + return new ThirdwebSDK(network, signer, options, storage); } /** @@ -102,8 +100,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const provider = undefined; // getProviderForChain(network); - const signer = new ethers.Wallet(privateKey, provider); + const signer = new ethers.Wallet(privateKey); return ThirdwebSDK.fromSigner(signer, network, options, storage); } @@ -144,7 +141,22 @@ export class ThirdwebSDK extends RPCConnectionHandler { options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ) { - const connection: ConnectionInfo = { chainId, signer }; + // Throw helpful error for old usages of this constructor + if (Signer.isSigner(chainId)) { + throw new Error( + "Please use 'ThirdwebSDK.fromSigner(signer, chainId)' to create a new ThirdwebSDK with a signer. Example: 'const sdk = ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", + ); + } + if (providers.Provider.isProvider(chainId)) { + throw new Error( + "Please pass in a ChainId instead of a Provider to create a new read-only ThirdwebSDK. Example: 'const sdk = new ThirdwebSDK(ChainId.Polygon)'. To initialize the SDK with a signer, use: 'ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", + ); + } + const connection: ConnectionInfo = { + chainId, + signer, + provider: signer?.provider, + }; super(connection); try { this.options = SDKOptionsSchema.parse(options); diff --git a/test/analytics.test.ts b/test/analytics.test.ts index 5c3f5483e..ae67d2530 100644 --- a/test/analytics.test.ts +++ b/test/analytics.test.ts @@ -16,7 +16,7 @@ describe("ContractAnalytics", () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployBuiltInContract( NFTCollection.contractType, { diff --git a/test/before-setup.ts b/test/before-setup.ts index 980d63037..e7402719b 100644 --- a/test/before-setup.ts +++ b/test/before-setup.ts @@ -247,7 +247,7 @@ before(async () => { storage = new MockStorage(); sdk = ThirdwebSDK.fromSigner( signer, - RPC_URL, + ChainId.Hardhat, { gasSettings: { maxPriceInGwei: 10000, diff --git a/test/custom.test.ts b/test/custom.test.ts index ad567cbc2..cfd9ad317 100644 --- a/test/custom.test.ts +++ b/test/custom.test.ts @@ -2,7 +2,6 @@ import { expectError, signers } from "./before-setup"; import { expect } from "chai"; import invariant from "tiny-invariant"; import { - DropERC721__factory, SignatureDrop__factory, TokenERC1155__factory, TokenERC20__factory, @@ -11,7 +10,7 @@ import { } from "contracts"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { uploadContractMetadata } from "./publisher.test"; -import { IpfsStorage, ThirdwebSDK } from "../src"; +import { ChainId, IpfsStorage, ThirdwebSDK } from "../src"; import { ethers } from "ethers"; require("./before-setup"); @@ -33,13 +32,13 @@ describe("Custom Contracts", async () => { before(async () => { [adminWallet, samWallet, bobWallet] = signers; - sdk = new ThirdwebSDK(adminWallet); + sdk = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); storage = new IpfsStorage(); simpleContractUri = await uploadContractMetadata("Greeter", storage); }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const publisher = sdk.getPublisher(); customContractAddress = await publisher.deployContract( simpleContractUri, diff --git a/test/edition-drop.test.ts b/test/edition-drop.test.ts index bddce7895..2621915ff 100644 --- a/test/edition-drop.test.ts +++ b/test/edition-drop.test.ts @@ -31,7 +31,7 @@ describe("Edition Drop Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployEditionDrop({ name: `Testing bundle drop from SDK`, description: "Test contract from tests", @@ -100,7 +100,7 @@ describe("Edition Drop Contract", async () => { ]); for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await bdContract.claim("0", 1); } const bundle = await bdContract.get("0"); @@ -138,7 +138,7 @@ describe("Edition Drop Contract", async () => { for (const member of testWallets) { try { - sdk.updateSignerOrProvider(member); + sdk.wallet.connect(member); await bdContract.claim("0", 1); } catch (e) { if (member !== w4) { @@ -207,10 +207,10 @@ describe("Edition Drop Contract", async () => { ], }, ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); await bdContract.claim(0, 2); try { - await sdk.updateSignerOrProvider(w2); + await sdk.wallet.connect(w2); await bdContract.claim(0, 2); } catch (e) { expectError(e, "invalid quantity proof"); @@ -248,7 +248,7 @@ describe("Edition Drop Contract", async () => { await bdContract.claimConditions.set("1", [{}]); await bdContract.claim("0", 1); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await bdContract.claim("0", 1); // TODO some asserts @@ -258,9 +258,9 @@ describe("Edition Drop Contract", async () => { // adminWallet.address, // ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); await bdContract.claim("1", 1); - await sdk.updateSignerOrProvider(w2); + await sdk.wallet.connect(w2); await bdContract.claim("1", 1); const ownedW1 = await bdContract.getOwned(w1.address); @@ -276,11 +276,11 @@ describe("Edition Drop Contract", async () => { }, ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); const canClaimW1 = await bdContract.claimConditions.canClaim("0", 1); assert.isTrue(canClaimW1, "w1 should be able to claim"); - await sdk.updateSignerOrProvider(w2); + await sdk.wallet.connect(w2); const canClaimW2 = await bdContract.claimConditions.canClaim("0", 1); assert.isFalse(canClaimW2, "w2 should not be able to claim"); }); @@ -489,7 +489,7 @@ describe("Edition Drop Contract", async () => { waitInSeconds: 24 * 60 * 60, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await bdContract.claim("0", 1); const reasons = @@ -518,7 +518,7 @@ describe("Edition Drop Contract", async () => { currencyAddress: NATIVE_TOKEN_ADDRESS, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const reasons = await bdContract.claimConditions.getClaimIneligibilityReasons( @@ -552,7 +552,7 @@ describe("Edition Drop Contract", async () => { currencyAddress: currency.getAddress(), }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const reasons = await bdContract.claimConditions.getClaimIneligibilityReasons( diff --git a/test/edition.test.ts b/test/edition.test.ts index 89a77a508..641b32d3b 100644 --- a/test/edition.test.ts +++ b/test/edition.test.ts @@ -22,7 +22,7 @@ describe("Edition Contract", async () => { }); beforeEach(async () => { - sdk.updateSigner(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployEdition({ name: `Testing bundle from SDK`, description: "Test contract from tests", diff --git a/test/events.test.ts b/test/events.test.ts index 7602d094f..b085e9e72 100644 --- a/test/events.test.ts +++ b/test/events.test.ts @@ -2,7 +2,7 @@ import { ethers, Wallet } from "ethers"; import { sdk } from "./before-setup"; import { EventType } from "../src/constants/events"; import { expect } from "chai"; -import { ContractEvent, NFTDrop, ThirdwebSDK } from "../src"; +import { ChainId, ContractEvent, NFTDrop, ThirdwebSDK } from "../src"; import { AddressZero } from "@ethersproject/constants"; global.fetch = require("cross-fetch"); @@ -64,7 +64,7 @@ describe("Events", async () => { const RPC_URL = "https://rpc-mumbai.maticvigil.com/"; const provider = ethers.getDefaultProvider(RPC_URL); const wallet = Wallet.createRandom().connect(provider); - const esdk = new ThirdwebSDK(wallet, { + const esdk = ThirdwebSDK.fromSigner(wallet, ChainId.Hardhat, { gasless: { openzeppelin: { relayerUrl: "https://google.com", // TODO test relayer url? diff --git a/test/gasless.test.ts b/test/gasless.test.ts index 8b2967023..ad72a7630 100644 --- a/test/gasless.test.ts +++ b/test/gasless.test.ts @@ -1,5 +1,5 @@ import { ethers, Wallet } from "ethers"; -import { EditionDrop, ThirdwebSDK } from "../src"; +import { ChainId, EditionDrop, ThirdwebSDK } from "../src"; const RPC_URL = "https://rpc-mumbai.maticvigil.com/"; @@ -12,7 +12,7 @@ describe("Gasless Forwarder", async () => { const BUNDLE_DROP_ADDRESS = "0xEBed8e37a32660dbCeeeC19cCBb952b7d214f008"; const provider = ethers.getDefaultProvider(RPC_URL); const wallet = Wallet.createRandom().connect(provider); - const sdk = new ThirdwebSDK(wallet, { + const sdk = ThirdwebSDK.fromSigner(wallet, ChainId.Hardhat, { gasless: { biconomy: { apiKey: process.env.BICONOMY_API_KEY as string, diff --git a/test/marketplace.test.ts b/test/marketplace.test.ts index 07bc29d1f..156dfc123 100644 --- a/test/marketplace.test.ts +++ b/test/marketplace.test.ts @@ -49,7 +49,7 @@ describe("Marketplace Contract", async () => { await jsonProvider.send("hardhat_reset", []); [adminWallet, samWallet, bobWallet, abbyWallet, w1, w2, w3, w4] = signers; - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); marketplaceContract = sdk.getMarketplace( await sdk.deployer.deployBuiltInContract(Marketplace.contractType, { @@ -185,7 +185,7 @@ describe("Marketplace Contract", async () => { reservePricePerToken: 0.0001, }); const id = tx.id; - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); await marketplaceContract.auction.makeBid(id, 0.1); }); @@ -235,7 +235,7 @@ describe("Marketplace Contract", async () => { describe("Listing Filters", () => { beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); await createDirectListing(dummyNftContract.getAddress(), 0); await createAuctionListing(dummyNftContract.getAddress(), 1); @@ -245,7 +245,7 @@ describe("Marketplace Contract", async () => { await dummyBundleContract.transfer(samWallet.address, "0", 10); await dummyBundleContract.transfer(samWallet.address, "1", 10); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await createDirectListing(dummyBundleContract.getAddress(), 0, 10); await createAuctionListing(dummyBundleContract.getAddress(), 1, 10); }); @@ -304,7 +304,7 @@ describe("Marketplace Contract", async () => { let auctionListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); directListingId = await createDirectListing( dummyNftContract.getAddress(), 0, @@ -318,7 +318,7 @@ describe("Marketplace Contract", async () => { it("should return only active listings", async () => { const before = await marketplaceContract.getActiveListings(); expect(before.length).to.eq(1); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await marketplaceContract.buyoutListing(directListingId, 1); const afterDirectBuyout = await marketplaceContract.getActiveListings(); expect(afterDirectBuyout.length).to.eq(0); @@ -374,7 +374,7 @@ describe("Marketplace Contract", async () => { let auctionListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); directListingId = await createDirectListing( dummyNftContract.getAddress(), 0, @@ -387,7 +387,7 @@ describe("Marketplace Contract", async () => { }); it("should allow the seller to accept an offer", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf( bobWallet.address, @@ -406,7 +406,7 @@ describe("Marketplace Contract", async () => { new Date(Date.now() + 60 * 60 * 24 * 10 * 1000), ); - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); await marketplaceContract.direct.acceptOffer( directListingId, bobWallet.address, @@ -421,7 +421,7 @@ describe("Marketplace Contract", async () => { }); it("should allow a buyer to buyout a direct listing", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf( bobWallet.address, @@ -441,7 +441,7 @@ describe("Marketplace Contract", async () => { }); it("should allow a buyer to buyout a direct listing after making an offer", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf( bobWallet.address, @@ -467,7 +467,7 @@ describe("Marketplace Contract", async () => { }); it("should allow a buyer to buyout a direct listing for someone else", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf(w4.address); assert.equal( @@ -485,7 +485,7 @@ describe("Marketplace Contract", async () => { }); it("should allow offers to be made on direct listings", async () => { - sdk.updateSignerOrProvider(bobWallet); + sdk.wallet.connect(bobWallet); await marketplaceContract.direct.makeOffer( directListingId, 1, @@ -505,7 +505,7 @@ describe("Marketplace Contract", async () => { ); assert.equal(offer.listingId.toString(), directListingId.toString()); - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); await marketplaceContract.direct.makeOffer( directListingId, 1, @@ -535,7 +535,7 @@ describe("Marketplace Contract", async () => { }); it("should allow bids by the same person", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await marketplaceContract.auction.makeBid(auctionListingId, 0.06); await marketplaceContract.auction.makeBid(auctionListingId, 0.08); @@ -551,7 +551,7 @@ describe("Marketplace Contract", async () => { }); it("should allow bids to be made on auction listings", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await marketplaceContract.auction.makeBid(auctionListingId, 0.06); let winningBid = (await marketplaceContract.auction.getWinningBid( @@ -569,7 +569,7 @@ describe("Marketplace Contract", async () => { ); // Make a higher winning bid - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await marketplaceContract.auction.makeBid(auctionListingId, 0.09); winningBid = (await marketplaceContract.auction.getWinningBid( @@ -592,7 +592,7 @@ describe("Marketplace Contract", async () => { let auctionListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); directListingId = await createDirectListing( dummyNftContract.getAddress(), 0, @@ -628,7 +628,7 @@ describe("Marketplace Contract", async () => { let auctionListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); auctionListingId = await createAuctionListing( dummyNftContract.getAddress(), 1, @@ -636,7 +636,7 @@ describe("Marketplace Contract", async () => { }); it("should automatically award a buyout", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf( bobWallet.address, ); @@ -659,7 +659,7 @@ describe("Marketplace Contract", async () => { // has ended and so the call to `acceptWinningBid` is failing on this // test because the listing is still active. it.skip("should allow the seller to accept the winning bid", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf( bobWallet.address, ); @@ -680,7 +680,7 @@ describe("Marketplace Contract", async () => { "Bob should be the winning bidder", ); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await marketplaceContract.auction.closeListing(auctionListingId); const balance = await dummyNftContract.balanceOf(bobWallet.address); assert.equal( @@ -693,7 +693,7 @@ describe("Marketplace Contract", async () => { }); it("should throw an error if a bid being placed is not a winning bid", async () => { - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const currentBalance = await dummyNftContract.balanceOf( bobWallet.address, ); @@ -723,7 +723,7 @@ describe("Marketplace Contract", async () => { reservePricePerToken: 0.2, }) ).id; - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await marketplaceContract.buyoutListing(id); const balance = await dummyBundleContract.balanceOf( @@ -739,7 +739,7 @@ describe("Marketplace Contract", async () => { let auctionListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); directListingId = await createDirectListing( dummyNftContract.getAddress(), 0, @@ -837,7 +837,7 @@ describe("Marketplace Contract", async () => { }); it("should distribute the tokens when a listing closes", async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); const listingId = ( await marketplaceContract.auction.createListing({ assetContractAddress: dummyNftContract.getAddress(), @@ -851,7 +851,7 @@ describe("Marketplace Contract", async () => { }) ).id; - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await marketplaceContract.auction.makeBid(listingId, 2); @@ -878,7 +878,7 @@ describe("Marketplace Contract", async () => { /** * Seller */ - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); const oldTokenBalance = await customTokenContract.balanceOf( adminWallet.address, ); @@ -909,7 +909,7 @@ describe("Marketplace Contract", async () => { let directListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); directListingId = await createDirectListing( dummyNftContract.getAddress(), 0, @@ -1041,7 +1041,7 @@ describe("Marketplace Contract", async () => { describe("Buffers", () => { beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); }); it("should set the correct bid buffer default of 15 minutes", async () => { @@ -1071,7 +1071,7 @@ describe("Marketplace Contract", async () => { let directListingId: BigNumber; beforeEach(async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); directListingId = await createDirectListing( dummyNftContract.getAddress(), 0, @@ -1079,10 +1079,10 @@ describe("Marketplace Contract", async () => { }); it("should throw an error when trying to buyout an invalid direct listing", async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); await dummyNftContract.transfer(samWallet.address, "0"); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); try { await marketplaceContract.direct.buyoutListing(directListingId, 1); @@ -1093,7 +1093,7 @@ describe("Marketplace Contract", async () => { }); it("should not return invalid direct listings", async () => { - await sdk.updateSignerOrProvider(adminWallet); + await sdk.wallet.connect(adminWallet); await dummyNftContract.transfer(samWallet.address, "0"); const allListings = await marketplaceContract.getAllListings(); diff --git a/test/multiwrap.test.ts b/test/multiwrap.test.ts index 788a37640..993f8be8b 100644 --- a/test/multiwrap.test.ts +++ b/test/multiwrap.test.ts @@ -19,7 +19,7 @@ describe("Multiwrap Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployMultiwrap({ name: `Testing multiwrap from SDK`, symbol: `TEST`, diff --git a/test/nft-drop.test.ts b/test/nft-drop.test.ts index e219af06f..bb46c6c12 100644 --- a/test/nft-drop.test.ts +++ b/test/nft-drop.test.ts @@ -25,7 +25,7 @@ describe("NFT Drop Contract", async () => { beforeEach(async () => { [adminWallet, samWallet, bobWallet, abbyWallet, w1, w2, w3, w4] = signers; - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployNFTDrop({ name: `Testing drop from SDK`, description: "Test contract from tests", @@ -157,7 +157,7 @@ describe("NFT Drop Contract", async () => { */ for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await dropContract.claim(1); } }); @@ -185,12 +185,12 @@ describe("NFT Drop Contract", async () => { */ for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await dropContract.claim(1); } try { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await dropContract.claim(1); assert.fail("should have thrown"); } catch (e) { @@ -251,7 +251,7 @@ describe("NFT Drop Contract", async () => { { name: "name", description: "description" }, ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); try { await dropContract.claim(1); } catch (err: any) { @@ -288,11 +288,11 @@ describe("NFT Drop Contract", async () => { ], }, ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); const tx = await dropContract.claim(2); expect(tx.length).to.eq(2); try { - await sdk.updateSignerOrProvider(w2); + await sdk.wallet.connect(w2); await dropContract.claim(2); } catch (e) { expectError(e, "invalid quantity proof"); @@ -447,7 +447,7 @@ describe("NFT Drop Contract", async () => { waitInSeconds: 24 * 60 * 60, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await dropContract.claim(1); const reasons = @@ -471,7 +471,7 @@ describe("NFT Drop Contract", async () => { currencyAddress: NATIVE_TOKEN_ADDRESS, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const reasons = await dropContract.claimConditions.getClaimIneligibilityReasons( @@ -501,7 +501,7 @@ describe("NFT Drop Contract", async () => { currencyAddress, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const reasons = await dropContract.claimConditions.getClaimIneligibilityReasons( diff --git a/test/nft.test.ts b/test/nft.test.ts index d711f53eb..7cc795f65 100644 --- a/test/nft.test.ts +++ b/test/nft.test.ts @@ -18,7 +18,7 @@ describe("NFT Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployBuiltInContract( NFTCollection.contractType, { @@ -50,7 +50,7 @@ describe("NFT Contract", async () => { it("should let authorized minters mint with detected features", async () => { await nftContract.roles.grant("minter", samWallet.address); - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); await nftContract.mint?.to(samWallet.address, { name: "Test1", }); @@ -152,7 +152,7 @@ describe("NFT Contract", async () => { }); it("should not be able to mint without permission", async () => { - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); await expect( nftContract.mintToSelf({ name: "Test2", diff --git a/test/pack.test.ts b/test/pack.test.ts index 45f3ca75e..f5b67a5c9 100644 --- a/test/pack.test.ts +++ b/test/pack.test.ts @@ -34,7 +34,7 @@ describe("Pack Contract", async () => { }; beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); packContract = sdk.getPack( await sdk.deployer.deployBuiltInContract(Pack.contractType, { name: "Pack Contract", diff --git a/test/publisher.test.ts b/test/publisher.test.ts index 5b811eb4b..da4701ba4 100644 --- a/test/publisher.test.ts +++ b/test/publisher.test.ts @@ -1,7 +1,7 @@ import { signers } from "./before-setup"; import { readFileSync } from "fs"; import { expect } from "chai"; -import { IpfsStorage, isFeatureEnabled, ThirdwebSDK } from "../src"; +import { ChainId, IpfsStorage, isFeatureEnabled, ThirdwebSDK } from "../src"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import invariant from "tiny-invariant"; import { DropERC721__factory, TokenERC721__factory } from "../typechain"; @@ -40,7 +40,7 @@ describe("Publishing", async () => { before("Upload abis", async () => { [adminWallet, samWallet, bobWallet] = signers; - sdk = new ThirdwebSDK(adminWallet); + sdk = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); storage = new IpfsStorage(); simpleContractUri = await uploadContractMetadata("Greeter", storage); contructorParamsContractUri = await uploadContractMetadata( @@ -50,7 +50,7 @@ describe("Publishing", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); }); it("should extract functions", async () => { @@ -101,7 +101,7 @@ describe("Publishing", async () => { }); it("should publish multiple versions", async () => { - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); const publisher = sdk.getPublisher(); let id = ""; for (let i = 0; i < 5; i++) { @@ -116,7 +116,7 @@ describe("Publishing", async () => { }); it("should publish constructor params contract", async () => { - sdk.updateSignerOrProvider(bobWallet); + sdk.wallet.connect(bobWallet); const publisher = sdk.getPublisher(); const tx = await publisher.publish(contructorParamsContractUri); const contract = await tx.data(); @@ -147,7 +147,7 @@ describe("Publishing", async () => { }); it("SimpleAzuki enumerable", async () => { - const realSDK = new ThirdwebSDK(adminWallet); + const realSDK = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); const pub = await realSDK.getPublisher(); const ipfsUri = "ipfs://QmTKKUUEU6GnG7VEEAAXpveeirREC1JNYntVJGhHKhqcYZ/0"; const tx = await pub.publish(ipfsUri); @@ -165,7 +165,7 @@ describe("Publishing", async () => { }); it("AzukiWithMinting mintable", async () => { - const realSDK = new ThirdwebSDK(adminWallet); + const realSDK = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); const pub = await realSDK.getPublisher(); const ipfsUri = "ipfs://QmPPPoKk2mwoxBVTW5qMMNwaV4Ja5qDoq7fFZNFFvr3YsW/1"; const tx = await pub.publish(ipfsUri); @@ -196,7 +196,7 @@ describe("Publishing", async () => { }); it("ERC721Dropable feature detection", async () => { - const realSDK = new ThirdwebSDK(adminWallet); + const realSDK = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); const pub = realSDK.getPublisher(); const ipfsUri = "ipfs://QmWaidQMSYHPzYYZCxMc2nSk2vrD28mS43Xc9k7QFyAGja/0"; const addr = await pub.deployContract(ipfsUri, []); @@ -225,7 +225,7 @@ describe("Publishing", async () => { }); it("Constructor params with tuples", async () => { - const realSDK = new ThirdwebSDK(adminWallet); + const realSDK = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); const pub = await realSDK.getPublisher(); const ipfsUri = "ipfs://QmZQa56Cj1gFnZgKSkvGE5uzhaQrQV3nU6upDWDusCaCwY/0"; const addr = await pub.deployContract(ipfsUri, [ diff --git a/test/registry.test.ts b/test/registry.test.ts index 152c22de8..c2d811a5e 100644 --- a/test/registry.test.ts +++ b/test/registry.test.ts @@ -17,7 +17,7 @@ describe("Contract Registry", () => { }); it("should allow adding and removing contracts", async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); registry = await sdk.deployer.getRegistry(); address = await sdk.deployer.deployNFTCollection({ @@ -38,7 +38,7 @@ describe("Contract Registry", () => { }); it("should allow deploying after removing", async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); registry = await sdk.deployer.getRegistry(); address = await sdk.deployer.deployNFTCollection({ diff --git a/test/roles.test.ts b/test/roles.test.ts index 0e78f6cba..e92ca0d6c 100644 --- a/test/roles.test.ts +++ b/test/roles.test.ts @@ -19,7 +19,7 @@ describe("Roles Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); bundleContract = sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { diff --git a/test/royalty.test.ts b/test/royalty.test.ts index 9c58e73ea..2e6907679 100644 --- a/test/royalty.test.ts +++ b/test/royalty.test.ts @@ -18,7 +18,7 @@ describe("Royalties", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); bundleContract = sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { diff --git a/test/sigdroptest.ts b/test/sigdroptest.ts index 4b7d5b671..e6e33ffa4 100644 --- a/test/sigdroptest.ts +++ b/test/sigdroptest.ts @@ -37,7 +37,7 @@ describe("Signature drop tests", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); signatureDropContract = sdk.getSignatureDrop( await sdk.deployer.deployBuiltInContract(SignatureDrop.contractType, { @@ -217,12 +217,12 @@ describe("Signature drop tests", async () => { }); it("should allow a valid voucher to mint", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx = await signatureDropContract.signature.mint(v1); const newId = (await signatureDropContract.get(tx.id)).metadata.id; assert.equal(newId.toString(), "0"); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx2 = await signatureDropContract.signature.mint(v2); const newId2 = (await signatureDropContract.get(tx2.id)).metadata.id; assert.equal(newId2.toString(), "1"); @@ -250,7 +250,7 @@ describe("Signature drop tests", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await signatureDropContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -270,7 +270,7 @@ describe("Signature drop tests", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await signatureDropContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -290,7 +290,7 @@ describe("Signature drop tests", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await signatureDropContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -535,7 +535,7 @@ describe("Signature drop tests", async () => { */ for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await signatureDropContract.claim(1); } }); @@ -561,12 +561,12 @@ describe("Signature drop tests", async () => { */ for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await signatureDropContract.claim(1); } try { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await signatureDropContract.claim(1); assert.fail("should have thrown"); } catch (e) { @@ -617,7 +617,7 @@ describe("Signature drop tests", async () => { { name: "name", description: "description" }, ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); try { await signatureDropContract.claim(1); } catch (err: any) { @@ -652,11 +652,11 @@ describe("Signature drop tests", async () => { { address: w2.address, maxClaimable: 1 }, ], }); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); const tx = await signatureDropContract.claim(2); expect(tx.length).to.eq(2); try { - await sdk.updateSignerOrProvider(w2); + await sdk.wallet.connect(w2); await signatureDropContract.claim(2); } catch (e) { expectError(e, "invalid quantity proof"); diff --git a/test/signature-mint-1155.test.ts b/test/signature-mint-1155.test.ts index 938cad726..50fe0c1bd 100644 --- a/test/signature-mint-1155.test.ts +++ b/test/signature-mint-1155.test.ts @@ -25,7 +25,7 @@ describe("Edition sig minting", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); editionContract = sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { @@ -159,7 +159,7 @@ describe("Edition sig minting", async () => { } const batch = await editionContract.signature.generateBatch(payloads); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx = await editionContract.signature.mintBatch(batch); expect(tx.length).to.eq(10); expect(tx[0].id.toNumber()).to.eq(0); @@ -207,12 +207,12 @@ describe("Edition sig minting", async () => { }); it("should allow a valid voucher to mint", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx = await editionContract.signature.mint(v1); const newId = (await editionContract.get(tx.id)).metadata.id; assert.equal(newId.toString(), "0"); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx2 = await editionContract.signature.mint(v2); const newId2 = (await editionContract.get(tx2.id)).metadata.id; assert.equal(newId2.toString(), "1"); @@ -249,7 +249,7 @@ describe("Edition sig minting", async () => { quantity: "1", metadata: "", }); - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); await editionContract.signature.mint(payload); const newBalance = await editionContract.balanceOf( samWallet.address, @@ -270,7 +270,7 @@ describe("Edition sig minting", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await editionContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -290,7 +290,7 @@ describe("Edition sig minting", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await editionContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -310,7 +310,7 @@ describe("Edition sig minting", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await editionContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( diff --git a/test/signature-mint-20.test.ts b/test/signature-mint-20.test.ts index ef4135f19..ae59645bd 100644 --- a/test/signature-mint-20.test.ts +++ b/test/signature-mint-20.test.ts @@ -21,7 +21,7 @@ describe("Token sig minting", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); contract = sdk.getToken( await sdk.deployer.deployToken({ @@ -131,7 +131,7 @@ describe("Token sig minting", async () => { const batch = await Promise.all( payloads.map(async (p) => await contract.signature.generate(p)), ); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await contract.signature.mintBatch(batch); const balance = await contract.balanceOf(samWallet.address); expect(balance.displayValue).to.eq("10.0"); @@ -144,7 +144,7 @@ describe("Token sig minting", async () => { quantity: 10, currencyAddress: tokenAddress, }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await contract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -159,7 +159,7 @@ describe("Token sig minting", async () => { price: 1, quantity: 0.23, }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await contract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( diff --git a/test/signature-mint-721.test.ts b/test/signature-mint-721.test.ts index 6c17e0b7f..bbaef6583 100644 --- a/test/signature-mint-721.test.ts +++ b/test/signature-mint-721.test.ts @@ -25,7 +25,7 @@ describe("NFT sig minting", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); nftContract = sdk.getNFTCollection( await sdk.deployer.deployBuiltInContract(NFTCollection.contractType, { @@ -158,7 +158,7 @@ describe("NFT sig minting", async () => { const batch = await Promise.all( payloads.map(async (p) => await nftContract.signature.generate(p)), ); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx = await nftContract.signature.mintBatch(batch); expect(tx.length).to.eq(10); expect(tx[0].id.toNumber()).to.eq(0); @@ -166,12 +166,12 @@ describe("NFT sig minting", async () => { }); it("should allow a valid voucher to mint", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx = await nftContract.signature.mint(v1); const newId = (await nftContract.get(tx.id)).metadata.id; assert.equal(newId.toString(), "0"); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const tx2 = await nftContract.signature.mint(v2); const newId2 = (await nftContract.get(tx2.id)).metadata.id; assert.equal(newId2.toString(), "1"); @@ -231,7 +231,7 @@ describe("NFT sig minting", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await nftContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( @@ -250,7 +250,7 @@ describe("NFT sig minting", async () => { mintEndTime: new Date(Date.now() + 60 * 60 * 24 * 1000 * 1000), mintStartTime: new Date(), }); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await nftContract.signature.mint(payload); const newBalance = await samWallet.getBalance(); assert( diff --git a/test/split.test.ts b/test/split.test.ts index 78f5e08e6..d7275405c 100644 --- a/test/split.test.ts +++ b/test/split.test.ts @@ -17,7 +17,7 @@ describe("Splits Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployBuiltInContract( Split.contractType, { diff --git a/test/token-drop.test.ts b/test/token-drop.test.ts index 721b50be3..9a5c824bc 100644 --- a/test/token-drop.test.ts +++ b/test/token-drop.test.ts @@ -26,7 +26,7 @@ describe("Token Drop Contract", async () => { beforeEach(async () => { [adminWallet, samWallet, bobWallet, abbyWallet, w1, w2, w3, w4] = signers; - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployBuiltInContract( TokenDrop.contractType, { @@ -143,7 +143,7 @@ describe("Token Drop Contract", async () => { ]); for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await dropContract.claim(1.2); const balance = await dropContract.balanceOf(member.address); expect(balance.displayValue).to.eq("1.2"); @@ -161,12 +161,12 @@ describe("Token Drop Contract", async () => { ]); for (const member of testWallets) { - await sdk.updateSignerOrProvider(member); + await sdk.wallet.connect(member); await dropContract.claim(1); } try { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await dropContract.claim(1); assert.fail("should have thrown"); } catch (e) { @@ -183,7 +183,7 @@ describe("Token Drop Contract", async () => { ], false, ); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); try { await dropContract.claim(1); } catch (err: any) { @@ -224,12 +224,12 @@ describe("Token Drop Contract", async () => { ], }, ]); - await sdk.updateSignerOrProvider(w1); + await sdk.wallet.connect(w1); await dropContract.claim(2); const balance = await dropContract.balance(); expect(balance.displayValue).to.eq("2.0"); try { - await sdk.updateSignerOrProvider(w2); + await sdk.wallet.connect(w2); await dropContract.claim(2); } catch (e) { expectError(e, "invalid quantity proof"); @@ -351,7 +351,7 @@ describe("Token Drop Contract", async () => { waitInSeconds: 24 * 60 * 60, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); await dropContract.claim(1); const reasons = @@ -378,7 +378,7 @@ describe("Token Drop Contract", async () => { currencyAddress: NATIVE_TOKEN_ADDRESS, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const reasons = await dropContract.claimConditions.getClaimIneligibilityReasons( @@ -411,7 +411,7 @@ describe("Token Drop Contract", async () => { currencyAddress, }, ]); - await sdk.updateSignerOrProvider(bobWallet); + await sdk.wallet.connect(bobWallet); const reasons = await dropContract.claimConditions.getClaimIneligibilityReasons( diff --git a/test/token.test.ts b/test/token.test.ts index cf7e0e851..f88b37eeb 100644 --- a/test/token.test.ts +++ b/test/token.test.ts @@ -19,7 +19,7 @@ describe("Token Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = await sdk.deployer.deployBuiltInContract( Token.contractType, { @@ -67,7 +67,7 @@ describe("Token Contract", async () => { await currencyContract.mintToSelf(20); await currencyContract.transfer(samWallet.address, "10"); await currencyContract.transfer(bobWallet.address, "5"); - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); await currencyContract.transfer(bobWallet.address, "3"); const holders = await currencyContract.history.getAllHolderBalances(); diff --git a/test/vote.test.ts b/test/vote.test.ts index f3694d89b..fa1b2f935 100644 --- a/test/vote.test.ts +++ b/test/vote.test.ts @@ -23,7 +23,7 @@ describe("Vote Contract", async () => { }); beforeEach(async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const tokenContractAddress = await sdk.deployer.deployBuiltInContract( Token.contractType, @@ -52,14 +52,14 @@ describe("Vote Contract", async () => { // should be separate function since you need gov token to deploy vote contract await currencyContract.roles.grant("minter", voteContract.getAddress()); - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); // step 2: delegate the governance token to someone for voting. in this case, myself. await currencyContract.delegateTo(samWallet.address); }); it("should permit a proposal to be passed if it receives the right votes", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await currencyContract.delegateTo(samWallet.address); const proposalId = ( @@ -100,7 +100,7 @@ describe("Vote Contract", async () => { assert.equal(balanceOfBobsWallet.displayValue, "1.0"); }); it("should be able to execute proposal even when `executions` is not passed", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await currencyContract.delegateTo(samWallet.address); const proposalId = (await voteContract.propose("Mint Tokens")).id; await voteContract.vote(proposalId.toString(), 1); @@ -127,7 +127,7 @@ describe("Vote Contract", async () => { }); it("should permit a proposal to be passed if it receives the right votes", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); const description = "Mint Tokens"; const proposalId = ( await voteContract.propose(description, [ @@ -146,7 +146,7 @@ describe("Vote Contract", async () => { }); it("should permit a proposal with native token values to be passed if it receives the right votes", async () => { - await sdk.updateSignerOrProvider(samWallet); + await sdk.wallet.connect(samWallet); await currencyContract.delegateTo(samWallet.address); await samWallet.sendTransaction({ diff --git a/test/wallet.test.ts b/test/wallet.test.ts index fcf2e33ca..6725db8a8 100644 --- a/test/wallet.test.ts +++ b/test/wallet.test.ts @@ -13,7 +13,7 @@ describe("Wallet", async () => { }); it("should transfer native currencies", async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const oldBalance = await sdk.wallet.balance(); expect(oldBalance.decimals).to.eq(18); await sdk.wallet.transfer(samWallet.address, 2); @@ -24,7 +24,7 @@ describe("Wallet", async () => { }); it("should transfer ERC20 tokens", async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const tokenAddr = await sdk.deployer.deployToken({ name: "My Token", primary_sale_recipient: adminWallet.address, @@ -37,15 +37,15 @@ describe("Wallet", async () => { const newBalance = await sdk.wallet.balance(tokenAddr); expect(newBalance.displayValue).to.eq("80.0"); - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); const samBalance = await sdk.wallet.balance(tokenAddr); expect(samBalance.displayValue).to.eq("20.0"); }); it("should fetch addresses", async () => { - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); expect(await sdk.wallet.getAddress()).to.eq(adminWallet.address); - sdk.updateSignerOrProvider(samWallet); + sdk.wallet.connect(samWallet); expect(await sdk.wallet.getAddress()).to.eq(samWallet.address); }); }); From e71816fd9ade08adbe47fa6fa1163b73fc3408e0 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 17 Jun 2022 16:08:12 -0700 Subject: [PATCH 06/20] pass options to override RPC urls --- docs/sdk.erc1155._constructor_.md | 3 +- docs/sdk.erc1155.md | 3 +- docs/sdk.erc1155.options.md | 11 - docs/sdk.erc20._constructor_.md | 3 +- docs/sdk.erc20.md | 3 +- docs/sdk.erc20.options.md | 11 - docs/sdk.erc721._constructor_.md | 3 +- docs/sdk.erc721.md | 3 +- docs/sdk.erc721.options.md | 11 - docs/sdk.pack.create.md | 4 +- docs/sdk.sdkoptionsschema.md | 3 + etc/sdk.api.md | 367 ++++++++++----------- src/constants/urls.ts | 8 +- src/contracts/edition-drop.ts | 2 +- src/contracts/edition.ts | 2 +- src/contracts/multiwrap.ts | 2 +- src/contracts/nft-collection.ts | 2 +- src/contracts/nft-drop.ts | 2 +- src/contracts/pack.ts | 2 +- src/contracts/signature-drop.ts | 2 +- src/contracts/smart-contract.ts | 8 +- src/contracts/token-drop.ts | 2 +- src/contracts/token.ts | 2 +- src/core/classes/contract-deployer.ts | 4 +- src/core/classes/contract-wrapper.ts | 19 +- src/core/classes/erc-1155.ts | 17 +- src/core/classes/erc-20.ts | 9 +- src/core/classes/erc-721.ts | 17 +- src/core/classes/rpc-connection-handler.ts | 22 +- src/core/sdk.ts | 18 +- src/schema/sdk-options.ts | 1 + 31 files changed, 240 insertions(+), 326 deletions(-) delete mode 100644 docs/sdk.erc1155.options.md delete mode 100644 docs/sdk.erc20.options.md delete mode 100644 docs/sdk.erc721.options.md diff --git a/docs/sdk.erc1155._constructor_.md b/docs/sdk.erc1155._constructor_.md index 7a4f1a4cf..7ce5057b1 100644 --- a/docs/sdk.erc1155._constructor_.md +++ b/docs/sdk.erc1155._constructor_.md @@ -9,7 +9,7 @@ Constructs a new instance of the `Erc1155` class Signature: ```typescript -constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SDKOptions); +constructor(contractWrapper: ContractWrapper, storage: IStorage); ``` ## Parameters @@ -18,5 +18,4 @@ constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SD | --- | --- | --- | | contractWrapper | ContractWrapper<T> | | | storage | [IStorage](./sdk.istorage.md) | | -| options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.erc1155.md b/docs/sdk.erc1155.md index deac1dcac..3f3fcd4b7 100644 --- a/docs/sdk.erc1155.md +++ b/docs/sdk.erc1155.md @@ -29,7 +29,7 @@ await contract.edition.transfer(walletAddress, tokenId, quantity); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(contractWrapper, storage, options)](./sdk.erc1155._constructor_.md) | | Constructs a new instance of the Erc1155 class | +| [(constructor)(contractWrapper, storage)](./sdk.erc1155._constructor_.md) | | Constructs a new instance of the Erc1155 class | ## Properties @@ -38,7 +38,6 @@ await contract.edition.transfer(walletAddress, tokenId, quantity); | [contractWrapper](./sdk.erc1155.contractwrapper.md) | | ContractWrapper<T> | | | [featureName](./sdk.erc1155.featurename.md) | | "ERC1155" | | | [mint](./sdk.erc1155.mint.md) | | [Erc1155Mintable](./sdk.erc1155mintable.md) \| undefined | | -| [options](./sdk.erc1155.options.md) | | [SDKOptions](./sdk.sdkoptions.md) | | | [query](./sdk.erc1155.query.md) | | [Erc1155Enumerable](./sdk.erc1155enumerable.md) \| undefined | | | [storage](./sdk.erc1155.storage.md) | | [IStorage](./sdk.istorage.md) | | diff --git a/docs/sdk.erc1155.options.md b/docs/sdk.erc1155.options.md deleted file mode 100644 index 26537a87b..000000000 --- a/docs/sdk.erc1155.options.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc1155](./sdk.erc1155.md) > [options](./sdk.erc1155.options.md) - -## Erc1155.options property - -Signature: - -```typescript -protected options: SDKOptions; -``` diff --git a/docs/sdk.erc20._constructor_.md b/docs/sdk.erc20._constructor_.md index 8d43cf473..2bfb497c2 100644 --- a/docs/sdk.erc20._constructor_.md +++ b/docs/sdk.erc20._constructor_.md @@ -9,7 +9,7 @@ Constructs a new instance of the `Erc20` class Signature: ```typescript -constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SDKOptions); +constructor(contractWrapper: ContractWrapper, storage: IStorage); ``` ## Parameters @@ -18,5 +18,4 @@ constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SD | --- | --- | --- | | contractWrapper | ContractWrapper<T> | | | storage | [IStorage](./sdk.istorage.md) | | -| options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.erc20.md b/docs/sdk.erc20.md index 2d012088a..8a0128d3c 100644 --- a/docs/sdk.erc20.md +++ b/docs/sdk.erc20.md @@ -29,7 +29,7 @@ await contract.token.transfer(walletAddress, amount); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(contractWrapper, storage, options)](./sdk.erc20._constructor_.md) | | Constructs a new instance of the Erc20 class | +| [(constructor)(contractWrapper, storage)](./sdk.erc20._constructor_.md) | | Constructs a new instance of the Erc20 class | ## Properties @@ -38,7 +38,6 @@ await contract.token.transfer(walletAddress, amount); | [contractWrapper](./sdk.erc20.contractwrapper.md) | | ContractWrapper<T> | | | [featureName](./sdk.erc20.featurename.md) | | "ERC20" | | | [mint](./sdk.erc20.mint.md) | | [Erc20Mintable](./sdk.erc20mintable.md) \| undefined | Mint tokens | -| [options](./sdk.erc20.options.md) | | [SDKOptions](./sdk.sdkoptions.md) | | | [storage](./sdk.erc20.storage.md) | | [IStorage](./sdk.istorage.md) | | ## Methods diff --git a/docs/sdk.erc20.options.md b/docs/sdk.erc20.options.md deleted file mode 100644 index 96a53aac9..000000000 --- a/docs/sdk.erc20.options.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc20](./sdk.erc20.md) > [options](./sdk.erc20.options.md) - -## Erc20.options property - -Signature: - -```typescript -protected options: SDKOptions; -``` diff --git a/docs/sdk.erc721._constructor_.md b/docs/sdk.erc721._constructor_.md index 7e87c2ccc..088fc275d 100644 --- a/docs/sdk.erc721._constructor_.md +++ b/docs/sdk.erc721._constructor_.md @@ -9,7 +9,7 @@ Constructs a new instance of the `Erc721` class Signature: ```typescript -constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SDKOptions); +constructor(contractWrapper: ContractWrapper, storage: IStorage); ``` ## Parameters @@ -18,5 +18,4 @@ constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SD | --- | --- | --- | | contractWrapper | ContractWrapper<T> | | | storage | [IStorage](./sdk.istorage.md) | | -| options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | diff --git a/docs/sdk.erc721.md b/docs/sdk.erc721.md index 1d26ad387..8cad8b7ea 100644 --- a/docs/sdk.erc721.md +++ b/docs/sdk.erc721.md @@ -29,7 +29,7 @@ await contract.nft.transfer(walletAddress, tokenId); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(contractWrapper, storage, options)](./sdk.erc721._constructor_.md) | | Constructs a new instance of the Erc721 class | +| [(constructor)(contractWrapper, storage)](./sdk.erc721._constructor_.md) | | Constructs a new instance of the Erc721 class | ## Properties @@ -39,7 +39,6 @@ await contract.nft.transfer(walletAddress, tokenId); | [drop](./sdk.erc721.drop.md) | | [Erc721Dropable](./sdk.erc721dropable.md) \| undefined | | | [featureName](./sdk.erc721.featurename.md) | | "ERC721" | | | [mint](./sdk.erc721.mint.md) | | [Erc721Mintable](./sdk.erc721mintable.md) \| undefined | | -| [options](./sdk.erc721.options.md) | | [SDKOptions](./sdk.sdkoptions.md) | | | [query](./sdk.erc721.query.md) | | [Erc721Supply](./sdk.erc721supply.md) \| undefined | | | [storage](./sdk.erc721.storage.md) | | [IStorage](./sdk.istorage.md) | | diff --git a/docs/sdk.erc721.options.md b/docs/sdk.erc721.options.md deleted file mode 100644 index ee5b890df..000000000 --- a/docs/sdk.erc721.options.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc721](./sdk.erc721.md) > [options](./sdk.erc721.options.md) - -## Erc721.options property - -Signature: - -```typescript -protected options: SDKOptions; -``` diff --git a/docs/sdk.pack.create.md b/docs/sdk.pack.create.md index 3b01784d3..442c86bd8 100644 --- a/docs/sdk.pack.create.md +++ b/docs/sdk.pack.create.md @@ -17,8 +17,8 @@ create(metadataWithRewards: PackMetadataInput): Promise>; @@ -32,7 +32,7 @@ create(metadataWithRewards: PackMetadataInput): PromiseReturns: -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; }>> +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; id: BigNumber; uri: string; }; supply: BigNumber; }>> ## Remarks diff --git a/docs/sdk.sdkoptionsschema.md b/docs/sdk.sdkoptionsschema.md index fbfc62ca2..3d9294280 100644 --- a/docs/sdk.sdkoptionsschema.md +++ b/docs/sdk.sdkoptionsschema.md @@ -9,6 +9,7 @@ ```typescript SDKOptionsSchema: z.ZodDefault>; readonlySettings: z.ZodOptional; @@ -78,6 +79,7 @@ SDKOptionsSchema: z.ZodDefault]>>; }, "strip", z.ZodTypeAny, { + chainIdToRPCUrlMap?: Record | undefined; readonlySettings?: { chainId?: number | undefined; rpcUrl: string; @@ -99,6 +101,7 @@ SDKOptionsSchema: z.ZodDefault | undefined; readonlySettings?: { chainId?: number | undefined; rpcUrl: string; diff --git a/etc/sdk.api.md b/etc/sdk.api.md index f23a926c3..c44275faa 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -121,20 +121,20 @@ export const BaseSignaturePayloadInput: z.ZodObject<{ primarySaleRecipient: z.ZodDefault; }, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; - uid: string; - price: string; currencyAddress: string; + price: string; mintStartTime: BigNumber; mintEndTime: BigNumber; + uid: string; + primarySaleRecipient: string; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; mintStartTime?: Date | undefined; mintEndTime?: Date | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; }>; // @public (undocumented) @@ -246,23 +246,23 @@ export const ClaimConditionInputArray: z.ZodArray, "many">; @@ -296,23 +296,23 @@ export const ClaimConditionInputSchema: z.ZodObject<{ address: string; maxClaimable: string; }[] | undefined; - quantityLimitPerTransaction: string; startTime: BigNumber; - price: string; currencyAddress: string; + price: string; maxQuantity: string; + quantityLimitPerTransaction: string; waitInSeconds: string; merkleRootHash: string | number[]; }, { - quantityLimitPerTransaction?: string | number | undefined; - startTime?: Date | undefined; - price?: string | number | undefined; snapshot?: string[] | { maxClaimable?: string | number | undefined; address: string; }[] | undefined; + startTime?: Date | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; maxQuantity?: string | number | undefined; + quantityLimitPerTransaction?: string | number | undefined; waitInSeconds?: string | number | bigint | BigNumber | undefined; merkleRootHash?: string | number[] | undefined; }>; @@ -372,11 +372,11 @@ export const ClaimConditionOutputSchema: z.ZodObject { trusted_forwarders: string[]; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -1220,8 +1220,8 @@ export class EditionDrop extends Erc1155 { }, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: string | undefined; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -1251,8 +1251,8 @@ export class EditionDrop extends Erc1155 { fee_recipient: string; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -1429,8 +1429,8 @@ export const EditionMetadataOutputSchema: z.ZodObject<{ image?: string | null | undefined; external_url?: string | null | undefined; animation_url?: string | null | undefined; - uri: string; id: BigNumber; + uri: string; }, { [x: string]: Json; name?: string | undefined; @@ -1438,8 +1438,8 @@ export const EditionMetadataOutputSchema: z.ZodObject<{ image?: string | null | undefined; external_url?: string | null | undefined; animation_url?: string | null | undefined; - uri: string; id: string | number | bigint | BigNumber; + uri: string; }>; }, "strip", z.ZodTypeAny, { metadata: { @@ -1449,8 +1449,8 @@ export const EditionMetadataOutputSchema: z.ZodObject<{ image?: string | null | undefined; external_url?: string | null | undefined; animation_url?: string | null | undefined; - uri: string; id: BigNumber; + uri: string; }; supply: BigNumber; }, { @@ -1461,8 +1461,8 @@ export const EditionMetadataOutputSchema: z.ZodObject<{ image?: string | null | undefined; external_url?: string | null | undefined; animation_url?: string | null | undefined; - uri: string; id: string | number | bigint | BigNumber; + uri: string; }; supply: string | number | bigint | BigNumber; }>; @@ -1496,8 +1496,8 @@ export const EditionMetadataWithOwnerOutputSchema: z.ZodObject; }, { owner: z.ZodString; quantityOwned: z.ZodEffects]>, BigNumber, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { - owner: string; metadata: { [x: string]: Json; name?: string | undefined; @@ -1520,13 +1519,13 @@ export const EditionMetadataWithOwnerOutputSchema: z.ZodObject; @@ -1546,7 +1546,7 @@ export const EditionMetadataWithOwnerOutputSchema: z.ZodObject implements UpdateableNetwork, DetectableFeature { - constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SDKOptions); + constructor(contractWrapper: ContractWrapper, storage: IStorage); airdrop(tokenId: BigNumberish, addresses: AirdropInput, data?: BytesLike): Promise; balance(tokenId: BigNumberish): Promise; balanceOf(address: string, tokenId: BigNumberish): Promise; @@ -1565,8 +1565,6 @@ export class Erc1155; @@ -1632,7 +1630,7 @@ export type ERC1155Wrappable = { // // @public export class Erc20 implements UpdateableNetwork, DetectableFeature { - constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SDKOptions); + constructor(contractWrapper: ContractWrapper, storage: IStorage); allowance(spender: string): Promise; allowanceOf(owner: string, spender: string): Promise; balance(): Promise; @@ -1651,8 +1649,6 @@ export class Erc20 imp normalizeAmount(amount: Amount): Promise; // @internal (undocumented) onSignerUpdated(signer: Signer | undefined): void; - // (undocumented) - protected options: SDKOptions; setAllowance(spender: string, amount: Amount): Promise; // (undocumented) protected storage: IStorage; @@ -1702,7 +1698,7 @@ export type ERC20Wrappable = { // // @public export class Erc721 implements UpdateableNetwork, DetectableFeature { - constructor(contractWrapper: ContractWrapper, storage: IStorage, options?: SDKOptions); + constructor(contractWrapper: ContractWrapper, storage: IStorage); balance(): Promise; balanceOf(address: string): Promise; // (undocumented) @@ -1723,8 +1719,6 @@ export class Erc721; // @internal (undocumented) onSignerUpdated(signer: Signer | undefined): void; - // (undocumented) - protected options: SDKOptions; ownerOf(tokenId: BigNumberish): Promise; // (undocumented) query: Erc721Supply | undefined; @@ -1988,7 +1982,7 @@ export function getNativeTokenByChainId(chainId: ChainId): NativeToken; // Warning: (ae-internal-missing-underscore) The name "getProviderForChain" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -export function getProviderForChain(network: ChainOrRpc): Provider; +export function getProviderForChain(network: ChainOrRpc, customRpcMap?: Record): Provider; // @public (undocumented) export function getReadOnlyProvider(network: string, chainId?: number): ethers.providers.BaseProvider; @@ -2792,8 +2786,8 @@ export class NFTDrop extends Erc721 { trusted_forwarders: string[]; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -2831,8 +2825,8 @@ export class NFTDrop extends Erc721 { }, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: string | undefined; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -2862,8 +2856,8 @@ export class NFTDrop extends Erc721 { fee_recipient: string; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -2948,8 +2942,8 @@ export class Pack extends Erc1155 { image?: string | null | undefined; external_url?: string | null | undefined; animation_url?: string | null | undefined; - uri: string; id: BigNumber; + uri: string; }; supply: BigNumber; }>>; @@ -3101,27 +3095,27 @@ export const PartialClaimConditionInputSchema: z.ZodObject<{ address: string; }>, "many">]>>>; }, "strip", z.ZodTypeAny, { - quantityLimitPerTransaction?: string | undefined; - startTime?: BigNumber | undefined; - price?: string | undefined; snapshot?: { address: string; maxClaimable: string; }[] | undefined; + startTime?: BigNumber | undefined; currencyAddress?: string | undefined; + price?: string | undefined; maxQuantity?: string | undefined; + quantityLimitPerTransaction?: string | undefined; waitInSeconds?: string | undefined; merkleRootHash?: string | number[] | undefined; }, { - quantityLimitPerTransaction?: string | number | undefined; - startTime?: Date | undefined; - price?: string | number | undefined; snapshot?: string[] | { maxClaimable?: string | number | undefined; address: string; }[] | undefined; + startTime?: Date | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; maxQuantity?: string | number | undefined; + quantityLimitPerTransaction?: string | number | undefined; waitInSeconds?: string | number | bigint | BigNumber | undefined; merkleRootHash?: string | number[] | undefined; }>; @@ -3334,6 +3328,7 @@ export type SDKOptions = z.input; // @public (undocumented) export const SDKOptionsSchema: z.ZodDefault>; readonlySettings: z.ZodOptional; @@ -3403,6 +3398,7 @@ export const SDKOptionsSchema: z.ZodDefault]>>; }, "strip", z.ZodTypeAny, { + chainIdToRPCUrlMap?: Record | undefined; readonlySettings?: { chainId?: number | undefined; rpcUrl: string; @@ -3424,6 +3420,7 @@ export const SDKOptionsSchema: z.ZodDefault | undefined; readonlySettings?: { chainId?: number | undefined; rpcUrl: string; @@ -3526,13 +3523,13 @@ export const Signature1155PayloadInput: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>, string, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; + currencyAddress: string; + price: string; + mintStartTime: BigNumber; + mintEndTime: BigNumber; + uid: string; primarySaleRecipient: string; - royaltyRecipient: string; - royaltyBps: number; quantity: string; - uid: string; - price: string; - currencyAddress: string; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3544,16 +3541,16 @@ export const Signature1155PayloadInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: number; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - royaltyRecipient?: string | undefined; - royaltyBps?: number | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; + mintStartTime?: Date | undefined; + mintEndTime?: Date | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; metadata?: string | { [x: string]: Json; name?: string | undefined; @@ -3565,8 +3562,8 @@ export const Signature1155PayloadInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; } | undefined; - mintStartTime?: Date | undefined; - mintEndTime?: Date | undefined; + royaltyRecipient?: string | undefined; + royaltyBps?: number | undefined; quantity: string | number | bigint | BigNumber; }>; @@ -3652,14 +3649,13 @@ export const Signature1155PayloadInputWithTokenId: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>, string, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; + currencyAddress: string; + price: string; + mintStartTime: BigNumber; + mintEndTime: BigNumber; + uid: string; primarySaleRecipient: string; - tokenId: string; - royaltyRecipient: string; - royaltyBps: number; quantity: string; - uid: string; - price: string; - currencyAddress: string; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3671,16 +3667,17 @@ export const Signature1155PayloadInputWithTokenId: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: number; + tokenId: string; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - royaltyRecipient?: string | undefined; - royaltyBps?: number | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; + mintStartTime?: Date | undefined; + mintEndTime?: Date | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; metadata?: string | { [x: string]: Json; name?: string | undefined; @@ -3692,10 +3689,10 @@ export const Signature1155PayloadInputWithTokenId: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; } | undefined; - mintStartTime?: Date | undefined; - mintEndTime?: Date | undefined; - tokenId: string | number | bigint | BigNumber; + royaltyRecipient?: string | undefined; + royaltyBps?: number | undefined; quantity: string | number | bigint | BigNumber; + tokenId: string | number | bigint | BigNumber; }>; // Warning: (ae-internal-missing-underscore) The name "Signature1155PayloadOutput" should be prefixed with an underscore because the declaration is marked as @internal @@ -3753,15 +3750,14 @@ export const Signature1155PayloadOutput: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; + currencyAddress: string; + price: string; uri: string; - tokenId: BigNumber; - royaltyRecipient: string; - royaltyBps: BigNumber; - quantity: BigNumber; + mintStartTime: BigNumber; + mintEndTime: BigNumber; uid: string; - price: string; - currencyAddress: string; + primarySaleRecipient: string; + quantity: BigNumber; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3773,18 +3769,19 @@ export const Signature1155PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: BigNumber; + tokenId: BigNumber; }, { to?: string | undefined; + currencyAddress?: string | undefined; + price?: string | number | undefined; + uid?: string | undefined; primarySaleRecipient?: string | undefined; royaltyRecipient?: string | undefined; - uid?: string | undefined; - price?: string | number | undefined; - currencyAddress?: string | undefined; uri: string; - tokenId: string | number | bigint | BigNumber; - royaltyBps: string | number | bigint | BigNumber; + mintStartTime: string | number | bigint | BigNumber; + mintEndTime: string | number | bigint | BigNumber; quantity: string | number | bigint | BigNumber; metadata: string | { [x: string]: Json; @@ -3797,8 +3794,8 @@ export const Signature1155PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: string | number | bigint | BigNumber; - mintEndTime: string | number | bigint | BigNumber; + royaltyBps: string | number | bigint | BigNumber; + tokenId: string | number | bigint | BigNumber; }>; // Warning: (ae-internal-missing-underscore) The name "Signature20PayloadInput" should be prefixed with an underscore because the declaration is marked as @internal @@ -3816,21 +3813,21 @@ export const Signature20PayloadInput: z.ZodObject, string, string | number>; }>, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; - quantity: string; - uid: string; - price: string; currencyAddress: string; + price: string; mintStartTime: BigNumber; mintEndTime: BigNumber; + uid: string; + primarySaleRecipient: string; + quantity: string; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; mintStartTime?: Date | undefined; mintEndTime?: Date | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; quantity: string | number; }>; @@ -3852,22 +3849,22 @@ export const Signature20PayloadOutput: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; - quantity: string; - uid: string; - price: string; currencyAddress: string; + price: string; mintStartTime: BigNumber; mintEndTime: BigNumber; + uid: string; + primarySaleRecipient: string; + quantity: string; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; - quantity: string | number; + price?: string | number | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; mintStartTime: string | number | bigint | BigNumber; mintEndTime: string | number | bigint | BigNumber; + quantity: string | number; }>; // Warning: (ae-internal-missing-underscore) The name "Signature721PayloadInput" should be prefixed with an underscore because the declaration is marked as @internal @@ -3917,12 +3914,12 @@ export const Signature721PayloadInput: z.ZodObject; }>, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; - royaltyRecipient: string; - royaltyBps: number; - uid: string; - price: string; currencyAddress: string; + price: string; + mintStartTime: BigNumber; + mintEndTime: BigNumber; + uid: string; + primarySaleRecipient: string; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3934,18 +3931,18 @@ export const Signature721PayloadInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: number; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - royaltyRecipient?: string | undefined; - royaltyBps?: number | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; mintStartTime?: Date | undefined; mintEndTime?: Date | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; + royaltyRecipient?: string | undefined; + royaltyBps?: number | undefined; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4011,13 +4008,13 @@ export const Signature721PayloadOutput: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; + currencyAddress: string; + price: string; uri: string; - royaltyRecipient: string; - royaltyBps: BigNumber; + mintStartTime: BigNumber; + mintEndTime: BigNumber; uid: string; - price: string; - currencyAddress: string; + primarySaleRecipient: string; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4029,17 +4026,18 @@ export const Signature721PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: BigNumber; }, { to?: string | undefined; + currencyAddress?: string | undefined; + price?: string | number | undefined; + uid?: string | undefined; primarySaleRecipient?: string | undefined; royaltyRecipient?: string | undefined; - uid?: string | undefined; - price?: string | number | undefined; - currencyAddress?: string | undefined; uri: string; - royaltyBps: string | number | bigint | BigNumber; + mintStartTime: string | number | bigint | BigNumber; + mintEndTime: string | number | bigint | BigNumber; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4051,8 +4049,7 @@ export const Signature721PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: string | number | bigint | BigNumber; - mintEndTime: string | number | bigint | BigNumber; + royaltyBps: string | number | bigint | BigNumber; }>; // Warning: (ae-internal-missing-underscore) The name "Signature721WithQuantityInput" should be prefixed with an underscore because the declaration is marked as @internal @@ -4135,13 +4132,13 @@ export const Signature721WithQuantityInput: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>, string, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; + currencyAddress: string; + price: string; + mintStartTime: BigNumber; + mintEndTime: BigNumber; + uid: string; primarySaleRecipient: string; - royaltyRecipient: string; - royaltyBps: number; quantity: string; - uid: string; - price: string; - currencyAddress: string; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4153,16 +4150,16 @@ export const Signature721WithQuantityInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: number; }, { to?: string | undefined; - primarySaleRecipient?: string | undefined; - royaltyRecipient?: string | undefined; - royaltyBps?: number | undefined; - uid?: string | undefined; - price?: string | number | undefined; currencyAddress?: string | undefined; + price?: string | number | undefined; + mintStartTime?: Date | undefined; + mintEndTime?: Date | undefined; + uid?: string | undefined; + primarySaleRecipient?: string | undefined; metadata?: string | { [x: string]: Json; name?: string | undefined; @@ -4174,8 +4171,8 @@ export const Signature721WithQuantityInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; } | undefined; - mintStartTime?: Date | undefined; - mintEndTime?: Date | undefined; + royaltyRecipient?: string | undefined; + royaltyBps?: number | undefined; quantity: string | number | bigint | BigNumber; }>; @@ -4233,14 +4230,14 @@ export const Signature721WithQuantityOutput: z.ZodObject]>, BigNumber, string | number | bigint | BigNumber>; }>, "strip", z.ZodTypeAny, { to: string; - primarySaleRecipient: string; + currencyAddress: string; + price: string; uri: string; - royaltyRecipient: string; - royaltyBps: BigNumber; - quantity: BigNumber; + mintStartTime: BigNumber; + mintEndTime: BigNumber; uid: string; - price: string; - currencyAddress: string; + primarySaleRecipient: string; + quantity: BigNumber; metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4252,17 +4249,18 @@ export const Signature721WithQuantityOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: BigNumber; - mintEndTime: BigNumber; + royaltyRecipient: string; + royaltyBps: BigNumber; }, { to?: string | undefined; + currencyAddress?: string | undefined; + price?: string | number | undefined; + uid?: string | undefined; primarySaleRecipient?: string | undefined; royaltyRecipient?: string | undefined; - uid?: string | undefined; - price?: string | number | undefined; - currencyAddress?: string | undefined; uri: string; - royaltyBps: string | number | bigint | BigNumber; + mintStartTime: string | number | bigint | BigNumber; + mintEndTime: string | number | bigint | BigNumber; quantity: string | number | bigint | BigNumber; metadata: string | { [x: string]: Json; @@ -4275,8 +4273,7 @@ export const Signature721WithQuantityOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; - mintStartTime: string | number | bigint | BigNumber; - mintEndTime: string | number | bigint | BigNumber; + royaltyBps: string | number | bigint | BigNumber; }>; // Warning: (ae-internal-missing-underscore) The name "SignatureDrop" should be prefixed with an underscore because the declaration is marked as @internal @@ -4361,8 +4358,8 @@ export class SignatureDrop extends Erc721 { trusted_forwarders: string[]; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4400,8 +4397,8 @@ export class SignatureDrop extends Erc721 { }, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: string | undefined; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4431,8 +4428,8 @@ export class SignatureDrop extends Erc721 { fee_recipient: string; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4530,8 +4527,8 @@ export class SmartContract, "strip", ZodLazy>, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4544,8 +4541,8 @@ export class SmartContract | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4571,8 +4568,8 @@ export class SmartContract, "strip", ZodLazy>, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: string | undefined; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4581,8 +4578,8 @@ export class SmartContract | undefined; + description?: string | undefined; image?: string | undefined; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4602,8 +4599,8 @@ export class SmartContract, "strip", ZodLazy>, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4612,8 +4609,8 @@ export class SmartContract | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; seller_fee_basis_points?: number | undefined; @@ -4663,8 +4660,8 @@ export const SnapshotInfoSchema: z.ZodObject<{ proof: z.ZodArray; }>, "strip", z.ZodTypeAny, { address: string; - proof: string[]; maxClaimable: string; + proof: string[]; }, { maxClaimable?: string | number | undefined; address: string; @@ -4674,8 +4671,8 @@ export const SnapshotInfoSchema: z.ZodObject<{ merkleRoot: string; claims: { address: string; - proof: string[]; maxClaimable: string; + proof: string[]; }[]; }, { merkleRoot: string; @@ -4692,8 +4689,8 @@ export const SnapshotInfoSchema: z.ZodObject<{ merkleRoot: string; claims: { address: string; - proof: string[]; maxClaimable: string; + proof: string[]; }[]; }; }, { @@ -4743,8 +4740,8 @@ export const SnapshotSchema: z.ZodObject<{ proof: z.ZodArray; }>, "strip", z.ZodTypeAny, { address: string; - proof: string[]; maxClaimable: string; + proof: string[]; }, { maxClaimable?: string | number | undefined; address: string; @@ -4754,8 +4751,8 @@ export const SnapshotSchema: z.ZodObject<{ merkleRoot: string; claims: { address: string; - proof: string[]; maxClaimable: string; + proof: string[]; }[]; }, { merkleRoot: string; @@ -5249,8 +5246,8 @@ export class TokenDrop extends Erc20 { trusted_forwarders: string[]; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; platform_fee_basis_points?: number | undefined; @@ -5281,8 +5278,8 @@ export class TokenDrop extends Erc20 { }, { [x: string]: Json; symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: string | undefined; external_link?: string | undefined; name: string; @@ -5305,8 +5302,8 @@ export class TokenDrop extends Erc20 { merkle: Record; }, { symbol?: string | undefined; - description?: string | undefined; merkle?: Record | undefined; + description?: string | undefined; image?: any; external_link?: string | undefined; name: string; @@ -5338,11 +5335,11 @@ export const TokenMintInputSchema: z.ZodObject<{ toAddress: z.ZodEffects; amount: z.ZodEffects, string, string | number>; }, "strip", z.ZodTypeAny, { - amount: string; toAddress: string; + amount: string; }, { - amount: string | number; toAddress: string; + amount: string | number; }>; // @public diff --git a/src/constants/urls.ts b/src/constants/urls.ts index 20372a06f..e0e0e2d1f 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -111,10 +111,14 @@ export function getRpcUrl( /** * @internal * @param network - the chain name or rpc url + * @param customRpcMap * @returns the rpc url for that chain */ -export function getProviderForChain(network: ChainOrRpc): Provider { - const rpcUrl = getRpcUrl(network); +export function getProviderForChain( + network: ChainOrRpc, + customRpcMap?: Record, +): Provider { + const rpcUrl = getRpcUrl(network, customRpcMap); return getReadOnlyProvider(rpcUrl); } diff --git a/src/contracts/edition-drop.ts b/src/contracts/edition-drop.ts index e62852395..e6c3e8643 100644 --- a/src/contracts/edition-drop.ts +++ b/src/contracts/edition-drop.ts @@ -135,7 +135,7 @@ export class EditionDrop extends Erc1155 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, EditionDrop.schema, diff --git a/src/contracts/edition.ts b/src/contracts/edition.ts index 00440a577..c813e3a42 100644 --- a/src/contracts/edition.ts +++ b/src/contracts/edition.ts @@ -123,7 +123,7 @@ export class Edition extends Erc1155 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, Edition.schema, diff --git a/src/contracts/multiwrap.ts b/src/contracts/multiwrap.ts index 76767895c..7a458c02d 100644 --- a/src/contracts/multiwrap.ts +++ b/src/contracts/multiwrap.ts @@ -101,7 +101,7 @@ export class Multiwrap extends Erc721 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, Multiwrap.schema, diff --git a/src/contracts/nft-collection.ts b/src/contracts/nft-collection.ts index 36e995dce..6af2bf9eb 100644 --- a/src/contracts/nft-collection.ts +++ b/src/contracts/nft-collection.ts @@ -118,7 +118,7 @@ export class NFTCollection extends Erc721 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, NFTCollection.schema, diff --git a/src/contracts/nft-drop.ts b/src/contracts/nft-drop.ts index 3cf2ba56e..83f5b80d3 100644 --- a/src/contracts/nft-drop.ts +++ b/src/contracts/nft-drop.ts @@ -174,7 +174,7 @@ export class NFTDrop extends Erc721 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, NFTDrop.schema, diff --git a/src/contracts/pack.ts b/src/contracts/pack.ts index 22d805322..bc25c0faa 100644 --- a/src/contracts/pack.ts +++ b/src/contracts/pack.ts @@ -107,7 +107,7 @@ export class Pack extends Erc1155 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, Pack.schema, diff --git a/src/contracts/signature-drop.ts b/src/contracts/signature-drop.ts index ba44626ae..f46235900 100644 --- a/src/contracts/signature-drop.ts +++ b/src/contracts/signature-drop.ts @@ -190,7 +190,7 @@ export class SignatureDrop extends Erc721 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, SignatureDrop.schema, diff --git a/src/contracts/smart-contract.ts b/src/contracts/smart-contract.ts index fdba44598..a94168db9 100644 --- a/src/contracts/smart-contract.ts +++ b/src/contracts/smart-contract.ts @@ -67,7 +67,6 @@ export class SmartContract< private contractWrapper; private storage; - private options; // utilities public events: ContractEvents; @@ -113,7 +112,6 @@ export class SmartContract< options, ), ) { - this.options = options; this.storage = storage; this.contractWrapper = contractWrapper; @@ -275,21 +273,21 @@ export class SmartContract< private detectErc20() { if (detectContractFeature(this.contractWrapper, "ERC20")) { - return new Erc20(this.contractWrapper, this.storage, this.options); + return new Erc20(this.contractWrapper, this.storage); } return undefined; } private detectErc721() { if (detectContractFeature(this.contractWrapper, "ERC721")) { - return new Erc721(this.contractWrapper, this.storage, this.options); + return new Erc721(this.contractWrapper, this.storage); } return undefined; } private detectErc1155() { if (detectContractFeature(this.contractWrapper, "ERC1155")) { - return new Erc1155(this.contractWrapper, this.storage, this.options); + return new Erc1155(this.contractWrapper, this.storage); } return undefined; } diff --git a/src/contracts/token-drop.ts b/src/contracts/token-drop.ts index 326e522c0..d56502560 100644 --- a/src/contracts/token-drop.ts +++ b/src/contracts/token-drop.ts @@ -95,7 +95,7 @@ export class TokenDrop extends Erc20 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, TokenDrop.schema, diff --git a/src/contracts/token.ts b/src/contracts/token.ts index 13805150a..14fdc620c 100644 --- a/src/contracts/token.ts +++ b/src/contracts/token.ts @@ -89,7 +89,7 @@ export class Token extends Erc20 { options, ), ) { - super(contractWrapper, storage, options); + super(contractWrapper, storage); this.metadata = new ContractMetadata( this.contractWrapper, Token.schema, diff --git a/src/core/classes/contract-deployer.ts b/src/core/classes/contract-deployer.ts index 66dd2ccd8..1c5ba88db 100644 --- a/src/core/classes/contract-deployer.ts +++ b/src/core/classes/contract-deployer.ts @@ -46,15 +46,13 @@ export class ContractDeployer extends RPCConnectionHandler { */ private _registry: Promise | undefined; private storage: IStorage; - private options: SDKOptions; constructor( connection: ConnectionInfo, options: SDKOptions, storage: IStorage, ) { - super(connection); - this.options = options; + super(connection, options); this.storage = storage; } diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index 661b70229..2a461ce01 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -11,11 +11,7 @@ import { Signer, } from "ethers"; import { RPCConnectionHandler } from "./rpc-connection-handler"; -import { - SDKOptions, - SDKOptionsOutput, - SDKOptionsSchema, -} from "../../schema/sdk-options"; +import { SDKOptions } from "../../schema/sdk-options"; import { ConnectionInfo, ForwardRequestMessage, @@ -46,7 +42,6 @@ export class ContractWrapper< > extends RPCConnectionHandler { private isValidContract = false; private customOverrides: () => CallOverrides = () => ({}); - protected options: SDKOptionsOutput; /** * @internal */ @@ -60,7 +55,7 @@ export class ContractWrapper< contractAbi: ContractInterface, options: SDKOptions, ) { - super(network); + super(network, options); this.abi = contractAbi; // set up the contract this.writeContract = new Contract( @@ -72,16 +67,6 @@ export class ContractWrapper< this.readContract = this.writeContract.connect( this.getProvider(), ) as TContract; - - try { - this.options = SDKOptionsSchema.parse(options) || {}; - } catch (optionParseError) { - console.error( - "invalid sdk options object passed, falling back to default options", - optionParseError, - ); - this.options = SDKOptionsSchema.parse({}); - } } public override updateSigner(signer: Signer | undefined): void { diff --git a/src/core/classes/erc-1155.ts b/src/core/classes/erc-1155.ts index 8c3833e01..ff6cd3487 100644 --- a/src/core/classes/erc-1155.ts +++ b/src/core/classes/erc-1155.ts @@ -10,7 +10,6 @@ import { NFTMetadata } from "../../schema/tokens/common"; import { IStorage } from "../interfaces"; import { TransactionResult } from "../types"; import { UpdateableNetwork } from "../interfaces/contract"; -import { SDKOptions, SDKOptionsSchema } from "../../schema/sdk-options"; import { EditionMetadata, EditionMetadataOutputSchema, @@ -42,27 +41,13 @@ export class Erc1155< featureName = FEATURE_EDITION.name; protected contractWrapper: ContractWrapper; protected storage: IStorage; - protected options: SDKOptions; public query: Erc1155Enumerable | undefined; public mint: Erc1155Mintable | undefined; - constructor( - contractWrapper: ContractWrapper, - storage: IStorage, - options: SDKOptions = {}, - ) { + constructor(contractWrapper: ContractWrapper, storage: IStorage) { this.contractWrapper = contractWrapper; this.storage = storage; - try { - this.options = SDKOptionsSchema.parse(options); - } catch (optionParseError) { - console.error( - "invalid contract options object passed, falling back to default options", - optionParseError, - ); - this.options = SDKOptionsSchema.parse({}); - } this.query = this.detectErc1155Enumerable(); this.mint = this.detectErc1155Mintable(); } diff --git a/src/core/classes/erc-20.ts b/src/core/classes/erc-20.ts index 97620b6d4..0f5207a60 100644 --- a/src/core/classes/erc-20.ts +++ b/src/core/classes/erc-20.ts @@ -4,7 +4,6 @@ import { BigNumber, BigNumberish, ethers, Signer } from "ethers"; import { IStorage } from "../interfaces"; import { UpdateableNetwork } from "../interfaces/contract"; import { TransactionResult } from "../types"; -import { SDKOptions } from "../../schema/sdk-options"; import { Amount, Currency, CurrencyValue } from "../../types/currency"; import { fetchCurrencyMetadata, @@ -34,21 +33,15 @@ export class Erc20 featureName = FEATURE_TOKEN.name; protected contractWrapper: ContractWrapper; protected storage: IStorage; - protected options: SDKOptions; /** * Mint tokens */ public mint: Erc20Mintable | undefined; - constructor( - contractWrapper: ContractWrapper, - storage: IStorage, - options: SDKOptions = {}, - ) { + constructor(contractWrapper: ContractWrapper, storage: IStorage) { this.contractWrapper = contractWrapper; this.storage = storage; - this.options = options; this.mint = this.detectErc20Mintable(); } diff --git a/src/core/classes/erc-721.ts b/src/core/classes/erc-721.ts index 3b93f66ec..9fdde3ddc 100644 --- a/src/core/classes/erc-721.ts +++ b/src/core/classes/erc-721.ts @@ -4,7 +4,6 @@ import { NFTMetadata, NFTMetadataOwner } from "../../schema/tokens/common"; import { IStorage } from "../interfaces/IStorage"; import { TransactionResult } from "../types"; import { UpdateableNetwork } from "../interfaces/contract"; -import { SDKOptions, SDKOptionsSchema } from "../../schema/sdk-options"; import { fetchTokenMetadata } from "../../common/nft"; import { detectContractFeature, @@ -51,24 +50,10 @@ export class Erc721< public drop: Erc721Dropable | undefined; protected contractWrapper: ContractWrapper; protected storage: IStorage; - protected options: SDKOptions; - constructor( - contractWrapper: ContractWrapper, - storage: IStorage, - options: SDKOptions = {}, - ) { + constructor(contractWrapper: ContractWrapper, storage: IStorage) { this.contractWrapper = contractWrapper; this.storage = storage; - try { - this.options = SDKOptionsSchema.parse(options); - } catch (optionParseError) { - console.error( - "invalid contract options object passed, falling back to default options", - optionParseError, - ); - this.options = SDKOptionsSchema.parse({}); - } this.query = this.detectErc721Enumerable(); this.mint = this.detectErc721Mintable(); this.drop = this.detectErc721Dropable(); diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index ae2a66c6a..2cad40275 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -3,22 +3,40 @@ import { getProviderForChain } from "../../constants/urls"; import { ConnectionInfo } from "../types"; import { ChainOrRpc } from "../../constants"; import { EventEmitter2 } from "eventemitter2"; +import { + SDKOptions, + SDKOptionsOutput, + SDKOptionsSchema, +} from "../../schema/index"; /** * @internal */ export class RPCConnectionHandler extends EventEmitter2 { + protected options: SDKOptionsOutput; private chainId: ChainOrRpc; private provider: providers.Provider; private signer: Signer | undefined; // TODO (rpc) needs the options to be passed in to override RPC urls - constructor(connection: ConnectionInfo) { + constructor(connection: ConnectionInfo, options: SDKOptions = {}) { super(); + try { + this.options = SDKOptionsSchema.parse(options); + } catch (optionParseError) { + console.error( + "invalid contract options object passed, falling back to default options", + optionParseError, + ); + this.options = SDKOptionsSchema.parse({}); + } this.chainId = connection.chainId; this.provider = connection.provider ? connection.provider - : getProviderForChain(connection.chainId); + : getProviderForChain( + connection.chainId, + this.options.chainIdToRPCUrlMap, + ); this.signer = connection.signer; } diff --git a/src/core/sdk.ts b/src/core/sdk.ts index c7198b661..03bf68a98 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -15,11 +15,7 @@ import { Token, Vote, } from "../contracts"; -import { - SDKOptions, - SDKOptionsOutput, - SDKOptionsSchema, -} from "../schema/sdk-options"; +import { SDKOptions } from "../schema/sdk-options"; import { IpfsStorage } from "./classes/ipfs-storage"; import { RPCConnectionHandler } from "./classes/rpc-connection-handler"; import type { @@ -44,7 +40,6 @@ import { Multiwrap } from "../contracts/multiwrap"; * @public */ export class ThirdwebSDK extends RPCConnectionHandler { - private options: SDKOptionsOutput; /** * Get an instance of the thirdweb SDK based on an existing ethers signer * @@ -157,16 +152,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { signer, provider: signer?.provider, }; - super(connection); - try { - this.options = SDKOptionsSchema.parse(options); - } catch (optionParseError) { - console.error( - "invalid contract options object passed, falling back to default options", - optionParseError, - ); - this.options = SDKOptionsSchema.parse({}); - } + super(connection, options); this.storageHandler = storage; this.storage = new RemoteStorage(storage); this.deployer = new ContractDeployer(connection, options, storage); diff --git a/src/schema/sdk-options.ts b/src/schema/sdk-options.ts index 5dcafb95b..9bd55f6a0 100644 --- a/src/schema/sdk-options.ts +++ b/src/schema/sdk-options.ts @@ -6,6 +6,7 @@ import { z } from "zod"; */ export const SDKOptionsSchema = z .object({ + chainIdToRPCUrlMap: z.record(z.number(), z.string()).optional(), readonlySettings: z .object({ rpcUrl: z.string().url(), From 576883b2664ccd937fe2d4af1c78aa6f3079f779 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 17 Jun 2022 16:29:14 -0700 Subject: [PATCH 07/20] throw network mismatch error --- src/core/classes/contract-wrapper.ts | 25 ++++++++++++++++++---- src/core/classes/rpc-connection-handler.ts | 4 ++-- src/core/sdk.ts | 12 +++++------ test/publisher.test.ts | 2 +- 4 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index 2a461ce01..e7d37a7e7 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -30,7 +30,7 @@ import { getContractAddressByChainId } from "../../constants/addresses"; import { signEIP2612Permit } from "../../common/permit"; import { signTypedDataInternal } from "../../common/sign"; import { getPolygonGasPriorityFee } from "../../common/gas-price"; -import { ChainId } from "../../constants"; +import { ChainId, chainNameToId } from "../../constants"; import { convertToTWError } from "../../common"; import { isBrowser } from "../../common/utils"; @@ -50,12 +50,12 @@ export class ContractWrapper< public abi; constructor( - network: ConnectionInfo, + connection: ConnectionInfo, contractAddress: string, contractAbi: ContractInterface, options: SDKOptions, ) { - super(network, options); + super(connection, options); this.abi = contractAbi; // set up the contract this.writeContract = new Contract( @@ -269,7 +269,24 @@ export class ContractWrapper< } } - // TODO: check if write and read contracts are on the same network + // check if the signer is present and on the expected chain + const signer = this.getSigner(); + invariant(signer, "Cannot execute a transaction without valid signer"); + const chainId = await signer.getChainId(); + // get the expected chainId from the passed in network (network name or chainId or rpc url) + const passedInNetwork = this.getConnectionInfo().chainId; + const expectedChainId: number = + typeof passedInNetwork === "string" + ? chainNameToId[passedInNetwork] + : passedInNetwork; + // expectedChainId might not be found if we got passed a rpc url directly, in that case let the tx go through + // TODO create a provider from the url + if (expectedChainId) { + invariant( + chainId === expectedChainId, + `Chain mismatch Error: Trying to call a contract on chain '${expectedChainId}', but the connected signer is on chain '${chainId}'.`, + ); + } if (!callOverrides) { callOverrides = await this.getCallOverrides(); diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 2cad40275..5474c649f 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -1,5 +1,5 @@ import { providers, Signer } from "ethers"; -import { getProviderForChain } from "../../constants/urls"; +import { chainNameToId, getProviderForChain } from "../../constants/urls"; import { ConnectionInfo } from "../types"; import { ChainOrRpc } from "../../constants"; import { EventEmitter2 } from "eventemitter2"; @@ -14,7 +14,7 @@ import { */ export class RPCConnectionHandler extends EventEmitter2 { protected options: SDKOptionsOutput; - private chainId: ChainOrRpc; + private chainId: ChainOrRpc; // TODO (rpc) enforce this to be a pure ChainId private provider: providers.Provider; private signer: Signer | undefined; diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 03bf68a98..47e02c8d4 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -53,7 +53,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { * ``` * * @param signer - a ethers Signer to be used for transactions - * @param network - the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url + * @param chainId - the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) * @param options - the SDK options to use * @param storage - the storage handler to use * @returns an instance of the SDK @@ -62,11 +62,11 @@ export class ThirdwebSDK extends RPCConnectionHandler { */ static fromSigner( signer: Signer, - network: ChainOrRpc, + chainId: ChainOrRpc, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - return new ThirdwebSDK(network, signer, options, storage); + return new ThirdwebSDK(chainId, signer, options, storage); } /** @@ -82,7 +82,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { * ``` * * @param privateKey - the private key - **DO NOT EXPOSE THIS TO THE PUBLIC** - * @param network - the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url + * @param chainId - the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) * @param options - the SDK options to use * @param storage - the storage handler to use * @returns an instance of the SDK @@ -91,12 +91,12 @@ export class ThirdwebSDK extends RPCConnectionHandler { */ static fromPrivateKey( privateKey: string, - network: ChainOrRpc, + chainId: ChainOrRpc, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { const signer = new ethers.Wallet(privateKey); - return ThirdwebSDK.fromSigner(signer, network, options, storage); + return ThirdwebSDK.fromSigner(signer, chainId, options, storage); } /** diff --git a/test/publisher.test.ts b/test/publisher.test.ts index da4701ba4..c98757798 100644 --- a/test/publisher.test.ts +++ b/test/publisher.test.ts @@ -238,7 +238,7 @@ describe("Publishing", async () => { [adminWallet.address, samWallet.address], ]), ]); - const c = await sdk.getContract(addr); + const c = await realSDK.getContract(addr); const uri = await c.call("contractUri"); expect(uri).to.eq(ethers.utils.hexZeroPad("0x1234", 32)); From 9414c581fd653b0ff3c8e656acbba3e9a02d1130 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Fri, 17 Jun 2022 16:36:49 -0700 Subject: [PATCH 08/20] expose nice error type --- docs/sdk.chainmismatcherror._constructor_.md | 21 ++++++++++++++++++++ docs/sdk.chainmismatcherror.md | 21 ++++++++++++++++++++ docs/sdk.md | 1 + docs/sdk.thirdwebsdk.fromprivatekey.md | 4 ++-- docs/sdk.thirdwebsdk.fromsigner.md | 4 ++-- docs/sdk.thirdwebsdk.md | 4 ++-- etc/sdk.api.md | 10 ++++++++-- src/common/error.ts | 12 +++++++++++ src/core/classes/contract-wrapper.ts | 9 +++------ src/core/classes/rpc-connection-handler.ts | 3 +-- 10 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 docs/sdk.chainmismatcherror._constructor_.md create mode 100644 docs/sdk.chainmismatcherror.md diff --git a/docs/sdk.chainmismatcherror._constructor_.md b/docs/sdk.chainmismatcherror._constructor_.md new file mode 100644 index 000000000..2541be70b --- /dev/null +++ b/docs/sdk.chainmismatcherror._constructor_.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ChainMismatchError](./sdk.chainmismatcherror.md) > [(constructor)](./sdk.chainmismatcherror._constructor_.md) + +## ChainMismatchError.(constructor) + +Constructs a new instance of the `ChainMismatchError` class + +Signature: + +```typescript +constructor(expectedChainId: ChainOrRpc, actualChainId: number); +``` + +## Parameters + +| Parameter | Type | Description | +| --- | --- | --- | +| expectedChainId | ChainOrRpc | | +| actualChainId | number | | + diff --git a/docs/sdk.chainmismatcherror.md b/docs/sdk.chainmismatcherror.md new file mode 100644 index 000000000..7af7a69a8 --- /dev/null +++ b/docs/sdk.chainmismatcherror.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ChainMismatchError](./sdk.chainmismatcherror.md) + +## ChainMismatchError class + +Thrown when trying to do a transaction on a non-expected chain + +Signature: + +```typescript +export declare class ChainMismatchError extends Error +``` +Extends: Error + +## Constructors + +| Constructor | Modifiers | Description | +| --- | --- | --- | +| [(constructor)(expectedChainId, actualChainId)](./sdk.chainmismatcherror._constructor_.md) | | Constructs a new instance of the ChainMismatchError class | + diff --git a/docs/sdk.md b/docs/sdk.md index b8b731517..321414292 100644 --- a/docs/sdk.md +++ b/docs/sdk.md @@ -8,6 +8,7 @@ | Class | Description | | --- | --- | +| [ChainMismatchError](./sdk.chainmismatcherror.md) | Thrown when trying to do a transaction on a non-expected chain | | [ContractDeployer](./sdk.contractdeployer.md) | Handles deploying new contracts | | [ContractEncoder](./sdk.contractencoder.md) | Encodes and decodes Contract functions | | [ContractEvents](./sdk.contractevents.md) | Listen to Contract events in real time | diff --git a/docs/sdk.thirdwebsdk.fromprivatekey.md b/docs/sdk.thirdwebsdk.fromprivatekey.md index 94ccdf34b..538c1091b 100644 --- a/docs/sdk.thirdwebsdk.fromprivatekey.md +++ b/docs/sdk.thirdwebsdk.fromprivatekey.md @@ -12,7 +12,7 @@ Get an instance of the thirdweb SDK based on a private key. Signature: ```typescript -static fromPrivateKey(privateKey: string, network: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; +static fromPrivateKey(privateKey: string, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; ``` ## Parameters @@ -20,7 +20,7 @@ static fromPrivateKey(privateKey: string, network: ChainOrRpc, options?: SDKOpti | Parameter | Type | Description | | --- | --- | --- | | privateKey | string | the private key - \*\*DO NOT EXPOSE THIS TO THE PUBLIC\*\* | -| network | ChainOrRpc | the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url | +| chainId | ChainOrRpc | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | | storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | diff --git a/docs/sdk.thirdwebsdk.fromsigner.md b/docs/sdk.thirdwebsdk.fromsigner.md index e9a4c6f41..5eecad831 100644 --- a/docs/sdk.thirdwebsdk.fromsigner.md +++ b/docs/sdk.thirdwebsdk.fromsigner.md @@ -12,7 +12,7 @@ Get an instance of the thirdweb SDK based on an existing ethers signer Signature: ```typescript -static fromSigner(signer: Signer, network: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; +static fromSigner(signer: Signer, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; ``` ## Parameters @@ -20,7 +20,7 @@ static fromSigner(signer: Signer, network: ChainOrRpc, options?: SDKOptions, sto | Parameter | Type | Description | | --- | --- | --- | | signer | Signer | a ethers Signer to be used for transactions | -| network | ChainOrRpc | the network (chain) to connect to (e.g. "mainnet", "rinkeby", "polygon", "mumbai"...) or a fully formed RPC url | +| chainId | ChainOrRpc | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | | storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | diff --git a/docs/sdk.thirdwebsdk.md b/docs/sdk.thirdwebsdk.md index 3cd64f115..7a9b14dd3 100644 --- a/docs/sdk.thirdwebsdk.md +++ b/docs/sdk.thirdwebsdk.md @@ -31,8 +31,8 @@ export declare class ThirdwebSDK extends RPCConnectionHandler | Method | Modifiers | Description | | --- | --- | --- | -| [fromPrivateKey(privateKey, network, options, storage)](./sdk.thirdwebsdk.fromprivatekey.md) | static | (BETA) Get an instance of the thirdweb SDK based on a private key. | -| [fromSigner(signer, network, options, storage)](./sdk.thirdwebsdk.fromsigner.md) | static | (BETA) Get an instance of the thirdweb SDK based on an existing ethers signer | +| [fromPrivateKey(privateKey, chainId, options, storage)](./sdk.thirdwebsdk.fromprivatekey.md) | static | (BETA) Get an instance of the thirdweb SDK based on a private key. | +| [fromSigner(signer, chainId, options, storage)](./sdk.thirdwebsdk.fromsigner.md) | static | (BETA) Get an instance of the thirdweb SDK based on an existing ethers signer | | [getContract(address)](./sdk.thirdwebsdk.getcontract.md) | | (BETA) Get an instance of a Custom ThirdwebContract | | [getContractFromAbi(address, abi)](./sdk.thirdwebsdk.getcontractfromabi.md) | | (BETA) Get an instance of a Custom contract from a json ABI | | [getContractList(walletAddress)](./sdk.thirdwebsdk.getcontractlist.md) | | Return all the contracts deployed by the specified address | diff --git a/etc/sdk.api.md b/etc/sdk.api.md index c44275faa..540ede69b 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -189,6 +189,12 @@ export enum ChainId { Rinkeby = 4 } +// @public +export class ChainMismatchError extends Error { + // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal + constructor(expectedChainId: ChainOrRpc, actualChainId: number); +} + // @public (undocumented) export const chainNameToId: Record; @@ -4999,11 +5005,11 @@ export class ThirdwebSDK extends RPCConnectionHandler { // Warning: (ae-incompatible-release-tags) The symbol "fromPrivateKey" is marked as @beta, but its signature references "ChainOrRpc" which is marked as @internal // // @beta - static fromPrivateKey(privateKey: string, network: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; + static fromPrivateKey(privateKey: string, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; // Warning: (ae-incompatible-release-tags) The symbol "fromSigner" is marked as @beta, but its signature references "ChainOrRpc" which is marked as @internal // // @beta - static fromSigner(signer: Signer, network: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; + static fromSigner(signer: Signer, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; // @internal (undocumented) getBuiltInContract(address: string, contractType: TContractType): ContractForContractType; // @beta diff --git a/src/common/error.ts b/src/common/error.ts index 305a79993..3b9a5edea 100644 --- a/src/common/error.ts +++ b/src/common/error.ts @@ -1,4 +1,5 @@ import { BigNumberish, providers } from "ethers"; +import { ChainOrRpc } from "../constants/index"; /** * Error that may get thrown if IPFS returns nothing for a given uri. @@ -11,6 +12,17 @@ export class NotFoundError extends Error { } } +/** + * Thrown when trying to do a transaction on a non-expected chain + */ +export class ChainMismatchError extends Error { + constructor(expectedChainId: ChainOrRpc, actualChainId: number) { + super( + `Chain Mismatch Error: Trying to call a contract on chain '${expectedChainId}', but the connected signer is on chain '${actualChainId}'`, + ); + } +} + /** * Error that may get thrown if an invalid address was passed * @internal diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index e7d37a7e7..ec7c96daf 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -31,7 +31,7 @@ import { signEIP2612Permit } from "../../common/permit"; import { signTypedDataInternal } from "../../common/sign"; import { getPolygonGasPriorityFee } from "../../common/gas-price"; import { ChainId, chainNameToId } from "../../constants"; -import { convertToTWError } from "../../common"; +import { ChainMismatchError, convertToTWError } from "../../common"; import { isBrowser } from "../../common/utils"; /** @@ -281,11 +281,8 @@ export class ContractWrapper< : passedInNetwork; // expectedChainId might not be found if we got passed a rpc url directly, in that case let the tx go through // TODO create a provider from the url - if (expectedChainId) { - invariant( - chainId === expectedChainId, - `Chain mismatch Error: Trying to call a contract on chain '${expectedChainId}', but the connected signer is on chain '${chainId}'.`, - ); + if (expectedChainId && chainId !== expectedChainId) { + throw new ChainMismatchError(expectedChainId, chainId); } if (!callOverrides) { diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 5474c649f..5cf0a81c3 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -1,7 +1,6 @@ import { providers, Signer } from "ethers"; -import { chainNameToId, getProviderForChain } from "../../constants/urls"; import { ConnectionInfo } from "../types"; -import { ChainOrRpc } from "../../constants"; +import { ChainOrRpc, getProviderForChain } from "../../constants"; import { EventEmitter2 } from "eventemitter2"; import { SDKOptions, From 2b9c2b8703fd702377b3a6463377a03d87de25d1 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Sat, 18 Jun 2022 09:32:12 -0700 Subject: [PATCH 09/20] fix auth tests --- src/core/wallet/UserWallet.ts | 2 -- test/auth.test.ts | 30 +++++++++++++++--------------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/core/wallet/UserWallet.ts b/src/core/wallet/UserWallet.ts index 47b3e7bbf..196f88fbc 100644 --- a/src/core/wallet/UserWallet.ts +++ b/src/core/wallet/UserWallet.ts @@ -36,8 +36,6 @@ export class UserWallet { this.options = options; } - // TODO connect() - // TODO disconnect() // TODO switchChain() // TODO event listener // TODO tokens() diff --git a/test/auth.test.ts b/test/auth.test.ts index fa22e50a8..3eaa89094 100644 --- a/test/auth.test.ts +++ b/test/auth.test.ts @@ -1,7 +1,7 @@ import { signers } from "./before-setup"; import { expect } from "chai"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { ThirdwebSDK } from "../src"; +import { ChainId, ThirdwebSDK } from "../src"; describe("Wallet Authentication", async () => { let adminWallet: SignerWithAddress, @@ -12,17 +12,17 @@ describe("Wallet Authentication", async () => { before(async () => { [adminWallet, signerWallet, attackerWallet] = signers; - sdk = new ThirdwebSDK(adminWallet); + sdk = ThirdwebSDK.fromSigner(adminWallet, ChainId.Hardhat); }); beforeEach(async () => { - sdk.updateSignerOrProvider(signerWallet); + sdk.wallet.connect(signerWallet); }); it("Should verify logged in wallet", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = sdk.auth.verify(domain, payload); expect(address).to.equal(signerWallet.address); @@ -34,7 +34,7 @@ describe("Wallet Authentication", async () => { chainId: 137, }); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const address = sdk.auth.verify(domain, payload, { chainId: 137, }); @@ -45,7 +45,7 @@ describe("Wallet Authentication", async () => { it("Should reject payload with incorrect domain", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); try { sdk.auth.verify("test.thirdweb.com", payload); expect.fail(); @@ -61,7 +61,7 @@ describe("Wallet Authentication", async () => { expirationTime: new Date(Date.now() - 1000 * 60 * 5), }); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); try { sdk.auth.verify(domain, payload); expect.fail(); @@ -75,7 +75,7 @@ describe("Wallet Authentication", async () => { chainId: 1, }); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); try { sdk.auth.verify(domain, payload, { chainId: 137, @@ -92,7 +92,7 @@ describe("Wallet Authentication", async () => { const payload = await sdk.auth.login(domain); payload.payload.address = attackerWallet.address; - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); try { sdk.auth.verify(domain, payload); expect.fail(); @@ -104,7 +104,7 @@ describe("Wallet Authentication", async () => { it("Should generate valid authentication token", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const token = await sdk.auth.generateAuthToken(domain, payload); const address = await sdk.auth.authenticate(domain, token); @@ -114,7 +114,7 @@ describe("Wallet Authentication", async () => { it("Should reject token with incorrect domain", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const token = await sdk.auth.generateAuthToken(domain, payload); try { @@ -130,7 +130,7 @@ describe("Wallet Authentication", async () => { it("Should reject token before invalid before", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const token = await sdk.auth.generateAuthToken(domain, payload, { invalidBefore: new Date(Date.now() + 1000 * 60 * 5), }); @@ -146,7 +146,7 @@ describe("Wallet Authentication", async () => { it("Should reject expired authentication token", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const token = await sdk.auth.generateAuthToken(domain, payload, { expirationTime: new Date(Date.now() - 1000 * 60 * 5), }); @@ -162,10 +162,10 @@ describe("Wallet Authentication", async () => { it("Should reject if admin address is not connected wallet address", async () => { const payload = await sdk.auth.login(domain); - sdk.updateSignerOrProvider(adminWallet); + sdk.wallet.connect(adminWallet); const token = await sdk.auth.generateAuthToken(domain, payload); - sdk.updateSignerOrProvider(signerWallet); + sdk.wallet.connect(signerWallet); try { await sdk.auth.authenticate(domain, token); expect.fail(); From 260419a00ab575c9303d8f83cb68d9e86cd092a8 Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Sat, 18 Jun 2022 15:44:34 -0700 Subject: [PATCH 10/20] type wallet events + add disconnect handling in SDK --- docs/sdk.md | 1 + docs/sdk.userwallet.events.md | 2 +- docs/sdk.userwallet.md | 2 +- docs/sdk.userwalletevents.connected.md | 13 ++ docs/sdk.userwalletevents.disconnected.md | 13 ++ docs/sdk.userwalletevents.md | 21 +++ docs/sdk.walletauthenticator._constructor_.md | 4 +- docs/sdk.walletauthenticator.md | 2 +- etc/sdk.api.md | 133 ++---------------- package.json | 1 - src/core/sdk.ts | 7 +- src/core/wallet/UserWallet.ts | 19 ++- yarn.lock | 10 -- 13 files changed, 87 insertions(+), 141 deletions(-) create mode 100644 docs/sdk.userwalletevents.connected.md create mode 100644 docs/sdk.userwalletevents.disconnected.md create mode 100644 docs/sdk.userwalletevents.md diff --git a/docs/sdk.md b/docs/sdk.md index 4be8c6797..bc4cb8f8e 100644 --- a/docs/sdk.md +++ b/docs/sdk.md @@ -105,6 +105,7 @@ | [SplitRecipientInput](./sdk.splitrecipientinput.md) | | | [TokenContractDeployMetadata](./sdk.tokencontractdeploymetadata.md) | Options for deploying a Token contract | | [UploadProgressEvent](./sdk.uploadprogressevent.md) | | +| [UserWalletEvents](./sdk.userwalletevents.md) | [UserWallet](./sdk.userwallet.md) events that you can subscribe to using sdk.wallet.events. | | [VoteContractDeployMetadata](./sdk.votecontractdeploymetadata.md) | Options for deploying a Vote contract | | [VoteSettings](./sdk.votesettings.md) | | diff --git a/docs/sdk.userwallet.events.md b/docs/sdk.userwallet.events.md index 9453ec884..bcbc0818f 100644 --- a/docs/sdk.userwallet.events.md +++ b/docs/sdk.userwallet.events.md @@ -7,5 +7,5 @@ Signature: ```typescript -events: StrictEventEmitter; +events: import("eventemitter3"); ``` diff --git a/docs/sdk.userwallet.md b/docs/sdk.userwallet.md index b3cfcc03b..d498feaaa 100644 --- a/docs/sdk.userwallet.md +++ b/docs/sdk.userwallet.md @@ -29,7 +29,7 @@ const balance = await sdk.wallet.balance(); | Property | Modifiers | Type | Description | | --- | --- | --- | --- | -| [events](./sdk.userwallet.events.md) | | StrictEventEmitter<EventEmitter2, WalletEvent> | | +| [events](./sdk.userwallet.events.md) | | import("eventemitter3")<[UserWalletEvents](./sdk.userwalletevents.md), any> | | ## Methods diff --git a/docs/sdk.userwalletevents.connected.md b/docs/sdk.userwalletevents.connected.md new file mode 100644 index 000000000..bc401ac70 --- /dev/null +++ b/docs/sdk.userwalletevents.connected.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWalletEvents](./sdk.userwalletevents.md) > [connected](./sdk.userwalletevents.connected.md) + +## UserWalletEvents.connected property + +Emitted when `sdk.wallet.connect()` is called. + +Signature: + +```typescript +connected: [Signer]; +``` diff --git a/docs/sdk.userwalletevents.disconnected.md b/docs/sdk.userwalletevents.disconnected.md new file mode 100644 index 000000000..afe40f4f8 --- /dev/null +++ b/docs/sdk.userwalletevents.disconnected.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWalletEvents](./sdk.userwalletevents.md) > [disconnected](./sdk.userwalletevents.disconnected.md) + +## UserWalletEvents.disconnected property + +Emitted when `sdk.wallet.disconnect()` is called. + +Signature: + +```typescript +disconnected: void; +``` diff --git a/docs/sdk.userwalletevents.md b/docs/sdk.userwalletevents.md new file mode 100644 index 000000000..9fd7b0291 --- /dev/null +++ b/docs/sdk.userwalletevents.md @@ -0,0 +1,21 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [UserWalletEvents](./sdk.userwalletevents.md) + +## UserWalletEvents interface + +[UserWallet](./sdk.userwallet.md) events that you can subscribe to using `sdk.wallet.events`. + +Signature: + +```typescript +export interface UserWalletEvents +``` + +## Properties + +| Property | Type | Description | +| --- | --- | --- | +| [connected](./sdk.userwalletevents.connected.md) | \[Signer\] | Emitted when sdk.wallet.connect() is called. | +| [disconnected](./sdk.userwalletevents.disconnected.md) | void | Emitted when sdk.wallet.disconnect() is called. | + diff --git a/docs/sdk.walletauthenticator._constructor_.md b/docs/sdk.walletauthenticator._constructor_.md index ed4969cda..dc6d174e4 100644 --- a/docs/sdk.walletauthenticator._constructor_.md +++ b/docs/sdk.walletauthenticator._constructor_.md @@ -12,14 +12,14 @@ Constructs a new instance of the `WalletAuthenticator` class Signature: ```typescript -constructor(network: NetworkOrSignerOrProvider, wallet: UserWallet, options: SDKOptions); +constructor(connection: ConnectionInfo, wallet: UserWallet, options: SDKOptions); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| network | [NetworkOrSignerOrProvider](./sdk.networkorsignerorprovider.md) | | +| connection | [ConnectionInfo](./sdk.connectioninfo.md) | | | wallet | [UserWallet](./sdk.userwallet.md) | | | options | [SDKOptions](./sdk.sdkoptions.md) | | diff --git a/docs/sdk.walletauthenticator.md b/docs/sdk.walletauthenticator.md index e072542d3..0cc15bb05 100644 --- a/docs/sdk.walletauthenticator.md +++ b/docs/sdk.walletauthenticator.md @@ -45,7 +45,7 @@ const address = sdk.auth.authenticate(domain, token); | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(network, wallet, options)](./sdk.walletauthenticator._constructor_.md) | | (BETA) Constructs a new instance of the WalletAuthenticator class | +| [(constructor)(connection, wallet, options)](./sdk.walletauthenticator._constructor_.md) | | (BETA) Constructs a new instance of the WalletAuthenticator class | ## Methods diff --git a/etc/sdk.api.md b/etc/sdk.api.md index ff18f1a3b..fe9b134b3 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -15,7 +15,8 @@ import { ContractInterface } from 'ethers'; import type { ContractTransaction } from 'ethers'; import { ethers } from 'ethers'; import { Event as Event_2 } from 'ethers'; -import { EventEmitter2 } from 'eventemitter2'; +import { EventEmitter } from 'eventemitter3'; +import { eventemitter3 } from 'eventemitter3'; import type { EventFilter } from 'ethers'; import type { EventFragment } from '@ethersproject/abi'; import { extendShape } from 'zod'; @@ -29,7 +30,6 @@ import { Provider } from '@ethersproject/providers'; import { providers } from 'ethers'; import type { Result } from '@ethersproject/abi'; import { Signer } from 'ethers'; -import StrictEventEmitter from 'strict-event-emitter-types'; import { TransactionReceipt } from '@ethersproject/abstract-provider'; import { utils } from 'ethers'; import { z } from 'zod'; @@ -3530,14 +3530,6 @@ export const Signature1155PayloadInput: z.ZodObject>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3549,24 +3541,16 @@ export const Signature1155PayloadInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: number; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; -<<<<<<< HEAD price?: string | number | undefined; mintStartTime?: Date | undefined; mintEndTime?: Date | undefined; uid?: string | undefined; primarySaleRecipient?: string | undefined; -======= - mintStartTime?: Date | undefined; - mintEndTime?: Date | undefined; ->>>>>>> main metadata?: string | { [x: string]: Json; name?: string | undefined; @@ -3578,11 +3562,8 @@ export const Signature1155PayloadInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; } | undefined; -<<<<<<< HEAD royaltyRecipient?: string | undefined; royaltyBps?: number | undefined; -======= ->>>>>>> main quantity: string | number | bigint | BigNumber; }>; @@ -3675,14 +3656,6 @@ export const Signature1155PayloadInputWithTokenId: z.ZodObject>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3694,25 +3667,17 @@ export const Signature1155PayloadInputWithTokenId: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: number; tokenId: string; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; -<<<<<<< HEAD price?: string | number | undefined; mintStartTime?: Date | undefined; mintEndTime?: Date | undefined; uid?: string | undefined; primarySaleRecipient?: string | undefined; -======= - mintStartTime?: Date | undefined; - mintEndTime?: Date | undefined; ->>>>>>> main metadata?: string | { [x: string]: Json; name?: string | undefined; @@ -3724,12 +3689,8 @@ export const Signature1155PayloadInputWithTokenId: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; } | undefined; -<<<<<<< HEAD royaltyRecipient?: string | undefined; royaltyBps?: number | undefined; -======= - tokenId: string | number | bigint | BigNumber; ->>>>>>> main quantity: string | number | bigint | BigNumber; tokenId: string | number | bigint | BigNumber; }>; @@ -3795,15 +3756,8 @@ export const Signature1155PayloadOutput: z.ZodObject>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3815,12 +3769,9 @@ export const Signature1155PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: BigNumber; tokenId: BigNumber; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; @@ -3832,8 +3783,6 @@ export const Signature1155PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyBps: string | number | bigint | BigNumber; tokenId: string | number | bigint | BigNumber; -======= ->>>>>>> main }>; // Warning: (ae-internal-missing-underscore) The name "Signature20PayloadInput" should be prefixed with an underscore because the declaration is marked as @internal @@ -3969,16 +3915,11 @@ export const Signature721PayloadInput: z.ZodObject, "strip", z.ZodTypeAny, { to: string; currencyAddress: string; -<<<<<<< HEAD price: string; mintStartTime: BigNumber; mintEndTime: BigNumber; uid: string; primarySaleRecipient: string; -======= - mintStartTime: BigNumber; - mintEndTime: BigNumber; ->>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -3990,11 +3931,8 @@ export const Signature721PayloadInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: number; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; @@ -4076,14 +4014,7 @@ export const Signature721PayloadOutput: z.ZodObject>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4095,11 +4026,8 @@ export const Signature721PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: BigNumber; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; @@ -4108,10 +4036,6 @@ export const Signature721PayloadOutput: z.ZodObject>>>>>> main mintStartTime: string | number | bigint | BigNumber; mintEndTime: string | number | bigint | BigNumber; metadata: string | { @@ -4125,10 +4049,7 @@ export const Signature721PayloadOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyBps: string | number | bigint | BigNumber; -======= ->>>>>>> main }>; // Warning: (ae-internal-missing-underscore) The name "Signature721WithQuantityInput" should be prefixed with an underscore because the declaration is marked as @internal @@ -4218,14 +4139,6 @@ export const Signature721WithQuantityInput: z.ZodObject>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4237,24 +4150,16 @@ export const Signature721WithQuantityInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: number; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; -<<<<<<< HEAD price?: string | number | undefined; mintStartTime?: Date | undefined; mintEndTime?: Date | undefined; uid?: string | undefined; primarySaleRecipient?: string | undefined; -======= - mintStartTime?: Date | undefined; - mintEndTime?: Date | undefined; ->>>>>>> main metadata?: string | { [x: string]: Json; name?: string | undefined; @@ -4266,11 +4171,8 @@ export const Signature721WithQuantityInput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; } | undefined; -<<<<<<< HEAD royaltyRecipient?: string | undefined; royaltyBps?: number | undefined; -======= ->>>>>>> main quantity: string | number | bigint | BigNumber; }>; @@ -4334,15 +4236,8 @@ export const Signature721WithQuantityOutput: z.ZodObject>>>>>> main metadata: string | { [x: string]: Json; name?: string | undefined; @@ -4354,11 +4249,8 @@ export const Signature721WithQuantityOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyRecipient: string; royaltyBps: BigNumber; -======= ->>>>>>> main }, { to?: string | undefined; currencyAddress?: string | undefined; @@ -4370,8 +4262,6 @@ export const Signature721WithQuantityOutput: z.ZodObject | Record[] | undefined; attributes?: Record | Record[] | undefined; }; -<<<<<<< HEAD royaltyBps: string | number | bigint | BigNumber; -======= ->>>>>>> main }>; // Warning: (ae-internal-missing-underscore) The name "SignatureDrop" should be prefixed with an underscore because the declaration is marked as @internal @@ -5105,13 +4992,9 @@ export const SUPPORTED_CHAIN_IDS: SUPPORTED_CHAIN_ID[]; // @public export class ThirdwebSDK extends RPCConnectionHandler { // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal -<<<<<<< HEAD constructor(chainId: ChainOrRpc, signer?: Signer | undefined, options?: SDKOptions, storage?: IStorage); -======= - constructor(network: ChainOrRpc | SignerOrProvider, options?: SDKOptions, storage?: IStorage); // Warning: (ae-incompatible-release-tags) The symbol "auth" is marked as @public, but its signature references "WalletAuthenticator" which is marked as @beta auth: WalletAuthenticator; ->>>>>>> main deployer: ContractDeployer; // Warning: (ae-incompatible-release-tags) The symbol "fromPrivateKey" is marked as @beta, but its signature references "ChainOrRpc" which is marked as @internal // @@ -5532,16 +5415,20 @@ export class UserWallet { connect(signer: Signer): void; // (undocumented) disconnect(): void; - // Warning: (ae-forgotten-export) The symbol "WalletEvent" needs to be exported by the entry point index.d.ts - // // (undocumented) - events: StrictEventEmitter; + events: eventemitter3; getAddress(): Promise; sendRawTransaction(transactionRequest: providers.TransactionRequest): Promise; sign(message: string): Promise; transfer(to: string, amount: Amount, currencyAddress?: string): Promise; } +// @public +export interface UserWalletEvents { + connected: [Signer]; + disconnected: void; +} + // Warning: (ae-incompatible-release-tags) The symbol "ValidContractClass" is marked as @public, but its signature references "KNOWN_CONTRACTS_MAP" which is marked as @internal // // @public (undocumented) @@ -5742,7 +5629,7 @@ export enum VoteType { // @beta export class WalletAuthenticator extends RPCConnectionHandler { - constructor(network: NetworkOrSignerOrProvider, wallet: UserWallet, options: SDKOptions); + constructor(connection: ConnectionInfo, wallet: UserWallet, options: SDKOptions); authenticate(domain: string, token: string): Promise; // Warning: (ae-forgotten-export) The symbol "AuthenticationOptions" needs to be exported by the entry point index.d.ts generateAuthToken(domain: string, payload: LoginPayload, options?: AuthenticationOptions): Promise; diff --git a/package.json b/package.json index 6fac0c200..5e4afddbf 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,6 @@ "fast-deep-equal": "^3.1.3", "form-data": "^4.0.0", "multihashes": "^4.0.3", - "strict-event-emitter-types": "^2.0.0", "tiny-invariant": "^1.2.0", "uuid": "^8.3.2", "zod": "^3.11.6" diff --git a/src/core/sdk.ts b/src/core/sdk.ts index ec1305599..fee218c2d 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -167,9 +167,14 @@ export class ThirdwebSDK extends RPCConnectionHandler { this.options, this.storageHandler, ); - this.wallet.events.on("connected", (s: Signer) => { + // when there is a new signer connected in the wallet sdk, update that signer + this.wallet.events.on("connected", (s) => { this.propagateSignerUpdated(s); }); + // when the wallet disconnects, update the signer to undefined + this.wallet.events.on("disconnected", () => { + this.propagateSignerUpdated(undefined); + }); } /** diff --git a/src/core/wallet/UserWallet.ts b/src/core/wallet/UserWallet.ts index 196f88fbc..bd6f55088 100644 --- a/src/core/wallet/UserWallet.ts +++ b/src/core/wallet/UserWallet.ts @@ -15,6 +15,23 @@ import { IERC20 } from "contracts"; import { BigNumber, providers, Signer } from "ethers"; import { EventEmitter } from "eventemitter3"; +/** + * + * {@link UserWallet} events that you can subscribe to using `sdk.wallet.events`. + * + * @public + */ +export interface UserWalletEvents { + /** + * Emitted when `sdk.wallet.connect()` is called. + */ + connected: [Signer]; + /** + * Emitted when `sdk.wallet.disconnect()` is called. + */ + disconnected: void; +} + /** * Connect and Interact with a user wallet * @example @@ -28,7 +45,7 @@ export class UserWallet { private signer: Signer | undefined; private options: SDKOptions; - public events = new EventEmitter(); + public events = new EventEmitter(); constructor(connection: ConnectionInfo, options: SDKOptions) { this.readOnlyProvider = new RPCConnectionHandler(connection); diff --git a/yarn.lock b/yarn.lock index 41a92c5ce..f411501a4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2553,11 +2553,6 @@ event-target-shim@^5.0.0: resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== -eventemitter2@^6.4.5: - version "6.4.5" - resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-6.4.5.tgz#97380f758ae24ac15df8353e0cc27f8b95644655" - integrity sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw== - eventemitter3@^4.0.7: version "4.0.7" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" @@ -4675,11 +4670,6 @@ stream-http@^3.2.0: readable-stream "^3.6.0" xtend "^4.0.2" -strict-event-emitter-types@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f" - integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA== - string-argv@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.1.tgz#95e2fbec0427ae19184935f816d74aaa4c5c19da" From 7c38d69a6beb9f00d463cfe73b1ce229f516096f Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Sat, 18 Jun 2022 16:47:20 -0700 Subject: [PATCH 11/20] import eventemitter from default export instead of named to resolve ESM build issues --- docs/sdk.userwallet.events.md | 2 +- docs/sdk.userwallet.md | 2 +- etc/sdk.api.md | 5 ++--- src/core/classes/rpc-connection-handler.ts | 2 +- src/core/wallet/UserWallet.ts | 2 +- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/docs/sdk.userwallet.events.md b/docs/sdk.userwallet.events.md index bcbc0818f..7eaa3aa0c 100644 --- a/docs/sdk.userwallet.events.md +++ b/docs/sdk.userwallet.events.md @@ -7,5 +7,5 @@ Signature: ```typescript -events: import("eventemitter3"); +events: EventEmitter; ``` diff --git a/docs/sdk.userwallet.md b/docs/sdk.userwallet.md index d498feaaa..349b27c30 100644 --- a/docs/sdk.userwallet.md +++ b/docs/sdk.userwallet.md @@ -29,7 +29,7 @@ const balance = await sdk.wallet.balance(); | Property | Modifiers | Type | Description | | --- | --- | --- | --- | -| [events](./sdk.userwallet.events.md) | | import("eventemitter3")<[UserWalletEvents](./sdk.userwalletevents.md), any> | | +| [events](./sdk.userwallet.events.md) | | EventEmitter<[UserWalletEvents](./sdk.userwalletevents.md), any> | | ## Methods diff --git a/etc/sdk.api.md b/etc/sdk.api.md index fe9b134b3..142d3316f 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -15,8 +15,7 @@ import { ContractInterface } from 'ethers'; import type { ContractTransaction } from 'ethers'; import { ethers } from 'ethers'; import { Event as Event_2 } from 'ethers'; -import { EventEmitter } from 'eventemitter3'; -import { eventemitter3 } from 'eventemitter3'; +import EventEmitter from 'eventemitter3'; import type { EventFilter } from 'ethers'; import type { EventFragment } from '@ethersproject/abi'; import { extendShape } from 'zod'; @@ -5416,7 +5415,7 @@ export class UserWallet { // (undocumented) disconnect(): void; // (undocumented) - events: eventemitter3; + events: EventEmitter; getAddress(): Promise; sendRawTransaction(transactionRequest: providers.TransactionRequest): Promise; sign(message: string): Promise; diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 01702f4e0..0ca895a99 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -1,7 +1,7 @@ import { providers, Signer } from "ethers"; import { ConnectionInfo } from "../types"; import { ChainOrRpc, getProviderForChain } from "../../constants"; -import { EventEmitter } from "eventemitter3"; +import EventEmitter from "eventemitter3"; import { SDKOptions, SDKOptionsOutput, diff --git a/src/core/wallet/UserWallet.ts b/src/core/wallet/UserWallet.ts index bd6f55088..8dab8c045 100644 --- a/src/core/wallet/UserWallet.ts +++ b/src/core/wallet/UserWallet.ts @@ -13,7 +13,7 @@ import ERC20Abi from "../../../abis/IERC20.json"; import { ContractWrapper } from "../classes/contract-wrapper"; import { IERC20 } from "contracts"; import { BigNumber, providers, Signer } from "ethers"; -import { EventEmitter } from "eventemitter3"; +import EventEmitter from "eventemitter3"; /** * From 14e678f8b6fa782fc93291d17d0f60cc867afe10 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Sat, 18 Jun 2022 21:47:11 -0700 Subject: [PATCH 12/20] enforce chainId everywhere, handle hardhat as special case --- docs/sdk.chainmismatcherror._constructor_.md | 4 +- docs/sdk.chainnametoid.md | 11 ---- docs/sdk.connectioninfo.md | 2 +- docs/sdk.defaultrpcmap.md | 11 ---- docs/sdk.getreadonlyprovider.md | 4 +- docs/sdk.md | 2 - docs/sdk.sdkoptions.md | 4 ++ docs/sdk.thirdwebsdk._constructor_.md | 5 +- docs/sdk.thirdwebsdk.fromprivatekey.md | 4 +- docs/sdk.thirdwebsdk.fromsigner.md | 4 +- docs/sdk.thirdwebsdk.md | 2 +- etc/sdk.api.md | 46 ++++++++-------- src/common/error.ts | 4 +- src/constants/urls.ts | 42 ++++++++------- src/core/classes/contract-wrapper.ts | 32 ++++++----- src/core/classes/rpc-connection-handler.ts | 15 +++--- src/core/sdk.ts | 56 +++++++++++++------- src/core/types.ts | 3 +- src/core/wallet/UserWallet.ts | 18 +++---- src/schema/sdk-options.ts | 4 ++ 20 files changed, 136 insertions(+), 137 deletions(-) delete mode 100644 docs/sdk.chainnametoid.md delete mode 100644 docs/sdk.defaultrpcmap.md diff --git a/docs/sdk.chainmismatcherror._constructor_.md b/docs/sdk.chainmismatcherror._constructor_.md index 2541be70b..7bb2e3cc8 100644 --- a/docs/sdk.chainmismatcherror._constructor_.md +++ b/docs/sdk.chainmismatcherror._constructor_.md @@ -9,13 +9,13 @@ Constructs a new instance of the `ChainMismatchError` class Signature: ```typescript -constructor(expectedChainId: ChainOrRpc, actualChainId: number); +constructor(expectedChainId: ChainIdOrName, actualChainId: number); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| expectedChainId | ChainOrRpc | | +| expectedChainId | ChainIdOrName | | | actualChainId | number | | diff --git a/docs/sdk.chainnametoid.md b/docs/sdk.chainnametoid.md deleted file mode 100644 index f9a881803..000000000 --- a/docs/sdk.chainnametoid.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [chainNameToId](./sdk.chainnametoid.md) - -## chainNameToId variable - -Signature: - -```typescript -chainNameToId: Record -``` diff --git a/docs/sdk.connectioninfo.md b/docs/sdk.connectioninfo.md index 60dbfa03a..4bf1687eb 100644 --- a/docs/sdk.connectioninfo.md +++ b/docs/sdk.connectioninfo.md @@ -8,7 +8,7 @@ ```typescript export declare type ConnectionInfo = { - chainId: ChainOrRpc; + chainId: number; signer: Signer | undefined; provider?: providers.Provider; }; diff --git a/docs/sdk.defaultrpcmap.md b/docs/sdk.defaultrpcmap.md deleted file mode 100644 index 87724d0fd..000000000 --- a/docs/sdk.defaultrpcmap.md +++ /dev/null @@ -1,11 +0,0 @@ - - -[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [defaultRPCMap](./sdk.defaultrpcmap.md) - -## defaultRPCMap variable - -Signature: - -```typescript -defaultRPCMap: Record -``` diff --git a/docs/sdk.getreadonlyprovider.md b/docs/sdk.getreadonlyprovider.md index 34f8e6a2d..ea6f3c967 100644 --- a/docs/sdk.getreadonlyprovider.md +++ b/docs/sdk.getreadonlyprovider.md @@ -7,7 +7,7 @@ Signature: ```typescript -export declare function getReadOnlyProvider(network: string, chainId?: number): ethers.providers.BaseProvider; +export declare function getReadOnlyProvider(network: string, chainId: number): ethers.providers.BaseProvider; ``` ## Parameters @@ -15,7 +15,7 @@ export declare function getReadOnlyProvider(network: string, chainId?: number): | Parameter | Type | Description | | --- | --- | --- | | network | string | the chain name or rpc url | -| chainId | number | (Optional) the optional chain id | +| chainId | number | the optional chain id | Returns: diff --git a/docs/sdk.md b/docs/sdk.md index bc4cb8f8e..2a7598eef 100644 --- a/docs/sdk.md +++ b/docs/sdk.md @@ -114,8 +114,6 @@ | Variable | Description | | --- | --- | | [ALL\_ROLES](./sdk.all_roles.md) | | -| [chainNameToId](./sdk.chainnametoid.md) | | -| [defaultRPCMap](./sdk.defaultrpcmap.md) | | | [MintRequest1155](./sdk.mintrequest1155.md) | | | [MintRequest20](./sdk.mintrequest20.md) | | | [MintRequest721](./sdk.mintrequest721.md) | | diff --git a/docs/sdk.sdkoptions.md b/docs/sdk.sdkoptions.md index f104d39bd..d666fc0f3 100644 --- a/docs/sdk.sdkoptions.md +++ b/docs/sdk.sdkoptions.md @@ -18,6 +18,10 @@ export declare type SDKOptions = z.input; ```javascript { + chainIdToRPCUrlMap: { + ChainId.Mainnet: "https://mainnet.infura.io/v3/YOUR_INFURA_KEY", + 1337: "http://localhost:8545", + } readonlySettings: { rpcUrl, // force read calls to go through your own RPC url chainId, // reduce RPC calls by sepcifying your chain ID diff --git a/docs/sdk.thirdwebsdk._constructor_.md b/docs/sdk.thirdwebsdk._constructor_.md index 383f2a09f..0f1ce1bf3 100644 --- a/docs/sdk.thirdwebsdk._constructor_.md +++ b/docs/sdk.thirdwebsdk._constructor_.md @@ -9,15 +9,14 @@ Constructs a new instance of the `ThirdwebSDK` class Signature: ```typescript -constructor(chainId: ChainOrRpc, signer?: Signer | undefined, options?: SDKOptions, storage?: IStorage); +constructor(chain: ChainIdOrName, options?: SDKOptions, storage?: IStorage); ``` ## Parameters | Parameter | Type | Description | | --- | --- | --- | -| chainId | ChainOrRpc | | -| signer | Signer \| undefined | (Optional) | +| chain | ChainIdOrName | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) | | storage | [IStorage](./sdk.istorage.md) | (Optional) | diff --git a/docs/sdk.thirdwebsdk.fromprivatekey.md b/docs/sdk.thirdwebsdk.fromprivatekey.md index 538c1091b..36e1327ff 100644 --- a/docs/sdk.thirdwebsdk.fromprivatekey.md +++ b/docs/sdk.thirdwebsdk.fromprivatekey.md @@ -12,7 +12,7 @@ Get an instance of the thirdweb SDK based on a private key. Signature: ```typescript -static fromPrivateKey(privateKey: string, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; +static fromPrivateKey(privateKey: string, chainId: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; ``` ## Parameters @@ -20,7 +20,7 @@ static fromPrivateKey(privateKey: string, chainId: ChainOrRpc, options?: SDKOpti | Parameter | Type | Description | | --- | --- | --- | | privateKey | string | the private key - \*\*DO NOT EXPOSE THIS TO THE PUBLIC\*\* | -| chainId | ChainOrRpc | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | +| chainId | ChainIdOrName | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | | storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | diff --git a/docs/sdk.thirdwebsdk.fromsigner.md b/docs/sdk.thirdwebsdk.fromsigner.md index 5eecad831..ed7478803 100644 --- a/docs/sdk.thirdwebsdk.fromsigner.md +++ b/docs/sdk.thirdwebsdk.fromsigner.md @@ -12,7 +12,7 @@ Get an instance of the thirdweb SDK based on an existing ethers signer Signature: ```typescript -static fromSigner(signer: Signer, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; +static fromSigner(signer: Signer, chainId: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; ``` ## Parameters @@ -20,7 +20,7 @@ static fromSigner(signer: Signer, chainId: ChainOrRpc, options?: SDKOptions, sto | Parameter | Type | Description | | --- | --- | --- | | signer | Signer | a ethers Signer to be used for transactions | -| chainId | ChainOrRpc | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | +| chainId | ChainIdOrName | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | | storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | diff --git a/docs/sdk.thirdwebsdk.md b/docs/sdk.thirdwebsdk.md index b815b67d1..2e9b635be 100644 --- a/docs/sdk.thirdwebsdk.md +++ b/docs/sdk.thirdwebsdk.md @@ -17,7 +17,7 @@ export declare class ThirdwebSDK extends RPCConnectionHandler | Constructor | Modifiers | Description | | --- | --- | --- | -| [(constructor)(chainId, signer, options, storage)](./sdk.thirdwebsdk._constructor_.md) | | Constructs a new instance of the ThirdwebSDK class | +| [(constructor)(chain, options, storage)](./sdk.thirdwebsdk._constructor_.md) | | Constructs a new instance of the ThirdwebSDK class | ## Properties diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 142d3316f..39f7b9976 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -188,19 +188,21 @@ export enum ChainId { Rinkeby = 4 } +// Warning: (ae-internal-missing-underscore) The name "ChainIdOrName" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export type ChainIdOrName = "mumbai" | "polygon" | "matic" | "rinkeby" | "goerli" | "mainnet" | "ethereum" | "fantom" | "avalanche" | "optimism" | "optimism-testnet" | "arbitrum" | "arbitrum-testnet" | ChainId | (number & {}); + // @public export class ChainMismatchError extends Error { - // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal - constructor(expectedChainId: ChainOrRpc, actualChainId: number); + // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + constructor(expectedChainId: ChainIdOrName, actualChainId: number); } -// @public (undocumented) -export const chainNameToId: Record; - -// Warning: (ae-internal-missing-underscore) The name "ChainOrRpc" should be prefixed with an underscore because the declaration is marked as @internal +// Warning: (ae-internal-missing-underscore) The name "chainNameToId" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -export type ChainOrRpc = "mumbai" | "polygon" | "matic" | "rinkeby" | "goerli" | "mainnet" | "ethereum" | "fantom" | "avalanche" | "optimism" | "optimism-testnet" | "arbitrum" | "arbitrum-testnet" | (string & {}) | (number & {}); +export const chainNameToId: Record; // Warning: (ae-internal-missing-underscore) The name "CidWithFileName" should be prefixed with an underscore because the declaration is marked as @internal // @@ -554,7 +556,7 @@ export const CommonTrustedForwarderSchema: z.ZodObject<{ // @public (undocumented) export type ConnectionInfo = { - chainId: ChainOrRpc; + chainId: number; signer: Signer | undefined; provider?: providers.Provider; }; @@ -855,8 +857,10 @@ export const DEFAULT_IPFS_GATEWAY = "https://gateway.ipfscdn.io/ipfs/"; // @internal (undocumented) export const DEFAULT_QUERY_ALL_COUNT = 100; -// @public (undocumented) -export const defaultRPCMap: Record; +// Warning: (ae-internal-missing-underscore) The name "defaultRPCMap" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export const defaultRPCMap: Record; // Warning: (ae-forgotten-export) The symbol "DropERC721" needs to be exported by the entry point index.d.ts // Warning: (ae-forgotten-export) The symbol "BaseDelayedRevealERC721" needs to be exported by the entry point index.d.ts @@ -1981,10 +1985,10 @@ export function getNativeTokenByChainId(chainId: ChainId): NativeToken; // Warning: (ae-internal-missing-underscore) The name "getProviderForChain" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -export function getProviderForChain(network: ChainOrRpc, customRpcMap?: Record): Provider; +export function getProviderForChain(chainId: number, customRpcMap?: Record): Provider; // @public (undocumented) -export function getReadOnlyProvider(network: string, chainId?: number): ethers.providers.BaseProvider; +export function getReadOnlyProvider(network: string, chainId: number): ethers.providers.BaseProvider; // Warning: (ae-internal-missing-underscore) The name "getRoleHash" should be prefixed with an underscore because the declaration is marked as @internal // @@ -1994,7 +1998,7 @@ export function getRoleHash(role: Role): BytesLike; // Warning: (ae-internal-missing-underscore) The name "getRpcUrl" should be prefixed with an underscore because the declaration is marked as @internal // // @internal (undocumented) -export function getRpcUrl(network: ChainOrRpc, customRpcMap?: Record): string; +export function getRpcUrl(chainId: number, customRpcMap?: Record): string; // Warning: (ae-internal-missing-underscore) The name "hasFunction" should be prefixed with an underscore because the declaration is marked as @internal // @@ -4990,19 +4994,19 @@ export const SUPPORTED_CHAIN_IDS: SUPPORTED_CHAIN_ID[]; // @public export class ThirdwebSDK extends RPCConnectionHandler { - // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal - constructor(chainId: ChainOrRpc, signer?: Signer | undefined, options?: SDKOptions, storage?: IStorage); + // Warning: (ae-incompatible-release-tags) The symbol "__constructor" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + constructor(chain: ChainIdOrName, options?: SDKOptions, storage?: IStorage); // Warning: (ae-incompatible-release-tags) The symbol "auth" is marked as @public, but its signature references "WalletAuthenticator" which is marked as @beta auth: WalletAuthenticator; deployer: ContractDeployer; - // Warning: (ae-incompatible-release-tags) The symbol "fromPrivateKey" is marked as @beta, but its signature references "ChainOrRpc" which is marked as @internal + // Warning: (ae-incompatible-release-tags) The symbol "fromPrivateKey" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal // // @beta - static fromPrivateKey(privateKey: string, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; - // Warning: (ae-incompatible-release-tags) The symbol "fromSigner" is marked as @beta, but its signature references "ChainOrRpc" which is marked as @internal + static fromPrivateKey(privateKey: string, chainId: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; + // Warning: (ae-incompatible-release-tags) The symbol "fromSigner" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal // // @beta - static fromSigner(signer: Signer, chainId: ChainOrRpc, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; + static fromSigner(signer: Signer, chainId: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; // @internal (undocumented) getBuiltInContract(address: string, contractType: TContractType): ContractForContractType; // @beta @@ -5653,10 +5657,6 @@ export class WrongListingTypeError extends Error { constructor(marketplaceContractAddress: string, listingId?: string, actualType?: string, expectedType?: string); } -// Warnings were encountered during analysis: -// -// dist/src/core/types.d.ts:21:5 - (ae-incompatible-release-tags) The symbol "chainId" is marked as @public, but its signature references "ChainOrRpc" which is marked as @internal - // (No @packageDocumentation comment for this package) ``` diff --git a/src/common/error.ts b/src/common/error.ts index 3b9a5edea..5269e3752 100644 --- a/src/common/error.ts +++ b/src/common/error.ts @@ -1,5 +1,5 @@ import { BigNumberish, providers } from "ethers"; -import { ChainOrRpc } from "../constants/index"; +import { ChainIdOrName } from "../constants/index"; /** * Error that may get thrown if IPFS returns nothing for a given uri. @@ -16,7 +16,7 @@ export class NotFoundError extends Error { * Thrown when trying to do a transaction on a non-expected chain */ export class ChainMismatchError extends Error { - constructor(expectedChainId: ChainOrRpc, actualChainId: number) { + constructor(expectedChainId: ChainIdOrName, actualChainId: number) { super( `Chain Mismatch Error: Trying to call a contract on chain '${expectedChainId}', but the connected signer is on chain '${actualChainId}'`, ); diff --git a/src/constants/urls.ts b/src/constants/urls.ts index e0e0e2d1f..49c8488ae 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -25,7 +25,7 @@ export const PINATA_IPFS_URL = `https://api.pinata.cloud/pinning/pinFileToIPFS`; /** * @internal */ -export type ChainOrRpc = +export type ChainIdOrName = | "mumbai" | "polygon" // common alias for `polygon` @@ -41,10 +41,12 @@ export type ChainOrRpc = | "optimism-testnet" | "arbitrum" | "arbitrum-testnet" - // ideally we could use `https://${string}` notation here, but doing that causes anything that is a generic string to throw a type error => not worth the hassle for now - | (string & {}) + | ChainId | (number & {}); +/** + * @internal + */ export const chainNameToId: Record = { mumbai: ChainId.Mumbai, rinkeby: ChainId.Rinkeby, @@ -65,7 +67,13 @@ export const chainNameToId: Record = { */ const DEFAULT_API_KEY = "_gg7wSSi0KMBsdKnGVfHDueq6xMB9EkC"; -export const defaultRPCMap: Record = { +/** + * @internal + */ +export const defaultRPCMap: Record< + SUPPORTED_CHAIN_ID | ChainId.Hardhat | ChainId.Localhost, + string +> = { [ChainId.Polygon]: `https://polygon-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`, [ChainId.Mumbai]: `https://polygon-mumbai.g.alchemy.com/v2/${DEFAULT_API_KEY}`, [ChainId.Mainnet]: `https://eth-mainnet.g.alchemy.com/v2/${DEFAULT_API_KEY}`, @@ -79,25 +87,19 @@ export const defaultRPCMap: Record = { [ChainId.FantomTestnet]: "https://rpc.testnet.fantom.network", [ChainId.Avalanche]: "https://rpc.ankr.com/avalanche", [ChainId.AvalancheFujiTestnet]: "https://api.avax-test.network/ext/bc/C/rpc", + [ChainId.Hardhat]: "http://localhost:8545", + [ChainId.Localhost]: "http://localhost:8545", }; /** * @internal - * @param network + * @param chainId * @param customRpcMap */ export function getRpcUrl( - network: ChainOrRpc, + chainId: number, customRpcMap?: Record, ): string { - if ( - typeof network === "string" && - (network.startsWith("http") || network.startsWith("ws")) - ) { - return network; - } - const chainId: number = - typeof network === "string" ? chainNameToId[network] : network; const fullRpcMap: Record = { ...defaultRPCMap, ...customRpcMap, @@ -105,21 +107,21 @@ export function getRpcUrl( if (chainId in fullRpcMap) { return fullRpcMap[chainId]; } - throw new Error(`Unrecognized chain name or RPC url: ${network}.`); + throw new Error(`Unrecognized chain name or RPC url: ${chainId}.`); } /** * @internal - * @param network - the chain name or rpc url + * @param chainId * @param customRpcMap * @returns the rpc url for that chain */ export function getProviderForChain( - network: ChainOrRpc, + chainId: number, customRpcMap?: Record, ): Provider { - const rpcUrl = getRpcUrl(network, customRpcMap); - return getReadOnlyProvider(rpcUrl); + const rpcUrl = getRpcUrl(chainId, customRpcMap); + return getReadOnlyProvider(rpcUrl, chainId); } /** @@ -128,7 +130,7 @@ export function getProviderForChain( * @param chainId - the optional chain id * @returns the provider */ -export function getReadOnlyProvider(network: string, chainId?: number) { +export function getReadOnlyProvider(network: string, chainId: number) { try { const match = network.match(/^(ws|http)s?:/i); // try the JSON batch provider if available diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index ec7c96daf..cc12a4f83 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -30,7 +30,7 @@ import { getContractAddressByChainId } from "../../constants/addresses"; import { signEIP2612Permit } from "../../common/permit"; import { signTypedDataInternal } from "../../common/sign"; import { getPolygonGasPriorityFee } from "../../common/gas-price"; -import { ChainId, chainNameToId } from "../../constants"; +import { ChainId } from "../../constants"; import { ChainMismatchError, convertToTWError } from "../../common"; import { isBrowser } from "../../common/utils"; @@ -76,6 +76,10 @@ export class ContractWrapper< this.writeContract = this.writeContract.connect( this.getSignerOrProvider(), ) as TContract; + + this.readContract = this.writeContract.connect( + this.getProvider(), + ) as TContract; } /** @@ -258,6 +262,16 @@ export class ContractWrapper< args: any[], callOverrides?: CallOverrides, ): Promise { + // check if the signer is present and on the expected chain + const signer = this.getSigner(); + invariant(signer, "Cannot execute a transaction without valid signer"); + const chainId = await signer.getChainId(); + // get the expected chainId from the passed in network (network name or chainId or rpc url) + const expectedChainId = this.getConnectionInfo().chainId; + if (expectedChainId && chainId !== expectedChainId) { + throw new ChainMismatchError(expectedChainId, chainId); + } + // one time verification that this is a valid contract (to avoid sending funds to wrong addresses) if (!this.isValidContract) { const code = await this.getProvider().getCode(this.readContract.address); @@ -269,22 +283,6 @@ export class ContractWrapper< } } - // check if the signer is present and on the expected chain - const signer = this.getSigner(); - invariant(signer, "Cannot execute a transaction without valid signer"); - const chainId = await signer.getChainId(); - // get the expected chainId from the passed in network (network name or chainId or rpc url) - const passedInNetwork = this.getConnectionInfo().chainId; - const expectedChainId: number = - typeof passedInNetwork === "string" - ? chainNameToId[passedInNetwork] - : passedInNetwork; - // expectedChainId might not be found if we got passed a rpc url directly, in that case let the tx go through - // TODO create a provider from the url - if (expectedChainId && chainId !== expectedChainId) { - throw new ChainMismatchError(expectedChainId, chainId); - } - if (!callOverrides) { callOverrides = await this.getCallOverrides(); } diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 0ca895a99..610e31fc6 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -1,6 +1,6 @@ import { providers, Signer } from "ethers"; import { ConnectionInfo } from "../types"; -import { ChainOrRpc, getProviderForChain } from "../../constants"; +import { ChainId, getProviderForChain } from "../../constants"; import EventEmitter from "eventemitter3"; import { SDKOptions, @@ -13,11 +13,10 @@ import { */ export class RPCConnectionHandler extends EventEmitter { protected options: SDKOptionsOutput; - private chainId: ChainOrRpc; // TODO (rpc) enforce this to be a pure ChainId + private chainId: number; private provider: providers.Provider; private signer: Signer | undefined; - // TODO (rpc) needs the options to be passed in to override RPC urls constructor(connection: ConnectionInfo, options: SDKOptions = {}) { super(); try { @@ -39,11 +38,6 @@ export class RPCConnectionHandler extends EventEmitter { this.signer = connection.signer; } - // TODO (rpc) see if we need to expose this - // public updateProvider(provider: Provider) { - // this.provider = provider; - // } - /** * The function to call whenever the network changes, such as when the users connects their wallet, disconnects their wallet, the connected chain changes, etc. * @@ -52,6 +46,11 @@ export class RPCConnectionHandler extends EventEmitter { */ public updateSigner(signer: Signer | undefined) { this.signer = signer; + // TODO (rpc) - make sure we don't need to do this for type of signers + if (this.chainId === ChainId.Hardhat) { + // For hardhat tests - the provider inside the signer is enhanced for tests, need to use it as the provider + this.provider = signer?.provider || this.provider; + } } /** * diff --git a/src/core/sdk.ts b/src/core/sdk.ts index fee218c2d..3bcc555e4 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -31,7 +31,7 @@ import invariant from "tiny-invariant"; import { TokenDrop } from "../contracts/token-drop"; import { ContractPublisher } from "./classes/contract-publisher"; import { ContractMetadata } from "./classes"; -import { ChainOrRpc } from "../constants"; +import { chainNameToId, ChainIdOrName } from "../constants"; import { UserWallet } from "./wallet/UserWallet"; import { Multiwrap } from "../contracts/multiwrap"; import { WalletAuthenticator } from "./auth/wallet-authenticator"; @@ -63,11 +63,13 @@ export class ThirdwebSDK extends RPCConnectionHandler { */ static fromSigner( signer: Signer, - chainId: ChainOrRpc, + chainId: ChainIdOrName, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - return new ThirdwebSDK(chainId, signer, options, storage); + const sdk = new ThirdwebSDK(chainId, options, storage); + sdk.wallet.connect(signer); + return sdk; } /** @@ -92,7 +94,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { */ static fromPrivateKey( privateKey: string, - chainId: ChainOrRpc, + chainId: ChainIdOrName, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { @@ -135,26 +137,17 @@ export class ThirdwebSDK extends RPCConnectionHandler { public auth: WalletAuthenticator; constructor( - chainId: ChainOrRpc, - signer: Signer | undefined = undefined, + chain: ChainIdOrName, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ) { // Throw helpful error for old usages of this constructor - if (Signer.isSigner(chainId)) { - throw new Error( - "Please use 'ThirdwebSDK.fromSigner(signer, chainId)' to create a new ThirdwebSDK with a signer. Example: 'const sdk = ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", - ); - } - if (providers.Provider.isProvider(chainId)) { - throw new Error( - "Please pass in a ChainId instead of a Provider to create a new read-only ThirdwebSDK. Example: 'const sdk = new ThirdwebSDK(ChainId.Polygon)'. To initialize the SDK with a signer, use: 'ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", - ); - } + verifyInputs(chain); + const chainId = typeof chain === "string" ? chainNameToId[chain] : chain; const connection: ConnectionInfo = { chainId, - signer, - provider: signer?.provider, + signer: undefined, + provider: undefined, }; super(connection, options); this.storageHandler = storage; @@ -482,3 +475,30 @@ export class ThirdwebSDK extends RPCConnectionHandler { } } } + +/** + * @internal + * @param chain + */ +function verifyInputs(chain: ChainIdOrName) { + if (Signer.isSigner(chain)) { + throw new Error( + "Please use 'ThirdwebSDK.fromSigner(signer, chainId)' to create a new ThirdwebSDK with a signer. Example: 'const sdk = ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", + ); + } + if (providers.Provider.isProvider(chain)) { + throw new Error( + "Please pass in a ChainId instead of a Provider to create a new read-only ThirdwebSDK. Example: 'const sdk = new ThirdwebSDK(ChainId.Polygon)'. To initialize the SDK with a signer, use: 'ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", + ); + } + if (typeof chain === "string" && chainNameToId[chain] === undefined) { + if (chain.startsWith("http") || chain.startsWith("ws")) { + throw new Error( + `Please pass in a ChainId instead of an RPC url. RPC urls for each ChainId can be configured via SDKOptions. Ex: 'const sdk = new ThirdwebSDK(ChainId.Mainnet, { chainIdToRPCUrlMap: { ChainId.Mainnet: "https://mainnet.infura.io/v3/YOUR_INFURA_KEY" });'`, + ); + } + throw new Error( + `Unknown chain name: ${chain}. Please pass a valid ChainId instead. eg. 'ChainId.Rinkeby' or '80001'`, + ); + } +} diff --git a/src/core/types.ts b/src/core/types.ts index a83c337cd..5c9a8a001 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -1,6 +1,5 @@ import { BigNumber, BytesLike, CallOverrides, Signer, providers } from "ethers"; import type { CONTRACTS_MAP, KNOWN_CONTRACTS_MAP } from "../contracts/maps"; -import { ChainOrRpc } from "../constants/index"; // --- utility types extracted from from ts-toolbelt --- // @@ -42,7 +41,7 @@ export type ValueOf = T[keyof T]; export type SignerOrProvider = Signer | providers.Provider; export type ConnectionInfo = { - chainId: ChainOrRpc; + chainId: number; signer: Signer | undefined; provider?: providers.Provider; }; diff --git a/src/core/wallet/UserWallet.ts b/src/core/wallet/UserWallet.ts index 8dab8c045..c96c15486 100644 --- a/src/core/wallet/UserWallet.ts +++ b/src/core/wallet/UserWallet.ts @@ -41,15 +41,13 @@ export interface UserWalletEvents { * @public */ export class UserWallet { - private readOnlyProvider: RPCConnectionHandler; - private signer: Signer | undefined; + private rpc: RPCConnectionHandler; private options: SDKOptions; public events = new EventEmitter(); constructor(connection: ConnectionInfo, options: SDKOptions) { - this.readOnlyProvider = new RPCConnectionHandler(connection); - this.signer = connection.signer; + this.rpc = new RPCConnectionHandler(connection); this.options = options; } @@ -59,12 +57,12 @@ export class UserWallet { // TODO NFTs() connect(signer: Signer) { - this.signer = signer; + this.rpc.updateSigner(signer); this.events.emit("connected", signer); } disconnect() { - this.signer = undefined; + this.rpc.updateSigner(undefined); this.events.emit("disconnected"); } @@ -88,7 +86,7 @@ export class UserWallet { ): Promise { const signer = this.requireWallet(); const amountInWei = await normalizePriceValue( - this.readOnlyProvider.getProvider(), + this.rpc.getProvider(), amount, currencyAddress, ); @@ -129,7 +127,7 @@ export class UserWallet { currencyAddress = NATIVE_TOKEN_ADDRESS, ): Promise { this.requireWallet(); - const provider = this.readOnlyProvider.getProvider(); + const provider = this.rpc.getProvider(); let balance: BigNumber; if (isNativeToken(currencyAddress)) { balance = await provider.getBalance(await this.getAddress()); @@ -180,7 +178,7 @@ export class UserWallet { * ***********************/ private requireWallet() { - const signer = this.signer; + const signer = this.rpc.getSigner(); invariant( signer, "This action requires a connected wallet. Please pass a valid signer to the SDK.", @@ -190,7 +188,7 @@ export class UserWallet { private createErc20(currencyAddress: string) { return new ContractWrapper( - this.readOnlyProvider.getConnectionInfo(), + this.rpc.getConnectionInfo(), currencyAddress, ERC20Abi, this.options, diff --git a/src/schema/sdk-options.ts b/src/schema/sdk-options.ts index 9bd55f6a0..56c45192d 100644 --- a/src/schema/sdk-options.ts +++ b/src/schema/sdk-options.ts @@ -55,6 +55,10 @@ export const SDKOptionsSchema = z * @example * ```javascript * { + * chainIdToRPCUrlMap: { + * ChainId.Mainnet: "https://mainnet.infura.io/v3/YOUR_INFURA_KEY", + * 1337: "http://localhost:8545", + * } * readonlySettings: { * rpcUrl, // force read calls to go through your own RPC url * chainId, // reduce RPC calls by sepcifying your chain ID From b4d1846a8fe93c76a5a658af53990b6aa588b03f Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Sat, 18 Jun 2022 22:03:49 -0700 Subject: [PATCH 13/20] fix fromPrivateKey --- docs/sdk.thirdwebsdk.fromprivatekey.md | 4 ++-- docs/sdk.thirdwebsdk.md | 2 +- etc/sdk.api.md | 2 +- src/core/sdk.ts | 22 ++++++++++++++-------- 4 files changed, 18 insertions(+), 12 deletions(-) diff --git a/docs/sdk.thirdwebsdk.fromprivatekey.md b/docs/sdk.thirdwebsdk.fromprivatekey.md index 36e1327ff..0d7177914 100644 --- a/docs/sdk.thirdwebsdk.fromprivatekey.md +++ b/docs/sdk.thirdwebsdk.fromprivatekey.md @@ -12,7 +12,7 @@ Get an instance of the thirdweb SDK based on a private key. Signature: ```typescript -static fromPrivateKey(privateKey: string, chainId: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; +static fromPrivateKey(privateKey: string, chain: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; ``` ## Parameters @@ -20,7 +20,7 @@ static fromPrivateKey(privateKey: string, chainId: ChainIdOrName, options?: SDKO | Parameter | Type | Description | | --- | --- | --- | | privateKey | string | the private key - \*\*DO NOT EXPOSE THIS TO THE PUBLIC\*\* | -| chainId | ChainIdOrName | the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) | +| chain | ChainIdOrName | | | options | [SDKOptions](./sdk.sdkoptions.md) | (Optional) the SDK options to use | | storage | [IStorage](./sdk.istorage.md) | (Optional) the storage handler to use | diff --git a/docs/sdk.thirdwebsdk.md b/docs/sdk.thirdwebsdk.md index 2e9b635be..db7113e43 100644 --- a/docs/sdk.thirdwebsdk.md +++ b/docs/sdk.thirdwebsdk.md @@ -32,7 +32,7 @@ export declare class ThirdwebSDK extends RPCConnectionHandler | Method | Modifiers | Description | | --- | --- | --- | -| [fromPrivateKey(privateKey, chainId, options, storage)](./sdk.thirdwebsdk.fromprivatekey.md) | static | (BETA) Get an instance of the thirdweb SDK based on a private key. | +| [fromPrivateKey(privateKey, chain, options, storage)](./sdk.thirdwebsdk.fromprivatekey.md) | static | (BETA) Get an instance of the thirdweb SDK based on a private key. | | [fromSigner(signer, chainId, options, storage)](./sdk.thirdwebsdk.fromsigner.md) | static | (BETA) Get an instance of the thirdweb SDK based on an existing ethers signer | | [getContract(address)](./sdk.thirdwebsdk.getcontract.md) | | (BETA) Get an instance of a Custom ThirdwebContract | | [getContractFromAbi(address, abi)](./sdk.thirdwebsdk.getcontractfromabi.md) | | (BETA) Get an instance of a Custom contract from a json ABI | diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 39f7b9976..da27741a9 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -5002,7 +5002,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { // Warning: (ae-incompatible-release-tags) The symbol "fromPrivateKey" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal // // @beta - static fromPrivateKey(privateKey: string, chainId: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; + static fromPrivateKey(privateKey: string, chain: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; // Warning: (ae-incompatible-release-tags) The symbol "fromSigner" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal // // @beta diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 3bcc555e4..1b359870d 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -31,7 +31,11 @@ import invariant from "tiny-invariant"; import { TokenDrop } from "../contracts/token-drop"; import { ContractPublisher } from "./classes/contract-publisher"; import { ContractMetadata } from "./classes"; -import { chainNameToId, ChainIdOrName } from "../constants"; +import { + chainNameToId, + ChainIdOrName, + getProviderForChain, +} from "../constants"; import { UserWallet } from "./wallet/UserWallet"; import { Multiwrap } from "../contracts/multiwrap"; import { WalletAuthenticator } from "./auth/wallet-authenticator"; @@ -54,7 +58,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { * ``` * * @param signer - a ethers Signer to be used for transactions - * @param chainId - the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) + * @param chain - the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) * @param options - the SDK options to use * @param storage - the storage handler to use * @returns an instance of the SDK @@ -63,11 +67,11 @@ export class ThirdwebSDK extends RPCConnectionHandler { */ static fromSigner( signer: Signer, - chainId: ChainIdOrName, + chain: ChainIdOrName, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const sdk = new ThirdwebSDK(chainId, options, storage); + const sdk = new ThirdwebSDK(chain, options, storage); sdk.wallet.connect(signer); return sdk; } @@ -85,7 +89,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { * ``` * * @param privateKey - the private key - **DO NOT EXPOSE THIS TO THE PUBLIC** - * @param chainId - the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) + * @param chain - the chainId to connect to (e.g. ChainId.Mainnet, ChainId.Rinkeby, ChainId.Polygon, ChainId.Mumbai...) * @param options - the SDK options to use * @param storage - the storage handler to use * @returns an instance of the SDK @@ -94,11 +98,13 @@ export class ThirdwebSDK extends RPCConnectionHandler { */ static fromPrivateKey( privateKey: string, - chainId: ChainIdOrName, + chain: ChainIdOrName, options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const signer = new ethers.Wallet(privateKey); + const chainId = typeof chain === "string" ? chainNameToId[chain] : chain; + const provider = getProviderForChain(chainId, options.chainIdToRPCUrlMap); + const signer = new ethers.Wallet(privateKey, provider); return ThirdwebSDK.fromSigner(signer, chainId, options, storage); } @@ -483,7 +489,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { function verifyInputs(chain: ChainIdOrName) { if (Signer.isSigner(chain)) { throw new Error( - "Please use 'ThirdwebSDK.fromSigner(signer, chainId)' to create a new ThirdwebSDK with a signer. Example: 'const sdk = ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", + "Please use 'ThirdwebSDK.fromSigner(signer, chainId)' or 'ThirdwebSDK.fromPrivateKey(privateKey, chainId)' to create a new ThirdwebSDK that can perform transactions. Example: 'const sdk = ThirdwebSDK.fromSigner(signer, ChainId.Polygon)'", ); } if (providers.Provider.isProvider(chain)) { From b0a9338685881ea0532df974acaac317794850a1 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Mon, 27 Jun 2022 11:39:21 -0700 Subject: [PATCH 14/20] Multichain SDK - override chain for any contract + getContract is now async (#492) * Multichain SDK - override chain for any contract * multi chain registry and factory * pass optional chain to sdk.getX() and fix signer RPC switch when using private keys * fix all the tests * fix vote test --- docs/sdk.chainandaddress.md | 14 + docs/sdk.contractdeployer.deployedition.md | 3 +- .../sdk.contractdeployer.deployeditiondrop.md | 3 +- .../sdk.contractdeployer.deploymarketplace.md | 3 +- docs/sdk.contractdeployer.deploymultiwrap.md | 3 +- ...dk.contractdeployer.deploynftcollection.md | 3 +- docs/sdk.contractdeployer.deploynftdrop.md | 3 +- docs/sdk.contractdeployer.deploypack.md | 3 +- docs/sdk.contractdeployer.deploysplit.md | 3 +- docs/sdk.contractdeployer.deploytoken.md | 3 +- docs/sdk.contractdeployer.deploytokendrop.md | 3 +- docs/sdk.contractdeployer.deployvote.md | 3 +- docs/sdk.contractdeployer.md | 22 +- docs/sdk.md | 1 + docs/sdk.thirdwebsdk.getcontract.md | 3 +- docs/sdk.thirdwebsdk.getcontractfromabi.md | 3 +- docs/sdk.thirdwebsdk.getcontractlist.md | 3 +- docs/sdk.thirdwebsdk.getedition.md | 5 +- docs/sdk.thirdwebsdk.geteditiondrop.md | 5 +- docs/sdk.thirdwebsdk.getmarketplace.md | 5 +- docs/sdk.thirdwebsdk.getmultiwrap.md | 5 +- docs/sdk.thirdwebsdk.getnftcollection.md | 5 +- docs/sdk.thirdwebsdk.getnftdrop.md | 5 +- docs/sdk.thirdwebsdk.getpack.md | 5 +- docs/sdk.thirdwebsdk.getsplit.md | 5 +- docs/sdk.thirdwebsdk.gettoken.md | 5 +- docs/sdk.thirdwebsdk.gettokendrop.md | 5 +- docs/sdk.thirdwebsdk.getvote.md | 5 +- docs/sdk.thirdwebsdk.md | 30 +-- docs/sdk.thirdwebsdk.resolvecontracttype.md | 3 +- etc/sdk.api.md | 136 +++++++--- src/common/feature-detection.ts | 8 + src/constants/urls.ts | 8 + src/core/classes/contract-analytics.ts | 29 --- src/core/classes/contract-deployer.ts | 192 ++++++++------ src/core/classes/contract-wrapper.ts | 4 + src/core/classes/factory.ts | 9 +- src/core/classes/registry.ts | 14 +- src/core/classes/rpc-connection-handler.ts | 12 +- src/core/sdk.ts | 240 +++++++++++++----- src/core/types.ts | 6 + test/auth.test.ts | 23 +- test/edition-drop.test.ts | 208 +++++++-------- test/edition.test.ts | 68 ++--- test/events.test.ts | 44 +--- test/gasless.test.ts | 41 --- test/marketplace.test.ts | 38 +-- test/multiwrap.test.ts | 10 +- test/nft-drop.test.ts | 2 +- test/nft.test.ts | 8 +- test/pack.test.ts | 32 ++- test/recursive.test.ts | 2 + test/registry.test.ts | 6 +- test/roles.test.ts | 32 +-- test/royalty.test.ts | 26 +- test/sigdroptest.ts | 4 +- test/signature-mint-1155.test.ts | 6 +- test/signature-mint-20.test.ts | 6 +- test/signature-mint-721.test.ts | 6 +- test/split.test.ts | 2 +- test/token-drop.test.ts | 3 +- test/token.test.ts | 2 +- test/volume.test.ts | 95 ------- test/vote.test.ts | 21 +- test/wallet.test.ts | 2 +- 65 files changed, 804 insertions(+), 708 deletions(-) create mode 100644 docs/sdk.chainandaddress.md delete mode 100644 src/core/classes/contract-analytics.ts delete mode 100644 test/gasless.test.ts delete mode 100644 test/volume.test.ts diff --git a/docs/sdk.chainandaddress.md b/docs/sdk.chainandaddress.md new file mode 100644 index 000000000..dfae84f56 --- /dev/null +++ b/docs/sdk.chainandaddress.md @@ -0,0 +1,14 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [ChainAndAddress](./sdk.chainandaddress.md) + +## ChainAndAddress type + +Signature: + +```typescript +export declare type ChainAndAddress = { + chainId: ChainIdOrName; + address: string; +}; +``` diff --git a/docs/sdk.contractdeployer.deployedition.md b/docs/sdk.contractdeployer.deployedition.md index 3fcb93322..503582479 100644 --- a/docs/sdk.contractdeployer.deployedition.md +++ b/docs/sdk.contractdeployer.deployedition.md @@ -9,7 +9,7 @@ Deploys a new Edition contract Signature: ```typescript -deployEdition(metadata: NFTContractDeployMetadata): Promise; +deployEdition(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployEdition(metadata: NFTContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [NFTContractDeployMetadata](./sdk.nftcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deployeditiondrop.md b/docs/sdk.contractdeployer.deployeditiondrop.md index 2bd08c2ad..a44a1b54f 100644 --- a/docs/sdk.contractdeployer.deployeditiondrop.md +++ b/docs/sdk.contractdeployer.deployeditiondrop.md @@ -9,7 +9,7 @@ Deploys a new EditionDrop contract Signature: ```typescript -deployEditionDrop(metadata: NFTContractDeployMetadata): Promise; +deployEditionDrop(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployEditionDrop(metadata: NFTContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [NFTContractDeployMetadata](./sdk.nftcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploymarketplace.md b/docs/sdk.contractdeployer.deploymarketplace.md index 259b46675..ff1668e85 100644 --- a/docs/sdk.contractdeployer.deploymarketplace.md +++ b/docs/sdk.contractdeployer.deploymarketplace.md @@ -9,7 +9,7 @@ Deploys a new Marketplace contract Signature: ```typescript -deployMarketplace(metadata: MarketplaceContractDeployMetadata): Promise; +deployMarketplace(metadata: MarketplaceContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployMarketplace(metadata: MarketplaceContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [MarketplaceContractDeployMetadata](./sdk.marketplacecontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploymultiwrap.md b/docs/sdk.contractdeployer.deploymultiwrap.md index 9e9a9d4bb..524fa1eea 100644 --- a/docs/sdk.contractdeployer.deploymultiwrap.md +++ b/docs/sdk.contractdeployer.deploymultiwrap.md @@ -12,7 +12,7 @@ Deploys a new Multiwrap contract Signature: ```typescript -deployMultiwrap(metadata: MultiwrapContractDeployMetadata): Promise; +deployMultiwrap(metadata: MultiwrapContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -20,6 +20,7 @@ deployMultiwrap(metadata: MultiwrapContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [MultiwrapContractDeployMetadata](./sdk.multiwrapcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploynftcollection.md b/docs/sdk.contractdeployer.deploynftcollection.md index b26f215c1..9055ae7a6 100644 --- a/docs/sdk.contractdeployer.deploynftcollection.md +++ b/docs/sdk.contractdeployer.deploynftcollection.md @@ -9,7 +9,7 @@ Deploys an NFT Collection contract Signature: ```typescript -deployNFTCollection(metadata: NFTContractDeployMetadata): Promise; +deployNFTCollection(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployNFTCollection(metadata: NFTContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [NFTContractDeployMetadata](./sdk.nftcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploynftdrop.md b/docs/sdk.contractdeployer.deploynftdrop.md index 264bf3230..b2f86b98f 100644 --- a/docs/sdk.contractdeployer.deploynftdrop.md +++ b/docs/sdk.contractdeployer.deploynftdrop.md @@ -9,7 +9,7 @@ Deploys a new NFTDrop contract Signature: ```typescript -deployNFTDrop(metadata: NFTContractDeployMetadata): Promise; +deployNFTDrop(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployNFTDrop(metadata: NFTContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [NFTContractDeployMetadata](./sdk.nftcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploypack.md b/docs/sdk.contractdeployer.deploypack.md index 1c2d34634..bc93ff486 100644 --- a/docs/sdk.contractdeployer.deploypack.md +++ b/docs/sdk.contractdeployer.deploypack.md @@ -9,7 +9,7 @@ Deploys a new Pack contract Signature: ```typescript -deployPack(metadata: NFTContractDeployMetadata): Promise; +deployPack(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployPack(metadata: NFTContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [NFTContractDeployMetadata](./sdk.nftcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploysplit.md b/docs/sdk.contractdeployer.deploysplit.md index 7ccccfdeb..c2595941b 100644 --- a/docs/sdk.contractdeployer.deploysplit.md +++ b/docs/sdk.contractdeployer.deploysplit.md @@ -9,7 +9,7 @@ Deploys a new Split contract Signature: ```typescript -deploySplit(metadata: SplitContractDeployMetadata): Promise; +deploySplit(metadata: SplitContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deploySplit(metadata: SplitContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [SplitContractDeployMetadata](./sdk.splitcontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploytoken.md b/docs/sdk.contractdeployer.deploytoken.md index a79d18c66..af09c52ca 100644 --- a/docs/sdk.contractdeployer.deploytoken.md +++ b/docs/sdk.contractdeployer.deploytoken.md @@ -9,7 +9,7 @@ Deploys a new Token contract Signature: ```typescript -deployToken(metadata: TokenContractDeployMetadata): Promise; +deployToken(metadata: TokenContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployToken(metadata: TokenContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [TokenContractDeployMetadata](./sdk.tokencontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deploytokendrop.md b/docs/sdk.contractdeployer.deploytokendrop.md index 24b0763f8..69fd16129 100644 --- a/docs/sdk.contractdeployer.deploytokendrop.md +++ b/docs/sdk.contractdeployer.deploytokendrop.md @@ -9,7 +9,7 @@ Deploys a new Token Drop contract Signature: ```typescript -deployTokenDrop(metadata: TokenContractDeployMetadata): Promise; +deployTokenDrop(metadata: TokenContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployTokenDrop(metadata: TokenContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [TokenContractDeployMetadata](./sdk.tokencontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.deployvote.md b/docs/sdk.contractdeployer.deployvote.md index def07770c..fdeff1ff1 100644 --- a/docs/sdk.contractdeployer.deployvote.md +++ b/docs/sdk.contractdeployer.deployvote.md @@ -9,7 +9,7 @@ Deploys a new Vote contract Signature: ```typescript -deployVote(metadata: VoteContractDeployMetadata): Promise; +deployVote(metadata: VoteContractDeployMetadata, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,6 +17,7 @@ deployVote(metadata: VoteContractDeployMetadata): Promise; | Parameter | Type | Description | | --- | --- | --- | | metadata | [VoteContractDeployMetadata](./sdk.votecontractdeploymetadata.md) | the contract metadata | +| chain | ChainIdOrName | (Optional) the chain to deploy the contract to, defaults to the chain the SDK is connected to | Returns: diff --git a/docs/sdk.contractdeployer.md b/docs/sdk.contractdeployer.md index e21c7e00d..fc6eafe3d 100644 --- a/docs/sdk.contractdeployer.md +++ b/docs/sdk.contractdeployer.md @@ -23,16 +23,16 @@ export declare class ContractDeployer extends RPCConnectionHandler | Method | Modifiers | Description | | --- | --- | --- | -| [deployEdition(metadata)](./sdk.contractdeployer.deployedition.md) | | Deploys a new Edition contract | -| [deployEditionDrop(metadata)](./sdk.contractdeployer.deployeditiondrop.md) | | Deploys a new EditionDrop contract | -| [deployMarketplace(metadata)](./sdk.contractdeployer.deploymarketplace.md) | | Deploys a new Marketplace contract | -| [deployMultiwrap(metadata)](./sdk.contractdeployer.deploymultiwrap.md) | | (BETA) Deploys a new Multiwrap contract | -| [deployNFTCollection(metadata)](./sdk.contractdeployer.deploynftcollection.md) | | Deploys an NFT Collection contract | -| [deployNFTDrop(metadata)](./sdk.contractdeployer.deploynftdrop.md) | | Deploys a new NFTDrop contract | -| [deployPack(metadata)](./sdk.contractdeployer.deploypack.md) | | Deploys a new Pack contract | -| [deploySplit(metadata)](./sdk.contractdeployer.deploysplit.md) | | Deploys a new Split contract | -| [deployToken(metadata)](./sdk.contractdeployer.deploytoken.md) | | Deploys a new Token contract | -| [deployTokenDrop(metadata)](./sdk.contractdeployer.deploytokendrop.md) | | Deploys a new Token Drop contract | -| [deployVote(metadata)](./sdk.contractdeployer.deployvote.md) | | Deploys a new Vote contract | +| [deployEdition(metadata, chain)](./sdk.contractdeployer.deployedition.md) | | Deploys a new Edition contract | +| [deployEditionDrop(metadata, chain)](./sdk.contractdeployer.deployeditiondrop.md) | | Deploys a new EditionDrop contract | +| [deployMarketplace(metadata, chain)](./sdk.contractdeployer.deploymarketplace.md) | | Deploys a new Marketplace contract | +| [deployMultiwrap(metadata, chain)](./sdk.contractdeployer.deploymultiwrap.md) | | (BETA) Deploys a new Multiwrap contract | +| [deployNFTCollection(metadata, chain)](./sdk.contractdeployer.deploynftcollection.md) | | Deploys an NFT Collection contract | +| [deployNFTDrop(metadata, chain)](./sdk.contractdeployer.deploynftdrop.md) | | Deploys a new NFTDrop contract | +| [deployPack(metadata, chain)](./sdk.contractdeployer.deploypack.md) | | Deploys a new Pack contract | +| [deploySplit(metadata, chain)](./sdk.contractdeployer.deploysplit.md) | | Deploys a new Split contract | +| [deployToken(metadata, chain)](./sdk.contractdeployer.deploytoken.md) | | Deploys a new Token contract | +| [deployTokenDrop(metadata, chain)](./sdk.contractdeployer.deploytokendrop.md) | | Deploys a new Token Drop contract | +| [deployVote(metadata, chain)](./sdk.contractdeployer.deployvote.md) | | Deploys a new Vote contract | | [updateSigner(signer)](./sdk.contractdeployer.updatesigner.md) | | | diff --git a/docs/sdk.md b/docs/sdk.md index 9968611c1..38e573495 100644 --- a/docs/sdk.md +++ b/docs/sdk.md @@ -132,6 +132,7 @@ | [AirdropInput](./sdk.airdropinput.md) | Input model to pass a list of addresses + amount to transfer to each one | | [Amount](./sdk.amount.md) | Represents a currency amount already formatted. ie. "1" for 1 ether. | | [BufferOrStringWithName](./sdk.bufferorstringwithname.md) | | +| [ChainAndAddress](./sdk.chainandaddress.md) | | | [ClaimCondition](./sdk.claimcondition.md) | Represents a claim condition fetched from the SDK | | [ClaimConditionInput](./sdk.claimconditioninput.md) | Input model to create a claim condition with optional snapshot of wallets | | [ClaimConditionsForToken](./sdk.claimconditionsfortoken.md) | | diff --git a/docs/sdk.thirdwebsdk.getcontract.md b/docs/sdk.thirdwebsdk.getcontract.md index ed46e3c7a..b29e0f299 100644 --- a/docs/sdk.thirdwebsdk.getcontract.md +++ b/docs/sdk.thirdwebsdk.getcontract.md @@ -12,7 +12,7 @@ Get an instance of a Custom ThirdwebContract Signature: ```typescript -getContract(address: string): Promise>; +getContract(address: string, chain?: ChainIdOrName): Promise>; ``` ## Parameters @@ -20,6 +20,7 @@ getContract(address: string): Promise(Optional) optional the chain (id or name) of the contract (defaults to the SDK chainId) | Returns: diff --git a/docs/sdk.thirdwebsdk.getcontractfromabi.md b/docs/sdk.thirdwebsdk.getcontractfromabi.md index f92059145..4f88977c1 100644 --- a/docs/sdk.thirdwebsdk.getcontractfromabi.md +++ b/docs/sdk.thirdwebsdk.getcontractfromabi.md @@ -12,7 +12,7 @@ Get an instance of a Custom contract from a json ABI Signature: ```typescript -getContractFromAbi(address: string, abi: ContractInterface): SmartContract; +getContractFromAbi(address: string, abi: ContractInterface, chain?: ChainIdOrName): SmartContract; ``` ## Parameters @@ -21,6 +21,7 @@ getContractFromAbi(address: string, abi: ContractInterface): SmartContract(Optional) optional the chain (id or name) of the contract (defaults to the SDK chainId) | Returns: diff --git a/docs/sdk.thirdwebsdk.getcontractlist.md b/docs/sdk.thirdwebsdk.getcontractlist.md index 97d738bb5..3cce045b9 100644 --- a/docs/sdk.thirdwebsdk.getcontractlist.md +++ b/docs/sdk.thirdwebsdk.getcontractlist.md @@ -9,7 +9,7 @@ Return all the contracts deployed by the specified address Signature: ```typescript -getContractList(walletAddress: string): Promise<{ +getContractList(walletAddress: string, chain?: ChainIdOrName): Promise<{ address: string; contractType: "custom" | "token" | "split" | "edition" | "edition-drop" | "token-drop" | "vote" | "marketplace" | "pack" | "nft-drop" | "signature-drop" | "multiwrap" | "nft-collection"; metadata: () => Promise; @@ -21,6 +21,7 @@ getContractList(walletAddress: string): Promise<{ | Parameter | Type | Description | | --- | --- | --- | | walletAddress | string | the deployed address | +| chain | ChainIdOrName | (Optional) the chain to fetch from contracts from | Returns: diff --git a/docs/sdk.thirdwebsdk.getedition.md b/docs/sdk.thirdwebsdk.getedition.md index 39c558230..dd9027424 100644 --- a/docs/sdk.thirdwebsdk.getedition.md +++ b/docs/sdk.thirdwebsdk.getedition.md @@ -9,7 +9,7 @@ Get an instance of an Edition contract Signature: ```typescript -getEdition(address: string): Edition; +getEdition(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getEdition(address: string): Edition; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Edition](./sdk.edition.md) +Promise<[Edition](./sdk.edition.md)> the contract diff --git a/docs/sdk.thirdwebsdk.geteditiondrop.md b/docs/sdk.thirdwebsdk.geteditiondrop.md index 565be2607..df66f4bee 100644 --- a/docs/sdk.thirdwebsdk.geteditiondrop.md +++ b/docs/sdk.thirdwebsdk.geteditiondrop.md @@ -9,7 +9,7 @@ Get an instance of a Edition Drop contract Signature: ```typescript -getEditionDrop(address: string): EditionDrop; +getEditionDrop(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getEditionDrop(address: string): EditionDrop; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[EditionDrop](./sdk.editiondrop.md) +Promise<[EditionDrop](./sdk.editiondrop.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getmarketplace.md b/docs/sdk.thirdwebsdk.getmarketplace.md index ba91735b8..6fba53f97 100644 --- a/docs/sdk.thirdwebsdk.getmarketplace.md +++ b/docs/sdk.thirdwebsdk.getmarketplace.md @@ -9,7 +9,7 @@ Get an instance of a Marketplace contract Signature: ```typescript -getMarketplace(address: string): Marketplace; +getMarketplace(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getMarketplace(address: string): Marketplace; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Marketplace](./sdk.marketplace.md) +Promise<[Marketplace](./sdk.marketplace.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getmultiwrap.md b/docs/sdk.thirdwebsdk.getmultiwrap.md index 1d873b3a1..fc2862833 100644 --- a/docs/sdk.thirdwebsdk.getmultiwrap.md +++ b/docs/sdk.thirdwebsdk.getmultiwrap.md @@ -12,7 +12,7 @@ Get an instance of a Multiwrap contract Signature: ```typescript -getMultiwrap(address: string): Multiwrap; +getMultiwrap(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -20,10 +20,11 @@ getMultiwrap(address: string): Multiwrap; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Multiwrap](./sdk.multiwrap.md) +Promise<[Multiwrap](./sdk.multiwrap.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getnftcollection.md b/docs/sdk.thirdwebsdk.getnftcollection.md index 74d245ca0..9d50588df 100644 --- a/docs/sdk.thirdwebsdk.getnftcollection.md +++ b/docs/sdk.thirdwebsdk.getnftcollection.md @@ -9,7 +9,7 @@ Get an instance of a NFT Collection contract Signature: ```typescript -getNFTCollection(address: string): NFTCollection; +getNFTCollection(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getNFTCollection(address: string): NFTCollection; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[NFTCollection](./sdk.nftcollection.md) +Promise<[NFTCollection](./sdk.nftcollection.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getnftdrop.md b/docs/sdk.thirdwebsdk.getnftdrop.md index 25feed37a..fc84ae946 100644 --- a/docs/sdk.thirdwebsdk.getnftdrop.md +++ b/docs/sdk.thirdwebsdk.getnftdrop.md @@ -9,7 +9,7 @@ Get an instance of a Drop contract Signature: ```typescript -getNFTDrop(contractAddress: string): NFTDrop; +getNFTDrop(contractAddress: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getNFTDrop(contractAddress: string): NFTDrop; | Parameter | Type | Description | | --- | --- | --- | | contractAddress | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[NFTDrop](./sdk.nftdrop.md) +Promise<[NFTDrop](./sdk.nftdrop.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getpack.md b/docs/sdk.thirdwebsdk.getpack.md index e54ba18bb..c302546a5 100644 --- a/docs/sdk.thirdwebsdk.getpack.md +++ b/docs/sdk.thirdwebsdk.getpack.md @@ -9,7 +9,7 @@ Get an instance of a Pack contract Signature: ```typescript -getPack(address: string): Pack; +getPack(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getPack(address: string): Pack; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Pack](./sdk.pack.md) +Promise<[Pack](./sdk.pack.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getsplit.md b/docs/sdk.thirdwebsdk.getsplit.md index a30111057..b3c6d3c83 100644 --- a/docs/sdk.thirdwebsdk.getsplit.md +++ b/docs/sdk.thirdwebsdk.getsplit.md @@ -9,7 +9,7 @@ Get an instance of a Splits contract Signature: ```typescript -getSplit(address: string): Split; +getSplit(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getSplit(address: string): Split; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Split](./sdk.split.md) +Promise<[Split](./sdk.split.md)> the contract diff --git a/docs/sdk.thirdwebsdk.gettoken.md b/docs/sdk.thirdwebsdk.gettoken.md index decb10273..7ab05b5a9 100644 --- a/docs/sdk.thirdwebsdk.gettoken.md +++ b/docs/sdk.thirdwebsdk.gettoken.md @@ -9,7 +9,7 @@ Get an instance of a Token contract Signature: ```typescript -getToken(address: string): Token; +getToken(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getToken(address: string): Token; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Token](./sdk.token.md) +Promise<[Token](./sdk.token.md)> the contract diff --git a/docs/sdk.thirdwebsdk.gettokendrop.md b/docs/sdk.thirdwebsdk.gettokendrop.md index d70ab189c..cd8388a84 100644 --- a/docs/sdk.thirdwebsdk.gettokendrop.md +++ b/docs/sdk.thirdwebsdk.gettokendrop.md @@ -9,7 +9,7 @@ Get an instance of a Token Drop contract Signature: ```typescript -getTokenDrop(address: string): TokenDrop; +getTokenDrop(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getTokenDrop(address: string): TokenDrop; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[TokenDrop](./sdk.tokendrop.md) +Promise<[TokenDrop](./sdk.tokendrop.md)> the contract diff --git a/docs/sdk.thirdwebsdk.getvote.md b/docs/sdk.thirdwebsdk.getvote.md index f0020d85d..40c7c89b7 100644 --- a/docs/sdk.thirdwebsdk.getvote.md +++ b/docs/sdk.thirdwebsdk.getvote.md @@ -9,7 +9,7 @@ Get an instance of a Vote contract Signature: ```typescript -getVote(address: string): Vote; +getVote(address: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -17,10 +17,11 @@ getVote(address: string): Vote; | Parameter | Type | Description | | --- | --- | --- | | address | string | the address of the deployed contract | +| chain | ChainIdOrName | (Optional) optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) | Returns: -[Vote](./sdk.vote.md) +Promise<[Vote](./sdk.vote.md)> the contract diff --git a/docs/sdk.thirdwebsdk.md b/docs/sdk.thirdwebsdk.md index 7dad338f7..e57548cb4 100644 --- a/docs/sdk.thirdwebsdk.md +++ b/docs/sdk.thirdwebsdk.md @@ -35,19 +35,19 @@ export declare class ThirdwebSDK extends RPCConnectionHandler | [fromPrivateKey(privateKey, chain, options, storage)](./sdk.thirdwebsdk.fromprivatekey.md) | static | (BETA) Get an instance of the thirdweb SDK based on a private key. | | [fromSigner(signer, chain, options, storage)](./sdk.thirdwebsdk.fromsigner.md) | static | (BETA) Get an instance of the thirdweb SDK based on an existing ethers signer | | [getBalance(address)](./sdk.thirdwebsdk.getbalance.md) | | Get the native balance of a given address (wallet or contract) | -| [getContract(address)](./sdk.thirdwebsdk.getcontract.md) | | (BETA) Get an instance of a Custom ThirdwebContract | -| [getContractFromAbi(address, abi)](./sdk.thirdwebsdk.getcontractfromabi.md) | | (BETA) Get an instance of a Custom contract from a json ABI | -| [getContractList(walletAddress)](./sdk.thirdwebsdk.getcontractlist.md) | | Return all the contracts deployed by the specified address | -| [getEdition(address)](./sdk.thirdwebsdk.getedition.md) | | Get an instance of an Edition contract | -| [getEditionDrop(address)](./sdk.thirdwebsdk.geteditiondrop.md) | | Get an instance of a Edition Drop contract | -| [getMarketplace(address)](./sdk.thirdwebsdk.getmarketplace.md) | | Get an instance of a Marketplace contract | -| [getMultiwrap(address)](./sdk.thirdwebsdk.getmultiwrap.md) | | (BETA) Get an instance of a Multiwrap contract | -| [getNFTCollection(address)](./sdk.thirdwebsdk.getnftcollection.md) | | Get an instance of a NFT Collection contract | -| [getNFTDrop(contractAddress)](./sdk.thirdwebsdk.getnftdrop.md) | | Get an instance of a Drop contract | -| [getPack(address)](./sdk.thirdwebsdk.getpack.md) | | Get an instance of a Pack contract | -| [getSplit(address)](./sdk.thirdwebsdk.getsplit.md) | | Get an instance of a Splits contract | -| [getToken(address)](./sdk.thirdwebsdk.gettoken.md) | | Get an instance of a Token contract | -| [getTokenDrop(address)](./sdk.thirdwebsdk.gettokendrop.md) | | Get an instance of a Token Drop contract | -| [getVote(address)](./sdk.thirdwebsdk.getvote.md) | | Get an instance of a Vote contract | -| [resolveContractType(contractAddress)](./sdk.thirdwebsdk.resolvecontracttype.md) | | | +| [getContract(address, chain)](./sdk.thirdwebsdk.getcontract.md) | | (BETA) Get an instance of a Custom ThirdwebContract | +| [getContractFromAbi(address, abi, chain)](./sdk.thirdwebsdk.getcontractfromabi.md) | | (BETA) Get an instance of a Custom contract from a json ABI | +| [getContractList(walletAddress, chain)](./sdk.thirdwebsdk.getcontractlist.md) | | Return all the contracts deployed by the specified address | +| [getEdition(address, chain)](./sdk.thirdwebsdk.getedition.md) | | Get an instance of an Edition contract | +| [getEditionDrop(address, chain)](./sdk.thirdwebsdk.geteditiondrop.md) | | Get an instance of a Edition Drop contract | +| [getMarketplace(address, chain)](./sdk.thirdwebsdk.getmarketplace.md) | | Get an instance of a Marketplace contract | +| [getMultiwrap(address, chain)](./sdk.thirdwebsdk.getmultiwrap.md) | | (BETA) Get an instance of a Multiwrap contract | +| [getNFTCollection(address, chain)](./sdk.thirdwebsdk.getnftcollection.md) | | Get an instance of a NFT Collection contract | +| [getNFTDrop(contractAddress, chain)](./sdk.thirdwebsdk.getnftdrop.md) | | Get an instance of a Drop contract | +| [getPack(address, chain)](./sdk.thirdwebsdk.getpack.md) | | Get an instance of a Pack contract | +| [getSplit(address, chain)](./sdk.thirdwebsdk.getsplit.md) | | Get an instance of a Splits contract | +| [getToken(address, chain)](./sdk.thirdwebsdk.gettoken.md) | | Get an instance of a Token contract | +| [getTokenDrop(address, chain)](./sdk.thirdwebsdk.gettokendrop.md) | | Get an instance of a Token Drop contract | +| [getVote(address, chain)](./sdk.thirdwebsdk.getvote.md) | | Get an instance of a Vote contract | +| [resolveContractType(contractAddress, chain)](./sdk.thirdwebsdk.resolvecontracttype.md) | | | diff --git a/docs/sdk.thirdwebsdk.resolvecontracttype.md b/docs/sdk.thirdwebsdk.resolvecontracttype.md index d3ca71538..251baa2f7 100644 --- a/docs/sdk.thirdwebsdk.resolvecontracttype.md +++ b/docs/sdk.thirdwebsdk.resolvecontracttype.md @@ -7,7 +7,7 @@ Signature: ```typescript -resolveContractType(contractAddress: string): Promise; +resolveContractType(contractAddress: string, chain?: ChainIdOrName): Promise; ``` ## Parameters @@ -15,6 +15,7 @@ resolveContractType(contractAddress: string): Promise; | Parameter | Type | Description | | --- | --- | --- | | contractAddress | string | the address of the contract to attempt to resolve the contract type for | +| chain | ChainIdOrName | (Optional) optional the chain (id or name) of the contract (defaults to the SDK chainId) | Returns: diff --git a/etc/sdk.api.md b/etc/sdk.api.md index e4ff30947..259ea1b74 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -152,6 +152,12 @@ export type BufferOrStringWithName = { name?: string; }; +// @public (undocumented) +export type ChainAndAddress = { + chainId: ChainIdOrName; + address: string; +}; + // @public (undocumented) export enum ChainId { // (undocumented) @@ -586,25 +592,37 @@ export const CONTRACT_ADDRESSES: Record(contractType: TContract["contractType"], contractMetadata: z.input): Promise; - deployEdition(metadata: NFTContractDeployMetadata): Promise; - deployEditionDrop(metadata: NFTContractDeployMetadata): Promise; - deployMarketplace(metadata: MarketplaceContractDeployMetadata): Promise; + deployBuiltInContract(contractType: TContract["contractType"], contractMetadata: z.input, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployEdition" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployEdition(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployEditionDrop" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployEditionDrop(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployMarketplace" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployMarketplace(metadata: MarketplaceContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployMultiwrap" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal + // // @beta - deployMultiwrap(metadata: MultiwrapContractDeployMetadata): Promise; - deployNFTCollection(metadata: NFTContractDeployMetadata): Promise; - deployNFTDrop(metadata: NFTContractDeployMetadata): Promise; - deployPack(metadata: NFTContractDeployMetadata): Promise; + deployMultiwrap(metadata: MultiwrapContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployNFTCollection" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployNFTCollection(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployNFTDrop" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployNFTDrop(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployPack" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployPack(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; // @internal - deploySignatureDrop(metadata: NFTContractDeployMetadata): Promise; - deploySplit(metadata: SplitContractDeployMetadata): Promise; - deployToken(metadata: TokenContractDeployMetadata): Promise; - deployTokenDrop(metadata: TokenContractDeployMetadata): Promise; - deployVote(metadata: VoteContractDeployMetadata): Promise; + deploySignatureDrop(metadata: NFTContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deploySplit" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deploySplit(metadata: SplitContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployToken" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployToken(metadata: TokenContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployTokenDrop" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployTokenDrop(metadata: TokenContractDeployMetadata, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "deployVote" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + deployVote(metadata: VoteContractDeployMetadata, chain?: ChainIdOrName): Promise; // Warning: (ae-forgotten-export) The symbol "ContractRegistry" needs to be exported by the entry point index.d.ts // // @internal (undocumented) - getRegistry(): Promise; + getRegistry(chain?: ChainIdOrName): Promise; // (undocumented) updateSigner(signer: Signer | undefined): void; } @@ -5006,40 +5024,92 @@ export class ThirdwebSDK extends RPCConnectionHandler { static fromSigner(signer: Signer, chain: ChainIdOrName, options?: SDKOptions, storage?: IStorage): ThirdwebSDK; getBalance(address: string): Promise; // @internal (undocumented) - getBuiltInContract(address: string, contractType: TContractType): ContractForContractType; + getBuiltInContract(address: string, contractType: TContractType, chain?: ChainIdOrName): Promise<{ + readonly custom: typeof SmartContract; + readonly "nft-drop": typeof NFTDrop; + readonly "signature-drop": typeof SignatureDrop; + readonly "nft-collection": typeof NFTCollection; + readonly "edition-drop": typeof EditionDrop; + readonly edition: typeof Edition; + readonly "token-drop": typeof TokenDrop; + readonly token: typeof Token; + readonly vote: typeof Vote; + readonly split: typeof Split; + readonly marketplace: typeof Marketplace; + readonly pack: typeof Pack; + readonly multiwrap: typeof Multiwrap; + }[TContractType] extends infer T ? T extends { + readonly custom: typeof SmartContract; + readonly "nft-drop": typeof NFTDrop; + readonly "signature-drop": typeof SignatureDrop; + readonly "nft-collection": typeof NFTCollection; + readonly "edition-drop": typeof EditionDrop; + readonly edition: typeof Edition; + readonly "token-drop": typeof TokenDrop; + readonly token: typeof Token; + readonly vote: typeof Vote; + readonly split: typeof Split; + readonly marketplace: typeof Marketplace; + readonly pack: typeof Pack; + readonly multiwrap: typeof Multiwrap; + }[TContractType] ? T extends new (...args: any[]) => object ? object : any : never : never>; + // Warning: (ae-incompatible-release-tags) The symbol "getContract" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal + // // @beta - getContract(address: string): Promise>; + getContract(address: string, chain?: ChainIdOrName): Promise>; + // Warning: (ae-incompatible-release-tags) The symbol "getContractFromAbi" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal + // // @beta - getContractFromAbi(address: string, abi: ContractInterface): SmartContract; - getContractList(walletAddress: string): Promise<{ + getContractFromAbi(address: string, abi: ContractInterface, chain?: ChainIdOrName): SmartContract; + // Warning: (ae-incompatible-release-tags) The symbol "getContractList" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getContractList(walletAddress: string, chain?: ChainIdOrName): Promise<{ address: string; 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; - getEditionDrop(address: string): EditionDrop; - getMarketplace(address: string): Marketplace; + // Warning: (ae-incompatible-release-tags) The symbol "getEdition" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getEdition(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getEditionDrop" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getEditionDrop(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getMarketplace" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getMarketplace(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getMultiwrap" is marked as @beta, but its signature references "ChainIdOrName" which is marked as @internal + // // @beta - getMultiwrap(address: string): Multiwrap; - getNFTCollection(address: string): NFTCollection; - getNFTDrop(contractAddress: string): NFTDrop; - getPack(address: string): Pack; + getMultiwrap(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getNFTCollection" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getNFTCollection(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getNFTDrop" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getNFTDrop(contractAddress: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getPack" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getPack(address: string, chain?: ChainIdOrName): Promise; // Warning: (ae-forgotten-export) The symbol "ContractPublisher" needs to be exported by the entry point index.d.ts // // @internal (undocumented) getPublisher(): ContractPublisher; // @internal - getSignatureDrop(contractAddress: string): SignatureDrop; - getSplit(address: string): Split; - getToken(address: string): Token; - getTokenDrop(address: string): TokenDrop; - getVote(address: string): Vote; + getSignatureDrop(contractAddress: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getSplit" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getSplit(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getToken" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getToken(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getTokenDrop" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getTokenDrop(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "getVote" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + getVote(address: string, chain?: ChainIdOrName): Promise; + // Warning: (ae-incompatible-release-tags) The symbol "resolveContractType" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + // // (undocumented) - resolveContractType(contractAddress: string): Promise; + resolveContractType(contractAddress: string, chain?: ChainIdOrName): Promise; storage: RemoteStorage; wallet: UserWallet; } +// Warning: (ae-internal-missing-underscore) The name "toChainId" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export function toChainId(chain: ChainIdOrName): number; + // @public export class Token extends Erc20 { constructor(connection: ConnectionInfo, address: string, storage: IStorage, options?: SDKOptions, contractWrapper?: ContractWrapper); @@ -5649,6 +5719,10 @@ export class WrongListingTypeError extends Error { constructor(marketplaceContractAddress: string, listingId?: string, actualType?: string, expectedType?: string); } +// Warnings were encountered during analysis: +// +// dist/src/core/types.d.ts:48:5 - (ae-incompatible-release-tags) The symbol "chainId" is marked as @public, but its signature references "ChainIdOrName" which is marked as @internal + // (No @packageDocumentation comment for this package) ``` diff --git a/src/common/feature-detection.ts b/src/common/feature-detection.ts index dae12e182..7ffa81795 100644 --- a/src/common/feature-detection.ts +++ b/src/common/feature-detection.ts @@ -314,6 +314,14 @@ export async function fetchSourceFilesFromMetadata( return await Promise.all( Object.entries(publishedMetadata.metadata.sources).map( async ([path, info]) => { + // standard metadata can contain either the full source inline + if ((info as any).content) { + return { + filename: path, + source: (info as any).content, + }; + } + // or a URL to it const urls = (info as any).urls as string[]; const ipfsLink = urls.find((url) => url.includes("ipfs")); if (ipfsLink) { diff --git a/src/constants/urls.ts b/src/constants/urls.ts index dbc52f5da..8bc9b2dc6 100644 --- a/src/constants/urls.ts +++ b/src/constants/urls.ts @@ -92,6 +92,14 @@ export const defaultRPCMap: Record< [ChainId.Localhost]: "http://localhost:8545", }; +/** + * @internal + * @param chain + */ +export function toChainId(chain: ChainIdOrName) { + return typeof chain === "string" ? chainNameToId[chain] : chain; +} + /** * @internal * @param chainId diff --git a/src/core/classes/contract-analytics.ts b/src/core/classes/contract-analytics.ts deleted file mode 100644 index fbd2463db..000000000 --- a/src/core/classes/contract-analytics.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { BaseContract, Event } from "ethers"; -import { ContractWrapper } from "./contract-wrapper"; - -export class ContractAnalytics { - private contractWrapper: ContractWrapper; - - constructor(contractWrapper: ContractWrapper) { - this.contractWrapper = contractWrapper; - } - - public async query( - eventName: keyof TContract["filters"] | string, - ): Promise { - const event = this.contractWrapper.readContract.interface.getEvent( - eventName as string, - ); - const filter = this.contractWrapper.readContract.filters[event.name]; - - // TODO limit the number of blocks queried - const fromBlock = 0; - const toBlock = - await this.contractWrapper.readContract.provider.getBlockNumber(); - return await this.contractWrapper.readContract.queryFilter( - filter(), - fromBlock, - toBlock, - ); - } -} diff --git a/src/core/classes/contract-deployer.ts b/src/core/classes/contract-deployer.ts index 1c5ba88db..114654261 100644 --- a/src/core/classes/contract-deployer.ts +++ b/src/core/classes/contract-deployer.ts @@ -1,7 +1,6 @@ import { ConnectionInfo, ValidContractClass } from "../types"; import { z } from "zod"; import { ContractRegistry } from "./registry"; -import { getContractAddressByChainId } from "../../constants/addresses"; import { ContractFactory } from "./factory"; import { SDKOptions } from "../../schema/sdk-options"; import { IStorage } from "../interfaces"; @@ -29,22 +28,15 @@ import { import { TokenDrop } from "../../contracts/token-drop"; import { Multiwrap } from "../../contracts/multiwrap"; import { Signer } from "ethers"; +import { ChainIdOrName, toChainId } from "../../constants/index"; /** * Handles deploying new contracts * @public */ export class ContractDeployer extends RPCConnectionHandler { - /** - * @internal - * should never be accessed directly, use {@link ContractDeployer.getFactory} instead - */ - private _factory: Promise | undefined; - /** - * @internal - * should never be accessed directly, use {@link ContractDeployer.getRegistry} instead - */ - private _registry: Promise | undefined; + private registryCache = new Map(); + private factoryCache = new Map(); private storage: IStorage; constructor( @@ -69,14 +61,17 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployNFTCollection( metadata: NFTContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { return await this.deployBuiltInContract( NFTCollection.contractType, metadata, + chain, ); } @@ -93,12 +88,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployNFTDrop( metadata: NFTContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(NFTDrop.contractType, metadata); + return await this.deployBuiltInContract( + NFTDrop.contractType, + metadata, + chain, + ); } /** @@ -114,15 +115,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract * @internal */ public async deploySignatureDrop( metadata: NFTContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { return await this.deployBuiltInContract( SignatureDrop.contractType, metadata, + chain, ); } @@ -138,13 +142,19 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract * @beta */ public async deployMultiwrap( metadata: MultiwrapContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Multiwrap.contractType, metadata); + return await this.deployBuiltInContract( + Multiwrap.contractType, + metadata, + chain, + ); } /** @@ -160,12 +170,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployEdition( metadata: NFTContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Edition.contractType, metadata); + return await this.deployBuiltInContract( + Edition.contractType, + metadata, + chain, + ); } /** @@ -181,13 +197,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployEditionDrop( metadata: NFTContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - const parsed = EditionDrop.schema.deploy.parse(metadata); - return await this.deployBuiltInContract(EditionDrop.contractType, parsed); + return await this.deployBuiltInContract( + EditionDrop.contractType, + metadata, + chain, + ); } /** @@ -203,12 +224,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployToken( metadata: TokenContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Token.contractType, metadata); + return await this.deployBuiltInContract( + Token.contractType, + metadata, + chain, + ); } /** @@ -224,12 +251,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployTokenDrop( metadata: TokenContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(TokenDrop.contractType, metadata); + return await this.deployBuiltInContract( + TokenDrop.contractType, + metadata, + chain, + ); } /** @@ -245,12 +278,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployMarketplace( metadata: MarketplaceContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Marketplace.contractType, metadata); + return await this.deployBuiltInContract( + Marketplace.contractType, + metadata, + chain, + ); } /** @@ -266,12 +305,14 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployPack( metadata: NFTContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Pack.contractType, metadata); + return await this.deployBuiltInContract(Pack.contractType, metadata, chain); } /** @@ -297,12 +338,18 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deploySplit( metadata: SplitContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Split.contractType, metadata); + return await this.deployBuiltInContract( + Split.contractType, + metadata, + chain, + ); } /** @@ -319,12 +366,14 @@ export class ContractDeployer extends RPCConnectionHandler { * }); * ``` * @param metadata - the contract metadata + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns the address of the deployed contract */ public async deployVote( metadata: VoteContractDeployMetadata, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - return await this.deployBuiltInContract(Vote.contractType, metadata); + return await this.deployBuiltInContract(Vote.contractType, metadata, chain); } /** @@ -333,77 +382,72 @@ export class ContractDeployer extends RPCConnectionHandler { * @internal * @param contractType - the type of contract to deploy * @param contractMetadata - the metadata to deploy the contract with + * @param chain - the chain to deploy the contract to, defaults to the chain the SDK is connected to * @returns a promise of the address of the newly deployed contract */ public async deployBuiltInContract( contractType: TContract["contractType"], contractMetadata: z.input, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { - const factory = await this.getFactory(); + const factory = await this.getFactory(chain); return await factory.deploy(contractType, contractMetadata); } /** * @internal */ - public async getRegistry(): Promise { - // if we already have a registry just return it back - if (this._registry) { - return this._registry; + public async getRegistry( + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + const chainId = toChainId(chain); + if (this.registryCache.has(chainId)) { + return this.registryCache.get(chainId) as ContractRegistry; } - - // otherwise get the registry address for the active chain and get a new one - - // have to do it like this otherwise we run it over and over and over - // "this._registry" has to be assigned to the promise upfront. - return (this._registry = this.getProvider() - .getNetwork() - .then(async ({ chainId }) => { - const registryAddress = getContractAddressByChainId( - chainId, - "twRegistry", - ); - return new ContractRegistry( - registryAddress, - this.getConnectionInfo(), - this.options, - ); - })); + let connectionInfo = this.getConnectionInfo(); + if (chainId !== this.getConnectionInfo().chainId) { + connectionInfo = { + chainId, + provider: undefined, + signer: connectionInfo.signer, + }; + } + const registry = new ContractRegistry(connectionInfo, this.options); + this.registryCache.set(chainId, registry); + return registry; } - private async getFactory(): Promise { - // if we already have a factory just return it back - if (this._factory) { - return this._factory; + private async getFactory( + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + const chainId = toChainId(chain); + if (this.factoryCache.has(chainId)) { + return this.factoryCache.get(chainId) as ContractFactory; } - - // otherwise get the factory address for the active chain and get a new one - - // have to do it like this otherwise we run it over and over and over - // "this._factory" has to be assigned to the promise upfront. - return (this._factory = this.getProvider() - .getNetwork() - .then(async ({ chainId }) => { - const factoryAddress = getContractAddressByChainId( - chainId, - "twFactory", - ); - return new ContractFactory( - factoryAddress, - this.getConnectionInfo(), - this.storage, - this.options, - ); - })); + let connectionInfo = this.getConnectionInfo(); + if (chainId !== this.getConnectionInfo().chainId) { + connectionInfo = { + chainId, + provider: undefined, + signer: connectionInfo.signer, + }; + } + const factory = new ContractFactory( + connectionInfo, + this.storage, + this.options, + ); + this.factoryCache.set(chainId, factory); + return factory; } public override updateSigner(signer: Signer | undefined) { super.updateSigner(signer); - this._factory?.then((factory) => { - factory.updateSigner(signer); - }); - this._registry?.then((registry) => { - registry.updateSigner(signer); - }); + for (const [, contract] of this.registryCache) { + contract.updateSigner(this.getSigner()); + } + for (const [, contract] of this.factoryCache) { + contract.updateSigner(this.getSigner()); + } } } diff --git a/src/core/classes/contract-wrapper.ts b/src/core/classes/contract-wrapper.ts index cc12a4f83..78555d0ae 100644 --- a/src/core/classes/contract-wrapper.ts +++ b/src/core/classes/contract-wrapper.ts @@ -82,6 +82,10 @@ export class ContractWrapper< ) as TContract; } + public getAddress(): string { + return this.readContract.address; + } + /** * @internal */ diff --git a/src/core/classes/factory.ts b/src/core/classes/factory.ts index a0740374e..59967a55c 100644 --- a/src/core/classes/factory.ts +++ b/src/core/classes/factory.ts @@ -19,6 +19,7 @@ import { CONTRACTS_MAP, REMOTE_CONTRACT_NAME } from "../../contracts/maps"; import { CONTRACT_ADDRESSES, + getContractAddressByChainId, OZ_DEFENDER_FORWARDER_ADDRESS, SUPPORTED_CHAIN_IDS, } from "../../constants"; @@ -33,12 +34,16 @@ export class ContractFactory extends ContractWrapper { private storage: IStorage; constructor( - factoryAddr: string, connection: ConnectionInfo, storage: IStorage, options?: SDKOptions, ) { - super(connection, factoryAddr, TWFactory__factory.abi, options); + super( + connection, + getContractAddressByChainId(connection.chainId, "twFactory"), + TWFactory__factory.abi, + options, + ); this.storage = storage; } diff --git a/src/core/classes/registry.ts b/src/core/classes/registry.ts index 9348ebc7f..35c9ebcbd 100644 --- a/src/core/classes/registry.ts +++ b/src/core/classes/registry.ts @@ -4,17 +4,19 @@ import { ConnectionInfo } from "../types"; import { ContractWrapper } from "./contract-wrapper"; import { constants, utils } from "ethers"; import { TransactionResult } from ".."; +import { getContractAddressByChainId } from "../../constants/index"; /** * @internal */ export class ContractRegistry extends ContractWrapper { - constructor( - registryAddress: string, - connection: ConnectionInfo, - options?: SDKOptions, - ) { - super(connection, registryAddress, TWRegistry__factory.abi, options); + constructor(connection: ConnectionInfo, options?: SDKOptions) { + super( + connection, + getContractAddressByChainId(connection.chainId, "twRegistry"), + TWRegistry__factory.abi, + options, + ); } public async getContractAddresses(walletAddress: string) { diff --git a/src/core/classes/rpc-connection-handler.ts b/src/core/classes/rpc-connection-handler.ts index 610e31fc6..b40f91c18 100644 --- a/src/core/classes/rpc-connection-handler.ts +++ b/src/core/classes/rpc-connection-handler.ts @@ -35,7 +35,7 @@ export class RPCConnectionHandler extends EventEmitter { connection.chainId, this.options.chainIdToRPCUrlMap, ); - this.signer = connection.signer; + this.signer = this.maybeConnectSigner(connection.signer); } /** @@ -45,12 +45,12 @@ export class RPCConnectionHandler extends EventEmitter { * @internal */ public updateSigner(signer: Signer | undefined) { - this.signer = signer; // TODO (rpc) - make sure we don't need to do this for type of signers if (this.chainId === ChainId.Hardhat) { // For hardhat tests - the provider inside the signer is enhanced for tests, need to use it as the provider this.provider = signer?.provider || this.provider; } + this.signer = this.maybeConnectSigner(signer); } /** * @@ -96,4 +96,12 @@ export class RPCConnectionHandler extends EventEmitter { provider: this.getProvider(), }; } + + private maybeConnectSigner(signer: Signer | undefined) { + try { + return signer?.connect(this.provider); + } catch (e) { + return signer; + } + } } diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 6fcedaffb..20b89ca30 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -24,6 +24,7 @@ import type { ContractType, ValidContractInstance, } from "./types"; +import { ChainAndAddress } from "./types"; import { IThirdwebContract__factory } from "contracts"; import { ContractDeployer } from "./classes/contract-deployer"; import { SmartContract } from "../contracts/smart-contract"; @@ -32,10 +33,11 @@ import { TokenDrop } from "../contracts/token-drop"; import { ContractPublisher } from "./classes/contract-publisher"; import { ContractMetadata } from "./classes"; import { - chainNameToId, ChainIdOrName, + chainNameToId, getProviderForChain, NATIVE_TOKEN_ADDRESS, + toChainId, } from "../constants"; import { UserWallet } from "./wallet/UserWallet"; import { Multiwrap } from "../contracts/multiwrap"; @@ -105,7 +107,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { options: SDKOptions = {}, storage: IStorage = new IpfsStorage(), ): ThirdwebSDK { - const chainId = typeof chain === "string" ? chainNameToId[chain] : chain; + const chainId = toChainId(chain); const provider = getProviderForChain(chainId, options.chainIdToRPCUrlMap); const signer = new ethers.Wallet(privateKey, provider); return ThirdwebSDK.fromSigner(signer, chainId, options, storage); @@ -116,7 +118,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { * the cache of contracts that we have already seen */ private contractCache = new Map< - string, + ChainAndAddress, ValidContractInstance | SmartContract >(); /** @@ -152,7 +154,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { ) { // Throw helpful error for old usages of this constructor verifyInputs(chain); - const chainId = typeof chain === "string" ? chainNameToId[chain] : chain; + const chainId = toChainId(chain); const connection: ConnectionInfo = { chainId, signer: undefined, @@ -161,11 +163,19 @@ export class ThirdwebSDK extends RPCConnectionHandler { super(connection, options); this.storageHandler = storage; this.storage = new RemoteStorage(storage); - this.deployer = new ContractDeployer(connection, options, storage); - this.wallet = new UserWallet(connection, options); - this.auth = new WalletAuthenticator(connection, this.wallet, options); + this.deployer = new ContractDeployer( + this.getConnectionInfo(), + options, + storage, + ); + this.wallet = new UserWallet(this.getConnectionInfo(), options); + this.auth = new WalletAuthenticator( + this.getConnectionInfo(), + this.wallet, + options, + ); this._publisher = new ContractPublisher( - connection, + this.getConnectionInfo(), this.options, this.storageHandler, ); @@ -182,151 +192,216 @@ export class ThirdwebSDK extends RPCConnectionHandler { /** * Get an instance of a Drop contract * @param contractAddress - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getNFTDrop(contractAddress: string): NFTDrop { - return this.getBuiltInContract( + public async getNFTDrop( + contractAddress: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"nft-drop">( contractAddress, NFTDrop.contractType, - ) as NFTDrop; + chain, + ); } /** * Get an instance of a SignatureDrop contract * @param contractAddress - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract * @internal */ - public getSignatureDrop(contractAddress: string): SignatureDrop { - return this.getBuiltInContract( + public async getSignatureDrop( + contractAddress: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"signature-drop">( contractAddress, SignatureDrop.contractType, - ) as SignatureDrop; + chain, + ); } /** * Get an instance of a NFT Collection contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getNFTCollection(address: string): NFTCollection { - return this.getBuiltInContract( + public async getNFTCollection( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"nft-collection">( address, NFTCollection.contractType, - ) as NFTCollection; + chain, + ); } /** * Get an instance of a Edition Drop contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getEditionDrop(address: string): EditionDrop { - return this.getBuiltInContract( + public async getEditionDrop( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"edition-drop">( address, EditionDrop.contractType, - ) as EditionDrop; + chain, + ); } /** * Get an instance of an Edition contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getEdition(address: string): Edition { - return this.getBuiltInContract(address, Edition.contractType) as Edition; + public async getEdition( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"edition">( + address, + Edition.contractType, + chain, + ); } /** * Get an instance of a Token Drop contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getTokenDrop(address: string): TokenDrop { - return this.getBuiltInContract( + public async getTokenDrop( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"token-drop">( address, TokenDrop.contractType, - ) as TokenDrop; + chain, + ); } /** * Get an instance of a Token contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getToken(address: string): Token { - return this.getBuiltInContract(address, Token.contractType) as Token; + public async getToken( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"token">(address, Token.contractType, chain); } /** * Get an instance of a Vote contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getVote(address: string): Vote { - return this.getBuiltInContract(address, Vote.contractType) as Vote; + public async getVote( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"vote">(address, Vote.contractType, chain); } /** * Get an instance of a Splits contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getSplit(address: string): Split { - return this.getBuiltInContract(address, Split.contractType) as Split; + public async getSplit( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"split">(address, Split.contractType, chain); } /** * Get an instance of a Marketplace contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getMarketplace(address: string): Marketplace { - return this.getBuiltInContract( + public async getMarketplace( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"marketplace">( address, Marketplace.contractType, - ) as Marketplace; + chain, + ); } /** * Get an instance of a Pack contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract */ - public getPack(address: string): Pack { - return this.getBuiltInContract(address, Pack.contractType) as Pack; + public async getPack( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"pack">(address, Pack.contractType, chain); } /** * Get an instance of a Multiwrap contract * @param address - the address of the deployed contract + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns the contract * @beta */ - public getMultiwrap(address: string): Multiwrap { - return this.getBuiltInContract( + public async getMultiwrap( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ): Promise { + return this.getBuiltInContract<"multiwrap">( address, Multiwrap.contractType, - ) as Multiwrap; + chain, + ); } /** * * @internal * @param address - the address of the contract to instantiate - * @param contractType - optional, the type of contract to instantiate + * @param contractType - the type of contract to instantiate + * @param chain - optional, chain (id or name) of the contract (defaults to the chain the SDK is connected to) * @returns a promise that resolves with the contract instance */ - public getBuiltInContract( + public async getBuiltInContract< + TContractType extends ContractType = ContractType, + >( address: string, contractType: TContractType, - ): ContractForContractType { + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ) { + const chainId = toChainId(chain); // if we have a contract in the cache we will return it // we will do this **without** checking any contract type things for simplicity, this may have to change in the future? - if (this.contractCache.has(address)) { - return this.contractCache.get( + if (this.contractCache.has({ chainId, address })) { + return this.contractCache.get({ + chainId, address, - ) as ContractForContractType; + }) as ContractForContractType; } if (contractType === "custom") { @@ -335,11 +410,20 @@ export class ThirdwebSDK extends RPCConnectionHandler { ); } + let connectionInfo = this.getConnectionInfo(); + if (chainId !== this.getConnectionInfo().chainId) { + connectionInfo = { + chainId, + provider: undefined, + signer: connectionInfo.signer, + }; + } + const newContract = new KNOWN_CONTRACTS_MAP[ contractType as keyof typeof KNOWN_CONTRACTS_MAP - ](this.getConnectionInfo(), address, this.storageHandler, this.options); + ](connectionInfo, address, this.storageHandler, this.options); - this.contractCache.set(address, newContract); + this.contractCache.set({ chainId, address }, newContract); // return the new contract return newContract as ContractForContractType; @@ -347,15 +431,18 @@ export class ThirdwebSDK extends RPCConnectionHandler { /** * @param contractAddress - the address of the contract to attempt to resolve the contract type for + * @param chain - optional the chain (id or name) of the contract (defaults to the SDK chainId) * @returns the {@link ContractType} for the given contract address * @throws if the contract type cannot be determined (is not a valid thirdweb contract) */ public async resolveContractType( contractAddress: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, ): Promise { + const chainId = toChainId(chain); const contract = IThirdwebContract__factory.connect( contractAddress, - this.getSignerOrProvider(), + getProviderForChain(chainId, this.options.chainIdToRPCUrlMap), ); const remoteContractType = ethers.utils .toUtf8String(await contract.contractType()) @@ -373,31 +460,39 @@ export class ThirdwebSDK extends RPCConnectionHandler { /** * Return all the contracts deployed by the specified address * @param walletAddress - the deployed address + * @param chain - the chain to fetch from contracts from */ - public async getContractList(walletAddress: string) { - const addresses = await ( - await this.deployer.getRegistry() - ).getContractAddresses(walletAddress); + public async getContractList( + walletAddress: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ) { + const registry = await this.deployer.getRegistry(chain); + const addresses = await registry.getContractAddresses(walletAddress); const addressesWithContractTypes = await Promise.all( addresses.map(async (address) => { let contractType: ContractType = "custom"; try { - contractType = await this.resolveContractType(address); + contractType = await this.resolveContractType(address, chain); } catch (e) { // this going to happen frequently and be OK, we'll just catch it and ignore it } let metadata: ContractMetadata | undefined; if (contractType === "custom") { try { - metadata = (await this.getContract(address)).metadata; + metadata = (await this.getContract(address, chain)).metadata; } catch (e) { console.log( `Couldn't get contract metadata for custom contract: ${address}`, ); } } else { - metadata = this.getBuiltInContract(address, contractType).metadata; + const builtInContract = await this.getBuiltInContract( + address, + contractType, + chain, + ); + metadata = builtInContract.metadata; } return { address, @@ -422,12 +517,17 @@ export class ThirdwebSDK extends RPCConnectionHandler { /** * Get an instance of a Custom ThirdwebContract * @param address - the address of the deployed contract + * @param chain - optional the chain (id or name) of the contract (defaults to the SDK chainId) * @returns the contract * @beta */ - public async getContract(address: string) { - if (this.contractCache.has(address)) { - return this.contractCache.get(address) as SmartContract; + public async getContract( + address: string, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ) { + const chainId = toChainId(chain); + if (this.contractCache.has({ chainId, address })) { + return this.contractCache.get({ chainId, address }) as SmartContract; } try { const publisher = this.getPublisher(); @@ -444,21 +544,35 @@ export class ThirdwebSDK extends RPCConnectionHandler { * Get an instance of a Custom contract from a json ABI * @param address - the address of the deployed contract * @param abi - the JSON abi + * @param chain - optional the chain (id or name) of the contract (defaults to the SDK chainId) * @returns the contract * @beta */ - public getContractFromAbi(address: string, abi: ContractInterface) { - if (this.contractCache.has(address)) { - return this.contractCache.get(address) as SmartContract; + public getContractFromAbi( + address: string, + abi: ContractInterface, + chain: ChainIdOrName = this.getConnectionInfo().chainId, + ) { + const chainId = toChainId(chain); + if (this.contractCache.has({ chainId, address })) { + return this.contractCache.get({ chainId, address }) as SmartContract; + } + let connectionInfo = this.getConnectionInfo(); + if (chainId !== this.getConnectionInfo().chainId) { + connectionInfo = { + chainId, + provider: undefined, + signer: connectionInfo.signer, + }; } const contract = new SmartContract( - this.getConnectionInfo(), + connectionInfo, address, abi, this.storageHandler, this.options, ); - this.contractCache.set(address, contract); + this.contractCache.set({ chainId, address }, contract); return contract; } diff --git a/src/core/types.ts b/src/core/types.ts index 5c9a8a001..017d6b06e 100644 --- a/src/core/types.ts +++ b/src/core/types.ts @@ -1,5 +1,6 @@ import { BigNumber, BytesLike, CallOverrides, Signer, providers } from "ethers"; import type { CONTRACTS_MAP, KNOWN_CONTRACTS_MAP } from "../contracts/maps"; +import { ChainIdOrName } from "../constants/index"; // --- utility types extracted from from ts-toolbelt --- // @@ -77,6 +78,11 @@ export type TransactionResult = If< TransactionResultWithMetadata >; +export type ChainAndAddress = { + chainId: ChainIdOrName; + address: string; +}; + /** * Forward Request Message that's used for gasless transaction * @public diff --git a/test/auth.test.ts b/test/auth.test.ts index 3eaa89094..edf9e024a 100644 --- a/test/auth.test.ts +++ b/test/auth.test.ts @@ -1,4 +1,4 @@ -import { signers } from "./before-setup"; +import { expectError, signers } from "./before-setup"; import { expect } from "chai"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { ChainId, ThirdwebSDK } from "../src"; @@ -50,7 +50,8 @@ describe("Wallet Authentication", async () => { sdk.auth.verify("test.thirdweb.com", payload); expect.fail(); } catch (err) { - expect(err.message).to.equal( + expectError( + err, "Expected domain 'test.thirdweb.com' does not match domain on payload 'thirdweb.com'", ); } @@ -66,7 +67,7 @@ describe("Wallet Authentication", async () => { sdk.auth.verify(domain, payload); expect.fail(); } catch (err) { - expect(err.message).to.equal("Login request has expired"); + expectError(err, "Login request has expired"); } }); @@ -82,9 +83,7 @@ describe("Wallet Authentication", async () => { }); expect.fail(); } catch (err) { - expect(err.message).to.equal( - "Chain ID '137' does not match payload chain ID '1'", - ); + expectError(err, "Chain ID '137' does not match payload chain ID '1'"); } }); @@ -97,7 +96,7 @@ describe("Wallet Authentication", async () => { sdk.auth.verify(domain, payload); expect.fail(); } catch (err) { - expect(err.message).to.contain("does not match payload address"); + expectError(err, "does not match payload address"); } }); @@ -121,7 +120,8 @@ describe("Wallet Authentication", async () => { await sdk.auth.authenticate("test.thirdweb.com", token); expect.fail(); } catch (err) { - expect(err.message).to.contain( + expectError( + err, "Expected token to be for the domain 'test.thirdweb.com', but found token with domain 'thirdweb.com'", ); } @@ -139,7 +139,7 @@ describe("Wallet Authentication", async () => { await sdk.auth.authenticate(domain, token); expect.fail(); } catch (err) { - expect(err.message).to.contain("This token is invalid before"); + expectError(err, "This token is invalid before"); } }); @@ -155,7 +155,7 @@ describe("Wallet Authentication", async () => { await sdk.auth.authenticate(domain, token); expect.fail(); } catch (err) { - expect(err.message).to.contain("This token expired"); + expectError(err, "This token expired"); } }); @@ -170,7 +170,8 @@ describe("Wallet Authentication", async () => { await sdk.auth.authenticate(domain, token); expect.fail(); } catch (err) { - expect(err.message).to.contain( + expectError( + err, `Expected the connected wallet address '${signerWallet.address}' to match the token issuer address '${adminWallet.address}'`, ); } diff --git a/test/edition-drop.test.ts b/test/edition-drop.test.ts index b6501f3bb..15a528a95 100644 --- a/test/edition-drop.test.ts +++ b/test/edition-drop.test.ts @@ -16,7 +16,7 @@ const deepEqualInAnyOrder = require("deep-equal-in-any-order"); use(deepEqualInAnyOrder); describe("Edition Drop Contract", async () => { - let bdContract: EditionDrop; + let editionDrop: EditionDrop; let adminWallet: SignerWithAddress, samWallet: SignerWithAddress, abbyWallet: SignerWithAddress, @@ -43,11 +43,11 @@ describe("Edition Drop Contract", async () => { platform_fee_basis_points: 10, platform_fee_recipient: adminWallet.address, }); - bdContract = sdk.getEditionDrop(address); + editionDrop = await sdk.getEditionDrop(address); }); it("should estimate gas cost", async () => { - const cost = await bdContract.estimator.gasCostOf("lazyMint", [ + const cost = await editionDrop.estimator.gasCostOf("lazyMint", [ 1000, "mock://12398172398172389/0", ]); @@ -55,26 +55,26 @@ describe("Edition Drop Contract", async () => { }); it("should allow you to set claim conditions", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test" }, { name: "test", description: "test" }, ]); - await bdContract.claimConditions.set(BigNumber.from("0"), [{}]); - const conditions = await bdContract.claimConditions.getAll(0); + await editionDrop.claimConditions.set(BigNumber.from("0"), [{}]); + const conditions = await editionDrop.claimConditions.getAll(0); assert.lengthOf(conditions, 1); }); it("should get all", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test" }, { name: "test", description: "test" }, ]); - const all = await bdContract.getAll(); + const all = await editionDrop.getAll(); expect(all.length).to.eq(2); }); it("allow all addresses in the merkle tree to claim", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test", @@ -92,7 +92,7 @@ describe("Edition Drop Contract", async () => { ]; const members = testWallets.map((w) => w.address); - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 1000, snapshot: members, @@ -101,18 +101,18 @@ describe("Edition Drop Contract", async () => { for (const member of testWallets) { await sdk.wallet.connect(member); - await bdContract.claim("0", 1); + await editionDrop.claim("0", 1); } - const bundle = await bdContract.get("0"); + const bundle = await editionDrop.get("0"); assert(bundle.supply.toNumber() === testWallets.length); - const claimers = await bdContract.history.getAllClaimerAddresses("0"); + const claimers = await editionDrop.history.getAllClaimerAddresses("0"); expect(claimers.length).to.eq(testWallets.length); expect(claimers).to.include(bobWallet.address); }); it("allow all addresses in the merkle tree to claim using useSnapshot", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test", @@ -128,7 +128,7 @@ describe("Edition Drop Contract", async () => { w3, ]; const members = testWallets.map((w) => w.address); - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 1000, snapshot: members, @@ -139,14 +139,14 @@ describe("Edition Drop Contract", async () => { for (const member of testWallets) { try { sdk.wallet.connect(member); - await bdContract.claim("0", 1); + await editionDrop.claim("0", 1); } catch (e) { if (member !== w4) { throw e; } } } - const bundle = await bdContract.get("0"); + const bundle = await editionDrop.get("0"); assert(bundle.supply.toNumber() === testWallets.length - 1); }); @@ -168,7 +168,7 @@ describe("Edition Drop Contract", async () => { name: "test 4", }, ]; - const result = await bdContract.createBatch(tokens); + const result = await editionDrop.createBatch(tokens); assert.lengthOf(result, tokens.length); for (const token of tokens) { const found = result.find( @@ -185,7 +185,7 @@ describe("Edition Drop Contract", async () => { name: "test 6", }, ]; - const moreResult = await bdContract.createBatch(moreTokens); + const moreResult = await editionDrop.createBatch(moreTokens); assert.lengthOf(moreResult, moreTokens.length); for (const token of moreTokens) { const found = moreResult.find( @@ -196,10 +196,10 @@ describe("Edition Drop Contract", async () => { }); it("should allow setting max claims per wallet", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "name", description: "description" }, ]); - await bdContract.claimConditions.set(0, [ + await editionDrop.claimConditions.set(0, [ { snapshot: [ { address: w1.address, maxClaimable: 2 }, @@ -208,17 +208,17 @@ describe("Edition Drop Contract", async () => { }, ]); await sdk.wallet.connect(w1); - await bdContract.claim(0, 2); + await editionDrop.claim(0, 2); try { await sdk.wallet.connect(w2); - await bdContract.claim(0, 2); + await editionDrop.claim(0, 2); } catch (e) { expectError(e, "invalid quantity proof"); } }); it("should allow a default claim condition to be used to claim", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test 0", }, @@ -230,12 +230,12 @@ describe("Edition Drop Contract", async () => { }, ]); - await bdContract.claimConditions.set("0", [{}]); - await bdContract.claim("0", 1); + await editionDrop.claimConditions.set("0", [{}]); + await editionDrop.claim("0", 1); }); it("should return addresses of all the claimers", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test 0", }, @@ -244,12 +244,12 @@ describe("Edition Drop Contract", async () => { }, ]); - await bdContract.claimConditions.set("0", [{}]); - await bdContract.claimConditions.set("1", [{}]); - await bdContract.claim("0", 1); + await editionDrop.claimConditions.set("0", [{}]); + await editionDrop.claimConditions.set("1", [{}]); + await editionDrop.claim("0", 1); await sdk.wallet.connect(samWallet); - await bdContract.claim("0", 1); + await editionDrop.claim("0", 1); // TODO some asserts // const claimers = await bdContract.getAllClaimerAddresses("0"); @@ -259,52 +259,52 @@ describe("Edition Drop Contract", async () => { // ]); await sdk.wallet.connect(w1); - await bdContract.claim("1", 1); + await editionDrop.claim("1", 1); await sdk.wallet.connect(w2); - await bdContract.claim("1", 1); + await editionDrop.claim("1", 1); - const ownedW1 = await bdContract.getOwned(w1.address); + const ownedW1 = await editionDrop.getOwned(w1.address); assert(ownedW1.length === 1); - const ownedW2 = await bdContract.getOwned(w2.address); + const ownedW2 = await editionDrop.getOwned(w2.address); assert(ownedW2.length === 1); }); it("should return the correct status if a token can be claimed", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { snapshot: [w1.address], }, ]); await sdk.wallet.connect(w1); - const canClaimW1 = await bdContract.claimConditions.canClaim("0", 1); + const canClaimW1 = await editionDrop.claimConditions.canClaim("0", 1); assert.isTrue(canClaimW1, "w1 should be able to claim"); await sdk.wallet.connect(w2); - const canClaimW2 = await bdContract.claimConditions.canClaim("0", 1); + const canClaimW2 = await editionDrop.claimConditions.canClaim("0", 1); assert.isFalse(canClaimW2, "w2 should not be able to claim"); }); it("Platform fees", async () => { - const fees = await bdContract.platformFees.get(); + const fees = await editionDrop.platformFees.get(); expect(fees.platform_fee_recipient).to.eq(adminWallet.address); expect(fees.platform_fee_basis_points).to.eq(10); - await bdContract.platformFees.set({ + await editionDrop.platformFees.set({ platform_fee_recipient: samWallet.address, platform_fee_basis_points: 500, }); - const fees2 = await bdContract.platformFees.get(); + const fees2 = await editionDrop.platformFees.get(); expect(fees2.platform_fee_recipient).to.eq(samWallet.address); expect(fees2.platform_fee_basis_points).to.eq(500); }); it("should allow custom overrides", async () => { - bdContract.interceptor.overrideNextTransaction(() => ({ + editionDrop.interceptor.overrideNextTransaction(() => ({ nonce: 5000, })); try { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test", @@ -316,24 +316,24 @@ describe("Edition Drop Contract", async () => { }); it("canClaim: 1 address", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { snapshot: [w1.address], }, ]); assert.isTrue( - await bdContract.claimConditions.canClaim("0", 1, w1.address), + await editionDrop.claimConditions.canClaim("0", 1, w1.address), "can claim", ); assert.isFalse( - await bdContract.claimConditions.canClaim("0", 1, w2.address), + await editionDrop.claimConditions.canClaim("0", 1, w2.address), "!can claim", ); }); it("canClaim: 3 address", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { snapshot: [ w1.address.toUpperCase().replace("0X", "0x"), @@ -344,40 +344,40 @@ describe("Edition Drop Contract", async () => { ]); assert.isTrue( - await bdContract.claimConditions.canClaim("0", 1, w1.address), + await editionDrop.claimConditions.canClaim("0", 1, w1.address), "can claim", ); assert.isTrue( - await bdContract.claimConditions.canClaim("0", 1, w2.address), + await editionDrop.claimConditions.canClaim("0", 1, w2.address), "can claim", ); assert.isTrue( - await bdContract.claimConditions.canClaim("0", 1, w3.address), + await editionDrop.claimConditions.canClaim("0", 1, w3.address), "can claim", ); assert.isFalse( - await bdContract.claimConditions.canClaim("0", 1, bobWallet.address), + await editionDrop.claimConditions.canClaim("0", 1, bobWallet.address), "!can claim", ); }); it("should work when the token has a price", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test", }, ]); - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { price: 1, }, ]); - await bdContract.claim("0", 1); + await editionDrop.claim("0", 1); }); it("should set multiple claim conditions at once", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test1", description: "test1", @@ -387,7 +387,7 @@ describe("Edition Drop Contract", async () => { description: "test2", }, ]); - await bdContract.claimConditions.setBatch([ + await editionDrop.claimConditions.setBatch([ { tokenId: 0, claimConditions: [ @@ -406,9 +406,9 @@ describe("Edition Drop Contract", async () => { ], }, ]); - await bdContract.claim("0", 2); + await editionDrop.claim("0", 2); try { - await bdContract.claim("1", 2); + await editionDrop.claim("1", 2); } catch (e) { expectError(e, "exceed max mint supply"); } @@ -416,7 +416,7 @@ describe("Edition Drop Contract", async () => { describe("eligibility", () => { beforeEach(async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test", @@ -426,7 +426,7 @@ describe("Edition Drop Contract", async () => { it("should return false if there isn't an active claim condition", async () => { const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "0", bobWallet.address, @@ -434,7 +434,7 @@ describe("Edition Drop Contract", async () => { expect(reasons).to.include(ClaimEligibility.NoClaimConditionSet); assert.lengthOf(reasons, 1); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "1", w1.address, @@ -443,30 +443,30 @@ describe("Edition Drop Contract", async () => { }); it("set claim condition in the future should not be claimable now", async () => { - await bdContract.claimConditions.set(0, [ + await editionDrop.claimConditions.set(0, [ { startTime: new Date(Date.now() + 60 * 60 * 24 * 1000), }, ]); - const canClaim = await bdContract.claimConditions.canClaim(0, 1); + const canClaim = await editionDrop.claimConditions.canClaim(0, 1); expect(canClaim).to.eq(false); }); it("should check for the total supply", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 1, }, ]); const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "2", w1.address, ); expect(reasons).to.include(ClaimEligibility.NotEnoughSupply); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "2", w1.address, @@ -475,7 +475,7 @@ describe("Edition Drop Contract", async () => { }); it("should check if an address has valid merkle proofs", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 1, snapshot: [w2.address, adminWallet.address], @@ -483,13 +483,13 @@ describe("Edition Drop Contract", async () => { ]); const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "1", w1.address, ); expect(reasons).to.include(ClaimEligibility.AddressNotAllowed); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "1", w1.address, @@ -498,17 +498,17 @@ describe("Edition Drop Contract", async () => { }); it("should check if its been long enough since the last claim", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 10, waitInSeconds: 24 * 60 * 60, }, ]); await sdk.wallet.connect(bobWallet); - await bdContract.claim("0", 1); + await editionDrop.claim("0", 1); const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "1", bobWallet.address, @@ -517,7 +517,7 @@ describe("Edition Drop Contract", async () => { expect(reasons).to.include( ClaimEligibility.WaitBeforeNextClaimTransaction, ); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "1", bobWallet.address, @@ -526,7 +526,7 @@ describe("Edition Drop Contract", async () => { }); it("should check if an address has enough native currency", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 10, price: "1000000000000000", @@ -536,14 +536,14 @@ describe("Edition Drop Contract", async () => { await sdk.wallet.connect(bobWallet); const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "1", bobWallet.address, ); expect(reasons).to.include(ClaimEligibility.NotEnoughTokens); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "1", w1.address, @@ -552,7 +552,7 @@ describe("Edition Drop Contract", async () => { }); it("should check if an address has enough erc20 currency", async () => { - const currency = sdk.getToken( + const currency = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "test", symbol: "test", @@ -560,7 +560,7 @@ describe("Edition Drop Contract", async () => { }), ); - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 10, price: "1000000000000000", @@ -570,14 +570,14 @@ describe("Edition Drop Contract", async () => { await sdk.wallet.connect(bobWallet); const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "1", bobWallet.address, ); expect(reasons).to.include(ClaimEligibility.NotEnoughTokens); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "1", w1.address, @@ -586,7 +586,7 @@ describe("Edition Drop Contract", async () => { }); it("should return nothing if the claim is eligible", async () => { - await bdContract.claimConditions.set("0", [ + await editionDrop.claimConditions.set("0", [ { maxQuantity: 10, price: "100", @@ -596,14 +596,14 @@ describe("Edition Drop Contract", async () => { ]); const reasons = - await bdContract.claimConditions.getClaimIneligibilityReasons( + await editionDrop.claimConditions.getClaimIneligibilityReasons( "0", "1", w1.address, ); assert.lengthOf(reasons, 0); - const canClaim = await bdContract.claimConditions.canClaim( + const canClaim = await editionDrop.claimConditions.canClaim( "0", "1", w1.address, @@ -612,85 +612,85 @@ describe("Edition Drop Contract", async () => { }); }); it("should allow you to update claim conditions", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test" }, { name: "test", description: "test" }, ]); - await bdContract.claimConditions.set(BigNumber.from("0"), [{}]); - await bdContract.claimConditions.update(BigNumber.from("0"), 0, {}); - const conditions = await bdContract.claimConditions.getAll(0); + await editionDrop.claimConditions.set(BigNumber.from("0"), [{}]); + await editionDrop.claimConditions.update(BigNumber.from("0"), 0, {}); + const conditions = await editionDrop.claimConditions.getAll(0); assert.lengthOf(conditions, 1); }); it("should return snapshot data on claim conditions", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test" }, { name: "test", description: "test" }, ]); - await bdContract.claimConditions.set(0, [ + await editionDrop.claimConditions.set(0, [ { snapshot: [samWallet.address], }, ]); - const conditions = await bdContract.claimConditions.getAll(0); + const conditions = await editionDrop.claimConditions.getAll(0); assert.lengthOf(conditions, 1); invariant(conditions[0].snapshot); expect(conditions[0].snapshot[0].address).to.eq(samWallet.address); }); it("should be able to use claim as function expected", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", }, ]); - await bdContract.claimConditions.set("0", [{}]); - await bdContract.claim("0", 1); - assert((await bdContract.getOwned()).length > 0); + await editionDrop.claimConditions.set("0", [{}]); + await editionDrop.claim("0", 1); + assert((await editionDrop.getOwned()).length > 0); }); it("should be able to use claimTo function as expected", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", }, ]); - await bdContract.claimConditions.set("0", [{}]); - await bdContract.claimTo(samWallet.address, "0", 3); - assert((await bdContract.getOwned(samWallet.address)).length === 1); + await editionDrop.claimConditions.set("0", [{}]); + await editionDrop.claimTo(samWallet.address, "0", 3); + assert((await editionDrop.getOwned(samWallet.address)).length === 1); assert( - (await bdContract.getOwned(samWallet.address))[0].owner === + (await editionDrop.getOwned(samWallet.address))[0].owner === samWallet.address, ); assert( ( - await bdContract.getOwned(samWallet.address) + await editionDrop.getOwned(samWallet.address) )[0].quantityOwned.toNumber() === 3, ); }); describe("setting merkle claim conditions", () => { it("should not overwrite existing merkle keys in the metadata", async () => { - await bdContract.createBatch([ + await editionDrop.createBatch([ { name: "test", description: "test" }, { name: "test", description: "test" }, ]); - await bdContract.claimConditions.set("1", [ + await editionDrop.claimConditions.set("1", [ { snapshot: [w1.address, w2.address, bobWallet.address], }, ]); - await bdContract.claimConditions.set("2", [ + await editionDrop.claimConditions.set("2", [ { snapshot: [w3.address, w1.address, w2.address, adminWallet.address], }, ]); - const metadata = await bdContract.metadata.get(); + const metadata = await editionDrop.metadata.get(); const merkle: { [key: string]: string } = metadata.merkle; assert.lengthOf(Object.keys(merkle), 2); }); diff --git a/test/edition.test.ts b/test/edition.test.ts index 641b32d3b..fd024dd46 100644 --- a/test/edition.test.ts +++ b/test/edition.test.ts @@ -9,7 +9,7 @@ import { ethers } from "ethers"; global.fetch = require("cross-fetch"); describe("Edition Contract", async () => { - let bundleContract: Edition; + let editionContract: Edition; // let nftContract: NFTContract; // let currencyContract: CurrencyContract; @@ -34,11 +34,11 @@ describe("Edition Contract", async () => { platform_fee_basis_points: 10, platform_fee_recipient: AddressZero, }); - bundleContract = sdk.getEdition(address); + editionContract = await sdk.getEdition(address); }); it("gas cost", async () => { - const cost = await bundleContract.estimator.gasCostOf("mintTo", [ + const cost = await editionContract.estimator.gasCostOf("mintTo", [ adminWallet.address, ethers.constants.MaxUint256, "mock://12398172398172389/0", @@ -55,15 +55,15 @@ describe("Edition Contract", async () => { supply: 10, }); } - await bundleContract.mintBatch(nfts); - const total = await bundleContract.getTotalCount(); + await editionContract.mintBatch(nfts); + const total = await editionContract.getTotalCount(); expect(total.toNumber()).to.eq(100); - const page1 = await bundleContract.getAll({ + const page1 = await editionContract.getAll({ count: 2, start: 0, }); expect(page1).to.be.an("array").length(2); - const page2 = await bundleContract.getAll({ + const page2 = await editionContract.getAll({ count: 2, start: 20, }); @@ -73,7 +73,7 @@ describe("Edition Contract", async () => { }); it("mint additional suply", async () => { - const tx = await bundleContract.mintToSelf({ + const tx = await editionContract.mintToSelf({ metadata: { name: "Bundle 1", description: "Bundle 1", @@ -81,10 +81,10 @@ describe("Edition Contract", async () => { }, supply: 10, }); - const nft = await bundleContract.get(tx.id); + const nft = await editionContract.get(tx.id); expect(nft.supply.toNumber()).to.eq(10); - await bundleContract.mintAdditionalSupply(tx.id, 10); - const nft2 = await bundleContract.get(tx.id); + await editionContract.mintAdditionalSupply(tx.id, 10); + const nft2 = await editionContract.get(tx.id); expect(nft2.supply.toNumber()).to.eq(20); }); @@ -92,11 +92,11 @@ describe("Edition Contract", async () => { const uri = await storage.uploadMetadata({ name: "Test1", }); - const tx = await bundleContract.mintToSelf({ + const tx = await editionContract.mintToSelf({ metadata: uri, supply: 10, }); - const nft = await bundleContract.get(tx.id); + const nft = await editionContract.get(tx.id); assert.isNotNull(nft); assert.equal(nft.metadata.name, "Test1"); }); @@ -105,19 +105,19 @@ describe("Edition Contract", async () => { const uri = await storage.uploadMetadata({ name: "Test1", }); - await bundleContract.mintBatch([ + await editionContract.mintBatch([ { metadata: uri, supply: 10, }, ]); - const nft = await bundleContract.get("0"); + const nft = await editionContract.get("0"); assert.isNotNull(nft); assert.equal(nft.metadata.name, "Test1"); }); it("should return all owned collection tokens", async () => { - await bundleContract.mintToSelf({ + await editionContract.mintToSelf({ metadata: { name: "Bundle 1", description: "Bundle 1", @@ -125,29 +125,29 @@ describe("Edition Contract", async () => { }, supply: 100, }); - const nfts = await bundleContract.getOwned(adminWallet.address); + const nfts = await editionContract.getOwned(adminWallet.address); expect(nfts).to.be.an("array").length(1); expect(nfts[0].metadata.image).to.be.equal("fake://myownfakeipfs"); expect(nfts[0].owner).to.be.equal(adminWallet.address); expect(nfts[0].quantityOwned.toNumber()).to.be.equal(100); expect(nfts[0].supply.toNumber()).to.be.equal(100); - const bobsNfts = await bundleContract.getOwned(bobWallet.address); + const bobsNfts = await editionContract.getOwned(bobWallet.address); expect(bobsNfts) .to.be.an("array") .length(0, "Bob should not have any nfts"); - await bundleContract.transfer(bobWallet.address, 0, 20); - const adminNft = await bundleContract.getOwned(adminWallet.address); + await editionContract.transfer(bobWallet.address, 0, 20); + const adminNft = await editionContract.getOwned(adminWallet.address); expect(adminNft[0].quantityOwned.toNumber()).to.be.equal(80); - const bobsNftsAfterTransfer = await bundleContract.getOwned( + const bobsNftsAfterTransfer = await editionContract.getOwned( bobWallet.address, ); expect(bobsNftsAfterTransfer[0].quantityOwned.toNumber()).to.be.equal(20); }); it("should airdrop edition tokens to different wallets", async () => { - await bundleContract.mintToSelf({ + await editionContract.mintToSelf({ metadata: { name: "Bundle 1", description: "Bundle 1", @@ -166,16 +166,16 @@ describe("Edition Contract", async () => { }, ]; - await bundleContract.airdrop(0, addresses); + await editionContract.airdrop(0, addresses); - const samOwned = await bundleContract.getOwned(samWallet.address); - const bobOwned = await bundleContract.getOwned(bobWallet.address); + const samOwned = await editionContract.getOwned(samWallet.address); + const bobOwned = await editionContract.getOwned(bobWallet.address); expect(samOwned[0].quantityOwned.toNumber()).to.be.equal(5); expect(bobOwned[0].quantityOwned.toNumber()).to.be.equal(3); }); it("should fail airdrop because not enough NFTs owned", async () => { - await bundleContract.mintToSelf({ + await editionContract.mintToSelf({ metadata: { name: "Bundle 1", description: "Bundle 1", @@ -195,7 +195,7 @@ describe("Edition Contract", async () => { ]; try { - await bundleContract.airdrop(0, addresses); + await editionContract.airdrop(0, addresses); } catch (e) { expectError(e, "The caller owns"); } @@ -203,17 +203,17 @@ describe("Edition Contract", async () => { // TODO: This test should move to the royalty suite it("updates the bps in both the metadata and on-chain", async () => { - const currentBps = (await bundleContract.royalties.getDefaultRoyaltyInfo()) + const currentBps = (await editionContract.royalties.getDefaultRoyaltyInfo()) .seller_fee_basis_points; assert.equal(currentBps, 1000); - const cMetadata = await bundleContract.metadata.get(); + const cMetadata = await editionContract.metadata.get(); assert.equal(cMetadata.seller_fee_basis_points, 1000); const testBPS = 100; - await bundleContract.royalties.setDefaultRoyaltyInfo({ + await editionContract.royalties.setDefaultRoyaltyInfo({ seller_fee_basis_points: testBPS, }); - const newMetadata = await bundleContract.metadata.get(); + const newMetadata = await editionContract.metadata.get(); assert.equal( newMetadata.seller_fee_basis_points, @@ -221,14 +221,14 @@ describe("Edition Contract", async () => { "Fetching the BPS from the metadata should return 100", ); assert.equal( - (await bundleContract.royalties.getDefaultRoyaltyInfo()) + (await editionContract.royalties.getDefaultRoyaltyInfo()) .seller_fee_basis_points, testBPS, "Fetching the BPS with the tx should return 100", ); }); it("should correctly upload nft metadata", async () => { - await bundleContract.mintBatch([ + await editionContract.mintBatch([ { metadata: { name: "Test0", @@ -244,7 +244,7 @@ describe("Edition Contract", async () => { supply: 5, }, ]); - const nfts = await bundleContract.getAll(); + const nfts = await editionContract.getAll(); expect(nfts).to.be.an("array").length(2); let i = 0; nfts.forEach((nft) => { diff --git a/test/events.test.ts b/test/events.test.ts index 4f1c01d10..0bea60cd9 100644 --- a/test/events.test.ts +++ b/test/events.test.ts @@ -1,14 +1,7 @@ -import { ethers, Wallet } from "ethers"; +import { ethers } from "ethers"; import { sdk, signers } from "./before-setup"; -import { EventType } from "../src/constants/events"; import { expect } from "chai"; -import { - ContractEvent, - NFTDrop, - ThirdwebSDK, - NFTCollection, - ChainId, -} from "../src"; +import { ContractEvent, NFTCollection, NFTDrop } from "../src"; import { AddressZero } from "@ethersproject/constants"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; @@ -17,16 +10,14 @@ global.fetch = require("cross-fetch"); describe("Events", async () => { let dropContract: NFTDrop; let nftContract: NFTCollection; - let adminWallet: SignerWithAddress, - samWallet: SignerWithAddress, - bobWallet: SignerWithAddress; + let adminWallet: SignerWithAddress, samWallet: SignerWithAddress; before(() => { - [adminWallet, samWallet, bobWallet] = signers; + [adminWallet, samWallet] = signers; }); beforeEach(async () => { - dropContract = sdk.getNFTDrop( + dropContract = await sdk.getNFTDrop( await sdk.deployer.deployBuiltInContract(NFTDrop.contractType, { name: `Testing drop from SDK`, description: "Test contract from tests", @@ -40,7 +31,7 @@ describe("Events", async () => { }), ); - nftContract = sdk.getNFTCollection( + nftContract = await sdk.getNFTCollection( await sdk.deployer.deployBuiltInContract(NFTCollection.contractType, { name: "NFT Contract", description: "Test NFT contract from tests", @@ -88,29 +79,6 @@ describe("Events", async () => { expect(events.map((e) => e.eventName)).to.include("TokensLazyMinted"); }); - // TODO - it.skip("should emit Signature events", async () => { - const RPC_URL = "https://rpc-mumbai.maticvigil.com/"; - const provider = ethers.getDefaultProvider(RPC_URL); - const wallet = Wallet.createRandom().connect(provider); - const esdk = ThirdwebSDK.fromSigner(wallet, ChainId.Hardhat, { - gasless: { - openzeppelin: { - relayerUrl: "https://google.com", // TODO test relayer url? - }, - }, - }); - sdk.on(EventType.Transaction, (event) => { - console.log(event); - }); - sdk.on(EventType.Signature, (event) => { - console.log(event); - }); - await esdk - .getNFTDrop(dropContract.getAddress()) - .setApprovalForAll(ethers.constants.AddressZero, true); - }); - it("should return single event", async () => { await nftContract.mintToSelf({ name: "Test1", diff --git a/test/gasless.test.ts b/test/gasless.test.ts deleted file mode 100644 index ad72a7630..000000000 --- a/test/gasless.test.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { ethers, Wallet } from "ethers"; -import { ChainId, EditionDrop, ThirdwebSDK } from "../src"; - -const RPC_URL = "https://rpc-mumbai.maticvigil.com/"; - -global.fetch = require("cross-fetch"); - -describe("Gasless Forwarder", async () => { - let bundleDropContract: EditionDrop; - - it.skip("should use sdk with biconomy", async () => { - const BUNDLE_DROP_ADDRESS = "0xEBed8e37a32660dbCeeeC19cCBb952b7d214f008"; - const provider = ethers.getDefaultProvider(RPC_URL); - const wallet = Wallet.createRandom().connect(provider); - const sdk = ThirdwebSDK.fromSigner(wallet, ChainId.Hardhat, { - gasless: { - biconomy: { - apiKey: process.env.BICONOMY_API_KEY as string, - apiId: process.env.BICONOMY_API_ID as string, - }, - }, - }); - const bundleDrop = sdk.getEditionDrop(BUNDLE_DROP_ADDRESS); - await bundleDrop.claim("0", 1, []); - }); - - it.skip("should use sdk with openzeppelin defender", async () => { - const BUNDLE_DROP_ADDRESS = "0x41c1f16fAd38381727b327b26F282C7798ee0655"; - const provider = ethers.getDefaultProvider(RPC_URL); - const wallet = Wallet.createRandom().connect(provider); - const sdk = new ThirdwebSDK(wallet, { - gasless: { - openzeppelin: { - relayerUrl: process.env.OZ_DEFENDER_RELAYER_URL as string, - }, - }, - }); - const bundleDrop = sdk.getBundleDropContract(BUNDLE_DROP_ADDRESS); - await bundleDrop.claim("0", 1, []); - }); -}); diff --git a/test/marketplace.test.ts b/test/marketplace.test.ts index 156dfc123..bffa434b8 100644 --- a/test/marketplace.test.ts +++ b/test/marketplace.test.ts @@ -33,7 +33,7 @@ let tokenAddress = NATIVE_TOKEN_ADDRESS; describe("Marketplace Contract", async () => { let marketplaceContract: Marketplace; let dummyNftContract: NFTCollection; - let dummyBundleContract: Edition; + let dummyEditionContract: Edition; let customTokenContract: Token; let adminWallet: SignerWithAddress, @@ -51,13 +51,13 @@ describe("Marketplace Contract", async () => { await sdk.wallet.connect(adminWallet); - marketplaceContract = sdk.getMarketplace( + marketplaceContract = await sdk.getMarketplace( await sdk.deployer.deployBuiltInContract(Marketplace.contractType, { name: "Test Marketplace", seller_fee_basis_points: 0, }), ); - dummyNftContract = sdk.getNFTCollection( + dummyNftContract = await sdk.getNFTCollection( await sdk.deployer.deployBuiltInContract(NFTCollection.contractType, { name: "TEST NFT", seller_fee_basis_points: 200, @@ -79,14 +79,14 @@ describe("Marketplace Contract", async () => { name: "Test 4", }, ]); - dummyBundleContract = sdk.getEdition( + dummyEditionContract = await sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { - name: "TEST BUNDLE", + name: "TEST EDITION", seller_fee_basis_points: 100, primary_sale_recipient: adminWallet.address, }), ); - await dummyBundleContract.mintBatch([ + await dummyEditionContract.mintBatch([ { metadata: { name: "Test 0", @@ -101,7 +101,7 @@ describe("Marketplace Contract", async () => { }, ]); - customTokenContract = sdk.getToken( + customTokenContract = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "Test", symbol: "TEST", @@ -191,7 +191,7 @@ describe("Marketplace Contract", async () => { it("should list direct listings with 1155s", async () => { const listingId = await createDirectListing( - dummyBundleContract.getAddress(), + dummyEditionContract.getAddress(), 0, 10, ); @@ -217,10 +217,10 @@ describe("Marketplace Contract", async () => { it("should be able to restrict listing", async () => { await marketplaceContract.allowListingFromSpecificAssetOnly( - dummyBundleContract.getAddress(), + dummyEditionContract.getAddress(), ); const listingId = await createDirectListing( - dummyBundleContract.getAddress(), + dummyEditionContract.getAddress(), 0, 10, ); @@ -239,15 +239,15 @@ describe("Marketplace Contract", async () => { await createDirectListing(dummyNftContract.getAddress(), 0); await createAuctionListing(dummyNftContract.getAddress(), 1); - await createDirectListing(dummyBundleContract.getAddress(), 0, 10); - await createAuctionListing(dummyBundleContract.getAddress(), 0, 10); + await createDirectListing(dummyEditionContract.getAddress(), 0, 10); + await createAuctionListing(dummyEditionContract.getAddress(), 0, 10); - await dummyBundleContract.transfer(samWallet.address, "0", 10); - await dummyBundleContract.transfer(samWallet.address, "1", 10); + await dummyEditionContract.transfer(samWallet.address, "0", 10); + await dummyEditionContract.transfer(samWallet.address, "1", 10); await sdk.wallet.connect(samWallet); - await createDirectListing(dummyBundleContract.getAddress(), 0, 10); - await createAuctionListing(dummyBundleContract.getAddress(), 1, 10); + await createDirectListing(dummyEditionContract.getAddress(), 0, 10); + await createAuctionListing(dummyEditionContract.getAddress(), 1, 10); }); it("should paginate properly", async () => { @@ -267,7 +267,7 @@ describe("Marketplace Contract", async () => { it("should filter asset contract properly", async () => { const listings = await marketplaceContract.getAllListings({ - tokenContract: dummyBundleContract.getAddress(), + tokenContract: dummyEditionContract.getAddress(), }); assert.equal(listings.length, 4, "filter doesn't work"); }); @@ -712,7 +712,7 @@ describe("Marketplace Contract", async () => { it("should allow an auction buyout", async () => { const id = ( await marketplaceContract.auction.createListing({ - assetContractAddress: dummyBundleContract.getAddress(), + assetContractAddress: dummyEditionContract.getAddress(), buyoutPricePerToken: 0.8, currencyContractAddress: tokenAddress, // to start tomorrow so we can update it @@ -726,7 +726,7 @@ describe("Marketplace Contract", async () => { await sdk.wallet.connect(bobWallet); await marketplaceContract.buyoutListing(id); - const balance = await dummyBundleContract.balanceOf( + const balance = await dummyEditionContract.balanceOf( bobWallet.address, "1", ); diff --git a/test/multiwrap.test.ts b/test/multiwrap.test.ts index 993f8be8b..d9d6965c2 100644 --- a/test/multiwrap.test.ts +++ b/test/multiwrap.test.ts @@ -27,9 +27,9 @@ describe("Multiwrap Contract", async () => { image: "https://pbs.twimg.com/profile_images/1433508973215367176/XBCfBn3g_400x400.jpg", }); - multiwrapContract = sdk.getMultiwrap(address); + multiwrapContract = await sdk.getMultiwrap(address); - nftContract = sdk.getNFTCollection( + nftContract = await sdk.getNFTCollection( await sdk.deployer.deployBuiltInContract(NFTCollection.contractType, { name: "TEST NFT", seller_fee_basis_points: 200, @@ -55,7 +55,7 @@ describe("Multiwrap Contract", async () => { // TODO should this be done inside wrap() ? might result in a ton of different transactions :/ await nftContract.setApprovalForAll(multiwrapContract.getAddress(), true); - editionContract = sdk.getEdition( + editionContract = await sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { name: "TEST BUNDLE", seller_fee_basis_points: 100, @@ -82,7 +82,7 @@ describe("Multiwrap Contract", async () => { true, ); - tokenContract = sdk.getToken( + tokenContract = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "Test", symbol: "TEST", @@ -106,7 +106,7 @@ describe("Multiwrap Contract", async () => { await tokenContract.setAllowance(multiwrapContract.getAddress(), 1000); - tokenContract2 = sdk.getToken( + tokenContract2 = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "Test2", symbol: "TEST2", diff --git a/test/nft-drop.test.ts b/test/nft-drop.test.ts index 17bf50845..aaebdd10d 100644 --- a/test/nft-drop.test.ts +++ b/test/nft-drop.test.ts @@ -37,7 +37,7 @@ describe("NFT Drop Contract", async () => { platform_fee_basis_points: 10, platform_fee_recipient: AddressZero, }); - dropContract = sdk.getNFTDrop(address); + dropContract = await sdk.getNFTDrop(address); }); it("should lazy mint with URI", async () => { diff --git a/test/nft.test.ts b/test/nft.test.ts index 7cc795f65..345b2cc9a 100644 --- a/test/nft.test.ts +++ b/test/nft.test.ts @@ -9,12 +9,10 @@ global.fetch = require("cross-fetch"); describe("NFT Contract", async () => { type NewType = NFTCollection; let nftContract: NewType; - let adminWallet: SignerWithAddress, - samWallet: SignerWithAddress, - bobWallet: SignerWithAddress; + let adminWallet: SignerWithAddress, samWallet: SignerWithAddress; before(() => { - [adminWallet, samWallet, bobWallet] = signers; + [adminWallet, samWallet] = signers; }); beforeEach(async () => { @@ -33,7 +31,7 @@ describe("NFT Contract", async () => { platform_fee_recipient: AddressZero, }, ); - nftContract = sdk.getNFTCollection(address); + nftContract = await sdk.getNFTCollection(address); }); it("should return nfts even if some are burned", async () => { diff --git a/test/pack.test.ts b/test/pack.test.ts index f5b67a5c9..7f683129c 100644 --- a/test/pack.test.ts +++ b/test/pack.test.ts @@ -9,17 +9,15 @@ global.fetch = require("cross-fetch"); describe("Pack Contract", async () => { let packContract: Pack; - let bundleContract: Edition; + let editionContract: Edition; - let adminWallet: SignerWithAddress, - samWallet: SignerWithAddress, - bobWallet: SignerWithAddress; + let adminWallet: SignerWithAddress, samWallet: SignerWithAddress; before(() => { - [adminWallet, samWallet, bobWallet] = signers; + [adminWallet, samWallet] = signers; }); - const createBundles = async () => { + const mintEditions = async () => { const batch: EditionMetadataInput[] = []; for (let i = 0; i < 5; i++) { batch.push({ @@ -30,19 +28,19 @@ describe("Pack Contract", async () => { }); } - await bundleContract.mintBatch(batch); + await editionContract.mintBatch(batch); }; beforeEach(async () => { sdk.wallet.connect(adminWallet); - packContract = sdk.getPack( + packContract = await sdk.getPack( await sdk.deployer.deployBuiltInContract(Pack.contractType, { name: "Pack Contract", seller_fee_basis_points: 1000, }), ); - bundleContract = sdk.getEdition( + editionContract = await sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { name: "NFT Contract", seller_fee_basis_points: 1000, @@ -50,27 +48,27 @@ describe("Pack Contract", async () => { }), ); - await bundleContract.setApprovalForAll(packContract.getAddress(), true); - await createBundles(); + await editionContract.setApprovalForAll(packContract.getAddress(), true); + await mintEditions(); }); const createPacks = async () => { const packOne = await packContract.create({ erc1155Rewards: [ { - contractAddress: bundleContract.getAddress(), + contractAddress: editionContract.getAddress(), tokenId: "0", quantityPerReward: 1, totalRewards: 50, }, { - contractAddress: bundleContract.getAddress(), + contractAddress: editionContract.getAddress(), tokenId: "1", quantityPerReward: 1, totalRewards: 50, }, { - contractAddress: bundleContract.getAddress(), + contractAddress: editionContract.getAddress(), tokenId: "2", quantityPerReward: 1, totalRewards: 50, @@ -84,19 +82,19 @@ describe("Pack Contract", async () => { const packTwo = await packContract.create({ erc1155Rewards: [ { - contractAddress: bundleContract.getAddress(), + contractAddress: editionContract.getAddress(), tokenId: "0", quantityPerReward: 1, totalRewards: 50, }, { - contractAddress: bundleContract.getAddress(), + contractAddress: editionContract.getAddress(), tokenId: "1", quantityPerReward: 1, totalRewards: 50, }, { - contractAddress: bundleContract.getAddress(), + contractAddress: editionContract.getAddress(), tokenId: "2", quantityPerReward: 1, totalRewards: 50, diff --git a/test/recursive.test.ts b/test/recursive.test.ts index 0342a050f..b8ded176e 100644 --- a/test/recursive.test.ts +++ b/test/recursive.test.ts @@ -4,6 +4,8 @@ import { IpfsStorage, JsonObject } from "../src"; const ipfsGatewayUrl = "https://ipfs.thirdweb.com/ipfs/"; const storage = new IpfsStorage(ipfsGatewayUrl); +global.fetch = require("cross-fetch"); + describe("Recursive Testing", async () => { let json: JsonObject; beforeEach(async () => { diff --git a/test/registry.test.ts b/test/registry.test.ts index c2d811a5e..4d62be0e9 100644 --- a/test/registry.test.ts +++ b/test/registry.test.ts @@ -6,14 +6,12 @@ import { ContractRegistry } from "../src/core/classes/registry"; describe("Contract Registry", () => { let registry: ContractRegistry; - let adminWallet: SignerWithAddress, - samWallet: SignerWithAddress, - bobWallet: SignerWithAddress; + let adminWallet: SignerWithAddress; let address: string; before(async () => { - [adminWallet, samWallet, bobWallet] = signers; + [adminWallet] = signers; }); it("should allow adding and removing contracts", async () => { diff --git a/test/roles.test.ts b/test/roles.test.ts index e92ca0d6c..c91b5b2e1 100644 --- a/test/roles.test.ts +++ b/test/roles.test.ts @@ -8,7 +8,7 @@ import { AddressZero } from "@ethersproject/constants"; global.fetch = require("cross-fetch"); describe("Roles Contract", async () => { - let bundleContract: Edition; + let editionContract: Edition; let adminWallet: SignerWithAddress, samWallet: SignerWithAddress, @@ -21,7 +21,7 @@ describe("Roles Contract", async () => { beforeEach(async () => { sdk.wallet.connect(adminWallet); - bundleContract = sdk.getEdition( + editionContract = await sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { name: "NFT Contract", primary_sale_recipient: adminWallet.address, @@ -34,7 +34,7 @@ describe("Roles Contract", async () => { /** * This wallet owns only one token in the collection (that contains 6 tokens) */ - const roles = await bundleContract.roles.get("admin"); + const roles = await editionContract.roles.get("admin"); assert.include( roles, adminWallet.address, @@ -52,7 +52,7 @@ describe("Roles Contract", async () => { */ it("should override current roles in the contract", async () => { - await bundleContract.roles.setAll({ + await editionContract.roles.setAll({ admin: [adminWallet.address], minter: [ "0x553C5E856801b5876e80D32a192086b2035286C1", @@ -61,7 +61,7 @@ describe("Roles Contract", async () => { transfer: ["0x553C5E856801b5876e80D32a192086b2035286C1"], }); - const newRoles = await bundleContract.roles.getAll(); + const newRoles = await editionContract.roles.getAll(); assert.isTrue( newRoles.admin.length === 1 && newRoles.admin.includes(adminWallet.address), @@ -82,7 +82,7 @@ describe("Roles Contract", async () => { }); it("Replace all roles - confirm that all roles were replaced (not just added)", async () => { - await bundleContract.roles.setAll({ + await editionContract.roles.setAll({ admin: [ adminWallet.address, "0x553C5E856801b5876e80D32a192086b2035286C1", @@ -93,7 +93,7 @@ describe("Roles Contract", async () => { ], transfer: ["0xf16851cb58F3b3881e6bdAD21f57144E9aCf602E"], }); - const newRoles = await bundleContract.roles.getAll(); + const newRoles = await editionContract.roles.getAll(); assert.isTrue( newRoles.admin.length === 2 && newRoles.admin.includes(adminWallet.address) && @@ -115,39 +115,39 @@ describe("Roles Contract", async () => { }); it("Make collection non-transferable", async () => { - const oldRoles = await bundleContract.roles.getAll(); - await bundleContract.roles.setAll({ + const oldRoles = await editionContract.roles.getAll(); + await editionContract.roles.setAll({ admin: [...oldRoles.admin], minter: [...oldRoles.minter], transfer: [], }); - const newRoles = await bundleContract.roles.getAll(); + const newRoles = await editionContract.roles.getAll(); assert.isTrue(newRoles.admin.length === oldRoles.admin.length); assert.isTrue(newRoles.minter.length === oldRoles.minter.length); assert.isTrue(newRoles.transfer.length === 0); }); it("Make collection transferable", async () => { - const oldRoles = await bundleContract.roles.getAll(); - await bundleContract.roles.setAll({ + const oldRoles = await editionContract.roles.getAll(); + await editionContract.roles.setAll({ admin: [...oldRoles.admin], minter: [...oldRoles.minter], transfer: [AddressZero], }); - const newRoles = await bundleContract.roles.getAll(); + const newRoles = await editionContract.roles.getAll(); assert.isTrue(newRoles.admin.length === oldRoles.admin.length); assert.isTrue(newRoles.minter.length === oldRoles.minter.length); assert.isTrue(newRoles.transfer.includes(AddressZero)); }); it("Make collection non-transferable with some wallets being able to transfer", async () => { - const oldRoles = await bundleContract.roles.getAll(); - await bundleContract.roles.setAll({ + const oldRoles = await editionContract.roles.getAll(); + await editionContract.roles.setAll({ admin: [...oldRoles.admin], minter: [...oldRoles.minter], transfer: [bobWallet.address, samWallet.address], }); - const newRoles = await bundleContract.roles.getAll(); + const newRoles = await editionContract.roles.getAll(); assert.isTrue(newRoles.admin.length === oldRoles.admin.length); assert.isTrue(newRoles.minter.length === oldRoles.minter.length); assert.isTrue( diff --git a/test/royalty.test.ts b/test/royalty.test.ts index 2e6907679..3de34d591 100644 --- a/test/royalty.test.ts +++ b/test/royalty.test.ts @@ -2,25 +2,23 @@ import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { Edition } from "../src/index"; import { sdk, signers } from "./before-setup"; -import { assert, expect } from "chai"; +import { expect } from "chai"; global.fetch = require("cross-fetch"); describe("Royalties", async () => { - let bundleContract: Edition; + let editionContract: Edition; - let adminWallet: SignerWithAddress, - samWallet: SignerWithAddress, - bobWallet: SignerWithAddress; + let adminWallet: SignerWithAddress, samWallet: SignerWithAddress; before(() => { - [adminWallet, samWallet, bobWallet] = signers; + [adminWallet, samWallet] = signers; }); beforeEach(async () => { sdk.wallet.connect(adminWallet); - bundleContract = sdk.getEdition( + editionContract = await sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { name: "NFT Contract", primary_sale_recipient: adminWallet.address, @@ -29,7 +27,7 @@ describe("Royalties", async () => { }), ); - await bundleContract.mintToSelf({ + await editionContract.mintToSelf({ metadata: { name: "Cool NFT", }, @@ -38,33 +36,33 @@ describe("Royalties", async () => { }); it("should return default royalty", async () => { - const info = await bundleContract.royalties.getDefaultRoyaltyInfo(); + const info = await editionContract.royalties.getDefaultRoyaltyInfo(); expect(info.fee_recipient).to.eq(adminWallet.address); expect(info.seller_fee_basis_points).to.eq(1000); }); it("should set default royalty", async () => { - await bundleContract.royalties.setDefaultRoyaltyInfo({ + await editionContract.royalties.setDefaultRoyaltyInfo({ fee_recipient: samWallet.address, seller_fee_basis_points: 500, }); - const info = await bundleContract.royalties.getDefaultRoyaltyInfo(); + const info = await editionContract.royalties.getDefaultRoyaltyInfo(); expect(info.fee_recipient).to.eq(samWallet.address); expect(info.seller_fee_basis_points).to.eq(500); }); it("should return per token royalty", async () => { - const info = await bundleContract.royalties.getTokenRoyaltyInfo("0"); + const info = await editionContract.royalties.getTokenRoyaltyInfo("0"); expect(info.fee_recipient).to.eq(adminWallet.address); expect(info.seller_fee_basis_points).to.eq(1000); }); it("should set per token royalty", async () => { - await bundleContract.royalties.setTokenRoyaltyInfo("0", { + await editionContract.royalties.setTokenRoyaltyInfo("0", { fee_recipient: samWallet.address, seller_fee_basis_points: 500, }); - const info = await bundleContract.royalties.getTokenRoyaltyInfo("0"); + const info = await editionContract.royalties.getTokenRoyaltyInfo("0"); expect(info.fee_recipient).to.eq(samWallet.address); expect(info.seller_fee_basis_points).to.eq(500); }); diff --git a/test/sigdroptest.ts b/test/sigdroptest.ts index e6e33ffa4..06c3279b2 100644 --- a/test/sigdroptest.ts +++ b/test/sigdroptest.ts @@ -39,7 +39,7 @@ describe("Signature drop tests", async () => { beforeEach(async () => { sdk.wallet.connect(adminWallet); - signatureDropContract = sdk.getSignatureDrop( + signatureDropContract = await sdk.getSignatureDrop( await sdk.deployer.deployBuiltInContract(SignatureDrop.contractType, { name: "OUCH VOUCH", symbol: "VOUCH", @@ -58,7 +58,7 @@ describe("Signature drop tests", async () => { to: samWallet.address, }; - customTokenContract = sdk.getToken( + customTokenContract = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "Test", symbol: "TEST", diff --git a/test/signature-mint-1155.test.ts b/test/signature-mint-1155.test.ts index 50fe0c1bd..298694d6d 100644 --- a/test/signature-mint-1155.test.ts +++ b/test/signature-mint-1155.test.ts @@ -1,6 +1,6 @@ import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { assert, expect } from "chai"; -import { BigNumber, ethers } from "ethers"; +import { BigNumber } from "ethers"; import { Edition, Token } from "../src"; import { sdk, signers, storage } from "./before-setup"; import { @@ -27,7 +27,7 @@ describe("Edition sig minting", async () => { beforeEach(async () => { sdk.wallet.connect(adminWallet); - editionContract = sdk.getEdition( + editionContract = await sdk.getEdition( await sdk.deployer.deployBuiltInContract(Edition.contractType, { name: "OUCH VOUCH", symbol: "VOUCH", @@ -46,7 +46,7 @@ describe("Edition sig minting", async () => { to: samWallet.address, }; - customTokenContract = sdk.getToken( + customTokenContract = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "Test", symbol: "TEST", diff --git a/test/signature-mint-20.test.ts b/test/signature-mint-20.test.ts index ae59645bd..e7bd8c754 100644 --- a/test/signature-mint-20.test.ts +++ b/test/signature-mint-20.test.ts @@ -1,6 +1,6 @@ import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { assert, expect } from "chai"; -import { BigNumber, ethers } from "ethers"; +import { BigNumber } from "ethers"; import { PayloadToSign20, SignedPayload20, Token } from "../src"; import { sdk, signers } from "./before-setup"; import { NATIVE_TOKEN_ADDRESS } from "../src/constants/currency"; @@ -23,7 +23,7 @@ describe("Token sig minting", async () => { beforeEach(async () => { sdk.wallet.connect(adminWallet); - contract = sdk.getToken( + contract = await sdk.getToken( await sdk.deployer.deployToken({ name: "Token sigmint", symbol: "TSIG", @@ -39,7 +39,7 @@ describe("Token sig minting", async () => { primarySaleRecipient: adminWallet.address, }; - customTokenContract = sdk.getToken( + customTokenContract = await sdk.getToken( await sdk.deployer.deployToken({ name: "Test", symbol: "TEST", diff --git a/test/signature-mint-721.test.ts b/test/signature-mint-721.test.ts index bbaef6583..d564c14bd 100644 --- a/test/signature-mint-721.test.ts +++ b/test/signature-mint-721.test.ts @@ -1,6 +1,6 @@ import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { assert, expect } from "chai"; -import { BigNumber, ethers } from "ethers"; +import { BigNumber } from "ethers"; import { NFTCollection, Token } from "../src"; import { sdk, signers, storage } from "./before-setup"; import { @@ -27,7 +27,7 @@ describe("NFT sig minting", async () => { beforeEach(async () => { sdk.wallet.connect(adminWallet); - nftContract = sdk.getNFTCollection( + nftContract = await sdk.getNFTCollection( await sdk.deployer.deployBuiltInContract(NFTCollection.contractType, { name: "OUCH VOUCH", symbol: "VOUCH", @@ -47,7 +47,7 @@ describe("NFT sig minting", async () => { mintStartTime: new Date(), }; - customTokenContract = sdk.getToken( + customTokenContract = await sdk.getToken( await sdk.deployer.deployBuiltInContract(Token.contractType, { name: "Test", symbol: "TEST", diff --git a/test/split.test.ts b/test/split.test.ts index dd83a2172..173e12440 100644 --- a/test/split.test.ts +++ b/test/split.test.ts @@ -39,7 +39,7 @@ describe("Splits Contract", async () => { ], }, ); - splitsContract = sdk.getSplit(address); + splitsContract = await sdk.getSplit(address); }); it("should fetch contract balance", async () => { diff --git a/test/token-drop.test.ts b/test/token-drop.test.ts index 9a5c824bc..2cba19d09 100644 --- a/test/token-drop.test.ts +++ b/test/token-drop.test.ts @@ -39,7 +39,7 @@ describe("Token Drop Contract", async () => { platform_fee_recipient: AddressZero, }, ); - dropContract = sdk.getTokenDrop(address); + dropContract = await sdk.getTokenDrop(address); }); it("should allow a snapshot to be set", async () => { @@ -342,6 +342,7 @@ describe("Token Drop Contract", async () => { }, ]); const active = await dropContract.claimConditions.getActive(); + expect(active.maxQuantity).to.eq("10.8"); }); it("should check if its been long enough since the last claim", async () => { diff --git a/test/token.test.ts b/test/token.test.ts index f88b37eeb..cfc1622cd 100644 --- a/test/token.test.ts +++ b/test/token.test.ts @@ -31,7 +31,7 @@ describe("Token Contract", async () => { primary_sale_recipient: adminWallet.address, }, ); - currencyContract = sdk.getToken(address); + currencyContract = await sdk.getToken(address); }); it("should mint tokens", async () => { diff --git a/test/volume.test.ts b/test/volume.test.ts deleted file mode 100644 index f2a9a921c..000000000 --- a/test/volume.test.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; -import { - BundleDropContract, - NATIVE_TOKEN_ADDRESS, - ThirdwebSDK, -} from "../src/index"; -import { appContract, registryAddress, signers } from "./before-setup"; -import { ethers } from "hardhat"; -import { assert } from "chai"; - -global.fetch = require("cross-fetch"); - -describe("Bundle Contract (aka Collection Contract)", async () => { - let bundleDropContract: BundleDropContract; - - let adminWallet: SignerWithAddress; - let testSigners: SignerWithAddress[]; - - it.skip("should be able to claim using 15000 addresses", async () => { - [adminWallet] = signers; - testSigners = []; - console.time("wallet"); - for (let i = 0; i < 15000; i++) { - testSigners.push(new ethers.Wallet.createRandom()); - } - console.timeEnd("wallet"); - const token = await appContract.deployCurrencyContract({ - name: "Test Token", - symbol: "TST", - }); - - console.log("testSigners", testSigners.length); - const allowList = []; - testSigners.forEach((signer) => { - try { - allowList.push(signer.address); - } catch (e) { - console.log(signer); - } - }); - bundleDropContract = await appContract.deployBundleDropContract({ - name: "test", - description: "test", - primarySaleRecipientAddress: "0x0000000000000000000000000000000000000000", - }); - await bundleDropContract.lazyMintBatch([{ name: "test" }]); - - console.log("bundleDropContract", bundleDropContract.address); - - const factory = bundleDropContract.getClaimConditionFactory(); - const claimPhase = factory.newClaimPhase({ - startTime: new Date(), - maxQuantity: 30000, - maxQuantityPerTransaction: 1, - }); - claimPhase.setPrice(ethers.utils.parseEther("0.01"), NATIVE_TOKEN_ADDRESS); - await claimPhase.setSnapshot(allowList); - - await bundleDropContract.setClaimCondition("0", factory); - const sdk = new ThirdwebSDK(adminWallet, { - ipfsGatewayUrl: "https://ipfs.thirdweb.com/ipfs/", - registryContractAddress: registryAddress, - maxGasPriceInGwei: 10000, - }); - let error = false; - await sdk - .getBundleDropContract(bundleDropContract.address) - .claim(0, 1) - .catch((e) => { - error = true; - }); - assert.equal(error, true); - for (let i = 0; i < testSigners.length; i++) { - assert(adminWallet.address !== testSigners[i].address); - const signer = testSigners[i].connect(ethers.provider); - await adminWallet.sendTransaction({ - from: adminWallet.address, - to: signer.address, - value: ethers.utils.parseEther("0.02"), - }); - assert((await signer.getBalance()).gt(0)); - const testSdk = new ThirdwebSDK(signer, { - ipfsGatewayUrl: "https://ipfs.thirdweb.com/ipfs/", - registryContractAddress: registryAddress, - maxGasPriceInGwei: 10000, - }); - await testSdk - .getBundleDropContract(bundleDropContract.address) - .claim(0, 1); - console.log("claimed", i); - } - - console.log("claimed successfully for all"); - }); -}); diff --git a/test/vote.test.ts b/test/vote.test.ts index fa1b2f935..85970b08f 100644 --- a/test/vote.test.ts +++ b/test/vote.test.ts @@ -11,9 +11,6 @@ describe("Vote Contract", async () => { let voteContract: Vote; let currencyContract: Token; - const voteStartWaitTimeInSeconds = 0; - const voteWaitTimeInSeconds = 5; - let adminWallet: SignerWithAddress, samWallet: SignerWithAddress, bobWallet: SignerWithAddress; @@ -33,7 +30,7 @@ describe("Vote Contract", async () => { primary_sale_recipient: adminWallet.address, }, ); - currencyContract = sdk.getToken(tokenContractAddress); + currencyContract = await sdk.getToken(tokenContractAddress); const voteContractAddress = await sdk.deployer.deployBuiltInContract( Vote.contractType, { @@ -43,7 +40,7 @@ describe("Vote Contract", async () => { proposal_token_threshold: ethers.utils.parseUnits("1", 18), }, ); - voteContract = sdk.getVote(voteContractAddress); + voteContract = await sdk.getVote(voteContractAddress); // step 1: mint 1000 governance tokens to my wallet await currencyContract.mintTo(samWallet.address, "100"); @@ -111,20 +108,6 @@ describe("Vote Contract", async () => { await voteContract.execute(proposalId.toString()); }); - it.skip("", async () => { - const blockTimes = []; - const provider = ethers.getDefaultProvider(); - - const latest = await provider.getBlock("latest"); - for (let i = 0; i <= 10; i++) { - const current = await provider.getBlock(latest.number - i); - const previous = await provider.getBlock(latest.number - i - 1); - const diff = current.timestamp - previous.timestamp; - blockTimes.push(diff); - } - - const sum = blockTimes.reduce((result, a) => result + a, 0); - }); it("should permit a proposal to be passed if it receives the right votes", async () => { await sdk.wallet.connect(samWallet); diff --git a/test/wallet.test.ts b/test/wallet.test.ts index 6725db8a8..f272b4d1d 100644 --- a/test/wallet.test.ts +++ b/test/wallet.test.ts @@ -29,7 +29,7 @@ describe("Wallet", async () => { name: "My Token", primary_sale_recipient: adminWallet.address, }); - await sdk.getToken(tokenAddr).mintToSelf(100); + await (await sdk.getToken(tokenAddr)).mintToSelf(100); const oldBalance = await sdk.wallet.balance(tokenAddr); expect(oldBalance.displayValue).to.eq("100.0"); From c5cbdbbfabf320d255ec09083929ec7f71682ddf Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Mon, 27 Jun 2022 11:59:05 -0700 Subject: [PATCH 15/20] fix eslint --- src/contracts/nft-collection.ts | 7 +++++-- src/core/sdk.ts | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/contracts/nft-collection.ts b/src/contracts/nft-collection.ts index f8c7a2003..e11d86255 100644 --- a/src/contracts/nft-collection.ts +++ b/src/contracts/nft-collection.ts @@ -1,5 +1,9 @@ import { IStorage } from "../core/interfaces/IStorage"; -import type { TransactionResult, TransactionResultWithId } from "../core/types"; +import type { + ConnectionInfo, + TransactionResult, + TransactionResultWithId, +} from "../core/types"; import { Erc721BatchMintable } from "../core/classes/erc-721-batch-mintable"; import { Erc721Enumerable } from "../core/classes/erc-721-enumerable"; import { Erc721Mintable } from "../core/classes/erc-721-mintable"; @@ -23,7 +27,6 @@ import { BigNumber, BigNumberish, constants } from "ethers"; import { NFTMetadataOrUri, NFTMetadataOwner } from "../schema"; import { QueryAllParams } from "../types"; import { GasCostEstimator } from "../core/classes/gas-cost-estimator"; -import { ConnectionInfo } from "../core/types"; /** * Create a collection of one-of-one NFTs. diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 20b89ca30..51378e3e7 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -19,12 +19,12 @@ import { SDKOptions } from "../schema/sdk-options"; import { IpfsStorage } from "./classes/ipfs-storage"; import { RPCConnectionHandler } from "./classes/rpc-connection-handler"; import type { + ChainAndAddress, ConnectionInfo, ContractForContractType, ContractType, ValidContractInstance, } from "./types"; -import { ChainAndAddress } from "./types"; import { IThirdwebContract__factory } from "contracts"; import { ContractDeployer } from "./classes/contract-deployer"; import { SmartContract } from "../contracts/smart-contract"; From 4e6186a902bc027f58633bcf6873429f867957ac Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Mon, 27 Jun 2022 11:59:58 -0700 Subject: [PATCH 16/20] v3.0.0-0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0edaaff5b..a1048c64e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thirdweb-dev/sdk", - "version": "2.3.20", + "version": "3.0.0-0", "description": "The main thirdweb SDK.", "repository": { "type": "git", From 3f6fc202712c0fc915d3f846450743a8da1e33f5 Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Mon, 27 Jun 2022 21:07:52 -0700 Subject: [PATCH 17/20] expose get chain id --- docs/sdk.erc1155.getchainid.md | 15 +++++++++++++++ docs/sdk.erc1155.md | 1 + docs/sdk.erc20.getaddress.md | 15 +++++++++++++++ docs/sdk.erc20.getchainid.md | 15 +++++++++++++++ docs/sdk.erc20.md | 2 ++ docs/sdk.erc721.getchainid.md | 15 +++++++++++++++ docs/sdk.erc721.md | 1 + docs/sdk.marketplace.getchainid.md | 15 +++++++++++++++ docs/sdk.marketplace.md | 1 + docs/sdk.smartcontract.getchainid.md | 18 ++++++++++++++++++ docs/sdk.smartcontract.md | 1 + docs/sdk.split.getchainid.md | 15 +++++++++++++++ docs/sdk.split.md | 1 + docs/sdk.vote.getchainid.md | 15 +++++++++++++++ docs/sdk.vote.md | 1 + etc/sdk.api.md | 16 +++++++++++++++- src/contracts/marketplace.ts | 4 ++++ src/contracts/smart-contract.ts | 4 ++++ src/contracts/split.ts | 4 ++++ src/contracts/vote.ts | 4 ++++ src/core/classes/erc-1155.ts | 4 ++++ src/core/classes/erc-20.ts | 7 ++++--- src/core/classes/erc-721.ts | 4 ++++ src/core/interfaces/contract.ts | 1 + 24 files changed, 175 insertions(+), 4 deletions(-) create mode 100644 docs/sdk.erc1155.getchainid.md create mode 100644 docs/sdk.erc20.getaddress.md create mode 100644 docs/sdk.erc20.getchainid.md create mode 100644 docs/sdk.erc721.getchainid.md create mode 100644 docs/sdk.marketplace.getchainid.md create mode 100644 docs/sdk.smartcontract.getchainid.md create mode 100644 docs/sdk.split.getchainid.md create mode 100644 docs/sdk.vote.getchainid.md diff --git a/docs/sdk.erc1155.getchainid.md b/docs/sdk.erc1155.getchainid.md new file mode 100644 index 000000000..688f42c91 --- /dev/null +++ b/docs/sdk.erc1155.getchainid.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc1155](./sdk.erc1155.md) > [getChainId](./sdk.erc1155.getchainid.md) + +## Erc1155.getChainId() method + +Signature: + +```typescript +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.erc1155.md b/docs/sdk.erc1155.md index 3f3fcd4b7..8cfd2dd32 100644 --- a/docs/sdk.erc1155.md +++ b/docs/sdk.erc1155.md @@ -50,6 +50,7 @@ await contract.edition.transfer(walletAddress, tokenId, quantity); | [balanceOf(address, tokenId)](./sdk.erc1155.balanceof.md) | | Get NFT Balance | | [get(tokenId)](./sdk.erc1155.get.md) | | Get a single NFT Metadata | | [getAddress()](./sdk.erc1155.getaddress.md) | | | +| [getChainId()](./sdk.erc1155.getchainid.md) | | | | [isApproved(address, operator)](./sdk.erc1155.isapproved.md) | | Get whether this wallet has approved transfers from the given operator | | [totalSupply(tokenId)](./sdk.erc1155.totalsupply.md) | | Returns the total supply of a specific token | | [transfer(to, tokenId, amount, data)](./sdk.erc1155.transfer.md) | | Transfer a single NFT | diff --git a/docs/sdk.erc20.getaddress.md b/docs/sdk.erc20.getaddress.md new file mode 100644 index 000000000..5c3935beb --- /dev/null +++ b/docs/sdk.erc20.getaddress.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc20](./sdk.erc20.md) > [getAddress](./sdk.erc20.getaddress.md) + +## Erc20.getAddress() method + +Signature: + +```typescript +getAddress(): string; +``` +Returns: + +string + diff --git a/docs/sdk.erc20.getchainid.md b/docs/sdk.erc20.getchainid.md new file mode 100644 index 000000000..ab54eec6f --- /dev/null +++ b/docs/sdk.erc20.getchainid.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc20](./sdk.erc20.md) > [getChainId](./sdk.erc20.getchainid.md) + +## Erc20.getChainId() method + +Signature: + +```typescript +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.erc20.md b/docs/sdk.erc20.md index 8a0128d3c..997cf1a45 100644 --- a/docs/sdk.erc20.md +++ b/docs/sdk.erc20.md @@ -49,6 +49,8 @@ await contract.token.transfer(walletAddress, amount); | [balance()](./sdk.erc20.balance.md) | | Get Token Balance for the currently connected wallet | | [balanceOf(address)](./sdk.erc20.balanceof.md) | | Get Token Balance | | [get()](./sdk.erc20.get.md) | | Get the token Metadata (name, symbol, etc...) | +| [getAddress()](./sdk.erc20.getaddress.md) | | | +| [getChainId()](./sdk.erc20.getchainid.md) | | | | [setAllowance(spender, amount)](./sdk.erc20.setallowance.md) | | Allows the specified spender wallet to transfer the given amount of tokens to another wallet | | [totalSupply()](./sdk.erc20.totalsupply.md) | | The total supply for this Token | | [transfer(to, amount)](./sdk.erc20.transfer.md) | | Transfer Tokens | diff --git a/docs/sdk.erc721.getchainid.md b/docs/sdk.erc721.getchainid.md new file mode 100644 index 000000000..f6fc488b7 --- /dev/null +++ b/docs/sdk.erc721.getchainid.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Erc721](./sdk.erc721.md) > [getChainId](./sdk.erc721.getchainid.md) + +## Erc721.getChainId() method + +Signature: + +```typescript +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.erc721.md b/docs/sdk.erc721.md index 8cad8b7ea..6c00378ee 100644 --- a/docs/sdk.erc721.md +++ b/docs/sdk.erc721.md @@ -50,6 +50,7 @@ await contract.nft.transfer(walletAddress, tokenId); | [balanceOf(address)](./sdk.erc721.balanceof.md) | | Get NFT Balance | | [get(tokenId)](./sdk.erc721.get.md) | | Get a single NFT Metadata | | [getAddress()](./sdk.erc721.getaddress.md) | | | +| [getChainId()](./sdk.erc721.getchainid.md) | | | | [isApproved(address, operator)](./sdk.erc721.isapproved.md) | | Get whether this wallet has approved transfers from the given operator | | [ownerOf(tokenId)](./sdk.erc721.ownerof.md) | | Get the current owner of a given NFT within this Contract | | [transfer(to, tokenId)](./sdk.erc721.transfer.md) | | Transfer a single NFT | diff --git a/docs/sdk.marketplace.getchainid.md b/docs/sdk.marketplace.getchainid.md new file mode 100644 index 000000000..038b9a2ac --- /dev/null +++ b/docs/sdk.marketplace.getchainid.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Marketplace](./sdk.marketplace.md) > [getChainId](./sdk.marketplace.getchainid.md) + +## Marketplace.getChainId() method + +Signature: + +```typescript +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.marketplace.md b/docs/sdk.marketplace.md index 85052da94..956032958 100644 --- a/docs/sdk.marketplace.md +++ b/docs/sdk.marketplace.md @@ -56,6 +56,7 @@ const contract = sdk.getMarketplace("{{contract_address}}"); | [getAddress()](./sdk.marketplace.getaddress.md) | | | | [getAllListings(filter)](./sdk.marketplace.getalllistings.md) | | Get all the listings | | [getBidBufferBps()](./sdk.marketplace.getbidbufferbps.md) | | Get the buffer in basis points between offers | +| [getChainId()](./sdk.marketplace.getchainid.md) | | | | [getListing(listingId)](./sdk.marketplace.getlisting.md) | | Convenience function to get either a direct or auction listing | | [getTimeBufferInSeconds()](./sdk.marketplace.gettimebufferinseconds.md) | | get the buffer time in seconds between offers | | [getTotalCount()](./sdk.marketplace.gettotalcount.md) | | Get the total number of Listings | diff --git a/docs/sdk.smartcontract.getchainid.md b/docs/sdk.smartcontract.getchainid.md new file mode 100644 index 000000000..387ca9a8c --- /dev/null +++ b/docs/sdk.smartcontract.getchainid.md @@ -0,0 +1,18 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [SmartContract](./sdk.smartcontract.md) > [getChainId](./sdk.smartcontract.getchainid.md) + +## SmartContract.getChainId() method + +> 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 +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.smartcontract.md b/docs/sdk.smartcontract.md index acb642b32..6533f9ed5 100644 --- a/docs/sdk.smartcontract.md +++ b/docs/sdk.smartcontract.md @@ -68,5 +68,6 @@ const tx = await contract.nft.mint.to("0x...", { | --- | --- | --- | | [call(functionName, args)](./sdk.smartcontract.call.md) | | (BETA) Call any function on this contract | | [getAddress()](./sdk.smartcontract.getaddress.md) | | (BETA) | +| [getChainId()](./sdk.smartcontract.getchainid.md) | | (BETA) | | [onSignerUpdated(signer)](./sdk.smartcontract.onsignerupdated.md) | | (BETA) | diff --git a/docs/sdk.split.getchainid.md b/docs/sdk.split.getchainid.md new file mode 100644 index 000000000..ba789c2ec --- /dev/null +++ b/docs/sdk.split.getchainid.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Split](./sdk.split.md) > [getChainId](./sdk.split.getchainid.md) + +## Split.getChainId() method + +Signature: + +```typescript +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.split.md b/docs/sdk.split.md index 48f6551ef..b4f98d7b3 100644 --- a/docs/sdk.split.md +++ b/docs/sdk.split.md @@ -52,6 +52,7 @@ const contract = sdk.getSplit("{{contract_address}}"); | [distributeToken(tokenAddress)](./sdk.split.distributetoken.md) | | Distribute Funds | | [getAddress()](./sdk.split.getaddress.md) | | | | [getAllRecipients()](./sdk.split.getallrecipients.md) | | Get Recipients of this splits contract | +| [getChainId()](./sdk.split.getchainid.md) | | | | [getRecipientSplitPercentage(address)](./sdk.split.getrecipientsplitpercentage.md) | | Get the % of funds owed to a given address | | [onSignerUpdated(signer)](./sdk.split.onsignerupdated.md) | | | | [withdraw(walletAddress)](./sdk.split.withdraw.md) | | Withdraw Funds | diff --git a/docs/sdk.vote.getchainid.md b/docs/sdk.vote.getchainid.md new file mode 100644 index 000000000..2fb5b8bab --- /dev/null +++ b/docs/sdk.vote.getchainid.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [@thirdweb-dev/sdk](./sdk.md) > [Vote](./sdk.vote.md) > [getChainId](./sdk.vote.getchainid.md) + +## Vote.getChainId() method + +Signature: + +```typescript +getChainId(): number; +``` +Returns: + +number + diff --git a/docs/sdk.vote.md b/docs/sdk.vote.md index b5b9730e3..8d99a2dc6 100644 --- a/docs/sdk.vote.md +++ b/docs/sdk.vote.md @@ -51,6 +51,7 @@ const contract = sdk.getVote("{{contract_address}}"); | [get(proposalId)](./sdk.vote.get.md) | | Get a proposal by id. | | [getAddress()](./sdk.vote.getaddress.md) | | | | [getAll()](./sdk.vote.getall.md) | | Get All Proposals | +| [getChainId()](./sdk.vote.getchainid.md) | | | | [getProposalVotes(proposalId)](./sdk.vote.getproposalvotes.md) | | Get the votes for a specific proposal | | [hasVoted(proposalId, account)](./sdk.vote.hasvoted.md) | | Check If Wallet Voted | | [onSignerUpdated(signer)](./sdk.vote.onsignerupdated.md) | | | diff --git a/etc/sdk.api.md b/etc/sdk.api.md index 9f167081b..822bcaa6e 100644 --- a/etc/sdk.api.md +++ b/etc/sdk.api.md @@ -1595,6 +1595,8 @@ export class Erc1155; // (undocumented) getAddress(): string; + // (undocumented) + getChainId(): number; // @internal (undocumented) getTokenMetadata(tokenId: BigNumberish): Promise; isApproved(address: string, operator: string): Promise; @@ -1678,8 +1680,10 @@ export class Erc20 imp // (undocumented) featureName: "ERC20"; get(): Promise; - // @internal (undocumented) + // (undocumented) getAddress(): string; + // (undocumented) + getChainId(): number; // @internal (undocumented) protected getValue(value: BigNumberish): Promise; mint: Erc20Mintable | undefined; @@ -1748,6 +1752,8 @@ export class Erc721; // (undocumented) getAddress(): string; + // (undocumented) + getChainId(): number; // @internal (undocumented) getTokenMetadata(tokenId: BigNumberish): Promise; isApproved(address: string, operator: string): Promise; @@ -2222,6 +2228,8 @@ export class Marketplace implements UpdateableNetwork { getAll: (filter?: MarketplaceFilter) => Promise<(AuctionListing | DirectListing)[]>; getAllListings(filter?: MarketplaceFilter): Promise<(AuctionListing | DirectListing)[]>; getBidBufferBps(): Promise; + // (undocumented) + getChainId(): number; getListing(listingId: BigNumberish): Promise; getTimeBufferInSeconds(): Promise; getTotalCount(): Promise; @@ -4520,6 +4528,8 @@ export class SmartContract; // (undocumented) metadata: ContractMetadata; @@ -4826,6 +4836,8 @@ export class Split implements UpdateableNetwork { // (undocumented) getAddress(): string; getAllRecipients(): Promise; + // (undocumented) + getChainId(): number; getRecipientSplitPercentage(address: string): Promise; // @internal (undocumented) interceptor: ContractInterceptor; @@ -5541,6 +5553,8 @@ export class Vote implements UpdateableNetwork { // (undocumented) getAddress(): string; getAll(): Promise; + // (undocumented) + getChainId(): number; getProposalVotes(proposalId: BigNumber): Promise; hasVoted(proposalId: string, account?: string): Promise; // @internal (undocumented) diff --git a/src/contracts/marketplace.ts b/src/contracts/marketplace.ts index b1088624c..ad4df8194 100644 --- a/src/contracts/marketplace.ts +++ b/src/contracts/marketplace.ts @@ -176,6 +176,10 @@ export class Marketplace implements UpdateableNetwork { return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** ****************************** * READ FUNCTIONS *******************************/ diff --git a/src/contracts/smart-contract.ts b/src/contracts/smart-contract.ts index 9430b6f48..1628c06ba 100644 --- a/src/contracts/smart-contract.ts +++ b/src/contracts/smart-contract.ts @@ -147,6 +147,10 @@ export class SmartContract< return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** * Call any function on this contract * @example diff --git a/src/contracts/split.ts b/src/contracts/split.ts index 0d4727aef..d70cf3911 100644 --- a/src/contracts/split.ts +++ b/src/contracts/split.ts @@ -83,6 +83,10 @@ export class Split implements UpdateableNetwork { return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** ****************************** * READ FUNCTIONS *******************************/ diff --git a/src/contracts/vote.ts b/src/contracts/vote.ts index d0d637562..34b87bfcc 100644 --- a/src/contracts/vote.ts +++ b/src/contracts/vote.ts @@ -94,6 +94,10 @@ export class Vote implements UpdateableNetwork { return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** ****************************** * READ FUNCTIONS *******************************/ diff --git a/src/core/classes/erc-1155.ts b/src/core/classes/erc-1155.ts index ff6cd3487..d8c166595 100644 --- a/src/core/classes/erc-1155.ts +++ b/src/core/classes/erc-1155.ts @@ -63,6 +63,10 @@ export class Erc1155< return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** ****************************** * READ FUNCTIONS *******************************/ diff --git a/src/core/classes/erc-20.ts b/src/core/classes/erc-20.ts index 0f5207a60..ab140eb05 100644 --- a/src/core/classes/erc-20.ts +++ b/src/core/classes/erc-20.ts @@ -52,13 +52,14 @@ export class Erc20 this.contractWrapper.updateSigner(signer); } - /** - * @internal - */ getAddress(): string { return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** ****************************** * READ FUNCTIONS *******************************/ diff --git a/src/core/classes/erc-721.ts b/src/core/classes/erc-721.ts index 9fdde3ddc..e4ec6989d 100644 --- a/src/core/classes/erc-721.ts +++ b/src/core/classes/erc-721.ts @@ -70,6 +70,10 @@ export class Erc721< return this.contractWrapper.readContract.address; } + getChainId(): number { + return this.contractWrapper.getConnectionInfo().chainId; + } + /** ****************************** * READ FUNCTIONS *******************************/ diff --git a/src/core/interfaces/contract.ts b/src/core/interfaces/contract.ts index 8653621f3..097ef44e5 100644 --- a/src/core/interfaces/contract.ts +++ b/src/core/interfaces/contract.ts @@ -6,4 +6,5 @@ import { Signer } from "ethers"; export interface UpdateableNetwork { onSignerUpdated(signer: Signer | undefined): void; getAddress(): string; + getChainId(): number; } From 297118303d76d4aabda279d54db8dd3ef5c70149 Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Mon, 27 Jun 2022 22:46:20 -0700 Subject: [PATCH 18/20] forward chain param from getContract to getContractWithAbi --- src/core/sdk.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/sdk.ts b/src/core/sdk.ts index 51378e3e7..7a442c266 100644 --- a/src/core/sdk.ts +++ b/src/core/sdk.ts @@ -534,7 +534,7 @@ export class ThirdwebSDK extends RPCConnectionHandler { const metadata = await publisher.fetchContractMetadataFromAddress( address, ); - return this.getContractFromAbi(address, metadata.abi); + return this.getContractFromAbi(address, metadata.abi, chain); } catch (e) { throw new Error(`Error fetching ABI for this contract\n\n${e}`); } From 83afd62e5f0609ba9cfcadb0c23f8fc47610fd38 Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Mon, 27 Jun 2022 22:48:12 -0700 Subject: [PATCH 19/20] 3.0.0-1 check in --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a1048c64e..9e7848016 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thirdweb-dev/sdk", - "version": "3.0.0-0", + "version": "3.0.0-1", "description": "The main thirdweb SDK.", "repository": { "type": "git", From 9e78ae98e8b801ec476a976eda229a5f0512528d Mon Sep 17 00:00:00 2001 From: Jonas Daniels Date: Mon, 27 Jun 2022 22:48:31 -0700 Subject: [PATCH 20/20] v3.0.0-2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9e7848016..25b0229e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thirdweb-dev/sdk", - "version": "3.0.0-1", + "version": "3.0.0-2", "description": "The main thirdweb SDK.", "repository": { "type": "git",