@colin999n9/gworld-agent 0.1.0-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 +127 -0
- package/dist/cli.d.ts +12 -0
- package/dist/cli.js +256 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-installer.d.ts +20 -0
- package/dist/client-installer.js +48 -0
- package/dist/client-installer.js.map +1 -0
- package/dist/config.d.ts +37 -0
- package/dist/config.js +184 -0
- package/dist/config.js.map +1 -0
- package/dist/data/indexer-client.d.ts +34 -0
- package/dist/data/indexer-client.js +172 -0
- package/dist/data/indexer-client.js.map +1 -0
- package/dist/data/rpc-reader.d.ts +69 -0
- package/dist/data/rpc-reader.js +163 -0
- package/dist/data/rpc-reader.js.map +1 -0
- package/dist/domain.d.ts +204 -0
- package/dist/domain.js +2 -0
- package/dist/domain.js.map +1 -0
- package/dist/errors.d.ts +10 -0
- package/dist/errors.js +16 -0
- package/dist/errors.js.map +1 -0
- package/dist/factory.d.ts +4 -0
- package/dist/factory.js +25 -0
- package/dist/factory.js.map +1 -0
- package/dist/fs.d.ts +3 -0
- package/dist/fs.js +35 -0
- package/dist/fs.js.map +1 -0
- package/dist/generated/abis.d.ts +7446 -0
- package/dist/generated/abis.js +4861 -0
- package/dist/generated/abis.js.map +1 -0
- package/dist/generated/deployments.d.ts +145 -0
- package/dist/generated/deployments.js +150 -0
- package/dist/generated/deployments.js.map +1 -0
- package/dist/generated/protocol.d.ts +165 -0
- package/dist/generated/protocol.js +132 -0
- package/dist/generated/protocol.js.map +1 -0
- package/dist/geometry.d.ts +24 -0
- package/dist/geometry.js +31 -0
- package/dist/geometry.js.map +1 -0
- package/dist/json.d.ts +3 -0
- package/dist/json.js +14 -0
- package/dist/json.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +134 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/stdio.d.ts +2 -0
- package/dist/mcp/stdio.js +23 -0
- package/dist/mcp/stdio.js.map +1 -0
- package/dist/runner/audit-store.d.ts +27 -0
- package/dist/runner/audit-store.js +61 -0
- package/dist/runner/audit-store.js.map +1 -0
- package/dist/runner/file-state.d.ts +7 -0
- package/dist/runner/file-state.js +23 -0
- package/dist/runner/file-state.js.map +1 -0
- package/dist/runner/legal-actions.d.ts +22 -0
- package/dist/runner/legal-actions.js +171 -0
- package/dist/runner/legal-actions.js.map +1 -0
- package/dist/runner/observation.d.ts +12 -0
- package/dist/runner/observation.js +47 -0
- package/dist/runner/observation.js.map +1 -0
- package/dist/runner/policy.d.ts +10 -0
- package/dist/runner/policy.js +68 -0
- package/dist/runner/policy.js.map +1 -0
- package/dist/runner/runtime.d.ts +73 -0
- package/dist/runner/runtime.js +236 -0
- package/dist/runner/runtime.js.map +1 -0
- package/dist/runner/strategy.d.ts +2 -0
- package/dist/runner/strategy.js +19 -0
- package/dist/runner/strategy.js.map +1 -0
- package/dist/runner/transaction-executor.d.ts +58 -0
- package/dist/runner/transaction-executor.js +114 -0
- package/dist/runner/transaction-executor.js.map +1 -0
- package/dist/runner/writer-lock.d.ts +14 -0
- package/dist/runner/writer-lock.js +81 -0
- package/dist/runner/writer-lock.js.map +1 -0
- package/dist/wallet/keystore.d.ts +18 -0
- package/dist/wallet/keystore.js +111 -0
- package/dist/wallet/keystore.js.map +1 -0
- package/dist/wallet/password-store.d.ts +27 -0
- package/dist/wallet/password-store.js +118 -0
- package/dist/wallet/password-store.js.map +1 -0
- package/package.json +41 -0
- package/skill/gworld/SKILL.md +58 -0
- package/skill/gworld/references/rules.md +33 -0
- package/skill/gworld/references/troubleshooting.md +22 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/runner/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
const PRIORITY = {
|
|
2
|
+
continueFragmentResolution: 0,
|
|
3
|
+
checkin: 1,
|
|
4
|
+
claimMarket: 2,
|
|
5
|
+
finalizeMarket: 3,
|
|
6
|
+
settleMarket: 4,
|
|
7
|
+
requestMarket: 5,
|
|
8
|
+
claim: 6,
|
|
9
|
+
reinforce: 7,
|
|
10
|
+
move: 8,
|
|
11
|
+
bet: 9,
|
|
12
|
+
attack: 10,
|
|
13
|
+
};
|
|
14
|
+
export function conservativeAction(actions) {
|
|
15
|
+
return [...actions]
|
|
16
|
+
.filter((action) => action.risk === 'low')
|
|
17
|
+
.sort((left, right) => PRIORITY[left.action.kind] - PRIORITY[right.action.kind] || left.actionId.localeCompare(right.actionId))[0] ?? null;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=strategy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.js","sourceRoot":"","sources":["../../src/runner/strategy.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAkD;IAC9D,0BAA0B,EAAE,CAAC;IAC7B,OAAO,EAAE,CAAC;IACV,WAAW,EAAE,CAAC;IACd,cAAc,EAAE,CAAC;IACjB,YAAY,EAAE,CAAC;IACf,aAAa,EAAE,CAAC;IAChB,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,CAAC;IACZ,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,EAAE;CACX,CAAC;AAEF,MAAM,UAAU,kBAAkB,CAAC,OAAsB;IACvD,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC;SACzC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AAC/I,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Abi } from 'viem';
|
|
2
|
+
import type { Address, GameAction, Hash, TransactionResult } from '../domain.js';
|
|
3
|
+
import type { AgentIndexerClient } from '../data/indexer-client.js';
|
|
4
|
+
import type { AgentRpcReader } from '../data/rpc-reader.js';
|
|
5
|
+
import { type WriterLock } from './writer-lock.js';
|
|
6
|
+
type ContractRequest = {
|
|
7
|
+
address: Address;
|
|
8
|
+
abi: Abi;
|
|
9
|
+
functionName: string;
|
|
10
|
+
args?: readonly unknown[];
|
|
11
|
+
value?: bigint;
|
|
12
|
+
account: Address;
|
|
13
|
+
};
|
|
14
|
+
export type ExecutorPublicClient = {
|
|
15
|
+
simulateContract(args: ContractRequest): Promise<{
|
|
16
|
+
request: unknown;
|
|
17
|
+
}>;
|
|
18
|
+
waitForTransactionReceipt(args: {
|
|
19
|
+
hash: Hash;
|
|
20
|
+
confirmations?: number;
|
|
21
|
+
}): Promise<{
|
|
22
|
+
status: 'success' | 'reverted';
|
|
23
|
+
blockNumber: bigint;
|
|
24
|
+
}>;
|
|
25
|
+
};
|
|
26
|
+
export type ExecutorWalletClient = {
|
|
27
|
+
writeContract(request: unknown): Promise<Hash>;
|
|
28
|
+
};
|
|
29
|
+
type LifecycleAction = {
|
|
30
|
+
kind: 'createAgent';
|
|
31
|
+
} | {
|
|
32
|
+
kind: 'refreshSpawnRandomness';
|
|
33
|
+
agentId: bigint;
|
|
34
|
+
} | {
|
|
35
|
+
kind: 'spawnAgent';
|
|
36
|
+
agentId: bigint;
|
|
37
|
+
};
|
|
38
|
+
export type ExecutableAction = GameAction | LifecycleAction;
|
|
39
|
+
export declare class TransactionExecutor {
|
|
40
|
+
private readonly wallet;
|
|
41
|
+
private readonly rpc;
|
|
42
|
+
private readonly indexer;
|
|
43
|
+
private readonly publicClient;
|
|
44
|
+
private readonly walletClient;
|
|
45
|
+
private readonly confirmations;
|
|
46
|
+
private readonly indexingTimeoutMs;
|
|
47
|
+
private readonly writerLock;
|
|
48
|
+
private inFlight;
|
|
49
|
+
constructor(wallet: Address, rpc: AgentRpcReader, indexer: AgentIndexerClient, publicClient: ExecutorPublicClient, walletClient: ExecutorWalletClient, confirmations: number, indexingTimeoutMs: number, writerLock?: WriterLock);
|
|
50
|
+
private steps;
|
|
51
|
+
simulate(action: ExecutableAction): Promise<{
|
|
52
|
+
steps: string[];
|
|
53
|
+
deferredUntilApproval: boolean;
|
|
54
|
+
}>;
|
|
55
|
+
execute(action: ExecutableAction): Promise<TransactionResult>;
|
|
56
|
+
private executeLocked;
|
|
57
|
+
}
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { AgentError } from '../errors.js';
|
|
2
|
+
import { contractAbis } from '../generated/abis.js';
|
|
3
|
+
import { MemoryWriterLock } from './writer-lock.js';
|
|
4
|
+
export class TransactionExecutor {
|
|
5
|
+
wallet;
|
|
6
|
+
rpc;
|
|
7
|
+
indexer;
|
|
8
|
+
publicClient;
|
|
9
|
+
walletClient;
|
|
10
|
+
confirmations;
|
|
11
|
+
indexingTimeoutMs;
|
|
12
|
+
writerLock;
|
|
13
|
+
inFlight = false;
|
|
14
|
+
constructor(wallet, rpc, indexer, publicClient, walletClient, confirmations, indexingTimeoutMs, writerLock = new MemoryWriterLock()) {
|
|
15
|
+
this.wallet = wallet;
|
|
16
|
+
this.rpc = rpc;
|
|
17
|
+
this.indexer = indexer;
|
|
18
|
+
this.publicClient = publicClient;
|
|
19
|
+
this.walletClient = walletClient;
|
|
20
|
+
this.confirmations = confirmations;
|
|
21
|
+
this.indexingTimeoutMs = indexingTimeoutMs;
|
|
22
|
+
this.writerLock = writerLock;
|
|
23
|
+
}
|
|
24
|
+
async steps(action) {
|
|
25
|
+
const modules = await this.rpc.modules();
|
|
26
|
+
switch (action.kind) {
|
|
27
|
+
case 'createAgent': return [{ label: 'create-agent', address: modules.registry, abi: contractAbis.registry, functionName: 'createAgent' }];
|
|
28
|
+
case 'refreshSpawnRandomness': return [{ label: 'refresh-spawn-randomness', address: modules.registry, abi: contractAbis.registry, functionName: 'refreshSpawnRandomness', args: [action.agentId] }];
|
|
29
|
+
case 'spawnAgent': return [{ label: 'spawn-agent', address: modules.world, abi: contractAbis.world, functionName: 'spawnAgent', args: [action.agentId] }];
|
|
30
|
+
case 'checkin': return [{ label: 'check-in', address: modules.ledger, abi: contractAbis.ledger, functionName: 'checkin', args: [action.agentId] }];
|
|
31
|
+
case 'claim': return [{ label: 'claim', address: modules.world, abi: contractAbis.world, functionName: 'claim', args: [action.agentId, action.tileKey] }];
|
|
32
|
+
case 'move': return [{ label: 'move', address: modules.world, abi: contractAbis.world, functionName: 'move', args: [action.agentId, action.expectedFrom, action.path, action.expectedNonce] }];
|
|
33
|
+
case 'attack': return [{ label: 'attack', address: modules.world, abi: contractAbis.world, functionName: 'attack', args: [action.agentId, action.tileKey, action.apCap] }];
|
|
34
|
+
case 'reinforce': return [{ label: 'reinforce', address: modules.world, abi: contractAbis.world, functionName: 'reinforce', args: [action.agentId, action.tileKey, action.apCap] }];
|
|
35
|
+
case 'continueFragmentResolution': return [{ label: 'continue-fragment', address: modules.world, abi: contractAbis.world, functionName: 'continueFragmentResolution', args: [action.agentId, action.maxSteps] }];
|
|
36
|
+
case 'requestMarket': return [{ label: 'request-market', address: modules.market, abi: contractAbis.market, functionName: 'requestMarket' }];
|
|
37
|
+
case 'finalizeMarket': return [{ label: 'finalize-market', address: modules.market, abi: contractAbis.market, functionName: 'finalizeMarket', args: [action.round] }];
|
|
38
|
+
case 'settleMarket': return [{ label: 'settle-market', address: modules.market, abi: contractAbis.market, functionName: 'settle', args: [action.marketId] }];
|
|
39
|
+
case 'claimMarket': return [{ label: 'claim-market', address: modules.market, abi: contractAbis.market, functionName: 'claim', args: [action.marketId] }];
|
|
40
|
+
case 'bet': {
|
|
41
|
+
const payment = await this.rpc.marketPayment(action.marketId, this.wallet);
|
|
42
|
+
const steps = [];
|
|
43
|
+
if (payment.mode === 'erc20' && payment.allowance < action.amountG) {
|
|
44
|
+
steps.push({
|
|
45
|
+
label: 'approve-market-escrow', address: payment.gToken, abi: contractAbis.erc20,
|
|
46
|
+
functionName: 'approve', args: [payment.escrow, action.amountG],
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
steps.push({
|
|
50
|
+
label: 'bet', address: payment.market, abi: contractAbis.market, functionName: 'bet',
|
|
51
|
+
args: [action.marketId, action.agentId, action.optionIndex, action.amountG],
|
|
52
|
+
...(payment.mode === 'native' ? { value: action.amountG } : {}),
|
|
53
|
+
});
|
|
54
|
+
return steps;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async simulate(action) {
|
|
59
|
+
const steps = await this.steps(action);
|
|
60
|
+
const deferredUntilApproval = action.kind === 'bet' && steps.length === 2;
|
|
61
|
+
const simulationSteps = deferredUntilApproval ? steps.slice(0, 1) : steps;
|
|
62
|
+
try {
|
|
63
|
+
for (const step of simulationSteps) {
|
|
64
|
+
await this.publicClient.simulateContract({ ...step, account: this.wallet });
|
|
65
|
+
}
|
|
66
|
+
return { steps: steps.map((step) => step.label), deferredUntilApproval };
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new AgentError('simulation_failed', `Simulation failed for ${action.kind}`, error);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async execute(action) {
|
|
73
|
+
if (this.inFlight)
|
|
74
|
+
throw new AgentError('runner_busy', 'Another transaction is already in flight for this wallet');
|
|
75
|
+
this.inFlight = true;
|
|
76
|
+
try {
|
|
77
|
+
return await this.writerLock.withLock(() => this.executeLocked(action));
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
this.inFlight = false;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async executeLocked(action) {
|
|
84
|
+
const hashes = [];
|
|
85
|
+
let blockNumber = 0n;
|
|
86
|
+
const steps = await this.steps(action);
|
|
87
|
+
for (const step of steps) {
|
|
88
|
+
let request;
|
|
89
|
+
try {
|
|
90
|
+
request = (await this.publicClient.simulateContract({ ...step, account: this.wallet })).request;
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
throw new AgentError('simulation_failed', `Simulation failed at ${step.label}`, error);
|
|
94
|
+
}
|
|
95
|
+
const hash = await this.walletClient.writeContract(request);
|
|
96
|
+
hashes.push(hash);
|
|
97
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash, confirmations: this.confirmations });
|
|
98
|
+
if (receipt.status !== 'success')
|
|
99
|
+
throw new AgentError('transaction_reverted', `Transaction reverted at ${step.label}`);
|
|
100
|
+
blockNumber = receipt.blockNumber;
|
|
101
|
+
}
|
|
102
|
+
let indexing = 'indexed';
|
|
103
|
+
try {
|
|
104
|
+
await this.indexer.waitForBlock(blockNumber, this.indexingTimeoutMs);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (!(error instanceof AgentError) || error.code !== 'indexer_lagging')
|
|
108
|
+
throw error;
|
|
109
|
+
indexing = 'lagging';
|
|
110
|
+
}
|
|
111
|
+
return { action: action.kind, hashes, blockNumber, indexing };
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=transaction-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction-executor.js","sourceRoot":"","sources":["../../src/runner/transaction-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface WriterLock {
|
|
2
|
+
withLock<T>(operation: () => Promise<T>): Promise<T>;
|
|
3
|
+
}
|
|
4
|
+
export declare class MemoryWriterLock implements WriterLock {
|
|
5
|
+
private held;
|
|
6
|
+
withLock<T>(operation: () => Promise<T>): Promise<T>;
|
|
7
|
+
}
|
|
8
|
+
export declare class FileWriterLock implements WriterLock {
|
|
9
|
+
private readonly path;
|
|
10
|
+
constructor(path: string);
|
|
11
|
+
withLock<T>(operation: () => Promise<T>): Promise<T>;
|
|
12
|
+
private acquire;
|
|
13
|
+
private ownerIsAlive;
|
|
14
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { mkdir, open, readFile, unlink } from 'node:fs/promises';
|
|
2
|
+
import { dirname } from 'node:path';
|
|
3
|
+
import { AgentError } from '../errors.js';
|
|
4
|
+
export class MemoryWriterLock {
|
|
5
|
+
held = false;
|
|
6
|
+
async withLock(operation) {
|
|
7
|
+
if (this.held)
|
|
8
|
+
throw new AgentError('runner_busy', 'Another transaction is already in flight for this wallet');
|
|
9
|
+
this.held = true;
|
|
10
|
+
try {
|
|
11
|
+
return await operation();
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
this.held = false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class FileWriterLock {
|
|
19
|
+
path;
|
|
20
|
+
constructor(path) {
|
|
21
|
+
this.path = path;
|
|
22
|
+
}
|
|
23
|
+
async withLock(operation) {
|
|
24
|
+
const handle = await this.acquire();
|
|
25
|
+
try {
|
|
26
|
+
return await operation();
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
await handle.close();
|
|
30
|
+
try {
|
|
31
|
+
await unlink(this.path);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
if (error.code !== 'ENOENT')
|
|
35
|
+
throw error;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
async acquire(recovered = false) {
|
|
40
|
+
await mkdir(dirname(this.path), { recursive: true, mode: 0o700 });
|
|
41
|
+
try {
|
|
42
|
+
const handle = await open(this.path, 'wx', 0o600);
|
|
43
|
+
await handle.writeFile(`${JSON.stringify({ pid: process.pid, createdAt: new Date().toISOString() })}\n`, 'utf8');
|
|
44
|
+
await handle.sync();
|
|
45
|
+
return handle;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (error.code !== 'EEXIST')
|
|
49
|
+
throw error;
|
|
50
|
+
if (!recovered && !(await this.ownerIsAlive())) {
|
|
51
|
+
try {
|
|
52
|
+
await unlink(this.path);
|
|
53
|
+
}
|
|
54
|
+
catch (unlinkError) {
|
|
55
|
+
if (unlinkError.code !== 'ENOENT')
|
|
56
|
+
throw unlinkError;
|
|
57
|
+
}
|
|
58
|
+
return this.acquire(true);
|
|
59
|
+
}
|
|
60
|
+
throw new AgentError('runner_busy', 'Another GWorld process is signing for this profile');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
async ownerIsAlive() {
|
|
64
|
+
try {
|
|
65
|
+
const owner = JSON.parse(await readFile(this.path, 'utf8'));
|
|
66
|
+
if (!Number.isSafeInteger(owner.pid) || Number(owner.pid) <= 0)
|
|
67
|
+
return true;
|
|
68
|
+
try {
|
|
69
|
+
process.kill(Number(owner.pid), 0);
|
|
70
|
+
return true;
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return error.code !== 'ESRCH';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=writer-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer-lock.js","sourceRoot":"","sources":["../../src/runner/writer-lock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Address, PrivateKey } from '../domain.js';
|
|
2
|
+
export type EncryptedKeyStore = {
|
|
3
|
+
version: 1;
|
|
4
|
+
address: Address;
|
|
5
|
+
crypto: {
|
|
6
|
+
cipher: 'aes-256-gcm';
|
|
7
|
+
kdf: 'scrypt';
|
|
8
|
+
salt: string;
|
|
9
|
+
iv: string;
|
|
10
|
+
tag: string;
|
|
11
|
+
ciphertext: string;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
export declare function encryptPrivateKey(privateKey: PrivateKey, password: string): Promise<EncryptedKeyStore>;
|
|
15
|
+
export declare function decryptPrivateKey(value: unknown, password: string): Promise<PrivateKey>;
|
|
16
|
+
export declare function saveKeyStore(path: string, store: EncryptedKeyStore): Promise<void>;
|
|
17
|
+
export declare function loadKeyStore(path: string): Promise<EncryptedKeyStore>;
|
|
18
|
+
export declare function savePrivateKeyExport(path: string, privateKey: PrivateKey): Promise<void>;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createCipheriv, createDecipheriv, randomBytes, scrypt as scryptCallback, timingSafeEqual } from 'node:crypto';
|
|
2
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
3
|
+
import { getAddress } from 'viem';
|
|
4
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
5
|
+
import { AgentError } from '../errors.js';
|
|
6
|
+
import { atomicWritePrivateFile, createPrivateFile } from '../fs.js';
|
|
7
|
+
function assertPrivateKey(value) {
|
|
8
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(value))
|
|
9
|
+
throw new AgentError('wallet_corrupt', 'Wallet key has an invalid format');
|
|
10
|
+
}
|
|
11
|
+
async function deriveKey(password, salt) {
|
|
12
|
+
if (password.length < 12)
|
|
13
|
+
throw new AgentError('wallet_locked', 'Wallet password must be at least 12 characters');
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
scryptCallback(password, salt, 32, { N: 1 << 15, r: 8, p: 1, maxmem: 64 * 1024 * 1024 }, (error, key) => (error ? reject(error) : resolve(key)));
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
export async function encryptPrivateKey(privateKey, password) {
|
|
19
|
+
assertPrivateKey(privateKey);
|
|
20
|
+
const salt = randomBytes(32);
|
|
21
|
+
const iv = randomBytes(12);
|
|
22
|
+
const key = await deriveKey(password, salt);
|
|
23
|
+
const cipher = createCipheriv('aes-256-gcm', key, iv);
|
|
24
|
+
const ciphertext = Buffer.concat([cipher.update(privateKey.slice(2), 'utf8'), cipher.final()]);
|
|
25
|
+
const address = privateKeyToAccount(privateKey).address.toLowerCase();
|
|
26
|
+
return {
|
|
27
|
+
version: 1,
|
|
28
|
+
address,
|
|
29
|
+
crypto: {
|
|
30
|
+
cipher: 'aes-256-gcm',
|
|
31
|
+
kdf: 'scrypt',
|
|
32
|
+
salt: salt.toString('base64'),
|
|
33
|
+
iv: iv.toString('base64'),
|
|
34
|
+
tag: cipher.getAuthTag().toString('base64'),
|
|
35
|
+
ciphertext: ciphertext.toString('base64'),
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
function parseStore(value) {
|
|
40
|
+
const store = value;
|
|
41
|
+
try {
|
|
42
|
+
if (store.version !== 1 || store.crypto.cipher !== 'aes-256-gcm' || store.crypto.kdf !== 'scrypt')
|
|
43
|
+
throw new Error();
|
|
44
|
+
const address = getAddress(store.address).toLowerCase();
|
|
45
|
+
for (const field of ['salt', 'iv', 'tag', 'ciphertext']) {
|
|
46
|
+
if (typeof store.crypto[field] !== 'string' || store.crypto[field].length === 0)
|
|
47
|
+
throw new Error();
|
|
48
|
+
}
|
|
49
|
+
return { ...store, address };
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
throw new AgentError('wallet_corrupt', 'Wallet keystore is invalid');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function decryptPrivateKey(value, password) {
|
|
56
|
+
const store = parseStore(value);
|
|
57
|
+
try {
|
|
58
|
+
const salt = Buffer.from(store.crypto.salt, 'base64');
|
|
59
|
+
const iv = Buffer.from(store.crypto.iv, 'base64');
|
|
60
|
+
const tag = Buffer.from(store.crypto.tag, 'base64');
|
|
61
|
+
const ciphertext = Buffer.from(store.crypto.ciphertext, 'base64');
|
|
62
|
+
const key = await deriveKey(password, salt);
|
|
63
|
+
const decipher = createDecipheriv('aes-256-gcm', key, iv);
|
|
64
|
+
decipher.setAuthTag(tag);
|
|
65
|
+
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString('utf8');
|
|
66
|
+
const privateKey = `0x${plaintext}`;
|
|
67
|
+
assertPrivateKey(privateKey);
|
|
68
|
+
const actual = Buffer.from(privateKeyToAccount(privateKey).address.slice(2), 'hex');
|
|
69
|
+
const expected = Buffer.from(store.address.slice(2), 'hex');
|
|
70
|
+
if (!timingSafeEqual(actual, expected))
|
|
71
|
+
throw new Error('address mismatch');
|
|
72
|
+
return privateKey;
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof AgentError && error.code === 'wallet_locked')
|
|
76
|
+
throw error;
|
|
77
|
+
throw new AgentError('wallet_locked', 'Unable to unlock wallet; password or keystore is invalid');
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export async function saveKeyStore(path, store) {
|
|
81
|
+
await atomicWritePrivateFile(path, `${JSON.stringify(parseStore(store), null, 2)}\n`);
|
|
82
|
+
}
|
|
83
|
+
export async function loadKeyStore(path) {
|
|
84
|
+
try {
|
|
85
|
+
const store = parseStore(JSON.parse(await readFile(path, 'utf8')));
|
|
86
|
+
const mode = (await stat(path)).mode & 0o777;
|
|
87
|
+
if ((mode & 0o077) !== 0)
|
|
88
|
+
throw new AgentError('wallet_corrupt', 'Wallet keystore permissions must be 0600');
|
|
89
|
+
return store;
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
if (error.code === 'ENOENT')
|
|
93
|
+
throw new AgentError('wallet_missing', `Wallet keystore not found: ${path}`);
|
|
94
|
+
if (error instanceof AgentError)
|
|
95
|
+
throw error;
|
|
96
|
+
throw new AgentError('wallet_corrupt', 'Wallet keystore cannot be read');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export async function savePrivateKeyExport(path, privateKey) {
|
|
100
|
+
assertPrivateKey(privateKey);
|
|
101
|
+
try {
|
|
102
|
+
await createPrivateFile(path, `${privateKey}\n`);
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
if (error.code === 'EEXIST') {
|
|
106
|
+
throw new AgentError('config_invalid', `Private-key export target already exists: ${path}`);
|
|
107
|
+
}
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=keystore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../../src/wallet/keystore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,IAAI,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAerE,SAAS,gBAAgB,CAAC,KAAa;IACrC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,kCAAkC,CAAC,CAAC;AACrH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,QAAgB,EAAE,IAAY;IACrD,IAAI,QAAQ,CAAC,MAAM,GAAG,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,gDAAgD,CAAC,CAAC;IAClH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,cAAc,CACZ,QAAQ,EACR,IAAI,EACJ,EAAE,EACF,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EACpD,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CACvD,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,UAAsB,EAAE,QAAgB;IAC9E,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,cAAc,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC/F,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,WAAW,EAAa,CAAC;IACjF,OAAO;QACL,OAAO,EAAE,CAAC;QACV,OAAO;QACP,MAAM,EAAE;YACN,MAAM,EAAE,aAAa;YACrB,GAAG,EAAE,QAAQ;YACb,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC7B,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACzB,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC3C,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;SAC1C;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,KAAK,GAAG,KAA0B,CAAC;IACzC,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,KAAK,aAAa,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACrH,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,WAAW,EAAa,CAAC;QACnE,KAAK,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAU,EAAE,CAAC;YACjE,IAAI,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,EAAE,CAAC;QACrG,CAAC;QACD,OAAO,EAAE,GAAG,KAAK,EAAE,OAAO,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,4BAA4B,CAAC,CAAC;IACvE,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,KAAc,EAAE,QAAgB;IACtE,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAClE,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,aAAa,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC1D,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClG,MAAM,UAAU,GAAG,KAAK,SAAS,EAAE,CAAC;QACpC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5D,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC5E,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,UAAU,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe;YAAE,MAAM,KAAK,CAAC;QAC/E,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,0DAA0D,CAAC,CAAC;IACpG,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,KAAwB;IACvE,MAAM,sBAAsB,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AACxF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;QAC7C,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,0CAA0C,CAAC,CAAC;QAC7G,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,8BAA8B,IAAI,EAAE,CAAC,CAAC;QACrI,IAAI,KAAK,YAAY,UAAU;YAAE,MAAM,KAAK,CAAC;QAC7C,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,IAAY,EAAE,UAAsB;IAC7E,gBAAgB,CAAC,UAAU,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC,IAAI,EAAE,GAAG,UAAU,IAAI,CAAC,CAAC;IACnD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,MAAM,IAAI,UAAU,CAAC,gBAAgB,EAAE,6CAA6C,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type SpawnSyncReturns } from 'node:child_process';
|
|
2
|
+
export interface PasswordStore {
|
|
3
|
+
available(): boolean;
|
|
4
|
+
get(profile: string): Promise<string | null>;
|
|
5
|
+
set(profile: string, password: string): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
type Spawn = (command: string, args: string[], options: Record<string, unknown>) => SpawnSyncReturns<string>;
|
|
8
|
+
export declare class MacOsKeychainPasswordStore implements PasswordStore {
|
|
9
|
+
private readonly spawn;
|
|
10
|
+
private readonly platform;
|
|
11
|
+
constructor(spawn?: Spawn, platform?: NodeJS.Platform);
|
|
12
|
+
available(): boolean;
|
|
13
|
+
get(profile: string): Promise<string | null>;
|
|
14
|
+
set(profile: string, password: string): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function promptHidden(question: string): Promise<string>;
|
|
17
|
+
export declare function promptText(question: string): Promise<string>;
|
|
18
|
+
export declare class PasswordManager {
|
|
19
|
+
private readonly keychain;
|
|
20
|
+
private readonly prompt;
|
|
21
|
+
constructor(keychain?: PasswordStore, prompt?: (question: string) => Promise<string>);
|
|
22
|
+
create(profile: string, interactive?: boolean): Promise<string>;
|
|
23
|
+
unlock(profile: string, interactive?: boolean): Promise<string>;
|
|
24
|
+
unlockForExport(): Promise<string>;
|
|
25
|
+
private assertPassword;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { spawnSync } from 'node:child_process';
|
|
3
|
+
import { createInterface } from 'node:readline/promises';
|
|
4
|
+
import { Writable } from 'node:stream';
|
|
5
|
+
import { AgentError } from '../errors.js';
|
|
6
|
+
export class MacOsKeychainPasswordStore {
|
|
7
|
+
spawn;
|
|
8
|
+
platform;
|
|
9
|
+
constructor(spawn = (command, args, options) => spawnSync(command, args, { ...options, encoding: 'utf8' }), platform = process.platform) {
|
|
10
|
+
this.spawn = spawn;
|
|
11
|
+
this.platform = platform;
|
|
12
|
+
}
|
|
13
|
+
available() {
|
|
14
|
+
if (this.platform !== 'darwin')
|
|
15
|
+
return false;
|
|
16
|
+
return this.spawn('security', ['help'], { stdio: 'ignore' }).status === 0;
|
|
17
|
+
}
|
|
18
|
+
async get(profile) {
|
|
19
|
+
if (!this.available())
|
|
20
|
+
return null;
|
|
21
|
+
const result = this.spawn('security', ['find-generic-password', '-a', profile, '-s', 'com.galxe.gworld.agent', '-w'], { stdio: ['ignore', 'pipe', 'ignore'] });
|
|
22
|
+
return result.status === 0 && result.stdout ? result.stdout.trim() : null;
|
|
23
|
+
}
|
|
24
|
+
async set(profile, password) {
|
|
25
|
+
if (!this.available())
|
|
26
|
+
throw new AgentError('unsupported', 'macOS Keychain is not available');
|
|
27
|
+
const result = this.spawn('security', ['add-generic-password', '-U', '-a', profile, '-s', 'com.galxe.gworld.agent', '-l', `GWorld Agent (${profile})`, '-w'], { input: `${password}\n`, stdio: ['pipe', 'ignore', 'pipe'] });
|
|
28
|
+
if (result.status !== 0)
|
|
29
|
+
throw new AgentError('wallet_locked', 'Unable to store the wallet password in macOS Keychain');
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async function passwordFromEnvironment() {
|
|
33
|
+
if (process.env.GWORLD_KEYSTORE_PASSWORD)
|
|
34
|
+
return process.env.GWORLD_KEYSTORE_PASSWORD;
|
|
35
|
+
const path = process.env.GWORLD_KEYSTORE_PASSWORD_FILE;
|
|
36
|
+
if (!path)
|
|
37
|
+
return null;
|
|
38
|
+
const mode = (await stat(path)).mode & 0o777;
|
|
39
|
+
if ((mode & 0o077) !== 0)
|
|
40
|
+
throw new AgentError('wallet_locked', 'GWORLD_KEYSTORE_PASSWORD_FILE permissions must be 0600');
|
|
41
|
+
return (await readFile(path, 'utf8')).trim();
|
|
42
|
+
}
|
|
43
|
+
export async function promptHidden(question) {
|
|
44
|
+
if (!process.stdin.isTTY)
|
|
45
|
+
throw new AgentError('wallet_locked', 'A TTY, macOS Keychain, or keystore password environment is required');
|
|
46
|
+
process.stderr.write(question);
|
|
47
|
+
let muted = true;
|
|
48
|
+
const output = new Writable({
|
|
49
|
+
write(chunk, _encoding, callback) {
|
|
50
|
+
if (!muted)
|
|
51
|
+
process.stderr.write(chunk);
|
|
52
|
+
callback();
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
const reader = createInterface({ input: process.stdin, output, terminal: true });
|
|
56
|
+
try {
|
|
57
|
+
const answer = await reader.question('');
|
|
58
|
+
muted = false;
|
|
59
|
+
process.stderr.write('\n');
|
|
60
|
+
return answer.trim();
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
reader.close();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export async function promptText(question) {
|
|
67
|
+
if (!process.stdin.isTTY)
|
|
68
|
+
throw new AgentError('unsupported', 'An interactive TTY is required');
|
|
69
|
+
const reader = createInterface({ input: process.stdin, output: process.stderr, terminal: true });
|
|
70
|
+
try {
|
|
71
|
+
return (await reader.question(question)).trim();
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
reader.close();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export class PasswordManager {
|
|
78
|
+
keychain;
|
|
79
|
+
prompt;
|
|
80
|
+
constructor(keychain = new MacOsKeychainPasswordStore(), prompt = promptHidden) {
|
|
81
|
+
this.keychain = keychain;
|
|
82
|
+
this.prompt = prompt;
|
|
83
|
+
}
|
|
84
|
+
async create(profile, interactive = true) {
|
|
85
|
+
const fromEnvironment = await passwordFromEnvironment();
|
|
86
|
+
if (fromEnvironment)
|
|
87
|
+
return this.assertPassword(fromEnvironment);
|
|
88
|
+
if (!interactive)
|
|
89
|
+
throw new AgentError('wallet_locked', 'No non-interactive keystore password source is configured');
|
|
90
|
+
const first = this.assertPassword(await this.prompt('Create GWorld wallet recovery password: '));
|
|
91
|
+
const second = await this.prompt('Confirm GWorld wallet recovery password: ');
|
|
92
|
+
if (first !== second)
|
|
93
|
+
throw new AgentError('wallet_locked', 'Wallet passwords do not match');
|
|
94
|
+
if (this.keychain.available())
|
|
95
|
+
await this.keychain.set(profile, first);
|
|
96
|
+
return first;
|
|
97
|
+
}
|
|
98
|
+
async unlock(profile, interactive = true) {
|
|
99
|
+
const fromKeychain = await this.keychain.get(profile);
|
|
100
|
+
if (fromKeychain)
|
|
101
|
+
return this.assertPassword(fromKeychain);
|
|
102
|
+
const fromEnvironment = await passwordFromEnvironment();
|
|
103
|
+
if (fromEnvironment)
|
|
104
|
+
return this.assertPassword(fromEnvironment);
|
|
105
|
+
if (!interactive)
|
|
106
|
+
throw new AgentError('wallet_locked', 'Wallet is locked; configure Keychain or GWORLD_KEYSTORE_PASSWORD_FILE');
|
|
107
|
+
return this.assertPassword(await this.prompt('Unlock GWorld wallet: '));
|
|
108
|
+
}
|
|
109
|
+
async unlockForExport() {
|
|
110
|
+
return this.assertPassword(await this.prompt('Re-enter GWorld wallet recovery password to export: '));
|
|
111
|
+
}
|
|
112
|
+
assertPassword(password) {
|
|
113
|
+
if (password.length < 12)
|
|
114
|
+
throw new AgentError('wallet_locked', 'Wallet password must be at least 12 characters');
|
|
115
|
+
return password;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=password-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"password-store.js","sourceRoot":"","sources":["../../src/wallet/password-store.ts"],"names":[],"mappings":"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"}
|