movehat 0.0.1-alpha.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 (170) hide show
  1. package/README.md +236 -0
  2. package/bin/movehat.js +21 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +93 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/compile.d.ts +2 -0
  8. package/dist/commands/compile.d.ts.map +1 -0
  9. package/dist/commands/compile.js +71 -0
  10. package/dist/commands/compile.js.map +1 -0
  11. package/dist/commands/fork/create.d.ts +11 -0
  12. package/dist/commands/fork/create.d.ts.map +1 -0
  13. package/dist/commands/fork/create.js +56 -0
  14. package/dist/commands/fork/create.js.map +1 -0
  15. package/dist/commands/fork/fund.d.ts +12 -0
  16. package/dist/commands/fork/fund.d.ts.map +1 -0
  17. package/dist/commands/fork/fund.js +42 -0
  18. package/dist/commands/fork/fund.js.map +1 -0
  19. package/dist/commands/fork/list.d.ts +5 -0
  20. package/dist/commands/fork/list.d.ts.map +1 -0
  21. package/dist/commands/fork/list.js +61 -0
  22. package/dist/commands/fork/list.js.map +1 -0
  23. package/dist/commands/fork/serve.d.ts +10 -0
  24. package/dist/commands/fork/serve.d.ts.map +1 -0
  25. package/dist/commands/fork/serve.js +64 -0
  26. package/dist/commands/fork/serve.js.map +1 -0
  27. package/dist/commands/fork/view-resource.d.ts +11 -0
  28. package/dist/commands/fork/view-resource.d.ts.map +1 -0
  29. package/dist/commands/fork/view-resource.js +34 -0
  30. package/dist/commands/fork/view-resource.js.map +1 -0
  31. package/dist/commands/init.d.ts +2 -0
  32. package/dist/commands/init.d.ts.map +1 -0
  33. package/dist/commands/init.js +90 -0
  34. package/dist/commands/init.js.map +1 -0
  35. package/dist/commands/run.d.ts +2 -0
  36. package/dist/commands/run.d.ts.map +1 -0
  37. package/dist/commands/run.js +51 -0
  38. package/dist/commands/run.js.map +1 -0
  39. package/dist/commands/test.d.ts +2 -0
  40. package/dist/commands/test.d.ts.map +1 -0
  41. package/dist/commands/test.js +35 -0
  42. package/dist/commands/test.js.map +1 -0
  43. package/dist/core/config.d.ts +15 -0
  44. package/dist/core/config.d.ts.map +1 -0
  45. package/dist/core/config.js +121 -0
  46. package/dist/core/config.js.map +1 -0
  47. package/dist/core/contract.d.ts +20 -0
  48. package/dist/core/contract.d.ts.map +1 -0
  49. package/dist/core/contract.js +59 -0
  50. package/dist/core/contract.js.map +1 -0
  51. package/dist/core/deployments.d.ts +32 -0
  52. package/dist/core/deployments.d.ts.map +1 -0
  53. package/dist/core/deployments.js +122 -0
  54. package/dist/core/deployments.js.map +1 -0
  55. package/dist/core/shell.d.ts +25 -0
  56. package/dist/core/shell.d.ts.map +1 -0
  57. package/dist/core/shell.js +56 -0
  58. package/dist/core/shell.js.map +1 -0
  59. package/dist/errors.d.ts +12 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +24 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/fork/api.d.ts +33 -0
  64. package/dist/fork/api.d.ts.map +1 -0
  65. package/dist/fork/api.js +98 -0
  66. package/dist/fork/api.js.map +1 -0
  67. package/dist/fork/manager.d.ts +52 -0
  68. package/dist/fork/manager.d.ts.map +1 -0
  69. package/dist/fork/manager.js +221 -0
  70. package/dist/fork/manager.js.map +1 -0
  71. package/dist/fork/server.d.ts +55 -0
  72. package/dist/fork/server.d.ts.map +1 -0
  73. package/dist/fork/server.js +274 -0
  74. package/dist/fork/server.js.map +1 -0
  75. package/dist/fork/storage.d.ts +63 -0
  76. package/dist/fork/storage.d.ts.map +1 -0
  77. package/dist/fork/storage.js +183 -0
  78. package/dist/fork/storage.js.map +1 -0
  79. package/dist/fork/test.d.ts +75 -0
  80. package/dist/fork/test.d.ts.map +1 -0
  81. package/dist/fork/test.js +157 -0
  82. package/dist/fork/test.js.map +1 -0
  83. package/dist/helpers/assertions.d.ts +7 -0
  84. package/dist/helpers/assertions.d.ts.map +1 -0
  85. package/dist/helpers/assertions.js +17 -0
  86. package/dist/helpers/assertions.js.map +1 -0
  87. package/dist/helpers/banner.d.ts +3 -0
  88. package/dist/helpers/banner.d.ts.map +1 -0
  89. package/dist/helpers/banner.js +38 -0
  90. package/dist/helpers/banner.js.map +1 -0
  91. package/dist/helpers/index.d.ts +11 -0
  92. package/dist/helpers/index.d.ts.map +1 -0
  93. package/dist/helpers/index.js +7 -0
  94. package/dist/helpers/index.js.map +1 -0
  95. package/dist/helpers/setup.d.ts +10 -0
  96. package/dist/helpers/setup.d.ts.map +1 -0
  97. package/dist/helpers/setup.js +28 -0
  98. package/dist/helpers/setup.js.map +1 -0
  99. package/dist/index.d.ts +11 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +12 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/runtime.d.ts +26 -0
  104. package/dist/runtime.d.ts.map +1 -0
  105. package/dist/runtime.js +247 -0
  106. package/dist/runtime.js.map +1 -0
  107. package/dist/templates/.env.example +9 -0
  108. package/dist/templates/.mocharc.json +8 -0
  109. package/dist/templates/README.md +92 -0
  110. package/dist/templates/move/Counter.move +64 -0
  111. package/dist/templates/move/Move.toml +16 -0
  112. package/dist/templates/movehat.config.ts +37 -0
  113. package/dist/templates/package.json +24 -0
  114. package/dist/templates/scripts/deploy-counter.ts +48 -0
  115. package/dist/templates/tests/Counter.test.ts +75 -0
  116. package/dist/templates/tsconfig.json +15 -0
  117. package/dist/templates/types/movehat.d.ts +104 -0
  118. package/dist/types/config.d.ts +35 -0
  119. package/dist/types/config.d.ts.map +1 -0
  120. package/dist/types/config.js +2 -0
  121. package/dist/types/config.js.map +1 -0
  122. package/dist/types/fork.d.ts +37 -0
  123. package/dist/types/fork.d.ts.map +1 -0
  124. package/dist/types/fork.js +5 -0
  125. package/dist/types/fork.js.map +1 -0
  126. package/dist/types/runtime.d.ts +28 -0
  127. package/dist/types/runtime.d.ts.map +1 -0
  128. package/dist/types/runtime.js +2 -0
  129. package/dist/types/runtime.js.map +1 -0
  130. package/package.json +66 -0
  131. package/src/cli.ts +106 -0
  132. package/src/commands/compile.ts +84 -0
  133. package/src/commands/fork/create.ts +70 -0
  134. package/src/commands/fork/fund.ts +57 -0
  135. package/src/commands/fork/list.ts +67 -0
  136. package/src/commands/fork/serve.ts +77 -0
  137. package/src/commands/fork/view-resource.ts +46 -0
  138. package/src/commands/init.ts +150 -0
  139. package/src/commands/run.ts +59 -0
  140. package/src/commands/test.ts +42 -0
  141. package/src/core/config.ts +151 -0
  142. package/src/core/contract.ts +97 -0
  143. package/src/core/deployments.ts +164 -0
  144. package/src/core/shell.ts +66 -0
  145. package/src/errors.ts +21 -0
  146. package/src/fork/api.ts +117 -0
  147. package/src/fork/manager.ts +264 -0
  148. package/src/fork/server.ts +311 -0
  149. package/src/fork/storage.ts +224 -0
  150. package/src/fork/test.ts +195 -0
  151. package/src/helpers/assertions.ts +29 -0
  152. package/src/helpers/banner.ts +47 -0
  153. package/src/helpers/index.ts +26 -0
  154. package/src/helpers/setup.ts +49 -0
  155. package/src/index.ts +17 -0
  156. package/src/runtime.ts +322 -0
  157. package/src/templates/.env.example +9 -0
  158. package/src/templates/.mocharc.json +8 -0
  159. package/src/templates/README.md +92 -0
  160. package/src/templates/move/Counter.move +64 -0
  161. package/src/templates/move/Move.toml +16 -0
  162. package/src/templates/movehat.config.ts +37 -0
  163. package/src/templates/package.json +24 -0
  164. package/src/templates/scripts/deploy-counter.ts +48 -0
  165. package/src/templates/tests/Counter.test.ts +75 -0
  166. package/src/templates/tsconfig.json +15 -0
  167. package/src/templates/types/movehat.d.ts +104 -0
  168. package/src/types/config.ts +36 -0
  169. package/src/types/fork.ts +41 -0
  170. package/src/types/runtime.ts +49 -0
@@ -0,0 +1,221 @@
1
+ import { MovementApiClient } from './api.js';
2
+ import { ForkStorage } from './storage.js';
3
+ /**
4
+ * Manager for fork operations
5
+ * Orchestrates API client and storage
6
+ */
7
+ export class ForkManager {
8
+ storage;
9
+ apiClient = null;
10
+ metadata = null;
11
+ constructor(forkPath) {
12
+ this.storage = new ForkStorage(forkPath);
13
+ }
14
+ /**
15
+ * Initialize a new fork from a network
16
+ */
17
+ async initialize(nodeUrl, networkName = 'custom') {
18
+ // Create API client
19
+ this.apiClient = new MovementApiClient(nodeUrl);
20
+ // Fetch network info
21
+ const ledgerInfo = await this.apiClient.getLedgerInfo();
22
+ // Create fork structure
23
+ this.storage.initialize();
24
+ // Save metadata
25
+ this.metadata = {
26
+ network: networkName,
27
+ nodeUrl,
28
+ chainId: ledgerInfo.chain_id,
29
+ ledgerVersion: ledgerInfo.ledger_version,
30
+ timestamp: ledgerInfo.ledger_timestamp,
31
+ epoch: ledgerInfo.epoch,
32
+ blockHeight: ledgerInfo.block_height,
33
+ createdAt: new Date().toISOString(),
34
+ };
35
+ this.storage.saveMetadata(this.metadata);
36
+ console.log(`✓ Fork initialized at ledger version ${ledgerInfo.ledger_version}`);
37
+ }
38
+ /**
39
+ * Load an existing fork
40
+ */
41
+ load() {
42
+ if (!this.storage.exists()) {
43
+ throw new Error('Fork does not exist. Run `initialize()` first.');
44
+ }
45
+ this.metadata = this.storage.loadMetadata();
46
+ this.apiClient = new MovementApiClient(this.metadata.nodeUrl);
47
+ }
48
+ /**
49
+ * Get fork metadata
50
+ */
51
+ getMetadata() {
52
+ if (!this.metadata) {
53
+ this.metadata = this.storage.loadMetadata();
54
+ }
55
+ return this.metadata;
56
+ }
57
+ /**
58
+ * Get account state (with lazy loading)
59
+ */
60
+ async getAccount(address) {
61
+ // Normalize address
62
+ const normalizedAddress = this.normalizeAddress(address);
63
+ // Check cache first
64
+ let accountState = this.storage.getAccount(normalizedAddress);
65
+ if (!accountState) {
66
+ // Fetch from network
67
+ if (!this.apiClient) {
68
+ throw new Error('Fork not initialized. Call initialize() or load() first.');
69
+ }
70
+ console.log(` Fetching account ${normalizedAddress} from network...`);
71
+ const accountData = await this.apiClient.getAccount(normalizedAddress);
72
+ accountState = {
73
+ sequenceNumber: accountData.sequence_number,
74
+ authenticationKey: accountData.authentication_key,
75
+ };
76
+ // Cache it
77
+ this.storage.saveAccount(normalizedAddress, accountState);
78
+ console.log(` ✓ Cached account ${normalizedAddress}`);
79
+ }
80
+ return accountState;
81
+ }
82
+ /**
83
+ * Get a specific resource (with lazy loading)
84
+ */
85
+ async getResource(address, resourceType) {
86
+ const normalizedAddress = this.normalizeAddress(address);
87
+ // Check cache first
88
+ let resource = this.storage.getResource(normalizedAddress, resourceType);
89
+ if (!resource) {
90
+ // Fetch from network
91
+ if (!this.apiClient) {
92
+ throw new Error('Fork not initialized. Call initialize() or load() first.');
93
+ }
94
+ console.log(` Fetching resource ${resourceType} for ${normalizedAddress}...`);
95
+ try {
96
+ const resourceData = await this.apiClient.getAccountResource(normalizedAddress, resourceType);
97
+ resource = resourceData.data;
98
+ // Cache it
99
+ this.storage.saveResource(normalizedAddress, resourceType, resource);
100
+ console.log(` ✓ Cached resource ${resourceType}`);
101
+ }
102
+ catch (error) {
103
+ if (error.message.includes('404')) {
104
+ throw new Error(`Resource ${resourceType} not found for account ${normalizedAddress}`);
105
+ }
106
+ throw error;
107
+ }
108
+ }
109
+ return resource;
110
+ }
111
+ /**
112
+ * Get all resources for an account (with lazy loading)
113
+ */
114
+ async getAllResources(address) {
115
+ const normalizedAddress = this.normalizeAddress(address);
116
+ // Check if we have any cached resources
117
+ let resources = this.storage.getAllResources(normalizedAddress);
118
+ // If no cached resources, fetch all from network
119
+ if (Object.keys(resources).length === 0) {
120
+ if (!this.apiClient) {
121
+ throw new Error('Fork not initialized. Call initialize() or load() first.');
122
+ }
123
+ console.log(` Fetching all resources for ${normalizedAddress}...`);
124
+ const resourcesList = await this.apiClient.getAccountResources(normalizedAddress);
125
+ resources = {};
126
+ for (const resource of resourcesList) {
127
+ resources[resource.type] = resource.data;
128
+ }
129
+ // Cache them
130
+ this.storage.saveAllResources(normalizedAddress, resources);
131
+ console.log(` ✓ Cached ${Object.keys(resources).length} resources`);
132
+ }
133
+ return resources;
134
+ }
135
+ /**
136
+ * Set a resource value (for testing/mocking)
137
+ */
138
+ async setResource(address, resourceType, data) {
139
+ const normalizedAddress = this.normalizeAddress(address);
140
+ this.storage.saveResource(normalizedAddress, resourceType, data);
141
+ console.log(` ✓ Updated resource ${resourceType} for ${normalizedAddress}`);
142
+ }
143
+ /**
144
+ * Fund an account with coins (adds to existing balance)
145
+ */
146
+ async fundAccount(address, amount, coinType = '0x1::aptos_coin::AptosCoin') {
147
+ const normalizedAddress = this.normalizeAddress(address);
148
+ const resourceType = `0x1::coin::CoinStore<${coinType}>`;
149
+ // Try to get existing coin store
150
+ let coinStore;
151
+ try {
152
+ coinStore = await this.getResource(normalizedAddress, resourceType);
153
+ }
154
+ catch (error) {
155
+ // Only catch "not found" errors, rethrow others (network, API, etc.)
156
+ if (!error.message || !error.message.includes('not found')) {
157
+ throw error;
158
+ }
159
+ // If doesn't exist, create new one
160
+ coinStore = {
161
+ coin: { value: '0' },
162
+ deposit_events: {
163
+ counter: '0',
164
+ guid: {
165
+ id: {
166
+ addr: normalizedAddress,
167
+ creation_num: '0',
168
+ },
169
+ },
170
+ },
171
+ withdraw_events: {
172
+ counter: '0',
173
+ guid: {
174
+ id: {
175
+ addr: normalizedAddress,
176
+ creation_num: '1',
177
+ },
178
+ },
179
+ },
180
+ frozen: false,
181
+ };
182
+ }
183
+ // Add to existing balance (instead of replacing it)
184
+ const currentBalance = BigInt(coinStore.coin.value ?? '0');
185
+ const newBalance = currentBalance + BigInt(amount);
186
+ coinStore.coin.value = newBalance.toString();
187
+ // Save
188
+ await this.setResource(normalizedAddress, resourceType, coinStore);
189
+ // Also ensure account exists
190
+ let account = this.storage.getAccount(normalizedAddress);
191
+ if (!account) {
192
+ account = {
193
+ sequenceNumber: '0',
194
+ authenticationKey: normalizedAddress.padEnd(66, '0'),
195
+ };
196
+ this.storage.saveAccount(normalizedAddress, account);
197
+ }
198
+ console.log(` ✓ Funded ${normalizedAddress} with ${amount} coins`);
199
+ }
200
+ /**
201
+ * Normalize address format
202
+ */
203
+ normalizeAddress(address) {
204
+ let normalized = address.toLowerCase();
205
+ if (!normalized.startsWith('0x')) {
206
+ normalized = `0x${normalized}`;
207
+ }
208
+ // Pad to 66 characters (0x + 64 hex chars)
209
+ if (normalized.length < 66) {
210
+ normalized = '0x' + normalized.slice(2).padStart(64, '0');
211
+ }
212
+ return normalized;
213
+ }
214
+ /**
215
+ * List all accounts in the fork
216
+ */
217
+ listAccounts() {
218
+ return this.storage.listAccounts();
219
+ }
220
+ }
221
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/fork/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Fork Server - Serves fork data via Movement/Aptos RPC API
3
+ * Emulates a Movement L1 node using local fork storage
4
+ */
5
+ export declare class ForkServer {
6
+ private server;
7
+ private forkManager;
8
+ private port;
9
+ constructor(forkPath: string, port?: number);
10
+ /**
11
+ * Start the fork server
12
+ */
13
+ start(): Promise<void>;
14
+ /**
15
+ * Stop the fork server
16
+ */
17
+ stop(): Promise<void>;
18
+ /**
19
+ * Sanitize pathname for error messages to prevent log injection
20
+ */
21
+ private sanitizePathname;
22
+ /**
23
+ * Handle incoming HTTP requests
24
+ */
25
+ private handleRequest;
26
+ /**
27
+ * Handle GET /v1/ - Ledger info
28
+ */
29
+ private handleLedgerInfo;
30
+ /**
31
+ * Handle GET /v1/accounts/:address
32
+ */
33
+ private handleGetAccount;
34
+ /**
35
+ * Handle GET /v1/accounts/:address/resource/:resourceType
36
+ */
37
+ private handleGetResource;
38
+ /**
39
+ * Handle GET /v1/accounts/:address/resources
40
+ */
41
+ private handleGetResources;
42
+ /**
43
+ * Send JSON response
44
+ */
45
+ private sendJSON;
46
+ /**
47
+ * Send 404 error
48
+ */
49
+ private send404;
50
+ /**
51
+ * Send error response
52
+ */
53
+ private sendError;
54
+ }
55
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/fork/server.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,IAAI,CAAS;gBAET,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAa;IAKjD;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA4D5B;;OAEG;IACH,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAarB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAOxB;;OAEG;YACW,aAAa;IAyD3B;;OAEG;YACW,gBAAgB;IA0B9B;;OAEG;YACW,gBAAgB;IAoB9B;;OAEG;YACW,iBAAiB;IAqB/B;;OAEG;YACW,kBAAkB;IAuBhC;;OAEG;IACH,OAAO,CAAC,QAAQ;IAiBhB;;OAEG;IACH,OAAO,CAAC,OAAO;IAQf;;OAEG;IACH,OAAO,CAAC,SAAS;CAOlB"}
@@ -0,0 +1,274 @@
1
+ import http from 'http';
2
+ import { URL } from 'url';
3
+ import { ForkManager } from './manager.js';
4
+ /**
5
+ * Fork Server - Serves fork data via Movement/Aptos RPC API
6
+ * Emulates a Movement L1 node using local fork storage
7
+ */
8
+ export class ForkServer {
9
+ server = null;
10
+ forkManager;
11
+ port;
12
+ constructor(forkPath, port = 8080) {
13
+ this.forkManager = new ForkManager(forkPath);
14
+ this.port = port;
15
+ }
16
+ /**
17
+ * Start the fork server
18
+ */
19
+ async start() {
20
+ // Load fork metadata
21
+ this.forkManager.load();
22
+ const metadata = this.forkManager.getMetadata();
23
+ console.log(`\nStarting Fork Server...`);
24
+ console.log(` Network: ${metadata.network}`);
25
+ console.log(` Chain ID: ${metadata.chainId}`);
26
+ console.log(` Ledger Version: ${metadata.ledgerVersion}`);
27
+ console.log(` Forked at: ${metadata.createdAt}`);
28
+ this.server = http.createServer((req, res) => {
29
+ this.handleRequest(req, res).catch((error) => {
30
+ // Log full error server-side for diagnostics
31
+ console.error(`Error handling request:`, error);
32
+ // Only send response if headers haven't been sent yet
33
+ if (!res.headersSent) {
34
+ // Add CORS headers (same as in handleRequest)
35
+ res.setHeader('Access-Control-Allow-Origin', '*');
36
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
37
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
38
+ // Send generic error response (no internal details exposed)
39
+ this.sendJSON(res, 500, {
40
+ message: 'Internal server error',
41
+ error_code: 'internal_error',
42
+ vm_error_code: null
43
+ });
44
+ }
45
+ });
46
+ });
47
+ return new Promise((resolve, reject) => {
48
+ // Handle server errors (port in use, permission denied, etc.)
49
+ const onError = (error) => {
50
+ if (error.code === 'EADDRINUSE') {
51
+ reject(new Error(`Port ${this.port} is already in use. Please use a different port with --port <number>`));
52
+ }
53
+ else if (error.code === 'EACCES') {
54
+ reject(new Error(`Permission denied to bind to port ${this.port}. Try using a port above 1024 or run with appropriate permissions.`));
55
+ }
56
+ else {
57
+ reject(new Error(`Failed to start server: ${error.message}`));
58
+ }
59
+ };
60
+ // Listen for errors during startup
61
+ this.server.once('error', onError);
62
+ this.server.listen(this.port, () => {
63
+ // Remove error listener after successful start
64
+ this.server.removeListener('error', onError);
65
+ console.log(`\nFork Server listening on http://localhost:${this.port}`);
66
+ console.log(` Ledger Info: http://localhost:${this.port}/v1/`);
67
+ console.log(`\nPress Ctrl+C to stop`);
68
+ resolve();
69
+ });
70
+ });
71
+ }
72
+ /**
73
+ * Stop the fork server
74
+ */
75
+ stop() {
76
+ return new Promise((resolve) => {
77
+ if (this.server) {
78
+ this.server.close(() => {
79
+ console.log('\nFork Server stopped');
80
+ resolve();
81
+ });
82
+ }
83
+ else {
84
+ resolve();
85
+ }
86
+ });
87
+ }
88
+ /**
89
+ * Sanitize pathname for error messages to prevent log injection
90
+ */
91
+ sanitizePathname(pathname) {
92
+ // Remove control characters and newlines
93
+ const sanitized = pathname.replace(/[\x00-\x1F\x7F]/g, '');
94
+ // Truncate to reasonable length
95
+ return sanitized.length > 100 ? sanitized.substring(0, 100) + '...' : sanitized;
96
+ }
97
+ /**
98
+ * Handle incoming HTTP requests
99
+ */
100
+ async handleRequest(req, res) {
101
+ const url = new URL(req.url || '/', `http://localhost:${this.port}`);
102
+ const pathname = url.pathname;
103
+ // Log request
104
+ console.log(`[${new Date().toISOString()}] ${req.method} ${pathname}`);
105
+ // CORS headers
106
+ res.setHeader('Access-Control-Allow-Origin', '*');
107
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
108
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
109
+ // Handle OPTIONS for CORS preflight
110
+ if (req.method === 'OPTIONS') {
111
+ res.writeHead(200);
112
+ res.end();
113
+ return;
114
+ }
115
+ try {
116
+ // Route requests
117
+ if (pathname === '/v1' || pathname === '/v1/') {
118
+ await this.handleLedgerInfo(res);
119
+ }
120
+ else if (pathname.match(/^\/v1\/accounts\/0x[a-fA-F0-9]{1,64}$/)) {
121
+ const address = pathname.split('/').pop();
122
+ await this.handleGetAccount(address, res);
123
+ }
124
+ else if (pathname.match(/^\/v1\/accounts\/0x[a-fA-F0-9]{1,64}\/resource\/.+$/)) {
125
+ const parts = pathname.split('/');
126
+ const accountIndex = parts.indexOf('accounts') + 1;
127
+ const resourceIndex = parts.indexOf('resource') + 1;
128
+ const address = parts[accountIndex];
129
+ const resourceType = decodeURIComponent(parts.slice(resourceIndex).join('/'));
130
+ await this.handleGetResource(address, resourceType, res);
131
+ }
132
+ else {
133
+ // Use regex capture for resources endpoint
134
+ const resourcesMatch = pathname.match(/^\/v1\/accounts\/(0x[a-fA-F0-9]{1,64})\/resources$/);
135
+ if (resourcesMatch) {
136
+ const address = resourcesMatch[1];
137
+ await this.handleGetResources(address, res);
138
+ }
139
+ else {
140
+ // Sanitize pathname to prevent log injection
141
+ const safePath = this.sanitizePathname(pathname);
142
+ this.send404(res, `Endpoint not found: ${safePath}`, 'endpoint_not_found');
143
+ }
144
+ }
145
+ }
146
+ catch (error) {
147
+ // Log full error server-side for diagnostics
148
+ console.error('Error handling request:', error);
149
+ // Send generic error to client (don't expose internal details)
150
+ this.sendError(res, 500, 'Internal server error');
151
+ }
152
+ }
153
+ /**
154
+ * Handle GET /v1/ - Ledger info
155
+ */
156
+ async handleLedgerInfo(res) {
157
+ const metadata = this.forkManager.getMetadata();
158
+ const ledgerInfo = {
159
+ chain_id: metadata.chainId,
160
+ epoch: metadata.epoch,
161
+ ledger_version: metadata.ledgerVersion,
162
+ oldest_ledger_version: "0",
163
+ ledger_timestamp: metadata.timestamp,
164
+ node_role: "full_node",
165
+ oldest_block_height: "0",
166
+ block_height: metadata.blockHeight,
167
+ git_hash: "movehat-fork"
168
+ };
169
+ this.sendJSON(res, 200, ledgerInfo, {
170
+ 'x-aptos-chain-id': String(metadata.chainId),
171
+ 'x-aptos-ledger-version': metadata.ledgerVersion,
172
+ 'x-aptos-ledger-oldest-version': '0',
173
+ 'x-aptos-ledger-timestampusec': metadata.timestamp,
174
+ 'x-aptos-epoch': metadata.epoch,
175
+ 'x-aptos-block-height': metadata.blockHeight,
176
+ 'x-aptos-oldest-block-height': '0'
177
+ });
178
+ }
179
+ /**
180
+ * Handle GET /v1/accounts/:address
181
+ */
182
+ async handleGetAccount(address, res) {
183
+ try {
184
+ const account = await this.forkManager.getAccount(address);
185
+ this.sendJSON(res, 200, {
186
+ sequence_number: account.sequenceNumber,
187
+ authentication_key: account.authenticationKey
188
+ });
189
+ }
190
+ catch (error) {
191
+ if (error.message.includes('not found')) {
192
+ this.send404(res, `Account not found: ${address}`);
193
+ }
194
+ else {
195
+ throw error;
196
+ }
197
+ }
198
+ }
199
+ /**
200
+ * Handle GET /v1/accounts/:address/resource/:resourceType
201
+ */
202
+ async handleGetResource(address, resourceType, res) {
203
+ try {
204
+ const resource = await this.forkManager.getResource(address, resourceType);
205
+ this.sendJSON(res, 200, {
206
+ type: resourceType,
207
+ data: resource
208
+ });
209
+ }
210
+ catch (error) {
211
+ if (error.message.includes('not found')) {
212
+ this.send404(res, `Resource not found: ${resourceType}`, 'resource_not_found');
213
+ }
214
+ else {
215
+ throw error;
216
+ }
217
+ }
218
+ }
219
+ /**
220
+ * Handle GET /v1/accounts/:address/resources
221
+ */
222
+ async handleGetResources(address, res) {
223
+ try {
224
+ const resources = await this.forkManager.getAllResources(address);
225
+ // Convert to array format expected by Aptos API
226
+ const resourcesArray = Object.entries(resources).map(([type, data]) => ({
227
+ type,
228
+ data
229
+ }));
230
+ this.sendJSON(res, 200, resourcesArray);
231
+ }
232
+ catch (error) {
233
+ if (error.message.includes('not found')) {
234
+ this.send404(res, `Account not found: ${address}`);
235
+ }
236
+ else {
237
+ throw error;
238
+ }
239
+ }
240
+ }
241
+ /**
242
+ * Send JSON response
243
+ */
244
+ sendJSON(res, status, data, extraHeaders = {}) {
245
+ const body = JSON.stringify(data, null, 2);
246
+ res.writeHead(status, {
247
+ 'Content-Type': 'application/json',
248
+ 'Content-Length': Buffer.byteLength(body),
249
+ ...extraHeaders
250
+ });
251
+ res.end(body);
252
+ }
253
+ /**
254
+ * Send 404 error
255
+ */
256
+ send404(res, message, errorCode = 'account_not_found') {
257
+ this.sendJSON(res, 404, {
258
+ message,
259
+ error_code: errorCode,
260
+ vm_error_code: null
261
+ });
262
+ }
263
+ /**
264
+ * Send error response
265
+ */
266
+ sendError(res, status, message) {
267
+ this.sendJSON(res, status, {
268
+ message,
269
+ error_code: 'internal_error',
270
+ vm_error_code: null
271
+ });
272
+ }
273
+ }
274
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/fork/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { ForkMetadata, AccountState } from '../types/fork.js';
2
+ /**
3
+ * Storage system for fork state
4
+ * Manages the file structure and I/O for fork data
5
+ */
6
+ export declare class ForkStorage {
7
+ private forkPath;
8
+ constructor(forkPath: string);
9
+ /**
10
+ * Get safe resource file path for an address
11
+ * Prevents path traversal attacks
12
+ */
13
+ private getResourceFilePath;
14
+ /**
15
+ * Initialize fork directory structure
16
+ */
17
+ initialize(): void;
18
+ /**
19
+ * Check if fork exists
20
+ */
21
+ exists(): boolean;
22
+ /**
23
+ * Save fork metadata
24
+ */
25
+ saveMetadata(metadata: ForkMetadata): void;
26
+ /**
27
+ * Load fork metadata
28
+ */
29
+ loadMetadata(): ForkMetadata;
30
+ /**
31
+ * Get account state
32
+ */
33
+ getAccount(address: string): AccountState | null;
34
+ /**
35
+ * Save account state
36
+ */
37
+ saveAccount(address: string, state: AccountState): void;
38
+ /**
39
+ * Get resource for an account
40
+ */
41
+ getResource(address: string, resourceType: string): any | null;
42
+ /**
43
+ * Get all resources for an account
44
+ */
45
+ getAllResources(address: string): Record<string, any>;
46
+ /**
47
+ * Save resource for an account
48
+ */
49
+ saveResource(address: string, resourceType: string, data: any): void;
50
+ /**
51
+ * Save all resources for an account
52
+ */
53
+ saveAllResources(address: string, resources: Record<string, any>): void;
54
+ /**
55
+ * Check if resource is cached
56
+ */
57
+ hasResource(address: string, resourceType: string): boolean;
58
+ /**
59
+ * List all accounts in the fork
60
+ */
61
+ listAccounts(): string[];
62
+ }
63
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/fork/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AA2BnE;;;GAGG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;OAEG;IACH,UAAU,IAAI,IAAI;IA8BlB;;OAEG;IACH,MAAM,IAAI,OAAO;IAIjB;;OAEG;IACH,YAAY,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI;IAK1C;;OAEG;IACH,YAAY,IAAI,YAAY;IAW5B;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAWhD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI;IAYvD;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAW9D;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAUrD;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAkBpE;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI;IAYvE;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO;IAI3D;;OAEG;IACH,YAAY,IAAI,MAAM,EAAE;CAUzB"}