@varla/sdk 1.10.4 → 1.10.6
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 +87 -0
- package/dist/actions/index.d.ts +1 -0
- package/dist/actions/index.d.ts.map +1 -1
- package/dist/actions/index.js +1 -0
- package/dist/actions/oracle.d.ts +127 -0
- package/dist/actions/oracle.d.ts.map +1 -1
- package/dist/actions/oracle.js +214 -0
- package/dist/actions/rbac.d.ts +11 -0
- package/dist/actions/rbac.d.ts.map +1 -1
- package/dist/actions/rbac.js +14 -0
- package/dist/actions/utils.d.ts +9 -0
- package/dist/actions/utils.d.ts.map +1 -0
- package/dist/actions/utils.js +12 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -209,6 +209,93 @@ import { formatUnitsSafe } from "@varla/sdk/format";
|
|
|
209
209
|
const ids = await views.readOracleRegistry({ oracle: c.oracle, client });
|
|
210
210
|
```
|
|
211
211
|
|
|
212
|
+
### Write actions (simulate-first)
|
|
213
|
+
|
|
214
|
+
The SDK intentionally uses a **simulate-first** pattern:
|
|
215
|
+
|
|
216
|
+
1. build a transaction request via `publicClient.simulateContract`
|
|
217
|
+
2. submit it via `walletClient.writeContract`
|
|
218
|
+
|
|
219
|
+
```ts
|
|
220
|
+
import * as actions from "@varla/sdk/actions";
|
|
221
|
+
|
|
222
|
+
const sim = await actions.prepareCoreBorrow({
|
|
223
|
+
publicClient,
|
|
224
|
+
coreAddress: c.core.address,
|
|
225
|
+
account: wallet.account.address,
|
|
226
|
+
amount: 1_000_000n,
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const hash = await actions.sendTx({ walletClient, request: sim.request });
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Oracle seeding (plan → prepare → execute)
|
|
233
|
+
|
|
234
|
+
The SDK provides **idempotent seeding planners** for VarlaOracle configuration.
|
|
235
|
+
This is useful for both backends and UIs:
|
|
236
|
+
|
|
237
|
+
- `planOracleSeed(...)` produces a “diff plan” (what still needs to be configured)
|
|
238
|
+
- `prepareOracleSeedPlan(...)` converts the plan into `simulateContract` requests
|
|
239
|
+
- `executeOracleSeedPlan(...)` submits the prepared requests sequentially (no retries/polling)
|
|
240
|
+
|
|
241
|
+
#### Node convenience: seed from JSON files
|
|
242
|
+
|
|
243
|
+
The JSON shapes mirror `scripts/examples/*.json`:
|
|
244
|
+
|
|
245
|
+
```ts
|
|
246
|
+
import * as actions from "@varla/sdk/actions";
|
|
247
|
+
|
|
248
|
+
const seeded = await actions.seedOracleFromJsonFiles({
|
|
249
|
+
oracle: c.oracle,
|
|
250
|
+
marketsPath: "./markets.polygon.json",
|
|
251
|
+
oppositesPath: "./opposites.polygon.json",
|
|
252
|
+
negRiskPath: "./negrisk.polygon.json",
|
|
253
|
+
prepare: {
|
|
254
|
+
publicClient,
|
|
255
|
+
oracleAddress: c.oracle.address,
|
|
256
|
+
account: wallet.account.address,
|
|
257
|
+
},
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Inspect the plan before sending txs.
|
|
261
|
+
console.log(seeded.plan);
|
|
262
|
+
|
|
263
|
+
if ("prepared" in seeded) {
|
|
264
|
+
const hashes = await actions.executeOracleSeedPlan({
|
|
265
|
+
walletClient,
|
|
266
|
+
prepared: seeded.prepared,
|
|
267
|
+
});
|
|
268
|
+
console.log(hashes);
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
#### Browser/backend: seed from already-parsed JSON
|
|
273
|
+
|
|
274
|
+
```ts
|
|
275
|
+
const seeded = await actions.seedOracleFromJson({
|
|
276
|
+
oracle: c.oracle,
|
|
277
|
+
marketsJson,
|
|
278
|
+
oppositesJson,
|
|
279
|
+
negRiskJson,
|
|
280
|
+
});
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### RBAC preflight (AccessManager)
|
|
284
|
+
|
|
285
|
+
The protocol uses an `AccessManager` for RBAC.
|
|
286
|
+
|
|
287
|
+
```ts
|
|
288
|
+
import * as actions from "@varla/sdk/actions";
|
|
289
|
+
|
|
290
|
+
const selector = actions.selectorFromSignature(actions.ORACLE_SIGS.configurePositionsBatch);
|
|
291
|
+
await actions.assertCanCallImmediate({
|
|
292
|
+
accessManager: c.accessManager,
|
|
293
|
+
caller: wallet.account.address,
|
|
294
|
+
target: c.oracle.address,
|
|
295
|
+
selector,
|
|
296
|
+
});
|
|
297
|
+
```
|
|
298
|
+
|
|
212
299
|
#### Optional deployments
|
|
213
300
|
|
|
214
301
|
Some deployments are chain-specific (e.g. adapters). These are exposed as optional properties:
|
package/dist/actions/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/actions/index.ts"],"names":[],"mappings":"AAEA,cAAc,SAAS,CAAC;AACxB,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC"}
|
package/dist/actions/index.js
CHANGED
package/dist/actions/oracle.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Address, PublicClient } from "viem";
|
|
2
|
+
import type { Hash, WalletClient } from "viem";
|
|
2
3
|
export type SimulatedTx = Awaited<ReturnType<PublicClient["simulateContract"]>>;
|
|
3
4
|
export type MarketConfigItem = {
|
|
4
5
|
positionId: bigint;
|
|
@@ -38,4 +39,130 @@ export declare function prepareOracleUpdatePrices(params: {
|
|
|
38
39
|
account: Address;
|
|
39
40
|
items: readonly OraclePriceUpdateItem[];
|
|
40
41
|
}): Promise<SimulatedTx>;
|
|
42
|
+
export type OracleLikeForSeeding = {
|
|
43
|
+
address: Address;
|
|
44
|
+
read: {
|
|
45
|
+
isConfigured: (args: readonly [bigint]) => Promise<boolean>;
|
|
46
|
+
getOppositePositionId: (args: readonly [bigint]) => Promise<bigint>;
|
|
47
|
+
isNegRisk: (args: readonly [bigint]) => Promise<boolean>;
|
|
48
|
+
getNegRiskMarketId: (args: readonly [bigint]) => Promise<`0x${string}`>;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
export type OracleSeedPlan = {
|
|
52
|
+
/** New positions to configure via configurePositionsBatch */
|
|
53
|
+
configurePositions: MarketConfigItem[];
|
|
54
|
+
/** Opposite pairs to configure (skips already-correct pairs) */
|
|
55
|
+
configureOpposites: Array<{
|
|
56
|
+
yesPositionId: bigint;
|
|
57
|
+
noPositionId: bigint;
|
|
58
|
+
}>;
|
|
59
|
+
/** NegRisk mapping updates (only positionIds that are missing or mismatched) */
|
|
60
|
+
configureNegRisk: Array<{
|
|
61
|
+
marketId: `0x${string}`;
|
|
62
|
+
positionIds: bigint[];
|
|
63
|
+
}>;
|
|
64
|
+
};
|
|
65
|
+
export declare function planOracleSeed(params: {
|
|
66
|
+
oracle: OracleLikeForSeeding;
|
|
67
|
+
markets?: ReadonlyArray<MarketConfigItem>;
|
|
68
|
+
opposites?: ReadonlyArray<{
|
|
69
|
+
yesPositionId: bigint;
|
|
70
|
+
noPositionId: bigint;
|
|
71
|
+
}>;
|
|
72
|
+
negRisk?: ReadonlyArray<{
|
|
73
|
+
marketId: `0x${string}`;
|
|
74
|
+
positionIds: ReadonlyArray<bigint>;
|
|
75
|
+
}>;
|
|
76
|
+
}): Promise<OracleSeedPlan>;
|
|
77
|
+
export type OracleSeedExecResult = {
|
|
78
|
+
plan: OracleSeedPlan;
|
|
79
|
+
simulations: {
|
|
80
|
+
configurePositions?: SimulatedTx;
|
|
81
|
+
configureOpposites: SimulatedTx[];
|
|
82
|
+
configureNegRisk: SimulatedTx[];
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
export type MarketConfigItemJson = {
|
|
86
|
+
positionId: string | number;
|
|
87
|
+
riskTier: number;
|
|
88
|
+
conditionId: `0x${string}`;
|
|
89
|
+
resolutionTime: string | number;
|
|
90
|
+
};
|
|
91
|
+
export type OppositePairItemJson = {
|
|
92
|
+
yesPositionId: string | number;
|
|
93
|
+
noPositionId: string | number;
|
|
94
|
+
};
|
|
95
|
+
export type NegRiskMarketItemJson = {
|
|
96
|
+
marketId: `0x${string}`;
|
|
97
|
+
positionIds: Array<string | number>;
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* High-level helper for backends/frontends: seed using already-parsed JSON.
|
|
101
|
+
*
|
|
102
|
+
* This is environment-agnostic (browser-safe).
|
|
103
|
+
*/
|
|
104
|
+
export type SeedOracleFromJsonResult = {
|
|
105
|
+
plan: OracleSeedPlan;
|
|
106
|
+
} | {
|
|
107
|
+
plan: OracleSeedPlan;
|
|
108
|
+
prepared: OracleSeedExecResult;
|
|
109
|
+
};
|
|
110
|
+
export declare function seedOracleFromJson(params: {
|
|
111
|
+
oracle: OracleLikeForSeeding;
|
|
112
|
+
marketsJson?: readonly MarketConfigItemJson[];
|
|
113
|
+
oppositesJson?: readonly OppositePairItemJson[];
|
|
114
|
+
negRiskJson?: readonly NegRiskMarketItemJson[];
|
|
115
|
+
/**
|
|
116
|
+
* Optional: if provided, also prepares simulateContract requests.
|
|
117
|
+
* If omitted, only returns the diff plan.
|
|
118
|
+
*/
|
|
119
|
+
prepare?: {
|
|
120
|
+
publicClient: Pick<PublicClient, "simulateContract">;
|
|
121
|
+
oracleAddress: Address;
|
|
122
|
+
account: Address;
|
|
123
|
+
};
|
|
124
|
+
}): Promise<SeedOracleFromJsonResult>;
|
|
125
|
+
/**
|
|
126
|
+
* Node-only convenience helper: read JSON files from disk and seed.
|
|
127
|
+
*
|
|
128
|
+
* This uses dynamic imports so bundlers don’t pull `node:fs` into frontend builds.
|
|
129
|
+
*/
|
|
130
|
+
export declare function seedOracleFromJsonFiles(params: {
|
|
131
|
+
oracle: OracleLikeForSeeding;
|
|
132
|
+
marketsPath?: string;
|
|
133
|
+
oppositesPath?: string;
|
|
134
|
+
negRiskPath?: string;
|
|
135
|
+
prepare?: {
|
|
136
|
+
publicClient: Pick<PublicClient, "simulateContract">;
|
|
137
|
+
oracleAddress: Address;
|
|
138
|
+
account: Address;
|
|
139
|
+
};
|
|
140
|
+
}): Promise<SeedOracleFromJsonResult>;
|
|
141
|
+
/**
|
|
142
|
+
* Given a plan (usually from `planOracleSeed`), prepare all necessary tx requests via simulate.
|
|
143
|
+
*
|
|
144
|
+
* NOTE: This does not send txs; use `sendTx({ walletClient, request: sim.request })`.
|
|
145
|
+
*/
|
|
146
|
+
export declare function prepareOracleSeedPlan(params: {
|
|
147
|
+
publicClient: Pick<PublicClient, "simulateContract">;
|
|
148
|
+
oracleAddress: Address;
|
|
149
|
+
account: Address;
|
|
150
|
+
plan: OracleSeedPlan;
|
|
151
|
+
}): Promise<OracleSeedExecResult>;
|
|
152
|
+
/**
|
|
153
|
+
* Execute a prepared oracle seed plan by sending the simulated requests in a safe order.
|
|
154
|
+
*
|
|
155
|
+
* This is intentionally minimal:
|
|
156
|
+
* - sequential
|
|
157
|
+
* - no retries
|
|
158
|
+
* - no receipt waiting/polling
|
|
159
|
+
*/
|
|
160
|
+
export declare function executeOracleSeedPlan(params: {
|
|
161
|
+
walletClient: Pick<WalletClient, "writeContract">;
|
|
162
|
+
prepared: OracleSeedExecResult;
|
|
163
|
+
}): Promise<{
|
|
164
|
+
configurePositions?: Hash;
|
|
165
|
+
configureOpposites: Hash[];
|
|
166
|
+
configureNegRisk: Hash[];
|
|
167
|
+
}>;
|
|
41
168
|
//# sourceMappingURL=oracle.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/actions/oracle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"oracle.d.ts","sourceRoot":"","sources":["../../src/actions/oracle.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AAK/C,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;AAEhF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,CAAC;CACxB,CAAC;AAEF,wBAAsB,oCAAoC,CAAC,MAAM,EAAE;IACjE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACpC,GAAG,OAAO,CAAC,WAAW,CAAC,CAavB;AAED,wBAAsB,uCAAuC,CAAC,MAAM,EAAE;IACpE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,OAAO,CAAC,WAAW,CAAC,CAQvB;AAED,wBAAsB,2CAA2C,CAAC,MAAM,EAAE;IACxE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,SAAS,MAAM,EAAE,CAAC;IAC/B,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC;CACzB,GAAG,OAAO,CAAC,WAAW,CAAC,CAQvB;AAED,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,wBAAsB,yBAAyB,CAAC,MAAM,EAAE;IACtD,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACzC,GAAG,OAAO,CAAC,WAAW,CAAC,CAavB;AAMD,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE;QACJ,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5D,qBAAqB,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;QACpE,SAAS,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACzD,kBAAkB,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC;KACzE,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,6DAA6D;IAC7D,kBAAkB,EAAE,gBAAgB,EAAE,CAAC;IAEvC,gEAAgE;IAChE,kBAAkB,EAAE,KAAK,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAE3E,gFAAgF;IAChF,gBAAgB,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7E,CAAC;AAEF,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC3C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAC1C,SAAS,CAAC,EAAE,aAAa,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3E,OAAO,CAAC,EAAE,aAAa,CAAC;QAAE,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;CAC1F,GAAG,OAAO,CAAC,cAAc,CAAC,CAyD1B;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,EAAE,cAAc,CAAC;IACrB,WAAW,EAAE;QACX,kBAAkB,CAAC,EAAE,WAAW,CAAC;QACjC,kBAAkB,EAAE,WAAW,EAAE,CAAC;QAClC,gBAAgB,EAAE,WAAW,EAAE,CAAC;KACjC,CAAC;CACH,CAAC;AAMF,MAAM,MAAM,oBAAoB,GAAG;IACjC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3B,cAAc,EAAE,MAAM,GAAG,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,aAAa,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,YAAY,EAAE,MAAM,GAAG,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,KAAK,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACrC,CAAC;AAqCF;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,GAChC;IAAE,IAAI,EAAE,cAAc,CAAA;CAAE,GACxB;IACE,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,oBAAoB,CAAC;CAChC,CAAC;AAEN,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAC9C,aAAa,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;IAChD,WAAW,CAAC,EAAE,SAAS,qBAAqB,EAAE,CAAC;IAC/C;;;OAGG;IACH,OAAO,CAAC,EAAE;QACR,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;QACrD,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgBpC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,MAAM,EAAE;IACpD,MAAM,EAAE,oBAAoB,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE;QACR,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;QACrD,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;CACH,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAgCpC;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,kBAAkB,CAAC,CAAC;IACrD,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,cAAc,CAAC;CACtB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAiDhC;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAClD,QAAQ,EAAE,oBAAoB,CAAC;CAChC,GAAG,OAAO,CAAC;IACV,kBAAkB,CAAC,EAAE,IAAI,CAAC;IAC1B,kBAAkB,EAAE,IAAI,EAAE,CAAC;IAC3B,gBAAgB,EAAE,IAAI,EAAE,CAAC;CAC1B,CAAC,CAsCD"}
|
package/dist/actions/oracle.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Note: explicit .js extension is required for Node ESM resolution.
|
|
2
2
|
import { abis } from "../generated.js";
|
|
3
|
+
import { sendTx } from "./tx.js";
|
|
3
4
|
export async function prepareOracleConfigurePositionsBatch(params) {
|
|
4
5
|
const positionIds = params.items.map((x) => x.positionId);
|
|
5
6
|
const riskTiers = params.items.map((x) => x.riskTier);
|
|
@@ -44,3 +45,216 @@ export async function prepareOracleUpdatePrices(params) {
|
|
|
44
45
|
account: params.account,
|
|
45
46
|
}));
|
|
46
47
|
}
|
|
48
|
+
export async function planOracleSeed(params) {
|
|
49
|
+
const plan = {
|
|
50
|
+
configurePositions: [],
|
|
51
|
+
configureOpposites: [],
|
|
52
|
+
configureNegRisk: [],
|
|
53
|
+
};
|
|
54
|
+
// ---------------------
|
|
55
|
+
// markets (configure)
|
|
56
|
+
// ---------------------
|
|
57
|
+
if (params.markets && params.markets.length > 0) {
|
|
58
|
+
// Idempotent: only configure markets not already configured.
|
|
59
|
+
for (const it of params.markets) {
|
|
60
|
+
const ok = await params.oracle.read.isConfigured([it.positionId]);
|
|
61
|
+
if (!ok)
|
|
62
|
+
plan.configurePositions.push({ ...it });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ---------------------
|
|
66
|
+
// opposites
|
|
67
|
+
// ---------------------
|
|
68
|
+
if (params.opposites && params.opposites.length > 0) {
|
|
69
|
+
for (const p of params.opposites) {
|
|
70
|
+
const curYes = await params.oracle.read.getOppositePositionId([p.yesPositionId]);
|
|
71
|
+
const curNo = await params.oracle.read.getOppositePositionId([p.noPositionId]);
|
|
72
|
+
if (curYes === p.noPositionId && curNo === p.yesPositionId)
|
|
73
|
+
continue;
|
|
74
|
+
plan.configureOpposites.push({
|
|
75
|
+
yesPositionId: p.yesPositionId,
|
|
76
|
+
noPositionId: p.noPositionId,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ---------------------
|
|
81
|
+
// negRisk
|
|
82
|
+
// ---------------------
|
|
83
|
+
if (params.negRisk && params.negRisk.length > 0) {
|
|
84
|
+
for (const m of params.negRisk) {
|
|
85
|
+
const missing = [];
|
|
86
|
+
for (const pid of m.positionIds) {
|
|
87
|
+
const isNeg = await params.oracle.read.isNegRisk([pid]);
|
|
88
|
+
if (!isNeg) {
|
|
89
|
+
missing.push(pid);
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const curMarketId = await params.oracle.read.getNegRiskMarketId([pid]);
|
|
93
|
+
if (curMarketId.toLowerCase() !== m.marketId.toLowerCase()) {
|
|
94
|
+
missing.push(pid);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (missing.length > 0) {
|
|
98
|
+
plan.configureNegRisk.push({ marketId: m.marketId, positionIds: missing });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return plan;
|
|
103
|
+
}
|
|
104
|
+
function toBigIntU256(x) {
|
|
105
|
+
if (typeof x === "number")
|
|
106
|
+
return BigInt(x);
|
|
107
|
+
if (x.startsWith("0x"))
|
|
108
|
+
return BigInt(x);
|
|
109
|
+
return BigInt(x);
|
|
110
|
+
}
|
|
111
|
+
function normalizeMarketsJson(items) {
|
|
112
|
+
return items.map((it) => ({
|
|
113
|
+
positionId: toBigIntU256(it.positionId),
|
|
114
|
+
riskTier: it.riskTier,
|
|
115
|
+
conditionId: it.conditionId,
|
|
116
|
+
resolutionTime: toBigIntU256(it.resolutionTime),
|
|
117
|
+
}));
|
|
118
|
+
}
|
|
119
|
+
function normalizeOppositesJson(items) {
|
|
120
|
+
return items.map((it) => ({
|
|
121
|
+
yesPositionId: toBigIntU256(it.yesPositionId),
|
|
122
|
+
noPositionId: toBigIntU256(it.noPositionId),
|
|
123
|
+
}));
|
|
124
|
+
}
|
|
125
|
+
function normalizeNegRiskJson(items) {
|
|
126
|
+
return items.map((it) => ({
|
|
127
|
+
marketId: it.marketId,
|
|
128
|
+
positionIds: it.positionIds.map(toBigIntU256),
|
|
129
|
+
}));
|
|
130
|
+
}
|
|
131
|
+
export async function seedOracleFromJson(params) {
|
|
132
|
+
const markets = params.marketsJson ? normalizeMarketsJson(params.marketsJson) : undefined;
|
|
133
|
+
const opposites = params.oppositesJson ? normalizeOppositesJson(params.oppositesJson) : undefined;
|
|
134
|
+
const negRisk = params.negRiskJson ? normalizeNegRiskJson(params.negRiskJson) : undefined;
|
|
135
|
+
const plan = await planOracleSeed({ oracle: params.oracle, markets, opposites, negRisk });
|
|
136
|
+
if (!params.prepare)
|
|
137
|
+
return { plan };
|
|
138
|
+
const prepared = await prepareOracleSeedPlan({
|
|
139
|
+
publicClient: params.prepare.publicClient,
|
|
140
|
+
oracleAddress: params.prepare.oracleAddress,
|
|
141
|
+
account: params.prepare.account,
|
|
142
|
+
plan,
|
|
143
|
+
});
|
|
144
|
+
return { plan, prepared };
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Node-only convenience helper: read JSON files from disk and seed.
|
|
148
|
+
*
|
|
149
|
+
* This uses dynamic imports so bundlers don’t pull `node:fs` into frontend builds.
|
|
150
|
+
*/
|
|
151
|
+
export async function seedOracleFromJsonFiles(params) {
|
|
152
|
+
let readFileSync;
|
|
153
|
+
try {
|
|
154
|
+
// Node 18+/Bun supports `node:fs`.
|
|
155
|
+
({ readFileSync } = (await import("node:fs")));
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
throw new Error("seedOracleFromJsonFiles() is Node-only. In browsers, load JSON via fetch and call seedOracleFromJson().");
|
|
159
|
+
}
|
|
160
|
+
if (!readFileSync) {
|
|
161
|
+
throw new Error("Failed to load node:fs readFileSync");
|
|
162
|
+
}
|
|
163
|
+
const marketsJson = params.marketsPath
|
|
164
|
+
? JSON.parse(readFileSync(params.marketsPath, "utf8"))
|
|
165
|
+
: undefined;
|
|
166
|
+
const oppositesJson = params.oppositesPath
|
|
167
|
+
? JSON.parse(readFileSync(params.oppositesPath, "utf8"))
|
|
168
|
+
: undefined;
|
|
169
|
+
const negRiskJson = params.negRiskPath
|
|
170
|
+
? JSON.parse(readFileSync(params.negRiskPath, "utf8"))
|
|
171
|
+
: undefined;
|
|
172
|
+
return seedOracleFromJson({
|
|
173
|
+
oracle: params.oracle,
|
|
174
|
+
marketsJson,
|
|
175
|
+
oppositesJson,
|
|
176
|
+
negRiskJson,
|
|
177
|
+
prepare: params.prepare,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Given a plan (usually from `planOracleSeed`), prepare all necessary tx requests via simulate.
|
|
182
|
+
*
|
|
183
|
+
* NOTE: This does not send txs; use `sendTx({ walletClient, request: sim.request })`.
|
|
184
|
+
*/
|
|
185
|
+
export async function prepareOracleSeedPlan(params) {
|
|
186
|
+
const { plan } = params;
|
|
187
|
+
const configurePositions = plan.configurePositions.length > 0
|
|
188
|
+
? await prepareOracleConfigurePositionsBatch({
|
|
189
|
+
publicClient: params.publicClient,
|
|
190
|
+
oracleAddress: params.oracleAddress,
|
|
191
|
+
account: params.account,
|
|
192
|
+
items: plan.configurePositions,
|
|
193
|
+
})
|
|
194
|
+
: undefined;
|
|
195
|
+
const configureOpposites = [];
|
|
196
|
+
for (const p of plan.configureOpposites) {
|
|
197
|
+
configureOpposites.push(await prepareOracleConfigureOppositePositions({
|
|
198
|
+
publicClient: params.publicClient,
|
|
199
|
+
oracleAddress: params.oracleAddress,
|
|
200
|
+
account: params.account,
|
|
201
|
+
yesPositionId: p.yesPositionId,
|
|
202
|
+
noPositionId: p.noPositionId,
|
|
203
|
+
}));
|
|
204
|
+
}
|
|
205
|
+
const configureNegRisk = [];
|
|
206
|
+
for (const m of plan.configureNegRisk) {
|
|
207
|
+
// Avoid useless batch calls.
|
|
208
|
+
if (m.positionIds.length === 0)
|
|
209
|
+
continue;
|
|
210
|
+
configureNegRisk.push(await prepareOracleConfigureNegRiskPositionsBatch({
|
|
211
|
+
publicClient: params.publicClient,
|
|
212
|
+
oracleAddress: params.oracleAddress,
|
|
213
|
+
account: params.account,
|
|
214
|
+
positionIds: m.positionIds,
|
|
215
|
+
marketId: m.marketId,
|
|
216
|
+
}));
|
|
217
|
+
}
|
|
218
|
+
return {
|
|
219
|
+
plan,
|
|
220
|
+
simulations: {
|
|
221
|
+
configurePositions,
|
|
222
|
+
configureOpposites,
|
|
223
|
+
configureNegRisk,
|
|
224
|
+
},
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Execute a prepared oracle seed plan by sending the simulated requests in a safe order.
|
|
229
|
+
*
|
|
230
|
+
* This is intentionally minimal:
|
|
231
|
+
* - sequential
|
|
232
|
+
* - no retries
|
|
233
|
+
* - no receipt waiting/polling
|
|
234
|
+
*/
|
|
235
|
+
export async function executeOracleSeedPlan(params) {
|
|
236
|
+
const out = {
|
|
237
|
+
configureOpposites: [],
|
|
238
|
+
configureNegRisk: [],
|
|
239
|
+
};
|
|
240
|
+
const sims = params.prepared.simulations;
|
|
241
|
+
if (sims.configurePositions) {
|
|
242
|
+
out.configurePositions = await sendTx({
|
|
243
|
+
walletClient: params.walletClient,
|
|
244
|
+
request: sims.configurePositions.request,
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
for (const sim of sims.configureOpposites) {
|
|
248
|
+
out.configureOpposites.push(await sendTx({
|
|
249
|
+
walletClient: params.walletClient,
|
|
250
|
+
request: sim.request,
|
|
251
|
+
}));
|
|
252
|
+
}
|
|
253
|
+
for (const sim of sims.configureNegRisk) {
|
|
254
|
+
out.configureNegRisk.push(await sendTx({
|
|
255
|
+
walletClient: params.walletClient,
|
|
256
|
+
request: sim.request,
|
|
257
|
+
}));
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
package/dist/actions/rbac.d.ts
CHANGED
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
import type { Address, Hex } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* ABI signatures for commonly preflighted RBAC targets.
|
|
4
|
+
*
|
|
5
|
+
* Use with `selectorFromSignature(sig)`.
|
|
6
|
+
*/
|
|
7
|
+
export declare const ORACLE_SIGS: {
|
|
8
|
+
readonly configurePositionsBatch: "configurePositionsBatch(uint256[],uint8[],bytes32[],uint256[])";
|
|
9
|
+
readonly configureOppositePositions: "configureOppositePositions(uint256,uint256)";
|
|
10
|
+
readonly configureNegRiskPositionsBatch: "configureNegRiskPositionsBatch(uint256[],bytes32)";
|
|
11
|
+
readonly updatePrices: "updatePrices(uint256[],uint256[],uint256[],uint256[])";
|
|
12
|
+
};
|
|
2
13
|
/**
|
|
3
14
|
* Minimal AccessManager interface needed for RBAC preflight.
|
|
4
15
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/actions/rbac.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"rbac.d.ts","sourceRoot":"","sources":["../../src/actions/rbac.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAMzC;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;;CAMd,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE;QACJ,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KACvE,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAGF,wBAAsB,WAAW,CAAC,MAAM,EAAE;IACxC,aAAa,EAAE,wBAAwB,CAAC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC;CACf,GAAG,OAAO,CAAC,aAAa,CAAC,CAezB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,aAAa,EAAE,wBAAwB,CAAC;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,GAAG,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAKhB"}
|
package/dist/actions/rbac.js
CHANGED
|
@@ -1,4 +1,18 @@
|
|
|
1
1
|
// Note: explicit .js extension is required for Node ESM resolution.
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// Common signatures (DevEx)
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
/**
|
|
6
|
+
* ABI signatures for commonly preflighted RBAC targets.
|
|
7
|
+
*
|
|
8
|
+
* Use with `selectorFromSignature(sig)`.
|
|
9
|
+
*/
|
|
10
|
+
export const ORACLE_SIGS = {
|
|
11
|
+
configurePositionsBatch: "configurePositionsBatch(uint256[],uint8[],bytes32[],uint256[])",
|
|
12
|
+
configureOppositePositions: "configureOppositePositions(uint256,uint256)",
|
|
13
|
+
configureNegRiskPositionsBatch: "configureNegRiskPositionsBatch(uint256[],bytes32)",
|
|
14
|
+
updatePrices: "updatePrices(uint256[],uint256[],uint256[],uint256[])",
|
|
15
|
+
};
|
|
2
16
|
// wraps: AccessManager.canCall
|
|
3
17
|
export async function readCanCall(params) {
|
|
4
18
|
const raw = await params.accessManager.read.canCall([
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Hex } from "viem";
|
|
2
|
+
/**
|
|
3
|
+
* Compute a 4-byte function selector from a Solidity function signature.
|
|
4
|
+
*
|
|
5
|
+
* Example:
|
|
6
|
+
* - "borrow(uint256)" -> 0x....
|
|
7
|
+
*/
|
|
8
|
+
export declare function selectorFromSignature(signature: string): Hex;
|
|
9
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/actions/utils.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAGhC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,GAAG,CAG5D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Note: explicit .js extension is required for Node ESM resolution.
|
|
2
|
+
import { keccak256, toBytes } from "viem";
|
|
3
|
+
/**
|
|
4
|
+
* Compute a 4-byte function selector from a Solidity function signature.
|
|
5
|
+
*
|
|
6
|
+
* Example:
|
|
7
|
+
* - "borrow(uint256)" -> 0x....
|
|
8
|
+
*/
|
|
9
|
+
export function selectorFromSignature(signature) {
|
|
10
|
+
const hash = keccak256(toBytes(signature));
|
|
11
|
+
return `0x${hash.slice(2, 10)}`;
|
|
12
|
+
}
|