@stellar-agent/testnet-suite 0.4.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/dist/index.d.ts +143 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +683 -0
- package/dist/index.js.map +1 -0
- package/package.json +41 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 stellar-agent-bridge contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { NetworkProfile, NetworkName, PublicWallet, StellarAgentConfig, TestnetWallet, WalletPublicView, redactWallet } from "@stellar-agent/core";
|
|
2
|
+
import { evaluatePaymentRequest } from "@stellar-agent/policy";
|
|
3
|
+
import { BalanceLine, StellarCliResult, checkStellarCli, fundWithFriendbot } from "@stellar-agent/stellar";
|
|
4
|
+
export interface TestnetHarness {
|
|
5
|
+
config: StellarAgentConfig;
|
|
6
|
+
profile: NetworkProfile;
|
|
7
|
+
ensureInitialized(options?: {
|
|
8
|
+
fund?: boolean;
|
|
9
|
+
overwritePolicy?: boolean;
|
|
10
|
+
}): Promise<TestnetInitResult>;
|
|
11
|
+
loadWallet(name: string): Promise<TestnetWallet>;
|
|
12
|
+
runPolicyDeniedScenario(): Promise<{
|
|
13
|
+
decision: ReturnType<typeof evaluatePaymentRequest>;
|
|
14
|
+
}>;
|
|
15
|
+
runApprovalRequiredScenario(options?: {
|
|
16
|
+
approveTestnet?: boolean;
|
|
17
|
+
autoDeny?: boolean;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
decision: ReturnType<typeof evaluatePaymentRequest>;
|
|
20
|
+
receiptPath?: string;
|
|
21
|
+
}>;
|
|
22
|
+
runBasicPayment(options?: {
|
|
23
|
+
amount?: string;
|
|
24
|
+
memo?: string;
|
|
25
|
+
dryRun?: boolean;
|
|
26
|
+
}): Promise<BasicPaymentResult>;
|
|
27
|
+
runIssuedAssetPaymentScenario(options?: IssuedAssetScenarioOptions): Promise<IssuedAssetScenarioResult>;
|
|
28
|
+
runContractAssetSmokeScenario(options?: ContractAssetSmokeScenarioOptions): Promise<ContractAssetSmokeScenarioResult>;
|
|
29
|
+
}
|
|
30
|
+
export interface TestnetInitResult {
|
|
31
|
+
rootDir: string;
|
|
32
|
+
wallets: Record<string, ReturnType<typeof redactWallet>>;
|
|
33
|
+
funded: boolean;
|
|
34
|
+
policyPath: string;
|
|
35
|
+
configPath: string;
|
|
36
|
+
}
|
|
37
|
+
export interface BasicPaymentResult {
|
|
38
|
+
receiptPath?: string;
|
|
39
|
+
transaction?: {
|
|
40
|
+
hash: string;
|
|
41
|
+
ledger?: number;
|
|
42
|
+
successful: boolean;
|
|
43
|
+
feeCharged?: string;
|
|
44
|
+
};
|
|
45
|
+
decision: ReturnType<typeof evaluatePaymentRequest>;
|
|
46
|
+
dryRun: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface IssuedAssetScenarioOptions {
|
|
49
|
+
issuer?: string;
|
|
50
|
+
recipient?: string;
|
|
51
|
+
assetCode?: string;
|
|
52
|
+
amount?: string;
|
|
53
|
+
memo?: string;
|
|
54
|
+
dryRun?: boolean;
|
|
55
|
+
fund?: boolean;
|
|
56
|
+
}
|
|
57
|
+
export interface IssuedAssetScenarioResult {
|
|
58
|
+
asset: string;
|
|
59
|
+
amount: string;
|
|
60
|
+
issuer: string;
|
|
61
|
+
recipient: string;
|
|
62
|
+
dryRun: boolean;
|
|
63
|
+
policyDecision: ReturnType<typeof evaluatePaymentRequest>;
|
|
64
|
+
funding?: {
|
|
65
|
+
issuer?: Awaited<ReturnType<typeof fundWithFriendbot>>;
|
|
66
|
+
recipient?: Awaited<ReturnType<typeof fundWithFriendbot>>;
|
|
67
|
+
};
|
|
68
|
+
trustline?: SubmittedScenarioTransaction & {
|
|
69
|
+
receiptPath: string;
|
|
70
|
+
};
|
|
71
|
+
payment?: SubmittedScenarioTransaction & {
|
|
72
|
+
receiptPath: string;
|
|
73
|
+
};
|
|
74
|
+
recipientBalance?: BalanceLine;
|
|
75
|
+
}
|
|
76
|
+
export interface ContractAssetSmokeScenarioOptions {
|
|
77
|
+
source?: string;
|
|
78
|
+
asset?: string;
|
|
79
|
+
alias?: string;
|
|
80
|
+
ledgersToExtend?: number;
|
|
81
|
+
stellarBinary?: string;
|
|
82
|
+
stellarConfigDir?: string;
|
|
83
|
+
noCache?: boolean;
|
|
84
|
+
dryRun?: boolean;
|
|
85
|
+
fund?: boolean;
|
|
86
|
+
}
|
|
87
|
+
export interface ContractAssetSmokeScenarioResult {
|
|
88
|
+
source: string;
|
|
89
|
+
asset: string;
|
|
90
|
+
dryRun: boolean;
|
|
91
|
+
stellarCli: Awaited<ReturnType<typeof checkStellarCli>>;
|
|
92
|
+
plannedOperations?: string[];
|
|
93
|
+
funding?: Awaited<ReturnType<typeof fundWithFriendbot>>;
|
|
94
|
+
deploy?: RedactedStellarCliResult & {
|
|
95
|
+
contractId?: string;
|
|
96
|
+
transactionHash?: string;
|
|
97
|
+
receiptPath?: string;
|
|
98
|
+
};
|
|
99
|
+
assetId?: RedactedStellarCliResult & {
|
|
100
|
+
contractId?: string;
|
|
101
|
+
};
|
|
102
|
+
read?: RedactedStellarCliResult;
|
|
103
|
+
info?: RedactedStellarCliResult;
|
|
104
|
+
invoke?: RedactedStellarCliResult;
|
|
105
|
+
extend?: RedactedStellarCliResult & {
|
|
106
|
+
transactionHash?: string;
|
|
107
|
+
receiptPath?: string;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
type RedactedStellarCliResult = StellarCliResult;
|
|
111
|
+
interface SubmittedScenarioTransaction {
|
|
112
|
+
hash: string;
|
|
113
|
+
ledger?: number;
|
|
114
|
+
successful: boolean;
|
|
115
|
+
feeCharged?: string;
|
|
116
|
+
}
|
|
117
|
+
export declare function createTestnetHarness(config?: StellarAgentConfig): TestnetHarness;
|
|
118
|
+
export declare function initTestnetWorkspace(config?: StellarAgentConfig, options?: {
|
|
119
|
+
fund?: boolean;
|
|
120
|
+
overwritePolicy?: boolean;
|
|
121
|
+
}): Promise<TestnetInitResult>;
|
|
122
|
+
export declare function ensureWallet(config: StellarAgentConfig, name: string): Promise<TestnetWallet>;
|
|
123
|
+
export declare function loadWallet(config: StellarAgentConfig, name: string): Promise<TestnetWallet>;
|
|
124
|
+
export declare function walletBalances(config: StellarAgentConfig, name: string): Promise<BalanceLine[]>;
|
|
125
|
+
export interface WalletTrustlineView {
|
|
126
|
+
asset: string;
|
|
127
|
+
balance: string;
|
|
128
|
+
}
|
|
129
|
+
export declare function walletTrustlines(config: StellarAgentConfig, name: string): Promise<WalletTrustlineView[]>;
|
|
130
|
+
export declare function trustlinesFromBalances(balances: Array<{
|
|
131
|
+
asset: string;
|
|
132
|
+
balance: string;
|
|
133
|
+
}>): WalletTrustlineView[];
|
|
134
|
+
export declare function importPublicWallet(args: {
|
|
135
|
+
config: StellarAgentConfig;
|
|
136
|
+
name: string;
|
|
137
|
+
publicKey: string;
|
|
138
|
+
network: NetworkName;
|
|
139
|
+
}): Promise<PublicWallet>;
|
|
140
|
+
export declare function loadWalletPublic(config: StellarAgentConfig, name: string): Promise<WalletPublicView>;
|
|
141
|
+
export declare function listWalletPublicViews(config: StellarAgentConfig): Promise<WalletPublicView[]>;
|
|
142
|
+
export {};
|
|
143
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,683 @@
|
|
|
1
|
+
import { StellarAgentError, TESTNET_PROFILE, createDefaultConfig, parseAmount, parseAsset, publicWalletSchema, redactSensitive, redactWallet, resolvePath, testnetWalletSchema } from "@stellar-agent/core";
|
|
2
|
+
import { appendEvent, writeReceipt } from "@stellar-agent/ledger-logger";
|
|
3
|
+
import { DEFAULT_TESTNET_POLICY, evaluatePaymentRequest, policyToYaml } from "@stellar-agent/policy";
|
|
4
|
+
import { assetContractIdWithStellarCli, checkStellarCli, createTestnetWallet, contractInfoWithStellarCli, deployAssetContractWithStellarCli, extendContractWithStellarCli, fundWithFriendbot, getBalances, changeTrustline, invokeContractWithStellarCli, parseStellarCliTransactionHash, readContractWithStellarCli, sendPayment } from "@stellar-agent/stellar";
|
|
5
|
+
import { mkdir, readFile, readdir, writeFile } from "node:fs/promises";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { stringify } from "yaml";
|
|
8
|
+
export function createTestnetHarness(config = createDefaultConfig()) {
|
|
9
|
+
const profile = TESTNET_PROFILE;
|
|
10
|
+
const resolvedConfig = resolveConfigPaths(config);
|
|
11
|
+
return {
|
|
12
|
+
config: resolvedConfig,
|
|
13
|
+
profile,
|
|
14
|
+
async ensureInitialized(options = {}) {
|
|
15
|
+
return initTestnetWorkspace(resolvedConfig, options);
|
|
16
|
+
},
|
|
17
|
+
async loadWallet(name) {
|
|
18
|
+
return loadWallet(resolvedConfig, name);
|
|
19
|
+
},
|
|
20
|
+
async runPolicyDeniedScenario() {
|
|
21
|
+
await appendScenarioEvent(resolvedConfig, "policy_decision", "started");
|
|
22
|
+
const merchant = await loadWallet(resolvedConfig, "merchant");
|
|
23
|
+
const decision = evaluatePaymentRequest(DEFAULT_TESTNET_POLICY, {
|
|
24
|
+
destination: merchant.publicKey,
|
|
25
|
+
amount: "11",
|
|
26
|
+
asset: "XLM",
|
|
27
|
+
network: "testnet"
|
|
28
|
+
});
|
|
29
|
+
await appendScenarioEvent(resolvedConfig, "policy_decision", decision.status, { decision });
|
|
30
|
+
return { decision };
|
|
31
|
+
},
|
|
32
|
+
async runApprovalRequiredScenario(options = {}) {
|
|
33
|
+
const agent = await loadWallet(resolvedConfig, "agent");
|
|
34
|
+
const merchant = await loadWallet(resolvedConfig, "merchant");
|
|
35
|
+
const decision = evaluatePaymentRequest(DEFAULT_TESTNET_POLICY, {
|
|
36
|
+
source: agent.publicKey,
|
|
37
|
+
destination: merchant.publicKey,
|
|
38
|
+
amount: "6",
|
|
39
|
+
asset: "XLM",
|
|
40
|
+
network: "testnet"
|
|
41
|
+
});
|
|
42
|
+
await appendScenarioEvent(resolvedConfig, "policy_decision", decision.status, { decision });
|
|
43
|
+
if (decision.status !== "requires_approval" || options.autoDeny || !options.approveTestnet) {
|
|
44
|
+
return { decision };
|
|
45
|
+
}
|
|
46
|
+
const payment = await runPayment(resolvedConfig, DEFAULT_TESTNET_POLICY, {
|
|
47
|
+
amount: "6",
|
|
48
|
+
memo: "approval scenario"
|
|
49
|
+
});
|
|
50
|
+
return payment.receiptPath ? { decision, receiptPath: payment.receiptPath } : { decision };
|
|
51
|
+
},
|
|
52
|
+
async runBasicPayment(options = {}) {
|
|
53
|
+
return runPayment(resolvedConfig, DEFAULT_TESTNET_POLICY, options);
|
|
54
|
+
},
|
|
55
|
+
async runIssuedAssetPaymentScenario(options = {}) {
|
|
56
|
+
return runIssuedAssetPaymentScenario(resolvedConfig, DEFAULT_TESTNET_POLICY, options);
|
|
57
|
+
},
|
|
58
|
+
async runContractAssetSmokeScenario(options = {}) {
|
|
59
|
+
return runContractAssetSmokeScenario(resolvedConfig, options);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export async function initTestnetWorkspace(config = createDefaultConfig(), options = {}) {
|
|
64
|
+
const resolved = resolveConfigPaths(config);
|
|
65
|
+
await Promise.all(Object.values(resolved.storage).map((path) => mkdir(path, { recursive: true })));
|
|
66
|
+
const wallets = {};
|
|
67
|
+
for (const name of ["agent", "merchant", "auditor"]) {
|
|
68
|
+
const wallet = await ensureWallet(resolved, name);
|
|
69
|
+
wallets[name] = redactWallet(wallet);
|
|
70
|
+
if (options.fund !== false && (name === "agent" || name === "merchant")) {
|
|
71
|
+
await fundWithFriendbot(wallet.publicKey, TESTNET_PROFILE);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const policyPath = join(resolved.storage.policiesDir, "default-testnet.yaml");
|
|
75
|
+
if (options.overwritePolicy) {
|
|
76
|
+
await writeFile(policyPath, policyToYaml(DEFAULT_TESTNET_POLICY), { mode: 0o600 });
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
await writeIfMissing(policyPath, policyToYaml(DEFAULT_TESTNET_POLICY), 0o600);
|
|
80
|
+
}
|
|
81
|
+
const configPath = join(resolved.storage.rootDir, "config.yaml");
|
|
82
|
+
await writeIfMissing(configPath, stringify(resolved), 0o600);
|
|
83
|
+
await writeIfMissing(join(resolved.storage.rootDir, "README.md"), "# Stellar Agent local Testnet workspace\n\nThis directory stores Testnet-only wallets, policies, logs, and receipts. Never reuse these keys on Mainnet.\n", 0o600);
|
|
84
|
+
return {
|
|
85
|
+
rootDir: resolved.storage.rootDir,
|
|
86
|
+
wallets,
|
|
87
|
+
funded: options.fund !== false,
|
|
88
|
+
policyPath,
|
|
89
|
+
configPath
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
async function runPayment(config, policy, options = {}) {
|
|
93
|
+
const agent = await loadWallet(config, "agent");
|
|
94
|
+
const merchant = await loadWallet(config, "merchant");
|
|
95
|
+
const amount = parseAmount(options.amount ?? "1").value;
|
|
96
|
+
const request = {
|
|
97
|
+
source: agent.publicKey,
|
|
98
|
+
destination: merchant.publicKey,
|
|
99
|
+
amount,
|
|
100
|
+
asset: "XLM",
|
|
101
|
+
memo: options.memo ?? "stellar-agent smoke test",
|
|
102
|
+
network: "testnet"
|
|
103
|
+
};
|
|
104
|
+
const decision = evaluatePaymentRequest(policy, request);
|
|
105
|
+
const eventLog = join(config.storage.logsDir, "events.jsonl");
|
|
106
|
+
await appendEvent(eventLog, {
|
|
107
|
+
event: "policy_decision",
|
|
108
|
+
status: decision.status,
|
|
109
|
+
command: "testnet smoke-test",
|
|
110
|
+
profile: "testnet",
|
|
111
|
+
data: { request, decision }
|
|
112
|
+
});
|
|
113
|
+
if (decision.status === "denied") {
|
|
114
|
+
throw new StellarAgentError({
|
|
115
|
+
code: "POLICY_DENIED",
|
|
116
|
+
message: "Payment request was denied by policy.",
|
|
117
|
+
hint: "Run policy explain to inspect the matched rules.",
|
|
118
|
+
docs: "docs/troubleshooting.md#policy-denied"
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (decision.status === "requires_approval") {
|
|
122
|
+
throw new StellarAgentError({
|
|
123
|
+
code: "APPROVAL_REQUIRED",
|
|
124
|
+
message: "Payment requires approval.",
|
|
125
|
+
hint: "Use an explicit approval flow before submitting the payment.",
|
|
126
|
+
docs: "docs/mainnet-safety.md"
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (options.dryRun) {
|
|
130
|
+
return { decision, dryRun: true };
|
|
131
|
+
}
|
|
132
|
+
const transaction = await sendPayment({
|
|
133
|
+
source: agent,
|
|
134
|
+
destination: merchant.publicKey,
|
|
135
|
+
amount,
|
|
136
|
+
memo: request.memo,
|
|
137
|
+
profile: TESTNET_PROFILE
|
|
138
|
+
});
|
|
139
|
+
await appendEvent(eventLog, {
|
|
140
|
+
event: "transaction_confirmed",
|
|
141
|
+
status: "successful",
|
|
142
|
+
command: "testnet smoke-test",
|
|
143
|
+
profile: "testnet",
|
|
144
|
+
data: transaction
|
|
145
|
+
});
|
|
146
|
+
const { path: receiptPath } = await writeReceipt(config.storage.receiptsDir, {
|
|
147
|
+
command: "testnet smoke-test",
|
|
148
|
+
profile: "testnet",
|
|
149
|
+
networkPassphrase: TESTNET_PROFILE.networkPassphrase,
|
|
150
|
+
realFunds: false,
|
|
151
|
+
payment: {
|
|
152
|
+
source: agent.publicKey,
|
|
153
|
+
destination: merchant.publicKey,
|
|
154
|
+
asset: "XLM",
|
|
155
|
+
amount,
|
|
156
|
+
memo: request.memo
|
|
157
|
+
},
|
|
158
|
+
policyDecision: decision,
|
|
159
|
+
transaction,
|
|
160
|
+
...(transaction.ledger === undefined ? {} : { ledger: { confirmedLedger: transaction.ledger } }),
|
|
161
|
+
eventLog
|
|
162
|
+
});
|
|
163
|
+
await appendEvent(eventLog, {
|
|
164
|
+
event: "receipt_written",
|
|
165
|
+
status: "success",
|
|
166
|
+
command: "testnet smoke-test",
|
|
167
|
+
profile: "testnet",
|
|
168
|
+
data: { receiptPath }
|
|
169
|
+
});
|
|
170
|
+
return { decision, transaction, receiptPath, dryRun: false };
|
|
171
|
+
}
|
|
172
|
+
async function runIssuedAssetPaymentScenario(config, policy, options = {}) {
|
|
173
|
+
const issuerName = options.issuer ?? "issuer";
|
|
174
|
+
const recipientName = options.recipient ?? "merchant";
|
|
175
|
+
const issuer = await ensureWallet(config, issuerName);
|
|
176
|
+
const recipient = await ensureWallet(config, recipientName);
|
|
177
|
+
const assetCode = (options.assetCode ?? uniqueAssetCode()).toUpperCase();
|
|
178
|
+
const asset = `${assetCode}:${issuer.publicKey}`;
|
|
179
|
+
parseAsset(asset);
|
|
180
|
+
const amount = parseAmount(options.amount ?? "0.0000001", asset).value;
|
|
181
|
+
const memo = options.memo ?? "issued-asset scenario";
|
|
182
|
+
const scenarioPolicy = {
|
|
183
|
+
...policy,
|
|
184
|
+
assets: {
|
|
185
|
+
allow: Array.from(new Set([...policy.assets.allow, asset]))
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
const request = {
|
|
189
|
+
source: issuer.publicKey,
|
|
190
|
+
destination: recipient.publicKey,
|
|
191
|
+
amount,
|
|
192
|
+
asset,
|
|
193
|
+
memo,
|
|
194
|
+
network: "testnet"
|
|
195
|
+
};
|
|
196
|
+
const policyDecision = evaluatePaymentRequest(scenarioPolicy, request);
|
|
197
|
+
const eventLog = join(config.storage.logsDir, "events.jsonl");
|
|
198
|
+
await appendEvent(eventLog, {
|
|
199
|
+
event: "policy_decision",
|
|
200
|
+
status: policyDecision.status,
|
|
201
|
+
command: "testnet scenario issued-asset-payment",
|
|
202
|
+
profile: "testnet",
|
|
203
|
+
data: { request, policyDecision }
|
|
204
|
+
});
|
|
205
|
+
if (policyDecision.status === "denied") {
|
|
206
|
+
throw new StellarAgentError({
|
|
207
|
+
code: "POLICY_DENIED",
|
|
208
|
+
message: "Issued-asset scenario payment was denied by policy.",
|
|
209
|
+
hint: "Use a smaller amount or allow the scenario asset in policy.",
|
|
210
|
+
docs: "docs/quickstart-testnet.md#issued-asset-scenario"
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
if (policyDecision.status === "requires_approval") {
|
|
214
|
+
throw new StellarAgentError({
|
|
215
|
+
code: "APPROVAL_REQUIRED",
|
|
216
|
+
message: "Issued-asset scenario payment requires approval.",
|
|
217
|
+
docs: "docs/quickstart-testnet.md#issued-asset-scenario"
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
const baseResult = {
|
|
221
|
+
asset,
|
|
222
|
+
amount,
|
|
223
|
+
issuer: issuer.publicKey,
|
|
224
|
+
recipient: recipient.publicKey,
|
|
225
|
+
dryRun: Boolean(options.dryRun),
|
|
226
|
+
policyDecision
|
|
227
|
+
};
|
|
228
|
+
if (options.dryRun)
|
|
229
|
+
return baseResult;
|
|
230
|
+
const funding = options.fund === false
|
|
231
|
+
? undefined
|
|
232
|
+
: {
|
|
233
|
+
issuer: await fundWithFriendbot(issuer.publicKey, TESTNET_PROFILE),
|
|
234
|
+
recipient: await fundWithFriendbot(recipient.publicKey, TESTNET_PROFILE)
|
|
235
|
+
};
|
|
236
|
+
const trustlineTransaction = await changeTrustline({
|
|
237
|
+
source: recipient,
|
|
238
|
+
asset,
|
|
239
|
+
profile: TESTNET_PROFILE
|
|
240
|
+
});
|
|
241
|
+
await appendEvent(eventLog, {
|
|
242
|
+
event: "transaction_confirmed",
|
|
243
|
+
status: "trustline_added",
|
|
244
|
+
command: "testnet scenario issued-asset-payment",
|
|
245
|
+
profile: "testnet",
|
|
246
|
+
data: { asset, recipient: recipient.publicKey, transaction: trustlineTransaction }
|
|
247
|
+
});
|
|
248
|
+
const trustlineReceiptPath = await writeOperationReceipt(config, {
|
|
249
|
+
command: "testnet scenario issued-asset-payment",
|
|
250
|
+
operation: {
|
|
251
|
+
type: "trustline.add",
|
|
252
|
+
account: recipientName,
|
|
253
|
+
source: recipient.publicKey,
|
|
254
|
+
asset,
|
|
255
|
+
limit: trustlineTransaction.limit
|
|
256
|
+
},
|
|
257
|
+
transaction: trustlineTransaction
|
|
258
|
+
});
|
|
259
|
+
const paymentTransaction = await sendPayment({
|
|
260
|
+
source: issuer,
|
|
261
|
+
destination: recipient.publicKey,
|
|
262
|
+
amount,
|
|
263
|
+
asset,
|
|
264
|
+
memo,
|
|
265
|
+
profile: TESTNET_PROFILE
|
|
266
|
+
});
|
|
267
|
+
await appendEvent(eventLog, {
|
|
268
|
+
event: "transaction_confirmed",
|
|
269
|
+
status: "successful",
|
|
270
|
+
command: "testnet scenario issued-asset-payment",
|
|
271
|
+
profile: "testnet",
|
|
272
|
+
data: { asset, recipient: recipient.publicKey, transaction: paymentTransaction }
|
|
273
|
+
});
|
|
274
|
+
const { path: paymentReceiptPath } = await writeReceipt(config.storage.receiptsDir, {
|
|
275
|
+
command: "testnet scenario issued-asset-payment",
|
|
276
|
+
profile: "testnet",
|
|
277
|
+
networkPassphrase: TESTNET_PROFILE.networkPassphrase,
|
|
278
|
+
realFunds: false,
|
|
279
|
+
payment: {
|
|
280
|
+
source: issuer.publicKey,
|
|
281
|
+
destination: recipient.publicKey,
|
|
282
|
+
asset,
|
|
283
|
+
amount,
|
|
284
|
+
memo
|
|
285
|
+
},
|
|
286
|
+
policyDecision,
|
|
287
|
+
transaction: paymentTransaction,
|
|
288
|
+
...(paymentTransaction.ledger === undefined ? {} : { ledger: { confirmedLedger: paymentTransaction.ledger } }),
|
|
289
|
+
eventLog
|
|
290
|
+
});
|
|
291
|
+
await appendEvent(eventLog, {
|
|
292
|
+
event: "receipt_written",
|
|
293
|
+
status: "success",
|
|
294
|
+
command: "testnet scenario issued-asset-payment",
|
|
295
|
+
profile: "testnet",
|
|
296
|
+
data: { receiptPath: paymentReceiptPath, transactionHash: paymentTransaction.hash }
|
|
297
|
+
});
|
|
298
|
+
const recipientBalance = (await walletBalances(config, recipientName)).find((balance) => balance.asset === asset);
|
|
299
|
+
return {
|
|
300
|
+
...baseResult,
|
|
301
|
+
...(funding === undefined ? {} : { funding }),
|
|
302
|
+
trustline: { ...trustlineTransaction, receiptPath: trustlineReceiptPath },
|
|
303
|
+
payment: { ...paymentTransaction, receiptPath: paymentReceiptPath },
|
|
304
|
+
...(recipientBalance === undefined ? {} : { recipientBalance })
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
async function runContractAssetSmokeScenario(config, options = {}) {
|
|
308
|
+
const sourceName = options.source ?? "agent";
|
|
309
|
+
const asset = options.asset ?? "native";
|
|
310
|
+
const stellarBinary = options.stellarBinary ?? "stellar";
|
|
311
|
+
const ledgersToExtend = options.ledgersToExtend ?? 535679;
|
|
312
|
+
const stellarCli = await checkStellarCli(stellarBinary);
|
|
313
|
+
const baseResult = {
|
|
314
|
+
source: sourceName,
|
|
315
|
+
asset,
|
|
316
|
+
dryRun: Boolean(options.dryRun),
|
|
317
|
+
stellarCli
|
|
318
|
+
};
|
|
319
|
+
if (options.dryRun) {
|
|
320
|
+
return {
|
|
321
|
+
...baseResult,
|
|
322
|
+
plannedOperations: [
|
|
323
|
+
"contract doctor",
|
|
324
|
+
"contract asset-deploy",
|
|
325
|
+
"contract asset-id",
|
|
326
|
+
"contract read",
|
|
327
|
+
"contract info",
|
|
328
|
+
"contract invoke symbol",
|
|
329
|
+
"contract extend"
|
|
330
|
+
]
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const sourceResolution = await resolveContractScenarioSource(config, sourceName);
|
|
334
|
+
const profile = config.profiles.testnet ?? TESTNET_PROFILE;
|
|
335
|
+
const funding = options.fund === false || !sourceResolution.wallet
|
|
336
|
+
? undefined
|
|
337
|
+
: await fundWithFriendbot(sourceResolution.wallet.publicKey, profile);
|
|
338
|
+
const common = {
|
|
339
|
+
network: "testnet",
|
|
340
|
+
rpcUrl: profile.rpcUrl,
|
|
341
|
+
networkPassphrase: profile.networkPassphrase,
|
|
342
|
+
stellarBinary,
|
|
343
|
+
...(options.stellarConfigDir === undefined ? {} : { stellarConfigDir: options.stellarConfigDir }),
|
|
344
|
+
...(options.noCache === undefined ? {} : { noCache: options.noCache })
|
|
345
|
+
};
|
|
346
|
+
const deploy = await deployAssetContractWithStellarCli({
|
|
347
|
+
source: sourceResolution.source,
|
|
348
|
+
asset,
|
|
349
|
+
...(options.alias === undefined ? {} : { alias: options.alias }),
|
|
350
|
+
...common
|
|
351
|
+
});
|
|
352
|
+
const contractId = firstOutputLine(deploy.stdout);
|
|
353
|
+
const deployTransactionHash = parseStellarCliTransactionHash(`${deploy.stderr}\n${deploy.stdout}`);
|
|
354
|
+
const deployReceiptPath = deployTransactionHash
|
|
355
|
+
? await writeOperationReceipt(config, {
|
|
356
|
+
command: "testnet scenario contract-asset-smoke",
|
|
357
|
+
operation: {
|
|
358
|
+
type: "contract.asset-deploy",
|
|
359
|
+
source: sourceName,
|
|
360
|
+
asset,
|
|
361
|
+
details: {
|
|
362
|
+
contractId,
|
|
363
|
+
alias: options.alias
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
transaction: {
|
|
367
|
+
hash: deployTransactionHash,
|
|
368
|
+
successful: true
|
|
369
|
+
}
|
|
370
|
+
})
|
|
371
|
+
: undefined;
|
|
372
|
+
const assetId = await assetContractIdWithStellarCli({
|
|
373
|
+
asset,
|
|
374
|
+
...common
|
|
375
|
+
});
|
|
376
|
+
const assetIdContractId = firstOutputLine(assetId.stdout);
|
|
377
|
+
if (contractId && assetIdContractId && contractId !== assetIdContractId) {
|
|
378
|
+
throw new StellarAgentError({
|
|
379
|
+
code: "TRANSACTION_SUBMIT_FAILED",
|
|
380
|
+
message: "Asset contract id lookup did not match the deployed contract id.",
|
|
381
|
+
docs: "docs/smart-contracts.md#asset-contracts",
|
|
382
|
+
details: { deployedContractId: contractId, lookedUpContractId: assetIdContractId }
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
const effectiveContractId = contractId || assetIdContractId;
|
|
386
|
+
if (!effectiveContractId) {
|
|
387
|
+
throw new StellarAgentError({
|
|
388
|
+
code: "TRANSACTION_SUBMIT_FAILED",
|
|
389
|
+
message: "Stellar CLI did not return an asset contract id.",
|
|
390
|
+
docs: "docs/smart-contracts.md#asset-contracts"
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
const read = await readContractWithStellarCli({
|
|
394
|
+
contractId: effectiveContractId,
|
|
395
|
+
output: "string",
|
|
396
|
+
...common
|
|
397
|
+
});
|
|
398
|
+
const info = await contractInfoWithStellarCli({
|
|
399
|
+
kind: "interface",
|
|
400
|
+
contractId: effectiveContractId,
|
|
401
|
+
...common
|
|
402
|
+
});
|
|
403
|
+
const invoke = await invokeContractWithStellarCli({
|
|
404
|
+
contractId: effectiveContractId,
|
|
405
|
+
source: sourceResolution.source,
|
|
406
|
+
functionName: "symbol",
|
|
407
|
+
...common
|
|
408
|
+
});
|
|
409
|
+
const extend = await extendContractWithStellarCli({
|
|
410
|
+
source: sourceResolution.source,
|
|
411
|
+
contractId: effectiveContractId,
|
|
412
|
+
ledgersToExtend,
|
|
413
|
+
durability: "persistent",
|
|
414
|
+
...common
|
|
415
|
+
});
|
|
416
|
+
const extendTransactionHash = parseStellarCliTransactionHash(`${extend.stderr}\n${extend.stdout}`);
|
|
417
|
+
const extendReceiptPath = extendTransactionHash
|
|
418
|
+
? await writeOperationReceipt(config, {
|
|
419
|
+
command: "testnet scenario contract-asset-smoke",
|
|
420
|
+
operation: {
|
|
421
|
+
type: "contract.extend",
|
|
422
|
+
source: sourceName,
|
|
423
|
+
details: {
|
|
424
|
+
contractId: effectiveContractId,
|
|
425
|
+
durability: "persistent",
|
|
426
|
+
ledgersToExtend
|
|
427
|
+
}
|
|
428
|
+
},
|
|
429
|
+
transaction: {
|
|
430
|
+
hash: extendTransactionHash,
|
|
431
|
+
successful: true
|
|
432
|
+
}
|
|
433
|
+
})
|
|
434
|
+
: undefined;
|
|
435
|
+
return {
|
|
436
|
+
...baseResult,
|
|
437
|
+
...(funding === undefined ? {} : { funding }),
|
|
438
|
+
deploy: {
|
|
439
|
+
...redactStellarCliResult(deploy),
|
|
440
|
+
contractId: effectiveContractId,
|
|
441
|
+
...(deployTransactionHash === undefined ? {} : { transactionHash: deployTransactionHash }),
|
|
442
|
+
...(deployReceiptPath === undefined ? {} : { receiptPath: deployReceiptPath })
|
|
443
|
+
},
|
|
444
|
+
assetId: {
|
|
445
|
+
...redactStellarCliResult(assetId),
|
|
446
|
+
contractId: assetIdContractId || effectiveContractId
|
|
447
|
+
},
|
|
448
|
+
read: redactStellarCliResult(read),
|
|
449
|
+
info: redactStellarCliResult(info),
|
|
450
|
+
invoke: redactStellarCliResult(invoke),
|
|
451
|
+
extend: {
|
|
452
|
+
...redactStellarCliResult(extend),
|
|
453
|
+
...(extendTransactionHash === undefined ? {} : { transactionHash: extendTransactionHash }),
|
|
454
|
+
...(extendReceiptPath === undefined ? {} : { receiptPath: extendReceiptPath })
|
|
455
|
+
}
|
|
456
|
+
};
|
|
457
|
+
}
|
|
458
|
+
async function writeOperationReceipt(config, args) {
|
|
459
|
+
const eventLog = join(config.storage.logsDir, "events.jsonl");
|
|
460
|
+
const { path: receiptPath } = await writeReceipt(config.storage.receiptsDir, {
|
|
461
|
+
command: args.command,
|
|
462
|
+
profile: "testnet",
|
|
463
|
+
networkPassphrase: TESTNET_PROFILE.networkPassphrase,
|
|
464
|
+
realFunds: false,
|
|
465
|
+
operation: args.operation,
|
|
466
|
+
policyDecision: { status: "allowed", matchedRules: ["testnet_operation"] },
|
|
467
|
+
transaction: args.transaction,
|
|
468
|
+
...(args.transaction.ledger === undefined ? {} : { ledger: { confirmedLedger: args.transaction.ledger } }),
|
|
469
|
+
eventLog
|
|
470
|
+
});
|
|
471
|
+
await appendEvent(eventLog, {
|
|
472
|
+
event: "receipt_written",
|
|
473
|
+
status: "success",
|
|
474
|
+
command: args.command,
|
|
475
|
+
profile: "testnet",
|
|
476
|
+
data: { receiptPath }
|
|
477
|
+
});
|
|
478
|
+
return receiptPath;
|
|
479
|
+
}
|
|
480
|
+
async function resolveContractScenarioSource(config, source) {
|
|
481
|
+
if (source === "agent") {
|
|
482
|
+
const wallet = await ensureWallet(config, source);
|
|
483
|
+
return { source: wallet.secretKey, wallet };
|
|
484
|
+
}
|
|
485
|
+
try {
|
|
486
|
+
const wallet = await loadWallet(config, source);
|
|
487
|
+
return { source: wallet.secretKey, wallet };
|
|
488
|
+
}
|
|
489
|
+
catch (error) {
|
|
490
|
+
if (!(error instanceof StellarAgentError) || error.code !== "WALLET_NOT_FOUND")
|
|
491
|
+
throw error;
|
|
492
|
+
return { source };
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
function redactStellarCliResult(result) {
|
|
496
|
+
return redactSensitive(result);
|
|
497
|
+
}
|
|
498
|
+
function firstOutputLine(output) {
|
|
499
|
+
const line = output
|
|
500
|
+
.split(/\r?\n/)
|
|
501
|
+
.map((item) => item.trim())
|
|
502
|
+
.find(Boolean);
|
|
503
|
+
return line || undefined;
|
|
504
|
+
}
|
|
505
|
+
function uniqueAssetCode() {
|
|
506
|
+
return `IA${Date.now().toString(36).slice(-10).toUpperCase()}`.slice(0, 12);
|
|
507
|
+
}
|
|
508
|
+
export async function ensureWallet(config, name) {
|
|
509
|
+
const path = walletPath(config, name);
|
|
510
|
+
try {
|
|
511
|
+
return await loadWallet(config, name);
|
|
512
|
+
}
|
|
513
|
+
catch (error) {
|
|
514
|
+
if (!(error instanceof StellarAgentError) || error.code !== "WALLET_NOT_FOUND")
|
|
515
|
+
throw error;
|
|
516
|
+
}
|
|
517
|
+
const wallet = createTestnetWallet(name);
|
|
518
|
+
await mkdir(dirname(path), { recursive: true });
|
|
519
|
+
await writeFile(path, `${JSON.stringify(wallet, null, 2)}\n`, { mode: 0o600 });
|
|
520
|
+
return wallet;
|
|
521
|
+
}
|
|
522
|
+
export async function loadWallet(config, name) {
|
|
523
|
+
const path = walletPath(config, name);
|
|
524
|
+
try {
|
|
525
|
+
const raw = await readFile(path, "utf8");
|
|
526
|
+
return testnetWalletSchema.parse(JSON.parse(raw));
|
|
527
|
+
}
|
|
528
|
+
catch (error) {
|
|
529
|
+
if (error?.code === "ENOENT") {
|
|
530
|
+
throw new StellarAgentError({
|
|
531
|
+
code: "WALLET_NOT_FOUND",
|
|
532
|
+
message: `Testnet wallet '${name}' was not found.`,
|
|
533
|
+
hint: "Run stellar-agent testnet init first.",
|
|
534
|
+
docs: "docs/quickstart-testnet.md"
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
throw new StellarAgentError({
|
|
538
|
+
code: "WALLET_INVALID",
|
|
539
|
+
message: `Testnet wallet '${name}' is invalid.`,
|
|
540
|
+
docs: "docs/troubleshooting.md#invalid-wallet",
|
|
541
|
+
details: error
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
export async function walletBalances(config, name) {
|
|
546
|
+
const wallet = await loadWalletPublic(config, name);
|
|
547
|
+
return getBalances(wallet.publicKey, profileForNetwork(config, wallet.network));
|
|
548
|
+
}
|
|
549
|
+
export async function walletTrustlines(config, name) {
|
|
550
|
+
return trustlinesFromBalances(await walletBalances(config, name));
|
|
551
|
+
}
|
|
552
|
+
export function trustlinesFromBalances(balances) {
|
|
553
|
+
return balances.filter((balance) => balance.asset !== "XLM");
|
|
554
|
+
}
|
|
555
|
+
export async function importPublicWallet(args) {
|
|
556
|
+
const wallet = {
|
|
557
|
+
schemaVersion: "stellar-agent.publicWallet.v1",
|
|
558
|
+
name: safeWalletName(args.name),
|
|
559
|
+
network: args.network,
|
|
560
|
+
publicKey: args.publicKey,
|
|
561
|
+
importedAt: new Date().toISOString(),
|
|
562
|
+
source: "watch-only"
|
|
563
|
+
};
|
|
564
|
+
const parsed = publicWalletSchema.parse(wallet);
|
|
565
|
+
const path = publicWalletPath(args.config, args.name, args.network);
|
|
566
|
+
await mkdir(dirname(path), { recursive: true });
|
|
567
|
+
await writeFile(path, `${JSON.stringify(parsed, null, 2)}\n`, { mode: 0o600 });
|
|
568
|
+
return parsed;
|
|
569
|
+
}
|
|
570
|
+
export async function loadWalletPublic(config, name) {
|
|
571
|
+
try {
|
|
572
|
+
const wallet = await loadWallet(config, name);
|
|
573
|
+
const { secretKey: _secretKey, ...publicFields } = wallet;
|
|
574
|
+
return { ...publicFields, hasSecret: true };
|
|
575
|
+
}
|
|
576
|
+
catch (error) {
|
|
577
|
+
if (!(error instanceof StellarAgentError) || error.code !== "WALLET_NOT_FOUND")
|
|
578
|
+
throw error;
|
|
579
|
+
}
|
|
580
|
+
for (const network of ["testnet", "mainnet", "local"]) {
|
|
581
|
+
try {
|
|
582
|
+
const raw = await readFile(publicWalletPath(config, name, network), "utf8");
|
|
583
|
+
return { ...publicWalletSchema.parse(JSON.parse(raw)), hasSecret: false };
|
|
584
|
+
}
|
|
585
|
+
catch (error) {
|
|
586
|
+
if (error?.code !== "ENOENT") {
|
|
587
|
+
throw new StellarAgentError({
|
|
588
|
+
code: "WALLET_INVALID",
|
|
589
|
+
message: `Watch-only wallet '${name}' is invalid.`,
|
|
590
|
+
docs: "docs/troubleshooting.md#invalid-wallet",
|
|
591
|
+
details: error
|
|
592
|
+
});
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
throw new StellarAgentError({
|
|
597
|
+
code: "WALLET_NOT_FOUND",
|
|
598
|
+
message: `Wallet '${name}' was not found.`,
|
|
599
|
+
hint: "Run stellar-agent wallet create-testnet or wallet import-public first.",
|
|
600
|
+
docs: "docs/quickstart-testnet.md#wallets"
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
export async function listWalletPublicViews(config) {
|
|
604
|
+
const dir = config.storage.walletsDir;
|
|
605
|
+
try {
|
|
606
|
+
const entries = await readdir(dir);
|
|
607
|
+
const names = new Set();
|
|
608
|
+
const views = [];
|
|
609
|
+
for (const entry of entries) {
|
|
610
|
+
if (entry.startsWith("testnet-") && entry.endsWith(".json")) {
|
|
611
|
+
names.add(entry.slice("testnet-".length, -".json".length));
|
|
612
|
+
}
|
|
613
|
+
if (entry.startsWith("watch-") && entry.endsWith(".json")) {
|
|
614
|
+
const raw = await readFile(join(dir, entry), "utf8");
|
|
615
|
+
views.push({ ...publicWalletSchema.parse(JSON.parse(raw)), hasSecret: false });
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
for (const name of names) {
|
|
619
|
+
views.push(await loadWalletPublic(config, name));
|
|
620
|
+
}
|
|
621
|
+
return views.sort((a, b) => a.name.localeCompare(b.name));
|
|
622
|
+
}
|
|
623
|
+
catch (error) {
|
|
624
|
+
if (error?.code === "ENOENT")
|
|
625
|
+
return [];
|
|
626
|
+
throw error;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
function walletPath(config, name) {
|
|
630
|
+
return join(config.storage.walletsDir, `testnet-${safeWalletName(name)}.json`);
|
|
631
|
+
}
|
|
632
|
+
function publicWalletPath(config, name, network) {
|
|
633
|
+
return join(config.storage.walletsDir, `watch-${network}-${safeWalletName(name)}.json`);
|
|
634
|
+
}
|
|
635
|
+
function profileForNetwork(config, network) {
|
|
636
|
+
const profile = config.profiles[network];
|
|
637
|
+
if (!profile) {
|
|
638
|
+
throw new StellarAgentError({
|
|
639
|
+
code: "PROFILE_NOT_FOUND",
|
|
640
|
+
message: `Profile '${network}' was not found.`,
|
|
641
|
+
hint: "Run stellar-agent profile list to see configured profiles."
|
|
642
|
+
});
|
|
643
|
+
}
|
|
644
|
+
return profile;
|
|
645
|
+
}
|
|
646
|
+
function safeWalletName(name) {
|
|
647
|
+
if (!/^[a-zA-Z0-9][a-zA-Z0-9._-]{0,63}$/.test(name)) {
|
|
648
|
+
throw new StellarAgentError({
|
|
649
|
+
code: "INVALID_INPUT",
|
|
650
|
+
message: "Wallet name must be 1-64 characters and use only letters, numbers, dot, underscore, or dash.",
|
|
651
|
+
docs: "docs/quickstart-testnet.md#wallets"
|
|
652
|
+
});
|
|
653
|
+
}
|
|
654
|
+
return name;
|
|
655
|
+
}
|
|
656
|
+
function resolveConfigPaths(config) {
|
|
657
|
+
const storageEntries = Object.entries(config.storage).map(([key, value]) => [key, resolvePath(value)]);
|
|
658
|
+
return {
|
|
659
|
+
...config,
|
|
660
|
+
storage: Object.fromEntries(storageEntries)
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
async function writeIfMissing(path, body, mode) {
|
|
664
|
+
try {
|
|
665
|
+
await readFile(path, "utf8");
|
|
666
|
+
}
|
|
667
|
+
catch (error) {
|
|
668
|
+
if (error?.code !== "ENOENT")
|
|
669
|
+
throw error;
|
|
670
|
+
await mkdir(dirname(path), { recursive: true });
|
|
671
|
+
await writeFile(path, body, { mode });
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
async function appendScenarioEvent(config, event, status, data) {
|
|
675
|
+
await appendEvent(join(config.storage.logsDir, "events.jsonl"), {
|
|
676
|
+
event,
|
|
677
|
+
status,
|
|
678
|
+
command: "testnet scenario",
|
|
679
|
+
profile: "testnet",
|
|
680
|
+
data
|
|
681
|
+
});
|
|
682
|
+
}
|
|
683
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@stellar-agent/testnet-suite",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Reusable Testnet wallet, Friendbot, policy, receipt, and smoke-test workflows for Stellar Agent Bridge.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+ssh://git@github.com/someone-in-texas/Stellar-Agent.git",
|
|
10
|
+
"directory": "packages/testnet-suite"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/someone-in-texas/Stellar-Agent/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/someone-in-texas/Stellar-Agent#readme",
|
|
16
|
+
"engines": {
|
|
17
|
+
"node": ">=22"
|
|
18
|
+
},
|
|
19
|
+
"main": "./dist/index.js",
|
|
20
|
+
"types": "./dist/index.d.ts",
|
|
21
|
+
"exports": {
|
|
22
|
+
".": {
|
|
23
|
+
"types": "./dist/index.d.ts",
|
|
24
|
+
"import": "./dist/index.js"
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": [
|
|
28
|
+
"dist"
|
|
29
|
+
],
|
|
30
|
+
"scripts": {
|
|
31
|
+
"build": "tsc -b",
|
|
32
|
+
"test": "vitest run"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@stellar-agent/core": "0.4.0",
|
|
36
|
+
"@stellar-agent/ledger-logger": "0.4.0",
|
|
37
|
+
"@stellar-agent/policy": "0.4.0",
|
|
38
|
+
"@stellar-agent/stellar": "0.4.0",
|
|
39
|
+
"yaml": "^2.7.1"
|
|
40
|
+
}
|
|
41
|
+
}
|