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
@@ -1,470 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- /**
4
- * ZipKitMinter - Handles NFT token minting for ZIP files
5
- * Minter API for NZIP-NFT smart contract.
6
- */
7
-
8
- import { ethers } from 'ethers';
9
- import { NZIP_CONTRACT_ABI, CONTRACT_CONFIGS } from './contracts';
10
- import type { TokenMetadata } from './types';
11
-
12
- // Network configurations
13
- const NETWORK_CONFIGS = {
14
- 'base-sepolia': {
15
- name: 'Base Sepolia',
16
- rpcUrl: 'https://sepolia.base.org',
17
- contractAddress: CONTRACT_CONFIGS[84532].address, // Use real contract address
18
- explorerUrl: 'https://sepolia.basescan.org',
19
- chainId: 84532
20
- },
21
- 'base-mainnet': {
22
- name: 'Base Mainnet',
23
- rpcUrl: 'https://mainnet.base.org',
24
- contractAddress: CONTRACT_CONFIGS[8453].address, // Use real contract address
25
- explorerUrl: 'https://basescan.org',
26
- chainId: 8453
27
- }
28
- };
29
-
30
- export interface MintingOptions {
31
- walletPrivateKey: string;
32
- network: string;
33
- verbose?: boolean;
34
- debug?: boolean;
35
- }
36
-
37
- export interface MintingResult {
38
- success: boolean;
39
- message: string;
40
- tokenId?: string;
41
- transactionHash?: string;
42
- contractAddress?: string;
43
- blockNumber?: number;
44
- walletAddress?: string;
45
- gasUsed?: string;
46
- gasCost?: string;
47
- }
48
-
49
- export interface TokenInfo {
50
- tokenId: string;
51
- owner: string;
52
- isOwnedByUser: boolean;
53
- tokenData?: any;
54
- }
55
-
56
- export interface DuplicateCheckResult {
57
- hasExistingTokens: boolean;
58
- allTokens: TokenInfo[];
59
- userOwnedTokens: TokenInfo[];
60
- othersTokens: TokenInfo[];
61
- }
62
-
63
- export interface WalletInfo {
64
- address: string;
65
- balance: string;
66
- networkName: string;
67
- }
68
-
69
- /**
70
- * Blockchain Token Minter for ZIP files
71
- */
72
- export class ZipKitMinter {
73
- private provider: ethers.JsonRpcProvider;
74
- private wallet: ethers.Wallet;
75
- private contract: ethers.Contract;
76
- private merkleRoot: string;
77
- private archiveName: string;
78
- private networkConfig: any;
79
- private debug: boolean;
80
-
81
- constructor(archiveName: string, merkleRoot: string, options: MintingOptions) {
82
- this.archiveName = archiveName;
83
- this.merkleRoot = merkleRoot;
84
- this.debug = options.debug || false;
85
-
86
- // Get network configuration
87
- this.networkConfig = NETWORK_CONFIGS[options.network as keyof typeof NETWORK_CONFIGS];
88
- if (!this.networkConfig) {
89
- throw new Error(`Unsupported network: ${options.network}`);
90
- }
91
-
92
- // Initialize provider for the specified network
93
- this.provider = new ethers.JsonRpcProvider(this.networkConfig.rpcUrl);
94
-
95
- // Initialize wallet from private key
96
- this.wallet = new ethers.Wallet(options.walletPrivateKey, this.provider);
97
-
98
- // Initialize contract instance
99
- this.contract = new ethers.Contract(
100
- this.networkConfig.contractAddress,
101
- NZIP_CONTRACT_ABI,
102
- this.wallet
103
- );
104
-
105
- if (this.debug) {
106
- console.log(`[DEBUG] ZipKitMinter initialized for ${this.networkConfig.name}`);
107
- console.log(`[DEBUG] Archive: ${archiveName}, Merkle: ${merkleRoot.substring(0, 10)}...`);
108
- }
109
- }
110
-
111
- /**
112
- * Get wallet information
113
- */
114
- async getWalletInfo(): Promise<WalletInfo> {
115
- const balance = await this.provider.getBalance(this.wallet.address);
116
- const balanceInEth = ethers.formatEther(balance);
117
-
118
- if (this.debug) {
119
- console.log(`[DEBUG] Wallet ${this.wallet.address} balance: ${balanceInEth} ETH`);
120
- }
121
-
122
- return {
123
- address: this.wallet.address,
124
- balance: balanceInEth,
125
- networkName: this.networkConfig.name
126
- };
127
- }
128
-
129
- /**
130
- * Check for existing tokens with same merkle root and verify ownership
131
- */
132
- async checkForDuplicates(): Promise<DuplicateCheckResult> {
133
- try {
134
- if (this.debug) {
135
- console.log(`[DEBUG] Checking for existing tokens with merkle root: ${this.merkleRoot}`);
136
- console.log(`[DEBUG] User wallet address: ${this.wallet.address}`);
137
- }
138
-
139
- // Call contract method to check if merkle root already exists
140
- const existingTokenIds = await this.contract.getTokensByMerkleRoot(this.merkleRoot);
141
-
142
- if (!existingTokenIds || existingTokenIds.length === 0) {
143
- if (this.debug) {
144
- console.log(`[DEBUG] No existing tokens found for this merkle root`);
145
- }
146
- return {
147
- hasExistingTokens: false,
148
- allTokens: [],
149
- userOwnedTokens: [],
150
- othersTokens: []
151
- };
152
- }
153
-
154
- if (this.debug) {
155
- console.log(`[DEBUG] Found ${existingTokenIds.length} existing token(s)`);
156
- }
157
-
158
- // Check ownership and get token details for each token
159
- const allTokens: TokenInfo[] = [];
160
- const userOwnedTokens: TokenInfo[] = [];
161
- const othersTokens: TokenInfo[] = [];
162
-
163
- for (const tokenId of existingTokenIds) {
164
- const tokenIdStr = tokenId.toString();
165
-
166
- try {
167
- // Get token owner
168
- const owner = await this.contract.ownerOf(tokenId);
169
- const isOwnedByUser = owner.toLowerCase() === this.wallet.address.toLowerCase();
170
-
171
- // Get token data
172
- let tokenData = null;
173
- try {
174
- tokenData = await this.contract.getZipFileInfo(tokenId);
175
- } catch (e) {
176
- if (this.debug) {
177
- console.log(`[DEBUG] Could not get token data for ${tokenIdStr}: ${e}`);
178
- }
179
- }
180
-
181
- const tokenInfo: TokenInfo = {
182
- tokenId: tokenIdStr,
183
- owner: owner,
184
- isOwnedByUser: isOwnedByUser,
185
- tokenData: tokenData
186
- };
187
-
188
- allTokens.push(tokenInfo);
189
-
190
- if (isOwnedByUser) {
191
- userOwnedTokens.push(tokenInfo);
192
- if (this.debug) {
193
- console.log(`[DEBUG] Token ${tokenIdStr} is owned by user`);
194
- }
195
- } else {
196
- othersTokens.push(tokenInfo);
197
- if (this.debug) {
198
- console.log(`[DEBUG] Token ${tokenIdStr} is owned by ${owner}`);
199
- }
200
- }
201
-
202
- } catch (e) {
203
- if (this.debug) {
204
- console.log(`[DEBUG] Error checking ownership for token ${tokenIdStr}: ${e}`);
205
- }
206
- }
207
- }
208
-
209
- return {
210
- hasExistingTokens: true,
211
- allTokens,
212
- userOwnedTokens,
213
- othersTokens
214
- };
215
-
216
- } catch (error) {
217
- if (this.debug) {
218
- console.log(`[DEBUG] Error checking duplicates: ${error instanceof Error ? error.message : 'Unknown error'}`);
219
- }
220
-
221
- // If the contract method doesn't exist or fails, assume no duplicates
222
- return {
223
- hasExistingTokens: false,
224
- allTokens: [],
225
- userOwnedTokens: [],
226
- othersTokens: []
227
- };
228
- }
229
- }
230
-
231
- /**
232
- * Estimate gas costs for minting
233
- */
234
- async estimateGasCosts(): Promise<{ gasLimit: bigint; gasPrice: bigint; estimatedCost: string }> {
235
- const creationTimestamp = Math.floor(Date.now() / 1000);
236
- const metadata = this.createTokenMetadataString();
237
-
238
- // Estimate gas for the minting transaction
239
- const gasLimit = await this.contract.publicMintZipFile.estimateGas(
240
- this.archiveName,
241
- this.merkleRoot,
242
- creationTimestamp,
243
- '', // ipfsHash
244
- metadata
245
- );
246
-
247
- const feeData = await this.provider.getFeeData();
248
- const gasPrice = feeData.gasPrice || BigInt(0);
249
- const estimatedCost = ethers.formatEther(gasLimit * gasPrice);
250
-
251
- if (this.debug) {
252
- console.log(`[DEBUG] Gas estimate - Limit: ${gasLimit}, Price: ${gasPrice}, Cost: ${estimatedCost} ETH`);
253
- }
254
-
255
- return { gasLimit, gasPrice, estimatedCost };
256
- }
257
-
258
- /**
259
- * Create token metadata string
260
- */
261
- private createTokenMetadataString(): string {
262
- const now = new Date();
263
- return JSON.stringify({
264
- name: `NeoZip Archive: ${this.archiveName}`,
265
- description: `Tokenized ZIP archive with cryptographic proof of integrity`,
266
- image: '', // Could be a thumbnail or icon
267
- archiveName: this.archiveName,
268
- merkleRoot: this.merkleRoot,
269
- network: this.networkConfig.name,
270
- createdAt: now.toISOString(),
271
- timestamp: Math.floor(now.getTime() / 1000)
272
- });
273
- }
274
-
275
- /**
276
- * Create TokenMetadata object from minting result
277
- */
278
- private createTokenMetadata(tokenId: string, transactionHash: string, blockNumber?: number): TokenMetadata {
279
- const now = new Date();
280
-
281
- return {
282
- tokenId,
283
- network: this.networkConfig.name,
284
- contractAddress: this.networkConfig.contractAddress,
285
- merkleRoot: this.merkleRoot,
286
- mintDate: now.toLocaleDateString('en-US') + ' at ' + now.toLocaleTimeString('en-US'),
287
- creationTimestamp: Math.floor(now.getTime() / 1000),
288
- archiveName: this.archiveName,
289
- transactionHash,
290
- blockNumber
291
- };
292
- }
293
-
294
- /**
295
- * Mint new token on blockchain
296
- */
297
- async mintToken(): Promise<MintingResult> {
298
- try {
299
- if (this.debug) {
300
- console.log(`[DEBUG] Starting token minting process`);
301
- }
302
-
303
- // Generate token ID (could be random or sequential)
304
- const tokenId = Math.floor(Math.random() * 1000000).toString();
305
- const metadata = this.createTokenMetadataString();
306
- const creationTimestamp = Math.floor(Date.now() / 1000);
307
-
308
- if (this.debug) {
309
- console.log(`[DEBUG] Generated token ID: ${tokenId}`);
310
- console.log(`[DEBUG] Metadata: ${metadata.substring(0, 100)}...`);
311
- }
312
-
313
- // Call the contract publicMintZipFile function
314
- const tx = await this.contract.publicMintZipFile(
315
- this.archiveName,
316
- this.merkleRoot,
317
- creationTimestamp,
318
- '', // ipfsHash (empty since we store in ZIP)
319
- metadata
320
- );
321
-
322
- if (this.debug) {
323
- console.log(`[DEBUG] Transaction submitted: ${tx.hash}`);
324
- }
325
-
326
- // Wait for transaction confirmation
327
- const receipt = await tx.wait();
328
-
329
- if (this.debug) {
330
- console.log(`[DEBUG] Transaction confirmed in block: ${receipt.blockNumber}`);
331
- console.log(`[DEBUG] Gas used: ${receipt.gasUsed}`);
332
- }
333
-
334
- // Extract actual token ID from contract events
335
- let actualTokenId = tokenId; // fallback
336
-
337
- if (receipt.logs && receipt.logs.length > 0) {
338
- try {
339
- const iface = new ethers.Interface(NZIP_CONTRACT_ABI);
340
- for (const log of receipt.logs) {
341
- try {
342
- const parsed = iface.parseLog(log);
343
- if (parsed?.name === 'ZipFileTokenized') {
344
- actualTokenId = parsed.args.tokenId.toString();
345
- if (this.debug) {
346
- console.log(`[DEBUG] Actual token ID from contract event: ${actualTokenId}`);
347
- }
348
- break;
349
- }
350
- } catch (e) {
351
- // Ignore parsing errors for non-matching logs
352
- }
353
- }
354
- } catch (e) {
355
- if (this.debug) {
356
- console.log(`[DEBUG] Could not parse token ID from logs: ${e}`);
357
- }
358
- }
359
- }
360
-
361
- const gasCost = ethers.formatEther(receipt.gasUsed * (receipt.gasPrice || BigInt(0)));
362
-
363
- return {
364
- success: true,
365
- message: `Token successfully minted`,
366
- tokenId: actualTokenId,
367
- transactionHash: tx.hash,
368
- contractAddress: this.networkConfig.contractAddress,
369
- blockNumber: receipt.blockNumber,
370
- walletAddress: this.wallet.address,
371
- gasUsed: receipt.gasUsed.toString(),
372
- gasCost
373
- };
374
-
375
- } catch (error) {
376
- const errorMessage = error instanceof Error ? error.message : 'Unknown minting error';
377
-
378
- if (this.debug) {
379
- console.log(`[DEBUG] Minting failed: ${errorMessage}`);
380
- }
381
-
382
- return {
383
- success: false,
384
- message: errorMessage
385
- };
386
- }
387
- }
388
-
389
- /**
390
- * Main minting process - checks for duplicates, then mints if needed
391
- */
392
- async processMinting(): Promise<{
393
- walletInfo: WalletInfo;
394
- duplicateCheck: DuplicateCheckResult;
395
- gasCosts?: { gasLimit: bigint; gasPrice: bigint; estimatedCost: string };
396
- mintingResult?: MintingResult;
397
- tokenMetadata?: TokenMetadata;
398
- }> {
399
- try {
400
- // Get wallet information
401
- const walletInfo = await this.getWalletInfo();
402
-
403
- // Check for duplicates first (free operation)
404
- const duplicateCheck = await this.checkForDuplicates();
405
-
406
- if (duplicateCheck.hasExistingTokens) {
407
- if (this.debug) {
408
- console.log(`[DEBUG] Existing tokens found, user will choose`);
409
- }
410
-
411
- return {
412
- walletInfo,
413
- duplicateCheck
414
- };
415
- }
416
-
417
- // Estimate gas costs
418
- const gasCosts = await this.estimateGasCosts();
419
-
420
- // This is where the user would be prompted for confirmation in the calling code
421
- // The actual minting happens in a separate call to mintToken()
422
-
423
- return {
424
- walletInfo,
425
- duplicateCheck,
426
- gasCosts
427
- };
428
-
429
- } catch (error) {
430
- throw new Error(`Minting process failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
431
- }
432
- }
433
-
434
- /**
435
- * Complete the minting after user confirmation
436
- */
437
- async completeMinting(): Promise<{
438
- mintingResult: MintingResult;
439
- tokenMetadata?: TokenMetadata;
440
- }> {
441
- const mintingResult = await this.mintToken();
442
-
443
- if (mintingResult.success && mintingResult.tokenId && mintingResult.transactionHash) {
444
- const tokenMetadata = this.createTokenMetadata(
445
- mintingResult.tokenId,
446
- mintingResult.transactionHash,
447
- mintingResult.blockNumber
448
- );
449
-
450
- return {
451
- mintingResult,
452
- tokenMetadata
453
- };
454
- }
455
-
456
- return { mintingResult };
457
- }
458
- }
459
-
460
- /**
461
- * Utility function to validate Ethereum private key
462
- */
463
- export function validatePrivateKey(privateKey: string): boolean {
464
- try {
465
- new ethers.Wallet(privateKey);
466
- return true;
467
- } catch {
468
- return false;
469
- }
470
- }
@@ -1,12 +0,0 @@
1
- // Re-export NFT classes and types without aliases
2
- export { ZipKitMinter, ZipKitVerifier } from '.';
3
- export type {
4
- MintingOptions,
5
- MintingResult,
6
- DuplicateCheckResult,
7
- TokenInfo,
8
- WalletInfo,
9
- VerificationOptions,
10
- VerificationResult,
11
- } from '.';
12
- export type { TokenMetadata } from './types';