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,305 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * Verify Tokenized ZIP Example
5
+ *
6
+ * Demonstrates verifying a tokenized ZIP file on the blockchain.
7
+ * This example:
8
+ * 1. Loads a tokenized ZIP file
9
+ * 2. Extracts token metadata from META-INF/NZIP.TOKEN
10
+ * 3. Calculates merkle root from ZIP contents
11
+ * 4. Verifies the token on the blockchain
12
+ * 5. Displays verification results
13
+ *
14
+ * SECURITY WARNING:
15
+ * - This example only reads blockchain data (no private keys required)
16
+ * - However, if you're verifying your own tokenized files, ensure:
17
+ * - Private keys used for minting are stored securely
18
+ * - Never commit private keys to version control
19
+ * - Use testnet for development and testing
20
+ *
21
+ * See SECURITY.md for complete security guidelines.
22
+ *
23
+ * Usage:
24
+ * ts-node examples/verify-tokenized-zip.ts [path-to-tokenized.zip]
25
+ */
26
+
27
+ import { ZipkitNode } from '../src/node';
28
+ import { ZipkitVerifier } from '../src/blockchain/core/ZipkitVerifier';
29
+ import type { TokenMetadata } from '../src/types';
30
+ import { TOKENIZED_METADATA } from '../src/core/constants/Headers';
31
+ import * as fs from 'fs';
32
+ import * as path from 'path';
33
+
34
+ async function main() {
35
+ console.log('Verify Tokenized ZIP Example\n');
36
+
37
+ // Get ZIP file path from command line argument or use default
38
+ const zipPath = process.argv[2] || path.join(__dirname, 'output', 'tokenized.zip');
39
+
40
+ if (!fs.existsSync(zipPath)) {
41
+ console.error(`❌ Error: ZIP file not found: ${zipPath}`);
42
+ console.error('\nUsage:');
43
+ console.error(' ts-node examples/verify-tokenized-zip.ts [path-to-tokenized.zip]');
44
+ console.error('\nExample:');
45
+ console.error(' ts-node examples/verify-tokenized-zip.ts examples/output/tokenized.zip');
46
+ process.exit(1);
47
+ }
48
+
49
+ console.log(`📦 ZIP file: ${zipPath}`);
50
+ const zipStats = fs.statSync(zipPath);
51
+ console.log(` Size: ${formatBytes(zipStats.size)}\n`);
52
+
53
+ try {
54
+ // Step 1: Load ZIP file
55
+ console.log('Step 1: Loading ZIP file...');
56
+ const zip = new ZipkitNode();
57
+ await zip.loadZipFile(zipPath);
58
+ console.log('✅ ZIP file loaded successfully\n');
59
+
60
+ // Step 2: Extract token metadata
61
+ console.log('Step 2: Extracting token metadata...');
62
+ const entries = zip.getDirectory();
63
+ const tokenEntry = entries.find(entry => entry.filename === TOKENIZED_METADATA);
64
+
65
+ if (!tokenEntry) {
66
+ console.error('❌ Error: Token metadata not found in ZIP file');
67
+ console.error(` Expected file: ${TOKENIZED_METADATA}`);
68
+ console.error('\n💡 This ZIP file does not appear to be tokenized.');
69
+ console.error(' Use blockchain-tokenize.ts to create a tokenized ZIP file.');
70
+ await zip.closeFile();
71
+ process.exit(1);
72
+ }
73
+
74
+ // Extract token metadata content to temporary file
75
+ const tempTokenFile = path.join(__dirname, 'output', '.token-metadata-temp.json');
76
+ const tempTokenDir = path.dirname(tempTokenFile);
77
+ if (!fs.existsSync(tempTokenDir)) {
78
+ fs.mkdirSync(tempTokenDir, { recursive: true });
79
+ }
80
+
81
+ let tokenMetadata: TokenMetadata;
82
+
83
+ try {
84
+ await zip.extractToFile(tokenEntry, tempTokenFile);
85
+ const tokenContent = fs.readFileSync(tempTokenFile, 'utf8');
86
+
87
+ // Clean up temp file
88
+ fs.unlinkSync(tempTokenFile);
89
+
90
+ try {
91
+ tokenMetadata = JSON.parse(tokenContent);
92
+ } catch (parseError) {
93
+ console.error('❌ Error: Invalid token metadata format');
94
+ console.error(' Token metadata must be valid JSON');
95
+ await zip.closeFile();
96
+ process.exit(1);
97
+ }
98
+ } catch (extractError) {
99
+ console.error('❌ Error: Could not extract token metadata');
100
+ console.error(` ${extractError instanceof Error ? extractError.message : String(extractError)}`);
101
+ // Clean up temp file if it exists
102
+ if (fs.existsSync(tempTokenFile)) {
103
+ try {
104
+ fs.unlinkSync(tempTokenFile);
105
+ } catch (unlinkError) {
106
+ // Ignore
107
+ }
108
+ }
109
+ await zip.closeFile();
110
+ process.exit(1);
111
+ }
112
+
113
+ // Validate token metadata structure
114
+ if (!tokenMetadata.tokenId || !tokenMetadata.contractAddress || !tokenMetadata.network) {
115
+ console.error('❌ Error: Invalid token metadata structure');
116
+ console.error(' Missing required fields: tokenId, contractAddress, or network');
117
+ await zip.closeFile();
118
+ process.exit(1);
119
+ }
120
+
121
+ console.log('✅ Token metadata extracted');
122
+ console.log(` Token ID: ${tokenMetadata.tokenId}`);
123
+ console.log(` Contract: ${tokenMetadata.contractAddress}`);
124
+ console.log(` Network: ${tokenMetadata.network}`);
125
+ if (tokenMetadata.transactionHash) {
126
+ console.log(` Transaction: ${tokenMetadata.transactionHash}`);
127
+ }
128
+ console.log();
129
+
130
+ // Step 3: Calculate merkle root from ZIP contents
131
+ console.log('Step 3: Calculating merkle root from ZIP contents...');
132
+
133
+ // Get merkle root (this excludes token metadata file automatically)
134
+ const merkleRoot = (zip as any).getMerkleRoot?.();
135
+
136
+ if (!merkleRoot) {
137
+ console.error('❌ Error: Could not calculate merkle root');
138
+ console.error(' Make sure the ZIP file was created with SHA-256 hashes enabled');
139
+ await zip.closeFile();
140
+ process.exit(1);
141
+ }
142
+
143
+ console.log(`✅ Merkle root calculated: ${merkleRoot}`);
144
+
145
+ // Compare with metadata merkle root if present
146
+ if (tokenMetadata.merkleRoot) {
147
+ if (tokenMetadata.merkleRoot === merkleRoot) {
148
+ console.log(' ✓ Matches merkle root in token metadata');
149
+ } else {
150
+ console.log(' ⚠️ WARNING: Does not match merkle root in token metadata!');
151
+ console.log(` Metadata: ${tokenMetadata.merkleRoot}`);
152
+ console.log(` Calculated: ${merkleRoot}`);
153
+ console.log(' This may indicate the ZIP file has been modified.');
154
+ }
155
+ }
156
+ console.log();
157
+
158
+ // Close file handle before verification
159
+ await zip.closeFile();
160
+
161
+ // Step 4: Verify token on blockchain
162
+ console.log('Step 4: Verifying token on blockchain...');
163
+ console.log(' This may take a few moments...\n');
164
+
165
+ const verifier = new ZipkitVerifier({
166
+ debug: false
167
+ });
168
+
169
+ const verificationResult = await verifier.verifyToken(
170
+ tokenMetadata,
171
+ merkleRoot,
172
+ {
173
+ debug: false,
174
+ skipHash: false
175
+ }
176
+ );
177
+
178
+ // Step 5: Display verification results
179
+ console.log('Step 5: Verification Results');
180
+ console.log('═'.repeat(80));
181
+
182
+ if (verificationResult.success) {
183
+ console.log('✅ VERIFICATION SUCCESSFUL');
184
+ console.log('═'.repeat(80));
185
+ console.log(`Token ID: ${tokenMetadata.tokenId}`);
186
+ console.log(`Contract: ${tokenMetadata.contractAddress}`);
187
+ console.log(`Network: ${tokenMetadata.network}`);
188
+
189
+ if (verificationResult.verificationDetails) {
190
+ const details = verificationResult.verificationDetails;
191
+ console.log(`\nBlockchain Data:`);
192
+ if (details.merkleRoot) {
193
+ console.log(` Merkle Root: ${details.merkleRoot}`);
194
+ }
195
+ if (details.mintDate) {
196
+ console.log(` Tokenization Time: ${details.mintDate}`);
197
+ }
198
+ if (details.onChainValid !== undefined) {
199
+ console.log(` On-Chain Valid: ${details.onChainValid ? 'Yes' : 'No'}`);
200
+ }
201
+ }
202
+
203
+ console.log(`\nMerkle Root Verification:`);
204
+ if (verificationResult.verificationDetails?.merkleRootMatch) {
205
+ console.log(' ✅ Calculated merkle root matches blockchain');
206
+ if (verificationResult.verificationDetails.calculatedMerkleRoot && verificationResult.verificationDetails.declaredMerkleRoot) {
207
+ console.log(` Calculated: ${verificationResult.verificationDetails.calculatedMerkleRoot}`);
208
+ console.log(` On-chain: ${verificationResult.verificationDetails.declaredMerkleRoot}`);
209
+ }
210
+ } else {
211
+ console.log(' ❌ Calculated merkle root does NOT match blockchain!');
212
+ if (verificationResult.errorDetails) {
213
+ if (verificationResult.errorDetails.calculatedMerkleRoot) {
214
+ console.log(` Calculated: ${verificationResult.errorDetails.calculatedMerkleRoot}`);
215
+ }
216
+ if (verificationResult.errorDetails.onChainMerkleRoot) {
217
+ console.log(` On-chain: ${verificationResult.errorDetails.onChainMerkleRoot}`);
218
+ }
219
+ }
220
+ }
221
+
222
+ if (verificationResult.verificationDetails?.onChainValid) {
223
+ console.log('\n✅ Token is valid and verified on blockchain');
224
+ }
225
+
226
+ // Display explorer link
227
+ const networkName = tokenMetadata.network.toLowerCase();
228
+ let explorerUrl = '';
229
+
230
+ if (networkName.includes('base') && networkName.includes('sepolia')) {
231
+ explorerUrl = `https://sepolia.basescan.org/token/${tokenMetadata.contractAddress}?a=${tokenMetadata.tokenId}`;
232
+ } else if (networkName.includes('base')) {
233
+ explorerUrl = `https://basescan.org/token/${tokenMetadata.contractAddress}?a=${tokenMetadata.tokenId}`;
234
+ } else if (networkName.includes('arbitrum') && networkName.includes('sepolia')) {
235
+ explorerUrl = `https://sepolia.arbiscan.io/token/${tokenMetadata.contractAddress}?a=${tokenMetadata.tokenId}`;
236
+ } else if (networkName.includes('arbitrum')) {
237
+ explorerUrl = `https://arbiscan.io/token/${tokenMetadata.contractAddress}?a=${tokenMetadata.tokenId}`;
238
+ } else if (networkName.includes('sepolia')) {
239
+ explorerUrl = `https://sepolia.etherscan.io/token/${tokenMetadata.contractAddress}?a=${tokenMetadata.tokenId}`;
240
+ } else if (networkName.includes('ethereum')) {
241
+ explorerUrl = `https://etherscan.io/token/${tokenMetadata.contractAddress}?a=${tokenMetadata.tokenId}`;
242
+ }
243
+
244
+ if (explorerUrl) {
245
+ console.log(`\n📄 View token on explorer:`);
246
+ console.log(` ${explorerUrl}`);
247
+ }
248
+
249
+ } else {
250
+ console.log('❌ VERIFICATION FAILED');
251
+ console.log('═'.repeat(80));
252
+ console.log(`Error: ${verificationResult.message}`);
253
+
254
+ if (verificationResult.errorDetails) {
255
+ console.log(`\nError Details:`);
256
+ console.log(` Type: ${verificationResult.errorDetails.errorType || 'UNKNOWN'}`);
257
+ if (verificationResult.errorDetails.networkName) {
258
+ console.log(` Network: ${verificationResult.errorDetails.networkName}`);
259
+ }
260
+ if (verificationResult.errorDetails.rpcUrl) {
261
+ console.log(` RPC URL: ${verificationResult.errorDetails.rpcUrl}`);
262
+ }
263
+ }
264
+
265
+ console.log('\n💡 Possible causes:');
266
+ console.log(' - Token does not exist on blockchain');
267
+ console.log(' - Merkle root mismatch (ZIP file may have been modified)');
268
+ console.log(' - Network connectivity issues');
269
+ console.log(' - Invalid contract address or network');
270
+ }
271
+
272
+ console.log('═'.repeat(80));
273
+ console.log();
274
+
275
+ // Exit with appropriate code
276
+ process.exit(verificationResult.success ? 0 : 1);
277
+
278
+ } catch (error) {
279
+ console.error('❌ Error during verification:');
280
+ console.error(error instanceof Error ? error.message : String(error));
281
+ if (error instanceof Error && error.stack) {
282
+ console.error('\nStack trace:');
283
+ console.error(error.stack);
284
+ }
285
+ process.exit(1);
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Format bytes to human-readable string
291
+ */
292
+ function formatBytes(bytes: number): string {
293
+ if (bytes === 0) return '0 B';
294
+ const k = 1024;
295
+ const sizes = ['B', 'KB', 'MB', 'GB'];
296
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
297
+ return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];
298
+ }
299
+
300
+ // Run the example
301
+ main().catch((error) => {
302
+ console.error('Fatal error:', error);
303
+ process.exit(1);
304
+ });
305
+