@spield/sdk 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts","../src/amount.ts","../src/soroban.ts","../src/config.ts","../src/blend-strategy.ts","../src/horizon.ts","../src/internal.ts","../src/sr.ts","../src/sr-market.ts","../src/sr-portfolio.ts","../src/sr-protocol.ts","../src/sr-router.ts","../src/sr-tokens.ts","../src/sr-vault.ts","../src/yield-engine.ts","../src/client.ts","../src/signer.ts"],"sourcesContent":["export class SpieldSdkError extends Error {\n constructor(\n message: string,\n readonly code: string,\n readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'SpieldSdkError';\n }\n}\n\nexport class SpieldValidationError extends SpieldSdkError {\n constructor(message: string, cause?: unknown) {\n super(message, 'validation_error', cause);\n this.name = 'SpieldValidationError';\n }\n}\n\nexport class SpieldSignerError extends SpieldSdkError {\n constructor(message: string, cause?: unknown) {\n super(message, 'signer_error', cause);\n this.name = 'SpieldSignerError';\n }\n}\n\nexport class SpieldRpcError extends SpieldSdkError {\n constructor(message: string, cause?: unknown) {\n super(message, 'rpc_error', cause);\n this.name = 'SpieldRpcError';\n }\n}\n\nexport class SpieldContractError extends SpieldSdkError {\n constructor(message: string, cause?: unknown) {\n super(message, 'contract_error', cause);\n this.name = 'SpieldContractError';\n }\n}\n\nexport class SpieldConfigurationError extends SpieldSdkError {\n constructor(message: string, cause?: unknown) {\n super(message, 'configuration_error', cause);\n this.name = 'SpieldConfigurationError';\n }\n}\n","import { SpieldValidationError } from './errors';\nimport type { TokenAmount, TokenSymbol } from './types';\n\nexport const toBaseUnits = (amount: string | number | bigint, decimals = 7): bigint => {\n if (typeof amount === 'bigint') return amount;\n const s = String(amount).trim();\n if (!/^-?\\d+(\\.\\d+)?$/.test(s)) {\n throw new SpieldValidationError(`Invalid token amount: ${String(amount)}`);\n }\n const neg = s.startsWith('-');\n const [wholeRaw, fracRaw = ''] = s.replace('-', '').split('.');\n if (fracRaw.length > decimals) {\n throw new SpieldValidationError(`Amount has more than ${decimals} decimal places.`);\n }\n const scale = 10n ** BigInt(decimals);\n const whole = BigInt(wholeRaw || '0') * scale;\n const frac = BigInt((fracRaw + '0'.repeat(decimals)).slice(0, decimals) || '0');\n const value = whole + frac;\n return neg ? -value : value;\n};\n\nexport const assertPositiveAmount = (amount: string | number | bigint, decimals = 7): bigint => {\n const raw = toBaseUnits(amount, decimals);\n if (raw <= 0n) throw new SpieldValidationError('Amount must be greater than zero.');\n return raw;\n};\n\n/** Parse an amount that may be zero, for slippage floors and optional minimum outputs. */\nexport const assertNonNegativeAmount = (amount: string | number | bigint, decimals = 7): bigint => {\n const raw = toBaseUnits(amount, decimals);\n if (raw < 0n) throw new SpieldValidationError('Amount must be zero or greater.');\n return raw;\n};\n\nexport const fromBaseUnits = (units: bigint | number | string, decimals = 7): string => {\n const value = BigInt(units);\n const sign = value < 0n ? '-' : '';\n const abs = value < 0n ? -value : value;\n const scale = 10n ** BigInt(decimals);\n const whole = abs / scale;\n const frac = (abs % scale).toString().padStart(decimals, '0').replace(/0+$/, '');\n return `${sign}${whole.toString()}${frac ? `.${frac}` : ''}`;\n};\n\nexport const tokenAmount = (\n raw: bigint | number | string,\n symbol: TokenSymbol,\n decimals = 7,\n): TokenAmount => ({\n raw: BigInt(raw),\n formatted: fromBaseUnits(raw, decimals),\n decimals,\n symbol,\n});\n","import {\n Account,\n Address,\n BASE_FEE,\n Contract,\n TransactionBuilder,\n nativeToScVal,\n rpc,\n scValToNative,\n xdr,\n} from '@stellar/stellar-sdk';\nimport { explorerTx, type SpieldNetworkConfig } from './config';\nimport { SpieldContractError, SpieldRpcError, SpieldSignerError } from './errors';\nimport type { SpieldSigner } from './signer';\nimport type { TransactionResult } from './types';\n\nexport type SorobanContext = {\n network: SpieldNetworkConfig;\n signer?: SpieldSigner;\n simulationSource: string;\n confirmationTimeoutMs?: number;\n confirmationPollIntervalMs?: number;\n};\n\nexport const DEFAULT_SIMULATION_SOURCE = 'GBNK7ZOQIZL3HM2LPY7WWJJL3C5YCOEUIJAF4UBSPIEWCEIC2HFSBVVI';\n/** Testnet RPC can index an accepted transaction noticeably after ledger close. */\nexport const DEFAULT_CONFIRMATION_TIMEOUT_MS = 120_000;\nexport const DEFAULT_CONFIRMATION_POLL_INTERVAL_MS = 1_000;\n\nexport const createRpcServer = (network: SpieldNetworkConfig) =>\n new rpc.Server(network.rpcUrl, { allowHttp: network.rpcUrl.startsWith('http://') });\n\nexport const i128 = (v: bigint): xdr.ScVal => nativeToScVal(v, { type: 'i128' });\nexport const u64 = (v: bigint | number): xdr.ScVal => nativeToScVal(BigInt(v), { type: 'u64' });\nexport const u32 = (v: number): xdr.ScVal => nativeToScVal(v, { type: 'u32' });\nexport const addr = (a: string): xdr.ScVal => new Address(a).toScVal();\n\nexport const toBig = (v: unknown): bigint => {\n if (typeof v === 'bigint') return v;\n if (typeof v === 'number') return BigInt(Math.trunc(v));\n if (typeof v === 'string') return BigInt(v);\n return 0n;\n};\n\nexport const toNum = (v: unknown): number => Number(toBig(v));\n\nexport class SorobanClient {\n readonly server: rpc.Server;\n\n constructor(private readonly context: SorobanContext) {\n this.server = createRpcServer(context.network);\n }\n\n async read<T = unknown>(contractId: string, method: string, args: xdr.ScVal[] = []): Promise<T> {\n const contract = new Contract(contractId);\n const account = new Account(this.context.simulationSource, '0');\n const tx = new TransactionBuilder(account, {\n fee: BASE_FEE,\n networkPassphrase: this.context.network.networkPassphrase,\n })\n .addOperation(contract.call(method, ...args))\n .setTimeout(30)\n .build();\n\n // The Stellar SDK can throw TypeError when deserialising XDR responses\n // from a protocol version newer than the SDK supports (\"Bad union switch\").\n // Normalise those into SpieldContractError so callers can handle them cleanly.\n let sim: Awaited<ReturnType<typeof this.server.simulateTransaction>>;\n try {\n sim = await this.server.simulateTransaction(tx);\n } catch (err) {\n throw new SpieldContractError(\n `${method} response could not be parsed (SDK/protocol version mismatch): ${\n err instanceof Error ? err.message : String(err)\n }`,\n err,\n );\n }\n if (rpc.Api.isSimulationError(sim)) {\n throw new SpieldContractError(`${method} failed: ${sim.error}`, sim.error);\n }\n const retval = sim.result?.retval;\n return (retval ? scValToNative(retval) : undefined) as T;\n }\n\n /**\n * **Simulate a value-moving entry point AS `invoker`, and return what it would actually pay.**\n *\n * The `quote_*` views cannot synchronize SR — a view may not write — so they price on SR's stored\n * high-water rate, which lags whenever nothing has synced since the last mutation. The real entry\n * points *do* synchronize (`FINAL_CHECK.md` V2-01), so a quote can OVER-state a sale: derive\n * `minOut` from it and the trade can trip its own slippage bound and revert.\n *\n * Simulating the real function runs the same synchronized code the submission will. Nothing is\n * signed and nothing is sent.\n *\n * Unlike {@link read}, this simulates as the **user** rather than the shared simulation source,\n * because the result depends on their balances.\n *\n * Returns `null` whenever the simulation cannot run — an unaffordable size, a route the pool\n * cannot fill, a deployment predating the entry point — so callers fall back to the quote instead\n * of failing the trade.\n */\n async simulateAs(\n invoker: string,\n contractId: string,\n method: string,\n args: xdr.ScVal[] = [],\n ): Promise<bigint | null> {\n try {\n const tx = new TransactionBuilder(new Account(invoker, '0'), {\n fee: BASE_FEE,\n networkPassphrase: this.context.network.networkPassphrase,\n })\n .addOperation(new Contract(contractId).call(method, ...args))\n .setTimeout(30)\n .build();\n const sim = await this.server.simulateTransaction(tx);\n if (rpc.Api.isSimulationError(sim)) return null;\n const retval = sim.result?.retval;\n if (!retval) return null;\n const native = scValToNative(retval);\n return typeof native === 'bigint' ? native : BigInt(String(native));\n } catch {\n return null;\n }\n }\n\n async write(\n contractId: string,\n method: string,\n args: xdr.ScVal[] = [],\n signer = this.context.signer,\n ): Promise<TransactionResult> {\n if (!signer) throw new SpieldSignerError('A signer is required for write transactions.');\n const walletAddress = await signer.getAddress();\n const contract = new Contract(contractId);\n const sourceAccount = await this.server.getAccount(walletAddress);\n const built = new TransactionBuilder(sourceAccount, {\n fee: BASE_FEE,\n networkPassphrase: this.context.network.networkPassphrase,\n })\n .addOperation(contract.call(method, ...args))\n .setTimeout(60)\n .build();\n\n const sim = await this.server.simulateTransaction(built);\n if (rpc.Api.isSimulationError(sim)) {\n throw new SpieldContractError(parseContractError(sim.error, method, this.context.network), sim.error);\n }\n const prepared = rpc.assembleTransaction(built, sim).build();\n const { signedTxXdr } = await signer.signTransaction(prepared.toXDR(), {\n networkPassphrase: this.context.network.networkPassphrase,\n address: walletAddress,\n });\n\n const signed = TransactionBuilder.fromXDR(signedTxXdr, this.context.network.networkPassphrase);\n const sent = await this.server.sendTransaction(signed);\n if (sent.status === 'ERROR') {\n throw new SpieldRpcError(`Submission failed: ${JSON.stringify(sent.errorResult)}`, sent.errorResult);\n }\n\n return this.waitForConfirmation(sent.hash);\n }\n\n private async waitForConfirmation(hash: string): Promise<TransactionResult> {\n const timeoutMs = positiveMs(this.context.confirmationTimeoutMs, DEFAULT_CONFIRMATION_TIMEOUT_MS);\n const pollIntervalMs = positiveMs(this.context.confirmationPollIntervalMs, DEFAULT_CONFIRMATION_POLL_INTERVAL_MS);\n const deadline = Date.now() + timeoutMs;\n let lastRpcError: unknown;\n\n do {\n try {\n const result = await this.server.getTransaction(hash);\n if (result.status === rpc.Api.GetTransactionStatus.SUCCESS) {\n return { hash, status: 'success', explorerUrl: explorerTx(this.context.network, hash) };\n }\n if (result.status === rpc.Api.GetTransactionStatus.FAILED) {\n throw new SpieldRpcError(`Transaction failed on-chain: ${hash}`, result);\n }\n } catch (err) {\n if (err instanceof SpieldRpcError) throw err;\n // A transient getTransaction failure must not make an accepted transaction\n // look failed. Keep waiting and surface its diagnostic only if we exhaust\n // the confirmation window.\n lastRpcError = err;\n }\n const remaining = deadline - Date.now();\n if (remaining <= 0) break;\n await sleep(Math.min(pollIntervalMs, remaining));\n } while (Date.now() <= deadline);\n\n throw new SpieldRpcError(\n `Timed out waiting ${timeoutMs}ms for transaction confirmation: ${hash}. The transaction was submitted and may still settle; check the explorer before resubmitting.`,\n lastRpcError,\n );\n }\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\nconst positiveMs = (value: number | undefined, fallback: number) =>\n Number.isFinite(value) && (value ?? 0) > 0 ? Math.floor(value!) : fallback;\n\n/**\n * Spield contract error codes, from `contracts/shared/src/errors.rs`. The RPC surfaces these as\n * `Error(Contract, #N)`, which is otherwise opaque to callers.\n */\nconst CONTRACT_ERRORS: Record<number, string> = {\n 1: 'The contract is already initialized.',\n 2: 'The contract is not initialized yet.',\n 3: 'The caller is not authorized for this operation.',\n 4: 'The protocol is currently paused.',\n 5: 'Amount must be greater than zero.',\n 6: 'The operation overflowed.',\n 11: 'The token does not use the 7 decimals the protocol is calibrated for.',\n 22: 'PT can only be redeemed at or after maturity.',\n 23: 'Insufficient balance for this operation.',\n 24: 'The operation would break the solvency invariant and was refused.',\n 40: 'Blend reported a rate outside the configured sanity bound.',\n 41: 'The strategy holds no Blend position for this asset.',\n 42: 'Blend returned less underlying than required. Try a smaller amount.',\n 60: 'That vault receipt does not exist.',\n 61: 'The caller does not own that vault receipt.',\n 62: 'The vault has not matured yet.',\n 63: 'That vault receipt has already been redeemed.',\n 64: 'The vault lacks the spare PT to back a coupon for this deposit.',\n 65: 'The quoted fixed rate is outside the allowed range.',\n 66: 'The vault series has expired; deposits are closed.',\n 80: 'Not enough market liquidity for this trade.',\n 81: 'The output fell below your slippage floor and the trade was reverted.',\n 82: 'The market has expired; PT now redeems at face value instead of trading.',\n 83: 'You do not hold that many LP shares.',\n 84: 'Liquidity must be added in the pool\\'s current PT/SR proportion.',\n 100: 'The spender allowance is smaller than the amount being moved.',\n 101: 'The series has expired; this operation is only valid before expiry.',\n 102: 'This operation is only valid at or after the series expiry.',\n 103: 'The caller is not the contract permitted to drive this entrypoint.',\n 105: 'The output fell below your minimum and the transaction was reverted.',\n 106: 'The amount rounds to zero at the current exchange rate. Use a larger amount.',\n 107: 'The deposit would exceed the SR deposit cap. Check the remaining headroom.',\n};\n\n/**\n * Resolve a simulation failure to a human message.\n *\n * Contract error codes are per-contract, not global: `#13` from the USDC SAC means \"trustline\n * missing\", while `#13` is not even defined in Spield's own enum. So the root-cause contract is\n * identified first, and CONTRACT_ERRORS is applied only when a Spield contract raised the error.\n */\nconst parseContractError = (raw: string, method: string, network: SpieldNetworkConfig): string => {\n const text = raw || '';\n\n // The deepest failing diagnostic event names the contract that actually reverted, and for the\n // built-in SACs it carries a plain-English reason the codes do not.\n const events = [...text.matchAll(\n /contract:(C[A-Z2-7]{55}), topics:\\[error, Error\\(Contract, #(\\d+)\\)\\], data:(?:\"([^\"]*)\"|\\[)/g,\n )];\n const root = events.at(-1);\n const rootContract = root?.[1];\n const rootCode = root ? Number(root[2]) : undefined;\n const rootMessage = root?.[3];\n\n const assetOf = (id?: string) =>\n id === network.contracts.usdc ? 'USDC' : id === network.contracts.pt ? 'PT' : undefined;\n\n if (/trustline entry is missing/.test(text)) {\n const asset = assetOf(rootContract) ?? assetOf(/contract:(C[A-Z2-7]{55})[^\\n]*trustline entry is missing/.exec(text)?.[1]);\n if (asset === 'PT') {\n return 'The wallet needs a PT trustline before it can hold PT. Call tokens.ensurePtTrustline().';\n }\n if (asset === 'USDC') {\n return 'The wallet needs a USDC trustline (and a USDC balance) for this transaction.';\n }\n return 'The wallet is missing a required asset trustline for this transaction.';\n }\n\n const isSpieldContract =\n !!rootContract &&\n (['sr', 'strategy', 'yieldEngine', 'market', 'vault', 'router'] as const)\n .some((key) => network.contracts[key] === rootContract);\n\n if (rootCode !== undefined && isSpieldContract) {\n const mapped = CONTRACT_ERRORS[rootCode];\n if (mapped) return mapped;\n return `${method} failed with Spield contract error #${rootCode}.`;\n }\n\n // A foreign contract (a SAC, Blend) reverted. Prefer its own words over a misread code.\n if (rootMessage) return `${method} failed: ${rootMessage}`;\n\n const code = /Error\\(Contract, #(\\d+)\\)/.exec(text);\n if (code) return `${method} failed with contract error #${code[1]}.`;\n return `${method} simulation failed: ${text.slice(0, 200)}`;\n};\n","export type SpieldNetworkKey = 'testnet' | 'custom';\n\nexport type SpieldNetworkConfig = {\n key: SpieldNetworkKey;\n networkName: 'TESTNET' | string;\n networkPassphrase: string;\n rpcUrl: string;\n horizonUrl: string;\n explorerUrl: string;\n contracts: {\n /** Standardized Return share token over the strategy. */\n sr: string;\n /** Blend adapter behind SR. */\n strategy: string;\n /** PT/YT engine. This contract is also the custom SEP-41 YT token. */\n yieldEngine: string;\n /** PT/SR market. */\n market: string;\n /** Fixed-rate vault. */\n vault: string;\n /** One-transaction USDC routes. */\n router: string;\n /** Principal Token Stellar Asset Contract. */\n pt: string;\n usdc: string;\n };\n assets: {\n /** The only trustline the protocol requires. YT is a contract token, not a classic asset. */\n pt: { code: string; issuer: string };\n };\n decimals: number;\n};\n\nexport const STELLAR_NETWORK_PASSPHRASES = {\n PUBLIC: 'Public Global Stellar Network ; September 2015',\n TESTNET: 'Test SDF Network ; September 2015',\n} as const;\n\n/**\n * The live Spield Testnet deployment, tracking `deploy_sr_testnet.state` as of the\n * **2026-08-30 redeploy**.\n *\n * That deployment carries the whole `FINAL_CHECK.md` round, and two of the fixes change behaviour\n * an SDK consumer can observe:\n *\n * * **V2-01** — the market now prices every value-moving trade on a SYNCHRONIZED index\n * (`yieldEngine.py_index_current`). The `quote*` views still read the stored rate and can\n * therefore slightly OVER-state a sale, so size `minOut` from a simulation of the real entry\n * point rather than from a quote. See `USAGE.md`.\n * * **V2-03** — the router no longer refuses to trade while a stray token balance rests on it, so\n * a stranger's dust can no longer deny every route.\n *\n * New read-only surface: `sr.realizableRate()`, `strategy.claimableEmissions()`.\n */\nexport const testnet = (): SpieldNetworkConfig => ({\n key: 'testnet',\n networkName: 'TESTNET',\n networkPassphrase: STELLAR_NETWORK_PASSPHRASES.TESTNET,\n rpcUrl: 'https://soroban-testnet.stellar.org',\n horizonUrl: 'https://horizon-testnet.stellar.org',\n explorerUrl: 'https://stellar.expert/explorer/testnet',\n contracts: {\n sr: 'CDYAM3NGY5I3SUGPCDQUS25MGCIWT2YOBDSWYT6SJNIPN6A6OOUSSCZY',\n strategy: 'CDPNSWSBVBRF52SED6UD7T2VQH6XODLEHXSCFTZHQP73SNYTKIHP5R2B',\n yieldEngine: 'CDS2Q6L3QCUK4KX633M7QH53GC76EVOUAK7WJ54T3AP3J6IGXIM3LURD',\n market: 'CBL7Z3BONITNSWO7NJLT67464HLVVQF5G3REI3XT6KUCK7YNHPICJX5A',\n vault: 'CDKV7Z7FF3DA57LSO2JA6GFKAIDDIDMZD5XWCMV7G5I3E4ZA3NN2NMH7',\n router: 'CDP3VUYH3GEGNOF4XUHKMP5GBTH3SBCL5R3GM5ZTVQAGV7FOAPAQJTGE',\n pt: 'CB3T6FOMAH77Z2FMSA2IEVLQEIYOQRRFP7JMJMJGMUCO6HGOOZJZJ7OC',\n usdc: 'CAQCFVLOBK5GIULPNZRGATJJMIZL5BSP7X5YJVMGCPTUEPFM4AVSRCJU',\n },\n assets: {\n pt: { code: 'SPLDPT7', issuer: 'GDTM2UMJEO6LV5HE2SI56IEWNX5OAF5HV2XNZMVZEDXMMPHZUWXSSLQU' },\n },\n decimals: 7,\n});\n\nexport const customNetwork = (config: SpieldNetworkConfig): SpieldNetworkConfig => config;\n\nexport const explorerTx = (network: SpieldNetworkConfig, hash: string) =>\n `${network.explorerUrl}/tx/${hash}`;\n","import { assertPositiveAmount, tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport { addr, i128, toBig, toNum, type SorobanClient } from './soroban';\nimport type { TokenAmount } from './types';\n\nexport type BlendStrategyRateBound = {\n lastRate: bigint;\n lastTimestamp: number;\n maxAprBps: number;\n};\n\nexport type BlendStrategyState = {\n currentRate: bigint;\n totalShares: TokenAmount;\n availableLiquidity: TokenAmount;\n underlying: string;\n pool: string;\n rateBound: BlendStrategyRateBound;\n};\n\n/** Read client for the Blend adapter behind SR. */\nexport class BlendStrategyClient {\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n ) {}\n\n private get contract() {\n return this.network.contracts.strategy;\n }\n\n async getAvailableLiquidity(): Promise<TokenAmount> {\n const value = await this.soroban.read(this.contract, 'available_liquidity');\n return tokenAmount(toBig(value), 'USDC', this.network.decimals);\n }\n\n /**\n * **BLND accrued to the protocol and not yet claimed.**\n *\n * Measured on mainnet 2026-08-30: Blend allocates emissions to XLM *suppliers* and USDC\n * *borrowers*, not USDC suppliers — which is the side Spield is on — so this reads `0` and has\n * never been anything else. Allocations carry an expiration and rotate each cycle, so it will not\n * necessarily stay zero.\n *\n * Claiming is permissionless and pays a destination fixed in contract storage, so an integrator\n * can trigger it but can never redirect it.\n */\n async getClaimableEmissions(): Promise<TokenAmount> {\n try {\n const value = await this.soroban.read(this.contract, 'claimable_emissions');\n return tokenAmount(toBig(value), 'BLND', this.network.decimals);\n } catch {\n return tokenAmount(0n, 'BLND', this.network.decimals);\n }\n }\n\n /**\n * **What the whole Blend position is really worth**, live rate, no monotonicity guard, no write.\n * Unlike {@link getPositionValue} this keeps answering while a rate decrease has exits frozen.\n */\n async getPositionValueUnguarded(): Promise<TokenAmount | null> {\n try {\n const value = await this.soroban.read(this.contract, 'position_value_unguarded');\n return tokenAmount(toBig(value), 'USDC', this.network.decimals);\n } catch {\n return null;\n }\n }\n\n async getRateBound(): Promise<BlendStrategyRateBound> {\n const tuple = await this.soroban.read<unknown[]>(this.contract, 'rate_bound');\n const [lastRate, lastTimestamp, maxAprBps] = tuple ?? [];\n return {\n lastRate: toBig(lastRate),\n lastTimestamp: toNum(lastTimestamp),\n maxAprBps: toNum(maxAprBps),\n };\n }\n\n async getPositionValue(input: { shares: string | number | bigint }): Promise<TokenAmount> {\n const shares = assertPositiveAmount(input.shares, this.network.decimals);\n const value = await this.soroban.read(this.contract, 'position_value', [i128(shares)]);\n return tokenAmount(toBig(value), 'USDC', this.network.decimals);\n }\n\n async getState(): Promise<BlendStrategyState> {\n const [currentRate, shares, liquidity, underlying, pool, rateBound] = await Promise.all([\n this.soroban.read(this.contract, 'current_rate'),\n this.soroban.read(this.contract, 'total_shares'),\n this.getAvailableLiquidity(),\n this.soroban.read(this.contract, 'underlying'),\n this.soroban.read(this.contract, 'pool'),\n this.getRateBound(),\n ]);\n return {\n currentRate: toBig(currentRate),\n totalShares: tokenAmount(toBig(shares), 'STRATEGY_SHARES', this.network.decimals),\n availableLiquidity: liquidity,\n underlying: String(underlying),\n pool: String(pool),\n rateBound,\n };\n }\n}\n","import { Asset, BASE_FEE, Horizon, Operation, TransactionBuilder } from '@stellar/stellar-sdk';\nimport type { SpieldNetworkConfig } from './config';\nimport { explorerTx } from './config';\nimport { SpieldSignerError } from './errors';\nimport type { SpieldSigner } from './signer';\nimport type { TransactionResult } from './types';\n\n/**\n * PT is the protocol's only classic asset, so it is the only trustline a wallet needs.\n * YT is a contract token issued by the yield engine and requires none.\n */\nexport type PtTrustlineStatus = { pt: boolean; ready: boolean };\n\nexport class HorizonClient {\n readonly horizon: Horizon.Server;\n\n constructor(private readonly network: SpieldNetworkConfig) {\n this.horizon = new Horizon.Server(network.horizonUrl);\n }\n\n async getPtTrustline(address: string): Promise<PtTrustlineStatus> {\n const { code, issuer } = this.network.assets.pt;\n try {\n const account = await this.horizon.loadAccount(address);\n const pt = account.balances.some(\n (balance) =>\n 'asset_code' in balance &&\n balance.asset_code === code &&\n 'asset_issuer' in balance &&\n balance.asset_issuer === issuer,\n );\n return { pt, ready: pt };\n } catch {\n return { pt: false, ready: false };\n }\n }\n\n async setupPtTrustline(address: string, signer?: SpieldSigner): Promise<TransactionResult | null> {\n if (!signer) throw new SpieldSignerError('A signer is required to setup the PT trustline.');\n if ((await this.getPtTrustline(address)).ready) return null;\n\n const { code, issuer } = this.network.assets.pt;\n const account = await this.horizon.loadAccount(address);\n const tx = new TransactionBuilder(account, {\n fee: BASE_FEE,\n networkPassphrase: this.network.networkPassphrase,\n })\n .addOperation(Operation.changeTrust({ asset: new Asset(code, issuer) }))\n .setTimeout(120)\n .build();\n const { signedTxXdr } = await signer.signTransaction(tx.toXDR(), {\n networkPassphrase: this.network.networkPassphrase,\n address,\n });\n const signed = TransactionBuilder.fromXDR(signedTxXdr, this.network.networkPassphrase);\n const result = await this.horizon.submitTransaction(\n signed as Parameters<typeof this.horizon.submitTransaction>[0],\n );\n return { hash: result.hash, status: 'success', explorerUrl: explorerTx(this.network, result.hash) };\n }\n}\n","import { SpieldSignerError } from './errors';\nimport type { SpieldSigner } from './signer';\n\nexport const signerAddress = async (signer?: SpieldSigner): Promise<string> => {\n if (!signer) throw new SpieldSignerError('A signer is required for this transaction.');\n return signer.getAddress();\n};\n","import { assertNonNegativeAmount, assertPositiveAmount, tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport type { SpieldSigner } from './signer';\nimport { addr, i128, toBig, type SorobanClient } from './soroban';\nimport type { TokenAmount, TransactionResult } from './types';\nimport { signerAddress } from './internal';\n\nexport const SCALAR_12 = 10n ** 12n;\n\n/** Convert a 12-decimal fixed-point contract scalar (price, rate, APY) to a JS number. */\nexport const fromScalar12 = (v: bigint): number => Number(v) / Number(SCALAR_12);\n\nexport type SrState = {\n exchangeRate: bigint;\n exchangeRateNumber: number;\n totalSupply: TokenAmount;\n totalAssets: TokenAmount;\n maxRedeemable: TokenAmount | null;\n depositCap: TokenAmount | null;\n depositHeadroom: TokenAmount | null;\n /** True when the configured TVL cap, rather than a pause, blocks every new deposit. */\n depositCapReached: boolean;\n paused: boolean;\n};\n\n/** Client for Spield's Standardized Return (SR) share token. */\nexport class StandardizedReturnClient {\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n private readonly signer?: SpieldSigner,\n ) {}\n\n private get contract() {\n return this.network.contracts.sr;\n }\n\n async getExchangeRate(): Promise<bigint> {\n return toBig(await this.soroban.read(this.contract, 'exchange_rate'));\n }\n\n /**\n * **The honest twin of {@link getExchangeRate} — what a share is ACTUALLY worth.**\n *\n * `exchange_rate` is a high-water mark: it ratchets up and never falls. That stops the protocol\n * repricing on a transient dip, but it means every value built on it — `previewRedeem`,\n * `getAssetsOf` — reports MORE underlying than a redemption pays once Blend has taken a real loss.\n *\n * This reads the venue with no monotonicity guard, so unlike the guarded paths it keeps answering\n * while exits are frozen — which is exactly when somebody needs the number.\n *\n * Returns `0n` on a deployment predating it. Sitting slightly ABOVE `exchange_rate` in normal\n * operation is expected (it sees accrual the stored rate has not synced); only the other\n * direction is interesting.\n */\n async getRealizableRate(): Promise<bigint> {\n try {\n return toBig(await this.soroban.read(this.contract, 'realizable_rate'));\n } catch {\n return 0n;\n }\n }\n\n /** A holder's actual pro-rata claim. See {@link getRealizableRate}. `null` if unavailable. */\n async getRealizableValue(input: { shares: string | number | bigint }): Promise<TokenAmount | null> {\n const shares = assertPositiveAmount(input.shares, this.network.decimals);\n try {\n const value = await this.soroban.read(this.contract, 'realizable_value', [i128(shares)]);\n return tokenAmount(toBig(value), 'USDC', this.network.decimals);\n } catch {\n return null;\n }\n }\n\n srToUnderlying(shares: bigint, rate: bigint): bigint {\n return rate > 0n ? (shares * rate) / SCALAR_12 : 0n;\n }\n\n underlyingToSr(amount: bigint, rate: bigint): bigint {\n return rate > 0n ? (amount * SCALAR_12) / rate : 0n;\n }\n\n async previewDeposit(input: { amount: string | number | bigint }): Promise<TokenAmount> {\n const amount = assertPositiveAmount(input.amount, this.network.decimals);\n const raw = await this.soroban.read(this.contract, 'preview_deposit', [i128(amount)]);\n return tokenAmount(toBig(raw), 'SR', this.network.decimals);\n }\n\n async previewRedeem(input: { shares: string | number | bigint }): Promise<TokenAmount> {\n const shares = assertPositiveAmount(input.shares, this.network.decimals);\n const raw = await this.soroban.read(this.contract, 'preview_redeem', [i128(shares)]);\n return tokenAmount(toBig(raw), 'USDC', this.network.decimals);\n }\n\n async getBalance(input: { owner: string }): Promise<TokenAmount> {\n const raw = await this.soroban.read(this.contract, 'balance', [addr(input.owner)]);\n return tokenAmount(toBig(raw), 'SR', this.network.decimals);\n }\n\n async getAssetsOf(input: { owner: string }): Promise<TokenAmount> {\n const raw = await this.soroban.read(this.contract, 'assets_of', [addr(input.owner)]);\n return tokenAmount(toBig(raw), 'USDC', this.network.decimals);\n }\n\n async getState(): Promise<SrState> {\n const [rateRaw, supplyRaw, assetsRaw, maxRaw, capRaw, headroomRaw, paused] = await Promise.all([\n this.soroban.read(this.contract, 'exchange_rate'),\n this.soroban.read(this.contract, 'total_supply'),\n this.soroban.read(this.contract, 'total_assets'),\n this.soroban.read(this.contract, 'max_redeemable'),\n this.soroban.read(this.contract, 'deposit_cap'),\n this.soroban.read(this.contract, 'deposit_headroom'),\n this.soroban.read<boolean>(this.contract, 'is_paused'),\n ]);\n const rate = toBig(rateRaw);\n const max = toBig(maxRaw);\n const cap = toBig(capRaw);\n const headroom = toBig(headroomRaw);\n return {\n exchangeRate: rate,\n exchangeRateNumber: Number(rate) / Number(SCALAR_12),\n totalSupply: tokenAmount(toBig(supplyRaw), 'SR', this.network.decimals),\n totalAssets: tokenAmount(toBig(assetsRaw), 'USDC', this.network.decimals),\n maxRedeemable: max === (1n << 127n) - 1n ? null : tokenAmount(max, 'SR', this.network.decimals),\n depositCap: cap === 0n ? null : tokenAmount(cap, 'USDC', this.network.decimals),\n depositHeadroom: cap === 0n ? null : tokenAmount(headroom, 'USDC', this.network.decimals),\n depositCapReached: cap > 0n && headroom === 0n,\n paused,\n };\n }\n\n async deposit(input: {\n amount: string | number | bigint;\n receiver?: string;\n minSharesOut?: string | number | bigint;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const from = await signerAddress(signer);\n return this.soroban.write(this.contract, 'deposit', [\n addr(from),\n addr(input.receiver ?? from),\n i128(assertPositiveAmount(input.amount, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minSharesOut ?? 0n, this.network.decimals)),\n ], signer);\n }\n\n async redeem(input: {\n shares: string | number | bigint;\n receiver?: string;\n minUnderlyingOut?: string | number | bigint;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const from = await signerAddress(signer);\n return this.soroban.write(this.contract, 'redeem', [\n addr(from),\n addr(input.receiver ?? from),\n i128(assertPositiveAmount(input.shares, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minUnderlyingOut ?? 0n, this.network.decimals)),\n ], signer);\n }\n\n async redeemPartial(input: {\n shares: string | number | bigint;\n receiver?: string;\n minUnderlyingOut?: string | number | bigint;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const from = await signerAddress(signer);\n return this.soroban.write(this.contract, 'redeem_partial', [\n addr(from),\n addr(input.receiver ?? from),\n i128(assertPositiveAmount(input.shares, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minUnderlyingOut ?? 0n, this.network.decimals)),\n ], signer);\n }\n\n /** Permissionless update of SR's stored high-water exchange rate. */\n syncRate(input: { signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n return this.soroban.write(this.contract, 'sync_rate', [], input.signer ?? this.signer);\n }\n\n /** Permissionless keep-alive for an SR holder's persistent balance entry. */\n bumpHolder(input: { owner?: string; signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n return signerAddress(signer).then((signerOwner) => this.soroban.write(\n this.contract,\n 'bump_holder',\n [addr(input.owner ?? signerOwner)],\n signer,\n ));\n }\n}\n","import { assertNonNegativeAmount, assertPositiveAmount, tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport { SpieldConfigurationError } from './errors';\nimport type { SpieldSigner } from './signer';\nimport { SCALAR_12 } from './sr';\nimport { addr, i128, toBig, toNum, u32, type SorobanClient } from './soroban';\nimport type { TokenAmount, TransactionResult } from './types';\nimport { signerAddress } from './internal';\n\nexport const YT_MAX_IN_PAD_BPS = 300n;\n\nexport type SrMarketStats = {\n ptReserve: TokenAmount;\n srReserve: TokenAmount;\n assetReserve: TokenAmount;\n totalShares: TokenAmount;\n ptPrice: bigint;\n ptPriceNumber: number;\n impliedApy: bigint;\n impliedApyPct: number;\n expiry: number;\n expiryDate: Date;\n treasuryEarned: TokenAmount;\n treasuryFeeShareBps: number;\n paused: boolean;\n};\n\nexport type SrMarketQuote = { input: TokenAmount; output: TokenAmount; available: boolean };\n\nexport type SrLpPosition = {\n shares: TokenAmount;\n ptClaim: TokenAmount;\n srClaim: TokenAmount;\n};\n\n/** Client for the current PT/SR AMM and its YT routes. */\nexport class SrMarketClient {\n private latestLiquidityAbi: Promise<boolean> | undefined;\n\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n private readonly signer?: SpieldSigner,\n ) {}\n\n private get contract() {\n return this.network.contracts.market;\n }\n\n async getStats(): Promise<SrMarketStats> {\n const [reserves, assetRaw, sharesRaw, priceRaw, apyRaw, expiryRaw, earnedRaw, feeShareRaw, paused] =\n await Promise.all([\n this.soroban.read<unknown[]>(this.contract, 'reserves'),\n this.soroban.read(this.contract, 'asset_reserve'),\n this.soroban.read(this.contract, 'total_shares'),\n this.soroban.read(this.contract, 'pt_price'),\n this.soroban.read(this.contract, 'implied_apy'),\n this.soroban.read(this.contract, 'expiry'),\n this.soroban.read(this.contract, 'treasury_earned'),\n this.soroban.read(this.contract, 'treasury_fee_share_bps'),\n this.soroban.read<boolean>(this.contract, 'is_paused'),\n ]);\n const [ptRaw, srRaw] = reserves ?? [];\n const price = toBig(priceRaw);\n const apy = toBig(apyRaw);\n const expiry = toNum(expiryRaw);\n return {\n ptReserve: tokenAmount(toBig(ptRaw), 'PT', this.network.decimals),\n srReserve: tokenAmount(toBig(srRaw), 'SR', this.network.decimals),\n assetReserve: tokenAmount(toBig(assetRaw), 'USDC', this.network.decimals),\n totalShares: tokenAmount(toBig(sharesRaw), 'LP', this.network.decimals),\n ptPrice: price,\n ptPriceNumber: Number(price) / Number(SCALAR_12),\n impliedApy: apy,\n impliedApyPct: Number(apy) / Number(SCALAR_12) * 100,\n expiry,\n expiryDate: new Date(expiry * 1000),\n treasuryEarned: tokenAmount(toBig(earnedRaw), 'SR', this.network.decimals),\n treasuryFeeShareBps: toNum(feeShareRaw),\n paused,\n };\n }\n\n private async quote(\n method: string,\n amount: string | number | bigint,\n inputSymbol: 'PT' | 'SR' | 'YT',\n outputSymbol: 'PT' | 'SR',\n ): Promise<SrMarketQuote> {\n const input = assertPositiveAmount(amount, this.network.decimals);\n const output = toBig(await this.soroban.read(this.contract, method, [i128(input)]));\n return {\n input: tokenAmount(input, inputSymbol, this.network.decimals),\n output: tokenAmount(output, outputSymbol, this.network.decimals),\n available: output > 0n,\n };\n }\n\n quoteBuyPt(input: { srIn: string | number | bigint }) {\n return this.quote('quote_buy_pt', input.srIn, 'SR', 'PT');\n }\n\n quoteSellPt(input: { ptIn: string | number | bigint }) {\n return this.quote('quote_sell_pt', input.ptIn, 'PT', 'SR');\n }\n\n quoteBuyYt(input: { ytOut: string | number | bigint }) {\n return this.quote('quote_buy_yt', input.ytOut, 'YT', 'SR');\n }\n\n quoteSellYt(input: { ytIn: string | number | bigint }) {\n return this.quote('quote_sell_yt', input.ytIn, 'YT', 'SR');\n }\n\n async getLpPosition(input: { owner: string }): Promise<SrLpPosition> {\n const tuple = await this.soroban.read<unknown[]>(this.contract, 'lp_position', [addr(input.owner)]);\n const [shares, ptClaim, srClaim] = tuple ?? [];\n return {\n shares: tokenAmount(toBig(shares), 'LP', this.network.decimals),\n ptClaim: tokenAmount(toBig(ptClaim), 'PT', this.network.decimals),\n srClaim: tokenAmount(toBig(srClaim), 'SR', this.network.decimals),\n };\n }\n\n async buyPt(input: {\n srIn: string | number | bigint;\n minPtOut?: string | number | bigint;\n deadlineLedger?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'swap_exact_sr_for_pt', [\n addr(owner),\n i128(assertPositiveAmount(input.srIn, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minPtOut ?? 0n, this.network.decimals)),\n u32(input.deadlineLedger ?? 0),\n ], signer);\n }\n\n async sellPt(input: {\n ptIn: string | number | bigint;\n minSrOut?: string | number | bigint;\n deadlineLedger?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'swap_exact_pt_for_sr', [\n addr(owner),\n i128(assertPositiveAmount(input.ptIn, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minSrOut ?? 0n, this.network.decimals)),\n u32(input.deadlineLedger ?? 0),\n ], signer);\n }\n\n async buyYt(input: {\n ytOut: string | number | bigint;\n maxSrIn?: string | number | bigint;\n deadlineLedger?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n const ytOut = assertPositiveAmount(input.ytOut, this.network.decimals);\n let maxSrIn: bigint;\n if (input.maxSrIn === undefined) {\n const quoted = (await this.quoteBuyYt({ ytOut })).output.raw;\n if (quoted <= 0n) throw new Error('No YT quote is available for that size.');\n maxSrIn = quoted + quoted * YT_MAX_IN_PAD_BPS / 10_000n + 1n;\n } else {\n maxSrIn = assertPositiveAmount(input.maxSrIn, this.network.decimals);\n }\n return this.soroban.write(this.contract, 'buy_yt_exact_out', [\n addr(owner), i128(ytOut), i128(maxSrIn), u32(input.deadlineLedger ?? 0),\n ], signer);\n }\n\n async sellYt(input: {\n ytIn: string | number | bigint;\n minSrOut?: string | number | bigint;\n deadlineLedger?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'sell_yt_exact_in', [\n addr(owner),\n i128(assertPositiveAmount(input.ytIn, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minSrOut ?? 0n, this.network.decimals)),\n u32(input.deadlineLedger ?? 0),\n ], signer);\n }\n\n async addLiquidity(input: {\n ptIn: string | number | bigint;\n srIn: string | number | bigint;\n /** Minimum LP shares accepted. Positive values opt into the new caller-controlled tolerance. */\n minShares?: string | number | bigint;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n const minShares = assertNonNegativeAmount(input.minShares ?? 0n, this.network.decimals);\n const args = [\n addr(owner),\n i128(assertPositiveAmount(input.ptIn, this.network.decimals)),\n i128(assertPositiveAmount(input.srIn, this.network.decimals)),\n ];\n if (await this.supportsLatestLiquidityAbi(owner)) {\n return this.soroban.write(this.contract, 'add_liquidity', [...args, i128(minShares)], signer);\n }\n if (minShares > 0n) {\n throw new SpieldConfigurationError(\n 'This market deployment predates addLiquidity.minShares; use minShares=0 or upgrade the market contract.',\n );\n }\n return this.soroban.write(this.contract, 'add_liquidity', args, signer);\n }\n\n async removeLiquidity(input: {\n shares: string | number | bigint;\n minPtOut?: string | number | bigint;\n minSrOut?: string | number | bigint;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'remove_liquidity', [\n addr(owner),\n i128(assertPositiveAmount(input.shares, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minPtOut ?? 0n, this.network.decimals)),\n i128(assertNonNegativeAmount(input.minSrOut ?? 0n, this.network.decimals)),\n ], signer);\n }\n\n /** Permissionless keep-alive for an LP share entry. */\n async bumpLp(input: { owner?: string; signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const signerOwner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'bump_lp', [addr(input.owner ?? signerOwner)], signer);\n }\n\n private supportsLatestLiquidityAbi(owner: string): Promise<boolean> {\n this.latestLiquidityAbi ??= this.soroban\n .read(this.contract, 'bump_lp', [addr(owner)])\n .then(() => true, () => false);\n return this.latestLiquidityAbi;\n }\n}\n","import { tokenAmount } from './amount';\nimport type { SrMarketClient, SrLpPosition } from './sr-market';\nimport type { StandardizedReturnClient } from './sr';\nimport type { SrTokensClient } from './sr-tokens';\nimport type { SrVaultClient, SrVaultReceipt } from './sr-vault';\nimport type { UserInterest, YieldEngineClient } from './yield-engine';\n\nexport type SrPortfolio = {\n owner: string;\n balances: Awaited<ReturnType<SrTokensClient['getBalances']>>;\n srAsUsdc: ReturnType<typeof tokenAmount>;\n claimableYield: ReturnType<typeof tokenAmount>;\n claimableYieldAsUsdc: ReturnType<typeof tokenAmount>;\n interest: UserInterest;\n lpPosition: SrLpPosition;\n fixedReceipts: SrVaultReceipt[];\n hasPtTrustline: boolean;\n};\n\nexport class SrPortfolioClient {\n constructor(\n private readonly tokens: SrTokensClient,\n private readonly sr: StandardizedReturnClient,\n private readonly yieldEngine: YieldEngineClient,\n private readonly market: SrMarketClient,\n private readonly vault: SrVaultClient,\n private readonly decimals: number,\n ) {}\n\n async getPortfolio(input: { owner: string; maxReceiptScan?: number }): Promise<SrPortfolio> {\n const [balances, rate, claimableYield, interest, lpPosition, fixedReceipts, trustline] = await Promise.all([\n this.tokens.getBalances({ owner: input.owner }),\n this.sr.getExchangeRate(),\n this.yieldEngine.getClaimableInterest({ owner: input.owner }),\n this.yieldEngine.getInterest({ owner: input.owner }),\n this.market.getLpPosition({ owner: input.owner }),\n this.vault.getOwnerReceipts({ owner: input.owner, maxScan: input.maxReceiptScan }),\n this.tokens.getPtTrustline({ owner: input.owner }),\n ]);\n return {\n owner: input.owner,\n balances,\n srAsUsdc: tokenAmount(this.sr.srToUnderlying(balances.sr.raw, rate), 'USDC', this.decimals),\n claimableYield,\n claimableYieldAsUsdc: tokenAmount(this.sr.srToUnderlying(claimableYield.raw, rate), 'USDC', this.decimals),\n interest,\n lpPosition,\n fixedReceipts,\n hasPtTrustline: trustline.ready,\n };\n }\n}\n","import type { BlendStrategyClient } from './blend-strategy';\nimport type { SrMarketClient } from './sr-market';\nimport type { StandardizedReturnClient } from './sr';\nimport type { SrVaultClient } from './sr-vault';\nimport type { YieldEngineClient } from './yield-engine';\n\nexport class SrProtocolClient {\n constructor(\n private readonly sr: StandardizedReturnClient,\n private readonly strategy: BlendStrategyClient,\n private readonly yieldEngine: YieldEngineClient,\n private readonly market: SrMarketClient,\n private readonly vault: SrVaultClient,\n ) {}\n\n async getHealth() {\n const [sr, strategy, yieldEngine, market, vault] = await Promise.all([\n this.sr.getState(),\n this.strategy.getState(),\n this.yieldEngine.getState(),\n this.market.getStats(),\n this.vault.getStats(),\n ]);\n return { sr, strategy, yieldEngine, market, vault };\n }\n\n getSolvency() {\n return this.yieldEngine.getSolvency();\n }\n}\n","import { assertNonNegativeAmount, assertPositiveAmount, tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport type { SpieldSigner } from './signer';\nimport { addr, i128, toBig, u32, type SorobanClient } from './soroban';\nimport type { TokenAmount, TransactionResult } from './types';\nimport { signerAddress } from './internal';\nimport { SpieldValidationError } from './errors';\n\nexport const DEFAULT_ROUTER_SLIPPAGE_BPS = 100;\n\n/**\n * Validate a slippage setting. Called BEFORE any network work so a bad argument fails immediately\n * rather than after a simulation round trip — and so the error is the validation error a caller\n * expects, not whatever the network path happened to throw first.\n */\nconst assertSlippageBps = (bps: number) => {\n if (!Number.isInteger(bps) || bps < 0 || bps > 10_000) {\n throw new SpieldValidationError('slippageBps must be an integer between 0 and 10000.');\n }\n return bps;\n};\n\nconst slippageFloor = (quote: bigint, bps: number) => {\n assertSlippageBps(bps);\n return quote - quote * BigInt(bps) / 10_000n;\n};\n\n/** One-transaction USDC routes that fit against the deployed Blend-backed stack. */\nexport class SrRouterClient {\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n private readonly signer?: SpieldSigner,\n ) {}\n\n private get contract() {\n return this.network.contracts.router;\n }\n\n /**\n * The basis for `minOut`: what the REAL entry point would pay, falling back to the quote.\n *\n * `FINAL_CHECK.md` V2-01 — the market synchronizes SR on every value-moving call, but `quote_*`\n * is a view and cannot. A quote therefore lags, and for a sale it reports MORE than the trade\n * will pay; sizing `minOut` from it can revert the trade on its own slippage bound.\n *\n * Simulation runs the same synchronized code path the submission runs, so its answer is the one\n * that executes. It legitimately returns `null` (unaffordable size, unfillable route, older\n * deployment) — in which case the quote is used exactly as before.\n */\n private async executableBasis(\n owner: string,\n method: string,\n args: Parameters<SorobanClient['simulateAs']>[3],\n quoted: bigint,\n ): Promise<bigint> {\n // A consumer may inject their own client (the test suite does). Treat `simulateAs` as optional\n // rather than assuming it: the quote is a correct, if slightly stale, fallback.\n if (typeof this.soroban.simulateAs !== 'function') return quoted;\n const simulated = await this.soroban.simulateAs(owner, this.contract, method, args);\n return simulated !== null && simulated > 0n ? simulated : quoted;\n }\n\n private async quote(method: string, amount: bigint, symbol: 'PT' | 'YT' | 'USDC'): Promise<TokenAmount> {\n const raw = await this.soroban.read(this.contract, method, [i128(amount)]);\n return tokenAmount(toBig(raw), symbol, this.network.decimals);\n }\n\n quoteBuyPt(input: { usdcIn: string | number | bigint }) {\n return this.quote(\n 'quote_buy_pt_with_usdc',\n assertPositiveAmount(input.usdcIn, this.network.decimals),\n 'PT',\n );\n }\n\n quoteBuyYt(input: { ytOut: string | number | bigint }) {\n return this.quote(\n 'quote_buy_yt_with_usdc',\n assertPositiveAmount(input.ytOut, this.network.decimals),\n 'USDC',\n );\n }\n\n quoteSellPt(input: { ptIn: string | number | bigint }) {\n return this.quote(\n 'quote_sell_pt_for_usdc',\n assertPositiveAmount(input.ptIn, this.network.decimals),\n 'USDC',\n );\n }\n\n quoteSellYt(input: { ytIn: string | number | bigint }) {\n return this.quote(\n 'quote_sell_yt_for_usdc',\n assertPositiveAmount(input.ytIn, this.network.decimals),\n 'USDC',\n );\n }\n\n quoteRedeemPy(input: { amount: string | number | bigint }) {\n return this.quote(\n 'quote_redeem_py_for_usdc',\n assertPositiveAmount(input.amount, this.network.decimals),\n 'USDC',\n );\n }\n\n async quoteClaimYield(input: { owner: string }): Promise<TokenAmount> {\n const raw = await this.soroban.read(this.contract, 'quote_claim_yield', [addr(input.owner)]);\n return tokenAmount(toBig(raw), 'USDC', this.network.decimals);\n }\n\n async buyPt(input: {\n usdcIn: string | number | bigint;\n minPtOut?: string | number | bigint;\n slippageBps?: number;\n deadlineLedger?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n const usdcIn = assertPositiveAmount(input.usdcIn, this.network.decimals);\n assertSlippageBps(input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS);\n const minOut = input.minPtOut === undefined\n ? slippageFloor(\n await this.executableBasis(\n owner,\n 'buy_pt_with_usdc',\n [addr(owner), i128(usdcIn), i128(0n), u32(input.deadlineLedger ?? 0)],\n (await this.quoteBuyPt({ usdcIn })).raw,\n ),\n input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS,\n )\n : assertNonNegativeAmount(input.minPtOut, this.network.decimals);\n if (minOut <= 0n) throw new Error('No PT quote is available for that size.');\n return this.soroban.write(this.contract, 'buy_pt_with_usdc', [\n addr(owner), i128(usdcIn), i128(minOut), u32(input.deadlineLedger ?? 0),\n ], signer);\n }\n\n async sellPt(input: {\n ptIn: string | number | bigint;\n minUsdcOut?: string | number | bigint;\n slippageBps?: number;\n deadlineLedger?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n const ptIn = assertPositiveAmount(input.ptIn, this.network.decimals);\n assertSlippageBps(input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS);\n const minOut = input.minUsdcOut === undefined\n ? slippageFloor(\n await this.executableBasis(\n owner,\n 'sell_pt_for_usdc',\n [addr(owner), i128(ptIn), i128(0n), u32(input.deadlineLedger ?? 0)],\n (await this.quoteSellPt({ ptIn })).raw,\n ),\n input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS,\n )\n : assertNonNegativeAmount(input.minUsdcOut, this.network.decimals);\n return this.soroban.write(this.contract, 'sell_pt_for_usdc', [\n addr(owner), i128(ptIn), i128(minOut), u32(input.deadlineLedger ?? 0),\n ], signer);\n }\n\n async redeemPy(input: {\n amount: string | number | bigint;\n minUsdcOut?: string | number | bigint;\n slippageBps?: number;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n const amount = assertPositiveAmount(input.amount, this.network.decimals);\n assertSlippageBps(input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS);\n const minOut = input.minUsdcOut === undefined\n ? slippageFloor(\n await this.executableBasis(\n owner,\n 'redeem_py_for_usdc',\n [addr(owner), i128(amount), i128(0n)],\n (await this.quoteRedeemPy({ amount })).raw,\n ),\n input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS,\n )\n : assertNonNegativeAmount(input.minUsdcOut, this.network.decimals);\n return this.soroban.write(this.contract, 'redeem_py_for_usdc', [addr(owner), i128(amount), i128(minOut)], signer);\n }\n\n async claimYield(input: {\n minUsdcOut?: string | number | bigint;\n slippageBps?: number;\n signer?: SpieldSigner;\n } = {}): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n const minOut = input.minUsdcOut === undefined\n ? slippageFloor((await this.quoteClaimYield({ owner })).raw, input.slippageBps ?? DEFAULT_ROUTER_SLIPPAGE_BPS)\n : assertNonNegativeAmount(input.minUsdcOut, this.network.decimals);\n return this.soroban.write(this.contract, 'claim_yield_to_usdc', [addr(owner), i128(minOut)], signer);\n }\n}\n","import { tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport { HorizonClient, type PtTrustlineStatus } from './horizon';\nimport type { SpieldSigner } from './signer';\nimport { addr, toBig, type SorobanClient } from './soroban';\nimport type { TokenAmount, TransactionResult } from './types';\nimport { signerAddress } from './internal';\n\nexport type SrTokenKey = 'USDC' | 'SR' | 'PT' | 'YT';\n\nexport class SrTokensClient {\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n private readonly horizon: HorizonClient,\n private readonly signer?: SpieldSigner,\n ) {}\n\n async getBalance(input: { token: SrTokenKey; owner: string }): Promise<TokenAmount> {\n const contracts = this.network.contracts;\n const contract = {\n USDC: contracts.usdc,\n SR: contracts.sr,\n PT: contracts.pt,\n // The yield engine itself implements SEP-41 and is the YT token.\n YT: contracts.yieldEngine,\n }[input.token];\n try {\n const raw = await this.soroban.read(contract, 'balance', [addr(input.owner)]);\n return tokenAmount(toBig(raw), input.token, this.network.decimals);\n } catch {\n // A missing classic PT trustline makes SAC balance reads fail. Treat that as zero.\n return tokenAmount(0n, input.token, this.network.decimals);\n }\n }\n\n async getBalances(input: { owner: string }): Promise<Record<'usdc' | 'sr' | 'pt' | 'yt', TokenAmount>> {\n const [usdc, sr, pt, yt] = await Promise.all([\n this.getBalance({ token: 'USDC', owner: input.owner }),\n this.getBalance({ token: 'SR', owner: input.owner }),\n this.getBalance({ token: 'PT', owner: input.owner }),\n this.getBalance({ token: 'YT', owner: input.owner }),\n ]);\n return { usdc, sr, pt, yt };\n }\n\n getPtTrustline(input: { owner: string }): Promise<PtTrustlineStatus> {\n return this.horizon.getPtTrustline(input.owner);\n }\n\n /** Set up the sole v2 trustline. YT is a contract token and must not get a trustline. */\n async ensurePtTrustline(input: { owner?: string; signer?: SpieldSigner } = {}): Promise<TransactionResult | null> {\n const signer = input.signer ?? this.signer;\n const owner = input.owner ?? await signerAddress(signer);\n return this.horizon.setupPtTrustline(owner, signer);\n }\n}\n","import { assertPositiveAmount, tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport { SpieldValidationError } from './errors';\nimport type { SpieldSigner } from './signer';\nimport { addr, i128, toBig, toNum, u64, type SorobanClient } from './soroban';\nimport type { TokenAmount, TransactionResult } from './types';\nimport { signerAddress } from './internal';\n\nexport type SrFixedRateQuote = {\n input: TokenAmount;\n payout: TokenAmount;\n coupon: TokenAmount;\n rateBps: number;\n ratePct: number;\n};\n\nexport type SrVaultStats = {\n ptInventory: TokenAmount;\n ytInventory: TokenAmount;\n totalLiability: TokenAmount;\n /** USDC banked for open receipts during resumable redemptions. */\n totalCollected: TokenAmount;\n couponCapacity: TokenAmount;\n rateBps: number;\n ratePct: number;\n maturity: number;\n maturityDate: Date;\n openReceipts: number;\n paused: boolean;\n};\n\nexport type SrVaultReceipt = {\n receiptId: number;\n owner: string;\n principal: TokenAmount;\n payout: TokenAmount;\n rateBps: number;\n ratePct: number;\n maturity: number;\n maturityDate: Date;\n open: boolean;\n /** USDC already secured for this receipt during an earlier partial redemption. */\n collected: TokenAmount;\n remaining: TokenAmount;\n};\n\nexport type SrVaultSurplus = {\n sr: TokenAmount;\n yt: TokenAmount;\n usdc: TokenAmount;\n};\n\n/** Fixed-rate USDC vault backed by v2 bearer PT inventory. */\nexport class SrVaultClient {\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n private readonly signer?: SpieldSigner,\n ) {}\n\n private get contract() {\n return this.network.contracts.vault;\n }\n\n async quoteFixedRate(input: { amount: string | number | bigint }): Promise<SrFixedRateQuote> {\n const amount = assertPositiveAmount(input.amount, this.network.decimals);\n const tuple = await this.soroban.read<unknown[]>(this.contract, 'quote', [i128(amount)]);\n const [payoutRaw, couponRaw, rateRaw] = tuple ?? [];\n const rateBps = toNum(rateRaw);\n return {\n input: tokenAmount(amount, 'USDC', this.network.decimals),\n payout: tokenAmount(toBig(payoutRaw), 'USDC', this.network.decimals),\n coupon: tokenAmount(toBig(couponRaw), 'USDC', this.network.decimals),\n rateBps,\n ratePct: rateBps / 100,\n };\n }\n\n async getStats(): Promise<SrVaultStats> {\n const [raw, paused] = await Promise.all([\n this.soroban.read<Record<string, unknown>>(this.contract, 'stats'),\n this.soroban.read<boolean>(this.contract, 'is_paused'),\n ]);\n const maturity = toNum(raw.maturity);\n const rateBps = toNum(raw.rate_bps);\n return {\n ptInventory: tokenAmount(toBig(raw.pt_inventory), 'PT', this.network.decimals),\n ytInventory: tokenAmount(toBig(raw.yt_inventory), 'YT', this.network.decimals),\n totalLiability: tokenAmount(toBig(raw.total_liability), 'USDC', this.network.decimals),\n totalCollected: tokenAmount(toBig(raw.total_collected), 'USDC', this.network.decimals),\n couponCapacity: tokenAmount(toBig(raw.coupon_capacity), 'PT', this.network.decimals),\n rateBps,\n ratePct: rateBps / 100,\n maturity,\n maturityDate: new Date(maturity * 1000),\n openReceipts: toNum(raw.open_receipts),\n paused,\n };\n }\n\n async getReceipt(input: { receiptId: number }): Promise<SrVaultReceipt | null> {\n if (!Number.isSafeInteger(input.receiptId) || input.receiptId < 0) {\n throw new SpieldValidationError('receiptId must be a non-negative safe integer.');\n }\n try {\n const raw = await this.soroban.read<Record<string, unknown>>(this.contract, 'get_receipt', [u64(input.receiptId)]);\n const maturity = toNum(raw.maturity);\n const rateBps = toNum(raw.rate_bps);\n const payout = toBig(raw.payout);\n const collected = toBig(raw.collected);\n return {\n receiptId: input.receiptId,\n owner: String(raw.owner),\n principal: tokenAmount(toBig(raw.principal), 'USDC', this.network.decimals),\n payout: tokenAmount(payout, 'USDC', this.network.decimals),\n rateBps,\n ratePct: rateBps / 100,\n maturity,\n maturityDate: new Date(maturity * 1000),\n open: Boolean(raw.open),\n collected: tokenAmount(collected, 'USDC', this.network.decimals),\n remaining: tokenAmount(payout > collected ? payout - collected : 0n, 'USDC', this.network.decimals),\n };\n } catch {\n return null;\n }\n }\n\n async getOwnerReceipts(input: { owner: string; maxScan?: number }): Promise<SrVaultReceipt[]> {\n const maxScan = input.maxScan ?? 64;\n if (!Number.isSafeInteger(maxScan) || maxScan < 0) {\n throw new SpieldValidationError('maxScan must be a non-negative safe integer.');\n }\n const receipts: SrVaultReceipt[] = [];\n let misses = 0;\n for (let id = 0; id < maxScan && misses < 5; id += 1) {\n const receipt = await this.getReceipt({ receiptId: id });\n if (!receipt) {\n misses += 1;\n } else {\n misses = 0;\n if (receipt.owner === input.owner && receipt.open) receipts.push(receipt);\n }\n }\n return receipts;\n }\n\n async deposit(input: { amount: string | number | bigint; signer?: SpieldSigner }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'deposit', [\n addr(owner), i128(assertPositiveAmount(input.amount, this.network.decimals)),\n ], signer);\n }\n\n redeemReceipt(input: { receiptId: number; signer?: SpieldSigner }): Promise<TransactionResult> {\n if (!Number.isSafeInteger(input.receiptId) || input.receiptId < 0) {\n throw new SpieldValidationError('receiptId must be a non-negative safe integer.');\n }\n return this.soroban.write(this.contract, 'redeem', [u64(input.receiptId)], input.signer ?? this.signer);\n }\n\n /** Remaining USDC owed before a receipt can close. Falls back to receipt data on the old ABI. */\n async getRedeemRemaining(input: { receiptId: number }): Promise<TokenAmount> {\n this.assertReceiptId(input.receiptId);\n try {\n const raw = await this.soroban.read(this.contract, 'redeem_remaining', [u64(input.receiptId)]);\n return tokenAmount(toBig(raw), 'USDC', this.network.decimals);\n } catch {\n const receipt = await this.getReceipt(input);\n return tokenAmount(receipt?.remaining.raw ?? 0n, 'USDC', this.network.decimals);\n }\n }\n\n /** Read surplus SR, YT and USDC that the latest vault ABI can release after expiry. */\n async getSurplus(): Promise<SrVaultSurplus | null> {\n try {\n const tuple = await this.soroban.read<unknown[]>(this.contract, 'surplus');\n const [sr, yt, usdc] = tuple ?? [];\n return {\n sr: tokenAmount(toBig(sr), 'SR', this.network.decimals),\n yt: tokenAmount(toBig(yt), 'YT', this.network.decimals),\n usdc: tokenAmount(toBig(usdc), 'USDC', this.network.decimals),\n };\n } catch {\n return null;\n }\n }\n\n /** Permissionless keep-alive for a long-dated vault receipt. */\n bumpReceipt(input: { receiptId: number; signer?: SpieldSigner }): Promise<TransactionResult> {\n this.assertReceiptId(input.receiptId);\n return this.soroban.write(this.contract, 'bump_receipt', [u64(input.receiptId)], input.signer ?? this.signer);\n }\n\n /** Permissionless claim and reinvestment of the vault's YT yield. */\n harvest(input: { signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n return this.soroban.write(this.contract, 'harvest', [], input.signer ?? this.signer);\n }\n\n private assertReceiptId(receiptId: number) {\n if (!Number.isSafeInteger(receiptId) || receiptId < 0) {\n throw new SpieldValidationError('receiptId must be a non-negative safe integer.');\n }\n }\n}\n","import { assertPositiveAmount, tokenAmount } from './amount';\nimport type { SpieldNetworkConfig } from './config';\nimport type { SpieldSigner } from './signer';\nimport { addr, i128, toBig, toNum, type SorobanClient } from './soroban';\nimport type { TokenAmount, TransactionResult } from './types';\nimport { signerAddress } from './internal';\n\nexport type UserInterest = {\n index: bigint;\n accrued: TokenAmount;\n withdrawn: TokenAmount;\n};\n\nexport type YieldSolvency = {\n held: TokenAmount;\n needed: TokenAmount;\n surplus: TokenAmount;\n solvent: boolean;\n};\n\nexport type YieldState = YieldSolvency & {\n totalPy: TokenAmount;\n totalAccrued: TokenAmount;\n pyIndex: bigint;\n yieldFeeBps: number;\n yieldFeePct: number;\n expiry: number;\n expiryDate: Date;\n expired: boolean;\n paused: boolean;\n};\n\n/** Client for the PT/YT engine. The engine contract itself is the YT token. */\nexport class YieldEngineClient {\n constructor(\n private readonly network: SpieldNetworkConfig,\n private readonly soroban: SorobanClient,\n private readonly signer?: SpieldSigner,\n ) {}\n\n private get contract() {\n return this.network.contracts.yieldEngine;\n }\n\n async getYtBalance(input: { owner: string }): Promise<TokenAmount> {\n const raw = await this.soroban.read(this.contract, 'balance', [addr(input.owner)]);\n return tokenAmount(toBig(raw), 'YT', this.network.decimals);\n }\n\n async getClaimableInterest(input: { owner: string }): Promise<TokenAmount> {\n const raw = await this.soroban.read(this.contract, 'claimable_interest', [addr(input.owner)]);\n return tokenAmount(toBig(raw), 'SR', this.network.decimals);\n }\n\n async getInterest(input: { owner: string }): Promise<UserInterest> {\n const raw = await this.soroban.read<Record<string, unknown>>(this.contract, 'interest_of', [addr(input.owner)]);\n return {\n index: toBig(raw.index),\n accrued: tokenAmount(toBig(raw.accrued), 'SR', this.network.decimals),\n withdrawn: tokenAmount(toBig(raw.withdrawn), 'SR', this.network.decimals),\n };\n }\n\n async getSolvency(): Promise<YieldSolvency> {\n const tuple = await this.soroban.read<unknown[]>(this.contract, 'solvency');\n const [heldRaw, neededRaw, surplusRaw] = tuple ?? [];\n const held = toBig(heldRaw);\n const needed = toBig(neededRaw);\n return {\n held: tokenAmount(held, 'SR', this.network.decimals),\n needed: tokenAmount(needed, 'SR', this.network.decimals),\n surplus: tokenAmount(toBig(surplusRaw), 'SR', this.network.decimals),\n solvent: held >= needed,\n };\n }\n\n async getState(): Promise<YieldState> {\n const [solvency, totalPyRaw, totalAccruedRaw, indexRaw, feeRaw, expiryRaw, expired, paused] = await Promise.all([\n this.getSolvency(),\n this.soroban.read(this.contract, 'total_py'),\n this.soroban.read(this.contract, 'total_accrued'),\n this.soroban.read(this.contract, 'py_index'),\n this.soroban.read(this.contract, 'yield_fee_bps'),\n this.soroban.read(this.contract, 'expiry'),\n this.soroban.read<boolean>(this.contract, 'is_expired'),\n this.soroban.read<boolean>(this.contract, 'is_paused'),\n ]);\n const expiry = toNum(expiryRaw);\n const yieldFeeBps = toNum(feeRaw);\n return {\n ...solvency,\n totalPy: tokenAmount(toBig(totalPyRaw), 'PT/YT', this.network.decimals),\n totalAccrued: tokenAmount(toBig(totalAccruedRaw), 'SR', this.network.decimals),\n pyIndex: toBig(indexRaw),\n yieldFeeBps,\n yieldFeePct: yieldFeeBps / 100,\n expiry,\n expiryDate: new Date(expiry * 1000),\n expired,\n paused,\n };\n }\n\n async mintPy(input: {\n srIn: string | number | bigint;\n receiver?: string;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const from = await signerAddress(signer);\n return this.soroban.write(this.contract, 'mint_py', [\n addr(from),\n addr(input.receiver ?? from),\n i128(assertPositiveAmount(input.srIn, this.network.decimals)),\n ], signer);\n }\n\n async redeemPy(input: {\n amount: string | number | bigint;\n receiver?: string;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const from = await signerAddress(signer);\n return this.soroban.write(this.contract, 'redeem_py', [\n addr(from),\n addr(input.receiver ?? from),\n i128(assertPositiveAmount(input.amount, this.network.decimals)),\n ], signer);\n }\n\n async claimYield(input: { signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'redeem_due_interest', [addr(owner)], signer);\n }\n\n async transferYt(input: {\n to: string;\n amount: string | number | bigint;\n signer?: SpieldSigner;\n }): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const from = await signerAddress(signer);\n return this.soroban.write(this.contract, 'transfer', [\n addr(from),\n addr(input.to),\n i128(assertPositiveAmount(input.amount, this.network.decimals)),\n ], signer);\n }\n\n /** Permissionless expiry-index stamp; only succeeds at or after expiry. */\n stampExpiryIndex(input: { signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n return this.soroban.write(this.contract, 'stamp_expiry_index', [], input.signer ?? this.signer);\n }\n\n /** Keep both a holder's YT balance and interest entries alive. Permissionless on the latest ABI. */\n async bumpHolder(input: { owner?: string; signer?: SpieldSigner } = {}): Promise<TransactionResult> {\n const signer = input.signer ?? this.signer;\n const signerOwner = await signerAddress(signer);\n return this.soroban.write(this.contract, 'bump_holder', [addr(input.owner ?? signerOwner)], signer);\n }\n}\n","import { assertPositiveAmount, tokenAmount } from './amount';\nimport { BlendStrategyClient } from './blend-strategy';\nimport { testnet, type SpieldNetworkConfig } from './config';\nimport { HorizonClient } from './horizon';\nimport type { SpieldSigner } from './signer';\nimport { DEFAULT_SIMULATION_SOURCE, SorobanClient } from './soroban';\nimport { SrMarketClient, YT_MAX_IN_PAD_BPS } from './sr-market';\nimport { SrPortfolioClient } from './sr-portfolio';\nimport { SrProtocolClient } from './sr-protocol';\nimport { SrRouterClient } from './sr-router';\nimport { SCALAR_12, StandardizedReturnClient } from './sr';\nimport { SrTokensClient } from './sr-tokens';\nimport { SrVaultClient } from './sr-vault';\nimport type { SpieldClientOptions, TransactionResult } from './types';\nimport { YieldEngineClient } from './yield-engine';\n\nexport type TwoStepTransactionResult = {\n first?: TransactionResult;\n second: TransactionResult;\n};\n\n/**\n * The Spield protocol client. Every namespace targets the SR-based contracts:\n * USDC wraps into SR, SR splits into PT + YT, and PT trades against SR on the market.\n */\nexport class SpieldClient {\n readonly network: SpieldNetworkConfig;\n /** Wrap USDC into yield-bearing SR shares, and unwrap fully or partially. */\n readonly sr: StandardizedReturnClient;\n /** Blend rate guard, position value, and currently withdrawable liquidity. */\n readonly strategy: BlendStrategyClient;\n /** Mint/redeem PT + YT, read and claim interest, transfer YT. */\n readonly yield: YieldEngineClient;\n /** PT/SR quotes, PT and YT trades, liquidity. */\n readonly market: SrMarketClient;\n /** Fixed-rate quotes, receipts, deposit, redeem, harvest. */\n readonly vault: SrVaultClient;\n /** One-transaction USDC routes for PT, redemption, and yield claims. */\n readonly router: SrRouterClient;\n /** USDC/SR/PT/YT balances and the single required PT trustline. */\n readonly tokens: SrTokensClient;\n /** Wallet-wide balances, interest, LP position, and vault receipts. */\n readonly portfolio: SrPortfolioClient;\n /** Cross-contract health and yield-engine solvency. */\n readonly protocol: SrProtocolClient;\n\n private readonly signer?: SpieldSigner;\n\n constructor(options: SpieldClientOptions = {}) {\n const network = options.network ?? testnet();\n this.network = network;\n this.signer = options.signer;\n\n const soroban = new SorobanClient({\n network,\n signer: options.signer,\n simulationSource: options.simulationSource ?? DEFAULT_SIMULATION_SOURCE,\n confirmationTimeoutMs: options.confirmationTimeoutMs,\n confirmationPollIntervalMs: options.confirmationPollIntervalMs,\n });\n const horizon = new HorizonClient(network);\n\n this.sr = new StandardizedReturnClient(network, soroban, options.signer);\n this.strategy = new BlendStrategyClient(network, soroban);\n this.yield = new YieldEngineClient(network, soroban, options.signer);\n this.market = new SrMarketClient(network, soroban, options.signer);\n this.vault = new SrVaultClient(network, soroban, options.signer);\n this.router = new SrRouterClient(network, soroban, options.signer);\n this.tokens = new SrTokensClient(network, soroban, horizon, options.signer);\n this.portfolio = new SrPortfolioClient(\n this.tokens, this.sr, this.yield, this.market, this.vault, network.decimals,\n );\n this.protocol = new SrProtocolClient(this.sr, this.strategy, this.yield, this.market, this.vault);\n }\n\n /** All-in USDC cost for an exact YT face amount, using the deployed two-step route. */\n async quoteBuyYtFromUsdc(input: { ytOut: string | number | bigint }) {\n const quote = await this.market.quoteBuyYt(input);\n if (!quote.available) return tokenAmount(0n, 'USDC', this.network.decimals);\n const rate = await this.sr.getExchangeRate();\n return tokenAmount(this.sr.srToUnderlying(quote.output.raw, rate), 'USDC', this.network.decimals);\n }\n\n /**\n * Live-safe YT purchase: wrap only the missing SR, then buy YT. The one-call router version exceeds\n * the deployed Blend pool's Soroban budget, so this deliberately uses up to two signatures.\n */\n async buyYtFromUsdc(input: {\n ytOut: string | number | bigint;\n signer?: SpieldSigner;\n onProgress?: (step: 'wrap' | 'buy', index: number, total: number) => void;\n }): Promise<TwoStepTransactionResult> {\n const signer = input.signer ?? this.signer;\n const ytOut = assertPositiveAmount(input.ytOut, this.network.decimals);\n const quote = await this.market.quoteBuyYt({ ytOut });\n if (!quote.available) throw new Error('No YT quote is available for that size.');\n const budget = quote.output.raw + quote.output.raw * YT_MAX_IN_PAD_BPS / 10_000n + 1n;\n const owner = await signer?.getAddress();\n if (!owner) throw new Error('A signer is required for this transaction.');\n const held = (await this.tokens.getBalance({ token: 'SR', owner })).raw;\n let first: TransactionResult | undefined;\n const needsWrap = held < budget;\n const total = needsWrap ? 2 : 1;\n if (needsWrap) {\n const rate = await this.sr.getExchangeRate();\n const missing = budget - held;\n const usdc = (missing * rate + SCALAR_12 - 1n) / SCALAR_12 + 1n;\n input.onProgress?.('wrap', 1, total);\n first = await this.sr.deposit({ amount: usdc, signer });\n }\n input.onProgress?.('buy', total, total);\n const second = await this.market.buyYt({ ytOut, maxSrIn: budget, signer });\n return { first, second };\n }\n\n /**\n * Live-safe YT exit: sell to SR, then unwrap the actual proceeds. The combined router route no\n * longer fits the deployed Blend-backed stack after the SR partial-exit/cap upgrade.\n */\n async sellYtToUsdc(input: {\n ytIn: string | number | bigint;\n signer?: SpieldSigner;\n onProgress?: (step: 'sell' | 'unwrap', index: number, total: number) => void;\n }): Promise<TwoStepTransactionResult> {\n const signer = input.signer ?? this.signer;\n const owner = await signer?.getAddress();\n if (!owner) throw new Error('A signer is required for this transaction.');\n const quote = await this.market.quoteSellYt(input);\n if (!quote.available) throw new Error('No YT sale quote is available for that size.');\n const before = (await this.tokens.getBalance({ token: 'SR', owner })).raw;\n input.onProgress?.('sell', 1, 2);\n const first = await this.market.sellYt({ ytIn: input.ytIn, minSrOut: quote.output.raw * 99n / 100n, signer });\n const after = (await this.tokens.getBalance({ token: 'SR', owner })).raw;\n const proceeds = after - before;\n if (proceeds <= 0n) throw new Error('The YT sale completed but produced no SR to unwrap.');\n input.onProgress?.('unwrap', 2, 2);\n const second = await this.sr.redeem({ shares: proceeds, signer });\n return { first, second };\n }\n}\n","import { SpieldSignerError } from './errors';\n\nexport type SpieldSigner = {\n getAddress(): Promise<string>;\n signTransaction(\n xdr: string,\n opts: { networkPassphrase: string; address: string },\n ): Promise<{ signedTxXdr: string }>;\n};\n\ntype FreighterApi = {\n getAddress?: () => Promise<{ address?: string } | string>;\n signTransaction?: (\n xdr: string,\n opts: { networkPassphrase: string; address: string },\n ) => Promise<{ signedTxXdr?: string } | string>;\n};\n\nexport class FreighterSigner implements SpieldSigner {\n constructor(private readonly api?: FreighterApi) {}\n\n private get freighter(): FreighterApi {\n const injected = this.api ?? (globalThis as { freighterApi?: FreighterApi }).freighterApi;\n if (!injected) throw new SpieldSignerError('Freighter API is not available.');\n return injected;\n }\n\n async getAddress(): Promise<string> {\n const getAddress = this.freighter.getAddress;\n if (!getAddress) throw new SpieldSignerError('Freighter getAddress() is not available.');\n const result = await getAddress();\n const address = typeof result === 'string' ? result : result.address;\n if (!address) throw new SpieldSignerError('Freighter did not return an address.');\n return address;\n }\n\n async signTransaction(\n xdr: string,\n opts: { networkPassphrase: string; address: string },\n ): Promise<{ signedTxXdr: string }> {\n const signTransaction = this.freighter.signTransaction;\n if (!signTransaction) throw new SpieldSignerError('Freighter signTransaction() is not available.');\n const result = await signTransaction(xdr, opts);\n const signedTxXdr = typeof result === 'string' ? result : result.signedTxXdr;\n if (!signedTxXdr) throw new SpieldSignerError('Freighter did not return a signed transaction.');\n return { signedTxXdr };\n }\n}\n\nexport class ManualSigner implements SpieldSigner {\n constructor(\n private readonly address: string,\n private readonly sign: SpieldSigner['signTransaction'],\n ) {}\n\n async getAddress(): Promise<string> {\n return this.address;\n }\n\n async signTransaction(\n xdr: string,\n opts: { networkPassphrase: string; address: string },\n ): Promise<{ signedTxXdr: string }> {\n return this.sign(xdr, opts);\n }\n}\n"],"mappings":"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","names":["BASE_FEE","TransactionBuilder","TransactionBuilder","BASE_FEE","xdr"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@spield/sdk",
3
+ "version": "0.4.0",
4
+ "description": "TypeScript SDK for Spield Protocol fixed-rate yield on Stellar Testnet.",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/Suryashish/spield_sdk.git"
8
+ },
9
+ "homepage": "https://github.com/Suryashish/spield_sdk#readme",
10
+ "bugs": {
11
+ "url": "https://github.com/Suryashish/spield_sdk/issues"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public",
15
+ "registry": "https://registry.npmjs.org/"
16
+ },
17
+ "type": "module",
18
+ "main": "./dist/index.cjs",
19
+ "module": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "types": "./dist/index.d.ts",
24
+ "import": "./dist/index.js",
25
+ "require": "./dist/index.cjs"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "README.md",
31
+ "USAGE.md",
32
+ "CHANGELOG.md",
33
+ "RELEASE.md"
34
+ ],
35
+ "sideEffects": false,
36
+ "scripts": {
37
+ "build": "tsup src/index.ts --format esm,cjs --dts --clean",
38
+ "test": "pnpm run test:unit && pnpm run test:integration",
39
+ "test:unit": "vitest run test/unit test/amount.test.ts test/config.test.ts test/mock-client.test.ts test/validation.test.ts",
40
+ "test:integration": "vitest run test/integration",
41
+ "test:e2e:local": "vitest run test/e2e/local --testTimeout 120000",
42
+ "test:e2e:testnet": "vitest run test/e2e/testnet --testTimeout 120000",
43
+ "test:package": "pnpm run build && node test/package/consumer.mjs",
44
+ "demo": "pnpm --dir examples/sdk-test-app dev",
45
+ "build:demo": "pnpm --dir examples/sdk-test-app run build",
46
+ "test:all": "pnpm run typecheck && pnpm run test && pnpm run build && pnpm run test:package && pnpm run test:e2e:local",
47
+ "typecheck": "tsc --noEmit"
48
+ },
49
+ "keywords": [
50
+ "spield",
51
+ "stellar",
52
+ "soroban",
53
+ "sdk",
54
+ "fixed-rate",
55
+ "yield"
56
+ ],
57
+ "dependencies": {
58
+ "@stellar/stellar-sdk": "^13.1.0"
59
+ },
60
+ "devDependencies": {
61
+ "@types/node": "^22.13.0",
62
+ "tsup": "^8.3.5",
63
+ "typescript": "^5.7.3",
64
+ "vitest": "^2.1.8"
65
+ }
66
+ }