thirdweb 5.50.0-nightly-5475551e5de0750ff1b780522cb01e974a828dd2-20240902000412 → 5.50.0-nightly-aa556f17b6a1de4b889e7f58cd13ca8a3cc41d71-20240903000507

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.isERC20 = isERC20;
4
- const supportsInterface_js_1 = require("../../erc165/__generated__/IERC165/read/supportsInterface.js");
4
+ const name_js_1 = require("../../common/__generated__/IContractMetadata/read/name.js");
5
+ const symbol_js_1 = require("../../common/__generated__/IContractMetadata/read/symbol.js");
6
+ const allowance_js_1 = require("../__generated__/IERC20/read/allowance.js");
7
+ const balanceOf_js_1 = require("../__generated__/IERC20/read/balanceOf.js");
8
+ const decimals_js_1 = require("../__generated__/IERC20/read/decimals.js");
9
+ const totalSupply_js_1 = require("../__generated__/IERC20/read/totalSupply.js");
10
+ const approve_js_1 = require("../__generated__/IERC20/write/approve.js");
11
+ const transfer_js_1 = require("../__generated__/IERC20/write/transfer.js");
12
+ const transferFrom_js_1 = require("../__generated__/IERC20/write/transferFrom.js");
5
13
  /**
6
- * Check if a contract supports the ERC20 interface.
14
+ * Check if a contract is an ERC20 token.
7
15
  * @param options - The transaction options.
8
- * @returns A boolean indicating whether the contract supports the ERC20 interface.
16
+ * @returns A boolean indicating whether the contract is an ERC20 token.
9
17
  * @extension ERC20
10
18
  * @example
11
19
  * ```ts
@@ -13,10 +21,20 @@ const supportsInterface_js_1 = require("../../erc165/__generated__/IERC165/read/
13
21
  * const result = await isERC20({ contract });
14
22
  * ```
15
23
  */
16
- function isERC20(options) {
17
- return (0, supportsInterface_js_1.supportsInterface)({
18
- contract: options.contract,
19
- interfaceId: "0x36372b07",
20
- });
24
+ function isERC20(availableSelectors) {
25
+ // there is no trustworthy way to check if a contract is ERC20 via ERC165, so we do this manually.
26
+ // see: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3575
27
+ // see: https://ethereum.org/en/developers/docs/standards/tokens/erc-20/
28
+ return [
29
+ (0, name_js_1.isNameSupported)(availableSelectors),
30
+ (0, symbol_js_1.isSymbolSupported)(availableSelectors),
31
+ (0, decimals_js_1.isDecimalsSupported)(availableSelectors),
32
+ (0, totalSupply_js_1.isTotalSupplySupported)(availableSelectors),
33
+ (0, balanceOf_js_1.isBalanceOfSupported)(availableSelectors),
34
+ (0, transfer_js_1.isTransferSupported)(availableSelectors),
35
+ (0, transferFrom_js_1.isTransferFromSupported)(availableSelectors),
36
+ (0, approve_js_1.isApproveSupported)(availableSelectors),
37
+ (0, allowance_js_1.isAllowanceSupported)(availableSelectors),
38
+ ].every(Boolean);
21
39
  }
22
40
  //# sourceMappingURL=isERC20.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isERC20.js","sourceRoot":"","sources":["../../../../../src/extensions/erc20/read/isERC20.ts"],"names":[],"mappings":";;AAcA,0BAKC;AAlBD,uGAAiG;AAEjG;;;;;;;;;;GAUG;AACH,SAAgB,OAAO,CAAC,OAA+B;IACrD,OAAO,IAAA,wCAAiB,EAAC;QACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,YAAY;KAC1B,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"isERC20.js","sourceRoot":"","sources":["../../../../../src/extensions/erc20/read/isERC20.ts"],"names":[],"mappings":";;AAqBA,0BAgBC;AArCD,uFAA4F;AAC5F,2FAAgG;AAChG,4EAAiF;AACjF,4EAAiF;AACjF,0EAA+E;AAC/E,gFAAqF;AACrF,yEAA8E;AAC9E,2EAAgF;AAChF,mFAAwF;AAExF;;;;;;;;;;GAUG;AACH,SAAgB,OAAO,CAAC,kBAA4B;IAClD,kGAAkG;IAClG,0EAA0E;IAC1E,wEAAwE;IAExE,OAAO;QACL,IAAA,yBAAe,EAAC,kBAAkB,CAAC;QACnC,IAAA,6BAAiB,EAAC,kBAAkB,CAAC;QACrC,IAAA,iCAAmB,EAAC,kBAAkB,CAAC;QACvC,IAAA,uCAAsB,EAAC,kBAAkB,CAAC;QAC1C,IAAA,mCAAoB,EAAC,kBAAkB,CAAC;QACxC,IAAA,iCAAmB,EAAC,kBAAkB,CAAC;QACvC,IAAA,yCAAuB,EAAC,kBAAkB,CAAC;QAC3C,IAAA,+BAAkB,EAAC,kBAAkB,CAAC;QACtC,IAAA,mCAAoB,EAAC,kBAAkB,CAAC;KACzC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
@@ -7,11 +7,40 @@ const connection_manager_js_1 = require("../../providers/connection-manager.js")
7
7
  * A hook that returns the active wallet
8
8
  * @returns The active `Wallet` or `undefined` if no active wallet is set.
9
9
  * @example
10
+ *
11
+ * ### Basic usage
10
12
  * ```jsx
11
13
  * import { useActiveWallet } from "thirdweb/react";
12
14
  *
13
15
  * const wallet = useActiveWallet();
14
16
  * ```
17
+ *
18
+ * ### Listen to account change event
19
+ * ```jsx
20
+ * const wallet = useActiveWallet();
21
+ *
22
+ * wallet?.subscribe("accountChanged", (account) => {
23
+ * console.log(account);
24
+ * });
25
+ * ```
26
+ *
27
+ * ### Listen to multiple accounts changed event
28
+ * ```jsx
29
+ * const wallet = useActiveWallet();
30
+ *
31
+ * wallet?.subscribe("accountsChanged", (addresses) => {
32
+ * console.log(addresses);
33
+ * });
34
+ * ```
35
+ *
36
+ * ### Listen to network change event
37
+ * ```jsx
38
+ * const wallet = useActiveWallet();
39
+ *
40
+ * wallet?.subscribe("chainChanged", (chain) => {
41
+ * console.log(chain);
42
+ * });
43
+ * ```
15
44
  * @walletConnection
16
45
  */
17
46
  function useActiveWallet() {
@@ -1 +1 @@
1
- {"version":3,"file":"useActiveWallet.js","sourceRoot":"","sources":["../../../../../../src/react/core/hooks/wallets/useActiveWallet.ts"],"names":[],"mappings":";;AAcA,0CAIC;AAlBD,iCAA6C;AAC7C,iFAAgF;AAEhF;;;;;;;;;;GAUG;AACH,SAAgB,eAAe;IAC7B,MAAM,OAAO,GAAG,IAAA,+CAAuB,EAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACxC,OAAO,IAAA,4BAAoB,EAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"useActiveWallet.js","sourceRoot":"","sources":["../../../../../../src/react/core/hooks/wallets/useActiveWallet.ts"],"names":[],"mappings":";;AA2CA,0CAIC;AA/CD,iCAA6C;AAC7C,iFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,SAAgB,eAAe;IAC7B,MAAM,OAAO,GAAG,IAAA,+CAAuB,EAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACxC,OAAO,IAAA,4BAAoB,EAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.version = void 0;
4
- exports.version = "5.50.0-nightly-5475551e5de0750ff1b780522cb01e974a828dd2-20240902000412";
4
+ exports.version = "5.50.0-nightly-aa556f17b6a1de4b889e7f58cd13ca8a3cc41d71-20240903000507";
5
5
  //# sourceMappingURL=version.js.map
@@ -1,8 +1,16 @@
1
- import { supportsInterface } from "../../erc165/__generated__/IERC165/read/supportsInterface.js";
1
+ import { isNameSupported } from "../../common/__generated__/IContractMetadata/read/name.js";
2
+ import { isSymbolSupported } from "../../common/__generated__/IContractMetadata/read/symbol.js";
3
+ import { isAllowanceSupported } from "../__generated__/IERC20/read/allowance.js";
4
+ import { isBalanceOfSupported } from "../__generated__/IERC20/read/balanceOf.js";
5
+ import { isDecimalsSupported } from "../__generated__/IERC20/read/decimals.js";
6
+ import { isTotalSupplySupported } from "../__generated__/IERC20/read/totalSupply.js";
7
+ import { isApproveSupported } from "../__generated__/IERC20/write/approve.js";
8
+ import { isTransferSupported } from "../__generated__/IERC20/write/transfer.js";
9
+ import { isTransferFromSupported } from "../__generated__/IERC20/write/transferFrom.js";
2
10
  /**
3
- * Check if a contract supports the ERC20 interface.
11
+ * Check if a contract is an ERC20 token.
4
12
  * @param options - The transaction options.
5
- * @returns A boolean indicating whether the contract supports the ERC20 interface.
13
+ * @returns A boolean indicating whether the contract is an ERC20 token.
6
14
  * @extension ERC20
7
15
  * @example
8
16
  * ```ts
@@ -10,10 +18,20 @@ import { supportsInterface } from "../../erc165/__generated__/IERC165/read/suppo
10
18
  * const result = await isERC20({ contract });
11
19
  * ```
12
20
  */
13
- export function isERC20(options) {
14
- return supportsInterface({
15
- contract: options.contract,
16
- interfaceId: "0x36372b07",
17
- });
21
+ export function isERC20(availableSelectors) {
22
+ // there is no trustworthy way to check if a contract is ERC20 via ERC165, so we do this manually.
23
+ // see: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3575
24
+ // see: https://ethereum.org/en/developers/docs/standards/tokens/erc-20/
25
+ return [
26
+ isNameSupported(availableSelectors),
27
+ isSymbolSupported(availableSelectors),
28
+ isDecimalsSupported(availableSelectors),
29
+ isTotalSupplySupported(availableSelectors),
30
+ isBalanceOfSupported(availableSelectors),
31
+ isTransferSupported(availableSelectors),
32
+ isTransferFromSupported(availableSelectors),
33
+ isApproveSupported(availableSelectors),
34
+ isAllowanceSupported(availableSelectors),
35
+ ].every(Boolean);
18
36
  }
19
37
  //# sourceMappingURL=isERC20.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"isERC20.js","sourceRoot":"","sources":["../../../../../src/extensions/erc20/read/isERC20.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8DAA8D,CAAC;AAEjG;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CAAC,OAA+B;IACrD,OAAO,iBAAiB,CAAC;QACvB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,WAAW,EAAE,YAAY;KAC1B,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"isERC20.js","sourceRoot":"","sources":["../../../../../src/extensions/erc20/read/isERC20.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2DAA2D,CAAC;AAC5F,OAAO,EAAE,iBAAiB,EAAE,MAAM,6DAA6D,CAAC;AAChG,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,mBAAmB,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6CAA6C,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0CAA0C,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,2CAA2C,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,OAAO,CAAC,kBAA4B;IAClD,kGAAkG;IAClG,0EAA0E;IAC1E,wEAAwE;IAExE,OAAO;QACL,eAAe,CAAC,kBAAkB,CAAC;QACnC,iBAAiB,CAAC,kBAAkB,CAAC;QACrC,mBAAmB,CAAC,kBAAkB,CAAC;QACvC,sBAAsB,CAAC,kBAAkB,CAAC;QAC1C,oBAAoB,CAAC,kBAAkB,CAAC;QACxC,mBAAmB,CAAC,kBAAkB,CAAC;QACvC,uBAAuB,CAAC,kBAAkB,CAAC;QAC3C,kBAAkB,CAAC,kBAAkB,CAAC;QACtC,oBAAoB,CAAC,kBAAkB,CAAC;KACzC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;AACnB,CAAC"}
@@ -4,11 +4,40 @@ import { useConnectionManagerCtx } from "../../providers/connection-manager.js";
4
4
  * A hook that returns the active wallet
5
5
  * @returns The active `Wallet` or `undefined` if no active wallet is set.
6
6
  * @example
7
+ *
8
+ * ### Basic usage
7
9
  * ```jsx
8
10
  * import { useActiveWallet } from "thirdweb/react";
9
11
  *
10
12
  * const wallet = useActiveWallet();
11
13
  * ```
14
+ *
15
+ * ### Listen to account change event
16
+ * ```jsx
17
+ * const wallet = useActiveWallet();
18
+ *
19
+ * wallet?.subscribe("accountChanged", (account) => {
20
+ * console.log(account);
21
+ * });
22
+ * ```
23
+ *
24
+ * ### Listen to multiple accounts changed event
25
+ * ```jsx
26
+ * const wallet = useActiveWallet();
27
+ *
28
+ * wallet?.subscribe("accountsChanged", (addresses) => {
29
+ * console.log(addresses);
30
+ * });
31
+ * ```
32
+ *
33
+ * ### Listen to network change event
34
+ * ```jsx
35
+ * const wallet = useActiveWallet();
36
+ *
37
+ * wallet?.subscribe("chainChanged", (chain) => {
38
+ * console.log(chain);
39
+ * });
40
+ * ```
12
41
  * @walletConnection
13
42
  */
14
43
  export function useActiveWallet() {
@@ -1 +1 @@
1
- {"version":3,"file":"useActiveWallet.js","sourceRoot":"","sources":["../../../../../../src/react/core/hooks/wallets/useActiveWallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAEhF;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACxC,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC"}
1
+ {"version":3,"file":"useActiveWallet.js","sourceRoot":"","sources":["../../../../../../src/react/core/hooks/wallets/useActiveWallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAC7C,OAAO,EAAE,uBAAuB,EAAE,MAAM,uCAAuC,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,UAAU,eAAe;IAC7B,MAAM,OAAO,GAAG,uBAAuB,CAAC,iBAAiB,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,OAAO,CAAC,iBAAiB,CAAC;IACxC,OAAO,oBAAoB,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;AAC/E,CAAC"}
@@ -1,2 +1,2 @@
1
- export const version = "5.50.0-nightly-5475551e5de0750ff1b780522cb01e974a828dd2-20240902000412";
1
+ export const version = "5.50.0-nightly-aa556f17b6a1de4b889e7f58cd13ca8a3cc41d71-20240903000507";
2
2
  //# sourceMappingURL=version.js.map
@@ -1,8 +1,7 @@
1
- import type { BaseTransactionOptions } from "../../../transaction/types.js";
2
1
  /**
3
- * Check if a contract supports the ERC20 interface.
2
+ * Check if a contract is an ERC20 token.
4
3
  * @param options - The transaction options.
5
- * @returns A boolean indicating whether the contract supports the ERC20 interface.
4
+ * @returns A boolean indicating whether the contract is an ERC20 token.
6
5
  * @extension ERC20
7
6
  * @example
8
7
  * ```ts
@@ -10,5 +9,5 @@ import type { BaseTransactionOptions } from "../../../transaction/types.js";
10
9
  * const result = await isERC20({ contract });
11
10
  * ```
12
11
  */
13
- export declare function isERC20(options: BaseTransactionOptions): Promise<boolean>;
12
+ export declare function isERC20(availableSelectors: string[]): boolean;
14
13
  //# sourceMappingURL=isERC20.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"isERC20.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/erc20/read/isERC20.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAG5E;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,sBAAsB,oBAKtD"}
1
+ {"version":3,"file":"isERC20.d.ts","sourceRoot":"","sources":["../../../../../src/extensions/erc20/read/isERC20.ts"],"names":[],"mappings":"AAUA;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,kBAAkB,EAAE,MAAM,EAAE,WAgBnD"}
@@ -2,11 +2,40 @@
2
2
  * A hook that returns the active wallet
3
3
  * @returns The active `Wallet` or `undefined` if no active wallet is set.
4
4
  * @example
5
+ *
6
+ * ### Basic usage
5
7
  * ```jsx
6
8
  * import { useActiveWallet } from "thirdweb/react";
7
9
  *
8
10
  * const wallet = useActiveWallet();
9
11
  * ```
12
+ *
13
+ * ### Listen to account change event
14
+ * ```jsx
15
+ * const wallet = useActiveWallet();
16
+ *
17
+ * wallet?.subscribe("accountChanged", (account) => {
18
+ * console.log(account);
19
+ * });
20
+ * ```
21
+ *
22
+ * ### Listen to multiple accounts changed event
23
+ * ```jsx
24
+ * const wallet = useActiveWallet();
25
+ *
26
+ * wallet?.subscribe("accountsChanged", (addresses) => {
27
+ * console.log(addresses);
28
+ * });
29
+ * ```
30
+ *
31
+ * ### Listen to network change event
32
+ * ```jsx
33
+ * const wallet = useActiveWallet();
34
+ *
35
+ * wallet?.subscribe("chainChanged", (chain) => {
36
+ * console.log(chain);
37
+ * });
38
+ * ```
10
39
  * @walletConnection
11
40
  */
12
41
  export declare function useActiveWallet(): import("../../../../exports/wallets.js").Wallet | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"useActiveWallet.d.ts","sourceRoot":"","sources":["../../../../../../src/react/core/hooks/wallets/useActiveWallet.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,gEAI9B"}
1
+ {"version":3,"file":"useActiveWallet.d.ts","sourceRoot":"","sources":["../../../../../../src/react/core/hooks/wallets/useActiveWallet.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,eAAe,gEAI9B"}
@@ -1,2 +1,2 @@
1
- export declare const version = "5.50.0-nightly-5475551e5de0750ff1b780522cb01e974a828dd2-20240902000412";
1
+ export declare const version = "5.50.0-nightly-aa556f17b6a1de4b889e7f58cd13ca8a3cc41d71-20240903000507";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "thirdweb",
3
- "version": "5.50.0-nightly-5475551e5de0750ff1b780522cb01e974a828dd2-20240902000412",
3
+ "version": "5.50.0-nightly-aa556f17b6a1de4b889e7f58cd13ca8a3cc41d71-20240903000507",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/thirdweb-dev/js.git#main"
@@ -204,7 +204,7 @@
204
204
  "mipd": "0.0.7",
205
205
  "node-libs-browser": "2.2.1",
206
206
  "uqr": "0.1.2",
207
- "viem": "2.19.3"
207
+ "viem": "2.21.1"
208
208
  },
209
209
  "peerDependencies": {
210
210
  "@aws-sdk/client-lambda": "^3",
@@ -0,0 +1,62 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { ANVIL_CHAIN } from "~test/chains.js";
3
+ import { TEST_CONTRACT_URI } from "~test/ipfs-uris.js";
4
+ import { TEST_CLIENT } from "~test/test-clients.js";
5
+ import { TEST_ACCOUNT_A } from "~test/test-wallets.js";
6
+ import { getContract } from "../../../contract/contract.js";
7
+ import { sendAndConfirmTransaction } from "../../../transaction/actions/send-and-confirm-transaction.js";
8
+ import { deployERC1155Contract } from "../../prebuilts/deploy-erc1155.js";
9
+ import { mintTo } from "../write/mintTo.js";
10
+ import { getOwnedNFTs } from "./getOwnedNFTs.js";
11
+
12
+ const account = TEST_ACCOUNT_A;
13
+ const client = TEST_CLIENT;
14
+ const chain = ANVIL_CHAIN;
15
+
16
+ describe.runIf(process.env.TW_SECRET_KEY)("ERC1155 getOwnedTokenIds", () => {
17
+ it("should fetch owned tokenIds", async () => {
18
+ const address = await deployERC1155Contract({
19
+ type: "TokenERC1155",
20
+ chain,
21
+ client,
22
+ account,
23
+ params: {
24
+ name: "edition",
25
+ contractURI: TEST_CONTRACT_URI,
26
+ },
27
+ });
28
+
29
+ const contract = getContract({
30
+ address,
31
+ chain,
32
+ client,
33
+ });
34
+
35
+ const transaction = mintTo({
36
+ contract,
37
+ nft: { name: "token 0" },
38
+ to: account.address,
39
+ supply: 20n,
40
+ });
41
+ await sendAndConfirmTransaction({ transaction, account });
42
+
43
+ const ownedTokenIds = await getOwnedNFTs({
44
+ contract,
45
+ address: account.address,
46
+ });
47
+
48
+ expect(ownedTokenIds).toStrictEqual([
49
+ {
50
+ id: 0n,
51
+ metadata: {
52
+ name: "token 0",
53
+ },
54
+ owner: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
55
+ quantityOwned: 20n,
56
+ supply: 20n,
57
+ tokenURI: "ipfs://QmPZ6LpGqMuFbHKTXrNW1NRNLHf1nrxS4dtoFqdZZTKvPX/0",
58
+ type: "ERC1155",
59
+ },
60
+ ]);
61
+ });
62
+ });
@@ -1,10 +1,17 @@
1
- import type { BaseTransactionOptions } from "../../../transaction/types.js";
2
- import { supportsInterface } from "../../erc165/__generated__/IERC165/read/supportsInterface.js";
1
+ import { isNameSupported } from "../../common/__generated__/IContractMetadata/read/name.js";
2
+ import { isSymbolSupported } from "../../common/__generated__/IContractMetadata/read/symbol.js";
3
+ import { isAllowanceSupported } from "../__generated__/IERC20/read/allowance.js";
4
+ import { isBalanceOfSupported } from "../__generated__/IERC20/read/balanceOf.js";
5
+ import { isDecimalsSupported } from "../__generated__/IERC20/read/decimals.js";
6
+ import { isTotalSupplySupported } from "../__generated__/IERC20/read/totalSupply.js";
7
+ import { isApproveSupported } from "../__generated__/IERC20/write/approve.js";
8
+ import { isTransferSupported } from "../__generated__/IERC20/write/transfer.js";
9
+ import { isTransferFromSupported } from "../__generated__/IERC20/write/transferFrom.js";
3
10
 
4
11
  /**
5
- * Check if a contract supports the ERC20 interface.
12
+ * Check if a contract is an ERC20 token.
6
13
  * @param options - The transaction options.
7
- * @returns A boolean indicating whether the contract supports the ERC20 interface.
14
+ * @returns A boolean indicating whether the contract is an ERC20 token.
8
15
  * @extension ERC20
9
16
  * @example
10
17
  * ```ts
@@ -12,9 +19,20 @@ import { supportsInterface } from "../../erc165/__generated__/IERC165/read/suppo
12
19
  * const result = await isERC20({ contract });
13
20
  * ```
14
21
  */
15
- export function isERC20(options: BaseTransactionOptions) {
16
- return supportsInterface({
17
- contract: options.contract,
18
- interfaceId: "0x36372b07",
19
- });
22
+ export function isERC20(availableSelectors: string[]) {
23
+ // there is no trustworthy way to check if a contract is ERC20 via ERC165, so we do this manually.
24
+ // see: https://github.com/OpenZeppelin/openzeppelin-contracts/issues/3575
25
+ // see: https://ethereum.org/en/developers/docs/standards/tokens/erc-20/
26
+
27
+ return [
28
+ isNameSupported(availableSelectors),
29
+ isSymbolSupported(availableSelectors),
30
+ isDecimalsSupported(availableSelectors),
31
+ isTotalSupplySupported(availableSelectors),
32
+ isBalanceOfSupported(availableSelectors),
33
+ isTransferSupported(availableSelectors),
34
+ isTransferFromSupported(availableSelectors),
35
+ isApproveSupported(availableSelectors),
36
+ isAllowanceSupported(availableSelectors),
37
+ ].every(Boolean);
20
38
  }
@@ -5,11 +5,40 @@ import { useConnectionManagerCtx } from "../../providers/connection-manager.js";
5
5
  * A hook that returns the active wallet
6
6
  * @returns The active `Wallet` or `undefined` if no active wallet is set.
7
7
  * @example
8
+ *
9
+ * ### Basic usage
8
10
  * ```jsx
9
11
  * import { useActiveWallet } from "thirdweb/react";
10
12
  *
11
13
  * const wallet = useActiveWallet();
12
14
  * ```
15
+ *
16
+ * ### Listen to account change event
17
+ * ```jsx
18
+ * const wallet = useActiveWallet();
19
+ *
20
+ * wallet?.subscribe("accountChanged", (account) => {
21
+ * console.log(account);
22
+ * });
23
+ * ```
24
+ *
25
+ * ### Listen to multiple accounts changed event
26
+ * ```jsx
27
+ * const wallet = useActiveWallet();
28
+ *
29
+ * wallet?.subscribe("accountsChanged", (addresses) => {
30
+ * console.log(addresses);
31
+ * });
32
+ * ```
33
+ *
34
+ * ### Listen to network change event
35
+ * ```jsx
36
+ * const wallet = useActiveWallet();
37
+ *
38
+ * wallet?.subscribe("chainChanged", (chain) => {
39
+ * console.log(chain);
40
+ * });
41
+ * ```
13
42
  * @walletConnection
14
43
  */
15
44
  export function useActiveWallet() {
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const version = "5.50.0-nightly-5475551e5de0750ff1b780522cb01e974a828dd2-20240902000412";
1
+ export const version = "5.50.0-nightly-aa556f17b6a1de4b889e7f58cd13ca8a3cc41d71-20240903000507";