@xyo-network/crypto-nft-witness-wallet-plugin 2.99.5 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index.d.ts +31 -4
- package/dist/browser/index.mjs +137 -171
- package/dist/browser/index.mjs.map +1 -1
- package/dist/neutral/index.d.ts +31 -4
- package/dist/neutral/index.mjs +137 -171
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/node/index.d.ts +31 -4
- package/dist/node/index.mjs +142 -181
- package/dist/node/index.mjs.map +1 -1
- package/package.json +41 -60
- package/src/index.ts +1 -1
- package/dist/browser/Plugin.d.cts +0 -4
- package/dist/browser/Plugin.d.cts.map +0 -1
- package/dist/browser/Plugin.d.mts +0 -4
- package/dist/browser/Plugin.d.mts.map +0 -1
- package/dist/browser/Plugin.d.ts +0 -4
- package/dist/browser/Plugin.d.ts.map +0 -1
- package/dist/browser/Witness.d.cts +0 -12
- package/dist/browser/Witness.d.cts.map +0 -1
- package/dist/browser/Witness.d.mts +0 -12
- package/dist/browser/Witness.d.mts.map +0 -1
- package/dist/browser/Witness.d.ts +0 -12
- package/dist/browser/Witness.d.ts.map +0 -1
- package/dist/browser/index.cjs +0 -389
- package/dist/browser/index.cjs.map +0 -1
- package/dist/browser/index.d.cts +0 -4
- package/dist/browser/index.d.cts.map +0 -1
- package/dist/browser/index.d.mts +0 -4
- package/dist/browser/index.d.mts.map +0 -1
- package/dist/browser/index.d.ts.map +0 -1
- package/dist/browser/lib/contractHasFunctions.d.cts +0 -3
- package/dist/browser/lib/contractHasFunctions.d.cts.map +0 -1
- package/dist/browser/lib/contractHasFunctions.d.mts +0 -3
- package/dist/browser/lib/contractHasFunctions.d.mts.map +0 -1
- package/dist/browser/lib/contractHasFunctions.d.ts +0 -3
- package/dist/browser/lib/contractHasFunctions.d.ts.map +0 -1
- package/dist/browser/lib/getAssetsFromWallet.d.cts +0 -13
- package/dist/browser/lib/getAssetsFromWallet.d.cts.map +0 -1
- package/dist/browser/lib/getAssetsFromWallet.d.mts +0 -13
- package/dist/browser/lib/getAssetsFromWallet.d.mts.map +0 -1
- package/dist/browser/lib/getAssetsFromWallet.d.ts +0 -13
- package/dist/browser/lib/getAssetsFromWallet.d.ts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.cts +0 -4
- package/dist/browser/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.mts +0 -4
- package/dist/browser/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/browser/lib/getNftCollectionMetadata.d.ts +0 -4
- package/dist/browser/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/browser/lib/getNftMetadata.d.cts +0 -4
- package/dist/browser/lib/getNftMetadata.d.cts.map +0 -1
- package/dist/browser/lib/getNftMetadata.d.mts +0 -4
- package/dist/browser/lib/getNftMetadata.d.mts.map +0 -1
- package/dist/browser/lib/getNftMetadata.d.ts +0 -4
- package/dist/browser/lib/getNftMetadata.d.ts.map +0 -1
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.cts +0 -17
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.cts.map +0 -1
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.mts +0 -17
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.mts.map +0 -1
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.ts +0 -17
- package/dist/browser/lib/getNftsFromWalletFromOpenSea.d.ts.map +0 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.cts +0 -9
- package/dist/browser/lib/getNftsOwnedByAddress.d.cts.map +0 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.mts +0 -9
- package/dist/browser/lib/getNftsOwnedByAddress.d.mts.map +0 -1
- package/dist/browser/lib/getNftsOwnedByAddress.d.ts +0 -9
- package/dist/browser/lib/getNftsOwnedByAddress.d.ts.map +0 -1
- package/dist/browser/lib/getProvider.d.cts +0 -3
- package/dist/browser/lib/getProvider.d.cts.map +0 -1
- package/dist/browser/lib/getProvider.d.mts +0 -3
- package/dist/browser/lib/getProvider.d.mts.map +0 -1
- package/dist/browser/lib/getProvider.d.ts +0 -3
- package/dist/browser/lib/getProvider.d.ts.map +0 -1
- package/dist/browser/lib/index.d.cts +0 -4
- package/dist/browser/lib/index.d.cts.map +0 -1
- package/dist/browser/lib/index.d.mts +0 -4
- package/dist/browser/lib/index.d.mts.map +0 -1
- package/dist/browser/lib/index.d.ts +0 -4
- package/dist/browser/lib/index.d.ts.map +0 -1
- package/dist/browser/lib/tokenTypes.d.cts +0 -6
- package/dist/browser/lib/tokenTypes.d.cts.map +0 -1
- package/dist/browser/lib/tokenTypes.d.mts +0 -6
- package/dist/browser/lib/tokenTypes.d.mts.map +0 -1
- package/dist/browser/lib/tokenTypes.d.ts +0 -6
- package/dist/browser/lib/tokenTypes.d.ts.map +0 -1
- package/dist/browser/lib/tryCall.d.cts +0 -2
- package/dist/browser/lib/tryCall.d.cts.map +0 -1
- package/dist/browser/lib/tryCall.d.mts +0 -2
- package/dist/browser/lib/tryCall.d.mts.map +0 -1
- package/dist/browser/lib/tryCall.d.ts +0 -2
- package/dist/browser/lib/tryCall.d.ts.map +0 -1
- package/dist/neutral/Plugin.d.cts +0 -4
- package/dist/neutral/Plugin.d.cts.map +0 -1
- package/dist/neutral/Plugin.d.mts +0 -4
- package/dist/neutral/Plugin.d.mts.map +0 -1
- package/dist/neutral/Plugin.d.ts +0 -4
- package/dist/neutral/Plugin.d.ts.map +0 -1
- package/dist/neutral/Witness.d.cts +0 -12
- package/dist/neutral/Witness.d.cts.map +0 -1
- package/dist/neutral/Witness.d.mts +0 -12
- package/dist/neutral/Witness.d.mts.map +0 -1
- package/dist/neutral/Witness.d.ts +0 -12
- package/dist/neutral/Witness.d.ts.map +0 -1
- package/dist/neutral/index.cjs +0 -389
- package/dist/neutral/index.cjs.map +0 -1
- package/dist/neutral/index.d.cts +0 -4
- package/dist/neutral/index.d.cts.map +0 -1
- package/dist/neutral/index.d.mts +0 -4
- package/dist/neutral/index.d.mts.map +0 -1
- package/dist/neutral/index.d.ts.map +0 -1
- package/dist/neutral/lib/contractHasFunctions.d.cts +0 -3
- package/dist/neutral/lib/contractHasFunctions.d.cts.map +0 -1
- package/dist/neutral/lib/contractHasFunctions.d.mts +0 -3
- package/dist/neutral/lib/contractHasFunctions.d.mts.map +0 -1
- package/dist/neutral/lib/contractHasFunctions.d.ts +0 -3
- package/dist/neutral/lib/contractHasFunctions.d.ts.map +0 -1
- package/dist/neutral/lib/getAssetsFromWallet.d.cts +0 -13
- package/dist/neutral/lib/getAssetsFromWallet.d.cts.map +0 -1
- package/dist/neutral/lib/getAssetsFromWallet.d.mts +0 -13
- package/dist/neutral/lib/getAssetsFromWallet.d.mts.map +0 -1
- package/dist/neutral/lib/getAssetsFromWallet.d.ts +0 -13
- package/dist/neutral/lib/getAssetsFromWallet.d.ts.map +0 -1
- package/dist/neutral/lib/getNftCollectionMetadata.d.cts +0 -4
- package/dist/neutral/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/neutral/lib/getNftCollectionMetadata.d.mts +0 -4
- package/dist/neutral/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/neutral/lib/getNftCollectionMetadata.d.ts +0 -4
- package/dist/neutral/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/neutral/lib/getNftMetadata.d.cts +0 -4
- package/dist/neutral/lib/getNftMetadata.d.cts.map +0 -1
- package/dist/neutral/lib/getNftMetadata.d.mts +0 -4
- package/dist/neutral/lib/getNftMetadata.d.mts.map +0 -1
- package/dist/neutral/lib/getNftMetadata.d.ts +0 -4
- package/dist/neutral/lib/getNftMetadata.d.ts.map +0 -1
- package/dist/neutral/lib/getNftsFromWalletFromOpenSea.d.cts +0 -17
- package/dist/neutral/lib/getNftsFromWalletFromOpenSea.d.cts.map +0 -1
- package/dist/neutral/lib/getNftsFromWalletFromOpenSea.d.mts +0 -17
- package/dist/neutral/lib/getNftsFromWalletFromOpenSea.d.mts.map +0 -1
- package/dist/neutral/lib/getNftsFromWalletFromOpenSea.d.ts +0 -17
- package/dist/neutral/lib/getNftsFromWalletFromOpenSea.d.ts.map +0 -1
- package/dist/neutral/lib/getNftsOwnedByAddress.d.cts +0 -9
- package/dist/neutral/lib/getNftsOwnedByAddress.d.cts.map +0 -1
- package/dist/neutral/lib/getNftsOwnedByAddress.d.mts +0 -9
- package/dist/neutral/lib/getNftsOwnedByAddress.d.mts.map +0 -1
- package/dist/neutral/lib/getNftsOwnedByAddress.d.ts +0 -9
- package/dist/neutral/lib/getNftsOwnedByAddress.d.ts.map +0 -1
- package/dist/neutral/lib/getProvider.d.cts +0 -3
- package/dist/neutral/lib/getProvider.d.cts.map +0 -1
- package/dist/neutral/lib/getProvider.d.mts +0 -3
- package/dist/neutral/lib/getProvider.d.mts.map +0 -1
- package/dist/neutral/lib/getProvider.d.ts +0 -3
- package/dist/neutral/lib/getProvider.d.ts.map +0 -1
- package/dist/neutral/lib/index.d.cts +0 -4
- package/dist/neutral/lib/index.d.cts.map +0 -1
- package/dist/neutral/lib/index.d.mts +0 -4
- package/dist/neutral/lib/index.d.mts.map +0 -1
- package/dist/neutral/lib/index.d.ts +0 -4
- package/dist/neutral/lib/index.d.ts.map +0 -1
- package/dist/neutral/lib/tokenTypes.d.cts +0 -6
- package/dist/neutral/lib/tokenTypes.d.cts.map +0 -1
- package/dist/neutral/lib/tokenTypes.d.mts +0 -6
- package/dist/neutral/lib/tokenTypes.d.mts.map +0 -1
- package/dist/neutral/lib/tokenTypes.d.ts +0 -6
- package/dist/neutral/lib/tokenTypes.d.ts.map +0 -1
- package/dist/neutral/lib/tryCall.d.cts +0 -2
- package/dist/neutral/lib/tryCall.d.cts.map +0 -1
- package/dist/neutral/lib/tryCall.d.mts +0 -2
- package/dist/neutral/lib/tryCall.d.mts.map +0 -1
- package/dist/neutral/lib/tryCall.d.ts +0 -2
- package/dist/neutral/lib/tryCall.d.ts.map +0 -1
- package/dist/node/Plugin.d.cts +0 -4
- package/dist/node/Plugin.d.cts.map +0 -1
- package/dist/node/Plugin.d.mts +0 -4
- package/dist/node/Plugin.d.mts.map +0 -1
- package/dist/node/Plugin.d.ts +0 -4
- package/dist/node/Plugin.d.ts.map +0 -1
- package/dist/node/Witness.d.cts +0 -12
- package/dist/node/Witness.d.cts.map +0 -1
- package/dist/node/Witness.d.mts +0 -12
- package/dist/node/Witness.d.mts.map +0 -1
- package/dist/node/Witness.d.ts +0 -12
- package/dist/node/Witness.d.ts.map +0 -1
- package/dist/node/index.cjs +0 -408
- package/dist/node/index.cjs.map +0 -1
- package/dist/node/index.d.cts +0 -4
- package/dist/node/index.d.cts.map +0 -1
- package/dist/node/index.d.mts +0 -4
- package/dist/node/index.d.mts.map +0 -1
- package/dist/node/index.d.ts.map +0 -1
- package/dist/node/lib/contractHasFunctions.d.cts +0 -3
- package/dist/node/lib/contractHasFunctions.d.cts.map +0 -1
- package/dist/node/lib/contractHasFunctions.d.mts +0 -3
- package/dist/node/lib/contractHasFunctions.d.mts.map +0 -1
- package/dist/node/lib/contractHasFunctions.d.ts +0 -3
- package/dist/node/lib/contractHasFunctions.d.ts.map +0 -1
- package/dist/node/lib/getAssetsFromWallet.d.cts +0 -13
- package/dist/node/lib/getAssetsFromWallet.d.cts.map +0 -1
- package/dist/node/lib/getAssetsFromWallet.d.mts +0 -13
- package/dist/node/lib/getAssetsFromWallet.d.mts.map +0 -1
- package/dist/node/lib/getAssetsFromWallet.d.ts +0 -13
- package/dist/node/lib/getAssetsFromWallet.d.ts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.cts +0 -4
- package/dist/node/lib/getNftCollectionMetadata.d.cts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.mts +0 -4
- package/dist/node/lib/getNftCollectionMetadata.d.mts.map +0 -1
- package/dist/node/lib/getNftCollectionMetadata.d.ts +0 -4
- package/dist/node/lib/getNftCollectionMetadata.d.ts.map +0 -1
- package/dist/node/lib/getNftMetadata.d.cts +0 -4
- package/dist/node/lib/getNftMetadata.d.cts.map +0 -1
- package/dist/node/lib/getNftMetadata.d.mts +0 -4
- package/dist/node/lib/getNftMetadata.d.mts.map +0 -1
- package/dist/node/lib/getNftMetadata.d.ts +0 -4
- package/dist/node/lib/getNftMetadata.d.ts.map +0 -1
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.cts +0 -17
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.cts.map +0 -1
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.mts +0 -17
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.mts.map +0 -1
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.ts +0 -17
- package/dist/node/lib/getNftsFromWalletFromOpenSea.d.ts.map +0 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.cts +0 -9
- package/dist/node/lib/getNftsOwnedByAddress.d.cts.map +0 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.mts +0 -9
- package/dist/node/lib/getNftsOwnedByAddress.d.mts.map +0 -1
- package/dist/node/lib/getNftsOwnedByAddress.d.ts +0 -9
- package/dist/node/lib/getNftsOwnedByAddress.d.ts.map +0 -1
- package/dist/node/lib/getProvider.d.cts +0 -3
- package/dist/node/lib/getProvider.d.cts.map +0 -1
- package/dist/node/lib/getProvider.d.mts +0 -3
- package/dist/node/lib/getProvider.d.mts.map +0 -1
- package/dist/node/lib/getProvider.d.ts +0 -3
- package/dist/node/lib/getProvider.d.ts.map +0 -1
- package/dist/node/lib/index.d.cts +0 -4
- package/dist/node/lib/index.d.cts.map +0 -1
- package/dist/node/lib/index.d.mts +0 -4
- package/dist/node/lib/index.d.mts.map +0 -1
- package/dist/node/lib/index.d.ts +0 -4
- package/dist/node/lib/index.d.ts.map +0 -1
- package/dist/node/lib/tokenTypes.d.cts +0 -6
- package/dist/node/lib/tokenTypes.d.cts.map +0 -1
- package/dist/node/lib/tokenTypes.d.mts +0 -6
- package/dist/node/lib/tokenTypes.d.mts.map +0 -1
- package/dist/node/lib/tokenTypes.d.ts +0 -6
- package/dist/node/lib/tokenTypes.d.ts.map +0 -1
- package/dist/node/lib/tryCall.d.cts +0 -2
- package/dist/node/lib/tryCall.d.cts.map +0 -1
- package/dist/node/lib/tryCall.d.mts +0 -2
- package/dist/node/lib/tryCall.d.mts.map +0 -1
- package/dist/node/lib/tryCall.d.ts +0 -2
- package/dist/node/lib/tryCall.d.ts.map +0 -1
package/dist/browser/index.d.ts
CHANGED
|
@@ -1,4 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { Provider, Interface } from 'ethers';
|
|
2
|
+
import { TokenType, NftInfoFields, CryptoWalletNftWitnessConfig, NftWitnessQuery, NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
|
|
3
|
+
import { PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin';
|
|
4
|
+
import { Schema } from '@xyo-network/payload-model';
|
|
5
|
+
import { EvmWitnessParams, AbstractEvmWitness } from '@xyo-network/witness-evm-abstract';
|
|
6
|
+
|
|
7
|
+
declare const contractHasFunctions: (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
|
|
8
|
+
|
|
9
|
+
declare const getTokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
|
|
10
|
+
declare const getErc721MetadataUri: (address: string, tokenId: string, provider: Provider) => Promise<[string | undefined, Error | undefined]>;
|
|
11
|
+
declare const getErc1155MetadataUri: (address: string, tokenId: string, provider: Provider) => Promise<[string | undefined, Error | undefined]>;
|
|
12
|
+
declare const getNftMetadataUri: (address: string, tokenId: string, provider: Provider) => Promise<string | undefined>;
|
|
13
|
+
declare const getNftsOwnedByAddressWithMetadata: (publicAddress: string, providers: Provider[], maxNfts?: number, timeout?: number) => Promise<NftInfoFields[]>;
|
|
14
|
+
declare const getNftsOwnedByAddress: (publicAddress: string, providers: Provider[], maxNfts?: number, timeout?: number) => Promise<NftInfoFields[]>;
|
|
15
|
+
|
|
16
|
+
declare const isErc1155: (provider: Provider, address: string) => Promise<boolean>;
|
|
17
|
+
declare const isErc721: (provider: Provider, address: string) => Promise<boolean>;
|
|
18
|
+
declare const tokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
|
|
19
|
+
|
|
20
|
+
type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
21
|
+
declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
22
|
+
static readonly configSchemas: Schema[];
|
|
23
|
+
static readonly defaultConfigSchema: Schema;
|
|
24
|
+
get loadMetadata(): boolean;
|
|
25
|
+
get timeout(): number;
|
|
26
|
+
protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare const CryptoWalletNftWitnessPlugin: () => PayloadSetWitnessPlugin<CryptoWalletNftWitness>;
|
|
30
|
+
|
|
31
|
+
export { CryptoWalletNftWitness, type CryptoWalletNftWitnessParams, CryptoWalletNftWitnessPlugin, contractHasFunctions, CryptoWalletNftWitnessPlugin as default, getErc1155MetadataUri, getErc721MetadataUri, getNftMetadataUri, getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata, getTokenTypes, isErc1155, isErc721, tokenTypes };
|
package/dist/browser/index.mjs
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
var __defProp = Object.defineProperty;
|
|
2
|
-
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
-
|
|
4
1
|
// src/lib/contractHasFunctions.ts
|
|
5
2
|
import { assertEx } from "@xylabs/assert";
|
|
6
|
-
var contractHasFunctions =
|
|
3
|
+
var contractHasFunctions = async (provider, address, contractInterface, functionNames) => {
|
|
7
4
|
try {
|
|
8
5
|
const bytecode = await provider.getCode(address, "latest");
|
|
9
6
|
for (const functionName of functionNames) {
|
|
@@ -19,7 +16,7 @@ var contractHasFunctions = /* @__PURE__ */ __name(async (provider, address, cont
|
|
|
19
16
|
console.log(error);
|
|
20
17
|
return false;
|
|
21
18
|
}
|
|
22
|
-
}
|
|
19
|
+
};
|
|
23
20
|
|
|
24
21
|
// src/lib/getNftsOwnedByAddress.ts
|
|
25
22
|
import { isHexZero } from "@xylabs/hex";
|
|
@@ -36,23 +33,14 @@ import parseDataUrl from "parse-data-url";
|
|
|
36
33
|
|
|
37
34
|
// src/lib/tokenTypes.ts
|
|
38
35
|
import { ERC1155URIStorage__factory, IERC721Metadata__factory } from "@xyo-network/open-zeppelin-typechain";
|
|
39
|
-
var isErc1155 =
|
|
40
|
-
return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), [
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
"symbol",
|
|
48
|
-
"tokenURI"
|
|
49
|
-
]);
|
|
50
|
-
}, "isErc721");
|
|
51
|
-
var tokenTypes = /* @__PURE__ */ __name(async (provider, address) => {
|
|
52
|
-
const [erc721, erc1155] = await Promise.all([
|
|
53
|
-
isErc721(provider, address),
|
|
54
|
-
isErc1155(provider, address)
|
|
55
|
-
]);
|
|
36
|
+
var isErc1155 = async (provider, address) => {
|
|
37
|
+
return await contractHasFunctions(provider, address, ERC1155URIStorage__factory.createInterface(), ["uri"]);
|
|
38
|
+
};
|
|
39
|
+
var isErc721 = async (provider, address) => {
|
|
40
|
+
return await contractHasFunctions(provider, address, IERC721Metadata__factory.createInterface(), ["name", "symbol", "tokenURI"]);
|
|
41
|
+
};
|
|
42
|
+
var tokenTypes = async (provider, address) => {
|
|
43
|
+
const [erc721, erc1155] = await Promise.all([isErc721(provider, address), isErc1155(provider, address)]);
|
|
56
44
|
const result = [];
|
|
57
45
|
if (erc721) {
|
|
58
46
|
result.push("ERC721");
|
|
@@ -61,11 +49,11 @@ var tokenTypes = /* @__PURE__ */ __name(async (provider, address) => {
|
|
|
61
49
|
result.push("ERC1155");
|
|
62
50
|
}
|
|
63
51
|
return result;
|
|
64
|
-
}
|
|
52
|
+
};
|
|
65
53
|
|
|
66
54
|
// src/lib/getNftMetadata.ts
|
|
67
55
|
var ipfsGateway = "5d7b6582.beta.decentralnetworkservices.com";
|
|
68
|
-
var getNftMetadata =
|
|
56
|
+
var getNftMetadata = async (contractAddress, provider, tokenId, load = false, defaultUri) => {
|
|
69
57
|
const storage721 = ERC721URIStorage__factory.connect(contractAddress, provider);
|
|
70
58
|
const storage1155 = ERC1155URIStorage__factory2.connect(contractAddress, provider);
|
|
71
59
|
let uri721 = void 0;
|
|
@@ -98,9 +86,7 @@ var getNftMetadata = /* @__PURE__ */ __name(async (contractAddress, provider, to
|
|
|
98
86
|
}
|
|
99
87
|
} else {
|
|
100
88
|
let checkedMetaDataUri;
|
|
101
|
-
const axios = new AxiosJson({
|
|
102
|
-
timeout: 5e3
|
|
103
|
-
});
|
|
89
|
+
const axios = new AxiosJson({ timeout: 5e3 });
|
|
104
90
|
try {
|
|
105
91
|
if (tokenMetadataUri && tokenMetadataUri.length > 0) {
|
|
106
92
|
checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri;
|
|
@@ -114,34 +100,26 @@ var getNftMetadata = /* @__PURE__ */ __name(async (contractAddress, provider, to
|
|
|
114
100
|
}
|
|
115
101
|
}
|
|
116
102
|
}
|
|
117
|
-
return [
|
|
118
|
-
|
|
119
|
-
metadata
|
|
120
|
-
];
|
|
121
|
-
}, "getNftMetadata");
|
|
103
|
+
return [tokenMetadataUri, metadata];
|
|
104
|
+
};
|
|
122
105
|
|
|
123
106
|
// src/lib/getNftsFromWalletFromOpenSea.ts
|
|
124
107
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
125
108
|
import { AxiosJson as AxiosJson2 } from "@xylabs/axios";
|
|
126
|
-
var getNftsFromWalletFromOpenSea =
|
|
109
|
+
var getNftsFromWalletFromOpenSea = async (address, maxNfts = 200, timeout = 2e3) => {
|
|
127
110
|
const apiKey = assertEx2(process.env.OPENSEA_API_KEY, () => "No opensea key found");
|
|
128
|
-
const axios = new AxiosJson2({
|
|
129
|
-
headers: {
|
|
130
|
-
"x-api-key": apiKey
|
|
131
|
-
},
|
|
132
|
-
timeout
|
|
133
|
-
});
|
|
111
|
+
const axios = new AxiosJson2({ headers: { "x-api-key": apiKey }, timeout });
|
|
134
112
|
const nfts = (await axios.get(`https://api.opensea.io/api/v2/chain/ethereum/account/${address}/nfts?limit=${maxNfts}`)).data.nfts;
|
|
135
113
|
return nfts;
|
|
136
|
-
}
|
|
114
|
+
};
|
|
137
115
|
|
|
138
116
|
// src/lib/getProvider.ts
|
|
139
|
-
var getProvider =
|
|
117
|
+
var getProvider = (providers) => {
|
|
140
118
|
return providers[Date.now() % providers.length];
|
|
141
|
-
}
|
|
119
|
+
};
|
|
142
120
|
|
|
143
121
|
// src/lib/tryCall.ts
|
|
144
|
-
var tryCall =
|
|
122
|
+
var tryCall = async (func, name) => {
|
|
145
123
|
try {
|
|
146
124
|
return await func();
|
|
147
125
|
} catch (ex) {
|
|
@@ -151,13 +129,11 @@ var tryCall = /* @__PURE__ */ __name(async (func, name) => {
|
|
|
151
129
|
}
|
|
152
130
|
return void 0;
|
|
153
131
|
}
|
|
154
|
-
}
|
|
132
|
+
};
|
|
155
133
|
|
|
156
134
|
// src/lib/getNftsOwnedByAddress.ts
|
|
157
|
-
var tokenTypeCache = new LRUCache({
|
|
158
|
-
|
|
159
|
-
});
|
|
160
|
-
var getTokenTypes = /* @__PURE__ */ __name(async (provider, address) => {
|
|
135
|
+
var tokenTypeCache = new LRUCache({ max: 100 });
|
|
136
|
+
var getTokenTypes = async (provider, address) => {
|
|
161
137
|
const key = `${address}|${(await provider.getNetwork()).chainId}`;
|
|
162
138
|
const currentValue = tokenTypeCache.get(key);
|
|
163
139
|
if (currentValue) {
|
|
@@ -167,103 +143,98 @@ var getTokenTypes = /* @__PURE__ */ __name(async (provider, address) => {
|
|
|
167
143
|
tokenTypeCache.set(key, types);
|
|
168
144
|
return types;
|
|
169
145
|
}
|
|
170
|
-
}
|
|
171
|
-
var getErc721MetadataUri =
|
|
146
|
+
};
|
|
147
|
+
var getErc721MetadataUri = async (address, tokenId, provider) => {
|
|
172
148
|
try {
|
|
173
149
|
const contract = ERC721__factory.connect(address, provider);
|
|
174
|
-
return [
|
|
175
|
-
await contract.tokenURI(tokenId),
|
|
176
|
-
void 0
|
|
177
|
-
];
|
|
150
|
+
return [await contract.tokenURI(tokenId), void 0];
|
|
178
151
|
} catch (ex) {
|
|
179
|
-
return [
|
|
180
|
-
void 0,
|
|
181
|
-
ex
|
|
182
|
-
];
|
|
152
|
+
return [void 0, ex];
|
|
183
153
|
}
|
|
184
|
-
}
|
|
185
|
-
var getErc1155MetadataUri =
|
|
154
|
+
};
|
|
155
|
+
var getErc1155MetadataUri = async (address, tokenId, provider) => {
|
|
186
156
|
try {
|
|
187
157
|
const contract = ERC1155__factory.connect(address, provider);
|
|
188
|
-
return [
|
|
189
|
-
await contract.uri(tokenId),
|
|
190
|
-
void 0
|
|
191
|
-
];
|
|
158
|
+
return [await contract.uri(tokenId), void 0];
|
|
192
159
|
} catch (ex) {
|
|
193
|
-
return [
|
|
194
|
-
void 0,
|
|
195
|
-
ex
|
|
196
|
-
];
|
|
160
|
+
return [void 0, ex];
|
|
197
161
|
}
|
|
198
|
-
}
|
|
199
|
-
var getNftMetadataUri =
|
|
200
|
-
const results = await Promise.all([
|
|
201
|
-
getErc721MetadataUri(address, tokenId, provider),
|
|
202
|
-
getErc1155MetadataUri(address, tokenId, provider)
|
|
203
|
-
]);
|
|
162
|
+
};
|
|
163
|
+
var getNftMetadataUri = async (address, tokenId, provider) => {
|
|
164
|
+
const results = await Promise.all([getErc721MetadataUri(address, tokenId, provider), getErc1155MetadataUri(address, tokenId, provider)]);
|
|
204
165
|
return results[0][0] ?? results[1][0];
|
|
205
|
-
}
|
|
206
|
-
var getNftsOwnedByAddressWithMetadata =
|
|
166
|
+
};
|
|
167
|
+
var getNftsOwnedByAddressWithMetadata = async (publicAddress, providers, maxNfts = 200, timeout = 5e3) => {
|
|
207
168
|
const nfts = await getNftsOwnedByAddress(publicAddress, providers, maxNfts, timeout);
|
|
208
|
-
const nftResult = await Promise.all(
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
169
|
+
const nftResult = await Promise.all(
|
|
170
|
+
nfts.map(async (nft) => {
|
|
171
|
+
try {
|
|
172
|
+
if (!nft.metadataUri || !nft.metadata) {
|
|
173
|
+
const [metadataUri, metadata] = await getNftMetadata(
|
|
174
|
+
nft.implementation ?? nft.address,
|
|
175
|
+
getProvider(providers),
|
|
176
|
+
nft.tokenId,
|
|
177
|
+
true,
|
|
178
|
+
nft.metadataUri
|
|
179
|
+
);
|
|
180
|
+
nft.metadata = nft.metadata ?? metadata;
|
|
181
|
+
nft.metadataUri = nft.metadataUri ?? metadataUri;
|
|
182
|
+
}
|
|
183
|
+
return nft;
|
|
184
|
+
} catch (ex) {
|
|
185
|
+
const error = ex;
|
|
186
|
+
console.error(`Error: ${error.message}`);
|
|
187
|
+
console.error(`${error.stack}`);
|
|
188
|
+
throw ex;
|
|
214
189
|
}
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const error = ex;
|
|
218
|
-
console.error(`Error: ${error.message}`);
|
|
219
|
-
console.error(`${error.stack}`);
|
|
220
|
-
throw ex;
|
|
221
|
-
}
|
|
222
|
-
}));
|
|
190
|
+
})
|
|
191
|
+
);
|
|
223
192
|
return nftResult;
|
|
224
|
-
}
|
|
225
|
-
var getNftsOwnedByAddress =
|
|
193
|
+
};
|
|
194
|
+
var getNftsOwnedByAddress = async (publicAddress, providers, maxNfts = 100, timeout = 5e3) => {
|
|
226
195
|
const nfts = await getNftsFromWalletFromOpenSea(publicAddress, maxNfts, timeout);
|
|
227
|
-
const nftResult = await Promise.all(
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
196
|
+
const nftResult = await Promise.all(
|
|
197
|
+
nfts.map(async (nft) => {
|
|
198
|
+
try {
|
|
199
|
+
const { contract, identifier, metadata_url } = nft;
|
|
200
|
+
const provider = getProvider(providers);
|
|
201
|
+
const block = await provider.getBlockNumber();
|
|
202
|
+
const [erc1967Status, erc1822Status] = await Promise.all([
|
|
203
|
+
// Check if ERC-1967 Upgradeable
|
|
204
|
+
getErc1967SlotStatus(provider, contract, block),
|
|
205
|
+
// Check if ERC-1822 Upgradeable
|
|
206
|
+
getErc1822SlotStatus(provider, contract, block)
|
|
207
|
+
]);
|
|
208
|
+
const implementation = !erc1967Status.slots.implementation || isHexZero(erc1967Status.slots.implementation) ? erc1822Status.implementation : erc1967Status.implementation;
|
|
209
|
+
let supply = 1n;
|
|
210
|
+
const types = await getTokenTypes(provider, implementation);
|
|
211
|
+
if (types.includes("ERC1155")) {
|
|
212
|
+
const supply1155 = ERC1155Supply__factory.connect(implementation, getProvider(providers));
|
|
213
|
+
supply = await tryCall(async () => await supply1155["totalSupply(uint256)"](erc1967Status.address)) ?? 1n;
|
|
214
|
+
}
|
|
215
|
+
const fields = {
|
|
216
|
+
address: contract,
|
|
217
|
+
chainId: Number((await provider.getNetwork()).chainId),
|
|
218
|
+
metadataUri: metadata_url ?? void 0,
|
|
219
|
+
supply: `0x${supply.toString(16)}`,
|
|
220
|
+
tokenId: identifier,
|
|
221
|
+
type: types.at(0),
|
|
222
|
+
types
|
|
223
|
+
};
|
|
224
|
+
if (implementation !== contract) {
|
|
225
|
+
fields.implementation = implementation;
|
|
226
|
+
}
|
|
227
|
+
return fields;
|
|
228
|
+
} catch (ex) {
|
|
229
|
+
const error = ex;
|
|
230
|
+
console.error(`Error: ${error.message}`);
|
|
231
|
+
console.error(`${error.stack}`);
|
|
232
|
+
throw ex;
|
|
256
233
|
}
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
const error = ex;
|
|
260
|
-
console.error(`Error: ${error.message}`);
|
|
261
|
-
console.error(`${error.stack}`);
|
|
262
|
-
throw ex;
|
|
263
|
-
}
|
|
264
|
-
}));
|
|
234
|
+
})
|
|
235
|
+
);
|
|
265
236
|
return nftResult;
|
|
266
|
-
}
|
|
237
|
+
};
|
|
267
238
|
|
|
268
239
|
// src/Plugin.ts
|
|
269
240
|
import { NftSchema as NftSchema2 } from "@xyo-network/crypto-nft-payload-plugin";
|
|
@@ -273,18 +244,16 @@ import { createPayloadSetWitnessPlugin } from "@xyo-network/payloadset-plugin";
|
|
|
273
244
|
// src/Witness.ts
|
|
274
245
|
import { assertEx as assertEx3 } from "@xylabs/assert";
|
|
275
246
|
import { EthAddress } from "@xylabs/eth-address";
|
|
276
|
-
import {
|
|
247
|
+
import {
|
|
248
|
+
isNftWitnessQuery,
|
|
249
|
+
NftSchema,
|
|
250
|
+
NftWitnessConfigSchema
|
|
251
|
+
} from "@xyo-network/crypto-nft-payload-plugin";
|
|
277
252
|
import { AbstractEvmWitness } from "@xyo-network/witness-evm-abstract";
|
|
278
253
|
var schema = NftSchema;
|
|
279
254
|
var defaultMaxNfts = 200;
|
|
280
255
|
var CryptoWalletNftWitness = class extends AbstractEvmWitness {
|
|
281
|
-
static
|
|
282
|
-
__name(this, "CryptoWalletNftWitness");
|
|
283
|
-
}
|
|
284
|
-
static configSchemas = [
|
|
285
|
-
...super.configSchemas,
|
|
286
|
-
NftWitnessConfigSchema
|
|
287
|
-
];
|
|
256
|
+
static configSchemas = [...super.configSchemas, NftWitnessConfigSchema];
|
|
288
257
|
static defaultConfigSchema = NftWitnessConfigSchema;
|
|
289
258
|
get loadMetadata() {
|
|
290
259
|
return this.config.loadMetadata ?? true;
|
|
@@ -297,28 +266,27 @@ var CryptoWalletNftWitness = class extends AbstractEvmWitness {
|
|
|
297
266
|
const queries = payloads?.filter(isNftWitnessQuery) ?? [];
|
|
298
267
|
const providers = await this.getProviders();
|
|
299
268
|
try {
|
|
300
|
-
const observations = await Promise.all(
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
...nft,
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
})
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
}));
|
|
269
|
+
const observations = await Promise.all(
|
|
270
|
+
queries.map(async (query) => {
|
|
271
|
+
const provider = await this.getProvider(true, true);
|
|
272
|
+
const addressValue = assertEx3(query?.address ?? this.config.address, () => "params.address is required");
|
|
273
|
+
const parsedAddressValue = EthAddress.parse(addressValue);
|
|
274
|
+
const address = assertEx3(parsedAddressValue?.toString(), () => "Failed to parse params.address");
|
|
275
|
+
const network = await provider.getNetwork();
|
|
276
|
+
const chainId = assertEx3(network.chainId, () => "params.chainId is required");
|
|
277
|
+
const maxNfts = query?.maxNfts || defaultMaxNfts;
|
|
278
|
+
try {
|
|
279
|
+
const nfts = this.loadMetadata ? await getNftsOwnedByAddressWithMetadata(address, providers, maxNfts, this.timeout) : await getNftsOwnedByAddress(address, providers, maxNfts, this.timeout);
|
|
280
|
+
const observation = nfts.map((nft) => {
|
|
281
|
+
return { ...nft, schema };
|
|
282
|
+
});
|
|
283
|
+
return observation;
|
|
284
|
+
} catch (ex) {
|
|
285
|
+
const error = ex;
|
|
286
|
+
throw new Error(`Failed to get nfts for address ${address} on chainId ${chainId}: ${error.message}`);
|
|
287
|
+
}
|
|
288
|
+
})
|
|
289
|
+
);
|
|
322
290
|
return observations.flat();
|
|
323
291
|
} catch (ex) {
|
|
324
292
|
const error = ex;
|
|
@@ -329,17 +297,15 @@ var CryptoWalletNftWitness = class extends AbstractEvmWitness {
|
|
|
329
297
|
};
|
|
330
298
|
|
|
331
299
|
// src/Plugin.ts
|
|
332
|
-
var CryptoWalletNftWitnessPlugin =
|
|
333
|
-
required: {
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
}, "witness")
|
|
342
|
-
}), "CryptoWalletNftWitnessPlugin");
|
|
300
|
+
var CryptoWalletNftWitnessPlugin = () => createPayloadSetWitnessPlugin(
|
|
301
|
+
{ required: { [NftSchema2]: 1 }, schema: PayloadSetSchema },
|
|
302
|
+
{
|
|
303
|
+
witness: async (params) => {
|
|
304
|
+
const result = await CryptoWalletNftWitness.create(params);
|
|
305
|
+
return result;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
);
|
|
343
309
|
export {
|
|
344
310
|
CryptoWalletNftWitness,
|
|
345
311
|
CryptoWalletNftWitnessPlugin,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../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/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n if (!bytecode.includes(selector.slice(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.ts'\nimport { getNftsFromWalletFromOpenSea } from './getNftsFromWalletFromOpenSea.ts'\nimport { getProvider } from './getProvider.ts'\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n 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\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.ts'\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 {\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 {\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 > 0) {\n checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n }\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch {\n try {\n metadata = defaultUri ? (await axios.get(defaultUri)).data : undefined\n } catch {\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.ts'\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 { 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.ts'\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 { Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib/index.ts'\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 readonly configSchemas: Schema[] = [...super.configSchemas, NftWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftWitnessConfigSchema\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10_000\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\n = 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 new 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"],"mappings":"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","names":["assertEx","contractHasFunctions","provider","address","contractInterface","functionNames","bytecode","getCode","functionName","selector","assertEx","getFunction","includes","slice","ex","error","console","log","isHexZero","getErc1822SlotStatus","getErc1967SlotStatus","ERC721__factory","ERC1155__factory","ERC1155Supply__factory","LRUCache","AxiosJson","ERC721URIStorage__factory","ERC1155URIStorage__factory","checkIpfsUrl","parseDataUrl","ERC1155URIStorage__factory","IERC721Metadata__factory","isErc1155","provider","address","contractHasFunctions","ERC1155URIStorage__factory","createInterface","isErc721","IERC721Metadata__factory","tokenTypes","erc721","erc1155","Promise","all","result","push","ipfsGateway","getNftMetadata","contractAddress","provider","tokenId","load","defaultUri","storage721","ERC721URIStorage__factory","connect","storage1155","ERC1155URIStorage__factory","uri721","undefined","is721","isErc721","tokenURI","uri1155","is1155","isErc1155","uri","tokenMetadataUri","metadata","startsWith","parsedDataUrl","parseDataUrl","contentType","buf","toBuffer","value","toString","JSON","parse","checkedMetaDataUri","axios","AxiosJson","timeout","length","checkIpfsUrl","get","data","assertEx","AxiosJson","getNftsFromWalletFromOpenSea","address","maxNfts","timeout","apiKey","assertEx","process","env","OPENSEA_API_KEY","axios","AxiosJson","headers","nfts","get","data","getProvider","providers","Date","now","length","tryCall","func","name","ex","error","console","log","message","undefined","tokenTypeCache","LRUCache","max","getTokenTypes","provider","address","key","getNetwork","chainId","currentValue","get","types","tokenTypes","set","getErc721MetadataUri","tokenId","contract","ERC721__factory","connect","tokenURI","undefined","ex","getErc1155MetadataUri","ERC1155__factory","uri","getNftMetadataUri","results","Promise","all","getNftsOwnedByAddressWithMetadata","publicAddress","providers","maxNfts","timeout","nfts","getNftsOwnedByAddress","nftResult","map","nft","metadataUri","metadata","getNftMetadata","implementation","getProvider","error","console","message","stack","getNftsFromWalletFromOpenSea","identifier","metadata_url","block","getBlockNumber","erc1967Status","erc1822Status","getErc1967SlotStatus","getErc1822SlotStatus","slots","isHexZero","supply","includes","supply1155","ERC1155Supply__factory","tryCall","fields","Number","toString","type","at","NftSchema","PayloadSetSchema","createPayloadSetWitnessPlugin","assertEx","EthAddress","isNftWitnessQuery","NftSchema","NftWitnessConfigSchema","AbstractEvmWitness","schema","NftSchema","defaultMaxNfts","CryptoWalletNftWitness","AbstractEvmWitness","configSchemas","NftWitnessConfigSchema","defaultConfigSchema","loadMetadata","config","timeout","observeHandler","payloads","started","queries","filter","isNftWitnessQuery","providers","getProviders","observations","Promise","all","map","query","provider","getProvider","addressValue","assertEx","address","parsedAddressValue","EthAddress","parse","toString","network","getNetwork","chainId","maxNfts","nfts","getNftsOwnedByAddressWithMetadata","getNftsOwnedByAddress","observation","nft","ex","error","Error","message","flat","console","CryptoWalletNftWitnessPlugin","createPayloadSetWitnessPlugin","required","NftSchema","schema","PayloadSetSchema","witness","params","result","CryptoWalletNftWitness","create"]}
|
|
1
|
+
{"version":3,"sources":["../../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/Plugin.ts","../../src/Witness.ts"],"sourcesContent":["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 (const functionName of functionNames) {\n const selector = assertEx(contractInterface.getFunction(functionName)?.selector, () => 'Function not found on interface')\n if (!bytecode.includes(selector.slice(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.ts'\nimport { getNftsFromWalletFromOpenSea } from './getNftsFromWalletFromOpenSea.ts'\nimport { getProvider } from './getProvider.ts'\nimport { tokenTypes } from './tokenTypes.ts'\nimport { tryCall } from './tryCall.ts'\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 getErc1967SlotStatus(provider, contract, block),\n\n // Check if ERC-1822 Upgradeable\n 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\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.ts'\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 {\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 {\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 > 0) {\n checkedMetaDataUri = tokenMetadataUri ? checkIpfsUrl(tokenMetadataUri, ipfsGateway) : tokenMetadataUri\n }\n metadata = checkedMetaDataUri ? (await axios.get(checkedMetaDataUri)).data : undefined\n } catch {\n try {\n metadata = defaultUri ? (await axios.get(defaultUri)).data : undefined\n } catch {\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.ts'\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 { 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.ts'\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 { Schema } from '@xyo-network/payload-model'\nimport { AbstractEvmWitness, EvmWitnessParams } from '@xyo-network/witness-evm-abstract'\n\nimport { getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata } from './lib/index.ts'\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 readonly configSchemas: Schema[] = [...super.configSchemas, NftWitnessConfigSchema]\n static override readonly defaultConfigSchema: Schema = NftWitnessConfigSchema\n\n get loadMetadata() {\n return this.config.loadMetadata ?? true\n }\n\n get timeout() {\n return this.config.timeout ?? 10_000\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\n = 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 new 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"],"mappings":"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","names":["ERC1155URIStorage__factory","ERC1155URIStorage__factory","assertEx","AxiosJson","NftSchema","assertEx","assertEx","NftSchema"]}
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -1,4 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { Provider, Interface } from 'ethers';
|
|
2
|
+
import { TokenType, NftInfoFields, CryptoWalletNftWitnessConfig, NftWitnessQuery, NftInfo } from '@xyo-network/crypto-nft-payload-plugin';
|
|
3
|
+
import { PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin';
|
|
4
|
+
import { Schema } from '@xyo-network/payload-model';
|
|
5
|
+
import { EvmWitnessParams, AbstractEvmWitness } from '@xyo-network/witness-evm-abstract';
|
|
6
|
+
|
|
7
|
+
declare const contractHasFunctions: (provider: Provider, address: string, contractInterface: Interface, functionNames: string[]) => Promise<boolean>;
|
|
8
|
+
|
|
9
|
+
declare const getTokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
|
|
10
|
+
declare const getErc721MetadataUri: (address: string, tokenId: string, provider: Provider) => Promise<[string | undefined, Error | undefined]>;
|
|
11
|
+
declare const getErc1155MetadataUri: (address: string, tokenId: string, provider: Provider) => Promise<[string | undefined, Error | undefined]>;
|
|
12
|
+
declare const getNftMetadataUri: (address: string, tokenId: string, provider: Provider) => Promise<string | undefined>;
|
|
13
|
+
declare const getNftsOwnedByAddressWithMetadata: (publicAddress: string, providers: Provider[], maxNfts?: number, timeout?: number) => Promise<NftInfoFields[]>;
|
|
14
|
+
declare const getNftsOwnedByAddress: (publicAddress: string, providers: Provider[], maxNfts?: number, timeout?: number) => Promise<NftInfoFields[]>;
|
|
15
|
+
|
|
16
|
+
declare const isErc1155: (provider: Provider, address: string) => Promise<boolean>;
|
|
17
|
+
declare const isErc721: (provider: Provider, address: string) => Promise<boolean>;
|
|
18
|
+
declare const tokenTypes: (provider: Provider, address: string) => Promise<TokenType[]>;
|
|
19
|
+
|
|
20
|
+
type CryptoWalletNftWitnessParams = EvmWitnessParams<CryptoWalletNftWitnessConfig>;
|
|
21
|
+
declare class CryptoWalletNftWitness<TParams extends CryptoWalletNftWitnessParams = CryptoWalletNftWitnessParams> extends AbstractEvmWitness<TParams, NftWitnessQuery, NftInfo> {
|
|
22
|
+
static readonly configSchemas: Schema[];
|
|
23
|
+
static readonly defaultConfigSchema: Schema;
|
|
24
|
+
get loadMetadata(): boolean;
|
|
25
|
+
get timeout(): number;
|
|
26
|
+
protected observeHandler(payloads?: NftWitnessQuery[]): Promise<NftInfo[]>;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
declare const CryptoWalletNftWitnessPlugin: () => PayloadSetWitnessPlugin<CryptoWalletNftWitness>;
|
|
30
|
+
|
|
31
|
+
export { CryptoWalletNftWitness, type CryptoWalletNftWitnessParams, CryptoWalletNftWitnessPlugin, contractHasFunctions, CryptoWalletNftWitnessPlugin as default, getErc1155MetadataUri, getErc721MetadataUri, getNftMetadataUri, getNftsOwnedByAddress, getNftsOwnedByAddressWithMetadata, getTokenTypes, isErc1155, isErc721, tokenTypes };
|