@waterx/sdk 4.3.1 → 4.3.3
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/.claude/skills/waterx-sdk-integration/SKILL.md +219 -0
- package/README.md +177 -10
- package/SKILLS.md +34 -0
- package/dist/cjs/src/generated/waterx_rule/waterx_rule.d.ts +140 -7
- package/dist/cjs/src/generated/waterx_rule/waterx_rule.js +163 -8
- package/dist/cjs/src/oracle/aggregate.d.ts +8 -4
- package/dist/cjs/src/oracle/aggregate.js +74 -29
- package/dist/cjs/src/oracle/config.d.ts +3 -2
- package/dist/cjs/src/oracle/index.d.ts +2 -2
- package/dist/cjs/src/oracle/index.js +10 -5
- package/dist/cjs/src/oracle/price-update-rule.d.ts +10 -2
- package/dist/cjs/src/oracle/rules/pyth-lazer-rule.d.ts +25 -7
- package/dist/cjs/src/oracle/rules/pyth-lazer-rule.js +41 -17
- package/dist/cjs/src/oracle/rules/waterx-rule.d.ts +136 -47
- package/dist/cjs/src/oracle/rules/waterx-rule.js +450 -114
- package/dist/cjs/src/perp/client.d.ts +10 -8
- package/dist/cjs/src/perp/index.d.ts +2 -2
- package/dist/cjs/src/perp/index.js +10 -2
- package/dist/cjs/src/unified-client.d.ts +1 -1
- package/dist/src/generated/waterx_rule/waterx_rule.d.ts +140 -7
- package/dist/src/generated/waterx_rule/waterx_rule.js +151 -7
- package/dist/src/oracle/aggregate.d.ts +8 -4
- package/dist/src/oracle/aggregate.js +75 -30
- package/dist/src/oracle/config.d.ts +3 -2
- package/dist/src/oracle/index.d.ts +2 -2
- package/dist/src/oracle/index.js +8 -6
- package/dist/src/oracle/price-update-rule.d.ts +10 -2
- package/dist/src/oracle/rules/pyth-lazer-rule.d.ts +25 -7
- package/dist/src/oracle/rules/pyth-lazer-rule.js +41 -17
- package/dist/src/oracle/rules/waterx-rule.d.ts +136 -47
- package/dist/src/oracle/rules/waterx-rule.js +447 -114
- package/dist/src/perp/client.d.ts +10 -8
- package/dist/src/perp/index.d.ts +2 -2
- package/dist/src/perp/index.js +7 -1
- package/dist/src/unified-client.d.ts +1 -1
- package/package.json +8 -2
|
@@ -32,10 +32,11 @@ export interface CreateClientOptions extends LoadConfigOptions {
|
|
|
32
32
|
* and a `pythApiKey` (Lazer is auth-first); Lazer infra lives in the
|
|
33
33
|
* source's own `LAZER_INFRA` table.
|
|
34
34
|
* - `'waterx_rule'` — the first-party WaterX quote-center (Nautilus-TEE,
|
|
35
|
-
* ed25519-signed
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
35
|
+
* ed25519-signed prices): one signed Merkle LEAF per ticker, verified AND
|
|
36
|
+
* fed by a single `collect_single_with_proof` per collector (falling back to
|
|
37
|
+
* one whole-batch envelope + `collect_batch_latest` against a quote-center
|
|
38
|
+
* with no leaf route). No credential and no per-update fee; needs
|
|
39
|
+
* `packages.waterx_rule` with feeds. Quote-center infra lives in the source's own `WATERX_INFRA`
|
|
39
40
|
* table; endpoint/transport overridable via
|
|
40
41
|
* {@link CreateClientOptions.waterxEndpoint} /
|
|
41
42
|
* {@link CreateClientOptions.waterxFetch} — the browser-CORS proxy hook,
|
|
@@ -72,15 +73,16 @@ export interface CreateClientOptions extends LoadConfigOptions {
|
|
|
72
73
|
* Quote-center base URL for `oracleSource: 'waterx_rule'` — overrides the
|
|
73
74
|
* source's own per-network `WATERX_INFRA` default.
|
|
74
75
|
*
|
|
75
|
-
* This is the one source a BROWSER fetches itself (the signed
|
|
76
|
-
*
|
|
76
|
+
* This is the one source a BROWSER fetches itself (the signed price is pulled
|
|
77
|
+
* from the page), so it is bound by the quote-center deployment's CORS
|
|
77
78
|
* allowlist. A front end whose origin is not allowed — or one that must route
|
|
78
79
|
* egress through its own backend — points this at a same-origin proxy that
|
|
79
|
-
* forwards `GET /v1/quotes/
|
|
80
|
+
* forwards `GET /v1/quotes/leaves` (and `GET /v1/quotes/update`, the fallback
|
|
81
|
+
* route). Unused by the Pyth sources.
|
|
80
82
|
*
|
|
81
83
|
* An absolute URL. Any base PATH is preserved (`joinEndpointPath`), so
|
|
82
84
|
* `https://app.example/api/quote-center` fetches
|
|
83
|
-
* `https://app.example/api/quote-center/v1/quotes/
|
|
85
|
+
* `https://app.example/api/quote-center/v1/quotes/leaves` — a proxy route
|
|
84
86
|
* survives instead of being rewritten to the origin root.
|
|
85
87
|
*/
|
|
86
88
|
waterxEndpoint?: string;
|
|
@@ -13,8 +13,8 @@ export type { EstLiqPriceViewOpts } from "./liq-view.ts";
|
|
|
13
13
|
export * from "./user/index.ts";
|
|
14
14
|
export * from "./tx-builders.ts";
|
|
15
15
|
export * from "./fetch.ts";
|
|
16
|
-
export { FetchPolicyError, LazerApiKeyMissingError, OracleFeeSourceUnavailableError, OracleSourceNotImplementedError, PythCache, aggregateTicker, aggregateTickerWithConstant, aggregateTickerWithPyth, ORACLE_SOURCES, buildPythPriceUpdateCalls, fetchPriceFeedsUpdateData, isOracleSource, parseOracleSourceList, pythCoreHermesEndpoint, pythProHermesEndpoint, refreshOraclePrices, resolveHermesReadEndpoint, updatePythPrices, waterxEnvelopeOf, waterxQuoteCenterEndpoint, } from "../oracle/index.ts";
|
|
17
|
-
export type { FetchPolicy, OracleFeeSource, OracleSource, UpdateDataProvider, } from "../oracle/index.ts";
|
|
16
|
+
export { FetchPolicyError, LazerApiKeyMissingError, OracleFeeSourceUnavailableError, OracleSourceNotImplementedError, PythCache, aggregateTicker, aggregateTickerWithConstant, aggregateTickerWithPyth, ORACLE_SOURCES, buildPythPriceUpdateCalls, fetchPriceFeedsUpdateData, isOracleSource, parseOracleSourceList, pythCoreHermesEndpoint, pythProHermesEndpoint, refreshOraclePrices, resolveHermesReadEndpoint, updatePythPrices, waterxEnvelopeOf, waterxLeavesOf, parseSignedLeaves, MERKLE_ROOT_INTENT, waterxQuoteCenterEndpoint, } from "../oracle/index.ts";
|
|
17
|
+
export type { FetchPolicy, OracleFeeSource, OracleSource, UpdateDataProvider, WaterxBatchItem, WaterxEnvelopePayload, WaterxLeafPayload, WaterxSignedEnvelope, WaterxSignedLeaf, WaterxUpdatePayload, } from "../oracle/index.ts";
|
|
18
18
|
export { fetchDepositVaa, fetchVaa, listBridgeWithdrawalVaas, listVaasByEmitter, padEvmEmitter, toWormholescanEmitter, vaaBase64ToBytes, vaaBase64ToHex, vaaBytesToBase64, waitForVaa, } from "../account/funding/wormhole.ts";
|
|
19
19
|
export type { VaaListItem, VaaResponse, WormholescanOptions } from "../account/funding/wormhole.ts";
|
|
20
20
|
export { AccountData as AccountDataBcs, GlobalConfigData as GlobalConfigDataBcs, MarketData as MarketDataBcs, OrderData as OrderDataBcs, PoolData as PoolDataBcs, PositionData as PositionDataBcs, RedeemRequestData as RedeemRequestDataBcs, TokenPoolData as TokenPoolDataBcs, } from "../generated/waterx_perp_view/view.ts";
|
|
@@ -37,8 +37,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
37
37
|
})();
|
|
38
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
39
|
exports.getCollateralAssets = exports.getMarketTickers = exports.TOKEN_DECIMALS = exports.COLLATERAL_DECIMALS = exports.WLP_DECIMALS = exports.SUI_DECIMALS = exports.MS_PER_YEAR = exports.MS_PER_HOUR = exports.MS_PER_MINUTE = exports.STAKING_PERM_ALL = exports.STAKING_PERM_CLAIM_REWARD = exports.STAKING_PERM_REDEEM_STAKE = exports.STAKING_PERM_DEPOSIT_STAKE = exports.PERM_WITHDRAW_COLLATERAL = exports.PERM_REDEEM_WLP = exports.PERM_PLACE_ORDER = exports.PERM_OPEN_POSITION = exports.PERM_MINT_WLP = exports.PERM_INCREASE_POSITION = exports.PERM_DEPOSIT_COLLATERAL = exports.PERM_DECREASE_POSITION = exports.PERM_CLOSE_POSITION = exports.PERM_CANCEL_ORDER = exports.PERM_ALL_TRADING = exports.PERM_ALL = exports.ORDER_TAG_WILDCARD = exports.ORDER_STOP_SELL = exports.ORDER_STOP_BUY = exports.ORDER_LIMIT_SELL = exports.ORDER_LIMIT_BUY = exports.FLOAT_SCALE = exports.DRY_RUN_SENDER = exports.DOUBLE_SCALE = exports.BPS_SCALE = exports.ACTION_WITHDRAW_COLLATERAL = exports.ACTION_UPDATE_ORDER = exports.ACTION_PLACE_ORDER = exports.ACTION_OPEN_POSITION = exports.ACTION_LIQUIDATE = exports.ACTION_INCREASE_POSITION = exports.ACTION_DEPOSIT_COLLATERAL = exports.ACTION_DECREASE_POSITION = exports.ACTION_CLOSE_POSITION = exports.ACTION_CANCEL_PRE_ORDER = exports.ACTION_CANCEL_ORDER = exports.ACTION_ADD_PRE_ORDER = exports.loadConfig = exports.clearConfigCache = exports.WORMHOLE_DEFAULTS = exports.PerpClient = void 0;
|
|
40
|
-
exports.
|
|
41
|
-
exports.withdrawalQueueCalls = exports.nativeCustodyCalls = exports.referralCalls = exports.pythSponsorRuleCalls = exports.pythRuleCalls = exports.oracleCalls = exports.stakingCalls = exports.wxaAccountCalls = exports.viewCalls = exports.lpPoolCalls = exports.tradingCalls = exports.MarketConfigBcs = exports.MarketBcs = exports.OrderBcs = exports.PositionBcs = exports.TokenPoolDataBcs = exports.RedeemRequestDataBcs = exports.PositionDataBcs = exports.PoolDataBcs = exports.OrderDataBcs = exports.MarketDataBcs = exports.GlobalConfigDataBcs = exports.AccountDataBcs = exports.waitForVaa = exports.vaaBytesToBase64 = exports.vaaBase64ToHex = exports.vaaBase64ToBytes = exports.toWormholescanEmitter = exports.padEvmEmitter = exports.listVaasByEmitter = exports.listBridgeWithdrawalVaas = exports.fetchVaa = void 0;
|
|
40
|
+
exports.parseSignedLeaves = exports.waterxLeavesOf = exports.waterxEnvelopeOf = exports.updatePythPrices = exports.resolveHermesReadEndpoint = exports.refreshOraclePrices = exports.pythProHermesEndpoint = exports.pythCoreHermesEndpoint = exports.parseOracleSourceList = exports.isOracleSource = exports.fetchPriceFeedsUpdateData = exports.buildPythPriceUpdateCalls = exports.ORACLE_SOURCES = exports.aggregateTickerWithPyth = exports.aggregateTickerWithConstant = exports.aggregateTicker = exports.PythCache = exports.OracleSourceNotImplementedError = exports.OracleFeeSourceUnavailableError = exports.LazerApiKeyMissingError = exports.FetchPolicyError = exports.calcEstLiqPriceRawFromView = exports.formatFundingInterval = exports.rawPrice = exports.decodeFundingIndexDelta = exports.calcWlpRedeemOut = exports.calcWlpPrice = exports.calcWlpMintOut = exports.calcWlpIncentiveApy = exports.calcViewEstLiqFeesUsd = exports.calcUnrealizedPnl = exports.calcTotalTradingFeeRate = exports.calcTokenUtilizationBps = exports.calcRealLiqNetCostUsd = exports.calcPositionBorrowFee = exports.calcNotional = exports.calcMaxReducibleCollateralUsd = exports.calcLeverage = exports.calcImpactFeeRate = exports.calcFundingRate = exports.calcFundingFeeUsd = exports.calcFee = exports.calcEstLiqPriceRaw = exports.calcEstLiqPrice = exports.calcEffectiveCollateralUsd = exports.calcDynamicFeeBps = exports.calcBorrowRateAccrual = exports.calcBorrowRate = exports.annualizeFundingRate = exports.annualizedApyFromRatio = void 0;
|
|
41
|
+
exports.withdrawalQueueCalls = exports.nativeCustodyCalls = exports.referralCalls = exports.pythSponsorRuleCalls = exports.pythRuleCalls = exports.oracleCalls = exports.stakingCalls = exports.wxaAccountCalls = exports.viewCalls = exports.lpPoolCalls = exports.tradingCalls = exports.MarketConfigBcs = exports.MarketBcs = exports.OrderBcs = exports.PositionBcs = exports.TokenPoolDataBcs = exports.RedeemRequestDataBcs = exports.PositionDataBcs = exports.PoolDataBcs = exports.OrderDataBcs = exports.MarketDataBcs = exports.GlobalConfigDataBcs = exports.AccountDataBcs = exports.waitForVaa = exports.vaaBytesToBase64 = exports.vaaBase64ToHex = exports.vaaBase64ToBytes = exports.toWormholescanEmitter = exports.padEvmEmitter = exports.listVaasByEmitter = exports.listBridgeWithdrawalVaas = exports.fetchVaa = exports.fetchDepositVaa = exports.waterxQuoteCenterEndpoint = exports.MERKLE_ROOT_INTENT = void 0;
|
|
42
42
|
// ======== Core ========
|
|
43
43
|
var client_ts_1 = require("./client.js");
|
|
44
44
|
Object.defineProperty(exports, "PerpClient", { enumerable: true, get: function () { return client_ts_1.PerpClient; } });
|
|
@@ -155,6 +155,14 @@ Object.defineProperty(exports, "refreshOraclePrices", { enumerable: true, get: f
|
|
|
155
155
|
Object.defineProperty(exports, "resolveHermesReadEndpoint", { enumerable: true, get: function () { return index_ts_1.resolveHermesReadEndpoint; } });
|
|
156
156
|
Object.defineProperty(exports, "updatePythPrices", { enumerable: true, get: function () { return index_ts_1.updatePythPrices; } });
|
|
157
157
|
Object.defineProperty(exports, "waterxEnvelopeOf", { enumerable: true, get: function () { return index_ts_1.waterxEnvelopeOf; } });
|
|
158
|
+
// Leaves are the DEFAULT waterx wire shape, so their accessor + parser belong
|
|
159
|
+
// on the same surface as `waterxEnvelopeOf` (and on the root, which re-exports
|
|
160
|
+
// this file). A prefetch cache written against the envelope-only surface would
|
|
161
|
+
// otherwise get `null` from its only accessor on the normal path and have to
|
|
162
|
+
// discover `@waterx/sdk/oracle` to fix it.
|
|
163
|
+
Object.defineProperty(exports, "waterxLeavesOf", { enumerable: true, get: function () { return index_ts_1.waterxLeavesOf; } });
|
|
164
|
+
Object.defineProperty(exports, "parseSignedLeaves", { enumerable: true, get: function () { return index_ts_1.parseSignedLeaves; } });
|
|
165
|
+
Object.defineProperty(exports, "MERKLE_ROOT_INTENT", { enumerable: true, get: function () { return index_ts_1.MERKLE_ROOT_INTENT; } });
|
|
158
166
|
Object.defineProperty(exports, "waterxQuoteCenterEndpoint", { enumerable: true, get: function () { return index_ts_1.waterxQuoteCenterEndpoint; } });
|
|
159
167
|
// ======== Wormhole / Wormholescan utilities (credit bridge) ========
|
|
160
168
|
var wormhole_ts_1 = require("../account/funding/wormhole.js");
|
|
@@ -406,7 +406,7 @@ export interface ClientCreateOptions {
|
|
|
406
406
|
* the quote-center deployment's CORS allowlist: a front end whose origin is
|
|
407
407
|
* not allowed points this at its own same-origin proxy. An absolute URL whose
|
|
408
408
|
* base PATH is preserved — `https://app.example/api/quote-center` fetches
|
|
409
|
-
* `…/api/quote-center/v1/quotes/
|
|
409
|
+
* `…/api/quote-center/v1/quotes/leaves`. Unused by the Pyth sources.
|
|
410
410
|
*/
|
|
411
411
|
waterxEndpoint?: string;
|
|
412
412
|
/**
|
|
@@ -70,6 +70,11 @@ export declare const BatchPricePayload: MoveStruct<{
|
|
|
70
70
|
length: number;
|
|
71
71
|
}, string>;
|
|
72
72
|
}, "@waterx/rule::waterx_rule::BatchPricePayload">;
|
|
73
|
+
export declare const MerkleRoot: MoveStruct<{
|
|
74
|
+
root: import("@mysten/sui/bcs").BcsType<number[], Iterable<number> & {
|
|
75
|
+
length: number;
|
|
76
|
+
}, string>;
|
|
77
|
+
}, "@waterx/rule::waterx_rule::MerkleRoot">;
|
|
73
78
|
export declare const FeedConfig: MoveStruct<{
|
|
74
79
|
ticker: import("@mysten/sui/bcs").BcsType<string, string, "string">;
|
|
75
80
|
sources: import("@mysten/sui/bcs").BcsType<string[], Iterable<string | number | bigint> & {
|
|
@@ -214,17 +219,82 @@ export interface CollectBatchLatestOptions {
|
|
|
214
219
|
* and so aborts on any stale item, this path runs alongside Pyth/Supra. To let
|
|
215
220
|
* those cover a lagging TEE — the blast-radius bound in the GCP ADR — a
|
|
216
221
|
* _freshness_ miss ABSTAINS (records `none`, which `aggregator::remove_outliers`
|
|
217
|
-
* drops before the `weight_threshold` fail-closed check)
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
+
* drops before the `weight_threshold` fail-closed check), and so does a _replayed_
|
|
223
|
+
* signed timestamp (the chain already accepted that snapshot — the on-chain price
|
|
224
|
+
* is at least as fresh, and two concurrent keeper PTBs sharing one envelope must
|
|
225
|
+
* not kill each other). A _config/integrity_ mismatch (source / ticker / method /
|
|
226
|
+
* confidence / deviation) still ABORTS: an enclave whose signed payload disagrees
|
|
227
|
+
* with the on-chain feed config is a red flag, not a liveness blip. Bad signature,
|
|
228
|
+
* malformed batch, and a future timestamp always abort.
|
|
222
229
|
*
|
|
223
230
|
* Every gate is identical to `feed_batch_item_latest`; only the abort-vs-abstain
|
|
224
|
-
* disposition of the
|
|
225
|
-
* collector rather than a fresh single-rule one.
|
|
231
|
+
* disposition of the freshness + replay gates differs, and the sink is the
|
|
232
|
+
* caller's collector rather than a fresh single-rule one.
|
|
226
233
|
*/
|
|
227
234
|
export declare function collectBatchLatest(options: CollectBatchLatestOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
235
|
+
export interface FeedSingleWithProofArguments {
|
|
236
|
+
oracleObj: RawTransactionArgument<string>;
|
|
237
|
+
config: RawTransactionArgument<string>;
|
|
238
|
+
enclaveConfig: RawTransactionArgument<string>;
|
|
239
|
+
enclave: RawTransactionArgument<string>;
|
|
240
|
+
timestampMs: RawTransactionArgument<number | bigint>;
|
|
241
|
+
item: TransactionArgument;
|
|
242
|
+
proof: RawTransactionArgument<Array<Array<number>>>;
|
|
243
|
+
sig: RawTransactionArgument<Array<number>>;
|
|
244
|
+
}
|
|
245
|
+
export interface FeedSingleWithProofOptions {
|
|
246
|
+
package?: string;
|
|
247
|
+
arguments: FeedSingleWithProofArguments | [
|
|
248
|
+
oracleObj: RawTransactionArgument<string>,
|
|
249
|
+
config: RawTransactionArgument<string>,
|
|
250
|
+
enclaveConfig: RawTransactionArgument<string>,
|
|
251
|
+
enclave: RawTransactionArgument<string>,
|
|
252
|
+
timestampMs: RawTransactionArgument<number | bigint>,
|
|
253
|
+
item: TransactionArgument,
|
|
254
|
+
proof: RawTransactionArgument<Array<Array<number>>>,
|
|
255
|
+
sig: RawTransactionArgument<Array<number>>
|
|
256
|
+
];
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Streaming per-symbol sibling of `feed_batch_latest`. Verifies ONE enclave
|
|
260
|
+
* signature over a Merkle `root`, checks `item` is a leaf of that root via
|
|
261
|
+
* `proof`, then runs the identical per-item gates + `oracle::aggregate`. Use for a
|
|
262
|
+
* WaterxRule-only aggregator; for a Pyth-coexisting aggregator use
|
|
263
|
+
* `collect_single_with_proof`.
|
|
264
|
+
*/
|
|
265
|
+
export declare function feedSingleWithProof(options: FeedSingleWithProofOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
266
|
+
export interface CollectSingleWithProofArguments {
|
|
267
|
+
collector: TransactionArgument;
|
|
268
|
+
config: RawTransactionArgument<string>;
|
|
269
|
+
enclaveConfig: RawTransactionArgument<string>;
|
|
270
|
+
enclave: RawTransactionArgument<string>;
|
|
271
|
+
timestampMs: RawTransactionArgument<number | bigint>;
|
|
272
|
+
item: TransactionArgument;
|
|
273
|
+
proof: RawTransactionArgument<Array<Array<number>>>;
|
|
274
|
+
sig: RawTransactionArgument<Array<number>>;
|
|
275
|
+
}
|
|
276
|
+
export interface CollectSingleWithProofOptions {
|
|
277
|
+
package?: string;
|
|
278
|
+
arguments: CollectSingleWithProofArguments | [
|
|
279
|
+
collector: TransactionArgument,
|
|
280
|
+
config: RawTransactionArgument<string>,
|
|
281
|
+
enclaveConfig: RawTransactionArgument<string>,
|
|
282
|
+
enclave: RawTransactionArgument<string>,
|
|
283
|
+
timestampMs: RawTransactionArgument<number | bigint>,
|
|
284
|
+
item: TransactionArgument,
|
|
285
|
+
proof: RawTransactionArgument<Array<Array<number>>>,
|
|
286
|
+
sig: RawTransactionArgument<Array<number>>
|
|
287
|
+
];
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Collect-only sibling of `feed_single_with_proof` for the dual-rule latest path
|
|
291
|
+
* (WaterX alongside Pyth on one aggregator), mirroring `collect_batch_latest`:
|
|
292
|
+
* verifies root + proof, feeds the leaf into the caller's `PriceCollector` WITHOUT
|
|
293
|
+
* calling `oracle::aggregate`. Abort vs abstain matches `collect_batch_latest`
|
|
294
|
+
* exactly — a config/integrity mismatch aborts, a freshness miss abstains so Pyth
|
|
295
|
+
* can cover a lagging TEE.
|
|
296
|
+
*/
|
|
297
|
+
export declare function collectSingleWithProof(options: CollectSingleWithProofOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
228
298
|
export interface QuoteForTimestampArguments {
|
|
229
299
|
config: RawTransactionArgument<string>;
|
|
230
300
|
enclaveConfig: RawTransactionArgument<string>;
|
|
@@ -421,6 +491,27 @@ export interface BatchPriceIntentOptions {
|
|
|
421
491
|
];
|
|
422
492
|
}
|
|
423
493
|
export declare function batchPriceIntent(options?: BatchPriceIntentOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
494
|
+
export interface MerkleRootIntentOptions {
|
|
495
|
+
package?: string;
|
|
496
|
+
arguments?: [
|
|
497
|
+
];
|
|
498
|
+
}
|
|
499
|
+
export declare function merkleRootIntent(options?: MerkleRootIntentOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
500
|
+
export interface LeafHashOfArguments {
|
|
501
|
+
item: TransactionArgument;
|
|
502
|
+
}
|
|
503
|
+
export interface LeafHashOfOptions {
|
|
504
|
+
package?: string;
|
|
505
|
+
arguments: LeafHashOfArguments | [
|
|
506
|
+
item: TransactionArgument
|
|
507
|
+
];
|
|
508
|
+
}
|
|
509
|
+
/**
|
|
510
|
+
* The keccak256 leaf hash for `item` — `keccak256(0x00 || BCS(item))`. Exposed so
|
|
511
|
+
* the off-chain builder / SDK can be pinned against the on-chain encoding in a
|
|
512
|
+
* cross-implementation golden test.
|
|
513
|
+
*/
|
|
514
|
+
export declare function leafHashOf(options: LeafHashOfOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
424
515
|
export interface MaxBatchSizeOptions {
|
|
425
516
|
package?: string;
|
|
426
517
|
arguments?: [
|
|
@@ -717,6 +808,48 @@ export interface SourceGataUsdtPerpWsOptions {
|
|
|
717
808
|
];
|
|
718
809
|
}
|
|
719
810
|
export declare function sourceGataUsdtPerpWs(options?: SourceGataUsdtPerpWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
811
|
+
export interface SourceBybitSpotWsOptions {
|
|
812
|
+
package?: string;
|
|
813
|
+
arguments?: [
|
|
814
|
+
];
|
|
815
|
+
}
|
|
816
|
+
export declare function sourceBybitSpotWs(options?: SourceBybitSpotWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
817
|
+
export interface SourceXstockEquityRestOptions {
|
|
818
|
+
package?: string;
|
|
819
|
+
arguments?: [
|
|
820
|
+
];
|
|
821
|
+
}
|
|
822
|
+
export declare function sourceXstockEquityRest(options?: SourceXstockEquityRestOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
823
|
+
export interface SourceOkxSpotWsOptions {
|
|
824
|
+
package?: string;
|
|
825
|
+
arguments?: [
|
|
826
|
+
];
|
|
827
|
+
}
|
|
828
|
+
export declare function sourceOkxSpotWs(options?: SourceOkxSpotWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
829
|
+
export interface SourceHyperliquidPerpWsOptions {
|
|
830
|
+
package?: string;
|
|
831
|
+
arguments?: [
|
|
832
|
+
];
|
|
833
|
+
}
|
|
834
|
+
export declare function sourceHyperliquidPerpWs(options?: SourceHyperliquidPerpWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
835
|
+
export interface SourceGateioSpotWsOptions {
|
|
836
|
+
package?: string;
|
|
837
|
+
arguments?: [
|
|
838
|
+
];
|
|
839
|
+
}
|
|
840
|
+
export declare function sourceGateioSpotWs(options?: SourceGateioSpotWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
841
|
+
export interface SourceKrakenSpotWsOptions {
|
|
842
|
+
package?: string;
|
|
843
|
+
arguments?: [
|
|
844
|
+
];
|
|
845
|
+
}
|
|
846
|
+
export declare function sourceKrakenSpotWs(options?: SourceKrakenSpotWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
847
|
+
export interface SourcePythLazerWsOptions {
|
|
848
|
+
package?: string;
|
|
849
|
+
arguments?: [
|
|
850
|
+
];
|
|
851
|
+
}
|
|
852
|
+
export declare function sourcePythLazerWs(options?: SourcePythLazerWsOptions): (tx: Transaction) => import("@mysten/sui/transactions").TransactionResult;
|
|
720
853
|
export interface MethodDirectOptions {
|
|
721
854
|
package?: string;
|
|
722
855
|
arguments?: [
|
|
@@ -41,6 +41,9 @@ export const BatchPriceItem = new MoveStruct({ name: `${$moduleName}::BatchPrice
|
|
|
41
41
|
export const BatchPricePayload = new MoveStruct({ name: `${$moduleName}::BatchPricePayload`, fields: {
|
|
42
42
|
items: bcs.vector(BatchPriceItem)
|
|
43
43
|
} });
|
|
44
|
+
export const MerkleRoot = new MoveStruct({ name: `${$moduleName}::MerkleRoot`, fields: {
|
|
45
|
+
root: bcs.vector(bcs.u8())
|
|
46
|
+
} });
|
|
44
47
|
export const FeedConfig = new MoveStruct({ name: `${$moduleName}::FeedConfig`, fields: {
|
|
45
48
|
ticker: bcs.string(),
|
|
46
49
|
sources: bcs.vector(bcs.u64()),
|
|
@@ -126,15 +129,17 @@ export function feedBatchLatest(options) {
|
|
|
126
129
|
* and so aborts on any stale item, this path runs alongside Pyth/Supra. To let
|
|
127
130
|
* those cover a lagging TEE — the blast-radius bound in the GCP ADR — a
|
|
128
131
|
* _freshness_ miss ABSTAINS (records `none`, which `aggregator::remove_outliers`
|
|
129
|
-
* drops before the `weight_threshold` fail-closed check)
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
*
|
|
133
|
-
*
|
|
132
|
+
* drops before the `weight_threshold` fail-closed check), and so does a _replayed_
|
|
133
|
+
* signed timestamp (the chain already accepted that snapshot — the on-chain price
|
|
134
|
+
* is at least as fresh, and two concurrent keeper PTBs sharing one envelope must
|
|
135
|
+
* not kill each other). A _config/integrity_ mismatch (source / ticker / method /
|
|
136
|
+
* confidence / deviation) still ABORTS: an enclave whose signed payload disagrees
|
|
137
|
+
* with the on-chain feed config is a red flag, not a liveness blip. Bad signature,
|
|
138
|
+
* malformed batch, and a future timestamp always abort.
|
|
134
139
|
*
|
|
135
140
|
* Every gate is identical to `feed_batch_item_latest`; only the abort-vs-abstain
|
|
136
|
-
* disposition of the
|
|
137
|
-
* collector rather than a fresh single-rule one.
|
|
141
|
+
* disposition of the freshness + replay gates differs, and the sink is the
|
|
142
|
+
* caller's collector rather than a fresh single-rule one.
|
|
138
143
|
*/
|
|
139
144
|
export function collectBatchLatest(options) {
|
|
140
145
|
const packageAddress = options.package ?? '@waterx/rule';
|
|
@@ -156,6 +161,63 @@ export function collectBatchLatest(options) {
|
|
|
156
161
|
arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
|
|
157
162
|
});
|
|
158
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Streaming per-symbol sibling of `feed_batch_latest`. Verifies ONE enclave
|
|
166
|
+
* signature over a Merkle `root`, checks `item` is a leaf of that root via
|
|
167
|
+
* `proof`, then runs the identical per-item gates + `oracle::aggregate`. Use for a
|
|
168
|
+
* WaterxRule-only aggregator; for a Pyth-coexisting aggregator use
|
|
169
|
+
* `collect_single_with_proof`.
|
|
170
|
+
*/
|
|
171
|
+
export function feedSingleWithProof(options) {
|
|
172
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
173
|
+
const argumentsTypes = [
|
|
174
|
+
null,
|
|
175
|
+
null,
|
|
176
|
+
'0x2::clock::Clock',
|
|
177
|
+
null,
|
|
178
|
+
null,
|
|
179
|
+
'u64',
|
|
180
|
+
null,
|
|
181
|
+
'vector<vector<u8>>',
|
|
182
|
+
'vector<u8>'
|
|
183
|
+
];
|
|
184
|
+
const parameterNames = ["oracleObj", "config", "enclaveConfig", "enclave", "timestampMs", "item", "proof", "sig"];
|
|
185
|
+
return (tx) => tx.moveCall({
|
|
186
|
+
package: packageAddress,
|
|
187
|
+
module: 'waterx_rule',
|
|
188
|
+
function: 'feed_single_with_proof',
|
|
189
|
+
arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Collect-only sibling of `feed_single_with_proof` for the dual-rule latest path
|
|
194
|
+
* (WaterX alongside Pyth on one aggregator), mirroring `collect_batch_latest`:
|
|
195
|
+
* verifies root + proof, feeds the leaf into the caller's `PriceCollector` WITHOUT
|
|
196
|
+
* calling `oracle::aggregate`. Abort vs abstain matches `collect_batch_latest`
|
|
197
|
+
* exactly — a config/integrity mismatch aborts, a freshness miss abstains so Pyth
|
|
198
|
+
* can cover a lagging TEE.
|
|
199
|
+
*/
|
|
200
|
+
export function collectSingleWithProof(options) {
|
|
201
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
202
|
+
const argumentsTypes = [
|
|
203
|
+
null,
|
|
204
|
+
null,
|
|
205
|
+
'0x2::clock::Clock',
|
|
206
|
+
null,
|
|
207
|
+
null,
|
|
208
|
+
'u64',
|
|
209
|
+
null,
|
|
210
|
+
'vector<vector<u8>>',
|
|
211
|
+
'vector<u8>'
|
|
212
|
+
];
|
|
213
|
+
const parameterNames = ["collector", "config", "enclaveConfig", "enclave", "timestampMs", "item", "proof", "sig"];
|
|
214
|
+
return (tx) => tx.moveCall({
|
|
215
|
+
package: packageAddress,
|
|
216
|
+
module: 'waterx_rule',
|
|
217
|
+
function: 'collect_single_with_proof',
|
|
218
|
+
arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
|
|
219
|
+
});
|
|
220
|
+
}
|
|
159
221
|
/**
|
|
160
222
|
* Verifies a historical quote without touching `waterx_oracle`.
|
|
161
223
|
*
|
|
@@ -347,6 +409,32 @@ export function batchPriceIntent(options = {}) {
|
|
|
347
409
|
function: 'batch_price_intent',
|
|
348
410
|
});
|
|
349
411
|
}
|
|
412
|
+
export function merkleRootIntent(options = {}) {
|
|
413
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
414
|
+
return (tx) => tx.moveCall({
|
|
415
|
+
package: packageAddress,
|
|
416
|
+
module: 'waterx_rule',
|
|
417
|
+
function: 'merkle_root_intent',
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* The keccak256 leaf hash for `item` — `keccak256(0x00 || BCS(item))`. Exposed so
|
|
422
|
+
* the off-chain builder / SDK can be pinned against the on-chain encoding in a
|
|
423
|
+
* cross-implementation golden test.
|
|
424
|
+
*/
|
|
425
|
+
export function leafHashOf(options) {
|
|
426
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
427
|
+
const argumentsTypes = [
|
|
428
|
+
null
|
|
429
|
+
];
|
|
430
|
+
const parameterNames = ["item"];
|
|
431
|
+
return (tx) => tx.moveCall({
|
|
432
|
+
package: packageAddress,
|
|
433
|
+
module: 'waterx_rule',
|
|
434
|
+
function: 'leaf_hash_of',
|
|
435
|
+
arguments: normalizeMoveArguments(options.arguments, argumentsTypes, parameterNames),
|
|
436
|
+
});
|
|
437
|
+
}
|
|
350
438
|
export function maxBatchSize(options = {}) {
|
|
351
439
|
const packageAddress = options.package ?? '@waterx/rule';
|
|
352
440
|
return (tx) => tx.moveCall({
|
|
@@ -733,6 +821,62 @@ export function sourceGataUsdtPerpWs(options = {}) {
|
|
|
733
821
|
function: 'source_gata_usdt_perp_ws',
|
|
734
822
|
});
|
|
735
823
|
}
|
|
824
|
+
export function sourceBybitSpotWs(options = {}) {
|
|
825
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
826
|
+
return (tx) => tx.moveCall({
|
|
827
|
+
package: packageAddress,
|
|
828
|
+
module: 'waterx_rule',
|
|
829
|
+
function: 'source_bybit_spot_ws',
|
|
830
|
+
});
|
|
831
|
+
}
|
|
832
|
+
export function sourceXstockEquityRest(options = {}) {
|
|
833
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
834
|
+
return (tx) => tx.moveCall({
|
|
835
|
+
package: packageAddress,
|
|
836
|
+
module: 'waterx_rule',
|
|
837
|
+
function: 'source_xstock_equity_rest',
|
|
838
|
+
});
|
|
839
|
+
}
|
|
840
|
+
export function sourceOkxSpotWs(options = {}) {
|
|
841
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
842
|
+
return (tx) => tx.moveCall({
|
|
843
|
+
package: packageAddress,
|
|
844
|
+
module: 'waterx_rule',
|
|
845
|
+
function: 'source_okx_spot_ws',
|
|
846
|
+
});
|
|
847
|
+
}
|
|
848
|
+
export function sourceHyperliquidPerpWs(options = {}) {
|
|
849
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
850
|
+
return (tx) => tx.moveCall({
|
|
851
|
+
package: packageAddress,
|
|
852
|
+
module: 'waterx_rule',
|
|
853
|
+
function: 'source_hyperliquid_perp_ws',
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
export function sourceGateioSpotWs(options = {}) {
|
|
857
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
858
|
+
return (tx) => tx.moveCall({
|
|
859
|
+
package: packageAddress,
|
|
860
|
+
module: 'waterx_rule',
|
|
861
|
+
function: 'source_gateio_spot_ws',
|
|
862
|
+
});
|
|
863
|
+
}
|
|
864
|
+
export function sourceKrakenSpotWs(options = {}) {
|
|
865
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
866
|
+
return (tx) => tx.moveCall({
|
|
867
|
+
package: packageAddress,
|
|
868
|
+
module: 'waterx_rule',
|
|
869
|
+
function: 'source_kraken_spot_ws',
|
|
870
|
+
});
|
|
871
|
+
}
|
|
872
|
+
export function sourcePythLazerWs(options = {}) {
|
|
873
|
+
const packageAddress = options.package ?? '@waterx/rule';
|
|
874
|
+
return (tx) => tx.moveCall({
|
|
875
|
+
package: packageAddress,
|
|
876
|
+
module: 'waterx_rule',
|
|
877
|
+
function: 'source_pyth_lazer_ws',
|
|
878
|
+
});
|
|
879
|
+
}
|
|
736
880
|
export function methodDirect(options = {}) {
|
|
737
881
|
const packageAddress = options.package ?? '@waterx/rule';
|
|
738
882
|
return (tx) => tx.moveCall({
|
|
@@ -26,7 +26,7 @@ import type { Transaction, TransactionArgument } from "@mysten/sui/transactions"
|
|
|
26
26
|
import type { OracleHost } from "./host.ts";
|
|
27
27
|
import type { OracleSource, PriceUpdateRule, UpdateDataProvider } from "./price-update-rule.ts";
|
|
28
28
|
import { type OracleFeeSource, type PythCache } from "./pyth.ts";
|
|
29
|
-
import { type WaterxSignedEnvelope } from "./rules/waterx-rule.ts";
|
|
29
|
+
import { type WaterxSignedEnvelope, type WaterxSignedLeaf } from "./rules/waterx-rule.ts";
|
|
30
30
|
/**
|
|
31
31
|
* Aggregate one ticker's price into the shared `Oracle`: build a collector, feed
|
|
32
32
|
* every rule the ticker is configured for, then `aggregate`.
|
|
@@ -38,9 +38,10 @@ import { type WaterxSignedEnvelope } from "./rules/waterx-rule.ts";
|
|
|
38
38
|
* if it is stale — it never aborts — so the call stays mandatory while
|
|
39
39
|
* `pyth_rule` remains in the ticker's on-chain weighted set
|
|
40
40
|
* (`EMissingPriceSource` requires every weighted rule to appear).
|
|
41
|
-
* - **Lazer** — fed when `lazerUpdate` is supplied: the verified
|
|
42
|
-
*
|
|
43
|
-
* (
|
|
41
|
+
* - **Lazer** — fed when `lazerUpdate` is supplied: the verified update this
|
|
42
|
+
* PTB's lazer update leg produced with the network's verify entry
|
|
43
|
+
* (`update_v2::Update` on mainnet, `update::Update` on testnet — see
|
|
44
|
+
* `PythLazerRule.buildUpdateCalls`). If the ticker's aggregator does
|
|
44
45
|
* not (yet) weight `PythLazerRule`, the contribution is silently dropped
|
|
45
46
|
* on-chain — feeding ahead of the weight migration is harmless.
|
|
46
47
|
* - **Supra** — fed alongside Pyth/Lazer when supra is enabled + wired
|
|
@@ -56,6 +57,9 @@ export declare function aggregateTicker(tx: Transaction, host: OracleHost, args:
|
|
|
56
57
|
ticker: string;
|
|
57
58
|
priceInfoObjectId?: string;
|
|
58
59
|
lazerUpdate?: TransactionArgument;
|
|
60
|
+
/** This ticker's signed Merkle leaf — the default waterx shape. */
|
|
61
|
+
waterxLeaf?: WaterxSignedLeaf;
|
|
62
|
+
/** Batch envelope covering this ticker — the fallback waterx shape. */
|
|
59
63
|
waterxEnvelope?: WaterxSignedEnvelope;
|
|
60
64
|
}): void;
|
|
61
65
|
/**
|