@xyo-network/crypto-nft-witness-wallet-plugin 2.82.2 → 2.83.0
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/browser/index.cjs +21 -19
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +21 -19
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/lib/{getAssetsFromWalletFromOpenSea.d.cts → getNftsFromWalletFromOpenSea.d.cts} +4 -1
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.cts.map +1 -0
- package/dist/browser/lib/{getAssetsFromWalletFromOpenSea.d.ts → getNftsFromWalletFromOpenSea.d.mts} +4 -1
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.mts.map +1 -0
- package/dist/browser/lib/{getAssetsFromWalletFromOpenSea.d.mts → getNftsFromWalletFromOpenSea.d.ts} +4 -1
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.ts.map +1 -0
- package/dist/browser/lib/getNftsOwnedByAddress.d.cts.map +1 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.mts.map +1 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.ts.map +1 -1
- package/dist/node/index.cjs +21 -19
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +21 -19
- package/dist/node/index.js.map +1 -1
- package/dist/node/lib/{getAssetsFromWalletFromOpenSea.d.cts → getNftsFromWalletFromOpenSea.d.cts} +4 -1
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.cts.map +1 -0
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.mts +20 -0
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.mts.map +1 -0
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.ts +20 -0
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.ts.map +1 -0
- package/dist/node/lib/getNftsOwnedByAddress.d.cts.map +1 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.mts.map +1 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.ts.map +1 -1
- package/package.json +28 -11
- package/src/lib/{getAssetsFromWalletFromOpenSea.ts → getNftsFromWalletFromOpenSea.ts} +36 -0
- package/src/lib/getNftsOwnedByAddress.ts +11 -10
- package/src/spec/Witness.Index.json +219 -0
- package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.cts.map +0 -1
- package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.mts.map +0 -1
- package/dist/browser/lib/getAssetsFromWalletFromOpenSea.d.ts.map +0 -1
- package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.cts.map +0 -1
- package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.mts +0 -17
- package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.mts.map +0 -1
- package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.ts +0 -17
- package/dist/node/lib/getAssetsFromWalletFromOpenSea.d.ts.map +0 -1
package/dist/browser/index.cjs
CHANGED
|
@@ -84,18 +84,8 @@ var import_blockchain_erc1967_witness = require("@xyo-network/blockchain-erc1967
|
|
|
84
84
|
var import_open_zeppelin_typechain3 = require("@xyo-network/open-zeppelin-typechain");
|
|
85
85
|
var import_lru_cache = require("lru-cache");
|
|
86
86
|
|
|
87
|
-
// src/lib/getAssetsFromWalletFromOpenSea.ts
|
|
88
|
-
var import_assert2 = require("@xylabs/assert");
|
|
89
|
-
var import_axios = require("@xylabs/axios");
|
|
90
|
-
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
91
|
-
const apiKey = (0, import_assert2.assertEx)(process.env.OPENSEA_API_KEY, "No opensea key found");
|
|
92
|
-
const axios = new import_axios.AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
|
|
93
|
-
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
94
|
-
return nfts;
|
|
95
|
-
};
|
|
96
|
-
|
|
97
87
|
// src/lib/getNftMetadata.ts
|
|
98
|
-
var
|
|
88
|
+
var import_axios = require("@xylabs/axios");
|
|
99
89
|
var import_open_zeppelin_typechain2 = require("@xyo-network/open-zeppelin-typechain");
|
|
100
90
|
var import_witness_blockchain_abstract = require("@xyo-network/witness-blockchain-abstract");
|
|
101
91
|
var import_parse_data_url = __toESM(require("parse-data-url"), 1);
|
|
@@ -155,7 +145,7 @@ var getNftMetadata = async (contractAddress, provider, tokenId, load = false, de
|
|
|
155
145
|
}
|
|
156
146
|
} else {
|
|
157
147
|
let checkedMetaDataUri;
|
|
158
|
-
const axios = new
|
|
148
|
+
const axios = new import_axios.AxiosJson({ timeout: 5e3 });
|
|
159
149
|
try {
|
|
160
150
|
if (tokenMetadataUri && tokenMetadataUri.length) {
|
|
161
151
|
checkedMetaDataUri = tokenMetadataUri ? (0, import_witness_blockchain_abstract.checkIpfsUrl)(tokenMetadataUri, ipfsGateway) : tokenMetadataUri;
|
|
@@ -172,6 +162,16 @@ var getNftMetadata = async (contractAddress, provider, tokenId, load = false, de
|
|
|
172
162
|
return [tokenMetadataUri, metadata];
|
|
173
163
|
};
|
|
174
164
|
|
|
165
|
+
// src/lib/getNftsFromWalletFromOpenSea.ts
|
|
166
|
+
var import_assert2 = require("@xylabs/assert");
|
|
167
|
+
var import_axios2 = require("@xylabs/axios");
|
|
168
|
+
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
169
|
+
const apiKey = (0, import_assert2.assertEx)(process.env.OPENSEA_API_KEY, "No opensea key found");
|
|
170
|
+
const axios = new import_axios2.AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
|
|
171
|
+
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
172
|
+
return nfts;
|
|
173
|
+
};
|
|
174
|
+
|
|
175
175
|
// src/lib/getProvider.ts
|
|
176
176
|
var getProvider = (providers) => {
|
|
177
177
|
return providers[Date.now() % providers.length];
|
|
@@ -226,7 +226,6 @@ var getNftMetadataUri = async (address, tokenId, provider) => {
|
|
|
226
226
|
var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts = 200, timeout = 5e3) => {
|
|
227
227
|
const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout);
|
|
228
228
|
const nftResult = await Promise.all(
|
|
229
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
230
229
|
nfts.map(async (nft) => {
|
|
231
230
|
try {
|
|
232
231
|
if (!nft.metadataUri || !nft.metadata) {
|
|
@@ -254,14 +253,17 @@ var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts
|
|
|
254
253
|
var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, timeout = 5e3) => {
|
|
255
254
|
const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout);
|
|
256
255
|
const nftResult = await Promise.all(
|
|
257
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
258
256
|
nfts.map(async (nft) => {
|
|
259
257
|
try {
|
|
260
|
-
const { contract, identifier } = nft;
|
|
258
|
+
const { contract, identifier, metadata_url } = nft;
|
|
261
259
|
const provider = getProvider(providers);
|
|
262
260
|
const block = await provider.getBlockNumber();
|
|
263
|
-
const erc1967Status = await
|
|
264
|
-
|
|
261
|
+
const [erc1967Status, erc1822Status] = await Promise.all([
|
|
262
|
+
// Check if ERC-1967 Upgradeable
|
|
263
|
+
await (0, import_blockchain_erc1967_witness.getErc1967Status)(provider, contract, block),
|
|
264
|
+
// Check if ERC-1822 Upgradeable
|
|
265
|
+
await (0, import_blockchain_erc1822_witness.getErc1822Status)(provider, contract, block)
|
|
266
|
+
]);
|
|
265
267
|
const implementation = !erc1967Status.slots.implementation || (0, import_hex.isHexZero)(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
|
|
266
268
|
let supply = 1n;
|
|
267
269
|
const types = await getTokenTypes(provider, implementation);
|
|
@@ -271,8 +273,8 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
271
273
|
}
|
|
272
274
|
const fields = {
|
|
273
275
|
address: contract,
|
|
274
|
-
chainId: Number((await
|
|
275
|
-
metadataUri:
|
|
276
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
277
|
+
metadataUri: metadata_url ?? void 0,
|
|
276
278
|
supply: `0x${supply.toString(16)}`,
|
|
277
279
|
tokenId: identifier,
|
|
278
280
|
type: types.at(0),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getAssetsFromWalletFromOpenSea.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.ts","../../src/lib/getProvider.ts","../../src/lib/tryCall.ts"],"sourcesContent":["import { CryptoWalletNftWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoWalletNftWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoWalletNftWitnessPlugin\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoWalletNftWitness } from './Witness'\n\nexport const CryptoWalletNftWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoWalletNftWitness> =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n CryptoWalletNftWitnessConfig,\n isNftWitnessQuery,\n NftInfo,\n NftSchema,\n NftWitnessConfigSchema,\n NftWitnessQuery,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractBlockchainWitness, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = BlockchainWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractBlockchainWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override configSchemas = [NftWitnessConfigSchema]\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n //calling it here to make sure we rests the cache\n const providers = await this.getProviders()\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const provider = await this.getProvider(true, true)\n const addressValue = assertEx(query?.address ?? this.config.address, 'params.address is required')\n const parsedAddressValue = EthAddress.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), 'Failed to parse params.address')\n const network = await provider.getNetwork()\n const chainId = assertEx(network.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n try {\n const nfts = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`)\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (let i = 0; i < functionNames.length; i++) {\n const selector = assertEx(contractInterface.getFunction(functionNames[i])?.selector, 'Function not found on interface')\n if (!bytecode.includes(selector.substring(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { isHexZero } from '@xylabs/hex'\nimport { getErc1822Status } from '@xyo-network/blockchain-erc1822-witness'\nimport { getErc1967Status } from '@xyo-network/blockchain-erc1967-witness'\nimport { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\nimport { LRUCache } from 'lru-cache'\n\nimport { getNftsFromWalletFromOpenSea } from './getAssetsFromWalletFromOpenSea'\nimport { getNftMetadata } from './getNftMetadata'\nimport { getProvider } from './getProvider'\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const key = `${address}|${(await provider.getNetwork()).chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n } else {\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n }\n}\n\nexport const getErc721MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, provider)\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, provider)\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string, provider: Provider) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout)\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nfts.map(async (nft) => {\n try {\n if (!nft.metadataUri || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(\n nft.implementation ?? nft.address,\n getProvider(providers),\n nft.tokenId,\n true,\n nft.metadataUri,\n )\n nft.metadata = nft.metadata ?? metadata\n nft.metadataUri = nft.metadataUri ?? metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n //const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nfts.map(async (nft) => {\n try {\n const { contract, identifier } = nft\n const provider = getProvider(providers)\n\n const block = await provider.getBlockNumber()\n\n //Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967Status(provider, contract, block)\n\n //Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822Status(provider, contract, block)\n\n const implementation =\n !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n let supply = 1n\n const types = await getTokenTypes(provider, implementation)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers))\n supply = (await tryCall(async () => await supply1155['totalSupply(uint256)'](erc1967Status.address))) ?? 1n\n }\n const fields: NftInfoFields = {\n address: contract,\n chainId: Number((await getProvider(providers).getNetwork()).chainId),\n metadataUri: nft.metadata_url ?? undefined,\n supply: `0x${supply.toString(16)}`,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n if (implementation !== contract) {\n fields.implementation = implementation\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xylabs/axios'\n\ninterface OpenSeaNFT {\n collection: string\n contract: string\n created_at: string\n description: string | null\n identifier: string\n image_url: string | null\n is_disabled: boolean\n is_nsfw: boolean\n metadata_url: string | null\n name: string | null\n token_standard: string\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, 'No opensea key found')\n\n const axios = new AxiosJson({ headers: { 'x-api-key': apiKey }, timeout })\n\n const nfts = (await axios.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data\n .nfts\n return nfts\n}\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { AxiosJson } from '@xylabs/axios'\nimport { NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\nimport parseDataUrl from 'parse-data-url'\n\nimport { isErc721, isErc1155 } from './tokenTypes'\n\n/*const baseUrlAbi = [\n {\n inputs: [],\n name: 'baseUrl',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n]*/\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n load = false,\n defaultUri?: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n let uri721: string | undefined = undefined\n const is721 = await isErc721(provider, contractAddress)\n if (is721) {\n try {\n uri721 = await storage721.tokenURI(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage721.tokenURI(tokenId) failed`)\n }\n }\n\n /*let baseUrl: string | undefined = undefined\n if (is721) {\n try {\n const baseUrlContract = new Contract(contractAddress, baseUrlAbi, provider)\n baseUrl = await baseUrlContract.bareUrl()\n } catch (ex) {\n const error = ex as Error\n console.error(`baseUrl[${error.name}][${contractAddress}]: baseUrl() failed`)\n }\n }\n\n if (baseUrl && !uri721?.startsWith(baseUrl)) {\n uri721 = `${baseUrl}${uri721 ?? tokenId}`\n }\n */\n\n let uri1155: string | undefined = undefined\n if (!uri721) {\n const is1155 = await isErc1155(provider, contractAddress)\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage1155.uri(tokenId) failed`)\n //console.log(error.message)\n }\n }\n }\n\n const tokenMetadataUri = uri721 || uri1155 || defaultUri\n let metadata: NftMetadata | undefined = undefined\n if (load) {\n if (tokenMetadataUri?.startsWith('data:')) {\n const parsedDataUrl = parseDataUrl(tokenMetadataUri)\n if (parsedDataUrl !== false && parsedDataUrl.contentType === 'application/json') {\n const buf = parsedDataUrl.toBuffer()\n const value = buf.toString('utf8')\n metadata = JSON.parse(value)\n }\n } else {\n let checkedMetaDataUri: string | undefined\n /*if (tokenMetadataUri && tokenMetadataUri.length < 5) {\n console.log(`tokenMetadataUri [<5][${contractAddress}]: ${tokenMetadataUri}`)\n console.log(`tokenMetadataUri [uri721]: ${uri721}`)\n console.log(`tokenMetadataUri [uri1155]: ${uri1155}`)\n console.log(`tokenMetadataUri [defaultUri]: ${defaultUri}`)\n }*/\n const axios = new AxiosJson({ timeout: 5000 })\n try {\n if (tokenMetadataUri && tokenMetadataUri.length) {\n checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n }\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch (ex) {\n try {\n metadata = defaultUri ? (await axios.get(defaultUri)).data : undefined\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadata: ${error.message}`)\n }\n }\n }\n }\n\n return [tokenMetadataUri, metadata]\n}\n","import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","import { Provider } from 'ethers'\n\nexport const getProvider = (providers: Provider[]) => {\n return providers[Date.now() % providers.length] //pick a random provider\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,oCAA0B;AAC1B,2BAAiC;AACjC,+BAAuE;;;ACFvE,IAAAC,iBAAyB;AACzB,yBAA2B;AAC3B,uCAOO;AACP,IAAAC,sCAAmE;;;ACVnE,oBAAyB;AAGlB,IAAM,uBAAuB,OAAO,UAAoB,SAAiB,mBAA8B,kBAA4B;AACxI,MAAI;AACF,UAAM,WAAW,MAAM,SAAS,QAAQ,SAAS,QAAQ;AACzD,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,YAAM,eAAW,wBAAS,kBAAkB,YAAY,cAAc,CAAC,CAAC,GAAG,UAAU,iCAAiC;AACtH,UAAI,CAAC,SAAS,SAAS,SAAS,UAAU,CAAC,CAAC,GAAG;AAC7C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,IAAI;AACX,UAAM,QAAQ;AACd,YAAQ,IAAI,KAAK;AACjB,WAAO;AAAA,EACT;AACF;;;ACnBA,iBAA0B;AAC1B,wCAAiC;AACjC,wCAAiC;AAEjC,IAAAC,kCAA0E;AAE1E,uBAAyB;;;ACNzB,IAAAC,iBAAyB;AACzB,mBAA0B;AAiBnB,IAAM,+BAA+B,OAAO,SAAiB,UAAU,KAAK,UAAU,QAAS;AACpG,QAAM,aAAS,yBAAS,QAAQ,IAAI,iBAAiB,sBAAsB;AAE3E,QAAM,QAAQ,IAAI,uBAAU,EAAE,SAAS,EAAE,aAAa,OAAO,GAAG,QAAQ,CAAC;AAEzE,QAAM,QAAQ,MAAM,MAAM,IAA4B,wDAAwD,OAAO,eAAe,OAAO,EAAE,GAAG,KAC7I;AACH,SAAO;AACT;;;ACxBA,IAAAC,gBAA0B;AAE1B,IAAAC,kCAAsE;AACtE,yCAA6B;AAE7B,4BAAyB;;;ACNzB,qCAAqE;AAK9D,IAAM,YAAY,OAAO,UAAoB,YAAoB;AACtE,SAAO,MAAM,qBAAqB,UAAU,SAAS,0DAA2B,gBAAgB,GAAG,CAAC,KAAK,CAAC;AAC5G;AAEO,IAAM,WAAW,OAAO,UAAoB,YAAoB;AACrE,SAAO,MAAM,qBAAqB,UAAU,SAAS,wDAAyB,gBAAgB,GAAG,CAAC,QAAQ,UAAU,UAAU,CAAC;AACjI;AAEO,IAAM,aAAa,OAAO,UAAoB,YAAoB;AACvE,QAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,SAAS,UAAU,OAAO,GAAG,UAAU,UAAU,OAAO,CAAC,CAAC;AACvG,QAAM,SAAsB,CAAC;AAC7B,MAAI,QAAQ;AACV,WAAO,KAAK,QAAQ;AAAA,EACtB;AACA,MAAI,SAAS;AACX,WAAO,KAAK,SAAS;AAAA,EACvB;AACA,SAAO;AACT;;;ADGA,IAAM,cAAc;AAEb,IAAM,iBAAiB,OAI5B,iBAIA,UAMA,SACA,OAAO,OACP,eAC2D;AAC3D,QAAM,aAAa,0DAA0B,QAAQ,iBAAiB,QAAQ;AAC9E,QAAM,cAAc,2DAA2B,QAAQ,iBAAiB,QAAQ;AAEhF,MAAI,SAA6B;AACjC,QAAM,QAAQ,MAAM,SAAS,UAAU,eAAe;AACtD,MAAI,OAAO;AACT,QAAI;AACF,eAAS,MAAM,WAAW,SAAS,OAAO;AAAA,IAC5C,SAAS,IAAI;AAAA,IAGb;AAAA,EACF;AAkBA,MAAI,UAA8B;AAClC,MAAI,CAAC,QAAQ;AACX,UAAM,SAAS,MAAM,UAAU,UAAU,eAAe;AACxD,QAAI,QAAQ;AACV,UAAI;AACF,kBAAU,MAAM,YAAY,IAAI,OAAO;AAAA,MACzC,SAAS,IAAI;AAAA,MAIb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,UAAU,WAAW;AAC9C,MAAI,WAAoC;AACxC,MAAI,MAAM;AACR,QAAI,kBAAkB,WAAW,OAAO,GAAG;AACzC,YAAM,oBAAgB,sBAAAC,SAAa,gBAAgB;AACnD,UAAI,kBAAkB,SAAS,cAAc,gBAAgB,oBAAoB;AAC/E,cAAM,MAAM,cAAc,SAAS;AACnC,cAAM,QAAQ,IAAI,SAAS,MAAM;AACjC,mBAAW,KAAK,MAAM,KAAK;AAAA,MAC7B;AAAA,IACF,OAAO;AACL,UAAI;AAOJ,YAAM,QAAQ,IAAI,wBAAU,EAAE,SAAS,IAAK,CAAC;AAC7C,UAAI;AACF,YAAI,oBAAoB,iBAAiB,QAAQ;AAC/C,+BAAqB,uBAAmB,iDAAa,kBAAkB,WAAW,IAAI;AAAA,QACxF;AACA,mBAAW,sBAAsB,MAAM,MAAM,IAAI,kBAAkB,GAAG,OAAO;AAAA,MAC/E,SAAS,IAAI;AACX,YAAI;AACF,qBAAW,cAAc,MAAM,MAAM,IAAI,UAAU,GAAG,OAAO;AAAA,QAC/D,SAASC,KAAI;AAAA,QAGb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,kBAAkB,QAAQ;AACpC;;;AE7HO,IAAM,cAAc,CAAC,cAA0B;AACpD,SAAO,UAAU,KAAK,IAAI,IAAI,UAAU,MAAM;AAChD;;;ACJO,IAAM,UAAU,OAAU,MAAwB,SAA0C;AACjG,MAAI;AACF,WAAO,MAAM,KAAK;AAAA,EACpB,SAAS,IAAI;AACX,QAAI,MAAM;AACR,YAAM,QAAQ;AACd,cAAQ,IAAI,mBAAmB,IAAI,MAAM,MAAM,OAAO,EAAE;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AACF;;;ALIA,IAAM,iBAAiB,IAAI,0BAA8B,EAAE,KAAK,IAAI,CAAC;AAE9D,IAAM,gBAAgB,OAAO,UAAoB,YAAoB;AAC1E,QAAM,MAAM,GAAG,OAAO,KAAK,MAAM,SAAS,WAAW,GAAG,OAAO;AAC/D,QAAM,eAAe,eAAe,IAAI,GAAG;AAC3C,MAAI,cAAc;AAChB,WAAO;AAAA,EACT,OAAO;AACL,UAAM,QAAQ,MAAM,WAAW,UAAU,OAAO;AAChD,mBAAe,IAAI,KAAK,KAAK;AAC7B,WAAO;AAAA,EACT;AACF;AAEO,IAAM,uBAAuB,OAClC,SACA,SACA,aACqD;AACrD,MAAI;AACF,UAAM,WAAW,gDAAgB,QAAQ,SAAS,QAAQ;AAC1D,WAAO,CAAC,MAAM,SAAS,SAAS,OAAO,GAAG,MAAS;AAAA,EACrD,SAAS,IAAI;AACX,WAAO,CAAC,QAAW,EAAW;AAAA,EAChC;AACF;AAEO,IAAM,wBAAwB,OACnC,SACA,SACA,aACqD;AACrD,MAAI;AACF,UAAM,WAAW,iDAAiB,QAAQ,SAAS,QAAQ;AAC3D,WAAO,CAAC,MAAM,SAAS,IAAI,OAAO,GAAG,MAAS;AAAA,EAChD,SAAS,IAAI;AACX,WAAO,CAAC,QAAW,EAAW;AAAA,EAChC;AACF;AAEO,IAAM,oBAAoB,OAAO,SAAiB,SAAiB,aAAuB;AAC/F,QAAM,UAAU,MAAM,QAAQ,IAAI,CAAC,qBAAqB,SAAS,SAAS,QAAQ,GAAG,sBAAsB,SAAS,SAAS,QAAQ,CAAC,CAAC;AACvI,SAAO,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;AACtC;AAEO,IAAM,oCAAoC,OAE/C,eAEA,WAEA,UAAU,KAEV,UAAU,QACmB;AAC7B,QAAM,OAAO,MAAM,sBAAsB,eAAe,WAAW,SAAS,OAAO;AACnF,QAAM,YAAY,MAAM,QAAQ;AAAA;AAAA,IAE9B,KAAK,IAAI,OAAO,QAAQ;AACtB,UAAI;AACF,YAAI,CAAC,IAAI,eAAe,CAAC,IAAI,UAAU;AACrC,gBAAM,CAAC,aAAa,QAAQ,IAAI,MAAM;AAAA,YACpC,IAAI,kBAAkB,IAAI;AAAA,YAC1B,YAAY,SAAS;AAAA,YACrB,IAAI;AAAA,YACJ;AAAA,YACA,IAAI;AAAA,UACN;AACA,cAAI,WAAW,IAAI,YAAY;AAC/B,cAAI,cAAc,IAAI,eAAe;AAAA,QACvC;AACA,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,gBAAQ,MAAM,UAAU,MAAM,OAAO,EAAE;AACvC,gBAAQ,MAAM,GAAG,MAAM,KAAK,EAAE;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,wBAAwB,OAEnC,eAEA,WAEA,UAAU,KAEV,UAAU,QACmB;AAE7B,QAAM,OAAO,MAAM,6BAA6B,eAAe,SAAS,OAAO;AAE/E,QAAM,YAAY,MAAM,QAAQ;AAAA;AAAA,IAE9B,KAAK,IAAI,OAAO,QAAQ;AACtB,UAAI;AACF,cAAM,EAAE,UAAU,WAAW,IAAI;AACjC,cAAM,WAAW,YAAY,SAAS;AAEtC,cAAM,QAAQ,MAAM,SAAS,eAAe;AAG5C,cAAM,gBAAgB,UAAM,oDAAiB,UAAU,UAAU,KAAK;AAGtE,cAAM,gBAAgB,UAAM,oDAAiB,UAAU,UAAU,KAAK;AAEtE,cAAM,iBACJ,CAAC,cAAc,MAAM,sBAAkB,sBAAU,cAAc,MAAM,cAAc,IAC/E,cAAc,iBACd,cAAc;AAEpB,YAAI,SAAS;AACb,cAAM,QAAQ,MAAM,cAAc,UAAU,cAAc;AAC1D,YAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,gBAAM,aAAa,uDAAuB,QAAQ,gBAAgB,YAAY,SAAS,CAAC;AACxF,mBAAU,MAAM,QAAQ,YAAY,MAAM,WAAW,sBAAsB,EAAE,cAAc,OAAO,CAAC,KAAM;AAAA,QAC3G;AACA,cAAM,SAAwB;AAAA,UAC5B,SAAS;AAAA,UACT,SAAS,QAAQ,MAAM,YAAY,SAAS,EAAE,WAAW,GAAG,OAAO;AAAA,UACnE,aAAa,IAAI,gBAAgB;AAAA,UACjC,QAAQ,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,UAChC,SAAS;AAAA,UACT,MAAM,MAAM,GAAG,CAAC;AAAA,UAChB;AAAA,QACF;AACA,YAAI,mBAAmB,UAAU;AAC/B,iBAAO,iBAAiB;AAAA,QAC1B;AACA,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,gBAAQ,MAAM,UAAU,MAAM,OAAO,EAAE;AACvC,gBAAQ,MAAM,GAAG,MAAM,KAAK,EAAE;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AF/IA,IAAM,SAAS;AAEf,IAAM,iBAAiB;AAEhB,IAAM,yBAAN,cAAkH,8DAIvH;AAAA,EACA,OAAgB,gBAAgB,CAAC,uDAAsB;AAAA,EAEvD,IAAI,eAAe;AACjB,WAAO,KAAK,OAAO,gBAAgB;AAAA,EACrC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO,WAAW;AAAA,EAChC;AAAA,EAEA,MAAyB,eAAe,UAAkD;AACxF,UAAM,KAAK,QAAQ,OAAO;AAC1B,UAAM,UAAU,UAAU,OAAO,kDAAiB,KAAK,CAAC;AAExD,UAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,QAAI;AACF,YAAM,eAAe,MAAM,QAAQ;AAAA,QACjC,QAAQ,IAAI,OAAO,UAAU;AAC3B,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAClD,gBAAM,mBAAe,yBAAS,OAAO,WAAW,KAAK,OAAO,SAAS,4BAA4B;AACjG,gBAAM,qBAAqB,8BAAW,MAAM,YAAY;AACxD,gBAAM,cAAU,yBAAS,oBAAoB,SAAS,GAAG,gCAAgC;AACzF,gBAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,gBAAM,cAAU,yBAAS,QAAQ,SAAS,4BAA4B;AACtE,gBAAM,UAAU,OAAO,WAAW;AAClC,cAAI;AACF,kBAAM,OAAO,KAAK,eACd,MAAM,kCAAkC,SAAS,WAAW,SAAS,KAAK,OAAO,IACjF,MAAM,sBAAsB,SAAS,WAAW,SAAS,KAAK,OAAO;AACzE,kBAAM,cAAc,KAAK,IAAa,CAAC,QAAQ;AAC7C,qBAAO,EAAE,GAAG,KAAK,OAAO;AAAA,YAC1B,CAAC;AACD,mBAAO;AAAA,UACT,SAAS,IAAI;AACX,kBAAM,QAAQ;AACd,kBAAM,MAAM,kCAAkC,OAAO,eAAe,OAAO,KAAK,MAAM,OAAO,EAAE;AAAA,UACjG;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,aAAa,KAAK;AAAA,IAC3B,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,MAAM,KAAK;AACnB,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;;;ADjEO,IAAM,+BAA+B,UAC1C;AAAA,EACE,EAAE,UAAU,EAAE,CAAC,2CAAS,GAAG,EAAE,GAAG,QAAQ,sCAAiB;AAAA,EACzD;AAAA,IACE,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,uBAAuB,OAAO,MAAM;AACzD,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ADPF,IAAO,cAAQ;","names":["import_crypto_nft_payload_plugin","import_assert","import_witness_blockchain_abstract","import_open_zeppelin_typechain","import_assert","import_axios","import_open_zeppelin_typechain","parseDataUrl","ex"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.ts","../../src/lib/getNftsFromWalletFromOpenSea.ts","../../src/lib/getProvider.ts","../../src/lib/tryCall.ts"],"sourcesContent":["import { CryptoWalletNftWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoWalletNftWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoWalletNftWitnessPlugin\n","import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoWalletNftWitness } from './Witness'\n\nexport const CryptoWalletNftWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoWalletNftWitness> =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n CryptoWalletNftWitnessConfig,\n isNftWitnessQuery,\n NftInfo,\n NftSchema,\n NftWitnessConfigSchema,\n NftWitnessQuery,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractBlockchainWitness, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = BlockchainWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractBlockchainWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override configSchemas = [NftWitnessConfigSchema]\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n //calling it here to make sure we rests the cache\n const providers = await this.getProviders()\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const provider = await this.getProvider(true, true)\n const addressValue = assertEx(query?.address ?? this.config.address, 'params.address is required')\n const parsedAddressValue = EthAddress.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), 'Failed to parse params.address')\n const network = await provider.getNetwork()\n const chainId = assertEx(network.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n try {\n const nfts = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`)\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (let i = 0; i < functionNames.length; i++) {\n const selector = assertEx(contractInterface.getFunction(functionNames[i])?.selector, 'Function not found on interface')\n if (!bytecode.includes(selector.substring(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { isHexZero } from '@xylabs/hex'\nimport { getErc1822Status } from '@xyo-network/blockchain-erc1822-witness'\nimport { getErc1967Status } from '@xyo-network/blockchain-erc1967-witness'\nimport { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\nimport { LRUCache } from 'lru-cache'\n\nimport { getNftMetadata } from './getNftMetadata'\nimport { getNftsFromWalletFromOpenSea } from './getNftsFromWalletFromOpenSea'\nimport { getProvider } from './getProvider'\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const key = `${address}|${(await provider.getNetwork()).chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n } else {\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n }\n}\n\nexport const getErc721MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, provider)\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, provider)\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string, provider: Provider) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout)\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n if (!nft.metadataUri || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(\n nft.implementation ?? nft.address,\n getProvider(providers),\n nft.tokenId,\n true,\n nft.metadataUri,\n )\n nft.metadata = nft.metadata ?? metadata\n nft.metadataUri = nft.metadataUri ?? metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n //const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n const { contract, identifier, metadata_url } = nft\n const provider = getProvider(providers)\n\n const block = await provider.getBlockNumber()\n\n // Check if Upgradeable\n const [erc1967Status, erc1822Status] = await Promise.all([\n // Check if ERC-1967 Upgradeable\n await getErc1967Status(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822Status(provider, contract, block),\n ])\n\n const implementation =\n !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n let supply = 1n\n const types = await getTokenTypes(provider, implementation)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers))\n supply = (await tryCall(async () => await supply1155['totalSupply(uint256)'](erc1967Status.address))) ?? 1n\n }\n const fields: NftInfoFields = {\n address: contract,\n chainId: Number((await provider.getNetwork()).chainId),\n metadataUri: metadata_url ?? undefined,\n supply: `0x${supply.toString(16)}`,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n if (implementation !== contract) {\n fields.implementation = implementation\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { AxiosJson } from '@xylabs/axios'\nimport { NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\nimport parseDataUrl from 'parse-data-url'\n\nimport { isErc721, isErc1155 } from './tokenTypes'\n\n/*const baseUrlAbi = [\n {\n inputs: [],\n name: 'baseUrl',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n]*/\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n load = false,\n defaultUri?: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n let uri721: string | undefined = undefined\n const is721 = await isErc721(provider, contractAddress)\n if (is721) {\n try {\n uri721 = await storage721.tokenURI(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage721.tokenURI(tokenId) failed`)\n }\n }\n\n /*let baseUrl: string | undefined = undefined\n if (is721) {\n try {\n const baseUrlContract = new Contract(contractAddress, baseUrlAbi, provider)\n baseUrl = await baseUrlContract.bareUrl()\n } catch (ex) {\n const error = ex as Error\n console.error(`baseUrl[${error.name}][${contractAddress}]: baseUrl() failed`)\n }\n }\n\n if (baseUrl && !uri721?.startsWith(baseUrl)) {\n uri721 = `${baseUrl}${uri721 ?? tokenId}`\n }\n */\n\n let uri1155: string | undefined = undefined\n if (!uri721) {\n const is1155 = await isErc1155(provider, contractAddress)\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage1155.uri(tokenId) failed`)\n //console.log(error.message)\n }\n }\n }\n\n const tokenMetadataUri = uri721 || uri1155 || defaultUri\n let metadata: NftMetadata | undefined = undefined\n if (load) {\n if (tokenMetadataUri?.startsWith('data:')) {\n const parsedDataUrl = parseDataUrl(tokenMetadataUri)\n if (parsedDataUrl !== false && parsedDataUrl.contentType === 'application/json') {\n const buf = parsedDataUrl.toBuffer()\n const value = buf.toString('utf8')\n metadata = JSON.parse(value)\n }\n } else {\n let checkedMetaDataUri: string | undefined\n /*if (tokenMetadataUri && tokenMetadataUri.length < 5) {\n console.log(`tokenMetadataUri [<5][${contractAddress}]: ${tokenMetadataUri}`)\n console.log(`tokenMetadataUri [uri721]: ${uri721}`)\n console.log(`tokenMetadataUri [uri1155]: ${uri1155}`)\n console.log(`tokenMetadataUri [defaultUri]: ${defaultUri}`)\n }*/\n const axios = new AxiosJson({ timeout: 5000 })\n try {\n if (tokenMetadataUri && tokenMetadataUri.length) {\n checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n }\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch (ex) {\n try {\n metadata = defaultUri ? (await axios.get(defaultUri)).data : undefined\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadata: ${error.message}`)\n }\n }\n }\n }\n\n return [tokenMetadataUri, metadata]\n}\n","import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xylabs/axios'\n\ninterface OpenSeaNFT {\n /*\n * Collection slug. A unique string to identify a collection on OpenSea\n */\n collection: string\n /*\n * The unique public blockchain identifier for the contract\n */\n contract: string\n /**\n * @deprecated\n */\n created_at: string\n /*\n * Description of the NFT\n */\n description: string | null\n /*\n * The NFT's unique identifier within the smart contract (also referred to as token_id)\n */\n identifier: string\n /*\n * Link to the image associated with the NFT\n */\n image_url: string | null\n /*\n * If the item is currently able to be bought or sold using OpenSea\n */\n is_disabled: boolean\n /*\n * If the item is currently classified as 'Not Safe for Work' by OpenSea as defined in OpenSea's NSFW Policy.\n */\n is_nsfw: boolean\n /*\n * Link to the offchain metadata store\n */\n metadata_url: string | null\n /*\n * Name of the NFT\n */\n name: string | null\n /*\n * ERC standard of the token (erc721, erc1155)\n */\n token_standard: string\n /*\n * Last time that the NFT's metadata was updated by OpenSea\n */\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, 'No opensea key found')\n\n const axios = new AxiosJson({ headers: { 'x-api-key': apiKey }, timeout })\n\n const nfts = (await axios.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data\n .nfts\n return nfts\n}\n","import { Provider } from 'ethers'\n\nexport const getProvider = (providers: Provider[]) => {\n return providers[Date.now() % providers.length] //pick a random provider\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n"],"mappings":"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","names":["import_crypto_nft_payload_plugin","import_assert","import_witness_blockchain_abstract","import_open_zeppelin_typechain","import_open_zeppelin_typechain","parseDataUrl","ex","import_assert","import_axios"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -40,18 +40,8 @@ import { getErc1967Status } from "@xyo-network/blockchain-erc1967-witness";
|
|
|
40
40
|
import { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from "@xyo-network/open-zeppelin-typechain";
|
|
41
41
|
import { LRUCache } from "lru-cache";
|
|
42
42
|
|
|
43
|
-
// src/lib/getAssetsFromWalletFromOpenSea.ts
|
|
44
|
-
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
45
|
-
import { AxiosJson } from "@xylabs/axios";
|
|
46
|
-
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
47
|
-
const apiKey = assertEx2(process.env.OPENSEA_API_KEY, "No opensea key found");
|
|
48
|
-
const axios = new AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
|
|
49
|
-
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
50
|
-
return nfts;
|
|
51
|
-
};
|
|
52
|
-
|
|
53
43
|
// src/lib/getNftMetadata.ts
|
|
54
|
-
import { AxiosJson
|
|
44
|
+
import { AxiosJson } from "@xylabs/axios";
|
|
55
45
|
import { ERC721URIStorage__factory, ERC1155URIStorage__factory as ERC1155URIStorage__factory2 } from "@xyo-network/open-zeppelin-typechain";
|
|
56
46
|
import { checkIpfsUrl } from "@xyo-network/witness-blockchain-abstract";
|
|
57
47
|
import parseDataUrl from "parse-data-url";
|
|
@@ -111,7 +101,7 @@ var getNftMetadata = async (contractAddress, provider, tokenId, load = false, de
|
|
|
111
101
|
}
|
|
112
102
|
} else {
|
|
113
103
|
let checkedMetaDataUri;
|
|
114
|
-
const axios = new
|
|
104
|
+
const axios = new AxiosJson({ timeout: 5e3 });
|
|
115
105
|
try {
|
|
116
106
|
if (tokenMetadataUri && tokenMetadataUri.length) {
|
|
117
107
|
checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri;
|
|
@@ -128,6 +118,16 @@ var getNftMetadata = async (contractAddress, provider, tokenId, load = false, de
|
|
|
128
118
|
return [tokenMetadataUri, metadata];
|
|
129
119
|
};
|
|
130
120
|
|
|
121
|
+
// src/lib/getNftsFromWalletFromOpenSea.ts
|
|
122
|
+
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
123
|
+
import { AxiosJson as AxiosJson2 } from "@xylabs/axios";
|
|
124
|
+
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
125
|
+
const apiKey = assertEx2(process.env.OPENSEA_API_KEY, "No opensea key found");
|
|
126
|
+
const axios = new AxiosJson2({ headers: { "x-api-key": apiKey }, timeout });
|
|
127
|
+
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
128
|
+
return nfts;
|
|
129
|
+
};
|
|
130
|
+
|
|
131
131
|
// src/lib/getProvider.ts
|
|
132
132
|
var getProvider = (providers) => {
|
|
133
133
|
return providers[Date.now() % providers.length];
|
|
@@ -182,7 +182,6 @@ var getNftMetadataUri = async (address, tokenId, provider) => {
|
|
|
182
182
|
var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts = 200, timeout = 5e3) => {
|
|
183
183
|
const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout);
|
|
184
184
|
const nftResult = await Promise.all(
|
|
185
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
186
185
|
nfts.map(async (nft) => {
|
|
187
186
|
try {
|
|
188
187
|
if (!nft.metadataUri || !nft.metadata) {
|
|
@@ -210,14 +209,17 @@ var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts
|
|
|
210
209
|
var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, timeout = 5e3) => {
|
|
211
210
|
const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout);
|
|
212
211
|
const nftResult = await Promise.all(
|
|
213
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
214
212
|
nfts.map(async (nft) => {
|
|
215
213
|
try {
|
|
216
|
-
const { contract, identifier } = nft;
|
|
214
|
+
const { contract, identifier, metadata_url } = nft;
|
|
217
215
|
const provider = getProvider(providers);
|
|
218
216
|
const block = await provider.getBlockNumber();
|
|
219
|
-
const erc1967Status = await
|
|
220
|
-
|
|
217
|
+
const [erc1967Status, erc1822Status] = await Promise.all([
|
|
218
|
+
// Check if ERC-1967 Upgradeable
|
|
219
|
+
await getErc1967Status(provider, contract, block),
|
|
220
|
+
// Check if ERC-1822 Upgradeable
|
|
221
|
+
await getErc1822Status(provider, contract, block)
|
|
222
|
+
]);
|
|
221
223
|
const implementation = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
|
|
222
224
|
let supply = 1n;
|
|
223
225
|
const types = await getTokenTypes(provider, implementation);
|
|
@@ -227,8 +229,8 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
227
229
|
}
|
|
228
230
|
const fields = {
|
|
229
231
|
address: contract,
|
|
230
|
-
chainId: Number((await
|
|
231
|
-
metadataUri:
|
|
232
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
233
|
+
metadataUri: metadata_url ?? void 0,
|
|
232
234
|
supply: `0x${supply.toString(16)}`,
|
|
233
235
|
tokenId: identifier,
|
|
234
236
|
type: types.at(0),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getAssetsFromWalletFromOpenSea.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.ts","../../src/lib/getProvider.ts","../../src/lib/tryCall.ts","../../src/index.ts"],"sourcesContent":["import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoWalletNftWitness } from './Witness'\n\nexport const CryptoWalletNftWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoWalletNftWitness> =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n CryptoWalletNftWitnessConfig,\n isNftWitnessQuery,\n NftInfo,\n NftSchema,\n NftWitnessConfigSchema,\n NftWitnessQuery,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractBlockchainWitness, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = BlockchainWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractBlockchainWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override configSchemas = [NftWitnessConfigSchema]\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n //calling it here to make sure we rests the cache\n const providers = await this.getProviders()\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const provider = await this.getProvider(true, true)\n const addressValue = assertEx(query?.address ?? this.config.address, 'params.address is required')\n const parsedAddressValue = EthAddress.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), 'Failed to parse params.address')\n const network = await provider.getNetwork()\n const chainId = assertEx(network.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n try {\n const nfts = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`)\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (let i = 0; i < functionNames.length; i++) {\n const selector = assertEx(contractInterface.getFunction(functionNames[i])?.selector, 'Function not found on interface')\n if (!bytecode.includes(selector.substring(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { isHexZero } from '@xylabs/hex'\nimport { getErc1822Status } from '@xyo-network/blockchain-erc1822-witness'\nimport { getErc1967Status } from '@xyo-network/blockchain-erc1967-witness'\nimport { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\nimport { LRUCache } from 'lru-cache'\n\nimport { getNftsFromWalletFromOpenSea } from './getAssetsFromWalletFromOpenSea'\nimport { getNftMetadata } from './getNftMetadata'\nimport { getProvider } from './getProvider'\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const key = `${address}|${(await provider.getNetwork()).chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n } else {\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n }\n}\n\nexport const getErc721MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, provider)\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, provider)\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string, provider: Provider) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout)\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nfts.map(async (nft) => {\n try {\n if (!nft.metadataUri || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(\n nft.implementation ?? nft.address,\n getProvider(providers),\n nft.tokenId,\n true,\n nft.metadataUri,\n )\n nft.metadata = nft.metadata ?? metadata\n nft.metadataUri = nft.metadataUri ?? metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n //const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n nfts.map(async (nft) => {\n try {\n const { contract, identifier } = nft\n const provider = getProvider(providers)\n\n const block = await provider.getBlockNumber()\n\n //Check if ERC-1967 Upgradeable\n const erc1967Status = await getErc1967Status(provider, contract, block)\n\n //Check if ERC-1822 Upgradeable\n const erc1822Status = await getErc1822Status(provider, contract, block)\n\n const implementation =\n !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n let supply = 1n\n const types = await getTokenTypes(provider, implementation)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers))\n supply = (await tryCall(async () => await supply1155['totalSupply(uint256)'](erc1967Status.address))) ?? 1n\n }\n const fields: NftInfoFields = {\n address: contract,\n chainId: Number((await getProvider(providers).getNetwork()).chainId),\n metadataUri: nft.metadata_url ?? undefined,\n supply: `0x${supply.toString(16)}`,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n if (implementation !== contract) {\n fields.implementation = implementation\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xylabs/axios'\n\ninterface OpenSeaNFT {\n collection: string\n contract: string\n created_at: string\n description: string | null\n identifier: string\n image_url: string | null\n is_disabled: boolean\n is_nsfw: boolean\n metadata_url: string | null\n name: string | null\n token_standard: string\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, 'No opensea key found')\n\n const axios = new AxiosJson({ headers: { 'x-api-key': apiKey }, timeout })\n\n const nfts = (await axios.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data\n .nfts\n return nfts\n}\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { AxiosJson } from '@xylabs/axios'\nimport { NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\nimport parseDataUrl from 'parse-data-url'\n\nimport { isErc721, isErc1155 } from './tokenTypes'\n\n/*const baseUrlAbi = [\n {\n inputs: [],\n name: 'baseUrl',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n]*/\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n load = false,\n defaultUri?: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n let uri721: string | undefined = undefined\n const is721 = await isErc721(provider, contractAddress)\n if (is721) {\n try {\n uri721 = await storage721.tokenURI(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage721.tokenURI(tokenId) failed`)\n }\n }\n\n /*let baseUrl: string | undefined = undefined\n if (is721) {\n try {\n const baseUrlContract = new Contract(contractAddress, baseUrlAbi, provider)\n baseUrl = await baseUrlContract.bareUrl()\n } catch (ex) {\n const error = ex as Error\n console.error(`baseUrl[${error.name}][${contractAddress}]: baseUrl() failed`)\n }\n }\n\n if (baseUrl && !uri721?.startsWith(baseUrl)) {\n uri721 = `${baseUrl}${uri721 ?? tokenId}`\n }\n */\n\n let uri1155: string | undefined = undefined\n if (!uri721) {\n const is1155 = await isErc1155(provider, contractAddress)\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage1155.uri(tokenId) failed`)\n //console.log(error.message)\n }\n }\n }\n\n const tokenMetadataUri = uri721 || uri1155 || defaultUri\n let metadata: NftMetadata | undefined = undefined\n if (load) {\n if (tokenMetadataUri?.startsWith('data:')) {\n const parsedDataUrl = parseDataUrl(tokenMetadataUri)\n if (parsedDataUrl !== false && parsedDataUrl.contentType === 'application/json') {\n const buf = parsedDataUrl.toBuffer()\n const value = buf.toString('utf8')\n metadata = JSON.parse(value)\n }\n } else {\n let checkedMetaDataUri: string | undefined\n /*if (tokenMetadataUri && tokenMetadataUri.length < 5) {\n console.log(`tokenMetadataUri [<5][${contractAddress}]: ${tokenMetadataUri}`)\n console.log(`tokenMetadataUri [uri721]: ${uri721}`)\n console.log(`tokenMetadataUri [uri1155]: ${uri1155}`)\n console.log(`tokenMetadataUri [defaultUri]: ${defaultUri}`)\n }*/\n const axios = new AxiosJson({ timeout: 5000 })\n try {\n if (tokenMetadataUri && tokenMetadataUri.length) {\n checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n }\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch (ex) {\n try {\n metadata = defaultUri ? (await axios.get(defaultUri)).data : undefined\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadata: ${error.message}`)\n }\n }\n }\n }\n\n return [tokenMetadataUri, metadata]\n}\n","import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","import { Provider } from 'ethers'\n\nexport const getProvider = (providers: Provider[]) => {\n return providers[Date.now() % providers.length] //pick a random provider\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n","import { CryptoWalletNftWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoWalletNftWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoWalletNftWitnessPlugin\n"],"mappings":"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","names":["NftSchema","assertEx","assertEx","AxiosJson","ERC1155URIStorage__factory","ERC1155URIStorage__factory","AxiosJson","ex","assertEx","NftSchema"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Plugin.ts","../../src/Witness.ts","../../src/lib/contractHasFunctions.ts","../../src/lib/getNftsOwnedByAddress.ts","../../src/lib/getNftMetadata.ts","../../src/lib/tokenTypes.ts","../../src/lib/getNftsFromWalletFromOpenSea.ts","../../src/lib/getProvider.ts","../../src/lib/tryCall.ts","../../src/index.ts"],"sourcesContent":["import { NftSchema } from '@xyo-network/crypto-nft-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetWitnessPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoWalletNftWitness } from './Witness'\n\nexport const CryptoWalletNftWitnessPlugin = (): PayloadSetWitnessPlugin<CryptoWalletNftWitness> =>\n createPayloadSetWitnessPlugin<CryptoWalletNftWitness>(\n { required: { [NftSchema]: 1 }, schema: PayloadSetSchema },\n {\n witness: async (params) => {\n const result = await CryptoWalletNftWitness.create(params)\n return result\n },\n },\n )\n","import { assertEx } from '@xylabs/assert'\nimport { EthAddress } from '@xylabs/eth-address'\nimport {\n CryptoWalletNftWitnessConfig,\n isNftWitnessQuery,\n NftInfo,\n NftSchema,\n NftWitnessConfigSchema,\n NftWitnessQuery,\n} from '@xyo-network/crypto-nft-payload-plugin'\nimport { AbstractBlockchainWitness, BlockchainWitnessParams } from '@xyo-network/witness-blockchain-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = BlockchainWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractBlockchainWitness<\n TParams,\n NftWitnessQuery,\n NftInfo\n> {\n static override configSchemas = [NftWitnessConfigSchema]\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10000\n }\n\n protected override async observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]> {\n await this.started('throw')\n const queries = payloads?.filter(isNftWitnessQuery) ?? []\n //calling it here to make sure we rests the cache\n const providers = await this.getProviders()\n try {\n const observations = await Promise.all(\n queries.map(async (query) => {\n const provider = await this.getProvider(true, true)\n const addressValue = assertEx(query?.address ?? this.config.address, 'params.address is required')\n const parsedAddressValue = EthAddress.parse(addressValue)\n const address = assertEx(parsedAddressValue?.toString(), 'Failed to parse params.address')\n const network = await provider.getNetwork()\n const chainId = assertEx(network.chainId, 'params.chainId is required')\n const maxNfts = query?.maxNfts || defaultMaxNfts\n try {\n const nfts = this.loadMetadata\n ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout)\n : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout)\n const observation = nfts.map<NftInfo>((nft) => {\n return { ...nft, schema }\n })\n return observation\n } catch (ex) {\n const error = ex as Error\n throw Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`)\n }\n }),\n )\n return observations.flat()\n } catch (ex) {\n const error = ex as Error\n console.error(error)\n return []\n }\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Interface, Provider } from 'ethers'\n\nexport const contractHasFunctions = async (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => {\n try {\n const bytecode = await provider.getCode(address, 'latest')\n for (let i = 0; i < functionNames.length; i++) {\n const selector = assertEx(contractInterface.getFunction(functionNames[i])?.selector, 'Function not found on interface')\n if (!bytecode.includes(selector.substring(2))) {\n return false\n }\n return true\n }\n return false\n } catch (ex) {\n const error = ex as Error\n console.log(error)\n return false\n }\n}\n","import { isHexZero } from '@xylabs/hex'\nimport { getErc1822Status } from '@xyo-network/blockchain-erc1822-witness'\nimport { getErc1967Status } from '@xyo-network/blockchain-erc1967-witness'\nimport { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721__factory, ERC1155__factory, ERC1155Supply__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\nimport { LRUCache } from 'lru-cache'\n\nimport { getNftMetadata } from './getNftMetadata'\nimport { getNftsFromWalletFromOpenSea } from './getNftsFromWalletFromOpenSea'\nimport { getProvider } from './getProvider'\nimport { tokenTypes } from './tokenTypes'\nimport { tryCall } from './tryCall'\n\nconst tokenTypeCache = new LRUCache<string, TokenType[]>({ max: 100 })\n\nexport const getTokenTypes = async (provider: Provider, address: string) => {\n const key = `${address}|${(await provider.getNetwork()).chainId}`\n const currentValue = tokenTypeCache.get(key)\n if (currentValue) {\n return currentValue\n } else {\n const types = await tokenTypes(provider, address)\n tokenTypeCache.set(key, types)\n return types\n }\n}\n\nexport const getErc721MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC721__factory.connect(address, provider)\n return [await contract.tokenURI(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getErc1155MetadataUri = async (\n address: string,\n tokenId: string,\n provider: Provider,\n): Promise<[string | undefined, Error | undefined]> => {\n try {\n const contract = ERC1155__factory.connect(address, provider)\n return [await contract.uri(tokenId), undefined]\n } catch (ex) {\n return [undefined, ex as Error]\n }\n}\n\nexport const getNftMetadataUri = async (address: string, tokenId: string, provider: Provider) => {\n const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)])\n return results[0][0] ?? results[1][0]\n}\n\nexport const getNftsOwnedByAddressWithMetadata = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 200,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout)\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n if (!nft.metadataUri || !nft.metadata) {\n const [metadataUri, metadata] = await getNftMetadata(\n nft.implementation ?? nft.address,\n getProvider(providers),\n nft.tokenId,\n true,\n nft.metadataUri,\n )\n nft.metadata = nft.metadata ?? metadata\n nft.metadataUri = nft.metadataUri ?? metadataUri\n }\n return nft\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n return nftResult\n}\n\nexport const getNftsOwnedByAddress = async (\n /** @param publicAddress The address of the wallet to search for NFTs */\n publicAddress: string,\n /** @param provider The provider to use for accessing the block chain */\n providers: Provider[],\n /** @param maxNfts The maximum number of NFTs to return. Configurable to prevent large wallets from exhausting Infura API credits. */\n maxNfts = 100,\n /** @param httpTimeout The connection timeout for http call to get metadata */\n timeout = 5000,\n): Promise<NftInfoFields[]> => {\n //const assets = await getAssetsFromWallet(publicAddress, maxNfts, timeout)\n const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout)\n\n const nftResult = await Promise.all(\n nfts.map(async (nft) => {\n try {\n const { contract, identifier, metadata_url } = nft\n const provider = getProvider(providers)\n\n const block = await provider.getBlockNumber()\n\n // Check if Upgradeable\n const [erc1967Status, erc1822Status] = await Promise.all([\n // Check if ERC-1967 Upgradeable\n await getErc1967Status(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822Status(provider, contract, block),\n ])\n\n const implementation =\n !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation)\n ? erc1822Status.implementation\n : erc1967Status.implementation\n\n let supply = 1n\n const types = await getTokenTypes(provider, implementation)\n if (types.includes('ERC1155')) {\n const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers))\n supply = (await tryCall(async () => await supply1155['totalSupply(uint256)'](erc1967Status.address))) ?? 1n\n }\n const fields: NftInfoFields = {\n address: contract,\n chainId: Number((await provider.getNetwork()).chainId),\n metadataUri: metadata_url ?? undefined,\n supply: `0x${supply.toString(16)}`,\n tokenId: identifier,\n type: types.at(0),\n types,\n }\n if (implementation !== contract) {\n fields.implementation = implementation\n }\n return fields\n } catch (ex) {\n const error = ex as Error\n console.error(`Error: ${error.message}`)\n console.error(`${error.stack}`)\n throw ex\n }\n }),\n )\n\n return nftResult\n}\n","/* eslint-disable complexity */\n/* eslint-disable max-statements */\nimport { AxiosJson } from '@xylabs/axios'\nimport { NftMetadata } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC721URIStorage__factory, ERC1155URIStorage__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { checkIpfsUrl } from '@xyo-network/witness-blockchain-abstract'\nimport { Provider } from 'ethers'\nimport parseDataUrl from 'parse-data-url'\n\nimport { isErc721, isErc1155 } from './tokenTypes'\n\n/*const baseUrlAbi = [\n {\n inputs: [],\n name: 'baseUrl',\n outputs: [\n {\n internalType: 'string',\n name: '',\n type: 'string',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n]*/\n\nconst ipfsGateway = '5d7b6582.beta.decentralnetworkservices.com'\n\nexport const getNftMetadata = async (\n /**\n * The address of the NFT contract to search for\n */\n contractAddress: string,\n /**\n * The chain ID (1 = Ethereum Mainnet, 4 = Rinkeby, etc.) of the chain to search for NFTs on\n */\n provider: Provider,\n /**\n * The maximum number of NFTs to return. Configurable to prevent\n * large wallets from exhausting Infura API credits. Ideally a\n * multiple of 100 as that appears to be the default page size.\n */\n tokenId: string,\n load = false,\n defaultUri?: string,\n): Promise<[string | undefined, NftMetadata | undefined]> => {\n const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider)\n const storage1155 = ERC1155URIStorage__factory.connect(contractAddress, provider)\n\n let uri721: string | undefined = undefined\n const is721 = await isErc721(provider, contractAddress)\n if (is721) {\n try {\n uri721 = await storage721.tokenURI(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage721.tokenURI(tokenId) failed`)\n }\n }\n\n /*let baseUrl: string | undefined = undefined\n if (is721) {\n try {\n const baseUrlContract = new Contract(contractAddress, baseUrlAbi, provider)\n baseUrl = await baseUrlContract.bareUrl()\n } catch (ex) {\n const error = ex as Error\n console.error(`baseUrl[${error.name}][${contractAddress}]: baseUrl() failed`)\n }\n }\n\n if (baseUrl && !uri721?.startsWith(baseUrl)) {\n uri721 = `${baseUrl}${uri721 ?? tokenId}`\n }\n */\n\n let uri1155: string | undefined = undefined\n if (!uri721) {\n const is1155 = await isErc1155(provider, contractAddress)\n if (is1155) {\n try {\n uri1155 = await storage1155.uri(tokenId)\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metaDataUri[${error.name}][${contractAddress}]: storage1155.uri(tokenId) failed`)\n //console.log(error.message)\n }\n }\n }\n\n const tokenMetadataUri = uri721 || uri1155 || defaultUri\n let metadata: NftMetadata | undefined = undefined\n if (load) {\n if (tokenMetadataUri?.startsWith('data:')) {\n const parsedDataUrl = parseDataUrl(tokenMetadataUri)\n if (parsedDataUrl !== false && parsedDataUrl.contentType === 'application/json') {\n const buf = parsedDataUrl.toBuffer()\n const value = buf.toString('utf8')\n metadata = JSON.parse(value)\n }\n } else {\n let checkedMetaDataUri: string | undefined\n /*if (tokenMetadataUri && tokenMetadataUri.length < 5) {\n console.log(`tokenMetadataUri [<5][${contractAddress}]: ${tokenMetadataUri}`)\n console.log(`tokenMetadataUri [uri721]: ${uri721}`)\n console.log(`tokenMetadataUri [uri1155]: ${uri1155}`)\n console.log(`tokenMetadataUri [defaultUri]: ${defaultUri}`)\n }*/\n const axios = new AxiosJson({ timeout: 5000 })\n try {\n if (tokenMetadataUri && tokenMetadataUri.length) {\n checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n }\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch (ex) {\n try {\n metadata = defaultUri ? (await axios.get(defaultUri)).data : undefined\n } catch (ex) {\n //const error = ex as Error\n //console.error(`metadata: ${error.message}`)\n }\n }\n }\n }\n\n return [tokenMetadataUri, metadata]\n}\n","import { TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { ERC1155URIStorage__factory, IERC721Metadata__factory } from '@xyo-network/open-zeppelin-typechain'\nimport { Provider } from 'ethers'\n\nimport { contractHasFunctions } from './contractHasFunctions'\n\nexport const isErc1155 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ['uri'])\n}\n\nexport const isErc721 = async (provider: Provider, address: string) => {\n return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ['name', 'symbol', 'tokenURI'])\n}\n\nexport const tokenTypes = async (provider: Provider, address: string) => {\n const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)])\n const result: TokenType[] = []\n if (erc721) {\n result.push('ERC721')\n }\n if (erc1155) {\n result.push('ERC1155')\n }\n return result\n}\n","import { assertEx } from '@xylabs/assert'\nimport { AxiosJson } from '@xylabs/axios'\n\ninterface OpenSeaNFT {\n /*\n * Collection slug. A unique string to identify a collection on OpenSea\n */\n collection: string\n /*\n * The unique public blockchain identifier for the contract\n */\n contract: string\n /**\n * @deprecated\n */\n created_at: string\n /*\n * Description of the NFT\n */\n description: string | null\n /*\n * The NFT's unique identifier within the smart contract (also referred to as token_id)\n */\n identifier: string\n /*\n * Link to the image associated with the NFT\n */\n image_url: string | null\n /*\n * If the item is currently able to be bought or sold using OpenSea\n */\n is_disabled: boolean\n /*\n * If the item is currently classified as 'Not Safe for Work' by OpenSea as defined in OpenSea's NSFW Policy.\n */\n is_nsfw: boolean\n /*\n * Link to the offchain metadata store\n */\n metadata_url: string | null\n /*\n * Name of the NFT\n */\n name: string | null\n /*\n * ERC standard of the token (erc721, erc1155)\n */\n token_standard: string\n /*\n * Last time that the NFT's metadata was updated by OpenSea\n */\n updated_at: string\n}\n\nexport const getNftsFromWalletFromOpenSea = async (address: string, maxNfts = 200, timeout = 2000) => {\n const apiKey = assertEx(process.env.OPENSEA_API_KEY, 'No opensea key found')\n\n const axios = new AxiosJson({ headers: { 'x-api-key': apiKey }, timeout })\n\n const nfts = (await axios.get<{ nfts: OpenSeaNFT[] }>(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data\n .nfts\n return nfts\n}\n","import { Provider } from 'ethers'\n\nexport const getProvider = (providers: Provider[]) => {\n return providers[Date.now() % providers.length] //pick a random provider\n}\n","export const tryCall = async <T>(func: () => Promise<T>, name?: string): Promise<T | undefined> => {\n try {\n return await func()\n } catch (ex) {\n if (name) {\n const error = ex as Error\n console.log(`tryCall failed [${name}]: ${error.message}`)\n }\n return undefined\n }\n}\n","import { CryptoWalletNftWitnessPlugin } from './Plugin'\n\nexport * from './lib'\nexport * from './Witness'\n\nexport { CryptoWalletNftWitnessPlugin }\n\n// eslint-disable-next-line import/no-default-export\nexport default CryptoWalletNftWitnessPlugin\n"],"mappings":";AAAA,SAAS,aAAAA,kBAAiB;AAC1B,SAAS,wBAAwB;AACjC,SAAS,qCAA8D;;;ACFvE,SAAS,YAAAC,iBAAgB;AACzB,SAAS,kBAAkB;AAC3B;AAAA,EAEE;AAAA,EAEA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,iCAA0D;;;ACVnE,SAAS,gBAAgB;AAGlB,IAAM,uBAAuB,OAAO,UAAoB,SAAiB,mBAA8B,kBAA4B;AACxI,MAAI;AACF,UAAM,WAAW,MAAM,SAAS,QAAQ,SAAS,QAAQ;AACzD,aAAS,IAAI,GAAG,IAAI,cAAc,QAAQ,KAAK;AAC7C,YAAM,WAAW,SAAS,kBAAkB,YAAY,cAAc,CAAC,CAAC,GAAG,UAAU,iCAAiC;AACtH,UAAI,CAAC,SAAS,SAAS,SAAS,UAAU,CAAC,CAAC,GAAG;AAC7C,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,SAAS,IAAI;AACX,UAAM,QAAQ;AACd,YAAQ,IAAI,KAAK;AACjB,WAAO;AAAA,EACT;AACF;;;ACnBA,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAEjC,SAAS,iBAAiB,kBAAkB,8BAA8B;AAE1E,SAAS,gBAAgB;;;ACJzB,SAAS,iBAAiB;AAE1B,SAAS,2BAA2B,8BAAAC,mCAAkC;AACtE,SAAS,oBAAoB;AAE7B,OAAO,kBAAkB;;;ACNzB,SAAS,4BAA4B,gCAAgC;AAK9D,IAAM,YAAY,OAAO,UAAoB,YAAoB;AACtE,SAAO,MAAM,qBAAqB,UAAU,SAAS,2BAA2B,gBAAgB,GAAG,CAAC,KAAK,CAAC;AAC5G;AAEO,IAAM,WAAW,OAAO,UAAoB,YAAoB;AACrE,SAAO,MAAM,qBAAqB,UAAU,SAAS,yBAAyB,gBAAgB,GAAG,CAAC,QAAQ,UAAU,UAAU,CAAC;AACjI;AAEO,IAAM,aAAa,OAAO,UAAoB,YAAoB;AACvE,QAAM,CAAC,QAAQ,OAAO,IAAI,MAAM,QAAQ,IAAI,CAAC,SAAS,UAAU,OAAO,GAAG,UAAU,UAAU,OAAO,CAAC,CAAC;AACvG,QAAM,SAAsB,CAAC;AAC7B,MAAI,QAAQ;AACV,WAAO,KAAK,QAAQ;AAAA,EACtB;AACA,MAAI,SAAS;AACX,WAAO,KAAK,SAAS;AAAA,EACvB;AACA,SAAO;AACT;;;ADGA,IAAM,cAAc;AAEb,IAAM,iBAAiB,OAI5B,iBAIA,UAMA,SACA,OAAO,OACP,eAC2D;AAC3D,QAAM,aAAa,0BAA0B,QAAQ,iBAAiB,QAAQ;AAC9E,QAAM,cAAcC,4BAA2B,QAAQ,iBAAiB,QAAQ;AAEhF,MAAI,SAA6B;AACjC,QAAM,QAAQ,MAAM,SAAS,UAAU,eAAe;AACtD,MAAI,OAAO;AACT,QAAI;AACF,eAAS,MAAM,WAAW,SAAS,OAAO;AAAA,IAC5C,SAAS,IAAI;AAAA,IAGb;AAAA,EACF;AAkBA,MAAI,UAA8B;AAClC,MAAI,CAAC,QAAQ;AACX,UAAM,SAAS,MAAM,UAAU,UAAU,eAAe;AACxD,QAAI,QAAQ;AACV,UAAI;AACF,kBAAU,MAAM,YAAY,IAAI,OAAO;AAAA,MACzC,SAAS,IAAI;AAAA,MAIb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAmB,UAAU,WAAW;AAC9C,MAAI,WAAoC;AACxC,MAAI,MAAM;AACR,QAAI,kBAAkB,WAAW,OAAO,GAAG;AACzC,YAAM,gBAAgB,aAAa,gBAAgB;AACnD,UAAI,kBAAkB,SAAS,cAAc,gBAAgB,oBAAoB;AAC/E,cAAM,MAAM,cAAc,SAAS;AACnC,cAAM,QAAQ,IAAI,SAAS,MAAM;AACjC,mBAAW,KAAK,MAAM,KAAK;AAAA,MAC7B;AAAA,IACF,OAAO;AACL,UAAI;AAOJ,YAAM,QAAQ,IAAI,UAAU,EAAE,SAAS,IAAK,CAAC;AAC7C,UAAI;AACF,YAAI,oBAAoB,iBAAiB,QAAQ;AAC/C,+BAAqB,mBAAmB,aAAa,kBAAkB,WAAW,IAAI;AAAA,QACxF;AACA,mBAAW,sBAAsB,MAAM,MAAM,IAAI,kBAAkB,GAAG,OAAO;AAAA,MAC/E,SAAS,IAAI;AACX,YAAI;AACF,qBAAW,cAAc,MAAM,MAAM,IAAI,UAAU,GAAG,OAAO;AAAA,QAC/D,SAASC,KAAI;AAAA,QAGb;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,CAAC,kBAAkB,QAAQ;AACpC;;;AE/HA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,aAAAC,kBAAiB;AAqDnB,IAAM,+BAA+B,OAAO,SAAiB,UAAU,KAAK,UAAU,QAAS;AACpG,QAAM,SAASD,UAAS,QAAQ,IAAI,iBAAiB,sBAAsB;AAE3E,QAAM,QAAQ,IAAIC,WAAU,EAAE,SAAS,EAAE,aAAa,OAAO,GAAG,QAAQ,CAAC;AAEzE,QAAM,QAAQ,MAAM,MAAM,IAA4B,wDAAwD,OAAO,eAAe,OAAO,EAAE,GAAG,KAC7I;AACH,SAAO;AACT;;;AC5DO,IAAM,cAAc,CAAC,cAA0B;AACpD,SAAO,UAAU,KAAK,IAAI,IAAI,UAAU,MAAM;AAChD;;;ACJO,IAAM,UAAU,OAAU,MAAwB,SAA0C;AACjG,MAAI;AACF,WAAO,MAAM,KAAK;AAAA,EACpB,SAAS,IAAI;AACX,QAAI,MAAM;AACR,YAAM,QAAQ;AACd,cAAQ,IAAI,mBAAmB,IAAI,MAAM,MAAM,OAAO,EAAE;AAAA,IAC1D;AACA,WAAO;AAAA,EACT;AACF;;;ALIA,IAAM,iBAAiB,IAAI,SAA8B,EAAE,KAAK,IAAI,CAAC;AAE9D,IAAM,gBAAgB,OAAO,UAAoB,YAAoB;AAC1E,QAAM,MAAM,GAAG,OAAO,KAAK,MAAM,SAAS,WAAW,GAAG,OAAO;AAC/D,QAAM,eAAe,eAAe,IAAI,GAAG;AAC3C,MAAI,cAAc;AAChB,WAAO;AAAA,EACT,OAAO;AACL,UAAM,QAAQ,MAAM,WAAW,UAAU,OAAO;AAChD,mBAAe,IAAI,KAAK,KAAK;AAC7B,WAAO;AAAA,EACT;AACF;AAEO,IAAM,uBAAuB,OAClC,SACA,SACA,aACqD;AACrD,MAAI;AACF,UAAM,WAAW,gBAAgB,QAAQ,SAAS,QAAQ;AAC1D,WAAO,CAAC,MAAM,SAAS,SAAS,OAAO,GAAG,MAAS;AAAA,EACrD,SAAS,IAAI;AACX,WAAO,CAAC,QAAW,EAAW;AAAA,EAChC;AACF;AAEO,IAAM,wBAAwB,OACnC,SACA,SACA,aACqD;AACrD,MAAI;AACF,UAAM,WAAW,iBAAiB,QAAQ,SAAS,QAAQ;AAC3D,WAAO,CAAC,MAAM,SAAS,IAAI,OAAO,GAAG,MAAS;AAAA,EAChD,SAAS,IAAI;AACX,WAAO,CAAC,QAAW,EAAW;AAAA,EAChC;AACF;AAEO,IAAM,oBAAoB,OAAO,SAAiB,SAAiB,aAAuB;AAC/F,QAAM,UAAU,MAAM,QAAQ,IAAI,CAAC,qBAAqB,SAAS,SAAS,QAAQ,GAAG,sBAAsB,SAAS,SAAS,QAAQ,CAAC,CAAC;AACvI,SAAO,QAAQ,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;AACtC;AAEO,IAAM,oCAAoC,OAE/C,eAEA,WAEA,UAAU,KAEV,UAAU,QACmB;AAC7B,QAAM,OAAO,MAAM,sBAAsB,eAAe,WAAW,SAAS,OAAO;AACnF,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,KAAK,IAAI,OAAO,QAAQ;AACtB,UAAI;AACF,YAAI,CAAC,IAAI,eAAe,CAAC,IAAI,UAAU;AACrC,gBAAM,CAAC,aAAa,QAAQ,IAAI,MAAM;AAAA,YACpC,IAAI,kBAAkB,IAAI;AAAA,YAC1B,YAAY,SAAS;AAAA,YACrB,IAAI;AAAA,YACJ;AAAA,YACA,IAAI;AAAA,UACN;AACA,cAAI,WAAW,IAAI,YAAY;AAC/B,cAAI,cAAc,IAAI,eAAe;AAAA,QACvC;AACA,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,gBAAQ,MAAM,UAAU,MAAM,OAAO,EAAE;AACvC,gBAAQ,MAAM,GAAG,MAAM,KAAK,EAAE;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEO,IAAM,wBAAwB,OAEnC,eAEA,WAEA,UAAU,KAEV,UAAU,QACmB;AAE7B,QAAM,OAAO,MAAM,6BAA6B,eAAe,SAAS,OAAO;AAE/E,QAAM,YAAY,MAAM,QAAQ;AAAA,IAC9B,KAAK,IAAI,OAAO,QAAQ;AACtB,UAAI;AACF,cAAM,EAAE,UAAU,YAAY,aAAa,IAAI;AAC/C,cAAM,WAAW,YAAY,SAAS;AAEtC,cAAM,QAAQ,MAAM,SAAS,eAAe;AAG5C,cAAM,CAAC,eAAe,aAAa,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,UAEvD,MAAM,iBAAiB,UAAU,UAAU,KAAK;AAAA;AAAA,UAGhD,MAAM,iBAAiB,UAAU,UAAU,KAAK;AAAA,QAClD,CAAC;AAED,cAAM,iBACJ,CAAC,cAAc,MAAM,kBAAkB,UAAU,cAAc,MAAM,cAAc,IAC/E,cAAc,iBACd,cAAc;AAEpB,YAAI,SAAS;AACb,cAAM,QAAQ,MAAM,cAAc,UAAU,cAAc;AAC1D,YAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,gBAAM,aAAa,uBAAuB,QAAQ,gBAAgB,YAAY,SAAS,CAAC;AACxF,mBAAU,MAAM,QAAQ,YAAY,MAAM,WAAW,sBAAsB,EAAE,cAAc,OAAO,CAAC,KAAM;AAAA,QAC3G;AACA,cAAM,SAAwB;AAAA,UAC5B,SAAS;AAAA,UACT,SAAS,QAAQ,MAAM,SAAS,WAAW,GAAG,OAAO;AAAA,UACrD,aAAa,gBAAgB;AAAA,UAC7B,QAAQ,KAAK,OAAO,SAAS,EAAE,CAAC;AAAA,UAChC,SAAS;AAAA,UACT,MAAM,MAAM,GAAG,CAAC;AAAA,UAChB;AAAA,QACF;AACA,YAAI,mBAAmB,UAAU;AAC/B,iBAAO,iBAAiB;AAAA,QAC1B;AACA,eAAO;AAAA,MACT,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,gBAAQ,MAAM,UAAU,MAAM,OAAO,EAAE;AACvC,gBAAQ,MAAM,GAAG,MAAM,KAAK,EAAE;AAC9B,cAAM;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AFhJA,IAAM,SAAS;AAEf,IAAM,iBAAiB;AAEhB,IAAM,yBAAN,cAAkH,0BAIvH;AAAA,EACA,OAAgB,gBAAgB,CAAC,sBAAsB;AAAA,EAEvD,IAAI,eAAe;AACjB,WAAO,KAAK,OAAO,gBAAgB;AAAA,EACrC;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,OAAO,WAAW;AAAA,EAChC;AAAA,EAEA,MAAyB,eAAe,UAAkD;AACxF,UAAM,KAAK,QAAQ,OAAO;AAC1B,UAAM,UAAU,UAAU,OAAO,iBAAiB,KAAK,CAAC;AAExD,UAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,QAAI;AACF,YAAM,eAAe,MAAM,QAAQ;AAAA,QACjC,QAAQ,IAAI,OAAO,UAAU;AAC3B,gBAAM,WAAW,MAAM,KAAK,YAAY,MAAM,IAAI;AAClD,gBAAM,eAAeC,UAAS,OAAO,WAAW,KAAK,OAAO,SAAS,4BAA4B;AACjG,gBAAM,qBAAqB,WAAW,MAAM,YAAY;AACxD,gBAAM,UAAUA,UAAS,oBAAoB,SAAS,GAAG,gCAAgC;AACzF,gBAAM,UAAU,MAAM,SAAS,WAAW;AAC1C,gBAAM,UAAUA,UAAS,QAAQ,SAAS,4BAA4B;AACtE,gBAAM,UAAU,OAAO,WAAW;AAClC,cAAI;AACF,kBAAM,OAAO,KAAK,eACd,MAAM,kCAAkC,SAAS,WAAW,SAAS,KAAK,OAAO,IACjF,MAAM,sBAAsB,SAAS,WAAW,SAAS,KAAK,OAAO;AACzE,kBAAM,cAAc,KAAK,IAAa,CAAC,QAAQ;AAC7C,qBAAO,EAAE,GAAG,KAAK,OAAO;AAAA,YAC1B,CAAC;AACD,mBAAO;AAAA,UACT,SAAS,IAAI;AACX,kBAAM,QAAQ;AACd,kBAAM,MAAM,kCAAkC,OAAO,eAAe,OAAO,KAAK,MAAM,OAAO,EAAE;AAAA,UACjG;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO,aAAa,KAAK;AAAA,IAC3B,SAAS,IAAI;AACX,YAAM,QAAQ;AACd,cAAQ,MAAM,KAAK;AACnB,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;;;ADjEO,IAAM,+BAA+B,MAC1C;AAAA,EACE,EAAE,UAAU,EAAE,CAACC,UAAS,GAAG,EAAE,GAAG,QAAQ,iBAAiB;AAAA,EACzD;AAAA,IACE,SAAS,OAAO,WAAW;AACzB,YAAM,SAAS,MAAM,uBAAuB,OAAO,MAAM;AACzD,aAAO;AAAA,IACT;AAAA,EACF;AACF;;;ASPF,IAAO,cAAQ;","names":["NftSchema","assertEx","ERC1155URIStorage__factory","ERC1155URIStorage__factory","ex","assertEx","AxiosJson","assertEx","NftSchema"]}
|
package/dist/browser/lib/{getAssetsFromWalletFromOpenSea.d.cts → getNftsFromWalletFromOpenSea.d.cts}
RENAMED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
interface OpenSeaNFT {
|
|
2
2
|
collection: string;
|
|
3
3
|
contract: string;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated
|
|
6
|
+
*/
|
|
4
7
|
created_at: string;
|
|
5
8
|
description: string | null;
|
|
6
9
|
identifier: string;
|
|
@@ -14,4 +17,4 @@ interface OpenSeaNFT {
|
|
|
14
17
|
}
|
|
15
18
|
export declare const getNftsFromWalletFromOpenSea: (address: string, maxNfts?: number, timeout?: number) => Promise<OpenSeaNFT[]>;
|
|
16
19
|
export {};
|
|
17
|
-
//# sourceMappingURL=
|
|
20
|
+
//# sourceMappingURL=getNftsFromWalletFromOpenSea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getNftsFromWalletFromOpenSea.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsFromWalletFromOpenSea.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAIlB,UAAU,EAAE,MAAM,CAAA;IAIlB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAIlB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAI1B,UAAU,EAAE,MAAM,CAAA;IAIlB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAIxB,WAAW,EAAE,OAAO,CAAA;IAIpB,OAAO,EAAE,OAAO,CAAA;IAIhB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAI3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAInB,cAAc,EAAE,MAAM,CAAA;IAItB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,4BAA4B,YAAmB,MAAM,8DAQjE,CAAA"}
|
package/dist/browser/lib/{getAssetsFromWalletFromOpenSea.d.ts → getNftsFromWalletFromOpenSea.d.mts}
RENAMED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
interface OpenSeaNFT {
|
|
2
2
|
collection: string;
|
|
3
3
|
contract: string;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated
|
|
6
|
+
*/
|
|
4
7
|
created_at: string;
|
|
5
8
|
description: string | null;
|
|
6
9
|
identifier: string;
|
|
@@ -14,4 +17,4 @@ interface OpenSeaNFT {
|
|
|
14
17
|
}
|
|
15
18
|
export declare const getNftsFromWalletFromOpenSea: (address: string, maxNfts?: number, timeout?: number) => Promise<OpenSeaNFT[]>;
|
|
16
19
|
export {};
|
|
17
|
-
//# sourceMappingURL=
|
|
20
|
+
//# sourceMappingURL=getNftsFromWalletFromOpenSea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getNftsFromWalletFromOpenSea.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsFromWalletFromOpenSea.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAIlB,UAAU,EAAE,MAAM,CAAA;IAIlB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAIlB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAI1B,UAAU,EAAE,MAAM,CAAA;IAIlB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAIxB,WAAW,EAAE,OAAO,CAAA;IAIpB,OAAO,EAAE,OAAO,CAAA;IAIhB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAI3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAInB,cAAc,EAAE,MAAM,CAAA;IAItB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,4BAA4B,YAAmB,MAAM,8DAQjE,CAAA"}
|
package/dist/browser/lib/{getAssetsFromWalletFromOpenSea.d.mts → getNftsFromWalletFromOpenSea.d.ts}
RENAMED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
interface OpenSeaNFT {
|
|
2
2
|
collection: string;
|
|
3
3
|
contract: string;
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated
|
|
6
|
+
*/
|
|
4
7
|
created_at: string;
|
|
5
8
|
description: string | null;
|
|
6
9
|
identifier: string;
|
|
@@ -14,4 +17,4 @@ interface OpenSeaNFT {
|
|
|
14
17
|
}
|
|
15
18
|
export declare const getNftsFromWalletFromOpenSea: (address: string, maxNfts?: number, timeout?: number) => Promise<OpenSeaNFT[]>;
|
|
16
19
|
export {};
|
|
17
|
-
//# sourceMappingURL=
|
|
20
|
+
//# sourceMappingURL=getNftsFromWalletFromOpenSea.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getNftsFromWalletFromOpenSea.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsFromWalletFromOpenSea.ts"],"names":[],"mappings":"AAGA,UAAU,UAAU;IAIlB,UAAU,EAAE,MAAM,CAAA;IAIlB,QAAQ,EAAE,MAAM,CAAA;IAChB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAIlB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAI1B,UAAU,EAAE,MAAM,CAAA;IAIlB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IAIxB,WAAW,EAAE,OAAO,CAAA;IAIpB,OAAO,EAAE,OAAO,CAAA;IAIhB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAI3B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAInB,cAAc,EAAE,MAAM,CAAA;IAItB,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,4BAA4B,YAAmB,MAAM,8DAQjE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNftsOwnedByAddress.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsOwnedByAddress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,aAAa,aAAoB,QAAQ,WAAW,MAAM,yBAUtE,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAmB,MAAM,WAAW,MAAM,YAAY,QAAQ,gCAG3F,CAAA;AAED,eAAO,MAAM,iCAAiC,kBAE7B,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"getNftsOwnedByAddress.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsOwnedByAddress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,aAAa,aAAoB,QAAQ,WAAW,MAAM,yBAUtE,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAmB,MAAM,WAAW,MAAM,YAAY,QAAQ,gCAG3F,CAAA;AAED,eAAO,MAAM,iCAAiC,kBAE7B,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,CA0BzB,CAAA;AAED,eAAO,MAAM,qBAAqB,kBAEjB,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,CAuDzB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNftsOwnedByAddress.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsOwnedByAddress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,aAAa,aAAoB,QAAQ,WAAW,MAAM,yBAUtE,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAmB,MAAM,WAAW,MAAM,YAAY,QAAQ,gCAG3F,CAAA;AAED,eAAO,MAAM,iCAAiC,kBAE7B,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"getNftsOwnedByAddress.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsOwnedByAddress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,aAAa,aAAoB,QAAQ,WAAW,MAAM,yBAUtE,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAmB,MAAM,WAAW,MAAM,YAAY,QAAQ,gCAG3F,CAAA;AAED,eAAO,MAAM,iCAAiC,kBAE7B,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,CA0BzB,CAAA;AAED,eAAO,MAAM,qBAAqB,kBAEjB,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,CAuDzB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getNftsOwnedByAddress.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsOwnedByAddress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,aAAa,aAAoB,QAAQ,WAAW,MAAM,yBAUtE,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAmB,MAAM,WAAW,MAAM,YAAY,QAAQ,gCAG3F,CAAA;AAED,eAAO,MAAM,iCAAiC,kBAE7B,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,
|
|
1
|
+
{"version":3,"file":"getNftsOwnedByAddress.d.ts","sourceRoot":"","sources":["../../../src/lib/getNftsOwnedByAddress.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAA;AAEjF,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAWjC,eAAO,MAAM,aAAa,aAAoB,QAAQ,WAAW,MAAM,yBAUtE,CAAA;AAED,eAAO,MAAM,oBAAoB,YACtB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,qBAAqB,YACvB,MAAM,WACN,MAAM,YACL,QAAQ,KACjB,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAAC,CAOjD,CAAA;AAED,eAAO,MAAM,iBAAiB,YAAmB,MAAM,WAAW,MAAM,YAAY,QAAQ,gCAG3F,CAAA;AAED,eAAO,MAAM,iCAAiC,kBAE7B,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,CA0BzB,CAAA;AAED,eAAO,MAAM,qBAAqB,kBAEjB,MAAM,aAEV,QAAQ,EAAE,yCAKpB,QAAQ,aAAa,EAAE,CAuDzB,CAAA"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -85,18 +85,8 @@ var import_blockchain_erc1967_witness = require("@xyo-network/blockchain-erc1967
|
|
|
85
85
|
var import_open_zeppelin_typechain3 = require("@xyo-network/open-zeppelin-typechain");
|
|
86
86
|
var import_lru_cache = require("lru-cache");
|
|
87
87
|
|
|
88
|
-
// src/lib/getAssetsFromWalletFromOpenSea.ts
|
|
89
|
-
var import_assert2 = require("@xylabs/assert");
|
|
90
|
-
var import_axios = require("@xylabs/axios");
|
|
91
|
-
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
92
|
-
const apiKey = (0, import_assert2.assertEx)(process.env.OPENSEA_API_KEY, "No opensea key found");
|
|
93
|
-
const axios = new import_axios.AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
|
|
94
|
-
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
95
|
-
return nfts;
|
|
96
|
-
};
|
|
97
|
-
|
|
98
88
|
// src/lib/getNftMetadata.ts
|
|
99
|
-
var
|
|
89
|
+
var import_axios = require("@xylabs/axios");
|
|
100
90
|
var import_open_zeppelin_typechain2 = require("@xyo-network/open-zeppelin-typechain");
|
|
101
91
|
var import_witness_blockchain_abstract = require("@xyo-network/witness-blockchain-abstract");
|
|
102
92
|
var import_parse_data_url = __toESM(require("parse-data-url"), 1);
|
|
@@ -156,7 +146,7 @@ var getNftMetadata = async (contractAddress, provider, tokenId, load = false, de
|
|
|
156
146
|
}
|
|
157
147
|
} else {
|
|
158
148
|
let checkedMetaDataUri;
|
|
159
|
-
const axios = new
|
|
149
|
+
const axios = new import_axios.AxiosJson({ timeout: 5e3 });
|
|
160
150
|
try {
|
|
161
151
|
if (tokenMetadataUri && tokenMetadataUri.length) {
|
|
162
152
|
checkedMetaDataUri = tokenMetadataUri ? (0, import_witness_blockchain_abstract.checkIpfsUrl)(tokenMetadataUri, ipfsGateway) : tokenMetadataUri;
|
|
@@ -173,6 +163,16 @@ var getNftMetadata = async (contractAddress, provider, tokenId, load = false, de
|
|
|
173
163
|
return [tokenMetadataUri, metadata];
|
|
174
164
|
};
|
|
175
165
|
|
|
166
|
+
// src/lib/getNftsFromWalletFromOpenSea.ts
|
|
167
|
+
var import_assert2 = require("@xylabs/assert");
|
|
168
|
+
var import_axios2 = require("@xylabs/axios");
|
|
169
|
+
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
170
|
+
const apiKey = (0, import_assert2.assertEx)(process.env.OPENSEA_API_KEY, "No opensea key found");
|
|
171
|
+
const axios = new import_axios2.AxiosJson({ headers: { "x-api-key": apiKey }, timeout });
|
|
172
|
+
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
173
|
+
return nfts;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
176
|
// src/lib/getProvider.ts
|
|
177
177
|
var getProvider = (providers) => {
|
|
178
178
|
return providers[Date.now() % providers.length];
|
|
@@ -227,7 +227,6 @@ var getNftMetadataUri = async (address, tokenId, provider) => {
|
|
|
227
227
|
var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts = 200, timeout = 5e3) => {
|
|
228
228
|
const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout);
|
|
229
229
|
const nftResult = await Promise.all(
|
|
230
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
231
230
|
nfts.map(async (nft) => {
|
|
232
231
|
try {
|
|
233
232
|
if (!nft.metadataUri || !nft.metadata) {
|
|
@@ -255,14 +254,17 @@ var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts
|
|
|
255
254
|
var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, timeout = 5e3) => {
|
|
256
255
|
const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout);
|
|
257
256
|
const nftResult = await Promise.all(
|
|
258
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
257
|
nfts.map(async (nft) => {
|
|
260
258
|
try {
|
|
261
|
-
const { contract, identifier } = nft;
|
|
259
|
+
const { contract, identifier, metadata_url } = nft;
|
|
262
260
|
const provider = getProvider(providers);
|
|
263
261
|
const block = await provider.getBlockNumber();
|
|
264
|
-
const erc1967Status = await
|
|
265
|
-
|
|
262
|
+
const [erc1967Status, erc1822Status] = await Promise.all([
|
|
263
|
+
// Check if ERC-1967 Upgradeable
|
|
264
|
+
await (0, import_blockchain_erc1967_witness.getErc1967Status)(provider, contract, block),
|
|
265
|
+
// Check if ERC-1822 Upgradeable
|
|
266
|
+
await (0, import_blockchain_erc1822_witness.getErc1822Status)(provider, contract, block)
|
|
267
|
+
]);
|
|
266
268
|
const implementation = !erc1967Status.slots.implementation || (0, import_hex.isHexZero)(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
|
|
267
269
|
let supply = 1n;
|
|
268
270
|
const types = await getTokenTypes(provider, implementation);
|
|
@@ -272,8 +274,8 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
272
274
|
}
|
|
273
275
|
const fields = {
|
|
274
276
|
address: contract,
|
|
275
|
-
chainId: Number((await
|
|
276
|
-
metadataUri:
|
|
277
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
278
|
+
metadataUri: metadata_url ?? void 0,
|
|
277
279
|
supply: `0x${supply.toString(16)}`,
|
|
278
280
|
tokenId: identifier,
|
|
279
281
|
type: types.at(0),
|