neozipkit 0.1.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 (330) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +371 -200
  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 +256 -0
  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/{browser → blockchain/browser}/TokenVerifierBrowser.d.ts +11 -20
  20. package/dist/blockchain/browser/TokenVerifierBrowser.d.ts.map +1 -0
  21. package/dist/{browser → blockchain/browser}/TokenVerifierBrowser.js +106 -92
  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/{server/blockchain/WalletAnalyzer.d.ts → blockchain/core/WalletManager.d.ts} +69 -26
  36. package/dist/blockchain/core/WalletManager.d.ts.map +1 -0
  37. package/dist/{server/blockchain/WalletAnalyzer.js → blockchain/core/WalletManager.js} +172 -160
  38. package/dist/blockchain/core/WalletManager.js.map +1 -0
  39. package/dist/blockchain/core/ZipkitMinter.d.ts +141 -0
  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/core/ZipkitOTS.d.ts +126 -0
  44. package/dist/blockchain/core/ZipkitOTS.d.ts.map +1 -0
  45. package/dist/blockchain/core/ZipkitOTS.js +506 -0
  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 -0
  60. package/dist/blockchain/index.d.ts.map +1 -0
  61. package/dist/blockchain/index.js +34 -0
  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 -17
  87. package/dist/browser.js +13 -29
  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 +224 -81
  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/{shared → core}/version.d.ts +1 -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 -25
  157. package/dist/index.d.ts.map +1 -0
  158. package/dist/index.js +29 -47
  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 +6 -3
  192. package/examples/verify-tokenized-zip.ts +305 -0
  193. package/package.json +117 -23
  194. package/src/blockchain/README.md +222 -0
  195. package/src/{browser → blockchain/browser}/TokenVerifierBrowser.ts +125 -79
  196. package/src/blockchain/browser/WalletManagerBrowser.ts +486 -0
  197. package/src/blockchain/browser/ZipkitMinterBrowser.ts +400 -0
  198. package/src/blockchain/browser/index.ts +13 -0
  199. package/src/blockchain/core/WalletManager.ts +436 -0
  200. package/src/blockchain/core/ZipkitMinter.ts +716 -0
  201. package/src/blockchain/core/ZipkitOTS.ts +588 -0
  202. package/src/blockchain/core/ZipkitVerifier.ts +853 -0
  203. package/src/blockchain/core/contracts.ts +370 -0
  204. package/src/blockchain/core/index.ts +71 -0
  205. package/src/blockchain/index.ts +27 -0
  206. package/src/blockchain/node/WalletManagerNode.ts +171 -0
  207. package/src/blockchain/node/index.ts +40 -0
  208. package/src/browser/{ZipKitBrowser.ts → ZipkitBrowser.ts} +104 -41
  209. package/src/browser/index.esm.ts +37 -0
  210. package/src/browser/index.ts +25 -0
  211. package/src/core/ZipCompress.ts +398 -0
  212. package/src/core/ZipDecompress.ts +212 -0
  213. package/src/{shared → core}/ZipEntry.ts +239 -89
  214. package/src/core/Zipkit.ts +794 -0
  215. package/src/core/components/HashCalculator.ts +384 -0
  216. package/src/core/components/Logger.ts +180 -0
  217. package/src/core/components/ProgressTracker.ts +134 -0
  218. package/src/{shared → core}/components/Util.ts +12 -34
  219. package/src/{shared → core}/constants/Errors.ts +0 -4
  220. package/src/{shared → core}/constants/Headers.ts +19 -17
  221. package/src/core/encryption/Manager.ts +137 -0
  222. package/src/core/encryption/ZipCrypto.ts +650 -0
  223. package/src/core/encryption/index.ts +15 -0
  224. package/src/core/encryption/types.ts +33 -0
  225. package/src/core/index.ts +34 -0
  226. package/src/core/version.ts +33 -0
  227. package/src/index.ts +54 -32
  228. package/src/node/ZipCompressNode.ts +632 -0
  229. package/src/node/ZipDecompressNode.ts +508 -0
  230. package/src/node/ZipkitNode.ts +1559 -0
  231. package/src/node/index.ts +69 -0
  232. package/src/types/index.ts +131 -1
  233. package/src/types/opentimestamps.d.ts +1 -23
  234. package/contracts/Lock.sol +0 -34
  235. package/contracts/bytecode.txt +0 -1
  236. package/contracts/compile-contract.js +0 -168
  237. package/contracts/deploy/deploy-both-contracts.js +0 -286
  238. package/contracts/deploy/deploy-enhanced-contract.js +0 -197
  239. package/contracts/deploy/deploy-private-contract.js +0 -190
  240. package/contracts/deploy/deploy-public-clean.js +0 -1063
  241. package/contracts/deploy/deploy-public-contract.js +0 -1107
  242. package/contracts/deployment.config.example.js +0 -25
  243. package/contracts/remix-compile.js +0 -222
  244. package/contracts/setup-deployment.js +0 -51
  245. package/contracts/src/ZipFileNFT-DEPRECATED-6field.sol +0 -260
  246. package/contracts/src/ZipFileNFT-DEPRECATED-Enhanced.sol +0 -289
  247. package/dist/browser/CertificateGeneratorBrowser.d.ts +0 -75
  248. package/dist/browser/CertificateGeneratorBrowser.js +0 -433
  249. package/dist/browser/ZipKitBrowser.d.ts +0 -18
  250. package/dist/browser/ZipKitStampBrowser.d.ts +0 -2
  251. package/dist/browser/ZipKitStampBrowser.js +0 -12
  252. package/dist/browser-index.d.ts +0 -21
  253. package/dist/browser-index.js +0 -58
  254. package/dist/server/blockchain/CertificateToken.d.ts +0 -48
  255. package/dist/server/blockchain/CertificateToken.js +0 -386
  256. package/dist/server/blockchain/NFTMinter.d.ts +0 -41
  257. package/dist/server/blockchain/NFTMinter.js +0 -323
  258. package/dist/server/blockchain/TokenQuerier.d.ts +0 -31
  259. package/dist/server/blockchain/TokenQuerier.js +0 -259
  260. package/dist/server/blockchain/TokenVerifier.d.ts +0 -20
  261. package/dist/server/blockchain/TokenVerifier.js +0 -395
  262. package/dist/server/blockchain/WalletFormatter.d.ts +0 -39
  263. package/dist/server/blockchain/WalletFormatter.js +0 -196
  264. package/dist/server/blockchain/WalletManager.d.ts +0 -46
  265. package/dist/server/blockchain/WalletManager.js +0 -294
  266. package/dist/server/blockchain/ZipMetadata.d.ts +0 -27
  267. package/dist/server/blockchain/ZipMetadata.js +0 -131
  268. package/dist/server/blockchain/ZipTokenProcessor.d.ts +0 -44
  269. package/dist/server/blockchain/ZipTokenProcessor.js +0 -204
  270. package/dist/server/blockchain/constants.d.ts +0 -102
  271. package/dist/server/blockchain/constants.js +0 -968
  272. package/dist/server/blockchain/index.d.ts +0 -9
  273. package/dist/server/blockchain/index.js +0 -44
  274. package/dist/server/blockchain/test-certificate.d.ts +0 -8
  275. package/dist/server/blockchain/test-certificate.js +0 -100
  276. package/dist/server/blockchain/types.d.ts +0 -69
  277. package/dist/server/blockchain/types.js +0 -51
  278. package/dist/server/platform/server/ZipKitServer.d.ts +0 -105
  279. package/dist/server/platform/server/ZipKitServer.js +0 -437
  280. package/dist/server/platform/servercomponents/ZipKitOTS.d.ts +0 -91
  281. package/dist/server/platform/servercomponents/ZipKitOTS.js +0 -271
  282. package/dist/shared/ZipKit.d.ts +0 -249
  283. package/dist/shared/ZipKit.js +0 -789
  284. package/dist/shared/components/CertificateOTS.d.ts +0 -15
  285. package/dist/shared/components/CertificateOTS.js +0 -116
  286. package/dist/shared/components/FileSys.d.ts +0 -2
  287. package/dist/shared/components/FileSys.js +0 -113
  288. package/dist/shared/components/HashAccumulator.d.ts +0 -55
  289. package/dist/shared/components/HashAccumulator.js +0 -100
  290. package/dist/shared/components/ZipCrypto.d.ts +0 -3
  291. package/dist/shared/components/ZipCrypto.js +0 -78
  292. package/dist/shared/components/merkleTree.d.ts +0 -66
  293. package/dist/shared/components/merkleTree.js +0 -136
  294. package/dist/shared/types/index.d.ts +0 -21
  295. package/dist/shared/types/index.js +0 -3
  296. package/dist/shared/types.d.ts +0 -33
  297. package/dist/shared/types.js +0 -8
  298. package/dist/shared/version.js +0 -7
  299. package/src/browser/CertificateGeneratorBrowser.ts +0 -498
  300. package/src/browser/ZipKitStampBrowser.ts +0 -9
  301. package/src/browser-index.ts +0 -36
  302. package/src/server/blockchain/CertificateToken.ts +0 -444
  303. package/src/server/blockchain/NFTMinter.ts +0 -357
  304. package/src/server/blockchain/TokenQuerier.ts +0 -287
  305. package/src/server/blockchain/TokenVerifier.ts +0 -453
  306. package/src/server/blockchain/WalletAnalyzer.ts +0 -397
  307. package/src/server/blockchain/WalletFormatter.ts +0 -206
  308. package/src/server/blockchain/WalletManager.ts +0 -294
  309. package/src/server/blockchain/ZipMetadata.ts +0 -117
  310. package/src/server/blockchain/ZipTokenProcessor.ts +0 -234
  311. package/src/server/blockchain/constants.ts +0 -969
  312. package/src/server/blockchain/index.ts +0 -42
  313. package/src/server/blockchain/test-certificate.ts +0 -137
  314. package/src/server/blockchain/types.ts +0 -134
  315. package/src/server/platform/server/ZipKitServer.ts +0 -459
  316. package/src/server/platform/servercomponents/ZipKitOTS.ts +0 -313
  317. package/src/server/platform/servercomponents/opentimestamps.d.ts +0 -23
  318. package/src/shared/ZipKit.ts +0 -899
  319. package/src/shared/components/CertificateOTS.ts +0 -132
  320. package/src/shared/components/FileSys.ts +0 -87
  321. package/src/shared/components/HashAccumulator.ts +0 -113
  322. package/src/shared/components/ZipCrypto.ts +0 -91
  323. package/src/shared/components/merkleTree.ts +0 -162
  324. package/src/shared/types/index.ts +0 -25
  325. package/src/shared/types/modules.d.ts +0 -22
  326. package/src/shared/types/opentimestamps.d.ts +0 -23
  327. package/src/shared/types.d.ts +0 -8
  328. package/src/shared/types.ts +0 -43
  329. package/src/shared/version.ts +0 -4
  330. /package/src/{shared → core}/components/Support.ts +0 -0
@@ -1,453 +0,0 @@
1
- // ======================================
2
- // TokenVerifier.ts
3
- // Blockchain token verification utilities for ZIP archives
4
- // Copyright (c) 2024 NeoWare, Inc. All rights reserved.
5
- // ======================================
6
-
7
- import * as fs from 'fs';
8
- import * as path from 'path';
9
- import ZipKitServer from '../platform/server/ZipKitServer';
10
- import ZipEntry from '../../shared/ZipEntry';
11
- import { NZipTokenInfo } from './types';
12
- import { TOKENIZED_METADATA } from '../../shared/constants/Headers';
13
- import { ZipMetadata } from './ZipMetadata';
14
- import {
15
- createTokenCertificate,
16
- saveCertificate,
17
- TokenInfo,
18
- BlockchainVerification,
19
- WalletInfo,
20
- ZipFileInfo
21
- } from './CertificateToken';
22
-
23
- // Network configuration for blockchain queries
24
- const NETWORK_CONFIG: Record<string, any> = {
25
- 'Base Sepolia': {
26
- rpcUrls: [
27
- 'https://sepolia.base.org',
28
- 'https://base-sepolia.g.alchemy.com/v2/demo',
29
- 'https://base-sepolia-rpc.publicnode.com',
30
- 'https://base-sepolia.blockpi.network/v1/rpc/public'
31
- ]
32
- },
33
- 'Base Mainnet': {
34
- rpcUrls: [
35
- 'https://mainnet.base.org',
36
- 'https://base-mainnet.g.alchemy.com/v2/demo',
37
- 'https://base-rpc.publicnode.com',
38
- 'https://base.blockpi.network/v1/rpc/public'
39
- ]
40
- }
41
- };
42
-
43
- export interface TokenVerificationOptions {
44
- skipHash?: boolean;
45
- skipToken?: boolean;
46
- generateCertificate?: boolean;
47
- zipFileName?: string;
48
- }
49
-
50
- export interface TokenVerificationResult {
51
- isTokenized: boolean;
52
- tokenMetadata: NZipTokenInfo | null;
53
- calculatedMerkleRoot: string | null;
54
- blockchainMerkleRoot: string | null;
55
- verificationPassed: boolean;
56
- certificatePath?: string;
57
- }
58
-
59
- /**
60
- * Checks if the ZIP file contains NFT token metadata and verifies the merkle root
61
- */
62
- export async function checkForTokenization(
63
- zipKit: ZipKitServer,
64
- options: TokenVerificationOptions = {}
65
- ): Promise<TokenVerificationResult> {
66
- const zipEntries = zipKit.getDirectory() as ZipEntry[];
67
-
68
- // Look for the tokenized metadata file
69
- const tokenEntry = zipEntries.find(entry => entry.filename === TOKENIZED_METADATA);
70
-
71
- if (tokenEntry) {
72
- console.log('\n🔍 Tokenized ZIP detected!');
73
- console.log('═'.repeat(60));
74
-
75
- try {
76
- // Extract the token metadata
77
- console.log('📄 Reading token metadata...');
78
- const tokenData = await zipKit.extract(tokenEntry);
79
-
80
- if (tokenData) {
81
- const tokenContent = tokenData.toString('utf8');
82
- const tokenMetadata = JSON.parse(tokenContent);
83
-
84
- // Validate token metadata structure - only accept full NFT tokens
85
- if (ZipMetadata.validateTokenInfo(tokenMetadata) && tokenMetadata) {
86
- console.log('✅ Valid NFT token metadata found');
87
-
88
- // Display token information
89
- console.log(ZipMetadata.createTokenSummary(tokenMetadata));
90
-
91
- // Automatically verify token merkle root unless skipped or hash calculation is disabled
92
- if (options.skipHash) {
93
- console.log('\n⏭️ Token verification skipped (--skip-hash prevents merkle root calculation)');
94
- console.log('💡 Use -H flag to enable hash calculation and token verification');
95
-
96
- return {
97
- isTokenized: true,
98
- tokenMetadata,
99
- calculatedMerkleRoot: null,
100
- blockchainMerkleRoot: null,
101
- verificationPassed: false
102
- };
103
- } else if (options.skipToken) {
104
- console.log('\n⏭️ Token verification skipped (--skip-token flag)');
105
- console.log('⚠️ WARNING: Archive integrity cannot be verified without token validation');
106
-
107
- return {
108
- isTokenized: true,
109
- tokenMetadata,
110
- calculatedMerkleRoot: null,
111
- blockchainMerkleRoot: null,
112
- verificationPassed: false
113
- };
114
- } else {
115
- console.log('\n🔒 Verifying archive integrity against blockchain...');
116
- const calculatedMerkleRoot = calculateMerkleRootExcludingToken(zipKit);
117
-
118
- if (calculatedMerkleRoot && tokenMetadata) {
119
- // Query blockchain for the actual merkle root (full NFT tokens only)
120
- console.log('🌐 Querying blockchain for stored merkle root...');
121
- const blockchainMerkleRoot = await queryBlockchainMerkleRoot(tokenMetadata);
122
-
123
- if (blockchainMerkleRoot) {
124
- console.log(`Blockchain Merkle Root: ${blockchainMerkleRoot}`);
125
- console.log(`Calculated Merkle Root: ${calculatedMerkleRoot}`);
126
-
127
- if (blockchainMerkleRoot === calculatedMerkleRoot) {
128
- console.log('✅ BLOCKCHAIN VERIFICATION: PASSED');
129
- console.log(' Archive contents match the blockchain-recorded merkle root!');
130
-
131
- // Generate certificate if requested
132
- let certificatePath: string | undefined;
133
- if (options.generateCertificate) {
134
- certificatePath = await generateCertificate(
135
- tokenMetadata,
136
- options.zipFileName || 'unknown.zip',
137
- zipEntries,
138
- {
139
- merkleRootMatches: true,
140
- blockchainMerkleRoot,
141
- calculatedMerkleRoot,
142
- verificationStatus: 'PASSED',
143
- verificationTime: Math.floor(Date.now() / 1000)
144
- }
145
- );
146
- }
147
-
148
- return {
149
- isTokenized: true,
150
- tokenMetadata,
151
- calculatedMerkleRoot,
152
- blockchainMerkleRoot,
153
- verificationPassed: true,
154
- certificatePath
155
- };
156
- } else {
157
- console.log('❌ BLOCKCHAIN VERIFICATION: FAILED');
158
- console.log(' WARNING: Archive contents do not match the blockchain record!');
159
- console.log(' This archive may have been tampered with or corrupted.');
160
-
161
- // Generate certificate for failed verification if requested
162
- let certificatePath: string | undefined;
163
- if (options.generateCertificate) {
164
- certificatePath = await generateCertificate(
165
- tokenMetadata,
166
- options.zipFileName || 'unknown.zip',
167
- zipEntries,
168
- {
169
- merkleRootMatches: false,
170
- blockchainMerkleRoot,
171
- calculatedMerkleRoot,
172
- verificationStatus: 'FAILED',
173
- verificationTime: Math.floor(Date.now() / 1000)
174
- }
175
- );
176
- }
177
-
178
- return {
179
- isTokenized: true,
180
- tokenMetadata,
181
- calculatedMerkleRoot,
182
- blockchainMerkleRoot,
183
- verificationPassed: false,
184
- certificatePath
185
- };
186
- }
187
- } else {
188
- console.log('❌ BLOCKCHAIN VERIFICATION: FAILED');
189
- console.log(' Could not retrieve merkle root from blockchain');
190
- console.log(' Token metadata may be invalid or network unreachable');
191
-
192
- // Handle unavailable blockchain verification
193
- let certificatePath: string | undefined;
194
- if (options.generateCertificate && tokenMetadata) {
195
- certificatePath = await generateCertificate(
196
- tokenMetadata,
197
- options.zipFileName || 'unknown.zip',
198
- zipEntries,
199
- {
200
- merkleRootMatches: false,
201
- blockchainMerkleRoot: "Unavailable",
202
- calculatedMerkleRoot: zipKit.getMerkleRoot() || 'Unable to calculate',
203
- verificationStatus: 'UNAVAILABLE',
204
- verificationTime: Math.floor(Date.now() / 1000)
205
- }
206
- );
207
- }
208
-
209
- return {
210
- isTokenized: true,
211
- tokenMetadata,
212
- calculatedMerkleRoot,
213
- blockchainMerkleRoot: null,
214
- verificationPassed: false,
215
- certificatePath
216
- };
217
- }
218
- }
219
- }
220
- } else {
221
- console.log('❌ Invalid token metadata structure');
222
- console.log(' This archive contains invalid or unsupported token metadata');
223
- console.log(' Only full NFT tokens with blockchain verification are supported');
224
-
225
- return {
226
- isTokenized: false,
227
- tokenMetadata: null,
228
- calculatedMerkleRoot: null,
229
- blockchainMerkleRoot: null,
230
- verificationPassed: false
231
- };
232
- }
233
- } else {
234
- console.log('❌ Could not read token metadata');
235
-
236
- return {
237
- isTokenized: false,
238
- tokenMetadata: null,
239
- calculatedMerkleRoot: null,
240
- blockchainMerkleRoot: null,
241
- verificationPassed: false
242
- };
243
- }
244
- } catch (error) {
245
- console.error('❌ Error reading token metadata:', error);
246
-
247
- return {
248
- isTokenized: false,
249
- tokenMetadata: null,
250
- calculatedMerkleRoot: null,
251
- blockchainMerkleRoot: null,
252
- verificationPassed: false
253
- };
254
- }
255
-
256
- console.log('═'.repeat(60));
257
- } else {
258
- console.log('\n📦 Standard ZIP archive (not tokenized)');
259
- if (options.skipHash) {
260
- console.log('⏭️ SHA-256 hash validation disabled');
261
- }
262
-
263
- return {
264
- isTokenized: false,
265
- tokenMetadata: null,
266
- calculatedMerkleRoot: null,
267
- blockchainMerkleRoot: null,
268
- verificationPassed: false
269
- };
270
- }
271
-
272
- // Fallback return for cases where calculatedMerkleRoot is null
273
- return {
274
- isTokenized: true,
275
- tokenMetadata: null,
276
- calculatedMerkleRoot: null,
277
- blockchainMerkleRoot: null,
278
- verificationPassed: false
279
- };
280
- }
281
-
282
- /**
283
- * Queries the blockchain to get the actual merkle root stored in the smart contract
284
- */
285
- async function queryBlockchainMerkleRoot(tokenMetadata: NZipTokenInfo): Promise<string | null> {
286
- try {
287
- const { ethers } = await import('ethers');
288
-
289
- const networkConfig = NETWORK_CONFIG[tokenMetadata.network];
290
- if (!networkConfig) {
291
- console.log(`⚠️ Unsupported network: ${tokenMetadata.network}`);
292
- return null;
293
- }
294
-
295
- // Try multiple RPC endpoints
296
- for (const rpcUrl of networkConfig.rpcUrls) {
297
- try {
298
- console.log(` Trying RPC: ${rpcUrl}`);
299
- const provider = new ethers.JsonRpcProvider(rpcUrl);
300
-
301
- // Test connection
302
- await provider.getBlockNumber();
303
-
304
- // Use hardcoded ABI for NZIP NFT Contract v2.0
305
- const CONTRACT_ABI = [
306
- {
307
- "inputs": [{"internalType": "uint256", "name": "tokenId", "type": "uint256"}],
308
- "name": "getZipFileInfo",
309
- "outputs": [
310
- {
311
- "components": [
312
- {"internalType": "string", "name": "fileName", "type": "string"},
313
- {"internalType": "string", "name": "merkleRootHash", "type": "string"},
314
- {"internalType": "string", "name": "ipfsHash", "type": "string"},
315
- {"internalType": "address", "name": "creator", "type": "address"},
316
- {"internalType": "uint256", "name": "creationTimestamp", "type": "uint256"},
317
- {"internalType": "uint256", "name": "tokenizationTime", "type": "uint256"},
318
- {"internalType": "uint256", "name": "blockNumber", "type": "uint256"}
319
- ],
320
- "internalType": "struct ZipFileNFT.ZipFileInfo",
321
- "name": "",
322
- "type": "tuple"
323
- }
324
- ],
325
- "stateMutability": "view",
326
- "type": "function"
327
- }
328
- ];
329
-
330
- // Create contract instance
331
- const contract = new ethers.Contract(tokenMetadata.contractAddress, CONTRACT_ABI, provider);
332
-
333
- // Call getZipFileInfo to get the blockchain-stored merkle root
334
- const zipInfo = await contract.getZipFileInfo(tokenMetadata.tokenId);
335
- console.log(` ✅ Connected to blockchain successfully`);
336
-
337
- return zipInfo.merkleRootHash;
338
-
339
- } catch (error) {
340
- const errorMessage = error instanceof Error ? error.message : String(error);
341
- console.log(` ❌ RPC failed: ${errorMessage.substring(0, 80)}...`);
342
- continue;
343
- }
344
- }
345
-
346
- console.log(`⚠️ All RPC endpoints failed for network: ${tokenMetadata.network}`);
347
- return null;
348
-
349
- } catch (error) {
350
- const errorMessage = error instanceof Error ? error.message : String(error);
351
- console.log(`⚠️ Blockchain query error: ${errorMessage}`);
352
- return null;
353
- }
354
- }
355
-
356
- /**
357
- * Calculates the merkle root excluding the token metadata file
358
- * This represents the original content that was tokenized
359
- */
360
- function calculateMerkleRootExcludingToken(zipKit: ZipKitServer): string | null {
361
- try {
362
- // Get all entries except the token file
363
- const zipEntries = zipKit.getDirectory() as ZipEntry[];
364
- const contentEntries = zipEntries.filter(entry => entry.filename !== TOKENIZED_METADATA);
365
-
366
- if (contentEntries.length === 0) {
367
- console.log('⚠️ No content files found for merkle root calculation');
368
- return null;
369
- }
370
-
371
- console.log(`📊 Calculating merkle root for ${contentEntries.length} content files...`);
372
-
373
- // For each content entry, ensure we have SHA-256 hash calculated
374
- for (const entry of contentEntries) {
375
- if (!entry.sha256) {
376
- // Extract the file to calculate its SHA-256 hash
377
- try {
378
- const fileData = zipKit.extract(entry);
379
- // The extraction process should calculate and set the SHA-256 hash
380
- console.log(` Calculated SHA-256 for: ${entry.filename}`);
381
- } catch (error) {
382
- console.log(` ⚠️ Could not process: ${entry.filename}`);
383
- return null; // Cannot calculate merkle root without all hashes
384
- }
385
- }
386
- }
387
-
388
- // Now calculate the merkle root from the content files
389
- const merkleRoot = zipKit.getMerkleRoot();
390
-
391
- return merkleRoot;
392
- } catch (error) {
393
- console.error('Error calculating merkle root:', error);
394
- return null;
395
- }
396
- }
397
-
398
- /**
399
- * Generates a token certificate
400
- */
401
- async function generateCertificate(
402
- tokenMetadata: NZipTokenInfo,
403
- zipFileName: string,
404
- zipEntries: ZipEntry[],
405
- blockchainVerification: BlockchainVerification
406
- ): Promise<string> {
407
- console.log('\n📜 Generating Token Certificate...');
408
-
409
- try {
410
- // Prepare token information
411
- const tokenInfo: TokenInfo = {
412
- tokenId: tokenMetadata.tokenId,
413
- contractAddress: tokenMetadata.contractAddress,
414
- network: tokenMetadata.network,
415
- transactionHash: tokenMetadata.transactionHash
416
- };
417
-
418
- // Prepare file information from ZIP entries
419
- const zipFiles: ZipFileInfo[] = [];
420
- for (const entry of zipEntries) {
421
- // Skip the token file itself and directories
422
- if (entry.filename !== TOKENIZED_METADATA &&
423
- !entry.isDirectory &&
424
- entry.sha256) {
425
- zipFiles.push({
426
- filename: entry.filename,
427
- size: entry.uncompressedSize,
428
- date: entry.toFormattedUTCDateString(),
429
- hash: entry.sha256
430
- });
431
- }
432
- }
433
-
434
- // Generate the certificate
435
- const certificateHTML = createTokenCertificate(
436
- tokenInfo,
437
- zipFileName,
438
- blockchainVerification,
439
- undefined, // walletInfo
440
- zipFiles
441
- );
442
-
443
- // Save the certificate
444
- const certPath = saveCertificate(zipFileName, certificateHTML);
445
- console.log(`✅ Certificate generated: ${certPath}`);
446
-
447
- return certPath;
448
-
449
- } catch (error) {
450
- console.error('❌ Failed to generate certificate:', error);
451
- throw error;
452
- }
453
- }