neozip-blockchain 0.5.1

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 (127) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +189 -0
  3. package/dist/browser/TokenVerifierBrowser.d.ts +63 -0
  4. package/dist/browser/TokenVerifierBrowser.d.ts.map +1 -0
  5. package/dist/browser/TokenVerifierBrowser.js +358 -0
  6. package/dist/browser/TokenVerifierBrowser.js.map +1 -0
  7. package/dist/browser/WalletManagerBrowser.d.ts +99 -0
  8. package/dist/browser/WalletManagerBrowser.d.ts.map +1 -0
  9. package/dist/browser/WalletManagerBrowser.js +434 -0
  10. package/dist/browser/WalletManagerBrowser.js.map +1 -0
  11. package/dist/browser/ZipkitMinterBrowser.d.ts +59 -0
  12. package/dist/browser/ZipkitMinterBrowser.d.ts.map +1 -0
  13. package/dist/browser/ZipkitMinterBrowser.js +337 -0
  14. package/dist/browser/ZipkitMinterBrowser.js.map +1 -0
  15. package/dist/browser/index.d.ts +12 -0
  16. package/dist/browser/index.d.ts.map +1 -0
  17. package/dist/browser/index.js +19 -0
  18. package/dist/browser/index.js.map +1 -0
  19. package/dist/constants/index.d.ts +5 -0
  20. package/dist/constants/index.d.ts.map +1 -0
  21. package/dist/constants/index.js +21 -0
  22. package/dist/constants/index.js.map +1 -0
  23. package/dist/constants/metadata.d.ts +18 -0
  24. package/dist/constants/metadata.d.ts.map +1 -0
  25. package/dist/constants/metadata.js +33 -0
  26. package/dist/constants/metadata.js.map +1 -0
  27. package/dist/constants/servers.d.ts +38 -0
  28. package/dist/constants/servers.d.ts.map +1 -0
  29. package/dist/constants/servers.js +54 -0
  30. package/dist/constants/servers.js.map +1 -0
  31. package/dist/core/ContractVersionRegistry.d.ts +63 -0
  32. package/dist/core/ContractVersionRegistry.d.ts.map +1 -0
  33. package/dist/core/ContractVersionRegistry.js +128 -0
  34. package/dist/core/ContractVersionRegistry.js.map +1 -0
  35. package/dist/core/WalletManager.d.ts +123 -0
  36. package/dist/core/WalletManager.d.ts.map +1 -0
  37. package/dist/core/WalletManager.js +360 -0
  38. package/dist/core/WalletManager.js.map +1 -0
  39. package/dist/core/ZipkitMinter.d.ts +155 -0
  40. package/dist/core/ZipkitMinter.d.ts.map +1 -0
  41. package/dist/core/ZipkitMinter.js +625 -0
  42. package/dist/core/ZipkitMinter.js.map +1 -0
  43. package/dist/core/ZipkitVerifier.d.ts +252 -0
  44. package/dist/core/ZipkitVerifier.d.ts.map +1 -0
  45. package/dist/core/ZipkitVerifier.js +1370 -0
  46. package/dist/core/ZipkitVerifier.js.map +1 -0
  47. package/dist/core/adapters/AdapterFactory.d.ts +22 -0
  48. package/dist/core/adapters/AdapterFactory.d.ts.map +1 -0
  49. package/dist/core/adapters/AdapterFactory.js +62 -0
  50. package/dist/core/adapters/AdapterFactory.js.map +1 -0
  51. package/dist/core/adapters/ContractVersionAdapter.d.ts +96 -0
  52. package/dist/core/adapters/ContractVersionAdapter.d.ts.map +1 -0
  53. package/dist/core/adapters/ContractVersionAdapter.js +9 -0
  54. package/dist/core/adapters/ContractVersionAdapter.js.map +1 -0
  55. package/dist/core/adapters/V2_10Adapter.d.ts +24 -0
  56. package/dist/core/adapters/V2_10Adapter.d.ts.map +1 -0
  57. package/dist/core/adapters/V2_10Adapter.js +87 -0
  58. package/dist/core/adapters/V2_10Adapter.js.map +1 -0
  59. package/dist/core/adapters/V2_11Adapter.d.ts +24 -0
  60. package/dist/core/adapters/V2_11Adapter.d.ts.map +1 -0
  61. package/dist/core/adapters/V2_11Adapter.js +87 -0
  62. package/dist/core/adapters/V2_11Adapter.js.map +1 -0
  63. package/dist/core/adapters/V2_50Adapter.d.ts +105 -0
  64. package/dist/core/adapters/V2_50Adapter.d.ts.map +1 -0
  65. package/dist/core/adapters/V2_50Adapter.js +263 -0
  66. package/dist/core/adapters/V2_50Adapter.js.map +1 -0
  67. package/dist/core/contracts.d.ts +169 -0
  68. package/dist/core/contracts.d.ts.map +1 -0
  69. package/dist/core/contracts.js +731 -0
  70. package/dist/core/contracts.js.map +1 -0
  71. package/dist/core/index.d.ts +24 -0
  72. package/dist/core/index.d.ts.map +1 -0
  73. package/dist/core/index.js +82 -0
  74. package/dist/core/index.js.map +1 -0
  75. package/dist/index.d.ts +15 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +40 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/node/WalletManagerNode.d.ts +47 -0
  80. package/dist/node/WalletManagerNode.d.ts.map +1 -0
  81. package/dist/node/WalletManagerNode.js +203 -0
  82. package/dist/node/WalletManagerNode.js.map +1 -0
  83. package/dist/node/index.d.ts +12 -0
  84. package/dist/node/index.d.ts.map +1 -0
  85. package/dist/node/index.js +21 -0
  86. package/dist/node/index.js.map +1 -0
  87. package/dist/ots/ZipkitOTS.d.ts +152 -0
  88. package/dist/ots/ZipkitOTS.d.ts.map +1 -0
  89. package/dist/ots/ZipkitOTS.js +544 -0
  90. package/dist/ots/ZipkitOTS.js.map +1 -0
  91. package/dist/ots/index.d.ts +9 -0
  92. package/dist/ots/index.d.ts.map +1 -0
  93. package/dist/ots/index.js +25 -0
  94. package/dist/ots/index.js.map +1 -0
  95. package/dist/types/index.d.ts +84 -0
  96. package/dist/types/index.d.ts.map +1 -0
  97. package/dist/types/index.js +37 -0
  98. package/dist/types/index.js.map +1 -0
  99. package/dist/utils/Logger.d.ts +73 -0
  100. package/dist/utils/Logger.d.ts.map +1 -0
  101. package/dist/utils/Logger.js +156 -0
  102. package/dist/utils/Logger.js.map +1 -0
  103. package/dist/utils/crc32.d.ts +6 -0
  104. package/dist/utils/crc32.d.ts.map +1 -0
  105. package/dist/utils/crc32.js +23 -0
  106. package/dist/utils/crc32.js.map +1 -0
  107. package/dist/zipstamp-server/CalendarManager.d.ts +238 -0
  108. package/dist/zipstamp-server/CalendarManager.d.ts.map +1 -0
  109. package/dist/zipstamp-server/CalendarManager.js +364 -0
  110. package/dist/zipstamp-server/CalendarManager.js.map +1 -0
  111. package/dist/zipstamp-server/ZipstampServerAPI.d.ts +427 -0
  112. package/dist/zipstamp-server/ZipstampServerAPI.d.ts.map +1 -0
  113. package/dist/zipstamp-server/ZipstampServerAPI.js +696 -0
  114. package/dist/zipstamp-server/ZipstampServerAPI.js.map +1 -0
  115. package/dist/zipstamp-server/ZipstampServerClient.d.ts +590 -0
  116. package/dist/zipstamp-server/ZipstampServerClient.d.ts.map +1 -0
  117. package/dist/zipstamp-server/ZipstampServerClient.js +433 -0
  118. package/dist/zipstamp-server/ZipstampServerClient.js.map +1 -0
  119. package/dist/zipstamp-server/ZipstampServerHelpers.d.ts +430 -0
  120. package/dist/zipstamp-server/ZipstampServerHelpers.d.ts.map +1 -0
  121. package/dist/zipstamp-server/ZipstampServerHelpers.js +503 -0
  122. package/dist/zipstamp-server/ZipstampServerHelpers.js.map +1 -0
  123. package/dist/zipstamp-server/index.d.ts +24 -0
  124. package/dist/zipstamp-server/index.d.ts.map +1 -0
  125. package/dist/zipstamp-server/index.js +67 -0
  126. package/dist/zipstamp-server/index.js.map +1 -0
  127. package/package.json +117 -0
@@ -0,0 +1,625 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ /**
4
+ * ZipkitMinter - Handles NFT token minting for ZIP files
5
+ * Minter API for NZIP-NFT smart contract.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.ZipkitMinter = void 0;
9
+ exports.validatePrivateKey = validatePrivateKey;
10
+ const ethers_1 = require("ethers");
11
+ const contracts_1 = require("./contracts");
12
+ /**
13
+ * Blockchain Token Minter for ZIP files
14
+ *
15
+ * SECURITY WARNING: This class handles private keys for blockchain operations.
16
+ * - Never hardcode private keys in source code
17
+ * - Always use environment variables for private keys (e.g., NEOZIP_WALLET_PASSKEY)
18
+ * - Use testnet keys for development/testing
19
+ * - Use secure key management (HSMs, KMS) for production
20
+ */
21
+ class ZipkitMinter {
22
+ constructor(merkleRoot, options) {
23
+ this.merkleRoot = merkleRoot;
24
+ this.encryptedHash = options.encryptedHash || '';
25
+ this.debug = options.debug || false;
26
+ this.rpcUrlIndex = options.rpcUrlIndex ?? 0;
27
+ // Get chain ID from network name using contracts.ts (single source of truth)
28
+ const chainId = (0, contracts_1.getChainIdByName)(options.network);
29
+ if (!chainId) {
30
+ const supported = (0, contracts_1.getSupportedNetworkNames)().join(', ');
31
+ throw new Error(`Unsupported network: ${options.network}. Supported networks: ${supported}`);
32
+ }
33
+ // Get network configuration from contracts.ts
34
+ this.networkConfig = (0, contracts_1.getContractConfig)(chainId);
35
+ if (this.networkConfig.rpcUrls.length === 0) {
36
+ throw new Error(`No RPC URLs configured for network: ${options.network} (chainId: ${chainId})`);
37
+ }
38
+ // Validate RPC URL index
39
+ if (this.rpcUrlIndex < 0 || this.rpcUrlIndex >= this.networkConfig.rpcUrls.length) {
40
+ throw new Error(`RPC URL index ${this.rpcUrlIndex} is out of range. Available RPCs: ${this.networkConfig.rpcUrls.length}`);
41
+ }
42
+ // Use specified RPC URL index
43
+ const rpcUrl = this.networkConfig.rpcUrls[this.rpcUrlIndex];
44
+ this.provider = new ethers_1.ethers.JsonRpcProvider(rpcUrl);
45
+ if (this.debug) {
46
+ console.log(`[DEBUG] Using RPC URL index ${this.rpcUrlIndex}: ${rpcUrl}`);
47
+ console.log(`[DEBUG] Available RPC URLs: ${this.networkConfig.rpcUrls.length}`);
48
+ }
49
+ // Initialize wallet from private key
50
+ // SECURITY: Private key should come from environment variable, never hardcoded
51
+ this.wallet = new ethers_1.ethers.Wallet(options.walletPrivateKey, this.provider);
52
+ // Initialize contract instance
53
+ this.contract = new ethers_1.ethers.Contract(this.networkConfig.address, contracts_1.NZIP_CONTRACT_ABI, this.wallet);
54
+ if (this.debug) {
55
+ console.log(`[DEBUG] ZipkitMinter initialized for ${this.networkConfig.network}`);
56
+ console.log(`[DEBUG] Chain ID: ${this.networkConfig.chainId}`);
57
+ console.log(`[DEBUG] Contract Address: ${this.networkConfig.address}`);
58
+ console.log(`[DEBUG] Merkle Root: ${merkleRoot.substring(0, 10)}...`);
59
+ }
60
+ }
61
+ /**
62
+ * Get wallet information
63
+ */
64
+ async getWalletInfo() {
65
+ const balance = await this.provider.getBalance(this.wallet.address);
66
+ const balanceInEth = ethers_1.ethers.formatEther(balance);
67
+ if (this.debug) {
68
+ console.log(`[DEBUG] Wallet ${this.wallet.address} balance: ${balanceInEth} ETH`);
69
+ }
70
+ return {
71
+ address: this.wallet.address,
72
+ balance: balanceInEth,
73
+ networkName: this.networkConfig.network,
74
+ chainId: this.networkConfig.chainId
75
+ };
76
+ }
77
+ /**
78
+ * Check for existing tokens with same merkle root and verify ownership
79
+ */
80
+ async checkForDuplicates() {
81
+ try {
82
+ if (this.debug) {
83
+ console.log(`[DEBUG] Checking for existing tokens with merkle root: ${this.merkleRoot}`);
84
+ console.log(`[DEBUG] User wallet address: ${this.wallet.address}`);
85
+ }
86
+ // Call contract method to check if merkle root already exists
87
+ const existingTokenIds = await this.contract.getTokensByMerkleRoot(this.merkleRoot);
88
+ if (!existingTokenIds || existingTokenIds.length === 0) {
89
+ if (this.debug) {
90
+ console.log(`[DEBUG] No existing tokens found for this merkle root`);
91
+ }
92
+ return {
93
+ hasExistingTokens: false,
94
+ allTokens: [],
95
+ userOwnedTokens: [],
96
+ othersTokens: []
97
+ };
98
+ }
99
+ if (this.debug) {
100
+ console.log(`[DEBUG] Found ${existingTokenIds.length} existing token(s)`);
101
+ }
102
+ // Check ownership and get token details for each token
103
+ const allTokens = [];
104
+ const userOwnedTokens = [];
105
+ const othersTokens = [];
106
+ for (const tokenId of existingTokenIds) {
107
+ const tokenIdStr = tokenId.toString();
108
+ try {
109
+ // Get token owner
110
+ const owner = await this.contract.ownerOf(tokenId);
111
+ const isOwnedByUser = owner.toLowerCase() === this.wallet.address.toLowerCase();
112
+ // Get token data
113
+ let tokenData = null;
114
+ try {
115
+ tokenData = await this.contract.getZipFileInfo(tokenId);
116
+ }
117
+ catch (e) {
118
+ if (this.debug) {
119
+ console.log(`[DEBUG] Could not get token data for ${tokenIdStr}: ${e}`);
120
+ }
121
+ }
122
+ const tokenInfo = {
123
+ tokenId: tokenIdStr,
124
+ owner: owner,
125
+ isOwnedByUser: isOwnedByUser,
126
+ tokenData: tokenData
127
+ };
128
+ allTokens.push(tokenInfo);
129
+ if (isOwnedByUser) {
130
+ userOwnedTokens.push(tokenInfo);
131
+ if (this.debug) {
132
+ console.log(`[DEBUG] Token ${tokenIdStr} is owned by user`);
133
+ }
134
+ }
135
+ else {
136
+ othersTokens.push(tokenInfo);
137
+ if (this.debug) {
138
+ console.log(`[DEBUG] Token ${tokenIdStr} is owned by ${owner}`);
139
+ }
140
+ }
141
+ }
142
+ catch (e) {
143
+ if (this.debug) {
144
+ console.log(`[DEBUG] Error checking ownership for token ${tokenIdStr}: ${e}`);
145
+ }
146
+ }
147
+ }
148
+ return {
149
+ hasExistingTokens: true,
150
+ allTokens,
151
+ userOwnedTokens,
152
+ othersTokens
153
+ };
154
+ }
155
+ catch (error) {
156
+ if (this.debug) {
157
+ console.log(`[DEBUG] Error checking duplicates: ${error instanceof Error ? error.message : 'Unknown error'}`);
158
+ }
159
+ // If the contract method doesn't exist or fails, assume no duplicates
160
+ return {
161
+ hasExistingTokens: false,
162
+ allTokens: [],
163
+ userOwnedTokens: [],
164
+ othersTokens: []
165
+ };
166
+ }
167
+ }
168
+ /**
169
+ * Estimate gas costs for minting
170
+ */
171
+ async estimateGasCosts() {
172
+ const creationTimestamp = Math.floor(Date.now() / 1000);
173
+ const metadata = this.createTokenMetadataString();
174
+ // Get adapter for this contract version
175
+ const adapter = (0, contracts_1.getContractAdapter)(this.networkConfig.chainId);
176
+ // Use adapter to estimate gas (handles version-specific signatures)
177
+ const gasLimit = await adapter.estimateGasForMint(this.contract, this.merkleRoot, this.encryptedHash || undefined, creationTimestamp, '', // ipfsHash
178
+ metadata);
179
+ const feeData = await this.provider.getFeeData();
180
+ const gasPrice = feeData.gasPrice || BigInt(0);
181
+ const estimatedCost = ethers_1.ethers.formatEther(gasLimit * gasPrice);
182
+ if (this.debug) {
183
+ console.log(`[DEBUG] Gas estimate - Limit: ${gasLimit}, Price: ${gasPrice}, Cost: ${estimatedCost} ETH`);
184
+ }
185
+ return { gasLimit, gasPrice, estimatedCost };
186
+ }
187
+ /**
188
+ * Create token metadata string
189
+ */
190
+ createTokenMetadataString() {
191
+ const now = new Date();
192
+ return JSON.stringify({
193
+ name: `NeoZip Archive`,
194
+ description: `Tokenized ZIP archive with cryptographic proof of integrity`,
195
+ image: '', // Could be a thumbnail or icon
196
+ merkleRoot: this.merkleRoot,
197
+ network: this.networkConfig.network,
198
+ createdAt: now.toISOString(),
199
+ timestamp: Math.floor(now.getTime() / 1000)
200
+ });
201
+ }
202
+ /**
203
+ * Create TokenMetadata object from minting result
204
+ */
205
+ createTokenMetadata(tokenId, transactionHash, blockNumber) {
206
+ const now = new Date();
207
+ // Ensure contractVersion is always set (required field)
208
+ if (!this.networkConfig.version) {
209
+ throw new Error(`Contract version not specified for network ${this.networkConfig.network} (chainId: ${this.networkConfig.chainId})`);
210
+ }
211
+ return {
212
+ tokenId,
213
+ network: this.networkConfig.network,
214
+ networkChainId: this.networkConfig.chainId,
215
+ contractAddress: this.networkConfig.address,
216
+ merkleRoot: this.merkleRoot,
217
+ encryptedHash: this.encryptedHash || undefined, // Include encrypted hash if present (v2.11+)
218
+ mintDate: now.toLocaleDateString('en-US') + ' at ' + now.toLocaleTimeString('en-US'),
219
+ creationTimestamp: Math.floor(now.getTime() / 1000),
220
+ transactionHash,
221
+ blockNumber,
222
+ contractVersion: this.networkConfig.version // Required - always set from networkConfig
223
+ };
224
+ }
225
+ /**
226
+ * Mint new token on blockchain
227
+ */
228
+ async mintToken() {
229
+ try {
230
+ if (this.debug) {
231
+ console.log(`[DEBUG] Starting token minting process`);
232
+ }
233
+ // Generate token ID (could be random or sequential)
234
+ const tokenId = Math.floor(Math.random() * 1000000).toString();
235
+ const metadata = this.createTokenMetadataString();
236
+ const creationTimestamp = Math.floor(Date.now() / 1000);
237
+ if (this.debug) {
238
+ console.log(`[DEBUG] Generated token ID: ${tokenId}`);
239
+ console.log(`[DEBUG] Metadata: ${metadata.substring(0, 100)}...`);
240
+ }
241
+ // Estimate gas first (with timeout)
242
+ if (this.debug) {
243
+ console.log(`[DEBUG] Estimating gas for transaction...`);
244
+ }
245
+ let gasLimit;
246
+ let gasPrice;
247
+ // Get adapter for this contract version
248
+ const adapter = (0, contracts_1.getContractAdapter)(this.networkConfig.chainId);
249
+ try {
250
+ // Use adapter to estimate gas (handles version-specific signatures)
251
+ const gasEstimate = await Promise.race([
252
+ adapter.estimateGasForMint(this.contract, this.merkleRoot, this.encryptedHash || undefined, creationTimestamp, '', // ipfsHash
253
+ metadata),
254
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Gas estimation timeout after 20 seconds')), 20000))
255
+ ]);
256
+ gasLimit = (gasEstimate * BigInt(120)) / BigInt(100);
257
+ // Get current gas price
258
+ const feeData = await Promise.race([
259
+ this.provider.getFeeData(),
260
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Gas price fetch timeout after 10 seconds')), 10000))
261
+ ]);
262
+ gasPrice = feeData.gasPrice || feeData.maxFeePerGas || BigInt(0);
263
+ if (gasPrice === BigInt(0)) {
264
+ throw new Error('Could not get gas price from network');
265
+ }
266
+ const estimatedCost = ethers_1.ethers.formatEther(gasLimit * gasPrice);
267
+ const balance = await this.provider.getBalance(this.wallet.address);
268
+ const balanceEth = ethers_1.ethers.formatEther(balance);
269
+ if (this.debug) {
270
+ console.log(`[DEBUG] Gas estimate: ${gasLimit.toString()}`);
271
+ console.log(`[DEBUG] Gas price: ${ethers_1.ethers.formatUnits(gasPrice, 'gwei')} gwei`);
272
+ console.log(`[DEBUG] Estimated cost: ${estimatedCost} ETH`);
273
+ console.log(`[DEBUG] Wallet balance: ${balanceEth} ETH`);
274
+ }
275
+ // Check if we have enough balance
276
+ if (balance < gasLimit * gasPrice) {
277
+ throw new Error(`Insufficient balance. Need ${estimatedCost} ETH, have ${balanceEth} ETH`);
278
+ }
279
+ }
280
+ catch (error) {
281
+ const errorMessage = error instanceof Error ? error.message : 'Gas estimation failed';
282
+ if (this.debug) {
283
+ console.log(`[DEBUG] Gas estimation failed: ${errorMessage}`);
284
+ }
285
+ throw new Error(`Gas estimation failed: ${errorMessage}`);
286
+ }
287
+ // Call the contract using adapter (handles version-specific signatures)
288
+ if (this.debug) {
289
+ console.log(`[DEBUG] Submitting transaction with gas limit: ${gasLimit.toString()}, gas price: ${ethers_1.ethers.formatUnits(gasPrice, 'gwei')} gwei`);
290
+ }
291
+ // Use adapter to mint (handles version-specific function signatures)
292
+ const tx = await Promise.race([
293
+ adapter.mintZipFile(this.contract, this.merkleRoot, this.encryptedHash || undefined, creationTimestamp, '', // ipfsHash (empty since we store in ZIP)
294
+ metadata, {
295
+ gasLimit: gasLimit,
296
+ gasPrice: gasPrice
297
+ }),
298
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Transaction submission timeout after 30 seconds')), 30000))
299
+ ]);
300
+ if (this.debug) {
301
+ console.log(`[DEBUG] Transaction submitted: ${tx.hash}`);
302
+ process.stdout.write(`[DEBUG] Waiting for confirmation (timeout: 120s)`);
303
+ }
304
+ else {
305
+ // Show waiting message for non-debug mode
306
+ process.stdout.write('⏳ Waiting for confirmation');
307
+ }
308
+ // Animated waiting dots (first dot immediately, then one every 2 seconds)
309
+ let dotCount = 0;
310
+ process.stdout.write('.'); // Show first dot immediately
311
+ dotCount++;
312
+ const dotInterval = setInterval(() => {
313
+ dotCount++;
314
+ process.stdout.write('.');
315
+ if (dotCount >= 60) { // Max 60 dots (120 seconds)
316
+ clearInterval(dotInterval);
317
+ }
318
+ }, 2000);
319
+ // Wait for transaction confirmation with timeout
320
+ let receipt;
321
+ try {
322
+ receipt = await Promise.race([
323
+ tx.wait(),
324
+ new Promise((_, reject) => setTimeout(() => reject(new Error('Transaction confirmation timeout after 120 seconds')), 120000))
325
+ ]);
326
+ clearInterval(dotInterval);
327
+ if (dotCount > 0) {
328
+ console.log(''); // New line after dots
329
+ }
330
+ }
331
+ catch (error) {
332
+ clearInterval(dotInterval);
333
+ if (dotCount > 0) {
334
+ console.log(''); // New line after dots
335
+ }
336
+ throw error;
337
+ }
338
+ if (this.debug) {
339
+ console.log(`[DEBUG] Transaction confirmed in block: ${receipt.blockNumber}`);
340
+ console.log(`[DEBUG] Gas used: ${receipt.gasUsed}`);
341
+ }
342
+ // Extract actual token ID from contract events using adapter
343
+ let actualTokenId = tokenId; // fallback
344
+ if (receipt.logs && receipt.logs.length > 0) {
345
+ try {
346
+ for (const log of receipt.logs) {
347
+ try {
348
+ // Use adapter to parse event (handles version-specific event structures)
349
+ const parsedEvent = adapter.parseZipFileTokenizedEvent({
350
+ topics: log.topics,
351
+ data: log.data
352
+ });
353
+ actualTokenId = parsedEvent.tokenId.toString();
354
+ if (this.debug) {
355
+ console.log(`[DEBUG] Actual token ID from contract event: ${actualTokenId}`);
356
+ }
357
+ break;
358
+ }
359
+ catch (e) {
360
+ // Ignore parsing errors for non-matching logs
361
+ }
362
+ }
363
+ }
364
+ catch (e) {
365
+ if (this.debug) {
366
+ console.log(`[DEBUG] Could not parse token ID from logs: ${e}`);
367
+ }
368
+ }
369
+ }
370
+ const gasCost = ethers_1.ethers.formatEther(receipt.gasUsed * (receipt.gasPrice || BigInt(0)));
371
+ return {
372
+ success: true,
373
+ message: `Token successfully minted`,
374
+ tokenId: actualTokenId,
375
+ transactionHash: tx.hash,
376
+ contractAddress: this.networkConfig.address,
377
+ blockNumber: receipt.blockNumber,
378
+ walletAddress: this.wallet.address,
379
+ gasUsed: receipt.gasUsed.toString(),
380
+ gasCost
381
+ };
382
+ }
383
+ catch (error) {
384
+ const errorMessage = error instanceof Error ? error.message : 'Unknown minting error';
385
+ if (this.debug) {
386
+ console.log(`[DEBUG] Minting failed: ${errorMessage}`);
387
+ }
388
+ return {
389
+ success: false,
390
+ message: errorMessage
391
+ };
392
+ }
393
+ }
394
+ /**
395
+ * Main minting process - checks for duplicates, then mints if needed
396
+ */
397
+ async processMinting() {
398
+ try {
399
+ // Get wallet information
400
+ const walletInfo = await this.getWalletInfo();
401
+ // Check for duplicates first (free operation)
402
+ const duplicateCheck = await this.checkForDuplicates();
403
+ if (duplicateCheck.hasExistingTokens) {
404
+ if (this.debug) {
405
+ console.log(`[DEBUG] Existing tokens found, user will choose`);
406
+ }
407
+ return {
408
+ walletInfo,
409
+ duplicateCheck
410
+ };
411
+ }
412
+ // Estimate gas costs
413
+ const gasCosts = await this.estimateGasCosts();
414
+ // This is where the user would be prompted for confirmation in the calling code
415
+ // The actual minting happens in a separate call to mintToken()
416
+ return {
417
+ walletInfo,
418
+ duplicateCheck,
419
+ gasCosts
420
+ };
421
+ }
422
+ catch (error) {
423
+ throw new Error(`Minting process failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
424
+ }
425
+ }
426
+ /**
427
+ * Complete the minting after user confirmation
428
+ */
429
+ async completeMinting() {
430
+ const mintingResult = await this.mintToken();
431
+ if (mintingResult.success && mintingResult.tokenId && mintingResult.transactionHash) {
432
+ const tokenMetadata = this.createTokenMetadata(mintingResult.tokenId, mintingResult.transactionHash, mintingResult.blockNumber);
433
+ return {
434
+ mintingResult,
435
+ tokenMetadata
436
+ };
437
+ }
438
+ return { mintingResult };
439
+ }
440
+ /**
441
+ * Switch to a different RPC URL by index
442
+ * This recreates the provider, wallet, and contract with the new RPC
443
+ */
444
+ switchRpcUrl(newIndex) {
445
+ if (newIndex < 0 || newIndex >= this.networkConfig.rpcUrls.length) {
446
+ throw new Error(`RPC URL index ${newIndex} is out of range. Available RPCs: ${this.networkConfig.rpcUrls.length}`);
447
+ }
448
+ // Destroy old provider
449
+ if (this.provider) {
450
+ try {
451
+ this.provider.destroy();
452
+ }
453
+ catch (error) {
454
+ // Ignore errors during cleanup
455
+ }
456
+ }
457
+ // Update RPC index
458
+ this.rpcUrlIndex = newIndex;
459
+ const rpcUrl = this.networkConfig.rpcUrls[this.rpcUrlIndex];
460
+ // Create new provider
461
+ this.provider = new ethers_1.ethers.JsonRpcProvider(rpcUrl);
462
+ // Recreate wallet with new provider
463
+ this.wallet = new ethers_1.ethers.Wallet(this.wallet.privateKey, this.provider);
464
+ // Recreate contract with new provider
465
+ this.contract = new ethers_1.ethers.Contract(this.networkConfig.address, contracts_1.NZIP_CONTRACT_ABI, this.wallet);
466
+ if (this.debug) {
467
+ console.log(`[DEBUG] Switched to RPC URL index ${this.rpcUrlIndex}: ${rpcUrl}`);
468
+ }
469
+ }
470
+ /**
471
+ * Destroy provider to allow process to exit
472
+ */
473
+ destroy() {
474
+ try {
475
+ if (this.provider) {
476
+ // Destroy the provider to close connections and allow process to exit
477
+ // Safe to call multiple times - ethers.js handles idempotency
478
+ this.provider.destroy();
479
+ if (this.debug) {
480
+ console.log('[DEBUG] Provider destroyed');
481
+ }
482
+ }
483
+ }
484
+ catch (error) {
485
+ if (this.debug) {
486
+ console.log(`[DEBUG] Error destroying provider: ${error instanceof Error ? error.message : String(error)}`);
487
+ }
488
+ }
489
+ }
490
+ /**
491
+ * Mint token with retry logic and exponential backoff
492
+ * @param maxRetries Maximum number of retry attempts (default: 3)
493
+ * @returns Minting result with retry information
494
+ */
495
+ async mintTokenWithRetry(maxRetries = 3) {
496
+ let lastError = null;
497
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
498
+ try {
499
+ console.log(`🔄 Minting attempt ${attempt}/${maxRetries}`);
500
+ const result = await this.mintToken();
501
+ if (result.success) {
502
+ console.log(`✅ Minting successful on attempt ${attempt}`);
503
+ return result;
504
+ }
505
+ lastError = new Error(result.message || 'Minting failed');
506
+ }
507
+ catch (error) {
508
+ lastError = error instanceof Error ? error : new Error('Unknown error');
509
+ console.warn(`❌ Minting attempt ${attempt} failed:`, lastError.message);
510
+ if (attempt < maxRetries) {
511
+ const delay = Math.pow(2, attempt) * 1000; // Exponential backoff
512
+ console.log(`⏳ Waiting ${delay}ms before retry...`);
513
+ await new Promise(resolve => setTimeout(resolve, delay));
514
+ }
515
+ }
516
+ }
517
+ return {
518
+ success: false,
519
+ message: `Minting failed after ${maxRetries} attempts: ${lastError?.message || 'Unknown error'}`
520
+ };
521
+ }
522
+ /**
523
+ * Batch minting for multiple archives
524
+ * @param archives Array of archive objects with name and merkleRoot
525
+ * @returns Array of minting results
526
+ */
527
+ async mintBatch(archives) {
528
+ const results = [];
529
+ for (const archive of archives) {
530
+ try {
531
+ // Update the merkle root for this archive
532
+ this.merkleRoot = archive.merkleRoot;
533
+ const result = await this.mintToken();
534
+ results.push(result);
535
+ // Add delay between mints to avoid rate limiting
536
+ await new Promise(resolve => setTimeout(resolve, 1000));
537
+ }
538
+ catch (error) {
539
+ results.push({
540
+ success: false,
541
+ message: `Failed to mint ${archive.name}: ${error instanceof Error ? error.message : 'Unknown error'}`
542
+ });
543
+ }
544
+ }
545
+ return results;
546
+ }
547
+ /**
548
+ * Create a token from a previously timestamped ZIP file.
549
+ * Extracts the merkle root from the timestamp metadata and mints a new token.
550
+ *
551
+ * @param zipkit - Zipkit-like instance containing timestamp metadata
552
+ * @param options - Additional options for minting
553
+ * @returns Minting result with token information
554
+ */
555
+ async mintFromTimestampedZip(zipkit, options = {}) {
556
+ try {
557
+ // Import Zipstamp server API functions dynamically to avoid circular dependencies
558
+ const { getEthTimestampEntry, extractTimestampData } = await import('../zipstamp-server/ZipstampServerAPI.js');
559
+ // Find timestamp entry in ZIP
560
+ const timestampEntry = getEthTimestampEntry(zipkit);
561
+ if (!timestampEntry) {
562
+ return {
563
+ success: false,
564
+ message: 'No timestamp metadata found in ZIP file. File must be timestamped first.',
565
+ };
566
+ }
567
+ // Extract timestamp metadata
568
+ const timestampData = await extractTimestampData(zipkit, timestampEntry);
569
+ if (!timestampData) {
570
+ return {
571
+ success: false,
572
+ message: 'Failed to extract timestamp metadata from ZIP file.',
573
+ };
574
+ }
575
+ // Use the merkle root from the timestamp metadata
576
+ const merkleRoot = timestampData.digest;
577
+ if (!merkleRoot || !/^[a-f0-9]{64}$/i.test(merkleRoot)) {
578
+ return {
579
+ success: false,
580
+ message: 'Invalid merkle root in timestamp metadata.',
581
+ };
582
+ }
583
+ // Update this instance's merkle root
584
+ this.merkleRoot = merkleRoot;
585
+ // Mint the token
586
+ const mintResult = await this.mintToken();
587
+ if (!mintResult.success) {
588
+ return mintResult;
589
+ }
590
+ // If preserveTimestampInfo is true, we would need to store the original timestamp
591
+ // information in the token metadata. For now, we just mint using the same merkle root.
592
+ // The token metadata can be enhanced later to include originalTimestamp field.
593
+ if (this.debug && options.preserveTimestampInfo) {
594
+ console.log('[ZipkitMinter] Original timestamp info:', {
595
+ digest: timestampData.digest,
596
+ tokenId: timestampData.tokenId,
597
+ transactionHash: timestampData.transactionHash,
598
+ timestamp: timestampData.timestamp,
599
+ network: timestampData.network,
600
+ });
601
+ }
602
+ return mintResult;
603
+ }
604
+ catch (error) {
605
+ return {
606
+ success: false,
607
+ message: `Failed to mint from timestamped ZIP: ${error instanceof Error ? error.message : 'Unknown error'}`,
608
+ };
609
+ }
610
+ }
611
+ }
612
+ exports.ZipkitMinter = ZipkitMinter;
613
+ /**
614
+ * Utility function to validate Ethereum private key
615
+ */
616
+ function validatePrivateKey(privateKey) {
617
+ try {
618
+ new ethers_1.ethers.Wallet(privateKey);
619
+ return true;
620
+ }
621
+ catch {
622
+ return false;
623
+ }
624
+ }
625
+ //# sourceMappingURL=ZipkitMinter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ZipkitMinter.js","sourceRoot":"","sources":["../../src/core/ZipkitMinter.ts"],"names":[],"mappings":"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"}