@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 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.
@@ -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
+ }