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.
- package/README.md +236 -0
- package/bin/movehat.js +21 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +93 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/compile.d.ts +2 -0
- package/dist/commands/compile.d.ts.map +1 -0
- package/dist/commands/compile.js +71 -0
- package/dist/commands/compile.js.map +1 -0
- package/dist/commands/fork/create.d.ts +11 -0
- package/dist/commands/fork/create.d.ts.map +1 -0
- package/dist/commands/fork/create.js +56 -0
- package/dist/commands/fork/create.js.map +1 -0
- package/dist/commands/fork/fund.d.ts +12 -0
- package/dist/commands/fork/fund.d.ts.map +1 -0
- package/dist/commands/fork/fund.js +42 -0
- package/dist/commands/fork/fund.js.map +1 -0
- package/dist/commands/fork/list.d.ts +5 -0
- package/dist/commands/fork/list.d.ts.map +1 -0
- package/dist/commands/fork/list.js +61 -0
- package/dist/commands/fork/list.js.map +1 -0
- package/dist/commands/fork/serve.d.ts +10 -0
- package/dist/commands/fork/serve.d.ts.map +1 -0
- package/dist/commands/fork/serve.js +64 -0
- package/dist/commands/fork/serve.js.map +1 -0
- package/dist/commands/fork/view-resource.d.ts +11 -0
- package/dist/commands/fork/view-resource.d.ts.map +1 -0
- package/dist/commands/fork/view-resource.js +34 -0
- package/dist/commands/fork/view-resource.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +90 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/run.d.ts +2 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +51 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/test.d.ts +2 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +35 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/core/config.d.ts +15 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +121 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/contract.d.ts +20 -0
- package/dist/core/contract.d.ts.map +1 -0
- package/dist/core/contract.js +59 -0
- package/dist/core/contract.js.map +1 -0
- package/dist/core/deployments.d.ts +32 -0
- package/dist/core/deployments.d.ts.map +1 -0
- package/dist/core/deployments.js +122 -0
- package/dist/core/deployments.js.map +1 -0
- package/dist/core/shell.d.ts +25 -0
- package/dist/core/shell.d.ts.map +1 -0
- package/dist/core/shell.js +56 -0
- package/dist/core/shell.js.map +1 -0
- package/dist/errors.d.ts +12 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +24 -0
- package/dist/errors.js.map +1 -0
- package/dist/fork/api.d.ts +33 -0
- package/dist/fork/api.d.ts.map +1 -0
- package/dist/fork/api.js +98 -0
- package/dist/fork/api.js.map +1 -0
- package/dist/fork/manager.d.ts +52 -0
- package/dist/fork/manager.d.ts.map +1 -0
- package/dist/fork/manager.js +221 -0
- package/dist/fork/manager.js.map +1 -0
- package/dist/fork/server.d.ts +55 -0
- package/dist/fork/server.d.ts.map +1 -0
- package/dist/fork/server.js +274 -0
- package/dist/fork/server.js.map +1 -0
- package/dist/fork/storage.d.ts +63 -0
- package/dist/fork/storage.d.ts.map +1 -0
- package/dist/fork/storage.js +183 -0
- package/dist/fork/storage.js.map +1 -0
- package/dist/fork/test.d.ts +75 -0
- package/dist/fork/test.d.ts.map +1 -0
- package/dist/fork/test.js +157 -0
- package/dist/fork/test.js.map +1 -0
- package/dist/helpers/assertions.d.ts +7 -0
- package/dist/helpers/assertions.d.ts.map +1 -0
- package/dist/helpers/assertions.js +17 -0
- package/dist/helpers/assertions.js.map +1 -0
- package/dist/helpers/banner.d.ts +3 -0
- package/dist/helpers/banner.d.ts.map +1 -0
- package/dist/helpers/banner.js +38 -0
- package/dist/helpers/banner.js.map +1 -0
- package/dist/helpers/index.d.ts +11 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +7 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/helpers/setup.d.ts +10 -0
- package/dist/helpers/setup.d.ts.map +1 -0
- package/dist/helpers/setup.js +28 -0
- package/dist/helpers/setup.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/runtime.d.ts +26 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +247 -0
- package/dist/runtime.js.map +1 -0
- package/dist/templates/.env.example +9 -0
- package/dist/templates/.mocharc.json +8 -0
- package/dist/templates/README.md +92 -0
- package/dist/templates/move/Counter.move +64 -0
- package/dist/templates/move/Move.toml +16 -0
- package/dist/templates/movehat.config.ts +37 -0
- package/dist/templates/package.json +24 -0
- package/dist/templates/scripts/deploy-counter.ts +48 -0
- package/dist/templates/tests/Counter.test.ts +75 -0
- package/dist/templates/tsconfig.json +15 -0
- package/dist/templates/types/movehat.d.ts +104 -0
- package/dist/types/config.d.ts +35 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/fork.d.ts +37 -0
- package/dist/types/fork.d.ts.map +1 -0
- package/dist/types/fork.js +5 -0
- package/dist/types/fork.js.map +1 -0
- package/dist/types/runtime.d.ts +28 -0
- package/dist/types/runtime.d.ts.map +1 -0
- package/dist/types/runtime.js +2 -0
- package/dist/types/runtime.js.map +1 -0
- package/package.json +66 -0
- package/src/cli.ts +106 -0
- package/src/commands/compile.ts +84 -0
- package/src/commands/fork/create.ts +70 -0
- package/src/commands/fork/fund.ts +57 -0
- package/src/commands/fork/list.ts +67 -0
- package/src/commands/fork/serve.ts +77 -0
- package/src/commands/fork/view-resource.ts +46 -0
- package/src/commands/init.ts +150 -0
- package/src/commands/run.ts +59 -0
- package/src/commands/test.ts +42 -0
- package/src/core/config.ts +151 -0
- package/src/core/contract.ts +97 -0
- package/src/core/deployments.ts +164 -0
- package/src/core/shell.ts +66 -0
- package/src/errors.ts +21 -0
- package/src/fork/api.ts +117 -0
- package/src/fork/manager.ts +264 -0
- package/src/fork/server.ts +311 -0
- package/src/fork/storage.ts +224 -0
- package/src/fork/test.ts +195 -0
- package/src/helpers/assertions.ts +29 -0
- package/src/helpers/banner.ts +47 -0
- package/src/helpers/index.ts +26 -0
- package/src/helpers/setup.ts +49 -0
- package/src/index.ts +17 -0
- package/src/runtime.ts +322 -0
- package/src/templates/.env.example +9 -0
- package/src/templates/.mocharc.json +8 -0
- package/src/templates/README.md +92 -0
- package/src/templates/move/Counter.move +64 -0
- package/src/templates/move/Move.toml +16 -0
- package/src/templates/movehat.config.ts +37 -0
- package/src/templates/package.json +24 -0
- package/src/templates/scripts/deploy-counter.ts +48 -0
- package/src/templates/tests/Counter.test.ts +75 -0
- package/src/templates/tsconfig.json +15 -0
- package/src/templates/types/movehat.d.ts +104 -0
- package/src/types/config.ts +36 -0
- package/src/types/fork.ts +41 -0
- 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"}
|