stellar-agent-kit 1.0.0 → 1.0.2

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/dist/index.cjs CHANGED
@@ -20,18 +20,24 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.ts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
+ BAND_ORACLE: () => BAND_ORACLE,
24
+ BLEND_POOLS: () => BLEND_POOLS,
25
+ BLEND_POOLS_MAINNET: () => BLEND_POOLS_MAINNET,
23
26
  MAINNET_ASSETS: () => MAINNET_ASSETS,
27
+ REFLECTOR_ORACLE: () => REFLECTOR_ORACLE,
24
28
  SOROSWAP_AGGREGATOR: () => SOROSWAP_AGGREGATOR,
25
29
  StellarAgentKit: () => StellarAgentKit,
26
- TESTNET_ASSETS: () => TESTNET_ASSETS,
27
30
  createDexClient: () => createDexClient,
31
+ createReflectorOracle: () => createReflectorOracle,
28
32
  getNetworkConfig: () => getNetworkConfig,
33
+ lendingBorrow: () => lendingBorrow,
34
+ lendingSupply: () => lendingSupply,
29
35
  networks: () => networks
30
36
  });
31
37
  module.exports = __toCommonJS(index_exports);
32
38
 
33
39
  // src/agent.ts
34
- var import_stellar_sdk3 = require("@stellar/stellar-sdk");
40
+ var import_stellar_sdk5 = require("@stellar/stellar-sdk");
35
41
 
36
42
  // src/config/networks.ts
37
43
  var import_zod = require("zod");
@@ -40,20 +46,16 @@ var NetworkConfigSchema = import_zod.z.object({
40
46
  sorobanRpcUrl: import_zod.z.string().url(),
41
47
  friendbotUrl: import_zod.z.string().url().optional()
42
48
  });
43
- var testnet = {
44
- horizonUrl: "https://horizon-testnet.stellar.org",
45
- sorobanRpcUrl: "https://soroban-testnet.stellar.org",
46
- friendbotUrl: "https://friendbot.stellar.org"
47
- };
48
49
  var mainnet = {
49
50
  horizonUrl: "https://horizon.stellar.org",
50
51
  sorobanRpcUrl: "https://soroban-rpc.mainnet.stellar.gateway.fm"
51
52
  };
52
- var networks = { testnet, mainnet };
53
+ var networks = { mainnet };
53
54
  function getNetworkConfig(name) {
54
- const parsed = import_zod.z.enum(["testnet", "mainnet"]).safeParse(name);
55
- if (!parsed.success) throw new Error(`Invalid network: ${name}. Use "testnet" or "mainnet".`);
56
- return networks[parsed.data];
55
+ if (name && name !== "mainnet") {
56
+ throw new Error("This project is mainnet-only. Use network: 'mainnet'.");
57
+ }
58
+ return mainnet;
57
59
  }
58
60
 
59
61
  // src/dex/soroSwap.ts
@@ -76,10 +78,9 @@ function parseApiQuote(data) {
76
78
  };
77
79
  }
78
80
  function createSoroSwapDexClient(networkConfig, apiKey) {
79
- const networkName = networkConfig.horizonUrl.includes("testnet") ? "testnet" : "mainnet";
80
81
  const key = apiKey ?? process.env.SOROSWAP_API_KEY;
81
82
  async function getQuote(from, to, amount) {
82
- const url = `${SOROSWAP_API_BASE}/quote?network=${networkName}`;
83
+ const url = `${SOROSWAP_API_BASE}/quote?network=mainnet`;
83
84
  const body = {
84
85
  assetIn: assetToApiString(from),
85
86
  assetOut: assetToApiString(to),
@@ -100,7 +101,7 @@ function createSoroSwapDexClient(networkConfig, apiKey) {
100
101
  if (!key) throw new Error("executeSwap requires SOROSWAP_API_KEY");
101
102
  const keypair = import_stellar_sdk.Keypair.fromSecret(secretKey.trim());
102
103
  const fromAddress = keypair.publicKey();
103
- const buildUrl = `${SOROSWAP_API_BASE}/quote/build?network=${networkName}`;
104
+ const buildUrl = `${SOROSWAP_API_BASE}/quote/build?network=mainnet`;
104
105
  const buildRes = await fetch(buildUrl, {
105
106
  method: "POST",
106
107
  headers: { "Content-Type": "application/json", Authorization: `Bearer ${key}` },
@@ -110,8 +111,8 @@ function createSoroSwapDexClient(networkConfig, apiKey) {
110
111
  const buildData = await buildRes.json();
111
112
  const xdrBase64 = buildData?.xdr;
112
113
  if (!xdrBase64 || typeof xdrBase64 !== "string") throw new Error("SoroSwap build response missing xdr");
113
- const config = getNetworkConfig(networkName);
114
- const networkPassphrase = config.horizonUrl.includes("testnet") ? import_stellar_sdk.Networks.TESTNET : import_stellar_sdk.Networks.PUBLIC;
114
+ const config = getNetworkConfig("mainnet");
115
+ const networkPassphrase = import_stellar_sdk.Networks.PUBLIC;
115
116
  const tx = import_stellar_sdk.TransactionBuilder.fromXDR(xdrBase64, networkPassphrase);
116
117
  tx.sign(keypair);
117
118
  const server = new import_stellar_sdk2.rpc.Server(config.sorobanRpcUrl, { allowHttp: config.sorobanRpcUrl.startsWith("http:") });
@@ -127,6 +128,206 @@ function createDexClient(networkConfig, apiKey) {
127
128
  return createSoroSwapDexClient(networkConfig, apiKey);
128
129
  }
129
130
 
131
+ // src/oracle/reflector.ts
132
+ var import_stellar_sdk3 = require("@stellar/stellar-sdk");
133
+
134
+ // src/config/oracles.ts
135
+ var REFLECTOR_ORACLE = {
136
+ /** Stellar Mainnet DEX prices */
137
+ dex: "CALI2BYU2JE6WVRUFYTS6MSBNEHGJ35P4AVCZYF3B6QOE3QKOB2PLE6M",
138
+ /** External CEX & DEX rates */
139
+ cexDex: "CAFJZQWSED6YAWZU3GWRTOCNPPCGBN32L7QV43XX5LZLFTK6JLN34DLN",
140
+ /** Fiat exchange rates */
141
+ fiat: "CBKGPWGKSKZF52CFHMTRR23TBWTPMRDIYZ4O2P5VS65BMHYH4DXMCJZC"
142
+ };
143
+ var BAND_ORACLE = "CCQXWMZVM3KRTXTUPTN53YHL272QGKF32L7XEDNZ2S6OSUFK3NFBGG5M";
144
+
145
+ // src/oracle/reflector.ts
146
+ var SIMULATION_SOURCE_MAINNET = "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN";
147
+ function assetToScVal(asset) {
148
+ if ("contractId" in asset && asset.contractId) {
149
+ const addr = new import_stellar_sdk3.Address(asset.contractId);
150
+ return import_stellar_sdk3.xdr.ScVal.scvVec([
151
+ import_stellar_sdk3.xdr.ScVal.scvSymbol("Stellar"),
152
+ import_stellar_sdk3.xdr.ScVal.scvAddress(addr.toScAddress())
153
+ ]);
154
+ }
155
+ if ("symbol" in asset && asset.symbol) {
156
+ return import_stellar_sdk3.xdr.ScVal.scvVec([
157
+ import_stellar_sdk3.xdr.ScVal.scvSymbol("Other"),
158
+ import_stellar_sdk3.xdr.ScVal.scvSymbol(asset.symbol)
159
+ ]);
160
+ }
161
+ throw new Error("Oracle asset must be { contractId } or { symbol }");
162
+ }
163
+ function parseLastPriceRetval(retvalInput, decimals) {
164
+ const retval = typeof retvalInput === "string" ? import_stellar_sdk3.xdr.ScVal.fromXDR(retvalInput, "base64") : retvalInput;
165
+ const vec = retval.vec();
166
+ if (!vec || vec.length === 0) {
167
+ throw new Error("Oracle returned no price (None) for this asset");
168
+ }
169
+ const inner = vec[0];
170
+ const dataVec = inner.vec();
171
+ if (dataVec && dataVec.length >= 2) {
172
+ const price = scValToI128(dataVec[0]);
173
+ const timestamp = Number(dataVec[1].u64()?.toString() ?? 0);
174
+ return { price, timestamp, decimals };
175
+ }
176
+ const m = inner.map();
177
+ if (m) {
178
+ for (const entry of m) {
179
+ const k = entry.key();
180
+ const v = entry.val();
181
+ if (k.sym && k.sym().toString() === "price" && v) {
182
+ const price = scValToI128(v);
183
+ let timestamp = 0;
184
+ for (const e2 of m) {
185
+ if (e2.key().sym && e2.key().sym().toString() === "timestamp") {
186
+ timestamp = Number(e2.val().u64()?.toString() ?? 0);
187
+ break;
188
+ }
189
+ }
190
+ return { price, timestamp, decimals };
191
+ }
192
+ }
193
+ }
194
+ throw new Error("Oracle price data format unexpected");
195
+ }
196
+ function scValToI128(val) {
197
+ const i128 = val.i128();
198
+ if (!i128) throw new Error("Expected i128 price");
199
+ const lo = i128.lo();
200
+ const hi = i128.hi();
201
+ if (!lo || hi === void 0) return "0";
202
+ const loNum = Number(lo);
203
+ const hiNum = Number(hi);
204
+ const negative = hiNum < 0;
205
+ const absLo = loNum < 0 ? 4294967296 + loNum : loNum;
206
+ const absHi = hiNum < 0 ? 4294967296 + hiNum : hiNum;
207
+ let n = BigInt(absLo) + (BigInt(absHi) << 32n);
208
+ if (negative) n = -n;
209
+ return String(n);
210
+ }
211
+ function createReflectorOracle(config) {
212
+ const feed = config.feed ?? "dex";
213
+ const contractId = REFLECTOR_ORACLE[feed];
214
+ const server = new import_stellar_sdk3.rpc.Server(config.networkConfig.sorobanRpcUrl, {
215
+ allowHttp: config.networkConfig.sorobanRpcUrl.startsWith("http:")
216
+ });
217
+ const networkPassphrase = import_stellar_sdk3.Networks.PUBLIC;
218
+ async function decimals() {
219
+ const contract = new import_stellar_sdk3.Contract(contractId);
220
+ const op = contract.call("decimals");
221
+ const acc = await server.getAccount(SIMULATION_SOURCE_MAINNET);
222
+ const tx = new import_stellar_sdk3.TransactionBuilder(acc, {
223
+ fee: "10000",
224
+ networkPassphrase
225
+ }).addOperation(op).setTimeout(30).build();
226
+ const sim = await server.simulateTransaction(tx);
227
+ if ("error" in sim && sim.error) throw new Error(String(sim.error));
228
+ const ret = sim?.result?.retval;
229
+ if (ret == null) throw new Error("No decimals retval");
230
+ const val = typeof ret === "string" ? import_stellar_sdk3.xdr.ScVal.fromXDR(ret, "base64") : ret;
231
+ const u = val.u32();
232
+ return u ?? 7;
233
+ }
234
+ async function lastprice(asset) {
235
+ const contract = new import_stellar_sdk3.Contract(contractId);
236
+ const assetScVal = assetToScVal(asset);
237
+ const op = contract.call("lastprice", assetScVal);
238
+ const acc = await server.getAccount(SIMULATION_SOURCE_MAINNET);
239
+ const tx = new import_stellar_sdk3.TransactionBuilder(acc, {
240
+ fee: "10000",
241
+ networkPassphrase
242
+ }).addOperation(op).setTimeout(30).build();
243
+ const sim = await server.simulateTransaction(tx);
244
+ if ("error" in sim && sim.error) throw new Error(String(sim.error));
245
+ const ret = sim?.result?.retval;
246
+ if (ret == null) throw new Error("Oracle lastprice: no retval");
247
+ const dec = await decimals();
248
+ return parseLastPriceRetval(ret, dec);
249
+ }
250
+ return { lastprice, decimals, contractId };
251
+ }
252
+
253
+ // src/lending/blend.ts
254
+ var import_stellar_sdk4 = require("@stellar/stellar-sdk");
255
+ var import_blend_sdk = require("@blend-capital/blend-sdk");
256
+ var BLEND_POOLS_MAINNET = "CCCCIQSDILITHMM7PBSLVDT5MISSY7R26MNZXCX4H7J5JQ5FPIYOGYFS";
257
+ var BLEND_POOLS = { mainnet: BLEND_POOLS_MAINNET };
258
+ async function buildSubmitTx(networkConfig, secretKey, poolId, requests) {
259
+ const keypair = import_stellar_sdk4.Keypair.fromSecret(secretKey.trim());
260
+ const user = keypair.publicKey();
261
+ const pool = new import_blend_sdk.PoolContractV2(poolId);
262
+ const submitOpXdr = pool.submit({
263
+ from: user,
264
+ spender: user,
265
+ to: user,
266
+ requests
267
+ });
268
+ const op = import_stellar_sdk4.xdr.Operation.fromXDR(submitOpXdr, "base64");
269
+ const networkPassphrase = import_stellar_sdk4.Networks.PUBLIC;
270
+ const horizon = new import_stellar_sdk4.Horizon.Server(networkConfig.horizonUrl);
271
+ const sourceAccount = await horizon.loadAccount(user);
272
+ const tx = new import_stellar_sdk4.TransactionBuilder(sourceAccount, {
273
+ fee: "10000",
274
+ networkPassphrase
275
+ }).addOperation(op).setTimeout(180).build();
276
+ return { tx, keypair };
277
+ }
278
+ async function lendingSupply(networkConfig, secretKey, args) {
279
+ const amountBigInt = BigInt(args.amount);
280
+ const requests = [
281
+ {
282
+ request_type: import_blend_sdk.RequestType.SupplyCollateral,
283
+ address: args.assetContractId,
284
+ amount: amountBigInt
285
+ }
286
+ ];
287
+ const { tx, keypair } = await buildSubmitTx(
288
+ networkConfig,
289
+ secretKey,
290
+ args.poolId,
291
+ requests
292
+ );
293
+ const server = new import_stellar_sdk4.rpc.Server(networkConfig.sorobanRpcUrl, {
294
+ allowHttp: networkConfig.sorobanRpcUrl.startsWith("http:")
295
+ });
296
+ const prepared = await server.prepareTransaction(tx);
297
+ prepared.sign(keypair);
298
+ const sendResult = await server.sendTransaction(prepared);
299
+ if (sendResult.errorResult) {
300
+ throw new Error(`Blend supply failed: ${String(sendResult.errorResult)}`);
301
+ }
302
+ return { hash: sendResult.hash, status: sendResult.status ?? "PENDING" };
303
+ }
304
+ async function lendingBorrow(networkConfig, secretKey, args) {
305
+ const amountBigInt = BigInt(args.amount);
306
+ const requests = [
307
+ {
308
+ request_type: import_blend_sdk.RequestType.Borrow,
309
+ address: args.assetContractId,
310
+ amount: amountBigInt
311
+ }
312
+ ];
313
+ const { tx, keypair } = await buildSubmitTx(
314
+ networkConfig,
315
+ secretKey,
316
+ args.poolId,
317
+ requests
318
+ );
319
+ const server = new import_stellar_sdk4.rpc.Server(networkConfig.sorobanRpcUrl, {
320
+ allowHttp: networkConfig.sorobanRpcUrl.startsWith("http:")
321
+ });
322
+ const prepared = await server.prepareTransaction(tx);
323
+ prepared.sign(keypair);
324
+ const sendResult = await server.sendTransaction(prepared);
325
+ if (sendResult.errorResult) {
326
+ throw new Error(`Blend borrow failed: ${String(sendResult.errorResult)}`);
327
+ }
328
+ return { hash: sendResult.hash, status: sendResult.status ?? "PENDING" };
329
+ }
330
+
130
331
  // src/agent.ts
131
332
  var StellarAgentKit = class {
132
333
  keypair;
@@ -135,18 +336,23 @@ var StellarAgentKit = class {
135
336
  _initialized = false;
136
337
  _dex = null;
137
338
  _horizon = null;
138
- constructor(secretKey, network) {
139
- this.keypair = import_stellar_sdk3.Keypair.fromSecret(secretKey.trim());
140
- this.network = network;
141
- this.config = getNetworkConfig(network);
339
+ _oracle = null;
340
+ constructor(secretKey, network = "mainnet") {
341
+ if (network !== "mainnet") {
342
+ throw new Error("This project is mainnet-only. Use network: 'mainnet'.");
343
+ }
344
+ this.keypair = import_stellar_sdk5.Keypair.fromSecret(secretKey.trim());
345
+ this.network = "mainnet";
346
+ this.config = getNetworkConfig();
142
347
  }
143
348
  /**
144
349
  * Initialize clients (Horizon, Soroban RPC, protocol wrappers).
145
350
  * Call after construction before using protocol methods.
146
351
  */
147
352
  async initialize() {
148
- this._horizon = new import_stellar_sdk3.Horizon.Server(this.config.horizonUrl);
353
+ this._horizon = new import_stellar_sdk5.Horizon.Server(this.config.horizonUrl);
149
354
  this._dex = createDexClient(this.config, process.env.SOROSWAP_API_KEY);
355
+ this._oracle = createReflectorOracle({ networkConfig: this.config });
150
356
  this._initialized = true;
151
357
  return this;
152
358
  }
@@ -188,47 +394,64 @@ var StellarAgentKit = class {
188
394
  async sendPayment(to, amount, assetCode, assetIssuer) {
189
395
  this.ensureInitialized();
190
396
  if (!this._horizon) throw new Error("Horizon not initialized");
191
- const networkPassphrase = this.network === "testnet" ? import_stellar_sdk3.Networks.TESTNET : import_stellar_sdk3.Networks.PUBLIC;
397
+ const networkPassphrase = import_stellar_sdk5.Networks.PUBLIC;
192
398
  const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());
193
- const asset = assetCode && assetIssuer ? new import_stellar_sdk3.Asset(assetCode, assetIssuer) : import_stellar_sdk3.Asset.native();
194
- const tx = new import_stellar_sdk3.TransactionBuilder(sourceAccount, {
399
+ const asset = assetCode && assetIssuer ? new import_stellar_sdk5.Asset(assetCode, assetIssuer) : import_stellar_sdk5.Asset.native();
400
+ const tx = new import_stellar_sdk5.TransactionBuilder(sourceAccount, {
195
401
  fee: "100",
196
402
  networkPassphrase
197
- }).addOperation(import_stellar_sdk3.Operation.payment({ destination: to, asset, amount })).setTimeout(180).build();
403
+ }).addOperation(import_stellar_sdk5.Operation.payment({ destination: to, asset, amount })).setTimeout(180).build();
198
404
  tx.sign(this.keypair);
199
405
  const result = await this._horizon.submitTransaction(tx);
200
406
  return { hash: result.hash };
201
407
  }
202
- // ─── Placeholders for lending / oracle / cross-chain (plug later) ────────────
203
- // async lendingSupply(asset: DexAsset, amount: string): Promise<{ hash: string }> { ... }
204
- // async lendingBorrow(asset: DexAsset, amount: string): Promise<{ hash: string }> { ... }
205
- // async getPrice(assetOrFeedId: string): Promise<{ price: string }> { ... }
206
- // async crossChainSwap(...): Promise<SwapResult> { ... }
408
+ // ─── Oracle (Reflector SEP-40) ─────────────────────────────────────────────
409
+ /**
410
+ * Get latest price for an asset from Reflector oracle.
411
+ * @param asset - { contractId: "C..." } for on-chain token or { symbol: "XLM" } for ticker
412
+ */
413
+ async getPrice(asset) {
414
+ this.ensureInitialized();
415
+ if (!this._oracle) throw new Error("Oracle not initialized");
416
+ return this._oracle.lastprice(asset);
417
+ }
418
+ // ─── Lending (Blend) ───────────────────────────────────────────────────────
419
+ /**
420
+ * Supply (deposit) an asset to a Blend pool.
421
+ */
422
+ async lendingSupply(args) {
423
+ this.ensureInitialized();
424
+ return lendingSupply(this.config, this.keypair.secret(), args);
425
+ }
426
+ /**
427
+ * Borrow an asset from a Blend pool.
428
+ */
429
+ async lendingBorrow(args) {
430
+ this.ensureInitialized();
431
+ return lendingBorrow(this.config, this.keypair.secret(), args);
432
+ }
207
433
  };
208
434
 
209
435
  // src/config/assets.ts
210
- var TESTNET_ASSETS = {
211
- XLM: { contractId: "CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC" },
212
- USDC: { contractId: "CBBHRKEP5M3NUDRISGLJKGHDHX3DA2CN2AZBQY6WLVUJ7VNLGSKBDUCM" },
213
- /** Classic testnet USDC */
214
- AUSDC: { code: "AUSDC", issuer: "GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN" }
215
- };
216
436
  var MAINNET_ASSETS = {
217
437
  XLM: { contractId: "CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA" },
218
438
  USDC: { contractId: "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" }
219
439
  };
220
- var SOROSWAP_AGGREGATOR = {
221
- testnet: "CCJUD55AG6W5HAI5LRVNKAE5WDP5XGZBUDS5WNTIVDU7O264UZZE7BRD",
222
- mainnet: "CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH"
223
- };
440
+ var SOROSWAP_AGGREGATOR = "CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH";
224
441
  // Annotate the CommonJS export names for ESM import in node:
225
442
  0 && (module.exports = {
443
+ BAND_ORACLE,
444
+ BLEND_POOLS,
445
+ BLEND_POOLS_MAINNET,
226
446
  MAINNET_ASSETS,
447
+ REFLECTOR_ORACLE,
227
448
  SOROSWAP_AGGREGATOR,
228
449
  StellarAgentKit,
229
- TESTNET_ASSETS,
230
450
  createDexClient,
451
+ createReflectorOracle,
231
452
  getNetworkConfig,
453
+ lendingBorrow,
454
+ lendingSupply,
232
455
  networks
233
456
  });
234
457
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/config/networks.ts","../src/dex/soroSwap.ts","../src/dex/index.ts","../src/config/assets.ts"],"sourcesContent":["export { StellarAgentKit, type StellarNetwork } from \"./agent.js\";\nexport { getNetworkConfig, networks, type NetworkConfig, type NetworkName } from \"./config/networks.js\";\nexport {\n TESTNET_ASSETS,\n MAINNET_ASSETS,\n SOROSWAP_AGGREGATOR,\n type StellarAsset,\n} from \"./config/assets.js\";\nexport {\n createDexClient,\n type DexClient,\n type DexAsset,\n type QuoteResult,\n type SwapResult,\n} from \"./dex/index.js\";\n","/**\n * StellarAgentKit – unified DeFi agent (MNTAgentKit-style API for Stellar).\n * Constructor(secretKey, network) + initialize() then protocol methods.\n */\n\nimport { Keypair, Asset, TransactionBuilder, Operation, Networks, Horizon } from \"@stellar/stellar-sdk\";\nimport { getNetworkConfig, type NetworkConfig } from \"./config/networks.js\";\nimport { createDexClient, type DexAsset, type QuoteResult, type SwapResult } from \"./dex/index.js\";\n\nexport type StellarNetwork = \"mainnet\" | \"testnet\";\n\nexport class StellarAgentKit {\n public readonly keypair: Keypair;\n public readonly network: StellarNetwork;\n public readonly config: NetworkConfig;\n private _initialized = false;\n private _dex: ReturnType<typeof createDexClient> | null = null;\n private _horizon: Horizon.Server | null = null;\n\n constructor(secretKey: string, network: StellarNetwork) {\n this.keypair = Keypair.fromSecret(secretKey.trim());\n this.network = network;\n this.config = getNetworkConfig(network);\n }\n\n /**\n * Initialize clients (Horizon, Soroban RPC, protocol wrappers).\n * Call after construction before using protocol methods.\n */\n async initialize(): Promise<this> {\n this._horizon = new Horizon.Server(this.config.horizonUrl);\n this._dex = createDexClient(this.config, process.env.SOROSWAP_API_KEY);\n this._initialized = true;\n return this;\n }\n\n private ensureInitialized(): void {\n if (!this._initialized || !this._dex) {\n throw new Error(\"StellarAgentKit not initialized. Call await agent.initialize() first.\");\n }\n }\n\n // ─── DEX Operations (mirror Mantle agniSwap / executeSwap) ─────────────────\n\n /**\n * Get a swap quote (exact-in). Uses SoroSwap aggregator (SoroSwap, Phoenix, Aqua).\n */\n async dexGetQuote(\n fromAsset: DexAsset,\n toAsset: DexAsset,\n amount: string\n ): Promise<QuoteResult> {\n this.ensureInitialized();\n return this._dex!.getQuote(fromAsset, toAsset, amount);\n }\n\n /**\n * Execute a swap using a prior quote.\n */\n async dexSwap(quote: QuoteResult): Promise<SwapResult> {\n this.ensureInitialized();\n return this._dex!.executeSwap(this.keypair.secret(), quote);\n }\n\n /**\n * One-shot: get quote and execute swap (convenience).\n */\n async dexSwapExactIn(\n fromAsset: DexAsset,\n toAsset: DexAsset,\n amount: string\n ): Promise<SwapResult> {\n const quote = await this.dexGetQuote(fromAsset, toAsset, amount);\n return this.dexSwap(quote);\n }\n\n // ─── Payments (Horizon) ────────────────────────────────────────────────────\n\n /**\n * Send a native or custom-asset payment (Horizon).\n * @param to - Destination account (G...)\n * @param amount - Amount in display units (e.g. \"10\" for 10 XLM)\n * @param assetCode - Optional; omit for native XLM\n * @param assetIssuer - Optional; required if assetCode is set\n */\n async sendPayment(\n to: string,\n amount: string,\n assetCode?: string,\n assetIssuer?: string\n ): Promise<{ hash: string }> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n\n const networkPassphrase =\n this.network === \"testnet\" ? Networks.TESTNET : Networks.PUBLIC;\n const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());\n\n const asset =\n assetCode && assetIssuer\n ? new Asset(assetCode, assetIssuer)\n : Asset.native();\n\n const tx = new TransactionBuilder(sourceAccount, {\n fee: \"100\",\n networkPassphrase,\n })\n .addOperation(Operation.payment({ destination: to, asset, amount }))\n .setTimeout(180)\n .build();\n\n tx.sign(this.keypair);\n const result = await this._horizon.submitTransaction(tx);\n return { hash: result.hash };\n }\n\n // ─── Placeholders for lending / oracle / cross-chain (plug later) ────────────\n\n // async lendingSupply(asset: DexAsset, amount: string): Promise<{ hash: string }> { ... }\n // async lendingBorrow(asset: DexAsset, amount: string): Promise<{ hash: string }> { ... }\n // async getPrice(assetOrFeedId: string): Promise<{ price: string }> { ... }\n // async crossChainSwap(...): Promise<SwapResult> { ... }\n}\n","import { z } from \"zod\";\n\nexport const NetworkConfigSchema = z.object({\n horizonUrl: z.string().url(),\n sorobanRpcUrl: z.string().url(),\n friendbotUrl: z.string().url().optional(),\n});\n\nexport type NetworkConfig = z.infer<typeof NetworkConfigSchema>;\n\nexport const testnet: NetworkConfig = {\n horizonUrl: \"https://horizon-testnet.stellar.org\",\n sorobanRpcUrl: \"https://soroban-testnet.stellar.org\",\n friendbotUrl: \"https://friendbot.stellar.org\",\n};\n\nexport const mainnet: NetworkConfig = {\n horizonUrl: \"https://horizon.stellar.org\",\n sorobanRpcUrl: \"https://soroban-rpc.mainnet.stellar.gateway.fm\",\n};\n\nexport const networks = { testnet, mainnet } as const;\nexport type NetworkName = keyof typeof networks;\n\nexport function getNetworkConfig(name: string): NetworkConfig {\n const parsed = z.enum([\"testnet\", \"mainnet\"]).safeParse(name);\n if (!parsed.success) throw new Error(`Invalid network: ${name}. Use \"testnet\" or \"mainnet\".`);\n return networks[parsed.data];\n}\n","/**\n * SoroSwap DEX client – quote via API, build + sign + submit for executeSwap.\n */\n\nimport { Keypair, TransactionBuilder, Networks } from \"@stellar/stellar-sdk\";\nimport { rpc } from \"@stellar/stellar-sdk\";\nimport type { NetworkConfig } from \"../config/networks.js\";\nimport { getNetworkConfig, type NetworkName } from \"../config/networks.js\";\nimport type { DexAsset, QuoteResult, SwapResult } from \"./types.js\";\n\nconst SOROSWAP_API_BASE = \"https://api.soroswap.finance\";\n\nfunction assetToApiString(asset: DexAsset): string {\n if (asset.contractId) return asset.contractId;\n if (asset.code && asset.issuer) return `${asset.code}:${asset.issuer}`;\n throw new Error(\"Asset must have contractId or code+issuer\");\n}\n\nfunction parseApiQuote(data: unknown): QuoteResult {\n const o = data as Record<string, unknown>;\n return {\n expectedIn: String(o?.expectedIn ?? o?.amountIn ?? \"0\"),\n expectedOut: String(o?.expectedOut ?? o?.amountOut ?? \"0\"),\n minOut: String(o?.minOut ?? o?.minimumAmountOut ?? o?.expectedOut ?? \"0\"),\n route: Array.isArray(o?.route) ? (o.route as string[]) : Array.isArray(o?.path) ? (o.path as string[]) : [],\n rawData: data,\n };\n}\n\nexport function createSoroSwapDexClient(\n networkConfig: NetworkConfig,\n apiKey?: string\n): { getQuote: (from: DexAsset, to: DexAsset, amount: string) => Promise<QuoteResult>; executeSwap: (secretKey: string, quote: QuoteResult) => Promise<SwapResult> } {\n const networkName: NetworkName = networkConfig.horizonUrl.includes(\"testnet\") ? \"testnet\" : \"mainnet\";\n const key = apiKey ?? process.env.SOROSWAP_API_KEY;\n\n async function getQuote(from: DexAsset, to: DexAsset, amount: string): Promise<QuoteResult> {\n const url = `${SOROSWAP_API_BASE}/quote?network=${networkName}`;\n const body = {\n assetIn: assetToApiString(from),\n assetOut: assetToApiString(to),\n amount: String(amount).trim(),\n tradeType: \"EXACT_IN\",\n protocols: [\"soroswap\", \"phoenix\", \"aqua\"],\n };\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\n if (key) headers[\"Authorization\"] = `Bearer ${key}`;\n const res = await fetch(url, { method: \"POST\", headers, body: JSON.stringify(body) });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`SoroSwap quote failed ${res.status}: ${text}`);\n }\n return parseApiQuote(await res.json());\n }\n\n async function executeSwap(secretKey: string, quote: QuoteResult): Promise<SwapResult> {\n if (!key) throw new Error(\"executeSwap requires SOROSWAP_API_KEY\");\n const keypair = Keypair.fromSecret(secretKey.trim());\n const fromAddress = keypair.publicKey();\n const buildUrl = `${SOROSWAP_API_BASE}/quote/build?network=${networkName}`;\n const buildRes = await fetch(buildUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\n body: JSON.stringify({ quote: quote.rawData ?? quote, from: fromAddress, to: fromAddress }),\n });\n if (!buildRes.ok) throw new Error(`SoroSwap build failed ${buildRes.status}: ${await buildRes.text()}`);\n const buildData = (await buildRes.json()) as { xdr?: string };\n const xdrBase64 = buildData?.xdr;\n if (!xdrBase64 || typeof xdrBase64 !== \"string\") throw new Error(\"SoroSwap build response missing xdr\");\n const config = getNetworkConfig(networkName);\n const networkPassphrase = config.horizonUrl.includes(\"testnet\") ? Networks.TESTNET : Networks.PUBLIC;\n const tx = TransactionBuilder.fromXDR(xdrBase64, networkPassphrase);\n tx.sign(keypair);\n const server = new rpc.Server(config.sorobanRpcUrl, { allowHttp: config.sorobanRpcUrl.startsWith(\"http:\") });\n const sendResult = await server.sendTransaction(tx);\n if (sendResult.errorResult) throw new Error(`Soroban sendTransaction failed: ${String(sendResult.errorResult)}`);\n return { hash: sendResult.hash, status: sendResult.status ?? \"PENDING\" };\n }\n\n return { getQuote, executeSwap };\n}\n","/**\n * DEX module – swap, quote, aggregator (SoroSwap).\n * Pluggable: add more DEXes by implementing DexClient.\n */\n\nimport type { NetworkConfig } from \"../config/networks.js\";\nimport type { DexAsset, QuoteResult, SwapResult } from \"./types.js\";\nimport { createSoroSwapDexClient } from \"./soroSwap.js\";\n\nexport type { DexAsset, QuoteResult, SwapResult } from \"./types.js\";\nexport { createSoroSwapDexClient } from \"./soroSwap.js\";\n\nexport interface DexClient {\n getQuote(fromAsset: DexAsset, toAsset: DexAsset, amount: string): Promise<QuoteResult>;\n executeSwap(secretKey: string, quote: QuoteResult): Promise<SwapResult>;\n}\n\n/**\n * Build a DEX client for the given network (SoroSwap aggregator).\n */\nexport function createDexClient(networkConfig: NetworkConfig, apiKey?: string): DexClient {\n return createSoroSwapDexClient(networkConfig, apiKey);\n}\n","/**\n * Stellar asset identifiers and contract addresses.\n * Centralized for mainnet/testnet (mirrors Mantle DevKit \"Token Addresses\").\n */\n\nexport type StellarAsset = { code: string; issuer: string } | { contractId: string };\n\nexport const TESTNET_ASSETS = {\n XLM: { contractId: \"CDLZFC3SYJYDZT7K67VZ75HPJVIEUVNIXF47ZG2FB2RMQQVU2HHGCYSC\" },\n USDC: { contractId: \"CBBHRKEP5M3NUDRISGLJKGHDHX3DA2CN2AZBQY6WLVUJ7VNLGSKBDUCM\" },\n /** Classic testnet USDC */\n AUSDC: { code: \"AUSDC\", issuer: \"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN\" },\n} as const;\n\nexport const MAINNET_ASSETS = {\n XLM: { contractId: \"CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA\" },\n USDC: { contractId: \"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75\" },\n} as const;\n\nexport const SOROSWAP_AGGREGATOR = {\n testnet: \"CCJUD55AG6W5HAI5LRVNKAE5WDP5XGZBUDS5WNTIVDU7O264UZZE7BRD\",\n mainnet: \"CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH\",\n} as const;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,IAAAA,sBAAiF;;;ACLjF,iBAAkB;AAEX,IAAM,sBAAsB,aAAE,OAAO;AAAA,EAC1C,YAAY,aAAE,OAAO,EAAE,IAAI;AAAA,EAC3B,eAAe,aAAE,OAAO,EAAE,IAAI;AAAA,EAC9B,cAAc,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAC1C,CAAC;AAIM,IAAM,UAAyB;AAAA,EACpC,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,cAAc;AAChB;AAEO,IAAM,UAAyB;AAAA,EACpC,YAAY;AAAA,EACZ,eAAe;AACjB;AAEO,IAAM,WAAW,EAAE,SAAS,QAAQ;AAGpC,SAAS,iBAAiB,MAA6B;AAC5D,QAAM,SAAS,aAAE,KAAK,CAAC,WAAW,SAAS,CAAC,EAAE,UAAU,IAAI;AAC5D,MAAI,CAAC,OAAO,QAAS,OAAM,IAAI,MAAM,oBAAoB,IAAI,+BAA+B;AAC5F,SAAO,SAAS,OAAO,IAAI;AAC7B;;;ACxBA,yBAAsD;AACtD,IAAAC,sBAAoB;AAKpB,IAAM,oBAAoB;AAE1B,SAAS,iBAAiB,OAAyB;AACjD,MAAI,MAAM,WAAY,QAAO,MAAM;AACnC,MAAI,MAAM,QAAQ,MAAM,OAAQ,QAAO,GAAG,MAAM,IAAI,IAAI,MAAM,MAAM;AACpE,QAAM,IAAI,MAAM,2CAA2C;AAC7D;AAEA,SAAS,cAAc,MAA4B;AACjD,QAAM,IAAI;AACV,SAAO;AAAA,IACL,YAAY,OAAO,GAAG,cAAc,GAAG,YAAY,GAAG;AAAA,IACtD,aAAa,OAAO,GAAG,eAAe,GAAG,aAAa,GAAG;AAAA,IACzD,QAAQ,OAAO,GAAG,UAAU,GAAG,oBAAoB,GAAG,eAAe,GAAG;AAAA,IACxE,OAAO,MAAM,QAAQ,GAAG,KAAK,IAAK,EAAE,QAAqB,MAAM,QAAQ,GAAG,IAAI,IAAK,EAAE,OAAoB,CAAC;AAAA,IAC1G,SAAS;AAAA,EACX;AACF;AAEO,SAAS,wBACd,eACA,QACmK;AACnK,QAAM,cAA2B,cAAc,WAAW,SAAS,SAAS,IAAI,YAAY;AAC5F,QAAM,MAAM,UAAU,QAAQ,IAAI;AAElC,iBAAe,SAAS,MAAgB,IAAc,QAAsC;AAC1F,UAAM,MAAM,GAAG,iBAAiB,kBAAkB,WAAW;AAC7D,UAAM,OAAO;AAAA,MACX,SAAS,iBAAiB,IAAI;AAAA,MAC9B,UAAU,iBAAiB,EAAE;AAAA,MAC7B,QAAQ,OAAO,MAAM,EAAE,KAAK;AAAA,MAC5B,WAAW;AAAA,MACX,WAAW,CAAC,YAAY,WAAW,MAAM;AAAA,IAC3C;AACA,UAAM,UAAkC,EAAE,gBAAgB,mBAAmB;AAC7E,QAAI,IAAK,SAAQ,eAAe,IAAI,UAAU,GAAG;AACjD,UAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAQ,QAAQ,SAAS,MAAM,KAAK,UAAU,IAAI,EAAE,CAAC;AACpF,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,IAAI,MAAM,yBAAyB,IAAI,MAAM,KAAK,IAAI,EAAE;AAAA,IAChE;AACA,WAAO,cAAc,MAAM,IAAI,KAAK,CAAC;AAAA,EACvC;AAEA,iBAAe,YAAY,WAAmB,OAAyC;AACrF,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,uCAAuC;AACjE,UAAM,UAAU,2BAAQ,WAAW,UAAU,KAAK,CAAC;AACnD,UAAM,cAAc,QAAQ,UAAU;AACtC,UAAM,WAAW,GAAG,iBAAiB,wBAAwB,WAAW;AACxE,UAAM,WAAW,MAAM,MAAM,UAAU;AAAA,MACrC,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,oBAAoB,eAAe,UAAU,GAAG,GAAG;AAAA,MAC9E,MAAM,KAAK,UAAU,EAAE,OAAO,MAAM,WAAW,OAAO,MAAM,aAAa,IAAI,YAAY,CAAC;AAAA,IAC5F,CAAC;AACD,QAAI,CAAC,SAAS,GAAI,OAAM,IAAI,MAAM,yBAAyB,SAAS,MAAM,KAAK,MAAM,SAAS,KAAK,CAAC,EAAE;AACtG,UAAM,YAAa,MAAM,SAAS,KAAK;AACvC,UAAM,YAAY,WAAW;AAC7B,QAAI,CAAC,aAAa,OAAO,cAAc,SAAU,OAAM,IAAI,MAAM,qCAAqC;AACtG,UAAM,SAAS,iBAAiB,WAAW;AAC3C,UAAM,oBAAoB,OAAO,WAAW,SAAS,SAAS,IAAI,4BAAS,UAAU,4BAAS;AAC9F,UAAM,KAAK,sCAAmB,QAAQ,WAAW,iBAAiB;AAClE,OAAG,KAAK,OAAO;AACf,UAAM,SAAS,IAAI,wBAAI,OAAO,OAAO,eAAe,EAAE,WAAW,OAAO,cAAc,WAAW,OAAO,EAAE,CAAC;AAC3G,UAAM,aAAa,MAAM,OAAO,gBAAgB,EAAE;AAClD,QAAI,WAAW,YAAa,OAAM,IAAI,MAAM,mCAAmC,OAAO,WAAW,WAAW,CAAC,EAAE;AAC/G,WAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,WAAW,UAAU,UAAU;AAAA,EACzE;AAEA,SAAO,EAAE,UAAU,YAAY;AACjC;;;AC5DO,SAAS,gBAAgB,eAA8B,QAA4B;AACxF,SAAO,wBAAwB,eAAe,MAAM;AACtD;;;AHXO,IAAM,kBAAN,MAAsB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACR,eAAe;AAAA,EACf,OAAkD;AAAA,EAClD,WAAkC;AAAA,EAE1C,YAAY,WAAmB,SAAyB;AACtD,SAAK,UAAU,4BAAQ,WAAW,UAAU,KAAK,CAAC;AAClD,SAAK,UAAU;AACf,SAAK,SAAS,iBAAiB,OAAO;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,aAA4B;AAChC,SAAK,WAAW,IAAI,4BAAQ,OAAO,KAAK,OAAO,UAAU;AACzD,SAAK,OAAO,gBAAgB,KAAK,QAAQ,QAAQ,IAAI,gBAAgB;AACrE,SAAK,eAAe;AACpB,WAAO;AAAA,EACT;AAAA,EAEQ,oBAA0B;AAChC,QAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,MAAM;AACpC,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,YACJ,WACA,SACA,QACsB;AACtB,SAAK,kBAAkB;AACvB,WAAO,KAAK,KAAM,SAAS,WAAW,SAAS,MAAM;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QAAQ,OAAyC;AACrD,SAAK,kBAAkB;AACvB,WAAO,KAAK,KAAM,YAAY,KAAK,QAAQ,OAAO,GAAG,KAAK;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,WACA,SACA,QACqB;AACrB,UAAM,QAAQ,MAAM,KAAK,YAAY,WAAW,SAAS,MAAM;AAC/D,WAAO,KAAK,QAAQ,KAAK;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,YACJ,IACA,QACA,WACA,aAC2B;AAC3B,SAAK,kBAAkB;AACvB,QAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,yBAAyB;AAE7D,UAAM,oBACJ,KAAK,YAAY,YAAY,6BAAS,UAAU,6BAAS;AAC3D,UAAM,gBAAgB,MAAM,KAAK,SAAS,YAAY,KAAK,QAAQ,UAAU,CAAC;AAE9E,UAAM,QACJ,aAAa,cACT,IAAI,0BAAM,WAAW,WAAW,IAChC,0BAAM,OAAO;AAEnB,UAAM,KAAK,IAAI,uCAAmB,eAAe;AAAA,MAC/C,KAAK;AAAA,MACL;AAAA,IACF,CAAC,EACE,aAAa,8BAAU,QAAQ,EAAE,aAAa,IAAI,OAAO,OAAO,CAAC,CAAC,EAClE,WAAW,GAAG,EACd,MAAM;AAET,OAAG,KAAK,KAAK,OAAO;AACpB,UAAM,SAAS,MAAM,KAAK,SAAS,kBAAkB,EAAE;AACvD,WAAO,EAAE,MAAM,OAAO,KAAK;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAQF;;;AInHO,IAAM,iBAAiB;AAAA,EAC5B,KAAK,EAAE,YAAY,2DAA2D;AAAA,EAC9E,MAAM,EAAE,YAAY,2DAA2D;AAAA;AAAA,EAE/E,OAAO,EAAE,MAAM,SAAS,QAAQ,2DAA2D;AAC7F;AAEO,IAAM,iBAAiB;AAAA,EAC5B,KAAK,EAAE,YAAY,2DAA2D;AAAA,EAC9E,MAAM,EAAE,YAAY,2DAA2D;AACjF;AAEO,IAAM,sBAAsB;AAAA,EACjC,SAAS;AAAA,EACT,SAAS;AACX;","names":["import_stellar_sdk","import_stellar_sdk"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/agent.ts","../src/config/networks.ts","../src/dex/soroSwap.ts","../src/dex/index.ts","../src/oracle/reflector.ts","../src/config/oracles.ts","../src/lending/blend.ts","../src/config/assets.ts"],"sourcesContent":["export { StellarAgentKit, type StellarNetwork } from \"./agent.js\";\r\nexport { getNetworkConfig, networks, type NetworkConfig, type NetworkName } from \"./config/networks.js\";\r\nexport {\r\n MAINNET_ASSETS,\r\n SOROSWAP_AGGREGATOR,\r\n type StellarAsset,\r\n} from \"./config/assets.js\";\r\nexport {\r\n createDexClient,\r\n type DexClient,\r\n type DexAsset,\r\n type QuoteResult,\r\n type SwapResult,\r\n} from \"./dex/index.js\";\r\nexport {\r\n createReflectorOracle,\r\n REFLECTOR_ORACLE,\r\n BAND_ORACLE,\r\n type ReflectorOracle,\r\n type ReflectorOracleConfig,\r\n type OracleAsset,\r\n type PriceData,\r\n} from \"./oracle/index.js\";\r\nexport {\r\n lendingSupply,\r\n lendingBorrow,\r\n BLEND_POOLS,\r\n BLEND_POOLS_MAINNET,\r\n type LendingSupplyArgs,\r\n type LendingBorrowArgs,\r\n type LendingResult,\r\n} from \"./lending/index.js\";\r\n","/**\r\n * StellarAgentKit – unified DeFi agent (MNTAgentKit-style API for Stellar).\r\n * Constructor(secretKey, network) + initialize() then protocol methods.\r\n */\r\n\r\nimport { Keypair, Asset, TransactionBuilder, Operation, Networks, Horizon } from \"@stellar/stellar-sdk\";\r\nimport { getNetworkConfig, type NetworkConfig } from \"./config/networks.js\";\r\nimport { createDexClient, type DexAsset, type QuoteResult, type SwapResult } from \"./dex/index.js\";\r\nimport { createReflectorOracle, type OracleAsset, type PriceData } from \"./oracle/index.js\";\r\nimport { lendingSupply as blendSupply, lendingBorrow as blendBorrow, type LendingSupplyArgs, type LendingBorrowArgs, type LendingResult } from \"./lending/index.js\";\r\n\r\n/** This project is mainnet-only. */\r\nexport type StellarNetwork = \"mainnet\";\r\n\r\nexport class StellarAgentKit {\r\n public readonly keypair: Keypair;\r\n public readonly network: StellarNetwork;\r\n public readonly config: NetworkConfig;\r\n private _initialized = false;\r\n private _dex: ReturnType<typeof createDexClient> | null = null;\r\n private _horizon: Horizon.Server | null = null;\r\n private _oracle: ReturnType<typeof createReflectorOracle> | null = null;\r\n\r\n constructor(secretKey: string, network: StellarNetwork = \"mainnet\") {\r\n if (network !== \"mainnet\") {\r\n throw new Error(\"This project is mainnet-only. Use network: 'mainnet'.\");\r\n }\r\n this.keypair = Keypair.fromSecret(secretKey.trim());\r\n this.network = \"mainnet\";\r\n this.config = getNetworkConfig();\r\n }\r\n\r\n /**\r\n * Initialize clients (Horizon, Soroban RPC, protocol wrappers).\r\n * Call after construction before using protocol methods.\r\n */\r\n async initialize(): Promise<this> {\r\n this._horizon = new Horizon.Server(this.config.horizonUrl);\r\n this._dex = createDexClient(this.config, process.env.SOROSWAP_API_KEY);\r\n this._oracle = createReflectorOracle({ networkConfig: this.config });\r\n this._initialized = true;\r\n return this;\r\n }\r\n\r\n private ensureInitialized(): void {\r\n if (!this._initialized || !this._dex) {\r\n throw new Error(\"StellarAgentKit not initialized. Call await agent.initialize() first.\");\r\n }\r\n }\r\n\r\n // ─── DEX Operations (mirror Mantle agniSwap / executeSwap) ─────────────────\r\n\r\n /**\r\n * Get a swap quote (exact-in). Uses SoroSwap aggregator (SoroSwap, Phoenix, Aqua).\r\n */\r\n async dexGetQuote(\r\n fromAsset: DexAsset,\r\n toAsset: DexAsset,\r\n amount: string\r\n ): Promise<QuoteResult> {\r\n this.ensureInitialized();\r\n return this._dex!.getQuote(fromAsset, toAsset, amount);\r\n }\r\n\r\n /**\r\n * Execute a swap using a prior quote.\r\n */\r\n async dexSwap(quote: QuoteResult): Promise<SwapResult> {\r\n this.ensureInitialized();\r\n return this._dex!.executeSwap(this.keypair.secret(), quote);\r\n }\r\n\r\n /**\r\n * One-shot: get quote and execute swap (convenience).\r\n */\r\n async dexSwapExactIn(\r\n fromAsset: DexAsset,\r\n toAsset: DexAsset,\r\n amount: string\r\n ): Promise<SwapResult> {\r\n const quote = await this.dexGetQuote(fromAsset, toAsset, amount);\r\n return this.dexSwap(quote);\r\n }\r\n\r\n // ─── Payments (Horizon) ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Send a native or custom-asset payment (Horizon).\r\n * @param to - Destination account (G...)\r\n * @param amount - Amount in display units (e.g. \"10\" for 10 XLM)\r\n * @param assetCode - Optional; omit for native XLM\r\n * @param assetIssuer - Optional; required if assetCode is set\r\n */\r\n async sendPayment(\r\n to: string,\r\n amount: string,\r\n assetCode?: string,\r\n assetIssuer?: string\r\n ): Promise<{ hash: string }> {\r\n this.ensureInitialized();\r\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\r\n\r\n const networkPassphrase = Networks.PUBLIC;\r\n const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());\r\n\r\n const asset =\r\n assetCode && assetIssuer\r\n ? new Asset(assetCode, assetIssuer)\r\n : Asset.native();\r\n\r\n const tx = new TransactionBuilder(sourceAccount, {\r\n fee: \"100\",\r\n networkPassphrase,\r\n })\r\n .addOperation(Operation.payment({ destination: to, asset, amount }))\r\n .setTimeout(180)\r\n .build();\r\n\r\n tx.sign(this.keypair);\r\n const result = await this._horizon.submitTransaction(tx);\r\n return { hash: result.hash };\r\n }\r\n\r\n // ─── Oracle (Reflector SEP-40) ─────────────────────────────────────────────\r\n\r\n /**\r\n * Get latest price for an asset from Reflector oracle.\r\n * @param asset - { contractId: \"C...\" } for on-chain token or { symbol: \"XLM\" } for ticker\r\n */\r\n async getPrice(asset: OracleAsset): Promise<PriceData> {\r\n this.ensureInitialized();\r\n if (!this._oracle) throw new Error(\"Oracle not initialized\");\r\n return this._oracle.lastprice(asset);\r\n }\r\n\r\n // ─── Lending (Blend) ───────────────────────────────────────────────────────\r\n\r\n /**\r\n * Supply (deposit) an asset to a Blend pool.\r\n */\r\n async lendingSupply(args: LendingSupplyArgs): Promise<LendingResult> {\r\n this.ensureInitialized();\r\n return blendSupply(this.config, this.keypair.secret(), args);\r\n }\r\n\r\n /**\r\n * Borrow an asset from a Blend pool.\r\n */\r\n async lendingBorrow(args: LendingBorrowArgs): Promise<LendingResult> {\r\n this.ensureInitialized();\r\n return blendBorrow(this.config, this.keypair.secret(), args);\r\n }\r\n}\r\n","import { z } from \"zod\";\r\n\r\nexport const NetworkConfigSchema = z.object({\r\n horizonUrl: z.string().url(),\r\n sorobanRpcUrl: z.string().url(),\r\n friendbotUrl: z.string().url().optional(),\r\n});\r\n\r\nexport type NetworkConfig = z.infer<typeof NetworkConfigSchema>;\r\n\r\n/** Mainnet config. This project is mainnet-only. */\r\nexport const mainnet: NetworkConfig = {\r\n horizonUrl: \"https://horizon.stellar.org\",\r\n sorobanRpcUrl: \"https://soroban-rpc.mainnet.stellar.gateway.fm\",\r\n};\r\n\r\nexport const networks = { mainnet } as const;\r\nexport type NetworkName = keyof typeof networks;\r\n\r\n/** Returns mainnet config. This project is mainnet-only. */\r\nexport function getNetworkConfig(name?: string): NetworkConfig {\r\n if (name && name !== \"mainnet\") {\r\n throw new Error(\"This project is mainnet-only. Use network: 'mainnet'.\");\r\n }\r\n return mainnet;\r\n}\r\n","/**\r\n * SoroSwap DEX client – quote via API, build + sign + submit for executeSwap.\r\n */\r\n\r\nimport { Keypair, TransactionBuilder, Networks } from \"@stellar/stellar-sdk\";\r\nimport { rpc } from \"@stellar/stellar-sdk\";\r\nimport type { NetworkConfig } from \"../config/networks.js\";\r\nimport { getNetworkConfig } from \"../config/networks.js\";\r\nimport type { DexAsset, QuoteResult, SwapResult } from \"./types.js\";\r\n\r\nconst SOROSWAP_API_BASE = \"https://api.soroswap.finance\";\r\n\r\nfunction assetToApiString(asset: DexAsset): string {\r\n if (asset.contractId) return asset.contractId;\r\n if (asset.code && asset.issuer) return `${asset.code}:${asset.issuer}`;\r\n throw new Error(\"Asset must have contractId or code+issuer\");\r\n}\r\n\r\nfunction parseApiQuote(data: unknown): QuoteResult {\r\n const o = data as Record<string, unknown>;\r\n return {\r\n expectedIn: String(o?.expectedIn ?? o?.amountIn ?? \"0\"),\r\n expectedOut: String(o?.expectedOut ?? o?.amountOut ?? \"0\"),\r\n minOut: String(o?.minOut ?? o?.minimumAmountOut ?? o?.expectedOut ?? \"0\"),\r\n route: Array.isArray(o?.route) ? (o.route as string[]) : Array.isArray(o?.path) ? (o.path as string[]) : [],\r\n rawData: data,\r\n };\r\n}\r\n\r\nexport function createSoroSwapDexClient(\r\n networkConfig: NetworkConfig,\r\n apiKey?: string\r\n): { getQuote: (from: DexAsset, to: DexAsset, amount: string) => Promise<QuoteResult>; executeSwap: (secretKey: string, quote: QuoteResult) => Promise<SwapResult> } {\r\n const key = apiKey ?? process.env.SOROSWAP_API_KEY;\r\n\r\n async function getQuote(from: DexAsset, to: DexAsset, amount: string): Promise<QuoteResult> {\r\n const url = `${SOROSWAP_API_BASE}/quote?network=mainnet`;\r\n const body = {\r\n assetIn: assetToApiString(from),\r\n assetOut: assetToApiString(to),\r\n amount: String(amount).trim(),\r\n tradeType: \"EXACT_IN\",\r\n protocols: [\"soroswap\", \"phoenix\", \"aqua\"],\r\n };\r\n const headers: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (key) headers[\"Authorization\"] = `Bearer ${key}`;\r\n const res = await fetch(url, { method: \"POST\", headers, body: JSON.stringify(body) });\r\n if (!res.ok) {\r\n const text = await res.text();\r\n throw new Error(`SoroSwap quote failed ${res.status}: ${text}`);\r\n }\r\n return parseApiQuote(await res.json());\r\n }\r\n\r\n async function executeSwap(secretKey: string, quote: QuoteResult): Promise<SwapResult> {\r\n if (!key) throw new Error(\"executeSwap requires SOROSWAP_API_KEY\");\r\n const keypair = Keypair.fromSecret(secretKey.trim());\r\n const fromAddress = keypair.publicKey();\r\n const buildUrl = `${SOROSWAP_API_BASE}/quote/build?network=mainnet`;\r\n const buildRes = await fetch(buildUrl, {\r\n method: \"POST\",\r\n headers: { \"Content-Type\": \"application/json\", Authorization: `Bearer ${key}` },\r\n body: JSON.stringify({ quote: quote.rawData ?? quote, from: fromAddress, to: fromAddress }),\r\n });\r\n if (!buildRes.ok) throw new Error(`SoroSwap build failed ${buildRes.status}: ${await buildRes.text()}`);\r\n const buildData = (await buildRes.json()) as { xdr?: string };\r\n const xdrBase64 = buildData?.xdr;\r\n if (!xdrBase64 || typeof xdrBase64 !== \"string\") throw new Error(\"SoroSwap build response missing xdr\");\r\n const config = getNetworkConfig(\"mainnet\");\r\n const networkPassphrase = Networks.PUBLIC;\r\n const tx = TransactionBuilder.fromXDR(xdrBase64, networkPassphrase);\r\n tx.sign(keypair);\r\n const server = new rpc.Server(config.sorobanRpcUrl, { allowHttp: config.sorobanRpcUrl.startsWith(\"http:\") });\r\n const sendResult = await server.sendTransaction(tx);\r\n if (sendResult.errorResult) throw new Error(`Soroban sendTransaction failed: ${String(sendResult.errorResult)}`);\r\n return { hash: sendResult.hash, status: sendResult.status ?? \"PENDING\" };\r\n }\r\n\r\n return { getQuote, executeSwap };\r\n}\r\n","/**\r\n * DEX module – swap, quote, aggregator (SoroSwap).\r\n * Pluggable: add more DEXes by implementing DexClient.\r\n */\r\n\r\nimport type { NetworkConfig } from \"../config/networks.js\";\r\nimport type { DexAsset, QuoteResult, SwapResult } from \"./types.js\";\r\nimport { createSoroSwapDexClient } from \"./soroSwap.js\";\r\n\r\nexport type { DexAsset, QuoteResult, SwapResult } from \"./types.js\";\r\nexport { createSoroSwapDexClient } from \"./soroSwap.js\";\r\n\r\nexport interface DexClient {\r\n getQuote(fromAsset: DexAsset, toAsset: DexAsset, amount: string): Promise<QuoteResult>;\r\n executeSwap(secretKey: string, quote: QuoteResult): Promise<SwapResult>;\r\n}\r\n\r\n/**\r\n * Build a DEX client for the given network (SoroSwap aggregator).\r\n */\r\nexport function createDexClient(networkConfig: NetworkConfig, apiKey?: string): DexClient {\r\n return createSoroSwapDexClient(networkConfig, apiKey);\r\n}\r\n","/**\r\n * Reflector oracle client – SEP-40 price feeds on Stellar.\r\n * Uses lastprice(asset) for current price. Asset = Stellar(Address) | Other(Symbol).\r\n * Contract IDs: https://developers.stellar.org/docs/data/oracles/oracle-providers\r\n */\r\n\r\nimport {\r\n Contract,\r\n Address,\r\n TransactionBuilder,\r\n Networks,\r\n xdr,\r\n rpc,\r\n} from \"@stellar/stellar-sdk\";\r\nimport type { NetworkConfig } from \"../config/networks.js\";\r\n\r\nimport { REFLECTOR_ORACLE } from \"../config/oracles.js\";\r\n\r\n/** Well-known funded mainnet account used only as simulation source (read-only). Must be valid StrKey and exist on mainnet. */\r\nconst SIMULATION_SOURCE_MAINNET = \"GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN\";\r\n\r\n/** Either a Soroban token contract ID (C...) or a ticker symbol (e.g. \"XLM\", \"BTC\") for off-chain feeds. */\r\nexport type OracleAsset = { contractId: string } | { symbol: string };\r\n\r\nexport interface PriceData {\r\n price: string;\r\n timestamp: number;\r\n decimals: number;\r\n}\r\n\r\n/**\r\n * Build SEP-40 Asset ScVal: Stellar(Address) or Other(Symbol).\r\n */\r\nfunction assetToScVal(asset: OracleAsset): xdr.ScVal {\r\n if (\"contractId\" in asset && asset.contractId) {\r\n const addr = new Address(asset.contractId);\r\n return xdr.ScVal.scvVec([\r\n xdr.ScVal.scvSymbol(\"Stellar\"),\r\n xdr.ScVal.scvAddress(addr.toScAddress()),\r\n ]);\r\n }\r\n if (\"symbol\" in asset && asset.symbol) {\r\n return xdr.ScVal.scvVec([\r\n xdr.ScVal.scvSymbol(\"Other\"),\r\n xdr.ScVal.scvSymbol(asset.symbol),\r\n ]);\r\n }\r\n throw new Error(\"Oracle asset must be { contractId } or { symbol }\");\r\n}\r\n\r\n/**\r\n * Parse lastprice result: Option<PriceData> -> PriceData.\r\n * Option = vec 0 or 1 element. PriceData = struct as vec [price, timestamp] (unnamed) or map.\r\n * Accepts either base64 string (raw RPC) or already-parsed ScVal (SDK parseRawSimulation).\r\n */\r\nfunction parseLastPriceRetval(retvalInput: string | xdr.ScVal, decimals: number): PriceData {\r\n const retval =\r\n typeof retvalInput === \"string\"\r\n ? xdr.ScVal.fromXDR(retvalInput, \"base64\")\r\n : retvalInput;\r\n const vec = retval.vec();\r\n if (!vec || vec.length === 0) {\r\n throw new Error(\"Oracle returned no price (None) for this asset\");\r\n }\r\n const inner = vec[0];\r\n const dataVec = inner.vec();\r\n if (dataVec && dataVec.length >= 2) {\r\n const price = scValToI128(dataVec[0]);\r\n const timestamp = Number(dataVec[1].u64()?.toString() ?? 0);\r\n return { price, timestamp, decimals };\r\n }\r\n const m = inner.map();\r\n if (m) {\r\n for (const entry of m) {\r\n const k = entry.key();\r\n const v = entry.val();\r\n if (k.sym && k.sym().toString() === \"price\" && v) {\r\n const price = scValToI128(v);\r\n let timestamp = 0;\r\n for (const e2 of m) {\r\n if (e2.key().sym && e2.key().sym().toString() === \"timestamp\") {\r\n timestamp = Number(e2.val().u64()?.toString() ?? 0);\r\n break;\r\n }\r\n }\r\n return { price, timestamp, decimals };\r\n }\r\n }\r\n }\r\n throw new Error(\"Oracle price data format unexpected\");\r\n}\r\n\r\nfunction scValToI128(val: xdr.ScVal): string {\r\n const i128 = val.i128();\r\n if (!i128) throw new Error(\"Expected i128 price\");\r\n const lo = i128.lo();\r\n const hi = i128.hi();\r\n if (!lo || hi === undefined) return \"0\";\r\n const loNum = Number(lo);\r\n const hiNum = Number(hi);\r\n const negative = hiNum < 0;\r\n const absLo = loNum < 0 ? 0x100000000 + loNum : loNum;\r\n const absHi = hiNum < 0 ? 0x100000000 + hiNum : hiNum;\r\n let n = BigInt(absLo) + (BigInt(absHi) << 32n);\r\n if (negative) n = -n;\r\n return String(n);\r\n}\r\n\r\nexport interface ReflectorOracleConfig {\r\n networkConfig: NetworkConfig;\r\n /** Which feed: DEX (default), CEX/DEX, or Fiat. */\r\n feed?: \"dex\" | \"cexDex\" | \"fiat\";\r\n}\r\n\r\nexport function createReflectorOracle(config: ReflectorOracleConfig) {\r\n const feed = config.feed ?? \"dex\";\r\n const contractId = REFLECTOR_ORACLE[feed];\r\n const server = new rpc.Server(config.networkConfig.sorobanRpcUrl, {\r\n allowHttp: config.networkConfig.sorobanRpcUrl.startsWith(\"http:\"),\r\n });\r\n const networkPassphrase = Networks.PUBLIC;\r\n\r\n async function decimals(): Promise<number> {\r\n const contract = new Contract(contractId);\r\n const op = contract.call(\"decimals\");\r\n const acc = await server.getAccount(SIMULATION_SOURCE_MAINNET);\r\n const tx = new TransactionBuilder(acc, {\r\n fee: \"10000\",\r\n networkPassphrase,\r\n })\r\n .addOperation(op)\r\n .setTimeout(30)\r\n .build();\r\n const sim = await server.simulateTransaction(tx);\r\n if (\"error\" in sim && sim.error) throw new Error(String(sim.error));\r\n const ret = (sim as { result?: { retval?: string | xdr.ScVal } })?.result?.retval;\r\n if (ret == null) throw new Error(\"No decimals retval\");\r\n const val = typeof ret === \"string\" ? xdr.ScVal.fromXDR(ret, \"base64\") : ret;\r\n const u = val.u32();\r\n return u ?? 7;\r\n }\r\n\r\n async function lastprice(asset: OracleAsset): Promise<PriceData> {\r\n const contract = new Contract(contractId);\r\n const assetScVal = assetToScVal(asset);\r\n const op = contract.call(\"lastprice\", assetScVal);\r\n const acc = await server.getAccount(SIMULATION_SOURCE_MAINNET);\r\n const tx = new TransactionBuilder(acc, {\r\n fee: \"10000\",\r\n networkPassphrase,\r\n })\r\n .addOperation(op)\r\n .setTimeout(30)\r\n .build();\r\n const sim = await server.simulateTransaction(tx);\r\n if (\"error\" in sim && sim.error) throw new Error(String(sim.error));\r\n const ret = (sim as { result?: { retval?: string | xdr.ScVal } })?.result?.retval;\r\n if (ret == null) throw new Error(\"Oracle lastprice: no retval\");\r\n const dec = await decimals();\r\n return parseLastPriceRetval(ret, dec);\r\n }\r\n\r\n return { lastprice, decimals, contractId };\r\n}\r\n\r\nexport type ReflectorOracle = ReturnType<typeof createReflectorOracle>;\r\n","/**\r\n * Oracle contract addresses (Reflector SEP-40, Band) – mainnet only.\r\n * Source: https://developers.stellar.org/docs/data/oracles/oracle-providers\r\n */\r\n\r\nexport const REFLECTOR_ORACLE = {\r\n /** Stellar Mainnet DEX prices */\r\n dex: \"CALI2BYU2JE6WVRUFYTS6MSBNEHGJ35P4AVCZYF3B6QOE3QKOB2PLE6M\",\r\n /** External CEX & DEX rates */\r\n cexDex: \"CAFJZQWSED6YAWZU3GWRTOCNPPCGBN32L7QV43XX5LZLFTK6JLN34DLN\",\r\n /** Fiat exchange rates */\r\n fiat: \"CBKGPWGKSKZF52CFHMTRR23TBWTPMRDIYZ4O2P5VS65BMHYH4DXMCJZC\",\r\n} as const;\r\n\r\nexport const BAND_ORACLE = \"CCQXWMZVM3KRTXTUPTN53YHL272QGKF32L7XEDNZ2S6OSUFK3NFBGG5M\" as const;\r\n","/**\r\n * Blend lending integration – supply and borrow via Blend Protocol on Stellar.\r\n * Uses @blend-capital/blend-sdk. Pool IDs: see docs.blend.capital/mainnet-deployments\r\n */\r\n\r\nimport {\r\n Keypair,\r\n TransactionBuilder,\r\n Transaction,\r\n Networks,\r\n xdr,\r\n rpc,\r\n Horizon,\r\n} from \"@stellar/stellar-sdk\";\r\nimport { PoolContractV2, RequestType, type Request } from \"@blend-capital/blend-sdk\";\r\nimport type { NetworkConfig } from \"../config/networks.js\";\r\n\r\n/** Mainnet Blend pool ID. More at mainnet.blend.capital */\r\nexport const BLEND_POOLS_MAINNET = \"CCCCIQSDILITHMM7PBSLVDT5MISSY7R26MNZXCX4H7J5JQ5FPIYOGYFS\" as const;\r\n\r\n/** @deprecated Use BLEND_POOLS_MAINNET. Kept for compatibility. */\r\nexport const BLEND_POOLS = { mainnet: BLEND_POOLS_MAINNET } as const;\r\n\r\nexport interface LendingSupplyArgs {\r\n /** Pool contract ID (C...). */\r\n poolId: string;\r\n /** Reserve asset contract ID (e.g. USDC, XLM token contract). */\r\n assetContractId: string;\r\n /** Amount in asset's smallest unit (e.g. 7 decimals for USDC). */\r\n amount: string;\r\n}\r\n\r\nexport interface LendingBorrowArgs {\r\n poolId: string;\r\n assetContractId: string;\r\n amount: string;\r\n}\r\n\r\nexport interface LendingResult {\r\n hash: string;\r\n status: string;\r\n}\r\n\r\nasync function buildSubmitTx(\r\n networkConfig: NetworkConfig,\r\n secretKey: string,\r\n poolId: string,\r\n requests: Request[]\r\n): Promise<{ tx: Transaction; keypair: Keypair }> {\r\n const keypair = Keypair.fromSecret(secretKey.trim());\r\n const user = keypair.publicKey();\r\n const pool = new PoolContractV2(poolId);\r\n const submitOpXdr = pool.submit({\r\n from: user,\r\n spender: user,\r\n to: user,\r\n requests,\r\n });\r\n const op = xdr.Operation.fromXDR(submitOpXdr, \"base64\");\r\n const networkPassphrase = Networks.PUBLIC;\r\n const horizon = new Horizon.Server(networkConfig.horizonUrl);\r\n const sourceAccount = await horizon.loadAccount(user);\r\n const tx = new TransactionBuilder(sourceAccount, {\r\n fee: \"10000\",\r\n networkPassphrase,\r\n })\r\n .addOperation(op)\r\n .setTimeout(180)\r\n .build();\r\n return { tx, keypair };\r\n}\r\n\r\n/**\r\n * Supply (deposit) an asset to a Blend pool as collateral or liquidity.\r\n */\r\nexport async function lendingSupply(\r\n networkConfig: NetworkConfig,\r\n secretKey: string,\r\n args: LendingSupplyArgs\r\n): Promise<LendingResult> {\r\n const amountBigInt = BigInt(args.amount);\r\n const requests: Request[] = [\r\n {\r\n request_type: RequestType.SupplyCollateral,\r\n address: args.assetContractId,\r\n amount: amountBigInt,\r\n },\r\n ];\r\n const { tx, keypair } = await buildSubmitTx(\r\n networkConfig,\r\n secretKey,\r\n args.poolId,\r\n requests\r\n );\r\n const server = new rpc.Server(networkConfig.sorobanRpcUrl, {\r\n allowHttp: networkConfig.sorobanRpcUrl.startsWith(\"http:\"),\r\n });\r\n const prepared = await server.prepareTransaction(tx);\r\n prepared.sign(keypair);\r\n const sendResult = await server.sendTransaction(prepared);\r\n if (sendResult.errorResult) {\r\n throw new Error(`Blend supply failed: ${String(sendResult.errorResult)}`);\r\n }\r\n return { hash: sendResult.hash, status: sendResult.status ?? \"PENDING\" };\r\n}\r\n\r\n/**\r\n * Borrow an asset from a Blend pool.\r\n */\r\nexport async function lendingBorrow(\r\n networkConfig: NetworkConfig,\r\n secretKey: string,\r\n args: LendingBorrowArgs\r\n): Promise<LendingResult> {\r\n const amountBigInt = BigInt(args.amount);\r\n const requests: Request[] = [\r\n {\r\n request_type: RequestType.Borrow,\r\n address: args.assetContractId,\r\n amount: amountBigInt,\r\n },\r\n ];\r\n const { tx, keypair } = await buildSubmitTx(\r\n networkConfig,\r\n secretKey,\r\n args.poolId,\r\n requests\r\n );\r\n const server = new rpc.Server(networkConfig.sorobanRpcUrl, {\r\n allowHttp: networkConfig.sorobanRpcUrl.startsWith(\"http:\"),\r\n });\r\n const prepared = await server.prepareTransaction(tx);\r\n prepared.sign(keypair);\r\n const sendResult = await server.sendTransaction(prepared);\r\n if (sendResult.errorResult) {\r\n throw new Error(`Blend borrow failed: ${String(sendResult.errorResult)}`);\r\n }\r\n return { hash: sendResult.hash, status: sendResult.status ?? \"PENDING\" };\r\n}\r\n","/**\r\n * Stellar asset identifiers and contract addresses (mainnet only).\r\n */\r\n\r\nexport type StellarAsset = { code: string; issuer: string } | { contractId: string };\r\n\r\nexport const MAINNET_ASSETS = {\r\n XLM: { contractId: \"CAS3J7GYLGXMF6TDJBBYYSE3HQ6BBSMLNUQ34T6TZMYMW2EVH34XOWMA\" },\r\n USDC: { contractId: \"CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75\" },\r\n} as const;\r\n\r\n/** SoroSwap aggregator contract ID (mainnet). */\r\nexport const SOROSWAP_AGGREGATOR = \"CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH\" as const;\r\n"],"mappings":"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","names":["import_stellar_sdk","import_stellar_sdk","import_stellar_sdk","import_stellar_sdk"]}