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.
Files changed (301) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +410 -186
  3. package/contracts/ABI.txt +889 -0
  4. package/contracts/Bytecode.txt +1 -0
  5. package/contracts/COMPILATION_NOTES.md +59 -0
  6. package/contracts/QUICK_DEPLOY.md +286 -0
  7. package/contracts/README.md +235 -131
  8. package/contracts/VERIFICATION.md +308 -0
  9. package/contracts/deploy-interactive.js +448 -0
  10. package/contracts/deployment-arbitrum-sepolia.json +12 -0
  11. package/contracts/deployment-arbitrum.json +12 -0
  12. package/contracts/deployment-eth-sepolia.json +12 -0
  13. package/contracts/hardhat.config.js +114 -0
  14. package/contracts/package.json +20 -0
  15. package/contracts/scripts/compile-and-extract.js +119 -0
  16. package/contracts/scripts/verify-contract.js +223 -0
  17. package/contracts/src/{NZIP-NFT-Private.sol → NZIP-NFT-v2.0.sol} +66 -151
  18. package/contracts/src/NZIP-NFT.sol +9 -15
  19. package/dist/blockchain/browser/TokenVerifierBrowser.d.ts +67 -0
  20. package/dist/blockchain/browser/TokenVerifierBrowser.d.ts.map +1 -0
  21. package/dist/blockchain/browser/TokenVerifierBrowser.js +313 -0
  22. package/dist/blockchain/browser/TokenVerifierBrowser.js.map +1 -0
  23. package/dist/blockchain/browser/WalletManagerBrowser.d.ts +98 -0
  24. package/dist/blockchain/browser/WalletManagerBrowser.d.ts.map +1 -0
  25. package/dist/blockchain/browser/WalletManagerBrowser.js +434 -0
  26. package/dist/blockchain/browser/WalletManagerBrowser.js.map +1 -0
  27. package/dist/blockchain/browser/ZipkitMinterBrowser.d.ts +58 -0
  28. package/dist/blockchain/browser/ZipkitMinterBrowser.d.ts.map +1 -0
  29. package/dist/blockchain/browser/ZipkitMinterBrowser.js +317 -0
  30. package/dist/blockchain/browser/ZipkitMinterBrowser.js.map +1 -0
  31. package/dist/blockchain/browser/index.d.ts +11 -0
  32. package/dist/blockchain/browser/index.d.ts.map +1 -0
  33. package/dist/blockchain/browser/index.js +16 -0
  34. package/dist/blockchain/browser/index.js.map +1 -0
  35. package/dist/blockchain/core/WalletManager.d.ts +124 -0
  36. package/dist/blockchain/core/WalletManager.d.ts.map +1 -0
  37. package/dist/blockchain/{ZipKitWallet.js → core/WalletManager.js} +157 -177
  38. package/dist/blockchain/core/WalletManager.js.map +1 -0
  39. package/dist/blockchain/{ZipKitMinter.d.ts → core/ZipkitMinter.d.ts} +46 -11
  40. package/dist/blockchain/core/ZipkitMinter.d.ts.map +1 -0
  41. package/dist/blockchain/core/ZipkitMinter.js +548 -0
  42. package/dist/blockchain/core/ZipkitMinter.js.map +1 -0
  43. package/dist/blockchain/{ZipKitOTS.d.ts → core/ZipkitOTS.d.ts} +6 -15
  44. package/dist/blockchain/core/ZipkitOTS.d.ts.map +1 -0
  45. package/dist/blockchain/{ZipKitOTS.js → core/ZipkitOTS.js} +26 -84
  46. package/dist/blockchain/core/ZipkitOTS.js.map +1 -0
  47. package/dist/blockchain/core/ZipkitVerifier.d.ts +177 -0
  48. package/dist/blockchain/core/ZipkitVerifier.d.ts.map +1 -0
  49. package/dist/blockchain/core/ZipkitVerifier.js +632 -0
  50. package/dist/blockchain/core/ZipkitVerifier.js.map +1 -0
  51. package/dist/blockchain/core/contracts.d.ts +83 -0
  52. package/dist/blockchain/core/contracts.d.ts.map +1 -0
  53. package/dist/blockchain/core/contracts.js +341 -0
  54. package/dist/blockchain/core/contracts.js.map +1 -0
  55. package/dist/blockchain/core/index.d.ts +12 -0
  56. package/dist/blockchain/core/index.d.ts.map +1 -0
  57. package/dist/blockchain/core/index.js +59 -0
  58. package/dist/blockchain/core/index.js.map +1 -0
  59. package/dist/blockchain/index.d.ts +11 -7
  60. package/dist/blockchain/index.d.ts.map +1 -0
  61. package/dist/blockchain/index.js +18 -34
  62. package/dist/blockchain/index.js.map +1 -0
  63. package/dist/blockchain/node/WalletManagerNode.d.ts +47 -0
  64. package/dist/blockchain/node/WalletManagerNode.d.ts.map +1 -0
  65. package/dist/blockchain/node/WalletManagerNode.js +203 -0
  66. package/dist/blockchain/node/WalletManagerNode.js.map +1 -0
  67. package/dist/blockchain/node/index.d.ts +12 -0
  68. package/dist/blockchain/node/index.d.ts.map +1 -0
  69. package/dist/blockchain/node/index.js +24 -0
  70. package/dist/blockchain/node/index.js.map +1 -0
  71. package/dist/browser/ZipkitBrowser.d.ts +27 -0
  72. package/dist/browser/ZipkitBrowser.d.ts.map +1 -0
  73. package/dist/browser/{ZipKitBrowser.js → ZipkitBrowser.js} +96 -43
  74. package/dist/browser/ZipkitBrowser.js.map +1 -0
  75. package/dist/browser/index.d.ts +12 -0
  76. package/dist/browser/index.d.ts.map +1 -0
  77. package/dist/browser/index.js +42 -0
  78. package/dist/browser/index.js.map +1 -0
  79. package/dist/browser-esm/index.d.ts +12 -0
  80. package/dist/browser-esm/index.js +59559 -0
  81. package/dist/browser-esm/index.js.map +7 -0
  82. package/dist/browser-umd/index.d.ts +12 -0
  83. package/dist/browser-umd/index.js +59576 -0
  84. package/dist/browser-umd/index.js.map +7 -0
  85. package/dist/browser-umd/index.min.js +63 -0
  86. package/dist/browser.d.ts +8 -14
  87. package/dist/browser.js +13 -28
  88. package/dist/core/ZipCompress.d.ts +99 -0
  89. package/dist/core/ZipCompress.d.ts.map +1 -0
  90. package/dist/core/ZipCompress.js +309 -0
  91. package/dist/core/ZipCompress.js.map +1 -0
  92. package/dist/core/ZipDecompress.d.ts +58 -0
  93. package/dist/core/ZipDecompress.d.ts.map +1 -0
  94. package/dist/core/ZipDecompress.js +172 -0
  95. package/dist/core/ZipDecompress.js.map +1 -0
  96. package/dist/{shared → core}/ZipEntry.d.ts +8 -1
  97. package/dist/core/ZipEntry.d.ts.map +1 -0
  98. package/dist/{shared → core}/ZipEntry.js +225 -82
  99. package/dist/core/ZipEntry.js.map +1 -0
  100. package/dist/core/Zipkit.d.ts +315 -0
  101. package/dist/core/Zipkit.d.ts.map +1 -0
  102. package/dist/core/Zipkit.js +647 -0
  103. package/dist/core/Zipkit.js.map +1 -0
  104. package/dist/core/components/HashCalculator.d.ts +138 -0
  105. package/dist/core/components/HashCalculator.d.ts.map +1 -0
  106. package/dist/core/components/HashCalculator.js +360 -0
  107. package/dist/core/components/HashCalculator.js.map +1 -0
  108. package/dist/core/components/Logger.d.ts +73 -0
  109. package/dist/core/components/Logger.d.ts.map +1 -0
  110. package/dist/core/components/Logger.js +156 -0
  111. package/dist/core/components/Logger.js.map +1 -0
  112. package/dist/core/components/ProgressTracker.d.ts +43 -0
  113. package/dist/core/components/ProgressTracker.d.ts.map +1 -0
  114. package/dist/core/components/ProgressTracker.js +112 -0
  115. package/dist/core/components/ProgressTracker.js.map +1 -0
  116. package/dist/{shared → core}/components/Support.d.ts +1 -0
  117. package/dist/core/components/Support.d.ts.map +1 -0
  118. package/dist/{shared → core}/components/Support.js +1 -0
  119. package/dist/core/components/Support.js.map +1 -0
  120. package/dist/{shared → core}/components/Util.d.ts +7 -2
  121. package/dist/core/components/Util.d.ts.map +1 -0
  122. package/dist/{shared → core}/components/Util.js +14 -34
  123. package/dist/core/components/Util.js.map +1 -0
  124. package/dist/{shared → core}/constants/Errors.d.ts +1 -2
  125. package/dist/core/constants/Errors.d.ts.map +1 -0
  126. package/dist/{shared → core}/constants/Errors.js +1 -3
  127. package/dist/core/constants/Errors.js.map +1 -0
  128. package/dist/{shared → core}/constants/Headers.d.ts +3 -0
  129. package/dist/core/constants/Headers.d.ts.map +1 -0
  130. package/dist/{shared → core}/constants/Headers.js +20 -17
  131. package/dist/core/constants/Headers.js.map +1 -0
  132. package/dist/core/encryption/Manager.d.ts +58 -0
  133. package/dist/core/encryption/Manager.d.ts.map +1 -0
  134. package/dist/core/encryption/Manager.js +121 -0
  135. package/dist/core/encryption/Manager.js.map +1 -0
  136. package/dist/core/encryption/ZipCrypto.d.ts +172 -0
  137. package/dist/core/encryption/ZipCrypto.d.ts.map +1 -0
  138. package/dist/core/encryption/ZipCrypto.js +554 -0
  139. package/dist/core/encryption/ZipCrypto.js.map +1 -0
  140. package/dist/core/encryption/index.d.ts +9 -0
  141. package/dist/core/encryption/index.d.ts.map +1 -0
  142. package/dist/core/encryption/index.js +17 -0
  143. package/dist/core/encryption/index.js.map +1 -0
  144. package/dist/core/encryption/types.d.ts +29 -0
  145. package/dist/core/encryption/types.d.ts.map +1 -0
  146. package/dist/core/encryption/types.js +12 -0
  147. package/dist/core/encryption/types.js.map +1 -0
  148. package/dist/core/index.d.ts +24 -0
  149. package/dist/core/index.d.ts.map +1 -0
  150. package/dist/core/index.js +57 -0
  151. package/dist/core/index.js.map +1 -0
  152. package/dist/core/version.d.ts +5 -0
  153. package/dist/core/version.d.ts.map +1 -0
  154. package/dist/core/version.js +31 -0
  155. package/dist/core/version.js.map +1 -0
  156. package/dist/index.d.ts +8 -18
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +29 -35
  159. package/dist/index.js.map +1 -0
  160. package/dist/node/ZipCompressNode.d.ts +123 -0
  161. package/dist/node/ZipCompressNode.d.ts.map +1 -0
  162. package/dist/node/ZipCompressNode.js +576 -0
  163. package/dist/node/ZipCompressNode.js.map +1 -0
  164. package/dist/node/ZipDecompressNode.d.ts +120 -0
  165. package/dist/node/ZipDecompressNode.d.ts.map +1 -0
  166. package/dist/node/ZipDecompressNode.js +461 -0
  167. package/dist/node/ZipDecompressNode.js.map +1 -0
  168. package/dist/node/ZipkitNode.d.ts +406 -0
  169. package/dist/node/ZipkitNode.d.ts.map +1 -0
  170. package/dist/node/ZipkitNode.js +1305 -0
  171. package/dist/node/ZipkitNode.js.map +1 -0
  172. package/dist/node/index.d.ts +26 -0
  173. package/dist/node/index.d.ts.map +1 -0
  174. package/dist/node/index.js +65 -0
  175. package/dist/node/index.js.map +1 -0
  176. package/dist/types/index.d.ts +59 -0
  177. package/dist/types/index.d.ts.map +1 -0
  178. package/dist/types/index.js +36 -1
  179. package/dist/types/index.js.map +1 -0
  180. package/examples/README.md +269 -0
  181. package/examples/blockchain-tokenize.ts +354 -0
  182. package/examples/create-zip.ts +172 -0
  183. package/examples/extract-zip.ts +158 -0
  184. package/examples/list-zip.ts +161 -0
  185. package/examples/test-files/data.json +116 -0
  186. package/examples/test-files/document.md +80 -0
  187. package/examples/test-files/document.txt +2 -0
  188. package/examples/test-files/file1.txt +48 -0
  189. package/examples/test-files/file2.txt +80 -0
  190. package/examples/tsconfig.json +44 -0
  191. package/examples/unzip-token.ts +491 -0
  192. package/examples/verify-tokenized-zip.ts +305 -0
  193. package/examples/zip-token.ts +604 -0
  194. package/package.json +108 -24
  195. package/src/blockchain/README.md +59 -66
  196. package/src/{browser/TokenVerifierBrowser.ts-remove → blockchain/browser/TokenVerifierBrowser.ts} +125 -79
  197. package/src/blockchain/browser/WalletManagerBrowser.ts +486 -0
  198. package/src/blockchain/browser/ZipkitMinterBrowser.ts +400 -0
  199. package/src/blockchain/browser/index.ts +13 -0
  200. package/src/blockchain/{ZipKitWallet.ts → core/WalletManager.ts} +241 -143
  201. package/src/blockchain/core/ZipkitMinter.ts +716 -0
  202. package/src/blockchain/{ZipKitOTS.ts → core/ZipkitOTS.ts} +28 -62
  203. package/src/blockchain/core/ZipkitVerifier.ts +853 -0
  204. package/src/blockchain/core/contracts.ts +370 -0
  205. package/src/blockchain/core/index.ts +71 -0
  206. package/src/blockchain/index.ts +21 -55
  207. package/src/blockchain/node/WalletManagerNode.ts +171 -0
  208. package/src/blockchain/node/index.ts +40 -0
  209. package/src/browser/{ZipKitBrowser.ts → ZipkitBrowser.ts} +104 -41
  210. package/src/browser/index.esm.ts +37 -0
  211. package/src/browser/index.ts +25 -0
  212. package/src/core/ZipCompress.ts +398 -0
  213. package/src/core/ZipDecompress.ts +212 -0
  214. package/src/{shared → core}/ZipEntry.ts +240 -90
  215. package/src/core/Zipkit.ts +794 -0
  216. package/src/core/components/HashCalculator.ts +384 -0
  217. package/src/core/components/Logger.ts +180 -0
  218. package/src/core/components/ProgressTracker.ts +134 -0
  219. package/src/{shared → core}/components/Util.ts +12 -34
  220. package/src/{shared → core}/constants/Errors.ts +0 -4
  221. package/src/{shared → core}/constants/Headers.ts +19 -17
  222. package/src/core/encryption/Manager.ts +137 -0
  223. package/src/core/encryption/ZipCrypto.ts +650 -0
  224. package/src/core/encryption/index.ts +15 -0
  225. package/src/core/encryption/types.ts +33 -0
  226. package/src/core/index.ts +34 -0
  227. package/src/core/version.ts +33 -0
  228. package/src/index.ts +54 -25
  229. package/src/node/ZipCompressNode.ts +632 -0
  230. package/src/node/ZipDecompressNode.ts +508 -0
  231. package/src/node/ZipkitNode.ts +1559 -0
  232. package/src/node/index.ts +69 -0
  233. package/src/types/index.ts +131 -1
  234. package/src/types/modules.d.ts +1 -11
  235. package/src/types/opentimestamps.d.ts +1 -23
  236. package/contracts/INTEGRATION.md +0 -338
  237. package/contracts/NETWORKS.md +0 -156
  238. package/contracts/NZIP-NFT-bytecode.txt +0 -1
  239. package/contracts/constants.ts +0 -952
  240. package/contracts/deploy-bytecode.mjs +0 -94
  241. package/dist/blockchain/CertificateToken.d.ts +0 -48
  242. package/dist/blockchain/CertificateToken.js +0 -386
  243. package/dist/blockchain/ZipKitMinter.js +0 -347
  244. package/dist/blockchain/ZipKitNFT.d.ts +0 -3
  245. package/dist/blockchain/ZipKitNFT.js +0 -7
  246. package/dist/blockchain/ZipKitVerifier.d.ts +0 -69
  247. package/dist/blockchain/ZipKitVerifier.js +0 -289
  248. package/dist/blockchain/ZipKitWallet.d.ts +0 -69
  249. package/dist/blockchain/contracts.d.ts +0 -14
  250. package/dist/blockchain/contracts.js +0 -77
  251. package/dist/blockchain/types.d.ts +0 -47
  252. package/dist/blockchain/types.js +0 -30
  253. package/dist/browser/ZipKitBrowser.d.ts +0 -18
  254. package/dist/browser/ZipKitStampBrowser.d.ts +0 -2
  255. package/dist/browser/ZipKitStampBrowser.js +0 -12
  256. package/dist/browser-index.d.ts +0 -18
  257. package/dist/browser-index.js +0 -57
  258. package/dist/server/ZipKitServer.d.ts +0 -74
  259. package/dist/server/ZipKitServer.js +0 -310
  260. package/dist/shared/ZipKit.d.ts +0 -243
  261. package/dist/shared/ZipKit.js +0 -772
  262. package/dist/shared/components/CertificateOTS.d.ts +0 -15
  263. package/dist/shared/components/CertificateOTS.js +0 -116
  264. package/dist/shared/components/FileSys.d.ts +0 -2
  265. package/dist/shared/components/FileSys.js +0 -113
  266. package/dist/shared/components/HashAccumulator.d.ts +0 -55
  267. package/dist/shared/components/HashAccumulator.js +0 -100
  268. package/dist/shared/components/ZipCrypto.d.ts +0 -3
  269. package/dist/shared/components/ZipCrypto.js +0 -78
  270. package/dist/shared/components/merkleTree.d.ts +0 -66
  271. package/dist/shared/components/merkleTree.js +0 -136
  272. package/dist/shared/types/index.d.ts +0 -21
  273. package/dist/shared/types/index.js +0 -3
  274. package/dist/shared/types.d.ts +0 -33
  275. package/dist/shared/types.js +0 -8
  276. package/dist/shared/version.d.ts +0 -2
  277. package/dist/shared/version.js +0 -6
  278. package/src/blockchain/CertificateToken.ts +0 -444
  279. package/src/blockchain/ZipKitMinter.ts +0 -470
  280. package/src/blockchain/ZipKitNFT.ts +0 -12
  281. package/src/blockchain/ZipKitVerifier.ts +0 -382
  282. package/src/blockchain/contracts.ts +0 -88
  283. package/src/blockchain/types.ts +0 -91
  284. package/src/browser/CertificateGeneratorBrowser.ts-remove +0 -498
  285. package/src/browser/ZipKitStampBrowser.ts +0 -9
  286. package/src/browser-index.ts +0 -36
  287. package/src/server/README.md +0 -25
  288. package/src/server/ZipKitServer.ts +0 -305
  289. package/src/shared/ZipKit.ts +0 -881
  290. package/src/shared/components/CertificateOTS.ts +0 -132
  291. package/src/shared/components/FileSys.ts +0 -87
  292. package/src/shared/components/HashAccumulator.ts +0 -113
  293. package/src/shared/components/ZipCrypto.ts +0 -91
  294. package/src/shared/components/merkleTree.ts +0 -162
  295. package/src/shared/types/index.ts +0 -25
  296. package/src/shared/types/modules.d.ts +0 -22
  297. package/src/shared/types/opentimestamps.d.ts +0 -23
  298. package/src/shared/types.d.ts +0 -8
  299. package/src/shared/types.ts +0 -43
  300. package/src/shared/version.ts +0 -3
  301. /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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"}