@conquest-eth/tools 0.0.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/LICENSE +21 -0
- package/README.md +259 -0
- package/dist/cli-tool-generator.d.ts +22 -0
- package/dist/cli-tool-generator.d.ts.map +1 -0
- package/dist/cli-tool-generator.js +217 -0
- package/dist/cli-tool-generator.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +76 -0
- package/dist/cli.js.map +1 -0
- package/dist/contracts/space-info.d.ts +7 -0
- package/dist/contracts/space-info.d.ts.map +1 -0
- package/dist/contracts/space-info.js +34 -0
- package/dist/contracts/space-info.js.map +1 -0
- package/dist/fleet/index.d.ts +4 -0
- package/dist/fleet/index.d.ts.map +1 -0
- package/dist/fleet/index.js +7 -0
- package/dist/fleet/index.js.map +1 -0
- package/dist/fleet/manager.d.ts +70 -0
- package/dist/fleet/manager.d.ts.map +1 -0
- package/dist/fleet/manager.js +92 -0
- package/dist/fleet/manager.js.map +1 -0
- package/dist/fleet/resolve.d.ts +51 -0
- package/dist/fleet/resolve.d.ts.map +1 -0
- package/dist/fleet/resolve.js +140 -0
- package/dist/fleet/resolve.js.map +1 -0
- package/dist/fleet/send.d.ts +29 -0
- package/dist/fleet/send.d.ts.map +1 -0
- package/dist/fleet/send.js +81 -0
- package/dist/fleet/send.js.map +1 -0
- package/dist/helpers/index.d.ts +14 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +28 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +143 -0
- package/dist/index.js.map +1 -0
- package/dist/planet/acquire.d.ts +16 -0
- package/dist/planet/acquire.d.ts.map +1 -0
- package/dist/planet/acquire.js +27 -0
- package/dist/planet/acquire.js.map +1 -0
- package/dist/planet/exit.d.ts +17 -0
- package/dist/planet/exit.d.ts.map +1 -0
- package/dist/planet/exit.js +56 -0
- package/dist/planet/exit.js.map +1 -0
- package/dist/planet/index.d.ts +4 -0
- package/dist/planet/index.d.ts.map +1 -0
- package/dist/planet/index.js +6 -0
- package/dist/planet/index.js.map +1 -0
- package/dist/planet/manager.d.ts +106 -0
- package/dist/planet/manager.d.ts.map +1 -0
- package/dist/planet/manager.js +253 -0
- package/dist/planet/manager.js.map +1 -0
- package/dist/storage/interface.d.ts +93 -0
- package/dist/storage/interface.d.ts.map +1 -0
- package/dist/storage/interface.js +2 -0
- package/dist/storage/interface.js.map +1 -0
- package/dist/storage/json-storage.d.ts +28 -0
- package/dist/storage/json-storage.d.ts.map +1 -0
- package/dist/storage/json-storage.js +148 -0
- package/dist/storage/json-storage.js.map +1 -0
- package/dist/tools/acquire_planets.d.ts +7 -0
- package/dist/tools/acquire_planets.d.ts.map +1 -0
- package/dist/tools/acquire_planets.js +63 -0
- package/dist/tools/acquire_planets.js.map +1 -0
- package/dist/tools/exit_planets.d.ts +5 -0
- package/dist/tools/exit_planets.d.ts.map +1 -0
- package/dist/tools/exit_planets.js +31 -0
- package/dist/tools/exit_planets.js.map +1 -0
- package/dist/tools/get_my_planets.d.ts +5 -0
- package/dist/tools/get_my_planets.d.ts.map +1 -0
- package/dist/tools/get_my_planets.js +30 -0
- package/dist/tools/get_my_planets.js.map +1 -0
- package/dist/tools/get_pending_exits.d.ts +3 -0
- package/dist/tools/get_pending_exits.d.ts.map +1 -0
- package/dist/tools/get_pending_exits.js +37 -0
- package/dist/tools/get_pending_exits.js.map +1 -0
- package/dist/tools/get_pending_fleets.d.ts +3 -0
- package/dist/tools/get_pending_fleets.d.ts.map +1 -0
- package/dist/tools/get_pending_fleets.js +41 -0
- package/dist/tools/get_pending_fleets.js.map +1 -0
- package/dist/tools/get_planets_around.d.ts +7 -0
- package/dist/tools/get_planets_around.d.ts.map +1 -0
- package/dist/tools/get_planets_around.js +41 -0
- package/dist/tools/get_planets_around.js.map +1 -0
- package/dist/tools/index.d.ts +10 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +11 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/resolve_fleet.d.ts +5 -0
- package/dist/tools/resolve_fleet.d.ts.map +1 -0
- package/dist/tools/resolve_fleet.js +37 -0
- package/dist/tools/resolve_fleet.js.map +1 -0
- package/dist/tools/send_fleet.d.ts +16 -0
- package/dist/tools/send_fleet.d.ts.map +1 -0
- package/dist/tools/send_fleet.js +62 -0
- package/dist/tools/send_fleet.js.map +1 -0
- package/dist/tools/verify_exit_status.d.ts +5 -0
- package/dist/tools/verify_exit_status.d.ts.map +1 -0
- package/dist/tools/verify_exit_status.js +39 -0
- package/dist/tools/verify_exit_status.js.map +1 -0
- package/dist/types.d.ts +126 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +34 -0
- package/dist/types.js.map +1 -0
- package/dist/util/hashing.d.ts +33 -0
- package/dist/util/hashing.d.ts.map +1 -0
- package/dist/util/hashing.js +38 -0
- package/dist/util/hashing.js.map +1 -0
- package/dist/util/time.d.ts +43 -0
- package/dist/util/time.d.ts.map +1 -0
- package/dist/util/time.js +55 -0
- package/dist/util/time.js.map +1 -0
- package/package.json +78 -0
- package/src/cli-tool-generator.ts +287 -0
- package/src/cli.ts +109 -0
- package/src/contracts/space-info.ts +41 -0
- package/src/fleet/index.ts +8 -0
- package/src/fleet/manager.ts +140 -0
- package/src/fleet/resolve.ts +187 -0
- package/src/fleet/send.ts +112 -0
- package/src/helpers/index.ts +59 -0
- package/src/index.ts +181 -0
- package/src/planet/acquire.ts +41 -0
- package/src/planet/exit.ts +71 -0
- package/src/planet/index.ts +6 -0
- package/src/planet/manager.ts +335 -0
- package/src/storage/interface.ts +111 -0
- package/src/storage/json-storage.ts +184 -0
- package/src/tools/acquire_planets.ts +81 -0
- package/src/tools/exit_planets.ts +35 -0
- package/src/tools/get_my_planets.ts +30 -0
- package/src/tools/get_pending_exits.ts +37 -0
- package/src/tools/get_pending_fleets.ts +41 -0
- package/src/tools/get_planets_around.ts +44 -0
- package/src/tools/index.ts +10 -0
- package/src/tools/resolve_fleet.ts +37 -0
- package/src/tools/send_fleet.ts +68 -0
- package/src/tools/verify_exit_status.ts +43 -0
- package/src/types.ts +178 -0
- package/src/util/hashing.ts +60 -0
- package/src/util/time.ts +66 -0
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
import { zeroAddress } from 'viem';
|
|
2
|
+
import { acquirePlanets } from './acquire.js';
|
|
3
|
+
import { exitPlanets } from './exit.js';
|
|
4
|
+
/**
|
|
5
|
+
* PlanetManager manages planet-related operations in the Conquest game
|
|
6
|
+
* including acquiring new planets and initiating exit processes
|
|
7
|
+
*/
|
|
8
|
+
export class PlanetManager {
|
|
9
|
+
clients;
|
|
10
|
+
gameContract;
|
|
11
|
+
spaceInfo;
|
|
12
|
+
contractConfig;
|
|
13
|
+
storage;
|
|
14
|
+
constructor(clients, gameContract, spaceInfo, contractConfig, storage) {
|
|
15
|
+
this.clients = clients;
|
|
16
|
+
this.gameContract = gameContract;
|
|
17
|
+
this.spaceInfo = spaceInfo;
|
|
18
|
+
this.contractConfig = contractConfig;
|
|
19
|
+
this.storage = storage;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Ensure walletClient is available for operations that require it
|
|
23
|
+
*/
|
|
24
|
+
requireWalletClient() {
|
|
25
|
+
if (!this.clients.walletClient) {
|
|
26
|
+
throw new Error('Wallet client is required for this operation. Please provide a PRIVATE_KEY environment variable.');
|
|
27
|
+
}
|
|
28
|
+
return this.clients;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Acquire (stake) multiple planets
|
|
32
|
+
*/
|
|
33
|
+
async acquire(planetIds, amountToMint, tokenAmount) {
|
|
34
|
+
return acquirePlanets(this.requireWalletClient(), this.gameContract, planetIds, amountToMint, tokenAmount);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Acquire (stake) multiple planets with automatic cost calculation
|
|
38
|
+
*/
|
|
39
|
+
async acquireWithAutoCalc(planetIds) {
|
|
40
|
+
const costs = this.calculateAcquisitionCosts(planetIds);
|
|
41
|
+
const result = await acquirePlanets(this.requireWalletClient(), this.gameContract, planetIds, costs.amountToMint, costs.tokenAmount);
|
|
42
|
+
return { ...result, costs };
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Calculate acquisition costs for planets based on their stats
|
|
46
|
+
*
|
|
47
|
+
* @param planetIds - Array of planet location IDs
|
|
48
|
+
* @returns Object with total amountToMint and tokenAmount
|
|
49
|
+
*/
|
|
50
|
+
calculateAcquisitionCosts(planetIds) {
|
|
51
|
+
const DECIMAL_14 = 100000000000000n;
|
|
52
|
+
let totalTokenAmount = 0n;
|
|
53
|
+
for (const planetId of planetIds) {
|
|
54
|
+
const planet = this.getPlanetInfo(planetId);
|
|
55
|
+
if (!planet) {
|
|
56
|
+
throw new Error(`Planet ${planetId} not found`);
|
|
57
|
+
}
|
|
58
|
+
// Use the planet's stake value from its statistics
|
|
59
|
+
// Multiply by DECIMAL_14 as the contract does
|
|
60
|
+
totalTokenAmount += BigInt(planet.stats.stake) * DECIMAL_14;
|
|
61
|
+
}
|
|
62
|
+
const amountToMint = totalTokenAmount;
|
|
63
|
+
// When using native token, we set tokenAmount to 0
|
|
64
|
+
return { amountToMint, tokenAmount: 0n };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Exit (unstake) multiple planets
|
|
68
|
+
*/
|
|
69
|
+
async exit(planetIds) {
|
|
70
|
+
return exitPlanets(this.requireWalletClient(), this.gameContract, planetIds, this.contractConfig.exitDuration, this.storage);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Get planet info by location ID
|
|
74
|
+
*/
|
|
75
|
+
getPlanetInfo(planetId) {
|
|
76
|
+
return this.spaceInfo.getPlanetInfoViaId(planetId);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get planet ID by x,y coordinates
|
|
80
|
+
* @param x - X coordinate
|
|
81
|
+
* @param y - Y coordinate
|
|
82
|
+
* @returns Planet location ID as bigint, or undefined if no planet exists at coordinates
|
|
83
|
+
*/
|
|
84
|
+
getPlanetIdByCoordinates(x, y) {
|
|
85
|
+
const planet = this.spaceInfo.getPlanetInfo(x, y);
|
|
86
|
+
return planet?.location.id;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get multiple planet infos
|
|
90
|
+
*/
|
|
91
|
+
getPlanetInfos(planetIds) {
|
|
92
|
+
return planetIds.map((id) => this.getPlanetInfo(id));
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Get planets around a center point within a radius
|
|
96
|
+
*/
|
|
97
|
+
async getPlanetsAround(centerX, centerY, radius) {
|
|
98
|
+
// Get planet infos from SpaceInfo within the bounding box
|
|
99
|
+
const planetsInRect = [];
|
|
100
|
+
for (const planet of this.spaceInfo.yieldPlanetsFromRect(centerX - radius, centerY - radius, centerX + radius, centerY + radius)) {
|
|
101
|
+
// Calculate actual distance to filter by radius
|
|
102
|
+
const dx = planet.location.x - centerX;
|
|
103
|
+
const dy = planet.location.y - centerY;
|
|
104
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
105
|
+
if (distance <= radius) {
|
|
106
|
+
planetsInRect.push(planet);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Batch query contract for planet states
|
|
110
|
+
const planetIds = planetsInRect.map((p) => p.location.id);
|
|
111
|
+
const result = await this.clients.publicClient.readContract({
|
|
112
|
+
address: this.gameContract.address,
|
|
113
|
+
abi: this.gameContract.abi,
|
|
114
|
+
functionName: 'getPlanetStates',
|
|
115
|
+
args: [planetIds],
|
|
116
|
+
});
|
|
117
|
+
const states = result[0];
|
|
118
|
+
// Get current time for computing latest state
|
|
119
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
120
|
+
// Combine info with states and compute latest state
|
|
121
|
+
return planetsInRect.map((planet, index) => {
|
|
122
|
+
const rawState = states[index];
|
|
123
|
+
// Create a mutable copy of the state to compute updates
|
|
124
|
+
const stateCopy = {
|
|
125
|
+
owner: rawState.owner === zeroAddress ? undefined : rawState.owner,
|
|
126
|
+
ownerYakuzaSubscriptionEndTime: 0, // TODO
|
|
127
|
+
lastUpdatedSaved: rawState.lastUpdated,
|
|
128
|
+
startExitTime: rawState.exitStartTime,
|
|
129
|
+
numSpaceships: rawState.numSpaceships,
|
|
130
|
+
flagTime: 0, // TODO
|
|
131
|
+
travelingUpkeep: 0, // TODO
|
|
132
|
+
overflow: 0, // TODO
|
|
133
|
+
active: rawState.active,
|
|
134
|
+
exiting: false, // will be populated
|
|
135
|
+
exitTimeLeft: 0, // will be populated
|
|
136
|
+
natives: false, // will be populated
|
|
137
|
+
capturing: false, // will be populated
|
|
138
|
+
inReach: false, // will be populated
|
|
139
|
+
rewardGiver: '', // will be populated
|
|
140
|
+
metadata: {},
|
|
141
|
+
};
|
|
142
|
+
// Compute the latest state using SpaceInfo
|
|
143
|
+
this.spaceInfo.computePlanetUpdateForTimeElapsed(stateCopy, planet, currentTime);
|
|
144
|
+
return {
|
|
145
|
+
info: planet,
|
|
146
|
+
state: stateCopy,
|
|
147
|
+
};
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Get my planets (owned by the current wallet)
|
|
152
|
+
*/
|
|
153
|
+
async getMyPlanets(radius = 100) {
|
|
154
|
+
const sender = this.requireWalletClient().walletClient.account.address;
|
|
155
|
+
// For now, use a simple approach: get all planets in area and filter by owner
|
|
156
|
+
// A better approach would be to use an index or The Graph
|
|
157
|
+
const planetsInRect = [];
|
|
158
|
+
// Get planets from 0,0 out to radius
|
|
159
|
+
for (const planet of this.spaceInfo.yieldPlanetsFromRect(-radius, -radius, radius, radius)) {
|
|
160
|
+
planetsInRect.push(planet);
|
|
161
|
+
}
|
|
162
|
+
// Batch query contract for planet states
|
|
163
|
+
const planetIds = planetsInRect.map((p) => p.location.id);
|
|
164
|
+
const result = await this.clients.publicClient.readContract({
|
|
165
|
+
address: this.gameContract.address,
|
|
166
|
+
abi: this.gameContract.abi,
|
|
167
|
+
functionName: 'getPlanetStates',
|
|
168
|
+
args: [planetIds],
|
|
169
|
+
});
|
|
170
|
+
const states = result[0];
|
|
171
|
+
// Get current time for computing latest state
|
|
172
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
173
|
+
// Filter by owner and compute latest state
|
|
174
|
+
const myPlanets = [];
|
|
175
|
+
for (let i = 0; i < planetsInRect.length; i++) {
|
|
176
|
+
const rawState = states[i];
|
|
177
|
+
if (rawState && rawState.owner && rawState.owner.toLowerCase() === sender.toLowerCase()) {
|
|
178
|
+
// Create a mutable copy of the state to compute updates
|
|
179
|
+
const stateCopy = { ...rawState };
|
|
180
|
+
// Compute the latest state using SpaceInfo
|
|
181
|
+
this.spaceInfo.computePlanetUpdateForTimeElapsed(stateCopy, planetsInRect[i], currentTime);
|
|
182
|
+
myPlanets.push({ info: planetsInRect[i], state: stateCopy });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return myPlanets;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Get pending exits for the current player
|
|
189
|
+
*/
|
|
190
|
+
async getMyPendingExits() {
|
|
191
|
+
const sender = this.requireWalletClient().walletClient.account.address;
|
|
192
|
+
return this.storage.getPendingExitsByPlayer(sender);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Verify exit status for a planet
|
|
196
|
+
*/
|
|
197
|
+
async verifyExitStatus(planetId) {
|
|
198
|
+
const exit = await this.storage.getPendingExit(planetId);
|
|
199
|
+
if (!exit) {
|
|
200
|
+
throw new Error(`No pending exit found for planet ${planetId}`);
|
|
201
|
+
}
|
|
202
|
+
// Query contract for current planet state
|
|
203
|
+
const result = await this.clients.publicClient.readContract({
|
|
204
|
+
...this.gameContract,
|
|
205
|
+
functionName: 'getPlanetStates',
|
|
206
|
+
args: [[planetId]],
|
|
207
|
+
});
|
|
208
|
+
const states = result[0];
|
|
209
|
+
if (states.length === 0) {
|
|
210
|
+
throw new Error(`Could not get planet state for ${planetId}`);
|
|
211
|
+
}
|
|
212
|
+
const currentState = states[0];
|
|
213
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
214
|
+
// Check if exit was interrupted by an attack
|
|
215
|
+
let interrupted = false;
|
|
216
|
+
if (currentState.owner && currentState.owner.toLowerCase() !== exit.player.toLowerCase()) {
|
|
217
|
+
interrupted = true;
|
|
218
|
+
await this.storage.markExitInterrupted(planetId, currentTime, currentState.owner);
|
|
219
|
+
}
|
|
220
|
+
// Check if exit is complete
|
|
221
|
+
if (!currentState.active && currentTime >= exit.exitCompleteTime) {
|
|
222
|
+
await this.storage.markExitCompleted(planetId, currentTime);
|
|
223
|
+
}
|
|
224
|
+
const updatedExit = await this.storage.getPendingExit(planetId);
|
|
225
|
+
if (!updatedExit) {
|
|
226
|
+
throw new Error('Exit was cleaned up during verification');
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
exit: updatedExit,
|
|
230
|
+
interrupted,
|
|
231
|
+
newOwner: currentState.owner,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Clean up old completed exits
|
|
236
|
+
*/
|
|
237
|
+
async cleanupOldCompletedExits(olderThanDays = 7) {
|
|
238
|
+
const olderThan = Math.floor(Date.now() / 1000) - olderThanDays * 24 * 60 * 60;
|
|
239
|
+
await this.storage.cleanupOldCompletedExits(olderThan);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Calculate distance between two planets
|
|
243
|
+
*/
|
|
244
|
+
calculateDistance(fromPlanetId, toPlanetId) {
|
|
245
|
+
const fromPlanet = this.getPlanetInfo(fromPlanetId);
|
|
246
|
+
const toPlanet = this.getPlanetInfo(toPlanetId);
|
|
247
|
+
if (!fromPlanet || !toPlanet) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
return this.spaceInfo.distance(fromPlanet, toPlanet);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/planet/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
import { PendingExit, PendingFleet } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Storage interface for managing fleets and planet exits
|
|
5
|
+
* Provides methods to persist and retrieve game state data
|
|
6
|
+
*/
|
|
7
|
+
export interface FleetStorage {
|
|
8
|
+
/**
|
|
9
|
+
* Save a pending fleet to storage
|
|
10
|
+
* @param fleet - The fleet to save
|
|
11
|
+
*/
|
|
12
|
+
saveFleet(fleet: PendingFleet): Promise<void>;
|
|
13
|
+
/**
|
|
14
|
+
* Retrieve a fleet by its ID
|
|
15
|
+
* @param fleetId - The fleet ID to retrieve
|
|
16
|
+
* @returns The fleet or null if not found
|
|
17
|
+
*/
|
|
18
|
+
getFleet(fleetId: string): Promise<PendingFleet | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Get all pending fleets for a specific sender
|
|
21
|
+
* @param sender - The address of the fleet sender
|
|
22
|
+
* @returns Array of pending fleets
|
|
23
|
+
*/
|
|
24
|
+
getPendingFleetsBySender(sender: Address): Promise<PendingFleet[]>;
|
|
25
|
+
/**
|
|
26
|
+
* Get all fleets that can be resolved (not yet resolved)
|
|
27
|
+
* @returns Array of resolvable fleets
|
|
28
|
+
*/
|
|
29
|
+
getResolvableFleets(): Promise<PendingFleet[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Mark a fleet as resolved
|
|
32
|
+
* @param fleetId - The fleet ID to mark as resolved
|
|
33
|
+
* @param resolvedAt - The timestamp when the fleet was resolved
|
|
34
|
+
*/
|
|
35
|
+
markResolved(fleetId: string, resolvedAt: number): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Clean up old resolved fleets from storage
|
|
38
|
+
* @param olderThan - Unix timestamp; fleets resolved before this time will be removed
|
|
39
|
+
*/
|
|
40
|
+
cleanupOldResolvedFleets(olderThan: number): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Get all fleets in storage
|
|
43
|
+
* @returns Array of all fleets
|
|
44
|
+
*/
|
|
45
|
+
getAllFleets(): Promise<PendingFleet[]>;
|
|
46
|
+
/**
|
|
47
|
+
* Save a pending exit to storage
|
|
48
|
+
* @param exit - The exit to save
|
|
49
|
+
*/
|
|
50
|
+
savePendingExit(exit: PendingExit): Promise<void>;
|
|
51
|
+
/**
|
|
52
|
+
* Retrieve a pending exit by planet ID
|
|
53
|
+
* @param planetId - The planet location ID
|
|
54
|
+
* @returns The pending exit or null if not found
|
|
55
|
+
*/
|
|
56
|
+
getPendingExit(planetId: bigint): Promise<PendingExit | null>;
|
|
57
|
+
/**
|
|
58
|
+
* Get all pending exits for a specific player
|
|
59
|
+
* @param player - The address of the player
|
|
60
|
+
* @returns Array of pending exits
|
|
61
|
+
*/
|
|
62
|
+
getPendingExitsByPlayer(player: Address): Promise<PendingExit[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Update the status of a pending exit
|
|
65
|
+
* @param planetId - The planet location ID
|
|
66
|
+
* @param updates - Partial updates to apply to the exit record
|
|
67
|
+
*/
|
|
68
|
+
updateExitStatus(planetId: bigint, updates: Partial<PendingExit>): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Mark an exit as completed
|
|
71
|
+
* @param planetId - The planet location ID
|
|
72
|
+
* @param completedAt - The timestamp when the exit completed
|
|
73
|
+
*/
|
|
74
|
+
markExitCompleted(planetId: bigint, completedAt: number): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Mark an exit as interrupted by an attack
|
|
77
|
+
* @param planetId - The planet location ID
|
|
78
|
+
* @param interruptedAt - The timestamp when the exit was interrupted
|
|
79
|
+
* @param newOwner - The address of the new owner who interrupted the exit
|
|
80
|
+
*/
|
|
81
|
+
markExitInterrupted(planetId: bigint, interruptedAt: number, newOwner: Address): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Clean up old completed exits from storage
|
|
84
|
+
* @param olderThan - Unix timestamp; exits completed before this time will be removed
|
|
85
|
+
*/
|
|
86
|
+
cleanupOldCompletedExits(olderThan: number): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Get all pending exits in storage
|
|
89
|
+
* @returns Array of all pending exits
|
|
90
|
+
*/
|
|
91
|
+
getAllPendingExits(): Promise<PendingExit[]>;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.d.ts","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAClC,OAAO,EAAC,WAAW,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAEtD;;;GAGG;AACH,MAAM,WAAW,YAAY;IAG5B;;;OAGG;IACH,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAExD;;;;OAIG;IACH,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEnE;;;OAGG;IACH,mBAAmB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAE/C;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;;OAGG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;OAGG;IACH,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAIxC;;;OAGG;IACH,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAElD;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAE9D;;;;OAIG;IACH,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEjE;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjF;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAExE;;;;;OAKG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE/F;;;OAGG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3D;;;OAGG;IACH,kBAAkB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAC7C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interface.js","sourceRoot":"","sources":["../../src/storage/interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Address } from 'viem';
|
|
2
|
+
import type { FleetStorage } from './interface.js';
|
|
3
|
+
import { PendingExit, PendingFleet } from '../types.js';
|
|
4
|
+
export declare class JsonFleetStorage implements FleetStorage {
|
|
5
|
+
private dataPath;
|
|
6
|
+
private data;
|
|
7
|
+
private initialized;
|
|
8
|
+
constructor(dataDir?: string);
|
|
9
|
+
initialize(): Promise<void>;
|
|
10
|
+
private ensureInitialized;
|
|
11
|
+
private save;
|
|
12
|
+
saveFleet(fleet: PendingFleet): Promise<void>;
|
|
13
|
+
getFleet(fleetId: string): Promise<PendingFleet | null>;
|
|
14
|
+
getPendingFleetsBySender(sender: Address): Promise<PendingFleet[]>;
|
|
15
|
+
getResolvableFleets(): Promise<PendingFleet[]>;
|
|
16
|
+
markResolved(fleetId: string, resolvedAt: number): Promise<void>;
|
|
17
|
+
cleanupOldResolvedFleets(olderThan: number): Promise<void>;
|
|
18
|
+
getAllFleets(): Promise<PendingFleet[]>;
|
|
19
|
+
savePendingExit(exit: PendingExit): Promise<void>;
|
|
20
|
+
getPendingExit(planetId: bigint): Promise<PendingExit | null>;
|
|
21
|
+
getPendingExitsByPlayer(player: Address): Promise<PendingExit[]>;
|
|
22
|
+
updateExitStatus(planetId: bigint, updates: Partial<PendingExit>): Promise<void>;
|
|
23
|
+
markExitCompleted(planetId: bigint, completedAt: number): Promise<void>;
|
|
24
|
+
markExitInterrupted(planetId: bigint, interruptedAt: number, newOwner: Address): Promise<void>;
|
|
25
|
+
cleanupOldCompletedExits(olderThan: number): Promise<void>;
|
|
26
|
+
getAllPendingExits(): Promise<PendingExit[]>;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=json-storage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-storage.d.ts","sourceRoot":"","sources":["../../src/storage/json-storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAClC,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAC,WAAW,EAAE,YAAY,EAAC,MAAM,aAAa,CAAC;AAQtD,qBAAa,gBAAiB,YAAW,YAAY;IACpD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,MAAiB;IAKhC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YA4BnB,iBAAiB;YAMjB,IAAI;IAKZ,SAAS,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM7C,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKvD,wBAAwB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAOlE,mBAAmB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAQ9C,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhE,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1D,YAAY,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAMvC,eAAe,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMjD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAK7D,uBAAuB,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAOhE,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAShF,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvE,mBAAmB,CACxB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC;IAWV,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY1D,kBAAkB,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;CAIlD"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { promises as fs } from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { stringifyWithBigInt } from '../helpers/index.js';
|
|
4
|
+
export class JsonFleetStorage {
|
|
5
|
+
dataPath;
|
|
6
|
+
data;
|
|
7
|
+
initialized = false;
|
|
8
|
+
constructor(dataDir = './data') {
|
|
9
|
+
this.dataPath = path.join(dataDir, 'conquest-data.json');
|
|
10
|
+
this.data = { fleets: {}, exits: {} };
|
|
11
|
+
}
|
|
12
|
+
async initialize() {
|
|
13
|
+
if (this.initialized) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
// Load from disk or create new
|
|
17
|
+
try {
|
|
18
|
+
await fs.mkdir(path.dirname(this.dataPath), { recursive: true });
|
|
19
|
+
const content = await fs.readFile(this.dataPath, 'utf-8');
|
|
20
|
+
const data = JSON.parse(content);
|
|
21
|
+
// Convert BigInt strings back to BigInt
|
|
22
|
+
for (const fleetId in data.fleets) {
|
|
23
|
+
const fleet = data.fleets[fleetId];
|
|
24
|
+
fleet.fromPlanetId = BigInt(fleet.fromPlanetId);
|
|
25
|
+
fleet.toPlanetId = BigInt(fleet.toPlanetId);
|
|
26
|
+
fleet.arrivalTimeWanted = BigInt(fleet.arrivalTimeWanted);
|
|
27
|
+
}
|
|
28
|
+
for (const planetId in data.exits) {
|
|
29
|
+
const exit = data.exits[planetId];
|
|
30
|
+
exit.planetId = BigInt(exit.planetId);
|
|
31
|
+
}
|
|
32
|
+
this.data = data;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
// File doesn't exist, create new
|
|
36
|
+
await this.save();
|
|
37
|
+
}
|
|
38
|
+
this.initialized = true;
|
|
39
|
+
}
|
|
40
|
+
async ensureInitialized() {
|
|
41
|
+
if (!this.initialized) {
|
|
42
|
+
await this.initialize();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
async save() {
|
|
46
|
+
await fs.writeFile(this.dataPath, stringifyWithBigInt(this.data, 2));
|
|
47
|
+
}
|
|
48
|
+
// Fleet operations
|
|
49
|
+
async saveFleet(fleet) {
|
|
50
|
+
await this.ensureInitialized();
|
|
51
|
+
this.data.fleets[fleet.fleetId] = fleet;
|
|
52
|
+
await this.save();
|
|
53
|
+
}
|
|
54
|
+
async getFleet(fleetId) {
|
|
55
|
+
await this.ensureInitialized();
|
|
56
|
+
return this.data.fleets[fleetId] || null;
|
|
57
|
+
}
|
|
58
|
+
async getPendingFleetsBySender(sender) {
|
|
59
|
+
await this.ensureInitialized();
|
|
60
|
+
return Object.values(this.data.fleets).filter((fleet) => fleet.fleetSender.toLowerCase() === sender.toLowerCase() && !fleet.resolved);
|
|
61
|
+
}
|
|
62
|
+
async getResolvableFleets() {
|
|
63
|
+
await this.ensureInitialized();
|
|
64
|
+
const now = Math.floor(Date.now() / 1000);
|
|
65
|
+
return Object.values(this.data.fleets).filter((fleet) => !fleet.resolved && fleet.estimatedArrivalTime <= now);
|
|
66
|
+
}
|
|
67
|
+
async markResolved(fleetId, resolvedAt) {
|
|
68
|
+
await this.ensureInitialized();
|
|
69
|
+
const fleet = this.data.fleets[fleetId];
|
|
70
|
+
if (fleet) {
|
|
71
|
+
fleet.resolved = true;
|
|
72
|
+
fleet.resolvedAt = resolvedAt;
|
|
73
|
+
await this.save();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
async cleanupOldResolvedFleets(olderThan) {
|
|
77
|
+
await this.ensureInitialized();
|
|
78
|
+
const now = Math.floor(Date.now() / 1000);
|
|
79
|
+
for (const fleetId in this.data.fleets) {
|
|
80
|
+
const fleet = this.data.fleets[fleetId];
|
|
81
|
+
if (fleet.resolved && fleet.resolvedAt && fleet.resolvedAt < now - olderThan) {
|
|
82
|
+
delete this.data.fleets[fleetId];
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
await this.save();
|
|
86
|
+
}
|
|
87
|
+
async getAllFleets() {
|
|
88
|
+
await this.ensureInitialized();
|
|
89
|
+
return Object.values(this.data.fleets);
|
|
90
|
+
}
|
|
91
|
+
// Exit operations
|
|
92
|
+
async savePendingExit(exit) {
|
|
93
|
+
await this.ensureInitialized();
|
|
94
|
+
this.data.exits[exit.planetId.toString()] = exit;
|
|
95
|
+
await this.save();
|
|
96
|
+
}
|
|
97
|
+
async getPendingExit(planetId) {
|
|
98
|
+
await this.ensureInitialized();
|
|
99
|
+
return this.data.exits[planetId.toString()] || null;
|
|
100
|
+
}
|
|
101
|
+
async getPendingExitsByPlayer(player) {
|
|
102
|
+
await this.ensureInitialized();
|
|
103
|
+
return Object.values(this.data.exits).filter((exit) => exit.player.toLowerCase() === player.toLowerCase() && !exit.completed);
|
|
104
|
+
}
|
|
105
|
+
async updateExitStatus(planetId, updates) {
|
|
106
|
+
await this.ensureInitialized();
|
|
107
|
+
const exit = this.data.exits[planetId.toString()];
|
|
108
|
+
if (exit) {
|
|
109
|
+
Object.assign(exit, updates);
|
|
110
|
+
await this.save();
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async markExitCompleted(planetId, completedAt) {
|
|
114
|
+
await this.ensureInitialized();
|
|
115
|
+
const exit = this.data.exits[planetId.toString()];
|
|
116
|
+
if (exit) {
|
|
117
|
+
exit.completed = true;
|
|
118
|
+
exit.lastCheckedAt = completedAt;
|
|
119
|
+
await this.save();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async markExitInterrupted(planetId, interruptedAt, newOwner) {
|
|
123
|
+
await this.ensureInitialized();
|
|
124
|
+
const exit = this.data.exits[planetId.toString()];
|
|
125
|
+
if (exit) {
|
|
126
|
+
exit.interrupted = true;
|
|
127
|
+
exit.lastCheckedAt = interruptedAt;
|
|
128
|
+
exit.owner = newOwner;
|
|
129
|
+
await this.save();
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
async cleanupOldCompletedExits(olderThan) {
|
|
133
|
+
await this.ensureInitialized();
|
|
134
|
+
const now = Math.floor(Date.now() / 1000);
|
|
135
|
+
for (const planetId in this.data.exits) {
|
|
136
|
+
const exit = this.data.exits[planetId];
|
|
137
|
+
if (exit.completed && exit.lastCheckedAt < now - olderThan) {
|
|
138
|
+
delete this.data.exits[planetId];
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
await this.save();
|
|
142
|
+
}
|
|
143
|
+
async getAllPendingExits() {
|
|
144
|
+
await this.ensureInitialized();
|
|
145
|
+
return Object.values(this.data.exits);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
//# sourceMappingURL=json-storage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-storage.js","sourceRoot":"","sources":["../../src/storage/json-storage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const acquire_planets: import("../types.js").Tool<z.ZodObject<{
|
|
3
|
+
planetIds: z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>;
|
|
4
|
+
amountToMint: z.ZodOptional<z.ZodNumber>;
|
|
5
|
+
tokenAmount: z.ZodOptional<z.ZodNumber>;
|
|
6
|
+
}, z.core.$strip>>;
|
|
7
|
+
//# sourceMappingURL=acquire_planets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acquire_planets.d.ts","sourceRoot":"","sources":["../../src/tools/acquire_planets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AAItB,eAAO,MAAM,eAAe;;;;kBA4E1B,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { createTool } from '../types.js';
|
|
3
|
+
export const acquire_planets = createTool({
|
|
4
|
+
description: 'Acquire (stake) multiple planets in the Conquest game. This allows you to take ownership of unclaimed planets.',
|
|
5
|
+
schema: z.object({
|
|
6
|
+
planetIds: z
|
|
7
|
+
.array(z.union([z.string(), z.number()]))
|
|
8
|
+
.describe('Array of planet location IDs to acquire (as hex strings or numbers)'),
|
|
9
|
+
amountToMint: z
|
|
10
|
+
.number()
|
|
11
|
+
.optional()
|
|
12
|
+
.describe('Amount of native token to spend to acquire the planets. If not provided, will be calculated automatically based on planet stats.'),
|
|
13
|
+
tokenAmount: z
|
|
14
|
+
.number()
|
|
15
|
+
.optional()
|
|
16
|
+
.describe('Amount of staking token to spend to acquire the planets. If not provided, will be calculated automatically based on planet stats.'),
|
|
17
|
+
}),
|
|
18
|
+
execute: async (env, { planetIds, amountToMint, tokenAmount }) => {
|
|
19
|
+
try {
|
|
20
|
+
// Convert planet IDs to BigInt
|
|
21
|
+
const planetIdsBigInt = planetIds.map((id) => typeof id === 'string' ? BigInt(id) : BigInt(id));
|
|
22
|
+
let result;
|
|
23
|
+
// If BOTH amounts are provided, use them; otherwise use auto-calculation
|
|
24
|
+
if (amountToMint !== undefined && tokenAmount !== undefined) {
|
|
25
|
+
// Use provided amounts
|
|
26
|
+
// TODO decimal handling, for now BigInt()
|
|
27
|
+
const acquireResult = await env.planetManager.acquire(planetIdsBigInt, BigInt(amountToMint), BigInt(tokenAmount));
|
|
28
|
+
result = {
|
|
29
|
+
hash: acquireResult.hash,
|
|
30
|
+
planetsAcquired: acquireResult.planetsAcquired,
|
|
31
|
+
amountToMint: BigInt(amountToMint),
|
|
32
|
+
tokenAmount: BigInt(tokenAmount),
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
// Use auto-calculation
|
|
37
|
+
const autoResult = await env.planetManager.acquireWithAutoCalc(planetIdsBigInt);
|
|
38
|
+
result = {
|
|
39
|
+
hash: autoResult.hash,
|
|
40
|
+
planetsAcquired: autoResult.planetsAcquired,
|
|
41
|
+
amountToMint: autoResult.costs.amountToMint,
|
|
42
|
+
tokenAmount: autoResult.costs.tokenAmount,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return {
|
|
46
|
+
success: true,
|
|
47
|
+
result: {
|
|
48
|
+
transactionHash: result.hash,
|
|
49
|
+
planetsAcquired: result.planetsAcquired,
|
|
50
|
+
amountToMint: result.amountToMint,
|
|
51
|
+
tokenAmount: result.tokenAmount,
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
return {
|
|
57
|
+
success: false,
|
|
58
|
+
error: error instanceof Error ? error.message : String(error),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=acquire_planets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"acquire_planets.js","sourceRoot":"","sources":["../../src/tools/acquire_planets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,CAAC,EAAC,MAAM,KAAK,CAAC;AACtB,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AAGvC,MAAM,CAAC,MAAM,eAAe,GAAG,UAAU,CAAC;IACzC,WAAW,EACV,gHAAgH;IACjH,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,SAAS,EAAE,CAAC;aACV,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;aACxC,QAAQ,CAAC,qEAAqE,CAAC;QACjF,YAAY,EAAE,CAAC;aACb,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACR,kIAAkI,CAClI;QACF,WAAW,EAAE,CAAC;aACZ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACR,mIAAmI,CACnI;KACF,CAAC;IACF,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAC,SAAS,EAAE,YAAY,EAAE,WAAW,EAAC,EAAE,EAAE;QAC9D,IAAI,CAAC;YACJ,+BAA+B;YAC/B,MAAM,eAAe,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAC5C,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAChD,CAAC;YAEF,IAAI,MAKH,CAAC;YAEF,yEAAyE;YACzE,IAAI,YAAY,KAAK,SAAS,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC7D,uBAAuB;gBACvB,0CAA0C;gBAC1C,MAAM,aAAa,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,OAAO,CACpD,eAAe,EACf,MAAM,CAAC,YAAY,CAAC,EACpB,MAAM,CAAC,WAAW,CAAC,CACnB,CAAC;gBACF,MAAM,GAAG;oBACR,IAAI,EAAE,aAAa,CAAC,IAAI;oBACxB,eAAe,EAAE,aAAa,CAAC,eAAe;oBAC9C,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;oBAClC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;iBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACP,uBAAuB;gBACvB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;gBAChF,MAAM,GAAG;oBACR,IAAI,EAAE,UAAU,CAAC,IAAI;oBACrB,eAAe,EAAE,UAAU,CAAC,eAAe;oBAC3C,YAAY,EAAE,UAAU,CAAC,KAAK,CAAC,YAAY;oBAC3C,WAAW,EAAE,UAAU,CAAC,KAAK,CAAC,WAAW;iBACzC,CAAC;YACH,CAAC;YAED,OAAO;gBACN,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACP,eAAe,EAAE,MAAM,CAAC,IAAI;oBAC5B,eAAe,EAAE,MAAM,CAAC,eAAe;oBACvC,YAAY,EAAE,MAAM,CAAC,YAAY;oBACjC,WAAW,EAAE,MAAM,CAAC,WAAW;iBAC/B;aACD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO;gBACN,OAAO,EAAE,KAAK;gBACd,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC;QACH,CAAC;IACF,CAAC;CACD,CAAC,CAAC"}
|