@xyo-network/crypto-nft-witness-wallet-plugin 2.84.3 → 2.84.4
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/Witness.d.cts +3 -3
- package/dist/browser/Witness.d.cts.map +1 -1
- package/dist/browser/Witness.d.mts +3 -3
- package/dist/browser/Witness.d.mts.map +1 -1
- package/dist/browser/Witness.d.ts +3 -3
- package/dist/browser/Witness.d.ts.map +1 -1
- package/dist/browser/index.cjs +2 -2
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +2 -2
- package/dist/browser/index.js.map +1 -1
- package/dist/node/Witness.d.cts +3 -3
- package/dist/node/Witness.d.cts.map +1 -1
- package/dist/node/Witness.d.mts +3 -3
- package/dist/node/Witness.d.mts.map +1 -1
- package/dist/node/Witness.d.ts +3 -3
- package/dist/node/Witness.d.ts.map +1 -1
- package/dist/node/index.cjs +2 -2
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +2 -2
- package/dist/node/index.js.map +1 -1
- package/package.json +27 -27
- package/src/Witness.ts +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
2
|
-
import {
|
|
3
|
-
export type CryptoWalletNftWitnessParams =
|
|
4
|
-
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
2
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
|
|
3
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
4
|
+
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
5
5
|
static configSchemas: "network.xyo.crypto.nft.witness.config"[];
|
|
6
6
|
get loadMetadata(): boolean;
|
|
7
7
|
get timeout(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAIxF,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;AAMzF,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,kBAAkB,CACzI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAoC1F"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
2
|
-
import {
|
|
3
|
-
export type CryptoWalletNftWitnessParams =
|
|
4
|
-
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
2
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
|
|
3
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
4
|
+
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
5
5
|
static configSchemas: "network.xyo.crypto.nft.witness.config"[];
|
|
6
6
|
get loadMetadata(): boolean;
|
|
7
7
|
get timeout(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAIxF,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;AAMzF,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,kBAAkB,CACzI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAoC1F"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
2
|
-
import {
|
|
3
|
-
export type CryptoWalletNftWitnessParams =
|
|
4
|
-
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
2
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
|
|
3
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
4
|
+
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
5
5
|
static configSchemas: "network.xyo.crypto.nft.witness.config"[];
|
|
6
6
|
get loadMetadata(): boolean;
|
|
7
7
|
get timeout(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAIxF,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;AAMzF,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,kBAAkB,CACzI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAoC1F"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -55,7 +55,7 @@ var import_payloadset_plugin = require("@xyo-network/payloadset-plugin");
|
|
|
55
55
|
var import_assert3 = require("@xylabs/assert");
|
|
56
56
|
var import_eth_address = require("@xylabs/eth-address");
|
|
57
57
|
var import_crypto_nft_payload_plugin = require("@xyo-network/crypto-nft-payload-plugin");
|
|
58
|
-
var
|
|
58
|
+
var import_witness_evm_abstract = require("@xyo-network/witness-evm-abstract");
|
|
59
59
|
|
|
60
60
|
// src/lib/contractHasFunctions.ts
|
|
61
61
|
var import_assert = require("@xylabs/assert");
|
|
@@ -298,7 +298,7 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
298
298
|
// src/Witness.ts
|
|
299
299
|
var schema = import_crypto_nft_payload_plugin.NftSchema;
|
|
300
300
|
var defaultMaxNfts = 200;
|
|
301
|
-
var CryptoWalletNftWitness = class extends
|
|
301
|
+
var CryptoWalletNftWitness = class extends import_witness_evm_abstract.AbstractEvmWitness {
|
|
302
302
|
static configSchemas = [import_crypto_nft_payload_plugin.NftWitnessConfigSchema];
|
|
303
303
|
get loadMetadata() {
|
|
304
304
|
return this.config.loadMetadata ?? true;
|
|
@@ -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/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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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"]}
|
|
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 { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<\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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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_open_zeppelin_typechain","import_open_zeppelin_typechain","parseDataUrl","ex","import_assert","import_axios"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
NftSchema,
|
|
12
12
|
NftWitnessConfigSchema
|
|
13
13
|
} from "@xyo-network/crypto-nft-payload-plugin";
|
|
14
|
-
import {
|
|
14
|
+
import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
|
|
15
15
|
|
|
16
16
|
// src/lib/contractHasFunctions.ts
|
|
17
17
|
import { assertEx } from "@xylabs/assert";
|
|
@@ -254,7 +254,7 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
254
254
|
// src/Witness.ts
|
|
255
255
|
var schema = NftSchema;
|
|
256
256
|
var defaultMaxNfts = 200;
|
|
257
|
-
var CryptoWalletNftWitness = class extends
|
|
257
|
+
var CryptoWalletNftWitness = class extends AbstractEvmWitness {
|
|
258
258
|
static configSchemas = [NftWitnessConfigSchema];
|
|
259
259
|
get loadMetadata() {
|
|
260
260
|
return this.config.loadMetadata ?? true;
|
|
@@ -1 +1 @@
|
|
|
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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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":"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","names":["NftSchema","assertEx","ERC1155URIStorage__factory","ERC1155URIStorage__factory","ex","assertEx","AxiosJson","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 { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<\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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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":"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","names":["NftSchema","assertEx","ERC1155URIStorage__factory","ERC1155URIStorage__factory","ex","assertEx","AxiosJson","assertEx","NftSchema"]}
|
package/dist/node/Witness.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
2
|
-
import {
|
|
3
|
-
export type CryptoWalletNftWitnessParams =
|
|
4
|
-
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
2
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
|
|
3
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
4
|
+
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
5
5
|
static configSchemas: "network.xyo.crypto.nft.witness.config"[];
|
|
6
6
|
get loadMetadata(): boolean;
|
|
7
7
|
get timeout(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAIxF,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;AAMzF,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,kBAAkB,CACzI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAoC1F"}
|
package/dist/node/Witness.d.mts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
2
|
-
import {
|
|
3
|
-
export type CryptoWalletNftWitnessParams =
|
|
4
|
-
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
2
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
|
|
3
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
4
|
+
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
5
5
|
static configSchemas: "network.xyo.crypto.nft.witness.config"[];
|
|
6
6
|
get loadMetadata(): boolean;
|
|
7
7
|
get timeout(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAIxF,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;AAMzF,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,kBAAkB,CACzI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAoC1F"}
|
package/dist/node/Witness.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { CryptoWalletNftWitnessConfig, NftInfo, NftWitnessQuery } from '@xyo-network/crypto-nft-payload-plugin';
|
|
2
|
-
import {
|
|
3
|
-
export type CryptoWalletNftWitnessParams =
|
|
4
|
-
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
2
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract';
|
|
3
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
4
|
+
export declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
5
5
|
static configSchemas: "network.xyo.crypto.nft.witness.config"[];
|
|
6
6
|
get loadMetadata(): boolean;
|
|
7
7
|
get timeout(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"Witness.d.ts","sourceRoot":"","sources":["../../src/Witness.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,4BAA4B,EAE5B,OAAO,EAGP,eAAe,EAChB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAA;AAIxF,MAAM,MAAM,4BAA4B,GAAG,gBAAgB,CAAC,4BAA4B,CAAC,CAAA;AAMzF,qBAAa,sBAAsB,CAAC,OAAO,SAAS,4BAA4B,GAAG,4BAA4B,CAAE,SAAQ,kBAAkB,CACzI,OAAO,EACP,eAAe,EACf,OAAO,CACR;IACC,OAAgB,aAAa,4CAA2B;IAExD,IAAI,YAAY,YAEf;IAED,IAAI,OAAO,WAEV;cAEwB,cAAc,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;CAoC1F"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -55,7 +55,7 @@ var import_payloadset_plugin = require("@xyo-network/payloadset-plugin");
|
|
|
55
55
|
var import_assert3 = require("@xylabs/assert");
|
|
56
56
|
var import_eth_address = require("@xylabs/eth-address");
|
|
57
57
|
var import_crypto_nft_payload_plugin = require("@xyo-network/crypto-nft-payload-plugin");
|
|
58
|
-
var
|
|
58
|
+
var import_witness_evm_abstract = require("@xyo-network/witness-evm-abstract");
|
|
59
59
|
|
|
60
60
|
// src/lib/contractHasFunctions.ts
|
|
61
61
|
var import_assert = require("@xylabs/assert");
|
|
@@ -299,7 +299,7 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
299
299
|
// src/Witness.ts
|
|
300
300
|
var schema = import_crypto_nft_payload_plugin.NftSchema;
|
|
301
301
|
var defaultMaxNfts = 200;
|
|
302
|
-
var CryptoWalletNftWitness = class extends
|
|
302
|
+
var CryptoWalletNftWitness = class extends import_witness_evm_abstract.AbstractEvmWitness {
|
|
303
303
|
static configSchemas = [import_crypto_nft_payload_plugin.NftWitnessConfigSchema];
|
|
304
304
|
get loadMetadata() {
|
|
305
305
|
return this.config.loadMetadata ?? true;
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -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/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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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"]}
|
|
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 { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<\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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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_open_zeppelin_typechain","import_open_zeppelin_typechain","parseDataUrl","ex","import_assert","import_axios"]}
|
package/dist/node/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import {
|
|
|
11
11
|
NftSchema,
|
|
12
12
|
NftWitnessConfigSchema
|
|
13
13
|
} from "@xyo-network/crypto-nft-payload-plugin";
|
|
14
|
-
import {
|
|
14
|
+
import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
|
|
15
15
|
|
|
16
16
|
// src/lib/contractHasFunctions.ts
|
|
17
17
|
import { assertEx } from "@xylabs/assert";
|
|
@@ -255,7 +255,7 @@ var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, time
|
|
|
255
255
|
// src/Witness.ts
|
|
256
256
|
var schema = NftSchema;
|
|
257
257
|
var defaultMaxNfts = 200;
|
|
258
|
-
var CryptoWalletNftWitness = class extends
|
|
258
|
+
var CryptoWalletNftWitness = class extends AbstractEvmWitness {
|
|
259
259
|
static configSchemas = [NftWitnessConfigSchema];
|
|
260
260
|
get loadMetadata() {
|
|
261
261
|
return this.config.loadMetadata ?? true;
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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":"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","names":["NftSchema","assertEx","ERC1155URIStorage__factory","ERC1155URIStorage__factory","ex","assertEx","AxiosJson","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 { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'\n\nexport type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>\n\nconst schema = NftSchema\n\nconst defaultMaxNfts = 200\n\nexport class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<\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 { NftInfoFields, TokenType } from '@xyo-network/crypto-nft-payload-plugin'\nimport { getErc1822SlotStatus } from '@xyo-network/erc1822-witness'\nimport { getErc1967SlotStatus } from '@xyo-network/erc1967-witness'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n await getErc1822SlotStatus(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":"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","names":["NftSchema","assertEx","ERC1155URIStorage__factory","ERC1155URIStorage__factory","ex","assertEx","AxiosJson","assertEx","NftSchema"]}
|
package/package.json
CHANGED
|
@@ -14,14 +14,14 @@
|
|
|
14
14
|
"@xylabs/axios": "^2.13.20",
|
|
15
15
|
"@xylabs/eth-address": "^2.13.20",
|
|
16
16
|
"@xylabs/hex": "^2.13.20",
|
|
17
|
-
"@xyo-network/crypto-nft-collection-payload-plugin": "~2.84.
|
|
18
|
-
"@xyo-network/crypto-nft-payload-plugin": "~2.84.
|
|
19
|
-
"@xyo-network/erc1822-witness": "~2.84.
|
|
20
|
-
"@xyo-network/erc1967-witness": "~2.84.
|
|
17
|
+
"@xyo-network/crypto-nft-collection-payload-plugin": "~2.84.4",
|
|
18
|
+
"@xyo-network/crypto-nft-payload-plugin": "~2.84.4",
|
|
19
|
+
"@xyo-network/erc1822-witness": "~2.84.4",
|
|
20
|
+
"@xyo-network/erc1967-witness": "~2.84.4",
|
|
21
21
|
"@xyo-network/open-zeppelin-typechain": "^3.0.5",
|
|
22
|
-
"@xyo-network/payload-model": "^2.84.
|
|
23
|
-
"@xyo-network/payloadset-plugin": "^2.84.
|
|
24
|
-
"ethers": "^6.9.
|
|
22
|
+
"@xyo-network/payload-model": "^2.84.13",
|
|
23
|
+
"@xyo-network/payloadset-plugin": "^2.84.13",
|
|
24
|
+
"ethers": "^6.9.1",
|
|
25
25
|
"lru-cache": "^10.1.0",
|
|
26
26
|
"parse-data-url": "^6.0.0"
|
|
27
27
|
},
|
|
@@ -31,25 +31,25 @@
|
|
|
31
31
|
"@xylabs/delay": "^2.13.20",
|
|
32
32
|
"@xylabs/exists": "^2.13.20",
|
|
33
33
|
"@xylabs/jest-helpers": "^2.13.20",
|
|
34
|
-
"@xylabs/ts-scripts-yarn3": "^3.2.
|
|
35
|
-
"@xylabs/tsconfig": "^3.2.
|
|
36
|
-
"@xyo-network/account": "^2.84.
|
|
37
|
-
"@xyo-network/archivist-model": "^2.84.
|
|
38
|
-
"@xyo-network/boundwitness-builder": "^2.84.
|
|
39
|
-
"@xyo-network/boundwitness-model": "^2.84.
|
|
40
|
-
"@xyo-network/diviner-boundwitness-memory": "^2.84.
|
|
41
|
-
"@xyo-network/diviner-model": "^2.84.
|
|
42
|
-
"@xyo-network/diviner-payload-memory": "^2.84.
|
|
43
|
-
"@xyo-network/diviner-payload-model": "^2.84.
|
|
44
|
-
"@xyo-network/diviner-temporal-indexing": "^2.84.
|
|
45
|
-
"@xyo-network/hash": "^2.84.
|
|
46
|
-
"@xyo-network/manifest": "^2.84.
|
|
47
|
-
"@xyo-network/memory-archivist": "^2.84.
|
|
48
|
-
"@xyo-network/module-model": "^2.84.
|
|
49
|
-
"@xyo-network/node-memory": "^2.84.
|
|
50
|
-
"@xyo-network/payload-wrapper": "^2.84.
|
|
51
|
-
"@xyo-network/witness-blockchain": "^2.84.
|
|
52
|
-
"@xyo-network/witness-blockchain-abstract": "^2.84.
|
|
34
|
+
"@xylabs/ts-scripts-yarn3": "^3.2.25",
|
|
35
|
+
"@xylabs/tsconfig": "^3.2.25",
|
|
36
|
+
"@xyo-network/account": "^2.84.13",
|
|
37
|
+
"@xyo-network/archivist-model": "^2.84.13",
|
|
38
|
+
"@xyo-network/boundwitness-builder": "^2.84.13",
|
|
39
|
+
"@xyo-network/boundwitness-model": "^2.84.13",
|
|
40
|
+
"@xyo-network/diviner-boundwitness-memory": "^2.84.13",
|
|
41
|
+
"@xyo-network/diviner-model": "^2.84.13",
|
|
42
|
+
"@xyo-network/diviner-payload-memory": "^2.84.13",
|
|
43
|
+
"@xyo-network/diviner-payload-model": "^2.84.13",
|
|
44
|
+
"@xyo-network/diviner-temporal-indexing": "^2.84.13",
|
|
45
|
+
"@xyo-network/hash": "^2.84.13",
|
|
46
|
+
"@xyo-network/manifest": "^2.84.13",
|
|
47
|
+
"@xyo-network/memory-archivist": "^2.84.13",
|
|
48
|
+
"@xyo-network/module-model": "^2.84.13",
|
|
49
|
+
"@xyo-network/node-memory": "^2.84.13",
|
|
50
|
+
"@xyo-network/payload-wrapper": "^2.84.13",
|
|
51
|
+
"@xyo-network/witness-blockchain": "^2.84.13",
|
|
52
|
+
"@xyo-network/witness-blockchain-abstract": "^2.84.13",
|
|
53
53
|
"jest": "^29.7.0",
|
|
54
54
|
"typescript": "^5.3.3"
|
|
55
55
|
},
|
|
@@ -92,6 +92,6 @@
|
|
|
92
92
|
"url": "https://github.com/XYOracleNetwork/plugins.git"
|
|
93
93
|
},
|
|
94
94
|
"sideEffects": false,
|
|
95
|
-
"version": "2.84.
|
|
95
|
+
"version": "2.84.4",
|
|
96
96
|
"type": "module"
|
|
97
97
|
}
|
package/src/Witness.ts
CHANGED
|
@@ -8,17 +8,17 @@ import {
|
|
|
8
8
|
NftWitnessConfigSchema,
|
|
9
9
|
NftWitnessQuery,
|
|
10
10
|
} from '@xyo-network/crypto-nft-payload-plugin'
|
|
11
|
-
import {
|
|
11
|
+
import { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'
|
|
12
12
|
|
|
13
13
|
import { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib'
|
|
14
14
|
|
|
15
|
-
export type CryptoWalletNftWitnessParams =
|
|
15
|
+
export type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>
|
|
16
16
|
|
|
17
17
|
const schema = NftSchema
|
|
18
18
|
|
|
19
19
|
const defaultMaxNfts = 200
|
|
20
20
|
|
|
21
|
-
export class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends
|
|
21
|
+
export class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<
|
|
22
22
|
TParams,
|
|
23
23
|
NftWitnessQuery,
|
|
24
24
|
NftInfo
|