perena-vault-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +396 -0
- package/dist/client/account.d.ts +59 -0
- package/dist/client/account.d.ts.map +1 -0
- package/dist/client/account.js +94 -0
- package/dist/client/account.js.map +1 -0
- package/dist/client/builders/activateCircuitBreaker.d.ts +12 -0
- package/dist/client/builders/activateCircuitBreaker.d.ts.map +1 -0
- package/dist/client/builders/activateCircuitBreaker.js +27 -0
- package/dist/client/builders/activateCircuitBreaker.js.map +1 -0
- package/dist/client/builders/anchorArgs.d.ts +59 -0
- package/dist/client/builders/anchorArgs.d.ts.map +1 -0
- package/dist/client/builders/anchorArgs.js +43 -0
- package/dist/client/builders/anchorArgs.js.map +1 -0
- package/dist/client/builders/args.d.ts +754 -0
- package/dist/client/builders/args.d.ts.map +1 -0
- package/dist/client/builders/args.js +3 -0
- package/dist/client/builders/args.js.map +1 -0
- package/dist/client/builders/base.d.ts +10 -0
- package/dist/client/builders/base.d.ts.map +1 -0
- package/dist/client/builders/base.js +20 -0
- package/dist/client/builders/base.js.map +1 -0
- package/dist/client/builders/cancelJuniorTrancheWithdraw.d.ts +13 -0
- package/dist/client/builders/cancelJuniorTrancheWithdraw.d.ts.map +1 -0
- package/dist/client/builders/cancelJuniorTrancheWithdraw.js +57 -0
- package/dist/client/builders/cancelJuniorTrancheWithdraw.js.map +1 -0
- package/dist/client/builders/crankNav.d.ts +29 -0
- package/dist/client/builders/crankNav.d.ts.map +1 -0
- package/dist/client/builders/crankNav.js +88 -0
- package/dist/client/builders/crankNav.js.map +1 -0
- package/dist/client/builders/crankPerformanceFees.d.ts +19 -0
- package/dist/client/builders/crankPerformanceFees.d.ts.map +1 -0
- package/dist/client/builders/crankPerformanceFees.js +80 -0
- package/dist/client/builders/crankPerformanceFees.js.map +1 -0
- package/dist/client/builders/createAssetHolding.d.ts +13 -0
- package/dist/client/builders/createAssetHolding.d.ts.map +1 -0
- package/dist/client/builders/createAssetHolding.js +47 -0
- package/dist/client/builders/createAssetHolding.js.map +1 -0
- package/dist/client/builders/createTrancheState.d.ts +13 -0
- package/dist/client/builders/createTrancheState.d.ts.map +1 -0
- package/dist/client/builders/createTrancheState.js +57 -0
- package/dist/client/builders/createTrancheState.js.map +1 -0
- package/dist/client/builders/createVault.d.ts +9 -0
- package/dist/client/builders/createVault.d.ts.map +1 -0
- package/dist/client/builders/createVault.js +75 -0
- package/dist/client/builders/createVault.js.map +1 -0
- package/dist/client/builders/disableCircuitBreaker.d.ts +12 -0
- package/dist/client/builders/disableCircuitBreaker.d.ts.map +1 -0
- package/dist/client/builders/disableCircuitBreaker.js +27 -0
- package/dist/client/builders/disableCircuitBreaker.js.map +1 -0
- package/dist/client/builders/executeDeposit.d.ts +15 -0
- package/dist/client/builders/executeDeposit.d.ts.map +1 -0
- package/dist/client/builders/executeDeposit.js +86 -0
- package/dist/client/builders/executeDeposit.js.map +1 -0
- package/dist/client/builders/executeTrancheDeposit.d.ts +16 -0
- package/dist/client/builders/executeTrancheDeposit.d.ts.map +1 -0
- package/dist/client/builders/executeTrancheDeposit.js +84 -0
- package/dist/client/builders/executeTrancheDeposit.js.map +1 -0
- package/dist/client/builders/executeTrancheWithdraw.d.ts +16 -0
- package/dist/client/builders/executeTrancheWithdraw.d.ts.map +1 -0
- package/dist/client/builders/executeTrancheWithdraw.js +83 -0
- package/dist/client/builders/executeTrancheWithdraw.js.map +1 -0
- package/dist/client/builders/executeWithdraw.d.ts +14 -0
- package/dist/client/builders/executeWithdraw.d.ts.map +1 -0
- package/dist/client/builders/executeWithdraw.js +86 -0
- package/dist/client/builders/executeWithdraw.js.map +1 -0
- package/dist/client/builders/feeCollector.d.ts +17 -0
- package/dist/client/builders/feeCollector.d.ts.map +1 -0
- package/dist/client/builders/feeCollector.js +66 -0
- package/dist/client/builders/feeCollector.js.map +1 -0
- package/dist/client/builders/fulfillJuniorTrancheWithdraw.d.ts +14 -0
- package/dist/client/builders/fulfillJuniorTrancheWithdraw.d.ts.map +1 -0
- package/dist/client/builders/fulfillJuniorTrancheWithdraw.js +82 -0
- package/dist/client/builders/fulfillJuniorTrancheWithdraw.js.map +1 -0
- package/dist/client/builders/index.d.ts +31 -0
- package/dist/client/builders/index.d.ts.map +1 -0
- package/dist/client/builders/index.js +47 -0
- package/dist/client/builders/index.js.map +1 -0
- package/dist/client/builders/initializeVaultRoles.d.ts +12 -0
- package/dist/client/builders/initializeVaultRoles.d.ts.map +1 -0
- package/dist/client/builders/initializeVaultRoles.js +37 -0
- package/dist/client/builders/initializeVaultRoles.js.map +1 -0
- package/dist/client/builders/managerRedepositAsset.d.ts +12 -0
- package/dist/client/builders/managerRedepositAsset.d.ts.map +1 -0
- package/dist/client/builders/managerRedepositAsset.js +52 -0
- package/dist/client/builders/managerRedepositAsset.js.map +1 -0
- package/dist/client/builders/managerWithdrawAsset.d.ts +12 -0
- package/dist/client/builders/managerWithdrawAsset.d.ts.map +1 -0
- package/dist/client/builders/managerWithdrawAsset.js +47 -0
- package/dist/client/builders/managerWithdrawAsset.js.map +1 -0
- package/dist/client/builders/protocolInteraction.d.ts +22 -0
- package/dist/client/builders/protocolInteraction.d.ts.map +1 -0
- package/dist/client/builders/protocolInteraction.js +157 -0
- package/dist/client/builders/protocolInteraction.js.map +1 -0
- package/dist/client/builders/removeAssetHolding.d.ts +13 -0
- package/dist/client/builders/removeAssetHolding.d.ts.map +1 -0
- package/dist/client/builders/removeAssetHolding.js +37 -0
- package/dist/client/builders/removeAssetHolding.js.map +1 -0
- package/dist/client/builders/requestJuniorTrancheWithdraw.d.ts +14 -0
- package/dist/client/builders/requestJuniorTrancheWithdraw.d.ts.map +1 -0
- package/dist/client/builders/requestJuniorTrancheWithdraw.js +72 -0
- package/dist/client/builders/requestJuniorTrancheWithdraw.js.map +1 -0
- package/dist/client/builders/setAssetPriceOracle.d.ts +12 -0
- package/dist/client/builders/setAssetPriceOracle.d.ts.map +1 -0
- package/dist/client/builders/setAssetPriceOracle.js +40 -0
- package/dist/client/builders/setAssetPriceOracle.js.map +1 -0
- package/dist/client/builders/setExternalLiquidity.d.ts +12 -0
- package/dist/client/builders/setExternalLiquidity.d.ts.map +1 -0
- package/dist/client/builders/setExternalLiquidity.js +49 -0
- package/dist/client/builders/setExternalLiquidity.js.map +1 -0
- package/dist/client/builders/setProtocolFee.d.ts +12 -0
- package/dist/client/builders/setProtocolFee.d.ts.map +1 -0
- package/dist/client/builders/setProtocolFee.js +37 -0
- package/dist/client/builders/setProtocolFee.js.map +1 -0
- package/dist/client/builders/setVaultConfig.d.ts +12 -0
- package/dist/client/builders/setVaultConfig.d.ts.map +1 -0
- package/dist/client/builders/setVaultConfig.js +54 -0
- package/dist/client/builders/setVaultConfig.js.map +1 -0
- package/dist/client/builders/trancheState.d.ts +28 -0
- package/dist/client/builders/trancheState.d.ts.map +1 -0
- package/dist/client/builders/trancheState.js +75 -0
- package/dist/client/builders/trancheState.js.map +1 -0
- package/dist/client/builders/updateAssetPrice.d.ts +18 -0
- package/dist/client/builders/updateAssetPrice.d.ts.map +1 -0
- package/dist/client/builders/updateAssetPrice.js +50 -0
- package/dist/client/builders/updateAssetPrice.js.map +1 -0
- package/dist/client/builders/updateConsensusOracle.d.ts +20 -0
- package/dist/client/builders/updateConsensusOracle.d.ts.map +1 -0
- package/dist/client/builders/updateConsensusOracle.js +64 -0
- package/dist/client/builders/updateConsensusOracle.js.map +1 -0
- package/dist/client/builders/updateConsensusSigners.d.ts +13 -0
- package/dist/client/builders/updateConsensusSigners.d.ts.map +1 -0
- package/dist/client/builders/updateConsensusSigners.js +38 -0
- package/dist/client/builders/updateConsensusSigners.js.map +1 -0
- package/dist/client/builders/updateTrancheConfig.d.ts +13 -0
- package/dist/client/builders/updateTrancheConfig.d.ts.map +1 -0
- package/dist/client/builders/updateTrancheConfig.js +50 -0
- package/dist/client/builders/updateTrancheConfig.js.map +1 -0
- package/dist/client/builders/vaultReallocation.d.ts +15 -0
- package/dist/client/builders/vaultReallocation.d.ts.map +1 -0
- package/dist/client/builders/vaultReallocation.js +148 -0
- package/dist/client/builders/vaultReallocation.js.map +1 -0
- package/dist/client/client.d.ts +34 -0
- package/dist/client/client.d.ts.map +1 -0
- package/dist/client/client.js +75 -0
- package/dist/client/client.js.map +1 -0
- package/dist/client/index.d.ts +8 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +24 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/pda.d.ts +42 -0
- package/dist/client/pda.d.ts.map +1 -0
- package/dist/client/pda.js +88 -0
- package/dist/client/pda.js.map +1 -0
- package/dist/client/transaction.d.ts +36 -0
- package/dist/client/transaction.d.ts.map +1 -0
- package/dist/client/transaction.js +39 -0
- package/dist/client/transaction.js.map +1 -0
- package/dist/client/types/builders.d.ts +12 -0
- package/dist/client/types/builders.d.ts.map +1 -0
- package/dist/client/types/builders.js +3 -0
- package/dist/client/types/builders.js.map +1 -0
- package/dist/client/types/tx.d.ts +13 -0
- package/dist/client/types/tx.d.ts.map +1 -0
- package/dist/client/types/tx.js +3 -0
- package/dist/client/types/tx.js.map +1 -0
- package/dist/constants.d.ts +45 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +49 -0
- package/dist/constants.js.map +1 -0
- package/dist/env.d.ts +70 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +117 -0
- package/dist/env.js.map +1 -0
- package/dist/idl/index.d.ts +3 -0
- package/dist/idl/index.d.ts.map +1 -0
- package/dist/idl/index.js +6 -0
- package/dist/idl/index.js.map +1 -0
- package/dist/idl/vault.d.ts +9617 -0
- package/dist/idl/vault.d.ts.map +1 -0
- package/dist/idl/vault.js +7917 -0
- package/dist/idl/vault.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/services/consensusOracle/consensusOracleService.d.ts +38 -0
- package/dist/services/consensusOracle/consensusOracleService.d.ts.map +1 -0
- package/dist/services/consensusOracle/consensusOracleService.js +270 -0
- package/dist/services/consensusOracle/consensusOracleService.js.map +1 -0
- package/dist/services/consensusOracle/externalPositions.d.ts +26 -0
- package/dist/services/consensusOracle/externalPositions.d.ts.map +1 -0
- package/dist/services/consensusOracle/externalPositions.js +37 -0
- package/dist/services/consensusOracle/externalPositions.js.map +1 -0
- package/dist/services/consensusOracle/index.d.ts +7 -0
- package/dist/services/consensusOracle/index.d.ts.map +1 -0
- package/dist/services/consensusOracle/index.js +23 -0
- package/dist/services/consensusOracle/index.js.map +1 -0
- package/dist/services/consensusOracle/jupiterBalanceSource.d.ts +34 -0
- package/dist/services/consensusOracle/jupiterBalanceSource.d.ts.map +1 -0
- package/dist/services/consensusOracle/jupiterBalanceSource.js +80 -0
- package/dist/services/consensusOracle/jupiterBalanceSource.js.map +1 -0
- package/dist/services/consensusOracle/jupiterPriceSource.d.ts +25 -0
- package/dist/services/consensusOracle/jupiterPriceSource.d.ts.map +1 -0
- package/dist/services/consensusOracle/jupiterPriceSource.js +63 -0
- package/dist/services/consensusOracle/jupiterPriceSource.js.map +1 -0
- package/dist/services/consensusOracle/mockYieldTracker.d.ts +44 -0
- package/dist/services/consensusOracle/mockYieldTracker.d.ts.map +1 -0
- package/dist/services/consensusOracle/mockYieldTracker.js +107 -0
- package/dist/services/consensusOracle/mockYieldTracker.js.map +1 -0
- package/dist/services/consensusOracle/types.d.ts +180 -0
- package/dist/services/consensusOracle/types.d.ts.map +1 -0
- package/dist/services/consensusOracle/types.js +5 -0
- package/dist/services/consensusOracle/types.js.map +1 -0
- package/dist/services/index.d.ts +4 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +20 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/oracleService.d.ts +72 -0
- package/dist/services/oracleService.d.ts.map +1 -0
- package/dist/services/oracleService.js +93 -0
- package/dist/services/oracleService.js.map +1 -0
- package/dist/services/withdrawalQueueService.d.ts +76 -0
- package/dist/services/withdrawalQueueService.d.ts.map +1 -0
- package/dist/services/withdrawalQueueService.js +138 -0
- package/dist/services/withdrawalQueueService.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +20 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/provider.d.ts +4 -0
- package/dist/utils/provider.d.ts.map +1 -0
- package/dist/utils/provider.js +10 -0
- package/dist/utils/provider.js.map +1 -0
- package/dist/utils/rpc.d.ts +4 -0
- package/dist/utils/rpc.d.ts.map +1 -0
- package/dist/utils/rpc.js +8 -0
- package/dist/utils/rpc.js.map +1 -0
- package/dist/utils/token.d.ts +6 -0
- package/dist/utils/token.d.ts.map +1 -0
- package/dist/utils/token.js +32 -0
- package/dist/utils/token.js.map +1 -0
- package/package.json +50 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory mock of the bankineco yield tracker.
|
|
3
|
+
*
|
|
4
|
+
* Mirrors the method surface of the real HTTP client
|
|
5
|
+
* (`bankineco-services/src/api/yieldApi.ts`) so it can be swapped for the live
|
|
6
|
+
* service without touching {@link ConsensusOracleService}. Each account accrues
|
|
7
|
+
* simple interest at a configured APR over the time its principal is held,
|
|
8
|
+
* re-based at every cashflow — a faithful-enough stand-in for the real
|
|
9
|
+
* segment-based calculation, with an injectable {@link Clock} so accrual is
|
|
10
|
+
* deterministic in tests.
|
|
11
|
+
*
|
|
12
|
+
* All amounts are **UI amounts** (token units), matching the real API.
|
|
13
|
+
*/
|
|
14
|
+
import { type Clock } from "./types";
|
|
15
|
+
import type { YieldAccountSnapshot, YieldTracker } from "./types";
|
|
16
|
+
export interface MockYieldAccountConfig {
|
|
17
|
+
aprBps: number;
|
|
18
|
+
/** Initial principal (UI amount). Defaults to 0. */
|
|
19
|
+
principal?: number;
|
|
20
|
+
/** Accrual start (ms since epoch). Defaults to the clock's current time. */
|
|
21
|
+
startTs?: number;
|
|
22
|
+
}
|
|
23
|
+
export interface MockYieldTrackerOptions {
|
|
24
|
+
accounts?: Record<string, MockYieldAccountConfig>;
|
|
25
|
+
clock?: Clock;
|
|
26
|
+
}
|
|
27
|
+
export declare class MockYieldTracker implements YieldTracker {
|
|
28
|
+
private readonly accounts;
|
|
29
|
+
private readonly clock;
|
|
30
|
+
constructor(opts?: MockYieldTrackerOptions);
|
|
31
|
+
/** Register (or replace) a tracked account. */
|
|
32
|
+
setAccount(name: string, cfg: MockYieldAccountConfig): void;
|
|
33
|
+
private require;
|
|
34
|
+
getYield(accountName: string, start?: Date, end?: Date): Promise<YieldAccountSnapshot>;
|
|
35
|
+
getTotalYield(accountNames: string[], start?: Date, end?: Date): Promise<number>;
|
|
36
|
+
getBalance(accountName: string, atTime?: Date): Promise<number>;
|
|
37
|
+
addCashflow(params: {
|
|
38
|
+
accountName: string;
|
|
39
|
+
amount: number;
|
|
40
|
+
date?: Date;
|
|
41
|
+
cashflowType: "deposit" | "withdraw";
|
|
42
|
+
}): Promise<void>;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=mockYieldTracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockYieldTracker.d.ts","sourceRoot":"","sources":["../../../src/services/consensusOracle/mockYieldTracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAe,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAoBlE,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAClD,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAElB,IAAI,GAAE,uBAA4B;IAY9C,+CAA+C;IAC/C,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,IAAI;IAS3D,OAAO,CAAC,OAAO;IAQT,QAAQ,CACZ,WAAW,EAAE,MAAM,EACnB,KAAK,CAAC,EAAE,IAAI,EACZ,GAAG,CAAC,EAAE,IAAI,GACT,OAAO,CAAC,oBAAoB,CAAC;IA2C1B,aAAa,CACjB,YAAY,EAAE,MAAM,EAAE,EACtB,KAAK,CAAC,EAAE,IAAI,EACZ,GAAG,CAAC,EAAE,IAAI,GACT,OAAO,CAAC,MAAM,CAAC;IASZ,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC;IAK/D,WAAW,CAAC,MAAM,EAAE;QACxB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,CAAC,EAAE,IAAI,CAAC;QACZ,YAAY,EAAE,SAAS,GAAG,UAAU,CAAC;KACtC,GAAG,OAAO,CAAC,IAAI,CAAC;CAWlB"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MockYieldTracker = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* In-memory mock of the bankineco yield tracker.
|
|
6
|
+
*
|
|
7
|
+
* Mirrors the method surface of the real HTTP client
|
|
8
|
+
* (`bankineco-services/src/api/yieldApi.ts`) so it can be swapped for the live
|
|
9
|
+
* service without touching {@link ConsensusOracleService}. Each account accrues
|
|
10
|
+
* simple interest at a configured APR over the time its principal is held,
|
|
11
|
+
* re-based at every cashflow — a faithful-enough stand-in for the real
|
|
12
|
+
* segment-based calculation, with an injectable {@link Clock} so accrual is
|
|
13
|
+
* deterministic in tests.
|
|
14
|
+
*
|
|
15
|
+
* All amounts are **UI amounts** (token units), matching the real API.
|
|
16
|
+
*/
|
|
17
|
+
const types_1 = require("./types");
|
|
18
|
+
const SECONDS_PER_YEAR = 365 * 24 * 60 * 60;
|
|
19
|
+
class MockYieldTracker {
|
|
20
|
+
constructor(opts = {}) {
|
|
21
|
+
this.accounts = new Map();
|
|
22
|
+
this.clock = opts.clock ?? types_1.systemClock;
|
|
23
|
+
for (const [name, cfg] of Object.entries(opts.accounts ?? {})) {
|
|
24
|
+
this.accounts.set(name, {
|
|
25
|
+
aprBps: cfg.aprBps,
|
|
26
|
+
initialPrincipal: cfg.principal ?? 0,
|
|
27
|
+
startTs: cfg.startTs ?? this.clock.now(),
|
|
28
|
+
cashflows: [],
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** Register (or replace) a tracked account. */
|
|
33
|
+
setAccount(name, cfg) {
|
|
34
|
+
this.accounts.set(name, {
|
|
35
|
+
aprBps: cfg.aprBps,
|
|
36
|
+
initialPrincipal: cfg.principal ?? 0,
|
|
37
|
+
startTs: cfg.startTs ?? this.clock.now(),
|
|
38
|
+
cashflows: [],
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
require(name) {
|
|
42
|
+
const state = this.accounts.get(name);
|
|
43
|
+
if (!state) {
|
|
44
|
+
throw new Error(`Unknown yield account "${name}"`);
|
|
45
|
+
}
|
|
46
|
+
return state;
|
|
47
|
+
}
|
|
48
|
+
async getYield(accountName, start, end) {
|
|
49
|
+
const state = this.require(accountName);
|
|
50
|
+
const windowStartMs = Math.max(state.startTs, start ? start.getTime() : state.startTs);
|
|
51
|
+
const windowEndMs = end ? end.getTime() : this.clock.now();
|
|
52
|
+
const apr = state.aprBps / 10000;
|
|
53
|
+
// Principal as of the window start: initial principal plus any cashflows
|
|
54
|
+
// that landed before the window.
|
|
55
|
+
let principal = state.initialPrincipal;
|
|
56
|
+
for (const cf of state.cashflows) {
|
|
57
|
+
if (cf.ts <= windowStartMs)
|
|
58
|
+
principal += cf.amount;
|
|
59
|
+
}
|
|
60
|
+
// Walk the cashflow boundaries inside the window, accruing per segment.
|
|
61
|
+
const boundaries = state.cashflows
|
|
62
|
+
.filter((cf) => cf.ts > windowStartMs && cf.ts < windowEndMs)
|
|
63
|
+
.sort((a, b) => a.ts - b.ts);
|
|
64
|
+
let totalYield = 0;
|
|
65
|
+
let segStart = windowStartMs;
|
|
66
|
+
for (const cf of boundaries) {
|
|
67
|
+
const dtSecs = (cf.ts - segStart) / 1000;
|
|
68
|
+
totalYield += principal * apr * (dtSecs / SECONDS_PER_YEAR);
|
|
69
|
+
principal += cf.amount;
|
|
70
|
+
segStart = cf.ts;
|
|
71
|
+
}
|
|
72
|
+
const tailSecs = Math.max(0, (windowEndMs - segStart) / 1000);
|
|
73
|
+
totalYield += principal * apr * (tailSecs / SECONDS_PER_YEAR);
|
|
74
|
+
return {
|
|
75
|
+
account: accountName,
|
|
76
|
+
totalYield,
|
|
77
|
+
principalAtEnd: principal,
|
|
78
|
+
aprUsed: apr,
|
|
79
|
+
accrualStart: new Date(windowStartMs),
|
|
80
|
+
accrualEnd: new Date(windowEndMs),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
async getTotalYield(accountNames, start, end) {
|
|
84
|
+
let total = 0;
|
|
85
|
+
for (const name of accountNames) {
|
|
86
|
+
const snapshot = await this.getYield(name, start, end);
|
|
87
|
+
total += snapshot.totalYield;
|
|
88
|
+
}
|
|
89
|
+
return total;
|
|
90
|
+
}
|
|
91
|
+
async getBalance(accountName, atTime) {
|
|
92
|
+
const snapshot = await this.getYield(accountName, undefined, atTime);
|
|
93
|
+
return snapshot.principalAtEnd + snapshot.totalYield;
|
|
94
|
+
}
|
|
95
|
+
async addCashflow(params) {
|
|
96
|
+
const state = this.require(params.accountName);
|
|
97
|
+
const signed = params.cashflowType === "deposit"
|
|
98
|
+
? Math.abs(params.amount)
|
|
99
|
+
: -Math.abs(params.amount);
|
|
100
|
+
state.cashflows.push({
|
|
101
|
+
ts: params.date ? params.date.getTime() : this.clock.now(),
|
|
102
|
+
amount: signed,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
exports.MockYieldTracker = MockYieldTracker;
|
|
107
|
+
//# sourceMappingURL=mockYieldTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mockYieldTracker.js","sourceRoot":"","sources":["../../../src/services/consensusOracle/mockYieldTracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared interfaces for the consensus-oracle service.
|
|
3
|
+
*
|
|
4
|
+
* The orchestrator ({@link ConsensusOracleService}) depends only on these
|
|
5
|
+
* interfaces, so it carries no network/RPC/protocol dependencies of its own and
|
|
6
|
+
* can be unit-tested with in-memory fakes. Concrete implementations
|
|
7
|
+
* (Jupiter price/balance feeds, the mock yield tracker, live-LP providers) are
|
|
8
|
+
* injected by the caller.
|
|
9
|
+
*/
|
|
10
|
+
import type { Address } from "@solana/kit";
|
|
11
|
+
/** Supplies USD spot prices for a set of mints. */
|
|
12
|
+
export interface PriceSource {
|
|
13
|
+
/**
|
|
14
|
+
* Fetch USD prices keyed by mint (base58). A mint with no available price is
|
|
15
|
+
* omitted from the result (callers must treat a missing entry as an error).
|
|
16
|
+
*/
|
|
17
|
+
fetchUsdPrices(mints: Address[]): Promise<Record<string, number>>;
|
|
18
|
+
}
|
|
19
|
+
/** Supplies an owner's SPL token balances (raw base units), keyed by mint. */
|
|
20
|
+
export interface WalletBalanceSource {
|
|
21
|
+
fetchBalances(owner: Address): Promise<Record<string, bigint>>;
|
|
22
|
+
}
|
|
23
|
+
/** A balance deployed outside vault-owned token accounts, in the mint's base units. */
|
|
24
|
+
export interface ExternalPosition {
|
|
25
|
+
mint: Address;
|
|
26
|
+
amount: bigint;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* An opaque descriptor for one external position, consumed by whichever
|
|
30
|
+
* provider recognizes its `kind`. Extra protocol-specific fields (e.g. a Kamino
|
|
31
|
+
* vault-state address) ride along as additional keys.
|
|
32
|
+
*/
|
|
33
|
+
export interface ExternalPositionRef {
|
|
34
|
+
kind: string;
|
|
35
|
+
mint: Address;
|
|
36
|
+
[key: string]: unknown;
|
|
37
|
+
}
|
|
38
|
+
export interface ExternalPositionContext {
|
|
39
|
+
vault: Address;
|
|
40
|
+
/** The vault's manager wallet (positions are usually held against it). */
|
|
41
|
+
manager: Address;
|
|
42
|
+
/** Position descriptors gathered from the target config for this vault. */
|
|
43
|
+
refs: ExternalPositionRef[];
|
|
44
|
+
}
|
|
45
|
+
/** Reads live balances deployed into external protocols (Kamino, Marginfi, …). */
|
|
46
|
+
export interface ExternalPositionProvider {
|
|
47
|
+
positionsFor(ctx: ExternalPositionContext): Promise<ExternalPosition[]>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* One account's accrual snapshot. Mirrors the subset of the real yield-tracker
|
|
51
|
+
* `AccountYieldResponse` (see `bankineco-services/src/api/yieldApi.ts`) that the
|
|
52
|
+
* oracle needs. Amounts are **UI amounts** (token units, not base units), as the
|
|
53
|
+
* real service returns; callers convert with `fromUiAmount(decimals)`.
|
|
54
|
+
*/
|
|
55
|
+
export interface YieldAccountSnapshot {
|
|
56
|
+
account: string;
|
|
57
|
+
totalYield: number;
|
|
58
|
+
principalAtEnd: number;
|
|
59
|
+
aprUsed: number;
|
|
60
|
+
accrualStart: Date;
|
|
61
|
+
accrualEnd: Date;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Queries accrued yield for named accounts. Mirrors the method surface of the
|
|
65
|
+
* real HTTP client (`yieldApi.ts`) so a production implementation can be dropped
|
|
66
|
+
* in without touching {@link ConsensusOracleService}.
|
|
67
|
+
*/
|
|
68
|
+
export interface YieldTracker {
|
|
69
|
+
getYield(accountName: string, start?: Date, end?: Date): Promise<YieldAccountSnapshot>;
|
|
70
|
+
/** Sum of `totalYield` (UI amount) across the named accounts. */
|
|
71
|
+
getTotalYield(accountNames: string[], start?: Date, end?: Date): Promise<number>;
|
|
72
|
+
/** Current balance (principal + accrued yield), UI amount. */
|
|
73
|
+
getBalance(accountName: string, atTime?: Date): Promise<number>;
|
|
74
|
+
addCashflow(params: {
|
|
75
|
+
accountName: string;
|
|
76
|
+
amount: number;
|
|
77
|
+
date?: Date;
|
|
78
|
+
cashflowType: "deposit" | "withdraw";
|
|
79
|
+
}): Promise<void>;
|
|
80
|
+
}
|
|
81
|
+
/** Injectable wall clock (ms since epoch). Lets tests pin time deterministically. */
|
|
82
|
+
export interface Clock {
|
|
83
|
+
now(): number;
|
|
84
|
+
}
|
|
85
|
+
export declare const systemClock: Clock;
|
|
86
|
+
/** Per-holding config: which yield accounts and external positions feed it. */
|
|
87
|
+
export interface ConsensusOracleHoldingConfig {
|
|
88
|
+
mint: Address;
|
|
89
|
+
/** Yield-tracker account names whose accrual counts toward this holding. */
|
|
90
|
+
yieldAccountNames?: string[];
|
|
91
|
+
/** External-position descriptors whose balances count toward this holding. */
|
|
92
|
+
externalPositions?: ExternalPositionRef[];
|
|
93
|
+
}
|
|
94
|
+
/** One vault to drive, plus optional per-holding sourcing config. */
|
|
95
|
+
export interface ConsensusOracleTarget {
|
|
96
|
+
vault: Address;
|
|
97
|
+
holdings?: ConsensusOracleHoldingConfig[];
|
|
98
|
+
}
|
|
99
|
+
/** Injected collaborators for {@link ConsensusOracleService}. */
|
|
100
|
+
export interface ConsensusOracleDeps {
|
|
101
|
+
priceSource: PriceSource;
|
|
102
|
+
balanceSource: WalletBalanceSource;
|
|
103
|
+
/** Optional; omitted ⇒ no live-LP balances are folded in. */
|
|
104
|
+
externalPositions?: ExternalPositionProvider;
|
|
105
|
+
/** Optional; omitted ⇒ no yield accrual is folded in. */
|
|
106
|
+
yieldTracker?: YieldTracker;
|
|
107
|
+
clock?: Clock;
|
|
108
|
+
}
|
|
109
|
+
/** Per-holding breakdown of what the service computed (and would/did push). */
|
|
110
|
+
export interface HoldingUpdatePreview {
|
|
111
|
+
holdingIndex: number;
|
|
112
|
+
mint: Address;
|
|
113
|
+
decimals: number;
|
|
114
|
+
usdPrice: number;
|
|
115
|
+
/** Price in the vault's accounting unit, fixed-point (scaled by assetDecimals). */
|
|
116
|
+
price: bigint;
|
|
117
|
+
/** Manager-wallet balance of this mint (base units). */
|
|
118
|
+
walletAmount: bigint;
|
|
119
|
+
/** Summed live-LP positions for this mint (base units). */
|
|
120
|
+
lpAmount: bigint;
|
|
121
|
+
/** Accrued yield attributed to this holding (base units). */
|
|
122
|
+
yieldAmount: bigint;
|
|
123
|
+
/** Total external balance pushed = wallet + lp + yield. */
|
|
124
|
+
externalAmount: bigint;
|
|
125
|
+
}
|
|
126
|
+
export interface VaultOracleResult {
|
|
127
|
+
vault: Address;
|
|
128
|
+
updates: HoldingUpdatePreview[];
|
|
129
|
+
dryRun: boolean;
|
|
130
|
+
/** `update_consensus_oracle` signature (absent on dry runs / no holdings). */
|
|
131
|
+
updateSignature?: string;
|
|
132
|
+
/** `crank_nav` signature (absent on dry runs / no holdings). */
|
|
133
|
+
crankSignature?: string;
|
|
134
|
+
}
|
|
135
|
+
export interface RunOptions {
|
|
136
|
+
/** Compute and return the would-be updates without sending transactions. */
|
|
137
|
+
dryRun?: boolean;
|
|
138
|
+
log?: (msg: string) => void;
|
|
139
|
+
}
|
|
140
|
+
export interface RunSummary {
|
|
141
|
+
total: number;
|
|
142
|
+
failed: number;
|
|
143
|
+
results: VaultOracleResult[];
|
|
144
|
+
failures: {
|
|
145
|
+
vault: Address;
|
|
146
|
+
error: string;
|
|
147
|
+
}[];
|
|
148
|
+
}
|
|
149
|
+
/** Minimal shape of a decoded on-chain holding slot the service relies on. */
|
|
150
|
+
export interface DecodedHolding {
|
|
151
|
+
mint: unknown;
|
|
152
|
+
decimals: number;
|
|
153
|
+
priceOracleType: unknown;
|
|
154
|
+
isBase: unknown;
|
|
155
|
+
}
|
|
156
|
+
/** Minimal shape of a decoded vault account the service relies on. */
|
|
157
|
+
export interface DecodedVault {
|
|
158
|
+
config: {
|
|
159
|
+
assetDecimals: number;
|
|
160
|
+
};
|
|
161
|
+
roles: {
|
|
162
|
+
manager: unknown;
|
|
163
|
+
};
|
|
164
|
+
holdings: readonly DecodedHolding[];
|
|
165
|
+
}
|
|
166
|
+
/** A consensus-priced holding paired with its on-chain slot index. */
|
|
167
|
+
export interface ConsensusHoldingEntry {
|
|
168
|
+
holding: DecodedHolding;
|
|
169
|
+
holdingIndex: number;
|
|
170
|
+
}
|
|
171
|
+
/** Pre-fetched inputs shared across per-holding update construction. */
|
|
172
|
+
export interface VaultPricingInputs {
|
|
173
|
+
assetDecimals: number;
|
|
174
|
+
baseUsd: number;
|
|
175
|
+
usdPrices: Record<string, number>;
|
|
176
|
+
walletBalances: Record<string, bigint>;
|
|
177
|
+
lpByMint: Map<string, bigint>;
|
|
178
|
+
configByMint: Map<string, ConsensusOracleHoldingConfig>;
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/consensusOracle/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/services/consensusOracle/types.ts"],"names":[],"mappings":";;;AAgHa,QAAA,WAAW,GAAU,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./withdrawalQueueService"), exports);
|
|
18
|
+
__exportStar(require("./oracleService"), exports);
|
|
19
|
+
__exportStar(require("./consensusOracle"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2DAAyC;AACzC,kDAAgC;AAChC,oDAAkC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Oracle / pricing updates for a vault.
|
|
3
|
+
*
|
|
4
|
+
* Backend/cron logic shared by the oracle-updater daemon and the
|
|
5
|
+
* `update-asset-price` CLI. Two distinct mechanisms:
|
|
6
|
+
*
|
|
7
|
+
* - **Consensus oracle** (`update_consensus_oracle`): a consensus signer reports
|
|
8
|
+
* per-holding prices + external balances (one or more at a time); the vault
|
|
9
|
+
* NAV is derived from the resulting holdings and settled once quorum is
|
|
10
|
+
* reached. Used for assets whose `price_oracle_type` is `ConsensusOracle`.
|
|
11
|
+
* - **Asset price refresh** (`update_asset_price`): permissionlessly re-prices a
|
|
12
|
+
* holding from its configured Pyth feed or nested-vault account.
|
|
13
|
+
*
|
|
14
|
+
* Price *sourcing* (Pyth/Jupiter feeds) lives in the `oracle-service` package;
|
|
15
|
+
* this service only submits the resulting values on-chain.
|
|
16
|
+
*/
|
|
17
|
+
import { type Address } from "@solana/kit";
|
|
18
|
+
import { Keypair } from "@solana/web3.js";
|
|
19
|
+
import type { VaultClient } from "../client/client";
|
|
20
|
+
type LogFn = (msg: string) => void;
|
|
21
|
+
/** A holding to refresh via `update_asset_price` (Pyth / nested-vault priced). */
|
|
22
|
+
export interface AssetPriceRefreshTarget {
|
|
23
|
+
mint: Address;
|
|
24
|
+
/** Pyth price-update or nested-vault account quoting this live-oracle holding. */
|
|
25
|
+
oracleAccount: Address;
|
|
26
|
+
maxAgeSecs?: bigint;
|
|
27
|
+
}
|
|
28
|
+
export interface AssetRefreshResult {
|
|
29
|
+
mint: Address;
|
|
30
|
+
signature?: string;
|
|
31
|
+
error?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare class OracleService {
|
|
34
|
+
private readonly client;
|
|
35
|
+
constructor(client: VaultClient);
|
|
36
|
+
/**
|
|
37
|
+
* Record consensus price + external balance for one or more holdings, signed
|
|
38
|
+
* by a consensus signer. Holdings are addressed by slot index; set `mint` on an
|
|
39
|
+
* update only to register a new consensus holding (pass `assetMint` too). NAV is
|
|
40
|
+
* NOT settled here — call {@link crankNav} afterward.
|
|
41
|
+
*/
|
|
42
|
+
updateAssetConsensusPrice(signer: Keypair, args: {
|
|
43
|
+
vault: Address;
|
|
44
|
+
updates: {
|
|
45
|
+
holdingIndex: number;
|
|
46
|
+
mint?: Address;
|
|
47
|
+
price: bigint;
|
|
48
|
+
externalAmount: bigint;
|
|
49
|
+
}[];
|
|
50
|
+
assetMint?: Address;
|
|
51
|
+
assetTokenProgram?: Address;
|
|
52
|
+
}, log?: LogFn): Promise<string>;
|
|
53
|
+
/** Settle the vault NAV from its current holdings (permissionless). */
|
|
54
|
+
crankNav(cranker: Keypair, args: {
|
|
55
|
+
vault: Address;
|
|
56
|
+
vaultTrancheState?: Address;
|
|
57
|
+
}, log?: LogFn): Promise<string>;
|
|
58
|
+
/** Re-price one live-oracle holding from its bound Pyth/nested-vault account. */
|
|
59
|
+
refreshAssetPrice(updater: Keypair, args: {
|
|
60
|
+
vault: Address;
|
|
61
|
+
mint: Address;
|
|
62
|
+
oracleAccount: Address;
|
|
63
|
+
maxAgeSecs?: bigint;
|
|
64
|
+
}, log?: LogFn): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Refresh several holdings in sequence. Non-fatal: one failure is recorded
|
|
67
|
+
* and the rest still run. Returns a per-mint result list.
|
|
68
|
+
*/
|
|
69
|
+
refreshAssetPrices(updater: Keypair, vault: Address, targets: AssetPriceRefreshTarget[], log?: LogFn): Promise<AssetRefreshResult[]>;
|
|
70
|
+
}
|
|
71
|
+
export {};
|
|
72
|
+
//# sourceMappingURL=oracleService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracleService.d.ts","sourceRoot":"","sources":["../../src/services/oracleService.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAG1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,KAAK,KAAK,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEnC,kFAAkF;AAClF,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,kFAAkF;IAClF,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,WAAW;IAIhD;;;;;OAKG;IACG,yBAAyB,CAC7B,MAAM,EAAE,OAAO,EACf,IAAI,EAAE;QACJ,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,EAAE;YACP,YAAY,EAAE,MAAM,CAAC;YACrB,IAAI,CAAC,EAAE,OAAO,CAAC;YACf,KAAK,EAAE,MAAM,CAAC;YACd,cAAc,EAAE,MAAM,CAAC;SACxB,EAAE,CAAC;QACJ,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,iBAAiB,CAAC,EAAE,OAAO,CAAC;KAC7B,EACD,GAAG,CAAC,EAAE,KAAK,GACV,OAAO,CAAC,MAAM,CAAC;IAmBlB,uEAAuE;IACjE,QAAQ,CACZ,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,EACrD,GAAG,CAAC,EAAE,KAAK,GACV,OAAO,CAAC,MAAM,CAAC;IAalB,iFAAiF;IAC3E,iBAAiB,CACrB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE;QACJ,KAAK,EAAE,OAAO,CAAC;QACf,IAAI,EAAE,OAAO,CAAC;QACd,aAAa,EAAE,OAAO,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,EACD,GAAG,CAAC,EAAE,KAAK,GACV,OAAO,CAAC,MAAM,CAAC;IAalB;;;OAGG;IACG,kBAAkB,CACtB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,uBAAuB,EAAE,EAClC,GAAG,CAAC,EAAE,KAAK,GACV,OAAO,CAAC,kBAAkB,EAAE,CAAC;CAkBjC"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Oracle / pricing updates for a vault.
|
|
4
|
+
*
|
|
5
|
+
* Backend/cron logic shared by the oracle-updater daemon and the
|
|
6
|
+
* `update-asset-price` CLI. Two distinct mechanisms:
|
|
7
|
+
*
|
|
8
|
+
* - **Consensus oracle** (`update_consensus_oracle`): a consensus signer reports
|
|
9
|
+
* per-holding prices + external balances (one or more at a time); the vault
|
|
10
|
+
* NAV is derived from the resulting holdings and settled once quorum is
|
|
11
|
+
* reached. Used for assets whose `price_oracle_type` is `ConsensusOracle`.
|
|
12
|
+
* - **Asset price refresh** (`update_asset_price`): permissionlessly re-prices a
|
|
13
|
+
* holding from its configured Pyth feed or nested-vault account.
|
|
14
|
+
*
|
|
15
|
+
* Price *sourcing* (Pyth/Jupiter feeds) lives in the `oracle-service` package;
|
|
16
|
+
* this service only submits the resulting values on-chain.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.OracleService = void 0;
|
|
20
|
+
const common_1 = require("common");
|
|
21
|
+
class OracleService {
|
|
22
|
+
constructor(client) {
|
|
23
|
+
this.client = client;
|
|
24
|
+
}
|
|
25
|
+
// ── Consensus oracle pushes ───────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Record consensus price + external balance for one or more holdings, signed
|
|
28
|
+
* by a consensus signer. Holdings are addressed by slot index; set `mint` on an
|
|
29
|
+
* update only to register a new consensus holding (pass `assetMint` too). NAV is
|
|
30
|
+
* NOT settled here — call {@link crankNav} afterward.
|
|
31
|
+
*/
|
|
32
|
+
async updateAssetConsensusPrice(signer, args, log) {
|
|
33
|
+
const plan = await this.client.tx.updateConsensusOracle.getTx({
|
|
34
|
+
signer: (0, common_1.fromWeb3Pk)(signer.publicKey),
|
|
35
|
+
vault: args.vault,
|
|
36
|
+
updates: args.updates,
|
|
37
|
+
assetMint: args.assetMint,
|
|
38
|
+
assetTokenProgram: args.assetTokenProgram,
|
|
39
|
+
});
|
|
40
|
+
const sig = await this.client.sendTransaction(signer, plan);
|
|
41
|
+
log?.(`record consensus assets ${args.vault} (${args.updates
|
|
42
|
+
.map((u) => `#${u.holdingIndex}->${u.price}/${u.externalAmount}`)
|
|
43
|
+
.join(", ")}): ${sig}`);
|
|
44
|
+
return sig;
|
|
45
|
+
}
|
|
46
|
+
// ── Permissionless NAV crank ──────────────────────────────────────────────
|
|
47
|
+
/** Settle the vault NAV from its current holdings (permissionless). */
|
|
48
|
+
async crankNav(cranker, args, log) {
|
|
49
|
+
const plan = await this.client.tx.crankNav.getTx({
|
|
50
|
+
cranker: (0, common_1.fromWeb3Pk)(cranker.publicKey),
|
|
51
|
+
vault: args.vault,
|
|
52
|
+
vaultTrancheState: args.vaultTrancheState,
|
|
53
|
+
});
|
|
54
|
+
const sig = await this.client.sendTransaction(cranker, plan);
|
|
55
|
+
log?.(`crank nav ${args.vault}: ${sig}`);
|
|
56
|
+
return sig;
|
|
57
|
+
}
|
|
58
|
+
// ── Permissionless asset-price refresh ────────────────────────────────────
|
|
59
|
+
/** Re-price one live-oracle holding from its bound Pyth/nested-vault account. */
|
|
60
|
+
async refreshAssetPrice(updater, args, log) {
|
|
61
|
+
const plan = await this.client.tx.updateAssetPrice.getTx({
|
|
62
|
+
updater: (0, common_1.fromWeb3Pk)(updater.publicKey),
|
|
63
|
+
vault: args.vault,
|
|
64
|
+
mint: args.mint,
|
|
65
|
+
oracleAccount: args.oracleAccount,
|
|
66
|
+
maxAgeSecs: args.maxAgeSecs,
|
|
67
|
+
});
|
|
68
|
+
const sig = await this.client.sendTransaction(updater, plan);
|
|
69
|
+
log?.(`refresh asset price ${args.mint}: ${sig}`);
|
|
70
|
+
return sig;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Refresh several holdings in sequence. Non-fatal: one failure is recorded
|
|
74
|
+
* and the rest still run. Returns a per-mint result list.
|
|
75
|
+
*/
|
|
76
|
+
async refreshAssetPrices(updater, vault, targets, log) {
|
|
77
|
+
const results = [];
|
|
78
|
+
for (const target of targets) {
|
|
79
|
+
try {
|
|
80
|
+
const signature = await this.refreshAssetPrice(updater, { vault, ...target }, log);
|
|
81
|
+
results.push({ mint: target.mint, signature });
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
const error = err instanceof Error ? err.message : String(err);
|
|
85
|
+
log?.(`FAILED refresh ${target.mint}: ${error}`);
|
|
86
|
+
results.push({ mint: target.mint, error });
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return results;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.OracleService = OracleService;
|
|
93
|
+
//# sourceMappingURL=oracleService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oracleService.js","sourceRoot":"","sources":["../../src/services/oracleService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Junior-tranche withdrawal-queue fulfillment.
|
|
3
|
+
*
|
|
4
|
+
* Backend/cron logic — kept out of scripts so the fulfiller daemon, a Lambda,
|
|
5
|
+
* and the `fulfill-junior-withdraw` CLI can all share one implementation.
|
|
6
|
+
*
|
|
7
|
+
* A request is recorded on-chain as a `VaultWithdrawalQueue` PDA that escrows
|
|
8
|
+
* junior shares (`input_mint`) and pays out the vault asset (`output_mint`)
|
|
9
|
+
* once its lockup elapses. The program permits fulfillment when
|
|
10
|
+
* `now >= request.expiry_ts` (where `expiry_ts = request_ts + lockup`), so this
|
|
11
|
+
* service discovers queues, filters the ones whose lockup has elapsed, and
|
|
12
|
+
* submits `fulfill_junior_tranche_withdraw` for each.
|
|
13
|
+
*
|
|
14
|
+
* The queue account itself carries both mints, so fulfillment needs no extra
|
|
15
|
+
* lookups — no dependency on the (separately-maintained) tranche-state IDL.
|
|
16
|
+
*/
|
|
17
|
+
import { type Address } from "@solana/kit";
|
|
18
|
+
import { Keypair } from "@solana/web3.js";
|
|
19
|
+
import type { VaultClient } from "../client/client";
|
|
20
|
+
/** Decoded, JS-friendly view of a `VaultWithdrawalQueue` account. */
|
|
21
|
+
export interface WithdrawalQueueSnapshot {
|
|
22
|
+
pda: Address;
|
|
23
|
+
vault: Address;
|
|
24
|
+
owner: Address;
|
|
25
|
+
/** Rent payer for the queue PDA; refunded on fulfillment/cancel. */
|
|
26
|
+
payer: Address;
|
|
27
|
+
queueId: number;
|
|
28
|
+
/** Token escrowed in the queue (junior shares). */
|
|
29
|
+
inputMint: Address;
|
|
30
|
+
/** Token paid out on fulfillment (vault asset). */
|
|
31
|
+
outputMint: Address;
|
|
32
|
+
inputAmount: bigint;
|
|
33
|
+
requestTs: number;
|
|
34
|
+
/** Lockup expiry — fulfillable once on-chain time reaches this. */
|
|
35
|
+
expiryTs: number;
|
|
36
|
+
}
|
|
37
|
+
export interface FulfillSummary {
|
|
38
|
+
fulfilled: number;
|
|
39
|
+
skippedNotDue: number;
|
|
40
|
+
failed: number;
|
|
41
|
+
signatures: string[];
|
|
42
|
+
}
|
|
43
|
+
type LogFn = (msg: string) => void;
|
|
44
|
+
export declare class WithdrawalQueueService {
|
|
45
|
+
private readonly client;
|
|
46
|
+
constructor(client: VaultClient);
|
|
47
|
+
/** Current unix time in seconds (override in tests). */
|
|
48
|
+
private now;
|
|
49
|
+
/** All withdrawal-queue accounts owned by the vault program. */
|
|
50
|
+
fetchAllQueues(): Promise<WithdrawalQueueSnapshot[]>;
|
|
51
|
+
/** Withdrawal queues for a single vault. */
|
|
52
|
+
fetchQueuesForVault(vault: Address): Promise<WithdrawalQueueSnapshot[]>;
|
|
53
|
+
/** Fetch a single queue snapshot by owner/queueId for a vault. */
|
|
54
|
+
fetchQueue(vault: Address, owner: Address, queueId: number): Promise<WithdrawalQueueSnapshot>;
|
|
55
|
+
/** True once the queue's lockup has elapsed and it can be fulfilled. */
|
|
56
|
+
isDue(queue: WithdrawalQueueSnapshot, now?: number): boolean;
|
|
57
|
+
/** Seconds until the queue becomes fulfillable (0 if already due). */
|
|
58
|
+
secondsUntilDue(queue: WithdrawalQueueSnapshot, now?: number): number;
|
|
59
|
+
getDueQueues(queues: WithdrawalQueueSnapshot[], now?: number): WithdrawalQueueSnapshot[];
|
|
60
|
+
/**
|
|
61
|
+
* Fulfill a single queued junior withdrawal. `signer` pays fees and, if
|
|
62
|
+
* needed, initializes the owner's output ATA.
|
|
63
|
+
*/
|
|
64
|
+
fulfill(signer: Keypair, queue: WithdrawalQueueSnapshot): Promise<string>;
|
|
65
|
+
/**
|
|
66
|
+
* Fulfill every due queue, optionally scoped to a single vault. Non-fatal:
|
|
67
|
+
* a failure on one queue is logged and the rest still run.
|
|
68
|
+
*/
|
|
69
|
+
fulfillAllDue(signer: Keypair, opts?: {
|
|
70
|
+
vault?: Address;
|
|
71
|
+
log?: LogFn;
|
|
72
|
+
}): Promise<FulfillSummary>;
|
|
73
|
+
private toSnapshot;
|
|
74
|
+
}
|
|
75
|
+
export {};
|
|
76
|
+
//# sourceMappingURL=withdrawalQueueService.d.ts.map
|