stellar-agent-kit 1.0.2 → 1.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +75 -0
- package/dist/index.cjs +89 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +63 -1
- package/dist/index.d.ts +63 -1
- package/dist/index.js +87 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# stellar-agent-kit
|
|
2
|
+
|
|
3
|
+
Unified TypeScript SDK for Stellar: payments, DEX (SoroSwap), lending (Blend), and oracles. AgentKit-style API: one class, `initialize()`, then protocol methods.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install stellar-agent-kit
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick start
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
import { StellarAgentKit, MAINNET_ASSETS } from "stellar-agent-kit";
|
|
15
|
+
|
|
16
|
+
const agent = new StellarAgentKit(process.env.SECRET_KEY!, "mainnet");
|
|
17
|
+
await agent.initialize();
|
|
18
|
+
|
|
19
|
+
// Balances
|
|
20
|
+
const balances = await agent.getBalances();
|
|
21
|
+
|
|
22
|
+
// Send XLM
|
|
23
|
+
await agent.sendPayment("G...", "10");
|
|
24
|
+
|
|
25
|
+
// DEX quote + swap
|
|
26
|
+
const quote = await agent.dexGetQuote(
|
|
27
|
+
{ contractId: MAINNET_ASSETS.XLM.contractId },
|
|
28
|
+
{ contractId: MAINNET_ASSETS.USDC.contractId },
|
|
29
|
+
"10000000" // 1 XLM (7 decimals)
|
|
30
|
+
);
|
|
31
|
+
await agent.dexSwap(quote);
|
|
32
|
+
|
|
33
|
+
// Path payment (strict receive)
|
|
34
|
+
await agent.pathPayment(
|
|
35
|
+
{ assetCode: "XLM" },
|
|
36
|
+
"10",
|
|
37
|
+
"G...",
|
|
38
|
+
{ assetCode: "USDC", issuer: "G..." },
|
|
39
|
+
"5",
|
|
40
|
+
[]
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
// Create account
|
|
44
|
+
await agent.createAccount("G...", "1");
|
|
45
|
+
|
|
46
|
+
// Price (Reflector oracle)
|
|
47
|
+
const price = await agent.getPrice({ symbol: "XLM" });
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## API overview
|
|
51
|
+
|
|
52
|
+
| Method | Description |
|
|
53
|
+
|--------|-------------|
|
|
54
|
+
| `initialize()` | Must be called once after construction. Sets up Horizon, DEX, oracle. |
|
|
55
|
+
| `getBalances(accountId?)` | Native + trustline balances for an account (default: this key). |
|
|
56
|
+
| `sendPayment(to, amount, assetCode?, assetIssuer?)` | Send a payment (XLM or custom asset). |
|
|
57
|
+
| `createAccount(destination, startingBalance)` | Create a new account (funded from this key). |
|
|
58
|
+
| `pathPayment(sendAsset, sendMax, destination, destAsset, destAmount, path?)` | Path payment strict receive. |
|
|
59
|
+
| `dexGetQuote(from, to, amount)` | Get swap quote (SoroSwap aggregator). |
|
|
60
|
+
| `dexSwap(quote)` | Execute a swap from a quote. |
|
|
61
|
+
| `dexSwapExactIn(from, to, amount)` | Get quote and execute in one call. |
|
|
62
|
+
| `getPrice(asset)` | Latest price from Reflector oracle. |
|
|
63
|
+
| `lendingSupply(args)` | Supply to a Blend pool. |
|
|
64
|
+
| `lendingBorrow(args)` | Borrow from a Blend pool. |
|
|
65
|
+
|
|
66
|
+
## Network
|
|
67
|
+
|
|
68
|
+
Currently **mainnet only**. Set `SECRET_KEY` and optionally `SOROSWAP_API_KEY` (for DEX quotes) in your environment.
|
|
69
|
+
|
|
70
|
+
## Exports
|
|
71
|
+
|
|
72
|
+
- `StellarAgentKit`, `StellarNetwork`
|
|
73
|
+
- `getNetworkConfig`, `networks`, `MAINNET_ASSETS`, `SOROSWAP_AGGREGATOR`
|
|
74
|
+
- `createDexClient`, `createReflectorOracle`, `lendingSupply`, `lendingBorrow`
|
|
75
|
+
- Types: `DexAsset`, `QuoteResult`, `SwapResult`, `OracleAsset`, `PriceData`, `LendingSupplyArgs`, etc.
|
package/dist/index.cjs
CHANGED
|
@@ -20,9 +20,11 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
+
ALLBRIDGE_CORE_STELLAR_DOCS: () => ALLBRIDGE_CORE_STELLAR_DOCS,
|
|
23
24
|
BAND_ORACLE: () => BAND_ORACLE,
|
|
24
25
|
BLEND_POOLS: () => BLEND_POOLS,
|
|
25
26
|
BLEND_POOLS_MAINNET: () => BLEND_POOLS_MAINNET,
|
|
27
|
+
FXDAO_MAINNET: () => FXDAO_MAINNET,
|
|
26
28
|
MAINNET_ASSETS: () => MAINNET_ASSETS,
|
|
27
29
|
REFLECTOR_ORACLE: () => REFLECTOR_ORACLE,
|
|
28
30
|
SOROSWAP_AGGREGATOR: () => SOROSWAP_AGGREGATOR,
|
|
@@ -383,6 +385,43 @@ var StellarAgentKit = class {
|
|
|
383
385
|
const quote = await this.dexGetQuote(fromAsset, toAsset, amount);
|
|
384
386
|
return this.dexSwap(quote);
|
|
385
387
|
}
|
|
388
|
+
// ─── Account & balances ────────────────────────────────────────────────────
|
|
389
|
+
/**
|
|
390
|
+
* Get balances for an account (native + trustlines).
|
|
391
|
+
* @param accountId - Stellar account ID (G...); defaults to this agent's public key
|
|
392
|
+
* @returns List of balances: asset code, issuer (if not native), balance string, and optional limit
|
|
393
|
+
*/
|
|
394
|
+
async getBalances(accountId) {
|
|
395
|
+
this.ensureInitialized();
|
|
396
|
+
if (!this._horizon) throw new Error("Horizon not initialized");
|
|
397
|
+
const id = accountId ?? this.keypair.publicKey();
|
|
398
|
+
const account = await this._horizon.loadAccount(id);
|
|
399
|
+
return account.balances.map((b) => ({
|
|
400
|
+
assetCode: b.asset_code === "native" ? "XLM" : b.asset_code,
|
|
401
|
+
issuer: b.asset_issuer,
|
|
402
|
+
balance: b.balance,
|
|
403
|
+
limit: b.limit
|
|
404
|
+
}));
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Create a new Stellar account (funding from this agent's account).
|
|
408
|
+
* @param destination - New account's public key (G...)
|
|
409
|
+
* @param startingBalance - Amount of XLM to send (e.g. "1" for 1 XLM; minimum ~1 XLM for base reserve)
|
|
410
|
+
* @returns Transaction hash
|
|
411
|
+
*/
|
|
412
|
+
async createAccount(destination, startingBalance) {
|
|
413
|
+
this.ensureInitialized();
|
|
414
|
+
if (!this._horizon) throw new Error("Horizon not initialized");
|
|
415
|
+
const networkPassphrase = import_stellar_sdk5.Networks.PUBLIC;
|
|
416
|
+
const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());
|
|
417
|
+
const tx = new import_stellar_sdk5.TransactionBuilder(sourceAccount, {
|
|
418
|
+
fee: "100",
|
|
419
|
+
networkPassphrase
|
|
420
|
+
}).addOperation(import_stellar_sdk5.Operation.createAccount({ destination, startingBalance })).setTimeout(180).build();
|
|
421
|
+
tx.sign(this.keypair);
|
|
422
|
+
const result = await this._horizon.submitTransaction(tx);
|
|
423
|
+
return { hash: result.hash };
|
|
424
|
+
}
|
|
386
425
|
// ─── Payments (Horizon) ────────────────────────────────────────────────────
|
|
387
426
|
/**
|
|
388
427
|
* Send a native or custom-asset payment (Horizon).
|
|
@@ -405,6 +444,42 @@ var StellarAgentKit = class {
|
|
|
405
444
|
const result = await this._horizon.submitTransaction(tx);
|
|
406
445
|
return { hash: result.hash };
|
|
407
446
|
}
|
|
447
|
+
/**
|
|
448
|
+
* Path payment (strict receive): send up to sendMax of sendAsset so destination receives exactly destAmount of destAsset.
|
|
449
|
+
* @param sendAsset - Asset to send (native or { code, issuer })
|
|
450
|
+
* @param sendMax - Maximum amount of sendAsset to send (display units)
|
|
451
|
+
* @param destination - Recipient account (G...)
|
|
452
|
+
* @param destAsset - Asset the recipient receives
|
|
453
|
+
* @param destAmount - Exact amount of destAsset the recipient gets (display units)
|
|
454
|
+
* @param path - Optional intermediate assets for the path
|
|
455
|
+
*/
|
|
456
|
+
async pathPayment(sendAsset, sendMax, destination, destAsset, destAmount, path = []) {
|
|
457
|
+
this.ensureInitialized();
|
|
458
|
+
if (!this._horizon) throw new Error("Horizon not initialized");
|
|
459
|
+
const send = sendAsset.assetCode === "XLM" && !sendAsset.issuer ? import_stellar_sdk5.Asset.native() : new import_stellar_sdk5.Asset(sendAsset.assetCode, sendAsset.issuer);
|
|
460
|
+
const dest = destAsset.assetCode === "XLM" && !destAsset.issuer ? import_stellar_sdk5.Asset.native() : new import_stellar_sdk5.Asset(destAsset.assetCode, destAsset.issuer);
|
|
461
|
+
const pathAssets = path.map(
|
|
462
|
+
(p) => p.assetCode === "XLM" && !p.issuer ? import_stellar_sdk5.Asset.native() : new import_stellar_sdk5.Asset(p.assetCode, p.issuer)
|
|
463
|
+
);
|
|
464
|
+
const networkPassphrase = import_stellar_sdk5.Networks.PUBLIC;
|
|
465
|
+
const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());
|
|
466
|
+
const tx = new import_stellar_sdk5.TransactionBuilder(sourceAccount, {
|
|
467
|
+
fee: "100",
|
|
468
|
+
networkPassphrase
|
|
469
|
+
}).addOperation(
|
|
470
|
+
import_stellar_sdk5.Operation.pathPaymentStrictReceive({
|
|
471
|
+
sendAsset: send,
|
|
472
|
+
sendMax,
|
|
473
|
+
destination,
|
|
474
|
+
destAsset: dest,
|
|
475
|
+
destAmount,
|
|
476
|
+
path: pathAssets
|
|
477
|
+
})
|
|
478
|
+
).setTimeout(180).build();
|
|
479
|
+
tx.sign(this.keypair);
|
|
480
|
+
const result = await this._horizon.submitTransaction(tx);
|
|
481
|
+
return { hash: result.hash };
|
|
482
|
+
}
|
|
408
483
|
// ─── Oracle (Reflector SEP-40) ─────────────────────────────────────────────
|
|
409
484
|
/**
|
|
410
485
|
* Get latest price for an asset from Reflector oracle.
|
|
@@ -438,11 +513,25 @@ var MAINNET_ASSETS = {
|
|
|
438
513
|
USDC: { contractId: "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" }
|
|
439
514
|
};
|
|
440
515
|
var SOROSWAP_AGGREGATOR = "CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH";
|
|
516
|
+
|
|
517
|
+
// src/config/protocols.ts
|
|
518
|
+
var FXDAO_MAINNET = {
|
|
519
|
+
vaults: "CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB",
|
|
520
|
+
lockingPool: "CDCART6WRSM2K4CKOAOB5YKUVBSJ6KLOVS7ZEJHA4OAQ2FXX7JOHLXIP",
|
|
521
|
+
usdx: "CDIKURWHYS4FFTR5KOQK6MBFZA2K3E26WGBQI6PXBYWZ4XIOPJHDFJKP",
|
|
522
|
+
eurx: "CBN3NCJSMOQTC6SPEYK3A44NU4VS3IPKTARJLI3Y77OH27EWBY36TP7U",
|
|
523
|
+
gbpx: "CBCO65UOWXY2GR66GOCMCN6IU3Y45TXCPBY3FLUNL4AOUMOCKVIVV6JC",
|
|
524
|
+
fxg: "CDBR4FMYL5WPUDBIXTBEBU2AFEYTDLXVOTRZHXS3JC575C7ZQRKYZQ55",
|
|
525
|
+
oracle: "CB5OTV4GV24T5USEZHFVYGC3F4A4MPUQ3LN56E76UK2IT7MJ6QXW4TFS"
|
|
526
|
+
};
|
|
527
|
+
var ALLBRIDGE_CORE_STELLAR_DOCS = "https://docs-core.allbridge.io/sdk/guides/stellar";
|
|
441
528
|
// Annotate the CommonJS export names for ESM import in node:
|
|
442
529
|
0 && (module.exports = {
|
|
530
|
+
ALLBRIDGE_CORE_STELLAR_DOCS,
|
|
443
531
|
BAND_ORACLE,
|
|
444
532
|
BLEND_POOLS,
|
|
445
533
|
BLEND_POOLS_MAINNET,
|
|
534
|
+
FXDAO_MAINNET,
|
|
446
535
|
MAINNET_ASSETS,
|
|
447
536
|
REFLECTOR_ORACLE,
|
|
448
537
|
SOROSWAP_AGGREGATOR,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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/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"]}
|
|
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","../src/config/protocols.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\nexport { FXDAO_MAINNET, ALLBRIDGE_CORE_STELLAR_DOCS } from \"./config/protocols.js\";\r\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\";\nimport { createReflectorOracle, type OracleAsset, type PriceData } from \"./oracle/index.js\";\nimport { lendingSupply as blendSupply, lendingBorrow as blendBorrow, type LendingSupplyArgs, type LendingBorrowArgs, type LendingResult } from \"./lending/index.js\";\n\n/** This project is mainnet-only. */\nexport type StellarNetwork = \"mainnet\";\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 private _oracle: ReturnType<typeof createReflectorOracle> | null = null;\n\n constructor(secretKey: string, network: StellarNetwork = \"mainnet\") {\n if (network !== \"mainnet\") {\n throw new Error(\"This project is mainnet-only. Use network: 'mainnet'.\");\n }\n this.keypair = Keypair.fromSecret(secretKey.trim());\n this.network = \"mainnet\";\n this.config = getNetworkConfig();\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._oracle = createReflectorOracle({ networkConfig: this.config });\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 // ─── Account & balances ────────────────────────────────────────────────────\n\n /**\n * Get balances for an account (native + trustlines).\n * @param accountId - Stellar account ID (G...); defaults to this agent's public key\n * @returns List of balances: asset code, issuer (if not native), balance string, and optional limit\n */\n async getBalances(accountId?: string): Promise<Array<{ assetCode: string; issuer?: string; balance: string; limit?: string }>> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n const id = accountId ?? this.keypair.publicKey();\n const account = await this._horizon.loadAccount(id);\n return (account.balances as Array<{ asset_code: string; asset_issuer?: string; balance: string; limit?: string }>).map((b) => ({\n assetCode: b.asset_code === \"native\" ? \"XLM\" : b.asset_code,\n issuer: b.asset_issuer,\n balance: b.balance,\n limit: b.limit,\n }));\n }\n\n /**\n * Create a new Stellar account (funding from this agent's account).\n * @param destination - New account's public key (G...)\n * @param startingBalance - Amount of XLM to send (e.g. \"1\" for 1 XLM; minimum ~1 XLM for base reserve)\n * @returns Transaction hash\n */\n async createAccount(destination: string, startingBalance: string): Promise<{ hash: string }> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n const networkPassphrase = Networks.PUBLIC;\n const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());\n const tx = new TransactionBuilder(sourceAccount, {\n fee: \"100\",\n networkPassphrase,\n })\n .addOperation(Operation.createAccount({ destination, startingBalance }))\n .setTimeout(180)\n .build();\n tx.sign(this.keypair);\n const result = await this._horizon.submitTransaction(tx);\n return { hash: result.hash };\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 = 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 /**\n * Path payment (strict receive): send up to sendMax of sendAsset so destination receives exactly destAmount of destAsset.\n * @param sendAsset - Asset to send (native or { code, issuer })\n * @param sendMax - Maximum amount of sendAsset to send (display units)\n * @param destination - Recipient account (G...)\n * @param destAsset - Asset the recipient receives\n * @param destAmount - Exact amount of destAsset the recipient gets (display units)\n * @param path - Optional intermediate assets for the path\n */\n async pathPayment(\n sendAsset: { assetCode: string; issuer?: string },\n sendMax: string,\n destination: string,\n destAsset: { assetCode: string; issuer?: string },\n destAmount: string,\n path: Array<{ assetCode: string; issuer?: string }> = []\n ): Promise<{ hash: string }> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n const send =\n sendAsset.assetCode === \"XLM\" && !sendAsset.issuer\n ? Asset.native()\n : new Asset(sendAsset.assetCode, sendAsset.issuer!);\n const dest =\n destAsset.assetCode === \"XLM\" && !destAsset.issuer\n ? Asset.native()\n : new Asset(destAsset.assetCode, destAsset.issuer!);\n const pathAssets = path.map((p) =>\n p.assetCode === \"XLM\" && !p.issuer ? Asset.native() : new Asset(p.assetCode, p.issuer!)\n );\n const networkPassphrase = Networks.PUBLIC;\n const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());\n const tx = new TransactionBuilder(sourceAccount, {\n fee: \"100\",\n networkPassphrase,\n })\n .addOperation(\n Operation.pathPaymentStrictReceive({\n sendAsset: send,\n sendMax,\n destination,\n destAsset: dest,\n destAmount,\n path: pathAssets,\n })\n )\n .setTimeout(180)\n .build();\n tx.sign(this.keypair);\n const result = await this._horizon.submitTransaction(tx);\n return { hash: result.hash };\n }\n\n // ─── Oracle (Reflector SEP-40) ─────────────────────────────────────────────\n\n /**\n * Get latest price for an asset from Reflector oracle.\n * @param asset - { contractId: \"C...\" } for on-chain token or { symbol: \"XLM\" } for ticker\n */\n async getPrice(asset: OracleAsset): Promise<PriceData> {\n this.ensureInitialized();\n if (!this._oracle) throw new Error(\"Oracle not initialized\");\n return this._oracle.lastprice(asset);\n }\n\n // ─── Lending (Blend) ───────────────────────────────────────────────────────\n\n /**\n * Supply (deposit) an asset to a Blend pool.\n */\n async lendingSupply(args: LendingSupplyArgs): Promise<LendingResult> {\n this.ensureInitialized();\n return blendSupply(this.config, this.keypair.secret(), args);\n }\n\n /**\n * Borrow an asset from a Blend pool.\n */\n async lendingBorrow(args: LendingBorrowArgs): Promise<LendingResult> {\n this.ensureInitialized();\n return blendBorrow(this.config, this.keypair.secret(), args);\n }\n}\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","/**\r\n * Stellar DeFi protocol contract addresses (mainnet).\r\n * SoroSwap and Blend are in assets.ts and lending/; here: FxDAO and Allbridge reference.\r\n */\r\n\r\n/** FxDAO: synthetic stablecoins (USDx, EURx, GBPx) and vaults (fxdao.io/docs/addresses). */\r\nexport const FXDAO_MAINNET = {\r\n vaults: \"CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB\",\r\n lockingPool: \"CDCART6WRSM2K4CKOAOB5YKUVBSJ6KLOVS7ZEJHA4OAQ2FXX7JOHLXIP\",\r\n usdx: \"CDIKURWHYS4FFTR5KOQK6MBFZA2K3E26WGBQI6PXBYWZ4XIOPJHDFJKP\",\r\n eurx: \"CBN3NCJSMOQTC6SPEYK3A44NU4VS3IPKTARJLI3Y77OH27EWBY36TP7U\",\r\n gbpx: \"CBCO65UOWXY2GR66GOCMCN6IU3Y45TXCPBY3FLUNL4AOUMOCKVIVV6JC\",\r\n fxg: \"CDBR4FMYL5WPUDBIXTBEBU2AFEYTDLXVOTRZHXS3JC575C7ZQRKYZQ55\",\r\n oracle: \"CB5OTV4GV24T5USEZHFVYGC3F4A4MPUQ3LN56E76UK2IT7MJ6QXW4TFS\",\r\n} as const;\r\n\r\n/**\r\n * Allbridge Core: cross-chain bridge to/from Stellar.\r\n * No single aggregator contract; integrate via @allbridge/bridge-core-sdk.\r\n * Docs: https://docs-core.allbridge.io/sdk/guides/stellar\r\n */\r\nexport const ALLBRIDGE_CORE_STELLAR_DOCS = \"https://docs-core.allbridge.io/sdk/guides/stellar\" as const;\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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;AAKM,IAAM,UAAyB;AAAA,EACpC,YAAY;AAAA,EACZ,eAAe;AACjB;AAEO,IAAM,WAAW,EAAE,QAAQ;AAI3B,SAAS,iBAAiB,MAA8B;AAC7D,MAAI,QAAQ,SAAS,WAAW;AAC9B,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO;AACT;;;ACrBA,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,MAAM,UAAU,QAAQ,IAAI;AAElC,iBAAe,SAAS,MAAgB,IAAc,QAAsC;AAC1F,UAAM,MAAM,GAAG,iBAAiB;AAChC,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;AACrC,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,SAAS;AACzC,UAAM,oBAAoB,4BAAS;AACnC,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;;;AC3DO,SAAS,gBAAgB,eAA8B,QAA4B;AACxF,SAAO,wBAAwB,eAAe,MAAM;AACtD;;;AChBA,IAAAC,sBAOO;;;ACRA,IAAM,mBAAmB;AAAA;AAAA,EAE9B,KAAK;AAAA;AAAA,EAEL,QAAQ;AAAA;AAAA,EAER,MAAM;AACR;AAEO,IAAM,cAAc;;;ADK3B,IAAM,4BAA4B;AAclC,SAAS,aAAa,OAA+B;AACnD,MAAI,gBAAgB,SAAS,MAAM,YAAY;AAC7C,UAAM,OAAO,IAAI,4BAAQ,MAAM,UAAU;AACzC,WAAO,wBAAI,MAAM,OAAO;AAAA,MACtB,wBAAI,MAAM,UAAU,SAAS;AAAA,MAC7B,wBAAI,MAAM,WAAW,KAAK,YAAY,CAAC;AAAA,IACzC,CAAC;AAAA,EACH;AACA,MAAI,YAAY,SAAS,MAAM,QAAQ;AACrC,WAAO,wBAAI,MAAM,OAAO;AAAA,MACtB,wBAAI,MAAM,UAAU,OAAO;AAAA,MAC3B,wBAAI,MAAM,UAAU,MAAM,MAAM;AAAA,IAClC,CAAC;AAAA,EACH;AACA,QAAM,IAAI,MAAM,mDAAmD;AACrE;AAOA,SAAS,qBAAqB,aAAiC,UAA6B;AAC1F,QAAM,SACJ,OAAO,gBAAgB,WACnB,wBAAI,MAAM,QAAQ,aAAa,QAAQ,IACvC;AACN,QAAM,MAAM,OAAO,IAAI;AACvB,MAAI,CAAC,OAAO,IAAI,WAAW,GAAG;AAC5B,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,QAAM,QAAQ,IAAI,CAAC;AACnB,QAAM,UAAU,MAAM,IAAI;AAC1B,MAAI,WAAW,QAAQ,UAAU,GAAG;AAClC,UAAM,QAAQ,YAAY,QAAQ,CAAC,CAAC;AACpC,UAAM,YAAY,OAAO,QAAQ,CAAC,EAAE,IAAI,GAAG,SAAS,KAAK,CAAC;AAC1D,WAAO,EAAE,OAAO,WAAW,SAAS;AAAA,EACtC;AACA,QAAM,IAAI,MAAM,IAAI;AACpB,MAAI,GAAG;AACL,eAAW,SAAS,GAAG;AACrB,YAAM,IAAI,MAAM,IAAI;AACpB,YAAM,IAAI,MAAM,IAAI;AACpB,UAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,MAAM,WAAW,GAAG;AAChD,cAAM,QAAQ,YAAY,CAAC;AAC3B,YAAI,YAAY;AAChB,mBAAW,MAAM,GAAG;AAClB,cAAI,GAAG,IAAI,EAAE,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,MAAM,aAAa;AAC7D,wBAAY,OAAO,GAAG,IAAI,EAAE,IAAI,GAAG,SAAS,KAAK,CAAC;AAClD;AAAA,UACF;AAAA,QACF;AACA,eAAO,EAAE,OAAO,WAAW,SAAS;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI,MAAM,qCAAqC;AACvD;AAEA,SAAS,YAAY,KAAwB;AAC3C,QAAM,OAAO,IAAI,KAAK;AACtB,MAAI,CAAC,KAAM,OAAM,IAAI,MAAM,qBAAqB;AAChD,QAAM,KAAK,KAAK,GAAG;AACnB,QAAM,KAAK,KAAK,GAAG;AACnB,MAAI,CAAC,MAAM,OAAO,OAAW,QAAO;AACpC,QAAM,QAAQ,OAAO,EAAE;AACvB,QAAM,QAAQ,OAAO,EAAE;AACvB,QAAM,WAAW,QAAQ;AACzB,QAAM,QAAQ,QAAQ,IAAI,aAAc,QAAQ;AAChD,QAAM,QAAQ,QAAQ,IAAI,aAAc,QAAQ;AAChD,MAAI,IAAI,OAAO,KAAK,KAAK,OAAO,KAAK,KAAK;AAC1C,MAAI,SAAU,KAAI,CAAC;AACnB,SAAO,OAAO,CAAC;AACjB;AAQO,SAAS,sBAAsB,QAA+B;AACnE,QAAM,OAAO,OAAO,QAAQ;AAC5B,QAAM,aAAa,iBAAiB,IAAI;AACxC,QAAM,SAAS,IAAI,wBAAI,OAAO,OAAO,cAAc,eAAe;AAAA,IAChE,WAAW,OAAO,cAAc,cAAc,WAAW,OAAO;AAAA,EAClE,CAAC;AACD,QAAM,oBAAoB,6BAAS;AAEnC,iBAAe,WAA4B;AACzC,UAAM,WAAW,IAAI,6BAAS,UAAU;AACxC,UAAM,KAAK,SAAS,KAAK,UAAU;AACnC,UAAM,MAAM,MAAM,OAAO,WAAW,yBAAyB;AAC7D,UAAM,KAAK,IAAI,uCAAmB,KAAK;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,IACF,CAAC,EACE,aAAa,EAAE,EACf,WAAW,EAAE,EACb,MAAM;AACT,UAAM,MAAM,MAAM,OAAO,oBAAoB,EAAE;AAC/C,QAAI,WAAW,OAAO,IAAI,MAAO,OAAM,IAAI,MAAM,OAAO,IAAI,KAAK,CAAC;AAClE,UAAM,MAAO,KAAsD,QAAQ;AAC3E,QAAI,OAAO,KAAM,OAAM,IAAI,MAAM,oBAAoB;AACrD,UAAM,MAAM,OAAO,QAAQ,WAAW,wBAAI,MAAM,QAAQ,KAAK,QAAQ,IAAI;AACzE,UAAM,IAAI,IAAI,IAAI;AAClB,WAAO,KAAK;AAAA,EACd;AAEA,iBAAe,UAAU,OAAwC;AAC/D,UAAM,WAAW,IAAI,6BAAS,UAAU;AACxC,UAAM,aAAa,aAAa,KAAK;AACrC,UAAM,KAAK,SAAS,KAAK,aAAa,UAAU;AAChD,UAAM,MAAM,MAAM,OAAO,WAAW,yBAAyB;AAC7D,UAAM,KAAK,IAAI,uCAAmB,KAAK;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,IACF,CAAC,EACE,aAAa,EAAE,EACf,WAAW,EAAE,EACb,MAAM;AACT,UAAM,MAAM,MAAM,OAAO,oBAAoB,EAAE;AAC/C,QAAI,WAAW,OAAO,IAAI,MAAO,OAAM,IAAI,MAAM,OAAO,IAAI,KAAK,CAAC;AAClE,UAAM,MAAO,KAAsD,QAAQ;AAC3E,QAAI,OAAO,KAAM,OAAM,IAAI,MAAM,6BAA6B;AAC9D,UAAM,MAAM,MAAM,SAAS;AAC3B,WAAO,qBAAqB,KAAK,GAAG;AAAA,EACtC;AAEA,SAAO,EAAE,WAAW,UAAU,WAAW;AAC3C;;;AE9JA,IAAAC,sBAQO;AACP,uBAA0D;AAInD,IAAM,sBAAsB;AAG5B,IAAM,cAAc,EAAE,SAAS,oBAAoB;AAsB1D,eAAe,cACb,eACA,WACA,QACA,UACgD;AAChD,QAAM,UAAU,4BAAQ,WAAW,UAAU,KAAK,CAAC;AACnD,QAAM,OAAO,QAAQ,UAAU;AAC/B,QAAM,OAAO,IAAI,gCAAe,MAAM;AACtC,QAAM,cAAc,KAAK,OAAO;AAAA,IAC9B,MAAM;AAAA,IACN,SAAS;AAAA,IACT,IAAI;AAAA,IACJ;AAAA,EACF,CAAC;AACD,QAAM,KAAK,wBAAI,UAAU,QAAQ,aAAa,QAAQ;AACtD,QAAM,oBAAoB,6BAAS;AACnC,QAAM,UAAU,IAAI,4BAAQ,OAAO,cAAc,UAAU;AAC3D,QAAM,gBAAgB,MAAM,QAAQ,YAAY,IAAI;AACpD,QAAM,KAAK,IAAI,uCAAmB,eAAe;AAAA,IAC/C,KAAK;AAAA,IACL;AAAA,EACF,CAAC,EACE,aAAa,EAAE,EACf,WAAW,GAAG,EACd,MAAM;AACT,SAAO,EAAE,IAAI,QAAQ;AACvB;AAKA,eAAsB,cACpB,eACA,WACA,MACwB;AACxB,QAAM,eAAe,OAAO,KAAK,MAAM;AACvC,QAAM,WAAsB;AAAA,IAC1B;AAAA,MACE,cAAc,6BAAY;AAAA,MAC1B,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,EAAE,IAAI,QAAQ,IAAI,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF;AACA,QAAM,SAAS,IAAI,wBAAI,OAAO,cAAc,eAAe;AAAA,IACzD,WAAW,cAAc,cAAc,WAAW,OAAO;AAAA,EAC3D,CAAC;AACD,QAAM,WAAW,MAAM,OAAO,mBAAmB,EAAE;AACnD,WAAS,KAAK,OAAO;AACrB,QAAM,aAAa,MAAM,OAAO,gBAAgB,QAAQ;AACxD,MAAI,WAAW,aAAa;AAC1B,UAAM,IAAI,MAAM,wBAAwB,OAAO,WAAW,WAAW,CAAC,EAAE;AAAA,EAC1E;AACA,SAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,WAAW,UAAU,UAAU;AACzE;AAKA,eAAsB,cACpB,eACA,WACA,MACwB;AACxB,QAAM,eAAe,OAAO,KAAK,MAAM;AACvC,QAAM,WAAsB;AAAA,IAC1B;AAAA,MACE,cAAc,6BAAY;AAAA,MAC1B,SAAS,KAAK;AAAA,MACd,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,EAAE,IAAI,QAAQ,IAAI,MAAM;AAAA,IAC5B;AAAA,IACA;AAAA,IACA,KAAK;AAAA,IACL;AAAA,EACF;AACA,QAAM,SAAS,IAAI,wBAAI,OAAO,cAAc,eAAe;AAAA,IACzD,WAAW,cAAc,cAAc,WAAW,OAAO;AAAA,EAC3D,CAAC;AACD,QAAM,WAAW,MAAM,OAAO,mBAAmB,EAAE;AACnD,WAAS,KAAK,OAAO;AACrB,QAAM,aAAa,MAAM,OAAO,gBAAgB,QAAQ;AACxD,MAAI,WAAW,aAAa;AAC1B,UAAM,IAAI,MAAM,wBAAwB,OAAO,WAAW,WAAW,CAAC,EAAE;AAAA,EAC1E;AACA,SAAO,EAAE,MAAM,WAAW,MAAM,QAAQ,WAAW,UAAU,UAAU;AACzE;;;AN5HO,IAAM,kBAAN,MAAsB;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EACR,eAAe;AAAA,EACf,OAAkD;AAAA,EAClD,WAAkC;AAAA,EAClC,UAA2D;AAAA,EAEnE,YAAY,WAAmB,UAA0B,WAAW;AAClE,QAAI,YAAY,WAAW;AACzB,YAAM,IAAI,MAAM,uDAAuD;AAAA,IACzE;AACA,SAAK,UAAU,4BAAQ,WAAW,UAAU,KAAK,CAAC;AAClD,SAAK,UAAU;AACf,SAAK,SAAS,iBAAiB;AAAA,EACjC;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,UAAU,sBAAsB,EAAE,eAAe,KAAK,OAAO,CAAC;AACnE,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,EASA,MAAM,YAAY,WAA6G;AAC7H,SAAK,kBAAkB;AACvB,QAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,yBAAyB;AAC7D,UAAM,KAAK,aAAa,KAAK,QAAQ,UAAU;AAC/C,UAAM,UAAU,MAAM,KAAK,SAAS,YAAY,EAAE;AAClD,WAAQ,QAAQ,SAAmG,IAAI,CAAC,OAAO;AAAA,MAC7H,WAAW,EAAE,eAAe,WAAW,QAAQ,EAAE;AAAA,MACjD,QAAQ,EAAE;AAAA,MACV,SAAS,EAAE;AAAA,MACX,OAAO,EAAE;AAAA,IACX,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,cAAc,aAAqB,iBAAoD;AAC3F,SAAK,kBAAkB;AACvB,QAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,yBAAyB;AAC7D,UAAM,oBAAoB,6BAAS;AACnC,UAAM,gBAAgB,MAAM,KAAK,SAAS,YAAY,KAAK,QAAQ,UAAU,CAAC;AAC9E,UAAM,KAAK,IAAI,uCAAmB,eAAe;AAAA,MAC/C,KAAK;AAAA,MACL;AAAA,IACF,CAAC,EACE,aAAa,8BAAU,cAAc,EAAE,aAAa,gBAAgB,CAAC,CAAC,EACtE,WAAW,GAAG,EACd,MAAM;AACT,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;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,oBAAoB,6BAAS;AACnC,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;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,YACJ,WACA,SACA,aACA,WACA,YACA,OAAsD,CAAC,GAC5B;AAC3B,SAAK,kBAAkB;AACvB,QAAI,CAAC,KAAK,SAAU,OAAM,IAAI,MAAM,yBAAyB;AAC7D,UAAM,OACJ,UAAU,cAAc,SAAS,CAAC,UAAU,SACxC,0BAAM,OAAO,IACb,IAAI,0BAAM,UAAU,WAAW,UAAU,MAAO;AACtD,UAAM,OACJ,UAAU,cAAc,SAAS,CAAC,UAAU,SACxC,0BAAM,OAAO,IACb,IAAI,0BAAM,UAAU,WAAW,UAAU,MAAO;AACtD,UAAM,aAAa,KAAK;AAAA,MAAI,CAAC,MAC3B,EAAE,cAAc,SAAS,CAAC,EAAE,SAAS,0BAAM,OAAO,IAAI,IAAI,0BAAM,EAAE,WAAW,EAAE,MAAO;AAAA,IACxF;AACA,UAAM,oBAAoB,6BAAS;AACnC,UAAM,gBAAgB,MAAM,KAAK,SAAS,YAAY,KAAK,QAAQ,UAAU,CAAC;AAC9E,UAAM,KAAK,IAAI,uCAAmB,eAAe;AAAA,MAC/C,KAAK;AAAA,MACL;AAAA,IACF,CAAC,EACE;AAAA,MACC,8BAAU,yBAAyB;AAAA,QACjC,WAAW;AAAA,QACX;AAAA,QACA;AAAA,QACA,WAAW;AAAA,QACX;AAAA,QACA,MAAM;AAAA,MACR,CAAC;AAAA,IACH,EACC,WAAW,GAAG,EACd,MAAM;AACT,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;AAAA,EAQA,MAAM,SAAS,OAAwC;AACrD,SAAK,kBAAkB;AACvB,QAAI,CAAC,KAAK,QAAS,OAAM,IAAI,MAAM,wBAAwB;AAC3D,WAAO,KAAK,QAAQ,UAAU,KAAK;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,cAAc,MAAiD;AACnE,SAAK,kBAAkB;AACvB,WAAO,cAAY,KAAK,QAAQ,KAAK,QAAQ,OAAO,GAAG,IAAI;AAAA,EAC7D;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cAAc,MAAiD;AACnE,SAAK,kBAAkB;AACvB,WAAO,cAAY,KAAK,QAAQ,KAAK,QAAQ,OAAO,GAAG,IAAI;AAAA,EAC7D;AACF;;;AOlPO,IAAM,iBAAiB;AAAA,EAC5B,KAAK,EAAE,YAAY,2DAA2D;AAAA,EAC9E,MAAM,EAAE,YAAY,2DAA2D;AACjF;AAGO,IAAM,sBAAsB;;;ACN5B,IAAM,gBAAgB;AAAA,EAC3B,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,QAAQ;AACV;AAOO,IAAM,8BAA8B;","names":["import_stellar_sdk","import_stellar_sdk","import_stellar_sdk","import_stellar_sdk"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -174,6 +174,26 @@ declare class StellarAgentKit {
|
|
|
174
174
|
* One-shot: get quote and execute swap (convenience).
|
|
175
175
|
*/
|
|
176
176
|
dexSwapExactIn(fromAsset: DexAsset, toAsset: DexAsset, amount: string): Promise<SwapResult>;
|
|
177
|
+
/**
|
|
178
|
+
* Get balances for an account (native + trustlines).
|
|
179
|
+
* @param accountId - Stellar account ID (G...); defaults to this agent's public key
|
|
180
|
+
* @returns List of balances: asset code, issuer (if not native), balance string, and optional limit
|
|
181
|
+
*/
|
|
182
|
+
getBalances(accountId?: string): Promise<Array<{
|
|
183
|
+
assetCode: string;
|
|
184
|
+
issuer?: string;
|
|
185
|
+
balance: string;
|
|
186
|
+
limit?: string;
|
|
187
|
+
}>>;
|
|
188
|
+
/**
|
|
189
|
+
* Create a new Stellar account (funding from this agent's account).
|
|
190
|
+
* @param destination - New account's public key (G...)
|
|
191
|
+
* @param startingBalance - Amount of XLM to send (e.g. "1" for 1 XLM; minimum ~1 XLM for base reserve)
|
|
192
|
+
* @returns Transaction hash
|
|
193
|
+
*/
|
|
194
|
+
createAccount(destination: string, startingBalance: string): Promise<{
|
|
195
|
+
hash: string;
|
|
196
|
+
}>;
|
|
177
197
|
/**
|
|
178
198
|
* Send a native or custom-asset payment (Horizon).
|
|
179
199
|
* @param to - Destination account (G...)
|
|
@@ -184,6 +204,27 @@ declare class StellarAgentKit {
|
|
|
184
204
|
sendPayment(to: string, amount: string, assetCode?: string, assetIssuer?: string): Promise<{
|
|
185
205
|
hash: string;
|
|
186
206
|
}>;
|
|
207
|
+
/**
|
|
208
|
+
* Path payment (strict receive): send up to sendMax of sendAsset so destination receives exactly destAmount of destAsset.
|
|
209
|
+
* @param sendAsset - Asset to send (native or { code, issuer })
|
|
210
|
+
* @param sendMax - Maximum amount of sendAsset to send (display units)
|
|
211
|
+
* @param destination - Recipient account (G...)
|
|
212
|
+
* @param destAsset - Asset the recipient receives
|
|
213
|
+
* @param destAmount - Exact amount of destAsset the recipient gets (display units)
|
|
214
|
+
* @param path - Optional intermediate assets for the path
|
|
215
|
+
*/
|
|
216
|
+
pathPayment(sendAsset: {
|
|
217
|
+
assetCode: string;
|
|
218
|
+
issuer?: string;
|
|
219
|
+
}, sendMax: string, destination: string, destAsset: {
|
|
220
|
+
assetCode: string;
|
|
221
|
+
issuer?: string;
|
|
222
|
+
}, destAmount: string, path?: Array<{
|
|
223
|
+
assetCode: string;
|
|
224
|
+
issuer?: string;
|
|
225
|
+
}>): Promise<{
|
|
226
|
+
hash: string;
|
|
227
|
+
}>;
|
|
187
228
|
/**
|
|
188
229
|
* Get latest price for an asset from Reflector oracle.
|
|
189
230
|
* @param asset - { contractId: "C..." } for on-chain token or { symbol: "XLM" } for ticker
|
|
@@ -219,4 +260,25 @@ declare const MAINNET_ASSETS: {
|
|
|
219
260
|
/** SoroSwap aggregator contract ID (mainnet). */
|
|
220
261
|
declare const SOROSWAP_AGGREGATOR: "CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH";
|
|
221
262
|
|
|
222
|
-
|
|
263
|
+
/**
|
|
264
|
+
* Stellar DeFi protocol contract addresses (mainnet).
|
|
265
|
+
* SoroSwap and Blend are in assets.ts and lending/; here: FxDAO and Allbridge reference.
|
|
266
|
+
*/
|
|
267
|
+
/** FxDAO: synthetic stablecoins (USDx, EURx, GBPx) and vaults (fxdao.io/docs/addresses). */
|
|
268
|
+
declare const FXDAO_MAINNET: {
|
|
269
|
+
readonly vaults: "CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB";
|
|
270
|
+
readonly lockingPool: "CDCART6WRSM2K4CKOAOB5YKUVBSJ6KLOVS7ZEJHA4OAQ2FXX7JOHLXIP";
|
|
271
|
+
readonly usdx: "CDIKURWHYS4FFTR5KOQK6MBFZA2K3E26WGBQI6PXBYWZ4XIOPJHDFJKP";
|
|
272
|
+
readonly eurx: "CBN3NCJSMOQTC6SPEYK3A44NU4VS3IPKTARJLI3Y77OH27EWBY36TP7U";
|
|
273
|
+
readonly gbpx: "CBCO65UOWXY2GR66GOCMCN6IU3Y45TXCPBY3FLUNL4AOUMOCKVIVV6JC";
|
|
274
|
+
readonly fxg: "CDBR4FMYL5WPUDBIXTBEBU2AFEYTDLXVOTRZHXS3JC575C7ZQRKYZQ55";
|
|
275
|
+
readonly oracle: "CB5OTV4GV24T5USEZHFVYGC3F4A4MPUQ3LN56E76UK2IT7MJ6QXW4TFS";
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Allbridge Core: cross-chain bridge to/from Stellar.
|
|
279
|
+
* No single aggregator contract; integrate via @allbridge/bridge-core-sdk.
|
|
280
|
+
* Docs: https://docs-core.allbridge.io/sdk/guides/stellar
|
|
281
|
+
*/
|
|
282
|
+
declare const ALLBRIDGE_CORE_STELLAR_DOCS: "https://docs-core.allbridge.io/sdk/guides/stellar";
|
|
283
|
+
|
|
284
|
+
export { ALLBRIDGE_CORE_STELLAR_DOCS, BAND_ORACLE, BLEND_POOLS, BLEND_POOLS_MAINNET, type DexAsset, type DexClient, FXDAO_MAINNET, type LendingBorrowArgs, type LendingResult, type LendingSupplyArgs, MAINNET_ASSETS, type NetworkConfig, type NetworkName, type OracleAsset, type PriceData, type QuoteResult, REFLECTOR_ORACLE, type ReflectorOracle, type ReflectorOracleConfig, SOROSWAP_AGGREGATOR, StellarAgentKit, type StellarAsset, type StellarNetwork, type SwapResult, createDexClient, createReflectorOracle, getNetworkConfig, lendingBorrow, lendingSupply, networks };
|
package/dist/index.d.ts
CHANGED
|
@@ -174,6 +174,26 @@ declare class StellarAgentKit {
|
|
|
174
174
|
* One-shot: get quote and execute swap (convenience).
|
|
175
175
|
*/
|
|
176
176
|
dexSwapExactIn(fromAsset: DexAsset, toAsset: DexAsset, amount: string): Promise<SwapResult>;
|
|
177
|
+
/**
|
|
178
|
+
* Get balances for an account (native + trustlines).
|
|
179
|
+
* @param accountId - Stellar account ID (G...); defaults to this agent's public key
|
|
180
|
+
* @returns List of balances: asset code, issuer (if not native), balance string, and optional limit
|
|
181
|
+
*/
|
|
182
|
+
getBalances(accountId?: string): Promise<Array<{
|
|
183
|
+
assetCode: string;
|
|
184
|
+
issuer?: string;
|
|
185
|
+
balance: string;
|
|
186
|
+
limit?: string;
|
|
187
|
+
}>>;
|
|
188
|
+
/**
|
|
189
|
+
* Create a new Stellar account (funding from this agent's account).
|
|
190
|
+
* @param destination - New account's public key (G...)
|
|
191
|
+
* @param startingBalance - Amount of XLM to send (e.g. "1" for 1 XLM; minimum ~1 XLM for base reserve)
|
|
192
|
+
* @returns Transaction hash
|
|
193
|
+
*/
|
|
194
|
+
createAccount(destination: string, startingBalance: string): Promise<{
|
|
195
|
+
hash: string;
|
|
196
|
+
}>;
|
|
177
197
|
/**
|
|
178
198
|
* Send a native or custom-asset payment (Horizon).
|
|
179
199
|
* @param to - Destination account (G...)
|
|
@@ -184,6 +204,27 @@ declare class StellarAgentKit {
|
|
|
184
204
|
sendPayment(to: string, amount: string, assetCode?: string, assetIssuer?: string): Promise<{
|
|
185
205
|
hash: string;
|
|
186
206
|
}>;
|
|
207
|
+
/**
|
|
208
|
+
* Path payment (strict receive): send up to sendMax of sendAsset so destination receives exactly destAmount of destAsset.
|
|
209
|
+
* @param sendAsset - Asset to send (native or { code, issuer })
|
|
210
|
+
* @param sendMax - Maximum amount of sendAsset to send (display units)
|
|
211
|
+
* @param destination - Recipient account (G...)
|
|
212
|
+
* @param destAsset - Asset the recipient receives
|
|
213
|
+
* @param destAmount - Exact amount of destAsset the recipient gets (display units)
|
|
214
|
+
* @param path - Optional intermediate assets for the path
|
|
215
|
+
*/
|
|
216
|
+
pathPayment(sendAsset: {
|
|
217
|
+
assetCode: string;
|
|
218
|
+
issuer?: string;
|
|
219
|
+
}, sendMax: string, destination: string, destAsset: {
|
|
220
|
+
assetCode: string;
|
|
221
|
+
issuer?: string;
|
|
222
|
+
}, destAmount: string, path?: Array<{
|
|
223
|
+
assetCode: string;
|
|
224
|
+
issuer?: string;
|
|
225
|
+
}>): Promise<{
|
|
226
|
+
hash: string;
|
|
227
|
+
}>;
|
|
187
228
|
/**
|
|
188
229
|
* Get latest price for an asset from Reflector oracle.
|
|
189
230
|
* @param asset - { contractId: "C..." } for on-chain token or { symbol: "XLM" } for ticker
|
|
@@ -219,4 +260,25 @@ declare const MAINNET_ASSETS: {
|
|
|
219
260
|
/** SoroSwap aggregator contract ID (mainnet). */
|
|
220
261
|
declare const SOROSWAP_AGGREGATOR: "CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH";
|
|
221
262
|
|
|
222
|
-
|
|
263
|
+
/**
|
|
264
|
+
* Stellar DeFi protocol contract addresses (mainnet).
|
|
265
|
+
* SoroSwap and Blend are in assets.ts and lending/; here: FxDAO and Allbridge reference.
|
|
266
|
+
*/
|
|
267
|
+
/** FxDAO: synthetic stablecoins (USDx, EURx, GBPx) and vaults (fxdao.io/docs/addresses). */
|
|
268
|
+
declare const FXDAO_MAINNET: {
|
|
269
|
+
readonly vaults: "CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB";
|
|
270
|
+
readonly lockingPool: "CDCART6WRSM2K4CKOAOB5YKUVBSJ6KLOVS7ZEJHA4OAQ2FXX7JOHLXIP";
|
|
271
|
+
readonly usdx: "CDIKURWHYS4FFTR5KOQK6MBFZA2K3E26WGBQI6PXBYWZ4XIOPJHDFJKP";
|
|
272
|
+
readonly eurx: "CBN3NCJSMOQTC6SPEYK3A44NU4VS3IPKTARJLI3Y77OH27EWBY36TP7U";
|
|
273
|
+
readonly gbpx: "CBCO65UOWXY2GR66GOCMCN6IU3Y45TXCPBY3FLUNL4AOUMOCKVIVV6JC";
|
|
274
|
+
readonly fxg: "CDBR4FMYL5WPUDBIXTBEBU2AFEYTDLXVOTRZHXS3JC575C7ZQRKYZQ55";
|
|
275
|
+
readonly oracle: "CB5OTV4GV24T5USEZHFVYGC3F4A4MPUQ3LN56E76UK2IT7MJ6QXW4TFS";
|
|
276
|
+
};
|
|
277
|
+
/**
|
|
278
|
+
* Allbridge Core: cross-chain bridge to/from Stellar.
|
|
279
|
+
* No single aggregator contract; integrate via @allbridge/bridge-core-sdk.
|
|
280
|
+
* Docs: https://docs-core.allbridge.io/sdk/guides/stellar
|
|
281
|
+
*/
|
|
282
|
+
declare const ALLBRIDGE_CORE_STELLAR_DOCS: "https://docs-core.allbridge.io/sdk/guides/stellar";
|
|
283
|
+
|
|
284
|
+
export { ALLBRIDGE_CORE_STELLAR_DOCS, BAND_ORACLE, BLEND_POOLS, BLEND_POOLS_MAINNET, type DexAsset, type DexClient, FXDAO_MAINNET, type LendingBorrowArgs, type LendingResult, type LendingSupplyArgs, MAINNET_ASSETS, type NetworkConfig, type NetworkName, type OracleAsset, type PriceData, type QuoteResult, REFLECTOR_ORACLE, type ReflectorOracle, type ReflectorOracleConfig, SOROSWAP_AGGREGATOR, StellarAgentKit, type StellarAsset, type StellarNetwork, type SwapResult, createDexClient, createReflectorOracle, getNetworkConfig, lendingBorrow, lendingSupply, networks };
|
package/dist/index.js
CHANGED
|
@@ -359,6 +359,43 @@ var StellarAgentKit = class {
|
|
|
359
359
|
const quote = await this.dexGetQuote(fromAsset, toAsset, amount);
|
|
360
360
|
return this.dexSwap(quote);
|
|
361
361
|
}
|
|
362
|
+
// ─── Account & balances ────────────────────────────────────────────────────
|
|
363
|
+
/**
|
|
364
|
+
* Get balances for an account (native + trustlines).
|
|
365
|
+
* @param accountId - Stellar account ID (G...); defaults to this agent's public key
|
|
366
|
+
* @returns List of balances: asset code, issuer (if not native), balance string, and optional limit
|
|
367
|
+
*/
|
|
368
|
+
async getBalances(accountId) {
|
|
369
|
+
this.ensureInitialized();
|
|
370
|
+
if (!this._horizon) throw new Error("Horizon not initialized");
|
|
371
|
+
const id = accountId ?? this.keypair.publicKey();
|
|
372
|
+
const account = await this._horizon.loadAccount(id);
|
|
373
|
+
return account.balances.map((b) => ({
|
|
374
|
+
assetCode: b.asset_code === "native" ? "XLM" : b.asset_code,
|
|
375
|
+
issuer: b.asset_issuer,
|
|
376
|
+
balance: b.balance,
|
|
377
|
+
limit: b.limit
|
|
378
|
+
}));
|
|
379
|
+
}
|
|
380
|
+
/**
|
|
381
|
+
* Create a new Stellar account (funding from this agent's account).
|
|
382
|
+
* @param destination - New account's public key (G...)
|
|
383
|
+
* @param startingBalance - Amount of XLM to send (e.g. "1" for 1 XLM; minimum ~1 XLM for base reserve)
|
|
384
|
+
* @returns Transaction hash
|
|
385
|
+
*/
|
|
386
|
+
async createAccount(destination, startingBalance) {
|
|
387
|
+
this.ensureInitialized();
|
|
388
|
+
if (!this._horizon) throw new Error("Horizon not initialized");
|
|
389
|
+
const networkPassphrase = Networks4.PUBLIC;
|
|
390
|
+
const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());
|
|
391
|
+
const tx = new TransactionBuilder4(sourceAccount, {
|
|
392
|
+
fee: "100",
|
|
393
|
+
networkPassphrase
|
|
394
|
+
}).addOperation(Operation.createAccount({ destination, startingBalance })).setTimeout(180).build();
|
|
395
|
+
tx.sign(this.keypair);
|
|
396
|
+
const result = await this._horizon.submitTransaction(tx);
|
|
397
|
+
return { hash: result.hash };
|
|
398
|
+
}
|
|
362
399
|
// ─── Payments (Horizon) ────────────────────────────────────────────────────
|
|
363
400
|
/**
|
|
364
401
|
* Send a native or custom-asset payment (Horizon).
|
|
@@ -381,6 +418,42 @@ var StellarAgentKit = class {
|
|
|
381
418
|
const result = await this._horizon.submitTransaction(tx);
|
|
382
419
|
return { hash: result.hash };
|
|
383
420
|
}
|
|
421
|
+
/**
|
|
422
|
+
* Path payment (strict receive): send up to sendMax of sendAsset so destination receives exactly destAmount of destAsset.
|
|
423
|
+
* @param sendAsset - Asset to send (native or { code, issuer })
|
|
424
|
+
* @param sendMax - Maximum amount of sendAsset to send (display units)
|
|
425
|
+
* @param destination - Recipient account (G...)
|
|
426
|
+
* @param destAsset - Asset the recipient receives
|
|
427
|
+
* @param destAmount - Exact amount of destAsset the recipient gets (display units)
|
|
428
|
+
* @param path - Optional intermediate assets for the path
|
|
429
|
+
*/
|
|
430
|
+
async pathPayment(sendAsset, sendMax, destination, destAsset, destAmount, path = []) {
|
|
431
|
+
this.ensureInitialized();
|
|
432
|
+
if (!this._horizon) throw new Error("Horizon not initialized");
|
|
433
|
+
const send = sendAsset.assetCode === "XLM" && !sendAsset.issuer ? Asset.native() : new Asset(sendAsset.assetCode, sendAsset.issuer);
|
|
434
|
+
const dest = destAsset.assetCode === "XLM" && !destAsset.issuer ? Asset.native() : new Asset(destAsset.assetCode, destAsset.issuer);
|
|
435
|
+
const pathAssets = path.map(
|
|
436
|
+
(p) => p.assetCode === "XLM" && !p.issuer ? Asset.native() : new Asset(p.assetCode, p.issuer)
|
|
437
|
+
);
|
|
438
|
+
const networkPassphrase = Networks4.PUBLIC;
|
|
439
|
+
const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());
|
|
440
|
+
const tx = new TransactionBuilder4(sourceAccount, {
|
|
441
|
+
fee: "100",
|
|
442
|
+
networkPassphrase
|
|
443
|
+
}).addOperation(
|
|
444
|
+
Operation.pathPaymentStrictReceive({
|
|
445
|
+
sendAsset: send,
|
|
446
|
+
sendMax,
|
|
447
|
+
destination,
|
|
448
|
+
destAsset: dest,
|
|
449
|
+
destAmount,
|
|
450
|
+
path: pathAssets
|
|
451
|
+
})
|
|
452
|
+
).setTimeout(180).build();
|
|
453
|
+
tx.sign(this.keypair);
|
|
454
|
+
const result = await this._horizon.submitTransaction(tx);
|
|
455
|
+
return { hash: result.hash };
|
|
456
|
+
}
|
|
384
457
|
// ─── Oracle (Reflector SEP-40) ─────────────────────────────────────────────
|
|
385
458
|
/**
|
|
386
459
|
* Get latest price for an asset from Reflector oracle.
|
|
@@ -414,10 +487,24 @@ var MAINNET_ASSETS = {
|
|
|
414
487
|
USDC: { contractId: "CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75" }
|
|
415
488
|
};
|
|
416
489
|
var SOROSWAP_AGGREGATOR = "CAG5LRYQ5JVEUI5TEID72EYOVX44TTUJT5BQR2J6J77FH65PCCFAJDDH";
|
|
490
|
+
|
|
491
|
+
// src/config/protocols.ts
|
|
492
|
+
var FXDAO_MAINNET = {
|
|
493
|
+
vaults: "CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB",
|
|
494
|
+
lockingPool: "CDCART6WRSM2K4CKOAOB5YKUVBSJ6KLOVS7ZEJHA4OAQ2FXX7JOHLXIP",
|
|
495
|
+
usdx: "CDIKURWHYS4FFTR5KOQK6MBFZA2K3E26WGBQI6PXBYWZ4XIOPJHDFJKP",
|
|
496
|
+
eurx: "CBN3NCJSMOQTC6SPEYK3A44NU4VS3IPKTARJLI3Y77OH27EWBY36TP7U",
|
|
497
|
+
gbpx: "CBCO65UOWXY2GR66GOCMCN6IU3Y45TXCPBY3FLUNL4AOUMOCKVIVV6JC",
|
|
498
|
+
fxg: "CDBR4FMYL5WPUDBIXTBEBU2AFEYTDLXVOTRZHXS3JC575C7ZQRKYZQ55",
|
|
499
|
+
oracle: "CB5OTV4GV24T5USEZHFVYGC3F4A4MPUQ3LN56E76UK2IT7MJ6QXW4TFS"
|
|
500
|
+
};
|
|
501
|
+
var ALLBRIDGE_CORE_STELLAR_DOCS = "https://docs-core.allbridge.io/sdk/guides/stellar";
|
|
417
502
|
export {
|
|
503
|
+
ALLBRIDGE_CORE_STELLAR_DOCS,
|
|
418
504
|
BAND_ORACLE,
|
|
419
505
|
BLEND_POOLS,
|
|
420
506
|
BLEND_POOLS_MAINNET,
|
|
507
|
+
FXDAO_MAINNET,
|
|
421
508
|
MAINNET_ASSETS,
|
|
422
509
|
REFLECTOR_ORACLE,
|
|
423
510
|
SOROSWAP_AGGREGATOR,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../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":["/**\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":["Keypair","TransactionBuilder","Networks","Horizon","TransactionBuilder","Networks","rpc","rpc","Networks","TransactionBuilder","Keypair","TransactionBuilder","Networks","xdr","rpc","Keypair","Horizon","Networks","TransactionBuilder"]}
|
|
1
|
+
{"version":3,"sources":["../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","../src/config/protocols.ts"],"sourcesContent":["/**\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\";\nimport { createReflectorOracle, type OracleAsset, type PriceData } from \"./oracle/index.js\";\nimport { lendingSupply as blendSupply, lendingBorrow as blendBorrow, type LendingSupplyArgs, type LendingBorrowArgs, type LendingResult } from \"./lending/index.js\";\n\n/** This project is mainnet-only. */\nexport type StellarNetwork = \"mainnet\";\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 private _oracle: ReturnType<typeof createReflectorOracle> | null = null;\n\n constructor(secretKey: string, network: StellarNetwork = \"mainnet\") {\n if (network !== \"mainnet\") {\n throw new Error(\"This project is mainnet-only. Use network: 'mainnet'.\");\n }\n this.keypair = Keypair.fromSecret(secretKey.trim());\n this.network = \"mainnet\";\n this.config = getNetworkConfig();\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._oracle = createReflectorOracle({ networkConfig: this.config });\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 // ─── Account & balances ────────────────────────────────────────────────────\n\n /**\n * Get balances for an account (native + trustlines).\n * @param accountId - Stellar account ID (G...); defaults to this agent's public key\n * @returns List of balances: asset code, issuer (if not native), balance string, and optional limit\n */\n async getBalances(accountId?: string): Promise<Array<{ assetCode: string; issuer?: string; balance: string; limit?: string }>> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n const id = accountId ?? this.keypair.publicKey();\n const account = await this._horizon.loadAccount(id);\n return (account.balances as Array<{ asset_code: string; asset_issuer?: string; balance: string; limit?: string }>).map((b) => ({\n assetCode: b.asset_code === \"native\" ? \"XLM\" : b.asset_code,\n issuer: b.asset_issuer,\n balance: b.balance,\n limit: b.limit,\n }));\n }\n\n /**\n * Create a new Stellar account (funding from this agent's account).\n * @param destination - New account's public key (G...)\n * @param startingBalance - Amount of XLM to send (e.g. \"1\" for 1 XLM; minimum ~1 XLM for base reserve)\n * @returns Transaction hash\n */\n async createAccount(destination: string, startingBalance: string): Promise<{ hash: string }> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n const networkPassphrase = Networks.PUBLIC;\n const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());\n const tx = new TransactionBuilder(sourceAccount, {\n fee: \"100\",\n networkPassphrase,\n })\n .addOperation(Operation.createAccount({ destination, startingBalance }))\n .setTimeout(180)\n .build();\n tx.sign(this.keypair);\n const result = await this._horizon.submitTransaction(tx);\n return { hash: result.hash };\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 = 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 /**\n * Path payment (strict receive): send up to sendMax of sendAsset so destination receives exactly destAmount of destAsset.\n * @param sendAsset - Asset to send (native or { code, issuer })\n * @param sendMax - Maximum amount of sendAsset to send (display units)\n * @param destination - Recipient account (G...)\n * @param destAsset - Asset the recipient receives\n * @param destAmount - Exact amount of destAsset the recipient gets (display units)\n * @param path - Optional intermediate assets for the path\n */\n async pathPayment(\n sendAsset: { assetCode: string; issuer?: string },\n sendMax: string,\n destination: string,\n destAsset: { assetCode: string; issuer?: string },\n destAmount: string,\n path: Array<{ assetCode: string; issuer?: string }> = []\n ): Promise<{ hash: string }> {\n this.ensureInitialized();\n if (!this._horizon) throw new Error(\"Horizon not initialized\");\n const send =\n sendAsset.assetCode === \"XLM\" && !sendAsset.issuer\n ? Asset.native()\n : new Asset(sendAsset.assetCode, sendAsset.issuer!);\n const dest =\n destAsset.assetCode === \"XLM\" && !destAsset.issuer\n ? Asset.native()\n : new Asset(destAsset.assetCode, destAsset.issuer!);\n const pathAssets = path.map((p) =>\n p.assetCode === \"XLM\" && !p.issuer ? Asset.native() : new Asset(p.assetCode, p.issuer!)\n );\n const networkPassphrase = Networks.PUBLIC;\n const sourceAccount = await this._horizon.loadAccount(this.keypair.publicKey());\n const tx = new TransactionBuilder(sourceAccount, {\n fee: \"100\",\n networkPassphrase,\n })\n .addOperation(\n Operation.pathPaymentStrictReceive({\n sendAsset: send,\n sendMax,\n destination,\n destAsset: dest,\n destAmount,\n path: pathAssets,\n })\n )\n .setTimeout(180)\n .build();\n tx.sign(this.keypair);\n const result = await this._horizon.submitTransaction(tx);\n return { hash: result.hash };\n }\n\n // ─── Oracle (Reflector SEP-40) ─────────────────────────────────────────────\n\n /**\n * Get latest price for an asset from Reflector oracle.\n * @param asset - { contractId: \"C...\" } for on-chain token or { symbol: \"XLM\" } for ticker\n */\n async getPrice(asset: OracleAsset): Promise<PriceData> {\n this.ensureInitialized();\n if (!this._oracle) throw new Error(\"Oracle not initialized\");\n return this._oracle.lastprice(asset);\n }\n\n // ─── Lending (Blend) ───────────────────────────────────────────────────────\n\n /**\n * Supply (deposit) an asset to a Blend pool.\n */\n async lendingSupply(args: LendingSupplyArgs): Promise<LendingResult> {\n this.ensureInitialized();\n return blendSupply(this.config, this.keypair.secret(), args);\n }\n\n /**\n * Borrow an asset from a Blend pool.\n */\n async lendingBorrow(args: LendingBorrowArgs): Promise<LendingResult> {\n this.ensureInitialized();\n return blendBorrow(this.config, this.keypair.secret(), args);\n }\n}\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","/**\r\n * Stellar DeFi protocol contract addresses (mainnet).\r\n * SoroSwap and Blend are in assets.ts and lending/; here: FxDAO and Allbridge reference.\r\n */\r\n\r\n/** FxDAO: synthetic stablecoins (USDx, EURx, GBPx) and vaults (fxdao.io/docs/addresses). */\r\nexport const FXDAO_MAINNET = {\r\n vaults: \"CCUN4RXU5VNDHSF4S4RKV4ZJYMX2YWKOH6L4AKEKVNVDQ7HY5QIAO4UB\",\r\n lockingPool: \"CDCART6WRSM2K4CKOAOB5YKUVBSJ6KLOVS7ZEJHA4OAQ2FXX7JOHLXIP\",\r\n usdx: \"CDIKURWHYS4FFTR5KOQK6MBFZA2K3E26WGBQI6PXBYWZ4XIOPJHDFJKP\",\r\n eurx: \"CBN3NCJSMOQTC6SPEYK3A44NU4VS3IPKTARJLI3Y77OH27EWBY36TP7U\",\r\n gbpx: \"CBCO65UOWXY2GR66GOCMCN6IU3Y45TXCPBY3FLUNL4AOUMOCKVIVV6JC\",\r\n fxg: \"CDBR4FMYL5WPUDBIXTBEBU2AFEYTDLXVOTRZHXS3JC575C7ZQRKYZQ55\",\r\n oracle: \"CB5OTV4GV24T5USEZHFVYGC3F4A4MPUQ3LN56E76UK2IT7MJ6QXW4TFS\",\r\n} as const;\r\n\r\n/**\r\n * Allbridge Core: cross-chain bridge to/from Stellar.\r\n * No single aggregator contract; integrate via @allbridge/bridge-core-sdk.\r\n * Docs: https://docs-core.allbridge.io/sdk/guides/stellar\r\n */\r\nexport const ALLBRIDGE_CORE_STELLAR_DOCS = \"https://docs-core.allbridge.io/sdk/guides/stellar\" as const;\r\n"],"mappings":"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","names":["Keypair","TransactionBuilder","Networks","Horizon","TransactionBuilder","Networks","rpc","rpc","Networks","TransactionBuilder","Keypair","TransactionBuilder","Networks","xdr","rpc","Keypair","Horizon","Networks","TransactionBuilder"]}
|