neozipkit 0.2.1 → 0.3.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/LICENSE +22 -0
- package/README.md +410 -186
- package/contracts/ABI.txt +889 -0
- package/contracts/Bytecode.txt +1 -0
- package/contracts/COMPILATION_NOTES.md +59 -0
- package/contracts/QUICK_DEPLOY.md +286 -0
- package/contracts/README.md +235 -131
- package/contracts/VERIFICATION.md +308 -0
- package/contracts/deploy-interactive.js +448 -0
- package/contracts/deployment-arbitrum-sepolia.json +12 -0
- package/contracts/deployment-arbitrum.json +12 -0
- package/contracts/deployment-eth-sepolia.json +12 -0
- package/contracts/hardhat.config.js +114 -0
- package/contracts/package.json +20 -0
- package/contracts/scripts/compile-and-extract.js +119 -0
- package/contracts/scripts/verify-contract.js +223 -0
- package/contracts/src/{NZIP-NFT-Private.sol → NZIP-NFT-v2.0.sol} +66 -151
- package/contracts/src/NZIP-NFT.sol +9 -15
- package/dist/blockchain/browser/TokenVerifierBrowser.d.ts +67 -0
- package/dist/blockchain/browser/TokenVerifierBrowser.d.ts.map +1 -0
- package/dist/blockchain/browser/TokenVerifierBrowser.js +313 -0
- package/dist/blockchain/browser/TokenVerifierBrowser.js.map +1 -0
- package/dist/blockchain/browser/WalletManagerBrowser.d.ts +98 -0
- package/dist/blockchain/browser/WalletManagerBrowser.d.ts.map +1 -0
- package/dist/blockchain/browser/WalletManagerBrowser.js +434 -0
- package/dist/blockchain/browser/WalletManagerBrowser.js.map +1 -0
- package/dist/blockchain/browser/ZipkitMinterBrowser.d.ts +58 -0
- package/dist/blockchain/browser/ZipkitMinterBrowser.d.ts.map +1 -0
- package/dist/blockchain/browser/ZipkitMinterBrowser.js +317 -0
- package/dist/blockchain/browser/ZipkitMinterBrowser.js.map +1 -0
- package/dist/blockchain/browser/index.d.ts +11 -0
- package/dist/blockchain/browser/index.d.ts.map +1 -0
- package/dist/blockchain/browser/index.js +16 -0
- package/dist/blockchain/browser/index.js.map +1 -0
- package/dist/blockchain/core/WalletManager.d.ts +124 -0
- package/dist/blockchain/core/WalletManager.d.ts.map +1 -0
- package/dist/blockchain/{ZipKitWallet.js → core/WalletManager.js} +157 -177
- package/dist/blockchain/core/WalletManager.js.map +1 -0
- package/dist/blockchain/{ZipKitMinter.d.ts → core/ZipkitMinter.d.ts} +46 -11
- package/dist/blockchain/core/ZipkitMinter.d.ts.map +1 -0
- package/dist/blockchain/core/ZipkitMinter.js +548 -0
- package/dist/blockchain/core/ZipkitMinter.js.map +1 -0
- package/dist/blockchain/{ZipKitOTS.d.ts → core/ZipkitOTS.d.ts} +6 -15
- package/dist/blockchain/core/ZipkitOTS.d.ts.map +1 -0
- package/dist/blockchain/{ZipKitOTS.js → core/ZipkitOTS.js} +26 -84
- package/dist/blockchain/core/ZipkitOTS.js.map +1 -0
- package/dist/blockchain/core/ZipkitVerifier.d.ts +177 -0
- package/dist/blockchain/core/ZipkitVerifier.d.ts.map +1 -0
- package/dist/blockchain/core/ZipkitVerifier.js +632 -0
- package/dist/blockchain/core/ZipkitVerifier.js.map +1 -0
- package/dist/blockchain/core/contracts.d.ts +83 -0
- package/dist/blockchain/core/contracts.d.ts.map +1 -0
- package/dist/blockchain/core/contracts.js +341 -0
- package/dist/blockchain/core/contracts.js.map +1 -0
- package/dist/blockchain/core/index.d.ts +12 -0
- package/dist/blockchain/core/index.d.ts.map +1 -0
- package/dist/blockchain/core/index.js +59 -0
- package/dist/blockchain/core/index.js.map +1 -0
- package/dist/blockchain/index.d.ts +11 -7
- package/dist/blockchain/index.d.ts.map +1 -0
- package/dist/blockchain/index.js +18 -34
- package/dist/blockchain/index.js.map +1 -0
- package/dist/blockchain/node/WalletManagerNode.d.ts +47 -0
- package/dist/blockchain/node/WalletManagerNode.d.ts.map +1 -0
- package/dist/blockchain/node/WalletManagerNode.js +203 -0
- package/dist/blockchain/node/WalletManagerNode.js.map +1 -0
- package/dist/blockchain/node/index.d.ts +12 -0
- package/dist/blockchain/node/index.d.ts.map +1 -0
- package/dist/blockchain/node/index.js +24 -0
- package/dist/blockchain/node/index.js.map +1 -0
- package/dist/browser/ZipkitBrowser.d.ts +27 -0
- package/dist/browser/ZipkitBrowser.d.ts.map +1 -0
- package/dist/browser/{ZipKitBrowser.js → ZipkitBrowser.js} +96 -43
- package/dist/browser/ZipkitBrowser.js.map +1 -0
- package/dist/browser/index.d.ts +12 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +42 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser-esm/index.d.ts +12 -0
- package/dist/browser-esm/index.js +59559 -0
- package/dist/browser-esm/index.js.map +7 -0
- package/dist/browser-umd/index.d.ts +12 -0
- package/dist/browser-umd/index.js +59576 -0
- package/dist/browser-umd/index.js.map +7 -0
- package/dist/browser-umd/index.min.js +63 -0
- package/dist/browser.d.ts +8 -14
- package/dist/browser.js +13 -28
- package/dist/core/ZipCompress.d.ts +99 -0
- package/dist/core/ZipCompress.d.ts.map +1 -0
- package/dist/core/ZipCompress.js +309 -0
- package/dist/core/ZipCompress.js.map +1 -0
- package/dist/core/ZipDecompress.d.ts +58 -0
- package/dist/core/ZipDecompress.d.ts.map +1 -0
- package/dist/core/ZipDecompress.js +172 -0
- package/dist/core/ZipDecompress.js.map +1 -0
- package/dist/{shared → core}/ZipEntry.d.ts +8 -1
- package/dist/core/ZipEntry.d.ts.map +1 -0
- package/dist/{shared → core}/ZipEntry.js +225 -82
- package/dist/core/ZipEntry.js.map +1 -0
- package/dist/core/Zipkit.d.ts +315 -0
- package/dist/core/Zipkit.d.ts.map +1 -0
- package/dist/core/Zipkit.js +647 -0
- package/dist/core/Zipkit.js.map +1 -0
- package/dist/core/components/HashCalculator.d.ts +138 -0
- package/dist/core/components/HashCalculator.d.ts.map +1 -0
- package/dist/core/components/HashCalculator.js +360 -0
- package/dist/core/components/HashCalculator.js.map +1 -0
- package/dist/core/components/Logger.d.ts +73 -0
- package/dist/core/components/Logger.d.ts.map +1 -0
- package/dist/core/components/Logger.js +156 -0
- package/dist/core/components/Logger.js.map +1 -0
- package/dist/core/components/ProgressTracker.d.ts +43 -0
- package/dist/core/components/ProgressTracker.d.ts.map +1 -0
- package/dist/core/components/ProgressTracker.js +112 -0
- package/dist/core/components/ProgressTracker.js.map +1 -0
- package/dist/{shared → core}/components/Support.d.ts +1 -0
- package/dist/core/components/Support.d.ts.map +1 -0
- package/dist/{shared → core}/components/Support.js +1 -0
- package/dist/core/components/Support.js.map +1 -0
- package/dist/{shared → core}/components/Util.d.ts +7 -2
- package/dist/core/components/Util.d.ts.map +1 -0
- package/dist/{shared → core}/components/Util.js +14 -34
- package/dist/core/components/Util.js.map +1 -0
- package/dist/{shared → core}/constants/Errors.d.ts +1 -2
- package/dist/core/constants/Errors.d.ts.map +1 -0
- package/dist/{shared → core}/constants/Errors.js +1 -3
- package/dist/core/constants/Errors.js.map +1 -0
- package/dist/{shared → core}/constants/Headers.d.ts +3 -0
- package/dist/core/constants/Headers.d.ts.map +1 -0
- package/dist/{shared → core}/constants/Headers.js +20 -17
- package/dist/core/constants/Headers.js.map +1 -0
- package/dist/core/encryption/Manager.d.ts +58 -0
- package/dist/core/encryption/Manager.d.ts.map +1 -0
- package/dist/core/encryption/Manager.js +121 -0
- package/dist/core/encryption/Manager.js.map +1 -0
- package/dist/core/encryption/ZipCrypto.d.ts +172 -0
- package/dist/core/encryption/ZipCrypto.d.ts.map +1 -0
- package/dist/core/encryption/ZipCrypto.js +554 -0
- package/dist/core/encryption/ZipCrypto.js.map +1 -0
- package/dist/core/encryption/index.d.ts +9 -0
- package/dist/core/encryption/index.d.ts.map +1 -0
- package/dist/core/encryption/index.js +17 -0
- package/dist/core/encryption/index.js.map +1 -0
- package/dist/core/encryption/types.d.ts +29 -0
- package/dist/core/encryption/types.d.ts.map +1 -0
- package/dist/core/encryption/types.js +12 -0
- package/dist/core/encryption/types.js.map +1 -0
- package/dist/core/index.d.ts +24 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +57 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/version.d.ts +5 -0
- package/dist/core/version.d.ts.map +1 -0
- package/dist/core/version.js +31 -0
- package/dist/core/version.js.map +1 -0
- package/dist/index.d.ts +8 -18
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -35
- package/dist/index.js.map +1 -0
- package/dist/node/ZipCompressNode.d.ts +123 -0
- package/dist/node/ZipCompressNode.d.ts.map +1 -0
- package/dist/node/ZipCompressNode.js +576 -0
- package/dist/node/ZipCompressNode.js.map +1 -0
- package/dist/node/ZipDecompressNode.d.ts +120 -0
- package/dist/node/ZipDecompressNode.d.ts.map +1 -0
- package/dist/node/ZipDecompressNode.js +461 -0
- package/dist/node/ZipDecompressNode.js.map +1 -0
- package/dist/node/ZipkitNode.d.ts +406 -0
- package/dist/node/ZipkitNode.d.ts.map +1 -0
- package/dist/node/ZipkitNode.js +1305 -0
- package/dist/node/ZipkitNode.js.map +1 -0
- package/dist/node/index.d.ts +26 -0
- package/dist/node/index.d.ts.map +1 -0
- package/dist/node/index.js +65 -0
- package/dist/node/index.js.map +1 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +36 -1
- package/dist/types/index.js.map +1 -0
- package/examples/README.md +269 -0
- package/examples/blockchain-tokenize.ts +354 -0
- package/examples/create-zip.ts +172 -0
- package/examples/extract-zip.ts +158 -0
- package/examples/list-zip.ts +161 -0
- package/examples/test-files/data.json +116 -0
- package/examples/test-files/document.md +80 -0
- package/examples/test-files/document.txt +2 -0
- package/examples/test-files/file1.txt +48 -0
- package/examples/test-files/file2.txt +80 -0
- package/examples/tsconfig.json +44 -0
- package/examples/unzip-token.ts +491 -0
- package/examples/verify-tokenized-zip.ts +305 -0
- package/examples/zip-token.ts +604 -0
- package/package.json +108 -24
- package/src/blockchain/README.md +59 -66
- package/src/{browser/TokenVerifierBrowser.ts-remove → blockchain/browser/TokenVerifierBrowser.ts} +125 -79
- package/src/blockchain/browser/WalletManagerBrowser.ts +486 -0
- package/src/blockchain/browser/ZipkitMinterBrowser.ts +400 -0
- package/src/blockchain/browser/index.ts +13 -0
- package/src/blockchain/{ZipKitWallet.ts → core/WalletManager.ts} +241 -143
- package/src/blockchain/core/ZipkitMinter.ts +716 -0
- package/src/blockchain/{ZipKitOTS.ts → core/ZipkitOTS.ts} +28 -62
- package/src/blockchain/core/ZipkitVerifier.ts +853 -0
- package/src/blockchain/core/contracts.ts +370 -0
- package/src/blockchain/core/index.ts +71 -0
- package/src/blockchain/index.ts +21 -55
- package/src/blockchain/node/WalletManagerNode.ts +171 -0
- package/src/blockchain/node/index.ts +40 -0
- package/src/browser/{ZipKitBrowser.ts → ZipkitBrowser.ts} +104 -41
- package/src/browser/index.esm.ts +37 -0
- package/src/browser/index.ts +25 -0
- package/src/core/ZipCompress.ts +398 -0
- package/src/core/ZipDecompress.ts +212 -0
- package/src/{shared → core}/ZipEntry.ts +240 -90
- package/src/core/Zipkit.ts +794 -0
- package/src/core/components/HashCalculator.ts +384 -0
- package/src/core/components/Logger.ts +180 -0
- package/src/core/components/ProgressTracker.ts +134 -0
- package/src/{shared → core}/components/Util.ts +12 -34
- package/src/{shared → core}/constants/Errors.ts +0 -4
- package/src/{shared → core}/constants/Headers.ts +19 -17
- package/src/core/encryption/Manager.ts +137 -0
- package/src/core/encryption/ZipCrypto.ts +650 -0
- package/src/core/encryption/index.ts +15 -0
- package/src/core/encryption/types.ts +33 -0
- package/src/core/index.ts +34 -0
- package/src/core/version.ts +33 -0
- package/src/index.ts +54 -25
- package/src/node/ZipCompressNode.ts +632 -0
- package/src/node/ZipDecompressNode.ts +508 -0
- package/src/node/ZipkitNode.ts +1559 -0
- package/src/node/index.ts +69 -0
- package/src/types/index.ts +131 -1
- package/src/types/modules.d.ts +1 -11
- package/src/types/opentimestamps.d.ts +1 -23
- package/contracts/INTEGRATION.md +0 -338
- package/contracts/NETWORKS.md +0 -156
- package/contracts/NZIP-NFT-bytecode.txt +0 -1
- package/contracts/constants.ts +0 -952
- package/contracts/deploy-bytecode.mjs +0 -94
- package/dist/blockchain/CertificateToken.d.ts +0 -48
- package/dist/blockchain/CertificateToken.js +0 -386
- package/dist/blockchain/ZipKitMinter.js +0 -347
- package/dist/blockchain/ZipKitNFT.d.ts +0 -3
- package/dist/blockchain/ZipKitNFT.js +0 -7
- package/dist/blockchain/ZipKitVerifier.d.ts +0 -69
- package/dist/blockchain/ZipKitVerifier.js +0 -289
- package/dist/blockchain/ZipKitWallet.d.ts +0 -69
- package/dist/blockchain/contracts.d.ts +0 -14
- package/dist/blockchain/contracts.js +0 -77
- package/dist/blockchain/types.d.ts +0 -47
- package/dist/blockchain/types.js +0 -30
- package/dist/browser/ZipKitBrowser.d.ts +0 -18
- package/dist/browser/ZipKitStampBrowser.d.ts +0 -2
- package/dist/browser/ZipKitStampBrowser.js +0 -12
- package/dist/browser-index.d.ts +0 -18
- package/dist/browser-index.js +0 -57
- package/dist/server/ZipKitServer.d.ts +0 -74
- package/dist/server/ZipKitServer.js +0 -310
- package/dist/shared/ZipKit.d.ts +0 -243
- package/dist/shared/ZipKit.js +0 -772
- package/dist/shared/components/CertificateOTS.d.ts +0 -15
- package/dist/shared/components/CertificateOTS.js +0 -116
- package/dist/shared/components/FileSys.d.ts +0 -2
- package/dist/shared/components/FileSys.js +0 -113
- package/dist/shared/components/HashAccumulator.d.ts +0 -55
- package/dist/shared/components/HashAccumulator.js +0 -100
- package/dist/shared/components/ZipCrypto.d.ts +0 -3
- package/dist/shared/components/ZipCrypto.js +0 -78
- package/dist/shared/components/merkleTree.d.ts +0 -66
- package/dist/shared/components/merkleTree.js +0 -136
- package/dist/shared/types/index.d.ts +0 -21
- package/dist/shared/types/index.js +0 -3
- package/dist/shared/types.d.ts +0 -33
- package/dist/shared/types.js +0 -8
- package/dist/shared/version.d.ts +0 -2
- package/dist/shared/version.js +0 -6
- package/src/blockchain/CertificateToken.ts +0 -444
- package/src/blockchain/ZipKitMinter.ts +0 -470
- package/src/blockchain/ZipKitNFT.ts +0 -12
- package/src/blockchain/ZipKitVerifier.ts +0 -382
- package/src/blockchain/contracts.ts +0 -88
- package/src/blockchain/types.ts +0 -91
- package/src/browser/CertificateGeneratorBrowser.ts-remove +0 -498
- package/src/browser/ZipKitStampBrowser.ts +0 -9
- package/src/browser-index.ts +0 -36
- package/src/server/README.md +0 -25
- package/src/server/ZipKitServer.ts +0 -305
- package/src/shared/ZipKit.ts +0 -881
- package/src/shared/components/CertificateOTS.ts +0 -132
- package/src/shared/components/FileSys.ts +0 -87
- package/src/shared/components/HashAccumulator.ts +0 -113
- package/src/shared/components/ZipCrypto.ts +0 -91
- package/src/shared/components/merkleTree.ts +0 -162
- package/src/shared/types/index.ts +0 -25
- package/src/shared/types/modules.d.ts +0 -22
- package/src/shared/types/opentimestamps.d.ts +0 -23
- package/src/shared/types.d.ts +0 -8
- package/src/shared/types.ts +0 -43
- package/src/shared/version.ts +0 -3
- /package/src/{shared → core}/components/Support.ts +0 -0
|
@@ -0,0 +1,632 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
/**
|
|
4
|
+
* ZipkitVerifier - Handles NFT token verification for ZIP files
|
|
5
|
+
* Verifier API for NZIP-NFT smart contract.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.ZipkitVerifier = void 0;
|
|
9
|
+
const ethers_1 = require("ethers");
|
|
10
|
+
const contracts_1 = require("./contracts");
|
|
11
|
+
/**
|
|
12
|
+
* Blockchain Token Verifier for ZIP files
|
|
13
|
+
*/
|
|
14
|
+
class ZipkitVerifier {
|
|
15
|
+
constructor(options = {}) {
|
|
16
|
+
this.debug = options.debug || false;
|
|
17
|
+
this.maxRetries = options.maxRetries || 3;
|
|
18
|
+
this.retryDelay = options.retryDelay || 1000;
|
|
19
|
+
this.batchDelay = options.batchDelay || 500;
|
|
20
|
+
if (this.debug) {
|
|
21
|
+
console.log(`[DEBUG] ZipkitVerifier initialized`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Extract and validate token metadata from ZIP
|
|
26
|
+
*/
|
|
27
|
+
async extractTokenMetadata(tokenBuffer) {
|
|
28
|
+
try {
|
|
29
|
+
if (this.debug) {
|
|
30
|
+
console.log(`[DEBUG] Extracting token metadata from buffer (${tokenBuffer.length} bytes)`);
|
|
31
|
+
}
|
|
32
|
+
const tokenData = JSON.parse(tokenBuffer.toString('utf8'));
|
|
33
|
+
// Validate required fields
|
|
34
|
+
const requiredFields = ['tokenId', 'contractAddress', 'network'];
|
|
35
|
+
for (const field of requiredFields) {
|
|
36
|
+
if (!tokenData[field]) {
|
|
37
|
+
if (this.debug) {
|
|
38
|
+
console.log(`[DEBUG] Missing required field: ${field}`);
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
success: false,
|
|
42
|
+
error: `Missing required field: ${field}`
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
if (this.debug) {
|
|
47
|
+
console.log(`[DEBUG] Token metadata extracted successfully`);
|
|
48
|
+
console.log(`[DEBUG] Token ID: ${tokenData.tokenId}, Network: ${tokenData.network}`);
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
success: true,
|
|
52
|
+
metadata: tokenData
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
const errorMessage = error instanceof Error ? error.message : 'Invalid JSON format';
|
|
57
|
+
if (this.debug) {
|
|
58
|
+
console.log(`[DEBUG] Failed to parse token metadata: ${errorMessage}`);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
error: `Invalid token metadata format: ${errorMessage}`
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Map network name to RPC configuration using contracts.ts (single source of truth)
|
|
68
|
+
* Supports both old metadata (without networkChainId) and new metadata (with networkChainId)
|
|
69
|
+
*/
|
|
70
|
+
getNetworkConfig(networkName, chainId) {
|
|
71
|
+
if (this.debug) {
|
|
72
|
+
if (chainId) {
|
|
73
|
+
console.log(`[DEBUG] Looking up network config by chainId: ${chainId} (network: ${networkName})`);
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
console.log(`[DEBUG] Looking up network config by name: ${networkName} (chainId not provided - using fallback)`);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Priority 1: If chainId is provided, use it directly (most reliable - new metadata format)
|
|
80
|
+
if (chainId) {
|
|
81
|
+
const config = (0, contracts_1.getContractConfig)(chainId);
|
|
82
|
+
if (config && config.chainId === chainId) {
|
|
83
|
+
if (this.debug) {
|
|
84
|
+
console.log(`[DEBUG] Found config by chainId: ${config.network} (${config.chainId})`);
|
|
85
|
+
}
|
|
86
|
+
return { success: true, config };
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (this.debug) {
|
|
90
|
+
console.log(`[DEBUG] ChainId ${chainId} not found in contract configs, falling back to network name`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
// Priority 2: Try exact name match using contracts.ts helpers
|
|
95
|
+
const exactMatch = (0, contracts_1.getNetworkByName)(networkName);
|
|
96
|
+
if (exactMatch) {
|
|
97
|
+
if (this.debug) {
|
|
98
|
+
console.log(`[DEBUG] Matched to ${exactMatch.network} (${exactMatch.chainId}) by network name`);
|
|
99
|
+
}
|
|
100
|
+
return { success: true, config: exactMatch };
|
|
101
|
+
}
|
|
102
|
+
// Priority 3: Try fuzzy matching (for backward compatibility with partial names)
|
|
103
|
+
const fuzzyMatch = (0, contracts_1.fuzzyMatchNetworkName)(networkName);
|
|
104
|
+
if (fuzzyMatch) {
|
|
105
|
+
if (this.debug) {
|
|
106
|
+
console.log(`[DEBUG] Fuzzy matched to ${fuzzyMatch.network} (${fuzzyMatch.chainId}) by network name`);
|
|
107
|
+
}
|
|
108
|
+
return { success: true, config: fuzzyMatch };
|
|
109
|
+
}
|
|
110
|
+
if (this.debug) {
|
|
111
|
+
console.log(`[DEBUG] Unsupported network: ${networkName}`);
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
success: false,
|
|
115
|
+
error: `Unsupported network: ${networkName}`
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Perform merkle root comparison
|
|
120
|
+
*/
|
|
121
|
+
compareMerkleRoots(calculated, declared) {
|
|
122
|
+
if (this.debug) {
|
|
123
|
+
console.log(`[DEBUG] Comparing merkle roots`);
|
|
124
|
+
console.log(`[DEBUG] Calculated: ${calculated || 'null'}`);
|
|
125
|
+
console.log(`[DEBUG] Declared: ${declared || 'null'}`);
|
|
126
|
+
}
|
|
127
|
+
if (!calculated) {
|
|
128
|
+
return {
|
|
129
|
+
success: false,
|
|
130
|
+
match: false,
|
|
131
|
+
error: 'Cannot calculate merkle root from archive contents'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
if (!declared) {
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
match: false,
|
|
138
|
+
calculated,
|
|
139
|
+
error: 'No merkle root found in token metadata'
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const match = calculated === declared;
|
|
143
|
+
if (this.debug) {
|
|
144
|
+
console.log(`[DEBUG] Merkle root match: ${match}`);
|
|
145
|
+
}
|
|
146
|
+
return {
|
|
147
|
+
success: true,
|
|
148
|
+
match,
|
|
149
|
+
calculated,
|
|
150
|
+
declared
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Verify token against blockchain
|
|
155
|
+
* @param rpcUrlIndex Optional index of RPC URL to use (default: 0)
|
|
156
|
+
*/
|
|
157
|
+
async verifyOnChain(tokenId, contractAddress, networkConfig, merkleRoot, rpcUrlIndex = 0) {
|
|
158
|
+
// Use specified RPC URL index
|
|
159
|
+
const rpcUrls = networkConfig.rpcUrls.length > 0 ? networkConfig.rpcUrls : [];
|
|
160
|
+
if (rpcUrls.length === 0) {
|
|
161
|
+
return {
|
|
162
|
+
success: false,
|
|
163
|
+
error: 'No RPC URLs configured for this network'
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
if (rpcUrlIndex >= rpcUrls.length) {
|
|
167
|
+
return {
|
|
168
|
+
success: false,
|
|
169
|
+
error: `RPC URL index ${rpcUrlIndex} is out of range (${rpcUrls.length} RPCs available)`
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
const rpcUrl = rpcUrls[rpcUrlIndex];
|
|
173
|
+
let provider = null;
|
|
174
|
+
try {
|
|
175
|
+
if (this.debug) {
|
|
176
|
+
console.log(`[DEBUG] Starting on-chain verification`);
|
|
177
|
+
console.log(`[DEBUG] Token ID: ${tokenId}, Contract: ${contractAddress}`);
|
|
178
|
+
console.log(`[DEBUG] Network: ${networkConfig.network}, Chain ID: ${networkConfig.chainId}`);
|
|
179
|
+
console.log(`[DEBUG] Using RPC: ${rpcUrl}`);
|
|
180
|
+
}
|
|
181
|
+
provider = new ethers_1.ethers.JsonRpcProvider(rpcUrl);
|
|
182
|
+
const contract = new ethers_1.ethers.Contract(contractAddress, contracts_1.NZIP_CONTRACT_ABI, provider);
|
|
183
|
+
if (this.debug) {
|
|
184
|
+
console.log(`[DEBUG] Calling contract.verifyZipFile(${tokenId}, ${merkleRoot.substring(0, 10)}...)`);
|
|
185
|
+
}
|
|
186
|
+
// First check if token exists and get ALL actual on-chain data (not from metadata)
|
|
187
|
+
let onChainMerkleRoot;
|
|
188
|
+
let onChainTokenizationTime;
|
|
189
|
+
let onChainCreator;
|
|
190
|
+
let onChainBlockNumber;
|
|
191
|
+
try {
|
|
192
|
+
// Get token info including ALL data stored on-chain (merkle root, tokenization time, creator, block number)
|
|
193
|
+
// CRITICAL: We trust ONLY blockchain data, not metadata file which can be tampered with
|
|
194
|
+
const zipFileInfo = await Promise.race([
|
|
195
|
+
contract.getZipFileInfo(tokenId),
|
|
196
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('getZipFileInfo timeout after 10 seconds')), 10000))
|
|
197
|
+
]);
|
|
198
|
+
// Extract all on-chain data
|
|
199
|
+
onChainMerkleRoot = zipFileInfo.merkleRootHash;
|
|
200
|
+
onChainTokenizationTime = Number(zipFileInfo.tokenizationTime);
|
|
201
|
+
onChainCreator = zipFileInfo.creator;
|
|
202
|
+
onChainBlockNumber = Number(zipFileInfo.blockNumber);
|
|
203
|
+
if (this.debug) {
|
|
204
|
+
console.log(`[DEBUG] Token ${tokenId} exists`);
|
|
205
|
+
console.log(`[DEBUG] On-chain merkle root: ${onChainMerkleRoot}`);
|
|
206
|
+
console.log(`[DEBUG] On-chain tokenization time: ${onChainTokenizationTime} (${new Date(onChainTokenizationTime * 1000).toLocaleString()})`);
|
|
207
|
+
console.log(`[DEBUG] On-chain creator: ${onChainCreator}`);
|
|
208
|
+
console.log(`[DEBUG] On-chain block number: ${onChainBlockNumber}`);
|
|
209
|
+
console.log(`[DEBUG] Calculated merkle root: ${merkleRoot}`);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (infoError) {
|
|
213
|
+
const errorMsg = infoError.message || String(infoError);
|
|
214
|
+
if (this.debug) {
|
|
215
|
+
console.log(`[DEBUG] Token info check failed: ${errorMsg}`);
|
|
216
|
+
}
|
|
217
|
+
// If token doesn't exist, return error
|
|
218
|
+
if (errorMsg.includes('nonexistent token') || errorMsg.includes('ERC721: invalid token ID')) {
|
|
219
|
+
return {
|
|
220
|
+
success: false,
|
|
221
|
+
error: `Token ${tokenId} does not exist on contract ${contractAddress}`
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
// For other errors, fail immediately
|
|
225
|
+
return {
|
|
226
|
+
success: false,
|
|
227
|
+
error: `Failed to get token info: ${errorMsg}`
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// Compare the calculated merkle root with the on-chain merkle root
|
|
231
|
+
// This is the critical security check - we trust the blockchain, not the metadata file
|
|
232
|
+
const merkleRootMatch = onChainMerkleRoot && onChainMerkleRoot.toLowerCase() === merkleRoot.toLowerCase();
|
|
233
|
+
if (this.debug) {
|
|
234
|
+
console.log(`[DEBUG] Merkle root match: ${merkleRootMatch}`);
|
|
235
|
+
}
|
|
236
|
+
// Also call verifyZipFile for additional validation (though we already have the root)
|
|
237
|
+
let verifyResult = false;
|
|
238
|
+
try {
|
|
239
|
+
verifyResult = await Promise.race([
|
|
240
|
+
contract.verifyZipFile(tokenId, merkleRoot),
|
|
241
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Contract call timeout after 30 seconds')), 30000))
|
|
242
|
+
]);
|
|
243
|
+
}
|
|
244
|
+
catch (verifyError) {
|
|
245
|
+
// If verifyZipFile fails but we have the root, we can still validate
|
|
246
|
+
if (this.debug) {
|
|
247
|
+
console.log(`[DEBUG] verifyZipFile call failed: ${verifyError.message}`);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// The merkle root comparison is the primary check - if roots match, verification passes
|
|
251
|
+
// verifyZipFile is a secondary check for additional validation
|
|
252
|
+
const isValid = merkleRootMatch === true;
|
|
253
|
+
if (this.debug) {
|
|
254
|
+
console.log(`[DEBUG] On-chain verification result: ${isValid} (merkle root match: ${merkleRootMatch}, verifyZipFile: ${verifyResult})`);
|
|
255
|
+
}
|
|
256
|
+
// Clean up provider to allow process to exit
|
|
257
|
+
try {
|
|
258
|
+
if (provider) {
|
|
259
|
+
provider.destroy();
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
catch (cleanupError) {
|
|
263
|
+
// Ignore cleanup errors
|
|
264
|
+
if (this.debug) {
|
|
265
|
+
console.log(`[DEBUG] Error destroying provider: ${cleanupError instanceof Error ? cleanupError.message : String(cleanupError)}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
success: true,
|
|
270
|
+
isValid,
|
|
271
|
+
onChainMerkleRoot,
|
|
272
|
+
onChainTokenizationTime,
|
|
273
|
+
onChainCreator,
|
|
274
|
+
onChainBlockNumber
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
const errorMessage = error instanceof Error ? error.message : 'Network error';
|
|
279
|
+
if (this.debug) {
|
|
280
|
+
console.log(`[DEBUG] On-chain verification failed: ${errorMessage}`);
|
|
281
|
+
}
|
|
282
|
+
// Clean up provider on error
|
|
283
|
+
try {
|
|
284
|
+
if (provider) {
|
|
285
|
+
provider.destroy();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
catch (cleanupError) {
|
|
289
|
+
// Ignore cleanup errors
|
|
290
|
+
}
|
|
291
|
+
return {
|
|
292
|
+
success: false,
|
|
293
|
+
error: errorMessage,
|
|
294
|
+
rpcUrl: rpcUrl
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Complete verification process
|
|
300
|
+
* @param rpcUrlIndex Optional index of RPC URL to use (default: 0)
|
|
301
|
+
*/
|
|
302
|
+
async verifyToken(tokenMetadata, calculatedMerkleRoot, options = {}, rpcUrlIndex = 0) {
|
|
303
|
+
try {
|
|
304
|
+
if (this.debug) {
|
|
305
|
+
console.log(`[DEBUG] Starting complete token verification`);
|
|
306
|
+
}
|
|
307
|
+
// NOTE: tokenMetadata (tokenId, contractAddress, network) is used ONLY to locate the token on blockchain
|
|
308
|
+
// All verification data (merkle root, tokenization time, creator, block number) comes from blockchain contract
|
|
309
|
+
// If metadata is tampered with, the blockchain query will fail or return mismatched data, causing verification to fail
|
|
310
|
+
// Get network configuration - use chainId if available (most reliable)
|
|
311
|
+
const networkResult = this.getNetworkConfig(tokenMetadata.network, tokenMetadata.networkChainId);
|
|
312
|
+
if (!networkResult.success || !networkResult.config) {
|
|
313
|
+
return {
|
|
314
|
+
success: false,
|
|
315
|
+
message: networkResult.error || 'Unknown network error',
|
|
316
|
+
errorDetails: {
|
|
317
|
+
errorType: 'NETWORK_ERROR',
|
|
318
|
+
networkName: tokenMetadata.network
|
|
319
|
+
}
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
const networkConfig = networkResult.config;
|
|
323
|
+
// CRITICAL: We must calculate the merkle root from the actual files and compare with on-chain value
|
|
324
|
+
// We do NOT trust the merkle root stored in the metadata file as it could be tampered with
|
|
325
|
+
if (!calculatedMerkleRoot) {
|
|
326
|
+
return {
|
|
327
|
+
success: false,
|
|
328
|
+
message: 'No merkle root calculated from archive contents - cannot verify',
|
|
329
|
+
errorDetails: {
|
|
330
|
+
errorType: 'MERKLE_ERROR'
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// Perform on-chain verification - this will fetch the actual merkle root from the blockchain
|
|
335
|
+
const onChainResult = await this.verifyOnChain(tokenMetadata.tokenId, tokenMetadata.contractAddress, networkConfig, calculatedMerkleRoot, rpcUrlIndex);
|
|
336
|
+
if (!onChainResult.success) {
|
|
337
|
+
return {
|
|
338
|
+
success: false,
|
|
339
|
+
message: `Blockchain verification failed: ${onChainResult.error}`,
|
|
340
|
+
errorDetails: {
|
|
341
|
+
errorType: 'CONTRACT_ERROR',
|
|
342
|
+
networkName: tokenMetadata.network,
|
|
343
|
+
rpcUrl: onChainResult.rpcUrl || networkConfig.rpcUrls[rpcUrlIndex] || 'unknown',
|
|
344
|
+
contractAddress: tokenMetadata.contractAddress,
|
|
345
|
+
tokenId: tokenMetadata.tokenId
|
|
346
|
+
}
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
// Compare calculated merkle root with on-chain merkle root
|
|
350
|
+
if (!onChainResult.onChainMerkleRoot) {
|
|
351
|
+
return {
|
|
352
|
+
success: false,
|
|
353
|
+
message: 'Blockchain verification failed - could not retrieve on-chain merkle root',
|
|
354
|
+
errorDetails: {
|
|
355
|
+
errorType: 'CONTRACT_ERROR',
|
|
356
|
+
tokenId: tokenMetadata.tokenId,
|
|
357
|
+
contractAddress: tokenMetadata.contractAddress
|
|
358
|
+
}
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
// This is the critical security check: calculated root must match on-chain root
|
|
362
|
+
const onChainRoot = onChainResult.onChainMerkleRoot.toLowerCase();
|
|
363
|
+
const calculatedRoot = calculatedMerkleRoot.toLowerCase();
|
|
364
|
+
if (onChainRoot !== calculatedRoot) {
|
|
365
|
+
return {
|
|
366
|
+
success: false,
|
|
367
|
+
message: 'Archive integrity verification FAILED - merkle root mismatch',
|
|
368
|
+
errorDetails: {
|
|
369
|
+
errorType: 'MERKLE_ERROR',
|
|
370
|
+
calculatedMerkleRoot: calculatedMerkleRoot,
|
|
371
|
+
onChainMerkleRoot: onChainResult.onChainMerkleRoot,
|
|
372
|
+
merkleRoot: `calculated: ${calculatedMerkleRoot}, on-chain: ${onChainResult.onChainMerkleRoot}` // Keep for backward compatibility
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
}
|
|
376
|
+
if (!onChainResult.isValid) {
|
|
377
|
+
return {
|
|
378
|
+
success: false,
|
|
379
|
+
message: 'Blockchain verification FAILED - contract verification returned false',
|
|
380
|
+
errorDetails: {
|
|
381
|
+
errorType: 'CONTRACT_ERROR',
|
|
382
|
+
tokenId: tokenMetadata.tokenId,
|
|
383
|
+
contractAddress: tokenMetadata.contractAddress,
|
|
384
|
+
merkleRoot: calculatedMerkleRoot
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
}
|
|
388
|
+
// Success - create verification details
|
|
389
|
+
// CRITICAL: Use ONLY blockchain data for display, not metadata which can be tampered with
|
|
390
|
+
const mintDate = onChainResult.onChainTokenizationTime
|
|
391
|
+
? new Date(onChainResult.onChainTokenizationTime * 1000).toLocaleString()
|
|
392
|
+
: (tokenMetadata.mintDate ||
|
|
393
|
+
(tokenMetadata.creationTimestamp ? new Date(tokenMetadata.creationTimestamp * 1000).toLocaleString() : '') ||
|
|
394
|
+
'Unknown'); // Use on-chain tokenization time as source of truth
|
|
395
|
+
return {
|
|
396
|
+
success: true,
|
|
397
|
+
message: 'Archive integrity VERIFIED against blockchain records',
|
|
398
|
+
tokenMetadata,
|
|
399
|
+
verificationDetails: {
|
|
400
|
+
// These identifiers come from metadata (needed to locate token), but are validated by blockchain query
|
|
401
|
+
tokenId: tokenMetadata.tokenId,
|
|
402
|
+
network: tokenMetadata.network,
|
|
403
|
+
contractAddress: tokenMetadata.contractAddress,
|
|
404
|
+
// CRITICAL: All verification data comes from blockchain, not metadata
|
|
405
|
+
merkleRoot: onChainResult.onChainMerkleRoot || calculatedMerkleRoot, // On-chain value (source of truth)
|
|
406
|
+
mintDate, // On-chain tokenizationTime converted to date string (source of truth)
|
|
407
|
+
calculatedMerkleRoot: calculatedMerkleRoot || undefined,
|
|
408
|
+
declaredMerkleRoot: onChainResult.onChainMerkleRoot || undefined, // On-chain value, not metadata
|
|
409
|
+
merkleRootMatch: true, // Verified: calculated root matches on-chain root
|
|
410
|
+
onChainValid: true
|
|
411
|
+
}
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
catch (error) {
|
|
415
|
+
const errorMessage = error instanceof Error ? error.message : 'Unknown verification error';
|
|
416
|
+
if (this.debug) {
|
|
417
|
+
console.log(`[DEBUG] Verification process failed: ${errorMessage}`);
|
|
418
|
+
}
|
|
419
|
+
return {
|
|
420
|
+
success: false,
|
|
421
|
+
message: `Tokenization verification failed: ${errorMessage}`,
|
|
422
|
+
errorDetails: {
|
|
423
|
+
errorType: 'METADATA_ERROR'
|
|
424
|
+
}
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Verify token with retry logic and exponential backoff
|
|
430
|
+
* @param tokenMetadata Token metadata to verify
|
|
431
|
+
* @param calculatedMerkleRoot Calculated merkle root from archive
|
|
432
|
+
* @param maxRetries Maximum number of retry attempts (default: uses instance maxRetries)
|
|
433
|
+
* @returns Enhanced verification result with retry information
|
|
434
|
+
*/
|
|
435
|
+
async verifyTokenWithRetry(tokenMetadata, calculatedMerkleRoot, maxRetries) {
|
|
436
|
+
const startTime = Date.now();
|
|
437
|
+
const retries = maxRetries || this.maxRetries;
|
|
438
|
+
let lastError = null;
|
|
439
|
+
for (let attempt = 1; attempt <= retries; attempt++) {
|
|
440
|
+
try {
|
|
441
|
+
console.log(`🔄 Verification attempt ${attempt}/${retries} for token ${tokenMetadata.tokenId}`);
|
|
442
|
+
const result = await this.verifyToken(tokenMetadata, calculatedMerkleRoot);
|
|
443
|
+
if (result.success) {
|
|
444
|
+
console.log(`✅ Verification successful on attempt ${attempt} for token ${tokenMetadata.tokenId}`);
|
|
445
|
+
return {
|
|
446
|
+
...result,
|
|
447
|
+
retryAttempts: attempt,
|
|
448
|
+
processingTime: Date.now() - startTime,
|
|
449
|
+
timestamp: Date.now()
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
lastError = new Error(result.message || 'Verification failed');
|
|
453
|
+
}
|
|
454
|
+
catch (error) {
|
|
455
|
+
lastError = error instanceof Error ? error : new Error('Unknown verification error');
|
|
456
|
+
console.warn(`❌ Verification attempt ${attempt} failed for token ${tokenMetadata.tokenId}:`, lastError.message);
|
|
457
|
+
if (attempt < retries) {
|
|
458
|
+
const delay = this.calculateRetryDelay(attempt);
|
|
459
|
+
console.log(`⏳ Waiting ${delay}ms before retry...`);
|
|
460
|
+
await this.delay(delay);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return {
|
|
465
|
+
success: false,
|
|
466
|
+
message: `Verification failed after ${retries} attempts: ${lastError?.message || 'Unknown error'}`,
|
|
467
|
+
retryAttempts: retries,
|
|
468
|
+
processingTime: Date.now() - startTime,
|
|
469
|
+
timestamp: Date.now()
|
|
470
|
+
};
|
|
471
|
+
}
|
|
472
|
+
/**
|
|
473
|
+
* Batch verification for multiple tokens with rate limiting
|
|
474
|
+
* @param tokens Array of token metadata and merkle roots to verify
|
|
475
|
+
* @param options Batch processing options
|
|
476
|
+
* @returns Batch verification result
|
|
477
|
+
*/
|
|
478
|
+
async verifyBatch(tokens, options = {}) {
|
|
479
|
+
const startTime = Date.now();
|
|
480
|
+
const { parallel = false, maxConcurrent = 3 } = options;
|
|
481
|
+
console.log(`🔄 Starting batch verification for ${tokens.length} tokens (parallel: ${parallel})`);
|
|
482
|
+
let results = [];
|
|
483
|
+
if (parallel) {
|
|
484
|
+
// Parallel processing with concurrency limit
|
|
485
|
+
results = await this.verifyBatchParallel(tokens, maxConcurrent);
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
// Sequential processing with rate limiting
|
|
489
|
+
results = await this.verifyBatchSequential(tokens);
|
|
490
|
+
}
|
|
491
|
+
const successfulVerifications = results.filter(r => r.success).length;
|
|
492
|
+
const failedVerifications = results.length - successfulVerifications;
|
|
493
|
+
console.log(`✅ Batch verification completed: ${successfulVerifications}/${tokens.length} successful`);
|
|
494
|
+
return {
|
|
495
|
+
success: failedVerifications === 0,
|
|
496
|
+
totalTokens: tokens.length,
|
|
497
|
+
successfulVerifications,
|
|
498
|
+
failedVerifications,
|
|
499
|
+
results,
|
|
500
|
+
processingTime: Date.now() - startTime
|
|
501
|
+
};
|
|
502
|
+
}
|
|
503
|
+
/**
|
|
504
|
+
* Verify tokens in parallel with concurrency control
|
|
505
|
+
*/
|
|
506
|
+
async verifyBatchParallel(tokens, maxConcurrent) {
|
|
507
|
+
const results = [];
|
|
508
|
+
const chunks = [];
|
|
509
|
+
// Split tokens into chunks for parallel processing
|
|
510
|
+
for (let i = 0; i < tokens.length; i += maxConcurrent) {
|
|
511
|
+
chunks.push(tokens.slice(i, i + maxConcurrent));
|
|
512
|
+
}
|
|
513
|
+
// Process each chunk in parallel
|
|
514
|
+
for (const chunk of chunks) {
|
|
515
|
+
const chunkPromises = chunk.map(token => this.verifyTokenWithRetry(token.tokenMetadata, token.calculatedMerkleRoot));
|
|
516
|
+
const chunkResults = await Promise.all(chunkPromises);
|
|
517
|
+
results.push(...chunkResults);
|
|
518
|
+
// Add delay between chunks to avoid overwhelming the network
|
|
519
|
+
if (chunks.indexOf(chunk) < chunks.length - 1) {
|
|
520
|
+
await this.delay(this.batchDelay);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
return results;
|
|
524
|
+
}
|
|
525
|
+
/**
|
|
526
|
+
* Verify tokens sequentially with rate limiting
|
|
527
|
+
*/
|
|
528
|
+
async verifyBatchSequential(tokens) {
|
|
529
|
+
const results = [];
|
|
530
|
+
for (const token of tokens) {
|
|
531
|
+
const result = await this.verifyTokenWithRetry(token.tokenMetadata, token.calculatedMerkleRoot);
|
|
532
|
+
results.push(result);
|
|
533
|
+
// Add delay between verifications to avoid rate limiting
|
|
534
|
+
if (tokens.indexOf(token) < tokens.length - 1) {
|
|
535
|
+
await this.delay(this.batchDelay);
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
return results;
|
|
539
|
+
}
|
|
540
|
+
/**
|
|
541
|
+
* Process verification jobs with priority queue
|
|
542
|
+
* @param jobs Array of verification jobs
|
|
543
|
+
* @param options Processing options
|
|
544
|
+
* @returns Batch verification result
|
|
545
|
+
*/
|
|
546
|
+
async processVerificationJobs(jobs, options = {}) {
|
|
547
|
+
const { maxConcurrent = 3, priorityOrder = true, getTokenMetadata, getCalculatedMerkleRoot } = options;
|
|
548
|
+
if (!getTokenMetadata || !getCalculatedMerkleRoot) {
|
|
549
|
+
return {
|
|
550
|
+
success: false,
|
|
551
|
+
totalTokens: jobs.length,
|
|
552
|
+
successfulVerifications: 0,
|
|
553
|
+
failedVerifications: jobs.length,
|
|
554
|
+
results: [],
|
|
555
|
+
processingTime: 0
|
|
556
|
+
};
|
|
557
|
+
}
|
|
558
|
+
// Sort jobs by priority if requested
|
|
559
|
+
const sortedJobs = priorityOrder
|
|
560
|
+
? this.sortJobsByPriority(jobs)
|
|
561
|
+
: jobs;
|
|
562
|
+
// Convert jobs to token format
|
|
563
|
+
const tokens = [];
|
|
564
|
+
for (const job of sortedJobs) {
|
|
565
|
+
const tokenMetadata = await getTokenMetadata(job.tokenId);
|
|
566
|
+
const calculatedMerkleRoot = await getCalculatedMerkleRoot(job.tokenId);
|
|
567
|
+
if (tokenMetadata) {
|
|
568
|
+
tokens.push({
|
|
569
|
+
tokenMetadata,
|
|
570
|
+
calculatedMerkleRoot: calculatedMerkleRoot || null
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
return this.verifyBatch(tokens, { parallel: true, maxConcurrent });
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* Sort verification jobs by priority
|
|
578
|
+
*/
|
|
579
|
+
sortJobsByPriority(jobs) {
|
|
580
|
+
const priorityOrder = { high: 0, normal: 1, low: 2 };
|
|
581
|
+
return jobs.sort((a, b) => {
|
|
582
|
+
const aPriority = priorityOrder[a.priority || 'normal'];
|
|
583
|
+
const bPriority = priorityOrder[b.priority || 'normal'];
|
|
584
|
+
if (aPriority !== bPriority) {
|
|
585
|
+
return aPriority - bPriority;
|
|
586
|
+
}
|
|
587
|
+
// If same priority, sort by retry count (fewer retries first)
|
|
588
|
+
return (a.retryCount || 0) - (b.retryCount || 0);
|
|
589
|
+
});
|
|
590
|
+
}
|
|
591
|
+
/**
|
|
592
|
+
* Calculate retry delay with exponential backoff
|
|
593
|
+
*/
|
|
594
|
+
calculateRetryDelay(attempt) {
|
|
595
|
+
return Math.min(this.retryDelay * Math.pow(2, attempt - 1), 30000); // Max 30 seconds
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Utility method for delays
|
|
599
|
+
*/
|
|
600
|
+
async delay(ms) {
|
|
601
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
602
|
+
}
|
|
603
|
+
/**
|
|
604
|
+
* Get verification statistics
|
|
605
|
+
*/
|
|
606
|
+
getVerificationStats() {
|
|
607
|
+
return {
|
|
608
|
+
maxRetries: this.maxRetries,
|
|
609
|
+
retryDelay: this.retryDelay,
|
|
610
|
+
batchDelay: this.batchDelay
|
|
611
|
+
};
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Update verification configuration
|
|
615
|
+
*/
|
|
616
|
+
updateConfig(config) {
|
|
617
|
+
if (config.maxRetries !== undefined) {
|
|
618
|
+
this.maxRetries = config.maxRetries;
|
|
619
|
+
}
|
|
620
|
+
if (config.retryDelay !== undefined) {
|
|
621
|
+
this.retryDelay = config.retryDelay;
|
|
622
|
+
}
|
|
623
|
+
if (config.batchDelay !== undefined) {
|
|
624
|
+
this.batchDelay = config.batchDelay;
|
|
625
|
+
}
|
|
626
|
+
if (this.debug) {
|
|
627
|
+
console.log('🔧 ZipkitVerifier configuration updated:', this.getVerificationStats());
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
}
|
|
631
|
+
exports.ZipkitVerifier = ZipkitVerifier;
|
|
632
|
+
//# sourceMappingURL=ZipkitVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZipkitVerifier.js","sourceRoot":"","sources":["../../../src/blockchain/core/ZipkitVerifier.ts"],"names":[],"mappings":"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"}
|