thirdweb 5.54.0 → 5.55.0-nightly-8035923cdad943a47fc909e04522c351d06804f0-20240913000407
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.
- package/dist/cjs/exports/extensions/common.js +3 -1
- package/dist/cjs/exports/extensions/common.js.map +1 -1
- package/dist/cjs/exports/extensions/ens.js +3 -1
- package/dist/cjs/exports/extensions/ens.js.map +1 -1
- package/dist/cjs/utils/ens/avatar.js +25 -59
- package/dist/cjs/utils/ens/avatar.js.map +1 -1
- package/dist/cjs/utils/nft/parseNft.js +76 -0
- package/dist/cjs/utils/nft/parseNft.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/version.js.map +1 -1
- package/dist/esm/exports/extensions/common.js +1 -0
- package/dist/esm/exports/extensions/common.js.map +1 -1
- package/dist/esm/exports/extensions/ens.js +1 -0
- package/dist/esm/exports/extensions/ens.js.map +1 -1
- package/dist/esm/utils/ens/avatar.js +24 -58
- package/dist/esm/utils/ens/avatar.js.map +1 -1
- package/dist/esm/utils/nft/parseNft.js +75 -0
- package/dist/esm/utils/nft/parseNft.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/version.js.map +1 -1
- package/dist/types/exports/extensions/common.d.ts +1 -0
- package/dist/types/exports/extensions/common.d.ts.map +1 -1
- package/dist/types/exports/extensions/ens.d.ts +1 -0
- package/dist/types/exports/extensions/ens.d.ts.map +1 -1
- package/dist/types/utils/ens/avatar.d.ts +25 -4
- package/dist/types/utils/ens/avatar.d.ts.map +1 -1
- package/dist/types/utils/nft/parseNft.d.ts +26 -0
- package/dist/types/utils/nft/parseNft.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/version.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/exports/extensions/common.ts +1 -0
- package/src/exports/extensions/ens.ts +5 -0
- package/src/utils/bytecode/resolveImplementation.test.ts +1 -1
- package/src/utils/ens/avatar.ts +27 -71
- package/src/utils/nft/parseNft.ts +89 -0
- package/src/version.ts +1 -1
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.isSetPrimarySaleRecipientSupported = exports.setPrimarySaleRecipient = exports.isPrimarySaleRecipientSupported = exports.primarySaleRecipient = exports.isSetPlatformFeeInfoSupported = exports.setPlatformFeeInfo = exports.isGetPlatformFeeInfoSupported = exports.getPlatformFeeInfo = exports.isSetRoyaltyInfoForTokenSupported = exports.setRoyaltyInfoForToken = exports.isSetDefaultRoyaltyInfoSupported = exports.setDefaultRoyaltyInfo = exports.isGetRoyaltyInfoForTokenSupported = exports.getRoyaltyInfoForToken = exports.isGetDefaultRoyaltyInfoSupported = exports.getDefaultRoyaltyInfo = exports.ownerUpdatedEvent = exports.isMulticallSupported = exports.multicall = exports.isSetContractMetadataSupported = exports.setContractMetadata = exports.setOwner = exports.isSetContractURISupported = exports.setContractURI = exports.isSymbolSupported = exports.symbol = exports.isNameSupported = exports.name = exports.isOwnerSupported = exports.owner = exports.isGetContractMetadataSupported = exports.getContractMetadata = exports.contractURI = void 0;
|
3
|
+
exports.isSetPrimarySaleRecipientSupported = exports.setPrimarySaleRecipient = exports.isPrimarySaleRecipientSupported = exports.primarySaleRecipient = exports.isSetPlatformFeeInfoSupported = exports.setPlatformFeeInfo = exports.isGetPlatformFeeInfoSupported = exports.getPlatformFeeInfo = exports.isSetRoyaltyInfoForTokenSupported = exports.setRoyaltyInfoForToken = exports.isSetDefaultRoyaltyInfoSupported = exports.setDefaultRoyaltyInfo = exports.isGetRoyaltyInfoForTokenSupported = exports.getRoyaltyInfoForToken = exports.isGetDefaultRoyaltyInfoSupported = exports.getDefaultRoyaltyInfo = exports.ownerUpdatedEvent = exports.isMulticallSupported = exports.multicall = exports.isSetContractMetadataSupported = exports.setContractMetadata = exports.setOwner = exports.isSetContractURISupported = exports.setContractURI = exports.parseNftUri = exports.isSymbolSupported = exports.symbol = exports.isNameSupported = exports.name = exports.isOwnerSupported = exports.owner = exports.isGetContractMetadataSupported = exports.getContractMetadata = exports.contractURI = void 0;
|
4
4
|
// read
|
5
5
|
var contractURI_js_1 = require("../../extensions/common/__generated__/IContractMetadata/read/contractURI.js");
|
6
6
|
Object.defineProperty(exports, "contractURI", { enumerable: true, get: function () { return contractURI_js_1.contractURI; } });
|
@@ -16,6 +16,8 @@ Object.defineProperty(exports, "isNameSupported", { enumerable: true, get: funct
|
|
16
16
|
var symbol_js_1 = require("../../extensions/common/read/symbol.js");
|
17
17
|
Object.defineProperty(exports, "symbol", { enumerable: true, get: function () { return symbol_js_1.symbol; } });
|
18
18
|
Object.defineProperty(exports, "isSymbolSupported", { enumerable: true, get: function () { return symbol_js_1.isSymbolSupported; } });
|
19
|
+
var parseNft_js_1 = require("../../utils/nft/parseNft.js");
|
20
|
+
Object.defineProperty(exports, "parseNftUri", { enumerable: true, get: function () { return parseNft_js_1.parseNftUri; } });
|
19
21
|
// write
|
20
22
|
var setContractURI_js_1 = require("../../extensions/common/__generated__/IContractMetadata/write/setContractURI.js");
|
21
23
|
Object.defineProperty(exports, "setContractURI", { enumerable: true, get: function () { return setContractURI_js_1.setContractURI; } });
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/exports/extensions/common.ts"],"names":[],"mappings":";;;AAAA,OAAO;AACP,8GAA0G;AAAjG,6GAAA,WAAW,OAAA;AACpB,8FAG6D;AAF3D,6HAAA,mBAAmB,OAAA;AACnB,wIAAA,8BAA8B,OAAA;AAEhC,yFAGsE;AAFpE,iGAAA,KAAK,OAAA;AACL,4GAAA,gBAAgB,OAAA;AAElB,gEAA6E;AAApE,+FAAA,IAAI,OAAA;AAAE,0GAAA,eAAe,OAAA;AAC9B,oEAGgD;AAF9C,mGAAA,MAAM,OAAA;AACN,8GAAA,iBAAiB,OAAA;
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/exports/extensions/common.ts"],"names":[],"mappings":";;;AAAA,OAAO;AACP,8GAA0G;AAAjG,6GAAA,WAAW,OAAA;AACpB,8FAG6D;AAF3D,6HAAA,mBAAmB,OAAA;AACnB,wIAAA,8BAA8B,OAAA;AAEhC,yFAGsE;AAFpE,iGAAA,KAAK,OAAA;AACL,4GAAA,gBAAgB,OAAA;AAElB,gEAA6E;AAApE,+FAAA,IAAI,OAAA;AAAE,0GAAA,eAAe,OAAA;AAC9B,oEAGgD;AAF9C,mGAAA,MAAM,OAAA;AACN,8GAAA,iBAAiB,OAAA;AAEnB,2DAA0D;AAAjD,0GAAA,WAAW,OAAA;AAEpB,QAAQ;AACR,qHAIyF;AAHvF,mHAAA,cAAc,OAAA;AAEd,8HAAA,yBAAyB,OAAA;AAG3B,gGAG0E;AAFxE,uGAAA,QAAQ,OAAA;AAIV,+FAI8D;AAH5D,6HAAA,mBAAmB,OAAA;AAEnB,wIAAA,8BAA8B,OAAA;AAGhC,oGAI6E;AAH3E,yGAAA,SAAS,OAAA;AAET,oHAAA,oBAAoB,OAAA;AAGtB,SAAS;AAET,yGAG+E;AAF7E,oHAAA,iBAAiB,OAAA;AAInB,2DAA2D;AAC3D,UAAU;AACV,2DAA2D;AAC3D,OAAO;AACP,yHAGsF;AAFpF,iIAAA,qBAAqB,OAAA;AACrB,4IAAA,gCAAgC,OAAA;AAElC,2HAIuF;AAHrF,mIAAA,sBAAsB,OAAA;AAEtB,8IAAA,iCAAiC,OAAA;AAGnC,QAAQ;AACR,0HAIuF;AAHrF,iIAAA,qBAAqB,OAAA;AAErB,4IAAA,gCAAgC,OAAA;AAElC,4HAIwF;AAHtF,mIAAA,sBAAsB,OAAA;AAEtB,8IAAA,iCAAiC,OAAA;AAGnC,2DAA2D;AAC3D,gBAAgB;AAChB,2DAA2D;AAE3D,uHAGuF;AAFrF,2HAAA,kBAAkB,OAAA;AAClB,sIAAA,6BAA6B,OAAA;AAE/B,wHAIwF;AAHtF,2HAAA,kBAAkB,OAAA;AAClB,sIAAA,6BAA6B,OAAA;AAI/B,2DAA2D;AAC3D,eAAe;AACf,2DAA2D;AAC3D,2HAGyF;AAFvF,+HAAA,oBAAoB,OAAA;AACpB,0IAAA,+BAA+B,OAAA;AAEjC,kIAI6F;AAH3F,qIAAA,uBAAuB,OAAA;AAEvB,gJAAA,kCAAkC,OAAA"}
|
@@ -1,10 +1,12 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.BASE_SEPOLIA_BASENAME_RESOLVER_ADDRESS = exports.BASENAME_RESOLVER_ADDRESS = exports.resolveL2Name = exports.resolveName = exports.resolveText = exports.resolveAvatar = exports.resolveAddress = void 0;
|
3
|
+
exports.BASE_SEPOLIA_BASENAME_RESOLVER_ADDRESS = exports.BASENAME_RESOLVER_ADDRESS = exports.resolveL2Name = exports.resolveName = exports.resolveText = exports.parseAvatarRecord = exports.resolveAvatar = exports.resolveAddress = void 0;
|
4
4
|
var resolve_address_js_1 = require("../../extensions/ens/resolve-address.js");
|
5
5
|
Object.defineProperty(exports, "resolveAddress", { enumerable: true, get: function () { return resolve_address_js_1.resolveAddress; } });
|
6
6
|
var resolve_avatar_js_1 = require("../../extensions/ens/resolve-avatar.js");
|
7
7
|
Object.defineProperty(exports, "resolveAvatar", { enumerable: true, get: function () { return resolve_avatar_js_1.resolveAvatar; } });
|
8
|
+
var avatar_js_1 = require("../../utils/ens/avatar.js");
|
9
|
+
Object.defineProperty(exports, "parseAvatarRecord", { enumerable: true, get: function () { return avatar_js_1.parseAvatarRecord; } });
|
8
10
|
var resolve_text_js_1 = require("../../extensions/ens/resolve-text.js");
|
9
11
|
Object.defineProperty(exports, "resolveText", { enumerable: true, get: function () { return resolve_text_js_1.resolveText; } });
|
10
12
|
var resolve_name_js_1 = require("../../extensions/ens/resolve-name.js");
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../../src/exports/extensions/ens.ts"],"names":[],"mappings":";;;AAAA,8EAGiD;AAD/C,oHAAA,cAAc,OAAA;AAGhB,4EAGgD;AAD9C,kHAAA,aAAa,OAAA;AAGf,wEAG8C;AAD5C,8GAAA,WAAW,OAAA;AAGb,wEAG8C;AAD5C,8GAAA,WAAW,OAAA;AAGb,8EAGiD;AAD/C,mHAAA,aAAa,OAAA;AAGf,kEAG2C;AAFzC,yHAAA,yBAAyB,OAAA;AACzB,sIAAA,sCAAsC,OAAA"}
|
1
|
+
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../../src/exports/extensions/ens.ts"],"names":[],"mappings":";;;AAAA,8EAGiD;AAD/C,oHAAA,cAAc,OAAA;AAGhB,4EAGgD;AAD9C,kHAAA,aAAa,OAAA;AAGf,uDAGmC;AAFjC,8GAAA,iBAAiB,OAAA;AAInB,wEAG8C;AAD5C,8GAAA,WAAW,OAAA;AAGb,wEAG8C;AAD5C,8GAAA,WAAW,OAAA;AAGb,8EAGiD;AAD/C,mHAAA,aAAa,OAAA;AAGf,kEAG2C;AAFzC,yHAAA,yBAAyB,OAAA;AACzB,sIAAA,sCAAsC,OAAA"}
|
@@ -1,19 +1,39 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.parseAvatarRecord = parseAvatarRecord;
|
4
|
-
const utils_js_1 = require("../../chains/utils.js");
|
5
|
-
const contract_js_1 = require("../../contract/contract.js");
|
6
|
-
const address_js_1 = require("../address.js");
|
7
4
|
const fetch_js_1 = require("../fetch.js");
|
8
5
|
const ipfs_js_1 = require("../ipfs.js");
|
6
|
+
const parseNft_js_1 = require("../nft/parseNft.js");
|
9
7
|
/**
|
10
|
-
*
|
8
|
+
* Parses an ENS or similar avatar record. Supports NFT URIs, IPFS scheme, and HTTPS URIs.
|
9
|
+
* @param options - The options for parsing an ENS avatar record.
|
10
|
+
* @param options.client - The Thirdweb client.
|
11
|
+
* @param options.uri - The URI to parse.
|
12
|
+
* @returns A promise that resolves to the avatar URL, or null if the URI could not be parsed.
|
13
|
+
* @example
|
14
|
+
* ```ts
|
15
|
+
* import { parseAvatarRecord } from "thirdweb/utils/ens";
|
16
|
+
* const avatarUrl = await parseAvatarRecord({
|
17
|
+
* client,
|
18
|
+
* uri: "ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/",
|
19
|
+
* });
|
20
|
+
*
|
21
|
+
* console.log(avatarUrl); // "https://ipfs.io/ipfs/bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/"
|
22
|
+
*
|
23
|
+
* const avatarUrl2 = await parseAvatarRecord({
|
24
|
+
* client,
|
25
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
26
|
+
* });
|
27
|
+
*
|
28
|
+
* console.log(avatarUrl2); // "https://opensea.io/assets/0xb32979486938aa9694bfc898f35dbed459f44424/10063"
|
29
|
+
* ```
|
30
|
+
* @extension ENS
|
11
31
|
*/
|
12
32
|
async function parseAvatarRecord(options) {
|
13
33
|
let uri = options.uri;
|
14
34
|
if (/eip155:/i.test(options.uri)) {
|
15
35
|
// do nft uri parsing
|
16
|
-
uri = await parseNftUri(options);
|
36
|
+
uri = await (0, parseNft_js_1.parseNftUri)(options);
|
17
37
|
}
|
18
38
|
if (!uri) {
|
19
39
|
return null;
|
@@ -28,60 +48,6 @@ async function parseAvatarRecord(options) {
|
|
28
48
|
}
|
29
49
|
return null;
|
30
50
|
}
|
31
|
-
/**
|
32
|
-
* @internal
|
33
|
-
*/
|
34
|
-
async function parseNftUri(options) {
|
35
|
-
let uri = options.uri;
|
36
|
-
// parse valid nft spec (CAIP-22/CAIP-29)
|
37
|
-
// @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs
|
38
|
-
if (uri.startsWith("did:nft:")) {
|
39
|
-
// convert DID to CAIP
|
40
|
-
uri = uri.replace("did:nft:", "").replace(/_/g, "/");
|
41
|
-
}
|
42
|
-
const [reference = "", asset_namespace = "", tokenID = ""] = uri.split("/");
|
43
|
-
const [eip_namespace, chainID] = reference.split(":");
|
44
|
-
const [erc_namespace, contractAddress] = asset_namespace.split(":");
|
45
|
-
if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") {
|
46
|
-
throw new Error(`Invalid EIP namespace, expected EIP155, got: "${eip_namespace}"`);
|
47
|
-
}
|
48
|
-
if (!chainID) {
|
49
|
-
throw new Error("Chain ID not found");
|
50
|
-
}
|
51
|
-
if (!contractAddress || !(0, address_js_1.isAddress)(contractAddress)) {
|
52
|
-
throw new Error("Contract address not found");
|
53
|
-
}
|
54
|
-
if (!tokenID) {
|
55
|
-
throw new Error("Token ID not found");
|
56
|
-
}
|
57
|
-
const chain = (0, utils_js_1.getCachedChain)(Number(chainID));
|
58
|
-
const contract = (0, contract_js_1.getContract)({
|
59
|
-
client: options.client,
|
60
|
-
chain,
|
61
|
-
address: contractAddress,
|
62
|
-
});
|
63
|
-
switch (erc_namespace) {
|
64
|
-
case "erc721": {
|
65
|
-
const { getNFT } = await Promise.resolve().then(() => require("../../extensions/erc721/read/getNFT.js"));
|
66
|
-
const nft = await getNFT({
|
67
|
-
contract,
|
68
|
-
tokenId: BigInt(tokenID),
|
69
|
-
});
|
70
|
-
return nft.metadata.image ?? null;
|
71
|
-
}
|
72
|
-
case "erc1155": {
|
73
|
-
const { getNFT } = await Promise.resolve().then(() => require("../../extensions/erc1155/read/getNFT.js"));
|
74
|
-
const nft = await getNFT({
|
75
|
-
contract,
|
76
|
-
tokenId: BigInt(tokenID),
|
77
|
-
});
|
78
|
-
return nft.metadata.image ?? null;
|
79
|
-
}
|
80
|
-
default: {
|
81
|
-
throw new Error(`Invalid ERC namespace, expected ERC721 or ERC1155, got: "${erc_namespace}"`);
|
82
|
-
}
|
83
|
-
}
|
84
|
-
}
|
85
51
|
async function isImageUri(options) {
|
86
52
|
try {
|
87
53
|
const res = await (0, fetch_js_1.getClientFetch)(options.client)(options.uri, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../../src/utils/ens/avatar.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../../src/utils/ens/avatar.ts"],"names":[],"mappings":";;AAmCA,8CAqBC;AAvDD,0CAA6C;AAC7C,wCAA2C;AAC3C,oDAAiD;AAOjD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACI,KAAK,UAAU,iBAAiB,CACrC,OAA2B;IAE3B,IAAI,GAAG,GAAkB,OAAO,CAAC,GAAG,CAAC;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,qBAAqB;QACrB,GAAG,GAAG,MAAM,IAAA,yBAAW,EAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,cAAc,GAAG,IAAA,uBAAa,EAAC;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG;KACJ,CAAC,CAAC;IAEH,yBAAyB;IACzB,IAAI,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACtE,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAA2B;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,yBAAc,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5D,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,4DAA4D;QAC5D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC;QACb,4DAA4D;IAC9D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,yCAAyC;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,0EAA0E;QAC1E,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,6EAA6E;QAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC;YACF,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;gBACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;YACF,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
@@ -1,6 +1,10 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
3
|
exports.parseNFT = parseNFT;
|
4
|
+
exports.parseNftUri = parseNftUri;
|
5
|
+
const utils_js_1 = require("../../chains/utils.js");
|
6
|
+
const contract_js_1 = require("../../contract/contract.js");
|
7
|
+
const address_js_1 = require("../address.js");
|
4
8
|
/**
|
5
9
|
* Parses the NFT metadata and options to create an NFT object.
|
6
10
|
* @param base - The base NFT metadata.
|
@@ -31,4 +35,76 @@ function parseNFT(base, options) {
|
|
31
35
|
throw new Error("Invalid NFT type");
|
32
36
|
}
|
33
37
|
}
|
38
|
+
/**
|
39
|
+
* Parses an NFT URI.
|
40
|
+
* @param options - The options for parsing an NFT URI.
|
41
|
+
* @param options.client - The Thirdweb client.
|
42
|
+
* @param options.uri - The NFT URI to parse.
|
43
|
+
* @returns A promise that resolves to the NFT URI, or null if the URI could not be parsed.
|
44
|
+
*
|
45
|
+
* @example
|
46
|
+
* ```ts
|
47
|
+
* import { parseNftUri } from "thirdweb/utils/ens";
|
48
|
+
* const nftUri = await parseNftUri({
|
49
|
+
* client,
|
50
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
51
|
+
* });
|
52
|
+
*
|
53
|
+
* console.log(nftUri); // ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/
|
54
|
+
* ```
|
55
|
+
*
|
56
|
+
* @extension ENS
|
57
|
+
*
|
58
|
+
*/
|
59
|
+
async function parseNftUri(options) {
|
60
|
+
let uri = options.uri;
|
61
|
+
// parse valid nft spec (CAIP-22/CAIP-29)
|
62
|
+
// @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs
|
63
|
+
if (uri.startsWith("did:nft:")) {
|
64
|
+
// convert DID to CAIP
|
65
|
+
uri = uri.replace("did:nft:", "").replace(/_/g, "/");
|
66
|
+
}
|
67
|
+
const [reference = "", asset_namespace = "", tokenID = ""] = uri.split("/");
|
68
|
+
const [eip_namespace, chainID] = reference.split(":");
|
69
|
+
const [erc_namespace, contractAddress] = asset_namespace.split(":");
|
70
|
+
if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") {
|
71
|
+
throw new Error(`Invalid EIP namespace, expected EIP155, got: "${eip_namespace}"`);
|
72
|
+
}
|
73
|
+
if (!chainID) {
|
74
|
+
throw new Error("Chain ID not found");
|
75
|
+
}
|
76
|
+
if (!contractAddress || !(0, address_js_1.isAddress)(contractAddress)) {
|
77
|
+
throw new Error("Contract address not found");
|
78
|
+
}
|
79
|
+
if (!tokenID) {
|
80
|
+
throw new Error("Token ID not found");
|
81
|
+
}
|
82
|
+
const chain = (0, utils_js_1.getCachedChain)(Number(chainID));
|
83
|
+
const contract = (0, contract_js_1.getContract)({
|
84
|
+
client: options.client,
|
85
|
+
chain,
|
86
|
+
address: contractAddress,
|
87
|
+
});
|
88
|
+
switch (erc_namespace) {
|
89
|
+
case "erc721": {
|
90
|
+
const { getNFT } = await Promise.resolve().then(() => require("../../extensions/erc721/read/getNFT.js"));
|
91
|
+
const nft = await getNFT({
|
92
|
+
contract,
|
93
|
+
tokenId: BigInt(tokenID),
|
94
|
+
});
|
95
|
+
return nft.metadata.image ?? null;
|
96
|
+
}
|
97
|
+
case "erc1155": {
|
98
|
+
const { getNFT } = await Promise.resolve().then(() => require("../../extensions/erc1155/read/getNFT.js"));
|
99
|
+
const nft = await getNFT({
|
100
|
+
contract,
|
101
|
+
tokenId: BigInt(tokenID),
|
102
|
+
});
|
103
|
+
return nft.metadata.image ?? null;
|
104
|
+
}
|
105
|
+
default: {
|
106
|
+
throw new Error(`Invalid ERC namespace, expected ERC721 or ERC1155, got: "${erc_namespace}"`);
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
34
110
|
//# sourceMappingURL=parseNft.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"parseNft.js","sourceRoot":"","sources":["../../../../src/utils/nft/parseNft.ts"],"names":[],"mappings":";;
|
1
|
+
{"version":3,"file":"parseNft.js","sourceRoot":"","sources":["../../../../src/utils/nft/parseNft.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/version.js
CHANGED
package/dist/cjs/version.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAa,QAAA,OAAO,GAAG,wEAAwE,CAAC"}
|
@@ -4,6 +4,7 @@ export { getContractMetadata, isGetContractMetadataSupported, } from "../../exte
|
|
4
4
|
export { owner, isOwnerSupported, } from "../../extensions/common/__generated__/IOwnable/read/owner.js";
|
5
5
|
export { name, isNameSupported } from "../../extensions/common/read/name.js";
|
6
6
|
export { symbol, isSymbolSupported, } from "../../extensions/common/read/symbol.js";
|
7
|
+
export { parseNftUri } from "../../utils/nft/parseNft.js";
|
7
8
|
// write
|
8
9
|
export { setContractURI, isSetContractURISupported, } from "../../extensions/common/__generated__/IContractMetadata/write/setContractURI.js";
|
9
10
|
export { setOwner, } from "../../extensions/common/__generated__/IOwnable/write/setOwner.js";
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/exports/extensions/common.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,MAAM,6EAA6E,CAAC;AAC1G,OAAO,EACL,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,KAAK,EACL,gBAAgB,GACjB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EACL,MAAM,EACN,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../../../src/exports/extensions/common.ts"],"names":[],"mappings":"AAAA,OAAO;AACP,OAAO,EAAE,WAAW,EAAE,MAAM,6EAA6E,CAAC;AAC1G,OAAO,EACL,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,KAAK,EACL,gBAAgB,GACjB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EACL,MAAM,EACN,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,QAAQ;AACR,OAAO,EACL,cAAc,EAEd,yBAAyB,GAC1B,MAAM,iFAAiF,CAAC;AAEzF,OAAO,EACL,QAAQ,GAET,MAAM,kEAAkE,CAAC;AAE1E,OAAO,EACL,mBAAmB,EAEnB,8BAA8B,GAC/B,MAAM,sDAAsD,CAAC;AAE9D,OAAO,EACL,SAAS,EAET,oBAAoB,GACrB,MAAM,qEAAqE,CAAC;AAE7E,SAAS;AAET,OAAO,EACL,iBAAiB,GAElB,MAAM,uEAAuE,CAAC;AAE/E,2DAA2D;AAC3D,UAAU;AACV,2DAA2D;AAC3D,OAAO;AACP,OAAO,EACL,qBAAqB,EACrB,gCAAgC,GACjC,MAAM,8EAA8E,CAAC;AACtF,OAAO,EACL,sBAAsB,EAEtB,iCAAiC,GAClC,MAAM,+EAA+E,CAAC;AAEvF,QAAQ;AACR,OAAO,EACL,qBAAqB,EAErB,gCAAgC,GACjC,MAAM,+EAA+E,CAAC;AACvF,OAAO,EACL,sBAAsB,EAEtB,iCAAiC,GAClC,MAAM,gFAAgF,CAAC;AAExF,2DAA2D;AAC3D,gBAAgB;AAChB,2DAA2D;AAE3D,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,+EAA+E,CAAC;AACvF,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAE9B,MAAM,gFAAgF,CAAC;AAExF,2DAA2D;AAC3D,eAAe;AACf,2DAA2D;AAC3D,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,iFAAiF,CAAC;AACzF,OAAO,EACL,uBAAuB,EAEvB,kCAAkC,GACnC,MAAM,qFAAqF,CAAC"}
|
@@ -1,5 +1,6 @@
|
|
1
1
|
export { resolveAddress, } from "../../extensions/ens/resolve-address.js";
|
2
2
|
export { resolveAvatar, } from "../../extensions/ens/resolve-avatar.js";
|
3
|
+
export { parseAvatarRecord, } from "../../utils/ens/avatar.js";
|
3
4
|
export { resolveText, } from "../../extensions/ens/resolve-text.js";
|
4
5
|
export { resolveName, } from "../../extensions/ens/resolve-name.js";
|
5
6
|
export { resolveL2Name, } from "../../extensions/ens/resolve-l2-name.js";
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../../src/exports/extensions/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,GACf,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAEL,aAAa,GACd,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAEL,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAEL,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAEL,aAAa,GACd,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mCAAmC,CAAC"}
|
1
|
+
{"version":3,"file":"ens.js","sourceRoot":"","sources":["../../../../src/exports/extensions/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,GACf,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAEL,aAAa,GACd,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EACL,iBAAiB,GAElB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAEL,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAEL,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAEL,aAAa,GACd,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mCAAmC,CAAC"}
|
@@ -1,10 +1,30 @@
|
|
1
|
-
import { getCachedChain } from "../../chains/utils.js";
|
2
|
-
import { getContract } from "../../contract/contract.js";
|
3
|
-
import { isAddress } from "../address.js";
|
4
1
|
import { getClientFetch } from "../fetch.js";
|
5
2
|
import { resolveScheme } from "../ipfs.js";
|
3
|
+
import { parseNftUri } from "../nft/parseNft.js";
|
6
4
|
/**
|
7
|
-
*
|
5
|
+
* Parses an ENS or similar avatar record. Supports NFT URIs, IPFS scheme, and HTTPS URIs.
|
6
|
+
* @param options - The options for parsing an ENS avatar record.
|
7
|
+
* @param options.client - The Thirdweb client.
|
8
|
+
* @param options.uri - The URI to parse.
|
9
|
+
* @returns A promise that resolves to the avatar URL, or null if the URI could not be parsed.
|
10
|
+
* @example
|
11
|
+
* ```ts
|
12
|
+
* import { parseAvatarRecord } from "thirdweb/utils/ens";
|
13
|
+
* const avatarUrl = await parseAvatarRecord({
|
14
|
+
* client,
|
15
|
+
* uri: "ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/",
|
16
|
+
* });
|
17
|
+
*
|
18
|
+
* console.log(avatarUrl); // "https://ipfs.io/ipfs/bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/"
|
19
|
+
*
|
20
|
+
* const avatarUrl2 = await parseAvatarRecord({
|
21
|
+
* client,
|
22
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
23
|
+
* });
|
24
|
+
*
|
25
|
+
* console.log(avatarUrl2); // "https://opensea.io/assets/0xb32979486938aa9694bfc898f35dbed459f44424/10063"
|
26
|
+
* ```
|
27
|
+
* @extension ENS
|
8
28
|
*/
|
9
29
|
export async function parseAvatarRecord(options) {
|
10
30
|
let uri = options.uri;
|
@@ -25,60 +45,6 @@ export async function parseAvatarRecord(options) {
|
|
25
45
|
}
|
26
46
|
return null;
|
27
47
|
}
|
28
|
-
/**
|
29
|
-
* @internal
|
30
|
-
*/
|
31
|
-
async function parseNftUri(options) {
|
32
|
-
let uri = options.uri;
|
33
|
-
// parse valid nft spec (CAIP-22/CAIP-29)
|
34
|
-
// @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs
|
35
|
-
if (uri.startsWith("did:nft:")) {
|
36
|
-
// convert DID to CAIP
|
37
|
-
uri = uri.replace("did:nft:", "").replace(/_/g, "/");
|
38
|
-
}
|
39
|
-
const [reference = "", asset_namespace = "", tokenID = ""] = uri.split("/");
|
40
|
-
const [eip_namespace, chainID] = reference.split(":");
|
41
|
-
const [erc_namespace, contractAddress] = asset_namespace.split(":");
|
42
|
-
if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") {
|
43
|
-
throw new Error(`Invalid EIP namespace, expected EIP155, got: "${eip_namespace}"`);
|
44
|
-
}
|
45
|
-
if (!chainID) {
|
46
|
-
throw new Error("Chain ID not found");
|
47
|
-
}
|
48
|
-
if (!contractAddress || !isAddress(contractAddress)) {
|
49
|
-
throw new Error("Contract address not found");
|
50
|
-
}
|
51
|
-
if (!tokenID) {
|
52
|
-
throw new Error("Token ID not found");
|
53
|
-
}
|
54
|
-
const chain = getCachedChain(Number(chainID));
|
55
|
-
const contract = getContract({
|
56
|
-
client: options.client,
|
57
|
-
chain,
|
58
|
-
address: contractAddress,
|
59
|
-
});
|
60
|
-
switch (erc_namespace) {
|
61
|
-
case "erc721": {
|
62
|
-
const { getNFT } = await import("../../extensions/erc721/read/getNFT.js");
|
63
|
-
const nft = await getNFT({
|
64
|
-
contract,
|
65
|
-
tokenId: BigInt(tokenID),
|
66
|
-
});
|
67
|
-
return nft.metadata.image ?? null;
|
68
|
-
}
|
69
|
-
case "erc1155": {
|
70
|
-
const { getNFT } = await import("../../extensions/erc1155/read/getNFT.js");
|
71
|
-
const nft = await getNFT({
|
72
|
-
contract,
|
73
|
-
tokenId: BigInt(tokenID),
|
74
|
-
});
|
75
|
-
return nft.metadata.image ?? null;
|
76
|
-
}
|
77
|
-
default: {
|
78
|
-
throw new Error(`Invalid ERC namespace, expected ERC721 or ERC1155, got: "${erc_namespace}"`);
|
79
|
-
}
|
80
|
-
}
|
81
|
-
}
|
82
48
|
async function isImageUri(options) {
|
83
49
|
try {
|
84
50
|
const res = await getClientFetch(options.client)(options.uri, {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../../src/utils/ens/avatar.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"avatar.js","sourceRoot":"","sources":["../../../../src/utils/ens/avatar.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOjD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA2B;IAE3B,IAAI,GAAG,GAAkB,OAAO,CAAC,GAAG,CAAC;IACrC,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,qBAAqB;QACrB,GAAG,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,cAAc,GAAG,aAAa,CAAC;QACnC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG;KACJ,CAAC,CAAC;IAEH,yBAAyB;IACzB,IAAI,MAAM,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;QACtE,OAAO,cAAc,CAAC;IACxB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAA2B;IACnD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;YAC5D,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QACH,4DAA4D;QAC5D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YACpD,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,KAAK,CAAC;QACb,4DAA4D;IAC9D,CAAC;IAAC,OAAO,KAAU,EAAE,CAAC;QACpB,yCAAyC;QACzC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,QAAQ,KAAK,WAAW,EAAE,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC;QACD,0EAA0E;QAC1E,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,6EAA6E;QAC7E,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;YACxB,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE;gBAChB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC;YACF,GAAG,CAAC,OAAO,GAAG,GAAG,EAAE;gBACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC;YACF,GAAG,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
|
@@ -1,3 +1,6 @@
|
|
1
|
+
import { getCachedChain } from "../../chains/utils.js";
|
2
|
+
import { getContract } from "../../contract/contract.js";
|
3
|
+
import { isAddress } from "../address.js";
|
1
4
|
/**
|
2
5
|
* Parses the NFT metadata and options to create an NFT object.
|
3
6
|
* @param base - The base NFT metadata.
|
@@ -28,4 +31,76 @@ export function parseNFT(base, options) {
|
|
28
31
|
throw new Error("Invalid NFT type");
|
29
32
|
}
|
30
33
|
}
|
34
|
+
/**
|
35
|
+
* Parses an NFT URI.
|
36
|
+
* @param options - The options for parsing an NFT URI.
|
37
|
+
* @param options.client - The Thirdweb client.
|
38
|
+
* @param options.uri - The NFT URI to parse.
|
39
|
+
* @returns A promise that resolves to the NFT URI, or null if the URI could not be parsed.
|
40
|
+
*
|
41
|
+
* @example
|
42
|
+
* ```ts
|
43
|
+
* import { parseNftUri } from "thirdweb/utils/ens";
|
44
|
+
* const nftUri = await parseNftUri({
|
45
|
+
* client,
|
46
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
47
|
+
* });
|
48
|
+
*
|
49
|
+
* console.log(nftUri); // ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/
|
50
|
+
* ```
|
51
|
+
*
|
52
|
+
* @extension ENS
|
53
|
+
*
|
54
|
+
*/
|
55
|
+
export async function parseNftUri(options) {
|
56
|
+
let uri = options.uri;
|
57
|
+
// parse valid nft spec (CAIP-22/CAIP-29)
|
58
|
+
// @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs
|
59
|
+
if (uri.startsWith("did:nft:")) {
|
60
|
+
// convert DID to CAIP
|
61
|
+
uri = uri.replace("did:nft:", "").replace(/_/g, "/");
|
62
|
+
}
|
63
|
+
const [reference = "", asset_namespace = "", tokenID = ""] = uri.split("/");
|
64
|
+
const [eip_namespace, chainID] = reference.split(":");
|
65
|
+
const [erc_namespace, contractAddress] = asset_namespace.split(":");
|
66
|
+
if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") {
|
67
|
+
throw new Error(`Invalid EIP namespace, expected EIP155, got: "${eip_namespace}"`);
|
68
|
+
}
|
69
|
+
if (!chainID) {
|
70
|
+
throw new Error("Chain ID not found");
|
71
|
+
}
|
72
|
+
if (!contractAddress || !isAddress(contractAddress)) {
|
73
|
+
throw new Error("Contract address not found");
|
74
|
+
}
|
75
|
+
if (!tokenID) {
|
76
|
+
throw new Error("Token ID not found");
|
77
|
+
}
|
78
|
+
const chain = getCachedChain(Number(chainID));
|
79
|
+
const contract = getContract({
|
80
|
+
client: options.client,
|
81
|
+
chain,
|
82
|
+
address: contractAddress,
|
83
|
+
});
|
84
|
+
switch (erc_namespace) {
|
85
|
+
case "erc721": {
|
86
|
+
const { getNFT } = await import("../../extensions/erc721/read/getNFT.js");
|
87
|
+
const nft = await getNFT({
|
88
|
+
contract,
|
89
|
+
tokenId: BigInt(tokenID),
|
90
|
+
});
|
91
|
+
return nft.metadata.image ?? null;
|
92
|
+
}
|
93
|
+
case "erc1155": {
|
94
|
+
const { getNFT } = await import("../../extensions/erc1155/read/getNFT.js");
|
95
|
+
const nft = await getNFT({
|
96
|
+
contract,
|
97
|
+
tokenId: BigInt(tokenID),
|
98
|
+
});
|
99
|
+
return nft.metadata.image ?? null;
|
100
|
+
}
|
101
|
+
default: {
|
102
|
+
throw new Error(`Invalid ERC namespace, expected ERC721 or ERC1155, got: "${erc_namespace}"`);
|
103
|
+
}
|
104
|
+
}
|
105
|
+
}
|
31
106
|
//# sourceMappingURL=parseNft.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"parseNft.js","sourceRoot":"","sources":["../../../../src/utils/nft/parseNft.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"parseNft.js","sourceRoot":"","sources":["../../../../src/utils/nft/parseNft.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAmE1C;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAiB,EAAE,OAAwB;IAClE,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;gBAC7B,EAAE,EAAE,OAAO,CAAC,OAAO;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO;gBACL,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,IAAI;gBAC7B,EAAE,EAAE,OAAO,CAAC,OAAO;gBACnB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,MAAM,EAAE,OAAO,CAAC,MAAM;aACvB,CAAC;QACJ;YACE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAGjC;IACC,IAAI,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACtB,yCAAyC;IACzC,iEAAiE;IACjE,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,sBAAsB;QACtB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,SAAS,GAAG,EAAE,EAAE,eAAe,GAAG,EAAE,EAAE,OAAO,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC5E,MAAM,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtD,MAAM,CAAC,aAAa,EAAE,eAAe,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEpE,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,WAAW,EAAE,KAAK,QAAQ,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CACb,iDAAiD,aAAa,GAAG,CAClE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAAE,CAAC;QACpD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACxC,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,WAAW,CAAC;QAC3B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,KAAK;QACL,OAAO,EAAE,eAAe;KACzB,CAAC,CAAC;IACH,QAAQ,aAAa,EAAE,CAAC;QACtB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,wCAAwC,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;gBACvB,QAAQ;gBACR,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;aACzB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;QACpC,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAC7B,yCAAyC,CAC1C,CAAC;YACF,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC;gBACvB,QAAQ;gBACR,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC;aACzB,CAAC,CAAC;YACH,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,IAAI,CAAC;QACpC,CAAC;QAED,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,IAAI,KAAK,CACb,4DAA4D,aAAa,GAAG,CAC7E,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/esm/version.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export const version = "5.
|
1
|
+
export const version = "5.55.0-nightly-8035923cdad943a47fc909e04522c351d06804f0-20240913000407";
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/dist/esm/version.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,wEAAwE,CAAC"}
|
@@ -3,6 +3,7 @@ export { getContractMetadata, isGetContractMetadataSupported, } from "../../exte
|
|
3
3
|
export { owner, isOwnerSupported, } from "../../extensions/common/__generated__/IOwnable/read/owner.js";
|
4
4
|
export { name, isNameSupported } from "../../extensions/common/read/name.js";
|
5
5
|
export { symbol, isSymbolSupported, } from "../../extensions/common/read/symbol.js";
|
6
|
+
export { parseNftUri } from "../../utils/nft/parseNft.js";
|
6
7
|
export { setContractURI, type SetContractURIParams, isSetContractURISupported, } from "../../extensions/common/__generated__/IContractMetadata/write/setContractURI.js";
|
7
8
|
export { setOwner, type SetOwnerParams, } from "../../extensions/common/__generated__/IOwnable/write/setOwner.js";
|
8
9
|
export { setContractMetadata, type SetContractMetadataParams, isSetContractMetadataSupported, } from "../../extensions/common/write/setContractMetadata.js";
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/exports/extensions/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,6EAA6E,CAAC;AAC1G,OAAO,EACL,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,KAAK,EACL,gBAAgB,GACjB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EACL,MAAM,EACN,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../../src/exports/extensions/common.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,6EAA6E,CAAC;AAC1G,OAAO,EACL,mBAAmB,EACnB,8BAA8B,GAC/B,MAAM,qDAAqD,CAAC;AAC7D,OAAO,EACL,KAAK,EACL,gBAAgB,GACjB,MAAM,8DAA8D,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EACL,MAAM,EACN,iBAAiB,GAClB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG1D,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,yBAAyB,GAC1B,MAAM,iFAAiF,CAAC;AAEzF,OAAO,EACL,QAAQ,EACR,KAAK,cAAc,GACpB,MAAM,kEAAkE,CAAC;AAE1E,OAAO,EACL,mBAAmB,EACnB,KAAK,yBAAyB,EAC9B,8BAA8B,GAC/B,MAAM,sDAAsD,CAAC;AAE9D,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,oBAAoB,GACrB,MAAM,qEAAqE,CAAC;AAI7E,OAAO,EACL,iBAAiB,EACjB,KAAK,wBAAwB,GAC9B,MAAM,uEAAuE,CAAC;AAM/E,OAAO,EACL,qBAAqB,EACrB,gCAAgC,GACjC,MAAM,8EAA8E,CAAC;AACtF,OAAO,EACL,sBAAsB,EACtB,KAAK,4BAA4B,EACjC,iCAAiC,GAClC,MAAM,+EAA+E,CAAC;AAGvF,OAAO,EACL,qBAAqB,EACrB,KAAK,2BAA2B,EAChC,gCAAgC,GACjC,MAAM,+EAA+E,CAAC;AACvF,OAAO,EACL,sBAAsB,EACtB,KAAK,4BAA4B,EACjC,iCAAiC,GAClC,MAAM,gFAAgF,CAAC;AAMxF,OAAO,EACL,kBAAkB,EAClB,6BAA6B,GAC9B,MAAM,+EAA+E,CAAC;AACvF,OAAO,EACL,kBAAkB,EAClB,6BAA6B,EAC7B,KAAK,wBAAwB,GAC9B,MAAM,gFAAgF,CAAC;AAKxF,OAAO,EACL,oBAAoB,EACpB,+BAA+B,GAChC,MAAM,iFAAiF,CAAC;AACzF,OAAO,EACL,uBAAuB,EACvB,KAAK,6BAA6B,EAClC,kCAAkC,GACnC,MAAM,qFAAqF,CAAC"}
|
@@ -1,5 +1,6 @@
|
|
1
1
|
export { type ResolveAddressOptions, resolveAddress, } from "../../extensions/ens/resolve-address.js";
|
2
2
|
export { type ResolveAvatarOptions, resolveAvatar, } from "../../extensions/ens/resolve-avatar.js";
|
3
|
+
export { parseAvatarRecord, type ParseAvatarOptions, } from "../../utils/ens/avatar.js";
|
3
4
|
export { type ResolveTextOptions, resolveText, } from "../../extensions/ens/resolve-text.js";
|
4
5
|
export { type ResolveNameOptions, resolveName, } from "../../extensions/ens/resolve-name.js";
|
5
6
|
export { type ResolveL2NameOptions, resolveL2Name, } from "../../extensions/ens/resolve-l2-name.js";
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"ens.d.ts","sourceRoot":"","sources":["../../../../src/exports/extensions/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAC1B,cAAc,GACf,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mCAAmC,CAAC"}
|
1
|
+
{"version":3,"file":"ens.d.ts","sourceRoot":"","sources":["../../../../src/exports/extensions/ens.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,qBAAqB,EAC1B,cAAc,GACf,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EACL,iBAAiB,EACjB,KAAK,kBAAkB,GACxB,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,KAAK,kBAAkB,EACvB,WAAW,GACZ,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,KAAK,oBAAoB,EACzB,aAAa,GACd,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EACL,yBAAyB,EACzB,sCAAsC,GACvC,MAAM,mCAAmC,CAAC"}
|
@@ -1,11 +1,32 @@
|
|
1
1
|
import type { ThirdwebClient } from "../../client/client.js";
|
2
|
-
type
|
2
|
+
export type ParseAvatarOptions = {
|
3
3
|
client: ThirdwebClient;
|
4
4
|
uri: string;
|
5
5
|
};
|
6
6
|
/**
|
7
|
-
*
|
7
|
+
* Parses an ENS or similar avatar record. Supports NFT URIs, IPFS scheme, and HTTPS URIs.
|
8
|
+
* @param options - The options for parsing an ENS avatar record.
|
9
|
+
* @param options.client - The Thirdweb client.
|
10
|
+
* @param options.uri - The URI to parse.
|
11
|
+
* @returns A promise that resolves to the avatar URL, or null if the URI could not be parsed.
|
12
|
+
* @example
|
13
|
+
* ```ts
|
14
|
+
* import { parseAvatarRecord } from "thirdweb/utils/ens";
|
15
|
+
* const avatarUrl = await parseAvatarRecord({
|
16
|
+
* client,
|
17
|
+
* uri: "ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/",
|
18
|
+
* });
|
19
|
+
*
|
20
|
+
* console.log(avatarUrl); // "https://ipfs.io/ipfs/bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/"
|
21
|
+
*
|
22
|
+
* const avatarUrl2 = await parseAvatarRecord({
|
23
|
+
* client,
|
24
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
25
|
+
* });
|
26
|
+
*
|
27
|
+
* console.log(avatarUrl2); // "https://opensea.io/assets/0xb32979486938aa9694bfc898f35dbed459f44424/10063"
|
28
|
+
* ```
|
29
|
+
* @extension ENS
|
8
30
|
*/
|
9
|
-
export declare function parseAvatarRecord(options:
|
10
|
-
export {};
|
31
|
+
export declare function parseAvatarRecord(options: ParseAvatarOptions): Promise<string | null>;
|
11
32
|
//# sourceMappingURL=avatar.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../../src/utils/ens/avatar.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"avatar.d.ts","sourceRoot":"","sources":["../../../../src/utils/ens/avatar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAK7D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAmBxB"}
|
@@ -1,3 +1,4 @@
|
|
1
|
+
import type { ThirdwebClient } from "../../client/client.js";
|
1
2
|
import type { FileOrBufferOrString } from "../../storage/upload/types.js";
|
2
3
|
import type { Prettify } from "../type-utils.js";
|
3
4
|
/**
|
@@ -61,4 +62,29 @@ export type ParseNFTOptions = {
|
|
61
62
|
* @internal
|
62
63
|
*/
|
63
64
|
export declare function parseNFT(base: NFTMetadata, options: ParseNFTOptions): NFT;
|
65
|
+
/**
|
66
|
+
* Parses an NFT URI.
|
67
|
+
* @param options - The options for parsing an NFT URI.
|
68
|
+
* @param options.client - The Thirdweb client.
|
69
|
+
* @param options.uri - The NFT URI to parse.
|
70
|
+
* @returns A promise that resolves to the NFT URI, or null if the URI could not be parsed.
|
71
|
+
*
|
72
|
+
* @example
|
73
|
+
* ```ts
|
74
|
+
* import { parseNftUri } from "thirdweb/utils/ens";
|
75
|
+
* const nftUri = await parseNftUri({
|
76
|
+
* client,
|
77
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
78
|
+
* });
|
79
|
+
*
|
80
|
+
* console.log(nftUri); // ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/
|
81
|
+
* ```
|
82
|
+
*
|
83
|
+
* @extension ENS
|
84
|
+
*
|
85
|
+
*/
|
86
|
+
export declare function parseNftUri(options: {
|
87
|
+
client: ThirdwebClient;
|
88
|
+
uri: string;
|
89
|
+
}): Promise<string | null>;
|
64
90
|
//# sourceMappingURL=parseNft.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"parseNft.d.ts","sourceRoot":"","sources":["../../../../src/utils/nft/parseNft.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"parseNft.d.ts","sourceRoot":"","sources":["../../../../src/utils/nft/parseNft.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAE1E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,QAAQ,CAC7B;IACE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAC7B,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAC5B,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE5B,MAAM,MAAM,GAAG,GACX;IACE,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;CAChB,GACD;IACE,QAAQ,EAAE,WAAW,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB,GACD;IACE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEN;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,GAAG,CAsBzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;CACb,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA2DzB"}
|
package/dist/types/version.d.ts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "5.
|
1
|
+
export declare const version = "5.55.0-nightly-8035923cdad943a47fc909e04522c351d06804f0-20240913000407";
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,2EAA2E,CAAC"}
|
package/package.json
CHANGED
package/src/utils/ens/avatar.ts
CHANGED
@@ -1,20 +1,40 @@
|
|
1
|
-
import { getCachedChain } from "../../chains/utils.js";
|
2
1
|
import type { ThirdwebClient } from "../../client/client.js";
|
3
|
-
import { getContract } from "../../contract/contract.js";
|
4
|
-
import { isAddress } from "../address.js";
|
5
2
|
import { getClientFetch } from "../fetch.js";
|
6
3
|
import { resolveScheme } from "../ipfs.js";
|
4
|
+
import { parseNftUri } from "../nft/parseNft.js";
|
7
5
|
|
8
|
-
type
|
6
|
+
export type ParseAvatarOptions = {
|
9
7
|
client: ThirdwebClient;
|
10
8
|
uri: string;
|
11
9
|
};
|
12
10
|
|
13
11
|
/**
|
14
|
-
*
|
12
|
+
* Parses an ENS or similar avatar record. Supports NFT URIs, IPFS scheme, and HTTPS URIs.
|
13
|
+
* @param options - The options for parsing an ENS avatar record.
|
14
|
+
* @param options.client - The Thirdweb client.
|
15
|
+
* @param options.uri - The URI to parse.
|
16
|
+
* @returns A promise that resolves to the avatar URL, or null if the URI could not be parsed.
|
17
|
+
* @example
|
18
|
+
* ```ts
|
19
|
+
* import { parseAvatarRecord } from "thirdweb/utils/ens";
|
20
|
+
* const avatarUrl = await parseAvatarRecord({
|
21
|
+
* client,
|
22
|
+
* uri: "ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/",
|
23
|
+
* });
|
24
|
+
*
|
25
|
+
* console.log(avatarUrl); // "https://ipfs.io/ipfs/bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/"
|
26
|
+
*
|
27
|
+
* const avatarUrl2 = await parseAvatarRecord({
|
28
|
+
* client,
|
29
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
30
|
+
* });
|
31
|
+
*
|
32
|
+
* console.log(avatarUrl2); // "https://opensea.io/assets/0xb32979486938aa9694bfc898f35dbed459f44424/10063"
|
33
|
+
* ```
|
34
|
+
* @extension ENS
|
15
35
|
*/
|
16
36
|
export async function parseAvatarRecord(
|
17
|
-
options:
|
37
|
+
options: ParseAvatarOptions,
|
18
38
|
): Promise<string | null> {
|
19
39
|
let uri: string | null = options.uri;
|
20
40
|
if (/eip155:/i.test(options.uri)) {
|
@@ -36,71 +56,7 @@ export async function parseAvatarRecord(
|
|
36
56
|
return null;
|
37
57
|
}
|
38
58
|
|
39
|
-
|
40
|
-
* @internal
|
41
|
-
*/
|
42
|
-
async function parseNftUri(options: AvatarOptions): Promise<string | null> {
|
43
|
-
let uri = options.uri;
|
44
|
-
// parse valid nft spec (CAIP-22/CAIP-29)
|
45
|
-
// @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs
|
46
|
-
if (uri.startsWith("did:nft:")) {
|
47
|
-
// convert DID to CAIP
|
48
|
-
uri = uri.replace("did:nft:", "").replace(/_/g, "/");
|
49
|
-
}
|
50
|
-
|
51
|
-
const [reference = "", asset_namespace = "", tokenID = ""] = uri.split("/");
|
52
|
-
const [eip_namespace, chainID] = reference.split(":");
|
53
|
-
const [erc_namespace, contractAddress] = asset_namespace.split(":");
|
54
|
-
|
55
|
-
if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") {
|
56
|
-
throw new Error(
|
57
|
-
`Invalid EIP namespace, expected EIP155, got: "${eip_namespace}"`,
|
58
|
-
);
|
59
|
-
}
|
60
|
-
if (!chainID) {
|
61
|
-
throw new Error("Chain ID not found");
|
62
|
-
}
|
63
|
-
if (!contractAddress || !isAddress(contractAddress)) {
|
64
|
-
throw new Error("Contract address not found");
|
65
|
-
}
|
66
|
-
if (!tokenID) {
|
67
|
-
throw new Error("Token ID not found");
|
68
|
-
}
|
69
|
-
const chain = getCachedChain(Number(chainID));
|
70
|
-
const contract = getContract({
|
71
|
-
client: options.client,
|
72
|
-
chain,
|
73
|
-
address: contractAddress,
|
74
|
-
});
|
75
|
-
switch (erc_namespace) {
|
76
|
-
case "erc721": {
|
77
|
-
const { getNFT } = await import("../../extensions/erc721/read/getNFT.js");
|
78
|
-
const nft = await getNFT({
|
79
|
-
contract,
|
80
|
-
tokenId: BigInt(tokenID),
|
81
|
-
});
|
82
|
-
return nft.metadata.image ?? null;
|
83
|
-
}
|
84
|
-
case "erc1155": {
|
85
|
-
const { getNFT } = await import(
|
86
|
-
"../../extensions/erc1155/read/getNFT.js"
|
87
|
-
);
|
88
|
-
const nft = await getNFT({
|
89
|
-
contract,
|
90
|
-
tokenId: BigInt(tokenID),
|
91
|
-
});
|
92
|
-
return nft.metadata.image ?? null;
|
93
|
-
}
|
94
|
-
|
95
|
-
default: {
|
96
|
-
throw new Error(
|
97
|
-
`Invalid ERC namespace, expected ERC721 or ERC1155, got: "${erc_namespace}"`,
|
98
|
-
);
|
99
|
-
}
|
100
|
-
}
|
101
|
-
}
|
102
|
-
|
103
|
-
async function isImageUri(options: AvatarOptions): Promise<boolean> {
|
59
|
+
async function isImageUri(options: ParseAvatarOptions): Promise<boolean> {
|
104
60
|
try {
|
105
61
|
const res = await getClientFetch(options.client)(options.uri, {
|
106
62
|
method: "HEAD",
|
@@ -1,4 +1,8 @@
|
|
1
|
+
import { getCachedChain } from "../../chains/utils.js";
|
2
|
+
import type { ThirdwebClient } from "../../client/client.js";
|
3
|
+
import { getContract } from "../../contract/contract.js";
|
1
4
|
import type { FileOrBufferOrString } from "../../storage/upload/types.js";
|
5
|
+
import { isAddress } from "../address.js";
|
2
6
|
import type { Prettify } from "../type-utils.js";
|
3
7
|
|
4
8
|
/**
|
@@ -95,3 +99,88 @@ export function parseNFT(base: NFTMetadata, options: ParseNFTOptions): NFT {
|
|
95
99
|
throw new Error("Invalid NFT type");
|
96
100
|
}
|
97
101
|
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* Parses an NFT URI.
|
105
|
+
* @param options - The options for parsing an NFT URI.
|
106
|
+
* @param options.client - The Thirdweb client.
|
107
|
+
* @param options.uri - The NFT URI to parse.
|
108
|
+
* @returns A promise that resolves to the NFT URI, or null if the URI could not be parsed.
|
109
|
+
*
|
110
|
+
* @example
|
111
|
+
* ```ts
|
112
|
+
* import { parseNftUri } from "thirdweb/utils/ens";
|
113
|
+
* const nftUri = await parseNftUri({
|
114
|
+
* client,
|
115
|
+
* uri: "eip155:1/erc1155:0xb32979486938aa9694bfc898f35dbed459f44424/10063",
|
116
|
+
* });
|
117
|
+
*
|
118
|
+
* console.log(nftUri); // ipfs://bafybeiemxf5abjwjbikoz4mc3a3dla6ual3jsgpdr4cjr3oz3evfyavhwq/
|
119
|
+
* ```
|
120
|
+
*
|
121
|
+
* @extension ENS
|
122
|
+
*
|
123
|
+
*/
|
124
|
+
export async function parseNftUri(options: {
|
125
|
+
client: ThirdwebClient;
|
126
|
+
uri: string;
|
127
|
+
}): Promise<string | null> {
|
128
|
+
let uri = options.uri;
|
129
|
+
// parse valid nft spec (CAIP-22/CAIP-29)
|
130
|
+
// @see: https://github.com/ChainAgnostic/CAIPs/tree/master/CAIPs
|
131
|
+
if (uri.startsWith("did:nft:")) {
|
132
|
+
// convert DID to CAIP
|
133
|
+
uri = uri.replace("did:nft:", "").replace(/_/g, "/");
|
134
|
+
}
|
135
|
+
|
136
|
+
const [reference = "", asset_namespace = "", tokenID = ""] = uri.split("/");
|
137
|
+
const [eip_namespace, chainID] = reference.split(":");
|
138
|
+
const [erc_namespace, contractAddress] = asset_namespace.split(":");
|
139
|
+
|
140
|
+
if (!eip_namespace || eip_namespace.toLowerCase() !== "eip155") {
|
141
|
+
throw new Error(
|
142
|
+
`Invalid EIP namespace, expected EIP155, got: "${eip_namespace}"`,
|
143
|
+
);
|
144
|
+
}
|
145
|
+
if (!chainID) {
|
146
|
+
throw new Error("Chain ID not found");
|
147
|
+
}
|
148
|
+
if (!contractAddress || !isAddress(contractAddress)) {
|
149
|
+
throw new Error("Contract address not found");
|
150
|
+
}
|
151
|
+
if (!tokenID) {
|
152
|
+
throw new Error("Token ID not found");
|
153
|
+
}
|
154
|
+
const chain = getCachedChain(Number(chainID));
|
155
|
+
const contract = getContract({
|
156
|
+
client: options.client,
|
157
|
+
chain,
|
158
|
+
address: contractAddress,
|
159
|
+
});
|
160
|
+
switch (erc_namespace) {
|
161
|
+
case "erc721": {
|
162
|
+
const { getNFT } = await import("../../extensions/erc721/read/getNFT.js");
|
163
|
+
const nft = await getNFT({
|
164
|
+
contract,
|
165
|
+
tokenId: BigInt(tokenID),
|
166
|
+
});
|
167
|
+
return nft.metadata.image ?? null;
|
168
|
+
}
|
169
|
+
case "erc1155": {
|
170
|
+
const { getNFT } = await import(
|
171
|
+
"../../extensions/erc1155/read/getNFT.js"
|
172
|
+
);
|
173
|
+
const nft = await getNFT({
|
174
|
+
contract,
|
175
|
+
tokenId: BigInt(tokenID),
|
176
|
+
});
|
177
|
+
return nft.metadata.image ?? null;
|
178
|
+
}
|
179
|
+
|
180
|
+
default: {
|
181
|
+
throw new Error(
|
182
|
+
`Invalid ERC namespace, expected ERC721 or ERC1155, got: "${erc_namespace}"`,
|
183
|
+
);
|
184
|
+
}
|
185
|
+
}
|
186
|
+
}
|
package/src/version.ts
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export const version = "5.
|
1
|
+
export const version = "5.55.0-nightly-8035923cdad943a47fc909e04522c351d06804f0-20240913000407";
|