@mutinylabs/slip 0.2.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/LICENSE +21 -0
- package/README.md +99 -0
- package/dist/ai.d.ts +70 -0
- package/dist/ai.d.ts.map +1 -0
- package/dist/ai.js +448 -0
- package/dist/ai.js.map +1 -0
- package/dist/anchor.d.ts +15 -0
- package/dist/anchor.d.ts.map +1 -0
- package/dist/anchor.js +15 -0
- package/dist/anchor.js.map +1 -0
- package/dist/client.d.ts +90 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +161 -0
- package/dist/client.js.map +1 -0
- package/dist/evidence.d.ts +13 -0
- package/dist/evidence.d.ts.map +1 -0
- package/dist/evidence.js +34 -0
- package/dist/evidence.js.map +1 -0
- package/dist/generated/accounts/index.d.ts +10 -0
- package/dist/generated/accounts/index.d.ts.map +1 -0
- package/dist/generated/accounts/index.js +10 -0
- package/dist/generated/accounts/index.js.map +1 -0
- package/dist/generated/accounts/market.d.ts +73 -0
- package/dist/generated/accounts/market.d.ts.map +1 -0
- package/dist/generated/accounts/market.js +105 -0
- package/dist/generated/accounts/market.js.map +1 -0
- package/dist/generated/accounts/marketTicket.d.ts +43 -0
- package/dist/generated/accounts/marketTicket.d.ts.map +1 -0
- package/dist/generated/accounts/marketTicket.js +69 -0
- package/dist/generated/accounts/marketTicket.js.map +1 -0
- package/dist/generated/errors/index.d.ts +9 -0
- package/dist/generated/errors/index.d.ts.map +1 -0
- package/dist/generated/errors/index.js +9 -0
- package/dist/generated/errors/index.js.map +1 -0
- package/dist/generated/errors/slip.d.ts +68 -0
- package/dist/generated/errors/slip.d.ts.map +1 -0
- package/dist/generated/errors/slip.js +96 -0
- package/dist/generated/errors/slip.js.map +1 -0
- package/dist/generated/index.d.ts +14 -0
- package/dist/generated/index.d.ts.map +1 -0
- package/dist/generated/index.js +14 -0
- package/dist/generated/index.js.map +1 -0
- package/dist/generated/instructions/buyTicket.d.ts +80 -0
- package/dist/generated/instructions/buyTicket.d.ts.map +1 -0
- package/dist/generated/instructions/buyTicket.js +149 -0
- package/dist/generated/instructions/buyTicket.js.map +1 -0
- package/dist/generated/instructions/claimTicket.d.ts +55 -0
- package/dist/generated/instructions/claimTicket.d.ts.map +1 -0
- package/dist/generated/instructions/claimTicket.js +87 -0
- package/dist/generated/instructions/claimTicket.js.map +1 -0
- package/dist/generated/instructions/createMarket.d.ts +105 -0
- package/dist/generated/instructions/createMarket.d.ts.map +1 -0
- package/dist/generated/instructions/createMarket.js +195 -0
- package/dist/generated/instructions/createMarket.js.map +1 -0
- package/dist/generated/instructions/index.d.ts +14 -0
- package/dist/generated/instructions/index.d.ts.map +1 -0
- package/dist/generated/instructions/index.js +14 -0
- package/dist/generated/instructions/index.js.map +1 -0
- package/dist/generated/instructions/resolveMarket.d.ts +75 -0
- package/dist/generated/instructions/resolveMarket.d.ts.map +1 -0
- package/dist/generated/instructions/resolveMarket.js +107 -0
- package/dist/generated/instructions/resolveMarket.js.map +1 -0
- package/dist/generated/instructions/resolveMarketV3.d.ts +78 -0
- package/dist/generated/instructions/resolveMarketV3.d.ts.map +1 -0
- package/dist/generated/instructions/resolveMarketV3.js +109 -0
- package/dist/generated/instructions/resolveMarketV3.js.map +1 -0
- package/dist/generated/instructions/voidMarket.d.ts +40 -0
- package/dist/generated/instructions/voidMarket.d.ts.map +1 -0
- package/dist/generated/instructions/voidMarket.js +64 -0
- package/dist/generated/instructions/voidMarket.js.map +1 -0
- package/dist/generated/pdas/index.d.ts +10 -0
- package/dist/generated/pdas/index.d.ts.map +1 -0
- package/dist/generated/pdas/index.js +10 -0
- package/dist/generated/pdas/index.js.map +1 -0
- package/dist/generated/pdas/market.d.ts +16 -0
- package/dist/generated/pdas/market.d.ts.map +1 -0
- package/dist/generated/pdas/market.js +20 -0
- package/dist/generated/pdas/market.js.map +1 -0
- package/dist/generated/pdas/ticket.d.ts +17 -0
- package/dist/generated/pdas/ticket.d.ts.map +1 -0
- package/dist/generated/pdas/ticket.js +21 -0
- package/dist/generated/pdas/ticket.js.map +1 -0
- package/dist/generated/programs/index.d.ts +9 -0
- package/dist/generated/programs/index.d.ts.map +1 -0
- package/dist/generated/programs/index.js +9 -0
- package/dist/generated/programs/index.js.map +1 -0
- package/dist/generated/programs/slip.d.ts +43 -0
- package/dist/generated/programs/slip.d.ts.map +1 -0
- package/dist/generated/programs/slip.js +106 -0
- package/dist/generated/programs/slip.js.map +1 -0
- package/dist/generated/shared/index.d.ts +50 -0
- package/dist/generated/shared/index.d.ts.map +1 -0
- package/dist/generated/shared/index.js +87 -0
- package/dist/generated/shared/index.js.map +1 -0
- package/dist/generated/types/binaryOp.d.ts +18 -0
- package/dist/generated/types/binaryOp.d.ts.map +1 -0
- package/dist/generated/types/binaryOp.js +24 -0
- package/dist/generated/types/binaryOp.js.map +1 -0
- package/dist/generated/types/index.d.ts +19 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +19 -0
- package/dist/generated/types/index.js.map +1 -0
- package/dist/generated/types/marketExpression.d.ts +34 -0
- package/dist/generated/types/marketExpression.d.ts.map +1 -0
- package/dist/generated/types/marketExpression.js +37 -0
- package/dist/generated/types/marketExpression.js.map +1 -0
- package/dist/generated/types/marketState.d.ts +18 -0
- package/dist/generated/types/marketState.d.ts.map +1 -0
- package/dist/generated/types/marketState.js +24 -0
- package/dist/generated/types/marketState.js.map +1 -0
- package/dist/generated/types/multiProof.d.ts +28 -0
- package/dist/generated/types/multiProof.d.ts.map +1 -0
- package/dist/generated/types/multiProof.js +25 -0
- package/dist/generated/types/multiProof.js.map +1 -0
- package/dist/generated/types/outcomeBand.d.ts +26 -0
- package/dist/generated/types/outcomeBand.d.ts.map +1 -0
- package/dist/generated/types/outcomeBand.js +26 -0
- package/dist/generated/types/outcomeBand.js.map +1 -0
- package/dist/generated/types/proofNode.d.ts +17 -0
- package/dist/generated/types/proofNode.d.ts.map +1 -0
- package/dist/generated/types/proofNode.js +24 -0
- package/dist/generated/types/proofNode.js.map +1 -0
- package/dist/generated/types/provenStat.d.ts +21 -0
- package/dist/generated/types/provenStat.d.ts.map +1 -0
- package/dist/generated/types/provenStat.js +25 -0
- package/dist/generated/types/provenStat.js.map +1 -0
- package/dist/generated/types/scoreStatInput.d.ts +18 -0
- package/dist/generated/types/scoreStatInput.d.ts.map +1 -0
- package/dist/generated/types/scoreStatInput.js +26 -0
- package/dist/generated/types/scoreStatInput.js.map +1 -0
- package/dist/generated/types/settlementMode.d.ts +16 -0
- package/dist/generated/types/settlementMode.d.ts.map +1 -0
- package/dist/generated/types/settlementMode.js +22 -0
- package/dist/generated/types/settlementMode.js.map +1 -0
- package/dist/generated/types/sideSelector.d.ts +18 -0
- package/dist/generated/types/sideSelector.d.ts.map +1 -0
- package/dist/generated/types/sideSelector.js +24 -0
- package/dist/generated/types/sideSelector.js.map +1 -0
- package/dist/generated/types/summaryInput.d.ts +26 -0
- package/dist/generated/types/summaryInput.d.ts.map +1 -0
- package/dist/generated/types/summaryInput.js +30 -0
- package/dist/generated/types/summaryInput.js.map +1 -0
- package/dist/idl/slip.json +2418 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/market-reference.d.ts +9 -0
- package/dist/market-reference.d.ts.map +1 -0
- package/dist/market-reference.js +38 -0
- package/dist/market-reference.js.map +1 -0
- package/dist/market.d.ts +42 -0
- package/dist/market.d.ts.map +1 -0
- package/dist/market.js +267 -0
- package/dist/market.js.map +1 -0
- package/dist/merkle.d.ts +48 -0
- package/dist/merkle.d.ts.map +1 -0
- package/dist/merkle.js +67 -0
- package/dist/merkle.js.map +1 -0
- package/dist/pda.d.ts +12 -0
- package/dist/pda.d.ts.map +1 -0
- package/dist/pda.js +30 -0
- package/dist/pda.js.map +1 -0
- package/dist/proof.d.ts +40 -0
- package/dist/proof.d.ts.map +1 -0
- package/dist/proof.js +106 -0
- package/dist/proof.js.map +1 -0
- package/dist/public-client.d.ts +60 -0
- package/dist/public-client.d.ts.map +1 -0
- package/dist/public-client.js +487 -0
- package/dist/public-client.js.map +1 -0
- package/dist/public-math.d.ts +17 -0
- package/dist/public-math.d.ts.map +1 -0
- package/dist/public-math.js +57 -0
- package/dist/public-math.js.map +1 -0
- package/dist/public-types.d.ts +151 -0
- package/dist/public-types.d.ts.map +1 -0
- package/dist/public-types.js +2 -0
- package/dist/public-types.js.map +1 -0
- package/dist/rulebook-skills.d.ts +15 -0
- package/dist/rulebook-skills.d.ts.map +1 -0
- package/dist/rulebook-skills.js +155 -0
- package/dist/rulebook-skills.js.map +1 -0
- package/dist/rulebook.d.ts +17 -0
- package/dist/rulebook.d.ts.map +1 -0
- package/dist/rulebook.js +42 -0
- package/dist/rulebook.js.map +1 -0
- package/dist/transaction.d.ts +23 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +51 -0
- package/dist/transaction.js.map +1 -0
- package/dist/txline.d.ts +55 -0
- package/dist/txline.d.ts.map +1 -0
- package/dist/txline.js +238 -0
- package/dist/txline.js.map +1 -0
- package/dist/types.d.ts +149 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +123 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Browser-safe public SDK. Server-only integrations live at `/ai` and `/txline`. */
|
|
2
|
+
export * from "./public-types.js";
|
|
3
|
+
export * from "./public-math.js";
|
|
4
|
+
export * from "./public-client.js";
|
|
5
|
+
export * from "./market-reference.js";
|
|
6
|
+
export * from "./rulebook.js";
|
|
7
|
+
export * from "./evidence.js";
|
|
8
|
+
export { BinaryOp, MarketState, SettlementMode, SideSelector, getMarketDecoder, getMarketTicketDecoder, findMarketPda, findTicketPda, } from "./generated/index.js";
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,aAAa,GACd,MAAM,sBAAsB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Browser-safe public SDK. Server-only integrations live at `/ai` and `/txline`. */
|
|
2
|
+
export * from "./public-types.js";
|
|
3
|
+
export * from "./public-math.js";
|
|
4
|
+
export * from "./public-client.js";
|
|
5
|
+
export * from "./market-reference.js";
|
|
6
|
+
export * from "./rulebook.js";
|
|
7
|
+
export * from "./evidence.js";
|
|
8
|
+
export { BinaryOp, MarketState, SettlementMode, SideSelector, getMarketDecoder, getMarketTicketDecoder, findMarketPda, findTicketPda, } from "./generated/index.js";
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC;AACtC,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,QAAQ,EACR,WAAW,EACX,cAAc,EACd,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,aAAa,GACd,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { MarketReferenceV1, SlipClientConfig } from "./public-types.js";
|
|
2
|
+
export declare function validateMarketReference(input: unknown): MarketReferenceV1;
|
|
3
|
+
export declare function createMarketReference(config: Pick<SlipClientConfig, "network" | "programAddress" | "settlementMint">, input: {
|
|
4
|
+
market: string;
|
|
5
|
+
fixtureId: string;
|
|
6
|
+
rulebookHash: string;
|
|
7
|
+
creationSignature: string;
|
|
8
|
+
}): MarketReferenceV1;
|
|
9
|
+
//# sourceMappingURL=market-reference.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-reference.d.ts","sourceRoot":"","sources":["../src/market-reference.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAK7E,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,OAAO,GAAG,iBAAiB,CAiBzE;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,gBAAgB,GAAG,gBAAgB,CAAC,EAC/E,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAC5F,iBAAiB,CAQnB"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { address } from "@solana/kit";
|
|
2
|
+
const SIGNATURE = /^[1-9A-HJ-NP-Za-km-z]{64,96}$/;
|
|
3
|
+
const HASH = /^[a-f0-9]{64}$/;
|
|
4
|
+
export function validateMarketReference(input) {
|
|
5
|
+
if (!input || typeof input !== "object" || Array.isArray(input))
|
|
6
|
+
throw new Error("Market reference must be an object");
|
|
7
|
+
const value = input;
|
|
8
|
+
const keys = ["version", "network", "program", "mint", "market", "fixtureId", "rulebookHash", "creationSignature"];
|
|
9
|
+
if (Object.keys(value).length !== keys.length || !Object.keys(value).every((key) => keys.includes(key))) {
|
|
10
|
+
throw new Error("Market reference contains unsupported fields");
|
|
11
|
+
}
|
|
12
|
+
if (value.version !== 1)
|
|
13
|
+
throw new Error("Market reference version is unsupported");
|
|
14
|
+
if (value.network !== "localnet" && value.network !== "devnet" && value.network !== "mainnet-beta")
|
|
15
|
+
throw new Error("Market reference network is unsupported");
|
|
16
|
+
for (const key of ["program", "mint", "market"]) {
|
|
17
|
+
if (typeof value[key] !== "string")
|
|
18
|
+
throw new Error(`Market reference ${key} is required`);
|
|
19
|
+
address(value[key]);
|
|
20
|
+
}
|
|
21
|
+
if (typeof value.fixtureId !== "string" || !/^[1-9]\d{0,18}$/.test(value.fixtureId))
|
|
22
|
+
throw new Error("Market reference fixtureId is invalid");
|
|
23
|
+
if (typeof value.rulebookHash !== "string" || !HASH.test(value.rulebookHash))
|
|
24
|
+
throw new Error("Market reference Rulebook hash is invalid");
|
|
25
|
+
if (typeof value.creationSignature !== "string" || !SIGNATURE.test(value.creationSignature))
|
|
26
|
+
throw new Error("Market reference creation signature is invalid");
|
|
27
|
+
return Object.freeze(value);
|
|
28
|
+
}
|
|
29
|
+
export function createMarketReference(config, input) {
|
|
30
|
+
return validateMarketReference({
|
|
31
|
+
version: 1,
|
|
32
|
+
network: config.network,
|
|
33
|
+
program: config.programAddress,
|
|
34
|
+
mint: config.settlementMint,
|
|
35
|
+
...input,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=market-reference.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market-reference.js","sourceRoot":"","sources":["../src/market-reference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtC,MAAM,SAAS,GAAG,+BAA+B,CAAC;AAClD,MAAM,IAAI,GAAG,gBAAgB,CAAC;AAE9B,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;IACvH,MAAM,KAAK,GAAG,KAAgC,CAAC;IAC/C,MAAM,IAAI,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;IACnH,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QACxG,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IACpF,IAAI,KAAK,CAAC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;IAC/J,KAAK,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAU,EAAE,CAAC;QACzD,IAAI,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,cAAc,CAAC,CAAC;QAC3F,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACtB,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC9I,IAAI,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC3I,IAAI,OAAO,KAAK,CAAC,iBAAiB,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAC/J,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAiC,CAAC;AAC9D,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,MAA+E,EAC/E,KAA6F;IAE7F,OAAO,uBAAuB,CAAC;QAC7B,OAAO,EAAE,CAAC;QACV,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,OAAO,EAAE,MAAM,CAAC,cAAc;QAC9B,IAAI,EAAE,MAAM,CAAC,cAAc;QAC3B,GAAG,KAAK;KACT,CAAC,CAAC;AACL,CAAC"}
|
package/dist/market.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { MarketExpression, MarketParams, OutcomeBand, Period } from "./types.js";
|
|
2
|
+
declare const BASE: {
|
|
3
|
+
readonly goals: readonly [1, 2];
|
|
4
|
+
readonly yellowCards: readonly [3, 4];
|
|
5
|
+
readonly redCards: readonly [5, 6];
|
|
6
|
+
readonly corners: readonly [7, 8];
|
|
7
|
+
};
|
|
8
|
+
export type MarketConcept = keyof typeof BASE;
|
|
9
|
+
export type TeamSide = "home" | "away";
|
|
10
|
+
export type ThresholdComparison = "gt" | "gte" | "lt" | "lte" | "eq";
|
|
11
|
+
export interface MarketRule {
|
|
12
|
+
expression: MarketExpression;
|
|
13
|
+
outcomeLabels: string[];
|
|
14
|
+
bands: OutcomeBand[];
|
|
15
|
+
}
|
|
16
|
+
export declare function validateRule(rule: MarketRule): void;
|
|
17
|
+
export declare function validateMarketId(value: bigint): void;
|
|
18
|
+
export declare function validateTicketNonce(value: bigint): void;
|
|
19
|
+
export declare function validateFeeConfig(feeBps: number, tipBps: number): void;
|
|
20
|
+
export declare function validateExpression(value: MarketExpression): void;
|
|
21
|
+
export declare function validateMarket(params: MarketParams, now?: number): void;
|
|
22
|
+
export declare function settlement(pools: bigint[], feeBps: number, tipBps: number): {
|
|
23
|
+
total: bigint;
|
|
24
|
+
fee: bigint;
|
|
25
|
+
tip: bigint;
|
|
26
|
+
net: bigint;
|
|
27
|
+
};
|
|
28
|
+
export declare function marketOdds(pools: bigint[]): {
|
|
29
|
+
probabilityBps: number;
|
|
30
|
+
decimalOdds: string | null;
|
|
31
|
+
}[];
|
|
32
|
+
export declare function projectedPayout(stake: bigint, winningPool: bigint, pools: bigint[], feeBps: number, tipBps: number): bigint | null;
|
|
33
|
+
export declare function validateStake(value: bigint): void;
|
|
34
|
+
export declare function statExpression(fixtureId: number, concept: MarketConcept, side: TeamSide, period?: Period): MarketExpression;
|
|
35
|
+
export declare function totalExpression(fixtureId: number, concept: MarketConcept, period?: Period): MarketExpression;
|
|
36
|
+
export declare function binaryExpression(fixtureId: number, concept: MarketConcept, op: "Add" | "Sub" | "Min", period?: Period): MarketExpression;
|
|
37
|
+
export declare function resultExpression(fixtureId: number, period?: Period): MarketExpression;
|
|
38
|
+
export declare function bothTeamsExpression(fixtureId: number, concept?: MarketConcept, period?: Period): MarketExpression;
|
|
39
|
+
export declare function thresholdRule(expression: MarketExpression, comparison: ThresholdComparison, threshold: bigint, labels?: [string, string]): MarketRule;
|
|
40
|
+
export declare function resultRule(fixtureId: number, period?: Period): MarketRule;
|
|
41
|
+
export {};
|
|
42
|
+
//# sourceMappingURL=market.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market.d.ts","sourceRoot":"","sources":["../src/market.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAgB,MAAM,YAAY,CAAC;AAkCpG,QAAA,MAAM,IAAI;;;;;CAAqF,CAAC;AAIhG,MAAM,MAAM,aAAa,GAAG,MAAM,OAAO,IAAI,CAAC;AAC9C,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AACvC,MAAM,MAAM,mBAAmB,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,CAAC;AACrE,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,KAAK,EAAE,WAAW,EAAE,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CA8BnD;AAqBD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAA6B;AAClF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAgC;AAExF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAGtE;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,gBAAgB,GAAG,IAAI,CAyBhE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,SAAgC,GAAG,IAAI,CAY9F;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;EASzE;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE;;;IAMzC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKlI;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGjD;AAED,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAE,MAAgB,GAAG,gBAAgB,CAapI;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAE,MAAgB,GAAG,gBAAgB,CAarH;AAED,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,EACzB,MAAM,GAAE,MAAgB,GACvB,gBAAgB,CAGlB;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAgB,GAAG,gBAAgB,CAY9F;AAgBD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,GAAE,aAAuB,EAAE,MAAM,GAAE,MAAgB,GAAG,gBAAgB,CAEnI;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,mBAAmB,EAC/B,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,CAAC,MAAM,EAAE,MAAM,CAAiB,GACvC,UAAU,CAyBZ;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,GAAE,MAAgB,GAAG,UAAU,CAUlF"}
|
package/dist/market.js
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { MAX_BANDS, MAX_FEE_BPS, MAX_OUTCOME_LABEL_BYTES, MAX_OUTCOMES, MAX_TIP_BPS, MIN_STAKE, } from "./types.js";
|
|
2
|
+
const BPS = 10000n;
|
|
3
|
+
const U64_MAX = 18446744073709551615n;
|
|
4
|
+
const I64_MIN = -9223372036854775808n;
|
|
5
|
+
const I64_MAX = 9223372036854775807n;
|
|
6
|
+
const PERIOD_PREFIX = {
|
|
7
|
+
match: 0,
|
|
8
|
+
first_half: 1000,
|
|
9
|
+
halftime: 2000,
|
|
10
|
+
second_half: 3000,
|
|
11
|
+
extra_time_first_half: 4000,
|
|
12
|
+
extra_time_second_half: 5000,
|
|
13
|
+
penalties: 6000,
|
|
14
|
+
extra_time: 7000,
|
|
15
|
+
};
|
|
16
|
+
const PERIOD_VALUE = {
|
|
17
|
+
match: 100,
|
|
18
|
+
first_half: 1000,
|
|
19
|
+
halftime: 2000,
|
|
20
|
+
second_half: 3000,
|
|
21
|
+
extra_time_first_half: 4000,
|
|
22
|
+
extra_time_second_half: 5000,
|
|
23
|
+
penalties: 6000,
|
|
24
|
+
extra_time: 7000,
|
|
25
|
+
};
|
|
26
|
+
const BASE = { goals: [1, 2], yellowCards: [3, 4], redCards: [5, 6], corners: [7, 8] };
|
|
27
|
+
const VALID_PREFIXES = new Set(Object.values(PERIOD_PREFIX));
|
|
28
|
+
const textEncoder = new TextEncoder();
|
|
29
|
+
export function validateRule(rule) {
|
|
30
|
+
validateExpression(rule.expression);
|
|
31
|
+
const n = rule.outcomeLabels.length;
|
|
32
|
+
if (n < 2 || n > MAX_OUTCOMES)
|
|
33
|
+
throw new Error(`a market must have 2 to ${MAX_OUTCOMES} outcomes`);
|
|
34
|
+
if (new Set(rule.outcomeLabels).size !== n || rule.outcomeLabels.some((label) => !label.trim())) {
|
|
35
|
+
throw new Error("outcome labels must be unique and non-empty");
|
|
36
|
+
}
|
|
37
|
+
if (rule.outcomeLabels.some((label) => textEncoder.encode(label).byteLength > MAX_OUTCOME_LABEL_BYTES)) {
|
|
38
|
+
throw new Error(`outcome labels must be at most ${MAX_OUTCOME_LABEL_BYTES} UTF-8 bytes`);
|
|
39
|
+
}
|
|
40
|
+
if (rule.bands.length < 2 || rule.bands.length > MAX_BANDS)
|
|
41
|
+
throw new Error(`a market must have 2 to ${MAX_BANDS} outcome bands`);
|
|
42
|
+
if (rule.bands[0]?.lowerInclusive !== null || rule.bands.at(-1)?.upperExclusive !== null) {
|
|
43
|
+
throw new Error("outcome bands must cover every integer");
|
|
44
|
+
}
|
|
45
|
+
const used = new Set();
|
|
46
|
+
rule.bands.forEach((band, index) => {
|
|
47
|
+
if (!Number.isInteger(band.outcomeIndex) || band.outcomeIndex < 0 || band.outcomeIndex >= n) {
|
|
48
|
+
throw new Error("outcome band points to an invalid outcome");
|
|
49
|
+
}
|
|
50
|
+
used.add(band.outcomeIndex);
|
|
51
|
+
if (band.lowerInclusive !== null)
|
|
52
|
+
i64(band.lowerInclusive, `bands[${index}].lowerInclusive`);
|
|
53
|
+
if (band.upperExclusive !== null)
|
|
54
|
+
i64(band.upperExclusive, `bands[${index}].upperExclusive`);
|
|
55
|
+
if (band.lowerInclusive !== null && band.upperExclusive !== null && band.lowerInclusive >= band.upperExclusive) {
|
|
56
|
+
throw new Error("outcome band is empty");
|
|
57
|
+
}
|
|
58
|
+
if (index + 1 < rule.bands.length && band.upperExclusive !== rule.bands[index + 1]?.lowerInclusive) {
|
|
59
|
+
throw new Error("outcome bands must be ordered, contiguous, and non-overlapping");
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
if (used.size !== n)
|
|
63
|
+
throw new Error("every named outcome must own at least one band");
|
|
64
|
+
}
|
|
65
|
+
function u64(value, name) {
|
|
66
|
+
if (value < 0n || value > U64_MAX)
|
|
67
|
+
throw new Error(`${name} must fit in u64`);
|
|
68
|
+
}
|
|
69
|
+
function i64(value, name) {
|
|
70
|
+
if (value < I64_MIN || value > I64_MAX)
|
|
71
|
+
throw new Error(`${name} must fit in i64`);
|
|
72
|
+
}
|
|
73
|
+
function safeInteger(value, name) {
|
|
74
|
+
if (!Number.isSafeInteger(value))
|
|
75
|
+
throw new Error(`${name} must be a safe integer`);
|
|
76
|
+
}
|
|
77
|
+
function bps(value, name, maximum) {
|
|
78
|
+
if (!Number.isInteger(value) || value < 0 || value > maximum) {
|
|
79
|
+
throw new Error(`${name} must be an integer from 0 to ${maximum}`);
|
|
80
|
+
}
|
|
81
|
+
return BigInt(value);
|
|
82
|
+
}
|
|
83
|
+
export function validateMarketId(value) { u64(value, "market id"); }
|
|
84
|
+
export function validateTicketNonce(value) { u64(value, "ticket nonce"); }
|
|
85
|
+
export function validateFeeConfig(feeBps, tipBps) {
|
|
86
|
+
bps(feeBps, "feeBps", MAX_FEE_BPS);
|
|
87
|
+
bps(tipBps, "tipBps", MAX_TIP_BPS);
|
|
88
|
+
}
|
|
89
|
+
export function validateExpression(value) {
|
|
90
|
+
safeInteger(value.fixtureId, "fixtureId");
|
|
91
|
+
if (value.fixtureId <= 0)
|
|
92
|
+
throw new Error("fixtureId must be positive");
|
|
93
|
+
safeInteger(value.period, "period");
|
|
94
|
+
if (value.settlementMode !== "Terminal")
|
|
95
|
+
throw new Error("unsupported settlement mode");
|
|
96
|
+
const terms = [
|
|
97
|
+
[value.statAKey, value.statASide],
|
|
98
|
+
...(value.statBKey === null ? [] : [[value.statBKey, value.statBSide]]),
|
|
99
|
+
];
|
|
100
|
+
if ((value.statBKey === null) !== (value.statBSide === null) || (value.statBKey === null) !== (value.op === null)) {
|
|
101
|
+
throw new Error("the second stat, side, and operation must be supplied together");
|
|
102
|
+
}
|
|
103
|
+
if (value.op !== null && !["Add", "Sub", "Min"].includes(value.op))
|
|
104
|
+
throw new Error("unsupported expression operation");
|
|
105
|
+
for (const [key, side] of terms) {
|
|
106
|
+
safeInteger(key, "stat key");
|
|
107
|
+
if (key < 0 || key > 0xffff_ffff)
|
|
108
|
+
throw new Error("stat key must fit in u32");
|
|
109
|
+
const base = key % 1000;
|
|
110
|
+
const prefix = key - base;
|
|
111
|
+
const expectedPeriod = prefix === 0 ? 100 : prefix;
|
|
112
|
+
const expectedSide = [1, 3, 5, 7].includes(base) ? "Home" : [2, 4, 6, 8].includes(base) ? "Away" : null;
|
|
113
|
+
if (!VALID_PREFIXES.has(prefix) || expectedSide === null || expectedPeriod !== value.period || expectedSide !== side) {
|
|
114
|
+
throw new Error("expression stat key, side, and period do not match TxLINE");
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (value.statBKey === value.statAKey)
|
|
118
|
+
throw new Error("expression stats must be distinct");
|
|
119
|
+
}
|
|
120
|
+
export function validateMarket(params, now = Math.floor(Date.now() / 1000)) {
|
|
121
|
+
validateMarketId(params.id);
|
|
122
|
+
validateRule(params);
|
|
123
|
+
safeInteger(now, "now");
|
|
124
|
+
for (const [name, value] of [["entryDeadline", params.entryDeadline], ["resolveAt", params.resolveAt], ["voidAt", params.voidAt]]) {
|
|
125
|
+
safeInteger(value, name);
|
|
126
|
+
if (value <= 0)
|
|
127
|
+
throw new Error(`${name} must be positive`);
|
|
128
|
+
}
|
|
129
|
+
if (!(now < params.entryDeadline && params.entryDeadline <= params.resolveAt && params.resolveAt < params.voidAt)) {
|
|
130
|
+
throw new Error("expected now < entryDeadline <= resolveAt < voidAt");
|
|
131
|
+
}
|
|
132
|
+
validateFeeConfig(params.feeBps, params.tipBps);
|
|
133
|
+
}
|
|
134
|
+
export function settlement(pools, feeBps, tipBps) {
|
|
135
|
+
if (pools.length < 2 || pools.length > MAX_OUTCOMES)
|
|
136
|
+
throw new Error(`pools must contain 2 to ${MAX_OUTCOMES} outcomes`);
|
|
137
|
+
pools.forEach((value, index) => u64(value, `pools[${index}]`));
|
|
138
|
+
const total = pools.reduce((sum, pool) => sum + pool, 0n);
|
|
139
|
+
u64(total, "total");
|
|
140
|
+
validateFeeConfig(feeBps, tipBps);
|
|
141
|
+
const fee = total * BigInt(feeBps) / BPS;
|
|
142
|
+
const tip = total * BigInt(tipBps) / BPS;
|
|
143
|
+
return { total, fee, tip, net: total - fee - tip };
|
|
144
|
+
}
|
|
145
|
+
export function marketOdds(pools) {
|
|
146
|
+
const { total } = settlement(pools, 0, 0);
|
|
147
|
+
return pools.map((pool) => ({
|
|
148
|
+
probabilityBps: total === 0n ? 0 : Number(pool * BPS / total),
|
|
149
|
+
decimalOdds: pool === 0n ? null : `${total / pool}.${((total * 100n / pool) % 100n).toString().padStart(2, "0")}`,
|
|
150
|
+
}));
|
|
151
|
+
}
|
|
152
|
+
export function projectedPayout(stake, winningPool, pools, feeBps, tipBps) {
|
|
153
|
+
u64(stake, "stake");
|
|
154
|
+
u64(winningPool, "winningPool");
|
|
155
|
+
if (winningPool === 0n)
|
|
156
|
+
return null;
|
|
157
|
+
return stake * settlement(pools, feeBps, tipBps).net / winningPool;
|
|
158
|
+
}
|
|
159
|
+
export function validateStake(value) {
|
|
160
|
+
u64(value, "stake");
|
|
161
|
+
if (value < MIN_STAKE)
|
|
162
|
+
throw new Error("stake must be at least 1 whole settlement token");
|
|
163
|
+
}
|
|
164
|
+
export function statExpression(fixtureId, concept, side, period = "match") {
|
|
165
|
+
const sideIndex = side === "home" ? 0 : 1;
|
|
166
|
+
const key = PERIOD_PREFIX[period] + BASE[concept][sideIndex];
|
|
167
|
+
return {
|
|
168
|
+
fixtureId,
|
|
169
|
+
settlementMode: "Terminal",
|
|
170
|
+
period: PERIOD_VALUE[period],
|
|
171
|
+
statAKey: key,
|
|
172
|
+
statASide: side === "home" ? "Home" : "Away",
|
|
173
|
+
statBKey: null,
|
|
174
|
+
statBSide: null,
|
|
175
|
+
op: null,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
export function totalExpression(fixtureId, concept, period = "match") {
|
|
179
|
+
const [a, b] = BASE[concept];
|
|
180
|
+
const prefix = PERIOD_PREFIX[period];
|
|
181
|
+
return {
|
|
182
|
+
fixtureId,
|
|
183
|
+
settlementMode: "Terminal",
|
|
184
|
+
period: PERIOD_VALUE[period],
|
|
185
|
+
statAKey: prefix + a,
|
|
186
|
+
statASide: "Home",
|
|
187
|
+
statBKey: prefix + b,
|
|
188
|
+
statBSide: "Away",
|
|
189
|
+
op: "Add",
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
export function binaryExpression(fixtureId, concept, op, period = "match") {
|
|
193
|
+
const expression = totalExpression(fixtureId, concept, period);
|
|
194
|
+
return { ...expression, op };
|
|
195
|
+
}
|
|
196
|
+
export function resultExpression(fixtureId, period = "match") {
|
|
197
|
+
const prefix = PERIOD_PREFIX[period];
|
|
198
|
+
return {
|
|
199
|
+
fixtureId,
|
|
200
|
+
settlementMode: "Terminal",
|
|
201
|
+
period: PERIOD_VALUE[period],
|
|
202
|
+
statAKey: prefix + 1,
|
|
203
|
+
statASide: "Home",
|
|
204
|
+
statBKey: prefix + 2,
|
|
205
|
+
statBSide: "Away",
|
|
206
|
+
op: "Sub",
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function resultLikeExpression(fixtureId, concept) {
|
|
210
|
+
const [statAKey, statBKey] = BASE[concept];
|
|
211
|
+
return {
|
|
212
|
+
fixtureId,
|
|
213
|
+
settlementMode: "Terminal",
|
|
214
|
+
period: PERIOD_VALUE.match,
|
|
215
|
+
statAKey,
|
|
216
|
+
statASide: "Home",
|
|
217
|
+
statBKey,
|
|
218
|
+
statBSide: "Away",
|
|
219
|
+
op: "Sub",
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
export function bothTeamsExpression(fixtureId, concept = "goals", period = "match") {
|
|
223
|
+
return binaryExpression(fixtureId, concept, "Min", period);
|
|
224
|
+
}
|
|
225
|
+
export function thresholdRule(expression, comparison, threshold, labels = ["Yes", "No"]) {
|
|
226
|
+
i64(threshold, "threshold");
|
|
227
|
+
let bands;
|
|
228
|
+
if (comparison === "gt")
|
|
229
|
+
bands = [
|
|
230
|
+
{ lowerInclusive: null, upperExclusive: threshold + 1n, outcomeIndex: 1 },
|
|
231
|
+
{ lowerInclusive: threshold + 1n, upperExclusive: null, outcomeIndex: 0 },
|
|
232
|
+
];
|
|
233
|
+
else if (comparison === "gte")
|
|
234
|
+
bands = [
|
|
235
|
+
{ lowerInclusive: null, upperExclusive: threshold, outcomeIndex: 1 },
|
|
236
|
+
{ lowerInclusive: threshold, upperExclusive: null, outcomeIndex: 0 },
|
|
237
|
+
];
|
|
238
|
+
else if (comparison === "lt")
|
|
239
|
+
bands = [
|
|
240
|
+
{ lowerInclusive: null, upperExclusive: threshold, outcomeIndex: 0 },
|
|
241
|
+
{ lowerInclusive: threshold, upperExclusive: null, outcomeIndex: 1 },
|
|
242
|
+
];
|
|
243
|
+
else if (comparison === "lte")
|
|
244
|
+
bands = [
|
|
245
|
+
{ lowerInclusive: null, upperExclusive: threshold + 1n, outcomeIndex: 0 },
|
|
246
|
+
{ lowerInclusive: threshold + 1n, upperExclusive: null, outcomeIndex: 1 },
|
|
247
|
+
];
|
|
248
|
+
else
|
|
249
|
+
bands = [
|
|
250
|
+
{ lowerInclusive: null, upperExclusive: threshold, outcomeIndex: 1 },
|
|
251
|
+
{ lowerInclusive: threshold, upperExclusive: threshold + 1n, outcomeIndex: 0 },
|
|
252
|
+
{ lowerInclusive: threshold + 1n, upperExclusive: null, outcomeIndex: 1 },
|
|
253
|
+
];
|
|
254
|
+
return { expression, outcomeLabels: labels, bands };
|
|
255
|
+
}
|
|
256
|
+
export function resultRule(fixtureId, period = "match") {
|
|
257
|
+
return {
|
|
258
|
+
expression: resultExpression(fixtureId, period),
|
|
259
|
+
outcomeLabels: ["Away", "Draw", "Home"],
|
|
260
|
+
bands: [
|
|
261
|
+
{ lowerInclusive: null, upperExclusive: 0n, outcomeIndex: 0 },
|
|
262
|
+
{ lowerInclusive: 0n, upperExclusive: 1n, outcomeIndex: 1 },
|
|
263
|
+
{ lowerInclusive: 1n, upperExclusive: null, outcomeIndex: 2 },
|
|
264
|
+
],
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=market.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"market.js","sourceRoot":"","sources":["../src/market.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,WAAW,EACX,uBAAuB,EACvB,YAAY,EACZ,WAAW,EACX,SAAS,GACV,MAAM,YAAY,CAAC;AAEpB,MAAM,GAAG,GAAG,MAAO,CAAC;AACpB,MAAM,OAAO,GAAG,qBAA2B,CAAC;AAC5C,MAAM,OAAO,GAAG,CAAC,oBAA0B,CAAC;AAC5C,MAAM,OAAO,GAAG,oBAA0B,CAAC;AAC3C,MAAM,aAAa,GAA2B;IAC5C,KAAK,EAAE,CAAC;IACR,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;IACjB,qBAAqB,EAAE,IAAI;IAC3B,sBAAsB,EAAE,IAAI;IAC5B,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;CACjB,CAAC;AACF,MAAM,YAAY,GAA2B;IAC3C,KAAK,EAAE,GAAG;IACV,UAAU,EAAE,IAAI;IAChB,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;IACjB,qBAAqB,EAAE,IAAI;IAC3B,sBAAsB,EAAE,IAAI;IAC5B,SAAS,EAAE,IAAI;IACf,UAAU,EAAE,IAAI;CACjB,CAAC;AACF,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAW,CAAC;AAChG,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;AAWtC,MAAM,UAAU,YAAY,CAAC,IAAgB;IAC3C,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;IACpC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,WAAW,CAAC,CAAC;IACnG,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,uBAAuB,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,KAAK,CAAC,kCAAkC,uBAAuB,cAAc,CAAC,CAAC;IAC3F,CAAC;IACD,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,SAAS,gBAAgB,CAAC,CAAC;IAClI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,cAAc,KAAK,IAAI,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YAC5F,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,KAAK,kBAAkB,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI;YAAE,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,KAAK,kBAAkB,CAAC,CAAC;QAC7F,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YAC/G,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC;YACnG,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY;IACtC,IAAI,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;AAChF,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY;IACtC,IAAI,KAAK,GAAG,OAAO,IAAI,KAAK,GAAG,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,kBAAkB,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,WAAW,CAAC,KAAa,EAAE,IAAY;IAC9C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC;AACtF,CAAC;AAED,SAAS,GAAG,CAAC,KAAa,EAAE,IAAY,EAAE,OAAe;IACvD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,OAAO,EAAE,CAAC;QAC7D,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,iCAAiC,OAAO,EAAE,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,IAAU,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;AAClF,MAAM,UAAU,mBAAmB,CAAC,KAAa,IAAU,GAAG,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AAExF,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAc;IAC9D,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;IACnC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAuB;IACxD,WAAW,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC1C,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACxE,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACpC,IAAI,KAAK,CAAC,cAAc,KAAK,UAAU;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxF,MAAM,KAAK,GAAG;QACZ,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;QACjC,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;KAChC,CAAC;IAC1C,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAClH,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACxH,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAChC,WAAW,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAC7B,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;QACxB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;QAC1B,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;QACnD,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACxG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,YAAY,KAAK,IAAI,IAAI,cAAc,KAAK,KAAK,CAAC,MAAM,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;YACrH,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAoB,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;IACtF,gBAAgB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC5B,YAAY,CAAC,MAAM,CAAC,CAAC;IACrB,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACxB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,eAAe,EAAE,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,CAAU,EAAE,CAAC;QAC3I,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,IAAI,KAAK,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,mBAAmB,CAAC,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,aAAa,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAClH,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAe,EAAE,MAAc,EAAE,MAAc;IACxE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,WAAW,CAAC,CAAC;IACzH,KAAK,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC;IAC1D,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACzC,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAe;IACxC,MAAM,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC1B,cAAc,EAAE,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,GAAG,GAAG,GAAG,KAAK,CAAC;QAC7D,WAAW,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;KAClH,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa,EAAE,WAAmB,EAAE,KAAe,EAAE,MAAc,EAAE,MAAc;IACjH,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpB,GAAG,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;IAChC,IAAI,WAAW,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC;IACpC,OAAO,KAAK,GAAG,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,WAAW,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACpB,IAAI,KAAK,GAAG,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,SAAiB,EAAE,OAAsB,EAAE,IAAc,EAAE,SAAiB,OAAO;IAChH,MAAM,SAAS,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,aAAa,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IAC7D,OAAO;QACL,SAAS;QACT,cAAc,EAAE,UAAU;QAC1B,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,GAAG;QACb,SAAS,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;QAC5C,QAAQ,EAAE,IAAI;QACd,SAAS,EAAE,IAAI;QACf,EAAE,EAAE,IAAI;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,SAAiB,EAAE,OAAsB,EAAE,SAAiB,OAAO;IACjG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO;QACL,SAAS;QACT,cAAc,EAAE,UAAU;QAC1B,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,GAAG,CAAC;QACpB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM,GAAG,CAAC;QACpB,SAAS,EAAE,MAAM;QACjB,EAAE,EAAE,KAAK;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,SAAiB,EACjB,OAAsB,EACtB,EAAyB,EACzB,SAAiB,OAAO;IAExB,MAAM,UAAU,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC/D,OAAO,EAAE,GAAG,UAAU,EAAE,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAiB,EAAE,SAAiB,OAAO;IAC1E,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACrC,OAAO;QACL,SAAS;QACT,cAAc,EAAE,UAAU;QAC1B,MAAM,EAAE,YAAY,CAAC,MAAM,CAAC;QAC5B,QAAQ,EAAE,MAAM,GAAG,CAAC;QACpB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,MAAM,GAAG,CAAC;QACpB,SAAS,EAAE,MAAM;QACjB,EAAE,EAAE,KAAK;KACV,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,SAAiB,EAAE,OAAsB;IACrE,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3C,OAAO;QACL,SAAS;QACT,cAAc,EAAE,UAAU;QAC1B,MAAM,EAAE,YAAY,CAAC,KAAK;QAC1B,QAAQ;QACR,SAAS,EAAE,MAAM;QACjB,QAAQ;QACR,SAAS,EAAE,MAAM;QACjB,EAAE,EAAE,KAAK;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,SAAiB,EAAE,UAAyB,OAAO,EAAE,SAAiB,OAAO;IAC/G,OAAO,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,UAA4B,EAC5B,UAA+B,EAC/B,SAAiB,EACjB,SAA2B,CAAC,KAAK,EAAE,IAAI,CAAC;IAExC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5B,IAAI,KAAoB,CAAC;IACzB,IAAI,UAAU,KAAK,IAAI;QAAE,KAAK,GAAG;YAC/B,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;YACzE,EAAE,cAAc,EAAE,SAAS,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;SAC1E,CAAC;SACG,IAAI,UAAU,KAAK,KAAK;QAAE,KAAK,GAAG;YACrC,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE;YACpE,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;SACrE,CAAC;SACG,IAAI,UAAU,KAAK,IAAI;QAAE,KAAK,GAAG;YACpC,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE;YACpE,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;SACrE,CAAC;SACG,IAAI,UAAU,KAAK,KAAK;QAAE,KAAK,GAAG;YACrC,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;YACzE,EAAE,cAAc,EAAE,SAAS,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;SAC1E,CAAC;;QACG,KAAK,GAAG;YACX,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,EAAE;YACpE,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,GAAG,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;YAC9E,EAAE,cAAc,EAAE,SAAS,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;SAC1E,CAAC;IACF,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,SAAiB,OAAO;IACpE,OAAO;QACL,UAAU,EAAE,gBAAgB,CAAC,SAAS,EAAE,MAAM,CAAC;QAC/C,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;QACvC,KAAK,EAAE;YACL,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;YAC7D,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE;YAC3D,EAAE,cAAc,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,EAAE;SAC9D;KACF,CAAC;AACJ,CAAC"}
|
package/dist/merkle.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { ProofNode } from "./types.js";
|
|
2
|
+
export interface ScoreStat {
|
|
3
|
+
key: number;
|
|
4
|
+
value: number;
|
|
5
|
+
period: number;
|
|
6
|
+
}
|
|
7
|
+
export interface ScoresSummary {
|
|
8
|
+
fixtureId: bigint;
|
|
9
|
+
updateCount: number;
|
|
10
|
+
minTimestamp: bigint;
|
|
11
|
+
maxTimestamp: bigint;
|
|
12
|
+
eventStatsSubTreeRoot: number[];
|
|
13
|
+
}
|
|
14
|
+
export declare function statLeaf(s: ScoreStat): Uint8Array;
|
|
15
|
+
export declare function fixtureLeaf(s: ScoresSummary): Uint8Array;
|
|
16
|
+
export declare function combine(cur: Uint8Array, node: ProofNode): Uint8Array;
|
|
17
|
+
export declare function foldProof(leaf: Uint8Array, proof: ProofNode[]): Uint8Array;
|
|
18
|
+
export declare const toHex: (b: Uint8Array) => string;
|
|
19
|
+
/**
|
|
20
|
+
* Independent Tier-A walk: reproduce the anchored daily root from a stat-validation payload.
|
|
21
|
+
* Returns the segment checkpoints so callers (e.g. a keeper Tier-A alarm) can diff each level.
|
|
22
|
+
*/
|
|
23
|
+
export declare function verifyChain(v: {
|
|
24
|
+
statToProve: ScoreStat;
|
|
25
|
+
statToProve2?: ScoreStat;
|
|
26
|
+
eventStatRoot: number[];
|
|
27
|
+
statProof: ProofNode[];
|
|
28
|
+
statProof2?: ProofNode[];
|
|
29
|
+
subTreeProof: ProofNode[];
|
|
30
|
+
mainTreeProof: ProofNode[];
|
|
31
|
+
summary: {
|
|
32
|
+
fixtureId: number;
|
|
33
|
+
updateStats: {
|
|
34
|
+
updateCount: number;
|
|
35
|
+
minTimestamp: number;
|
|
36
|
+
maxTimestamp: number;
|
|
37
|
+
};
|
|
38
|
+
eventStatsSubTreeRoot: number[];
|
|
39
|
+
};
|
|
40
|
+
}): {
|
|
41
|
+
eventStatRoot: string;
|
|
42
|
+
statAMatch: boolean;
|
|
43
|
+
statBMatch: boolean;
|
|
44
|
+
seg1Match: boolean;
|
|
45
|
+
seg2Match: boolean;
|
|
46
|
+
dailyRoot: string;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=merkle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../src/merkle.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAc5C,MAAM,WAAW,SAAS;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACzE,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,EAAE,CAAC;CACjC;AAED,wBAAgB,QAAQ,CAAC,CAAC,EAAE,SAAS,GAAG,UAAU,CAEjD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,aAAa,GAAG,UAAU,CAMxD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,GAAG,UAAU,CAGpE;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,CAE1E;AAED,eAAO,MAAM,KAAK,GAAI,GAAG,UAAU,KAAG,MAA4E,CAAC;AAEnH;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,EAAE,CAAC;IACzB,YAAY,EAAE,SAAS,EAAE,CAAC;IAC1B,aAAa,EAAE,SAAS,EAAE,CAAC;IAC3B,OAAO,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE;YAAE,WAAW,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAC;YAAC,YAAY,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,qBAAqB,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACnJ,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CA2BjI"}
|
package/dist/merkle.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovered TxLINE scores Merkle primitives (R1-verified). Identical to the program's `verify.rs`
|
|
3
|
+
* and `scripts/ground-truth/merkle.ts`. Browser + node safe (uses js-sha3, no node:crypto).
|
|
4
|
+
*
|
|
5
|
+
* stat leaf = sha256( key:u32 LE ‖ value:i32 LE ‖ period:i32 LE )
|
|
6
|
+
* fixture leaf = sha256( 0x01 ‖ borsh(ScoresBatchSummary) )
|
|
7
|
+
* node(cur,sib) = isRightSibling ? sha256(cur ‖ sib) : sha256(sib ‖ cur)
|
|
8
|
+
*/
|
|
9
|
+
import { sha256 } from "@noble/hashes/sha256";
|
|
10
|
+
function concat(...parts) {
|
|
11
|
+
const len = parts.reduce((n, p) => n + p.length, 0);
|
|
12
|
+
const out = new Uint8Array(len);
|
|
13
|
+
let o = 0;
|
|
14
|
+
for (const p of parts) {
|
|
15
|
+
out.set(p, o);
|
|
16
|
+
o += p.length;
|
|
17
|
+
}
|
|
18
|
+
return out;
|
|
19
|
+
}
|
|
20
|
+
function u32le(n) { const b = new Uint8Array(4); new DataView(b.buffer).setUint32(0, n >>> 0, true); return b; }
|
|
21
|
+
function i32le(n) { const b = new Uint8Array(4); new DataView(b.buffer).setInt32(0, n, true); return b; }
|
|
22
|
+
function i64le(n) { const b = new Uint8Array(8); new DataView(b.buffer).setBigInt64(0, n, true); return b; }
|
|
23
|
+
export function statLeaf(s) {
|
|
24
|
+
return sha256(concat(u32le(s.key), i32le(s.value), i32le(s.period)));
|
|
25
|
+
}
|
|
26
|
+
export function fixtureLeaf(s) {
|
|
27
|
+
return sha256(concat(Uint8Array.of(0x01), i64le(s.fixtureId), i32le(s.updateCount), i64le(s.minTimestamp), i64le(s.maxTimestamp), Uint8Array.from(s.eventStatsSubTreeRoot)));
|
|
28
|
+
}
|
|
29
|
+
export function combine(cur, node) {
|
|
30
|
+
const sib = Uint8Array.from(node.hash);
|
|
31
|
+
return sha256(node.isRightSibling ? concat(cur, sib) : concat(sib, cur));
|
|
32
|
+
}
|
|
33
|
+
export function foldProof(leaf, proof) {
|
|
34
|
+
return proof.reduce((acc, n) => combine(acc, n), leaf);
|
|
35
|
+
}
|
|
36
|
+
export const toHex = (b) => Array.from(b).map((x) => x.toString(16).padStart(2, "0")).join("");
|
|
37
|
+
/**
|
|
38
|
+
* Independent Tier-A walk: reproduce the anchored daily root from a stat-validation payload.
|
|
39
|
+
* Returns the segment checkpoints so callers (e.g. a keeper Tier-A alarm) can diff each level.
|
|
40
|
+
*/
|
|
41
|
+
export function verifyChain(v) {
|
|
42
|
+
const eventStatRoot = foldProof(statLeaf(v.statToProve), v.statProof);
|
|
43
|
+
const expectedEventStatRoot = toHex(Uint8Array.from(v.eventStatRoot));
|
|
44
|
+
const statAMatch = toHex(eventStatRoot) === expectedEventStatRoot;
|
|
45
|
+
const hasSecondStat = v.statToProve2 != null;
|
|
46
|
+
const hasSecondProof = v.statProof2 != null;
|
|
47
|
+
const statBMatch = hasSecondStat === hasSecondProof && (!hasSecondStat || toHex(foldProof(statLeaf(v.statToProve2), v.statProof2)) === expectedEventStatRoot);
|
|
48
|
+
const seg1Match = statAMatch && statBMatch;
|
|
49
|
+
const afterSub = foldProof(eventStatRoot, v.subTreeProof);
|
|
50
|
+
const seg2Match = toHex(afterSub) === toHex(Uint8Array.from(v.summary.eventStatsSubTreeRoot));
|
|
51
|
+
const leaf = fixtureLeaf({
|
|
52
|
+
fixtureId: BigInt(v.summary.fixtureId),
|
|
53
|
+
updateCount: v.summary.updateStats.updateCount,
|
|
54
|
+
minTimestamp: BigInt(v.summary.updateStats.minTimestamp),
|
|
55
|
+
maxTimestamp: BigInt(v.summary.updateStats.maxTimestamp),
|
|
56
|
+
eventStatsSubTreeRoot: v.summary.eventStatsSubTreeRoot,
|
|
57
|
+
});
|
|
58
|
+
return {
|
|
59
|
+
eventStatRoot: toHex(eventStatRoot),
|
|
60
|
+
statAMatch,
|
|
61
|
+
statBMatch,
|
|
62
|
+
seg1Match,
|
|
63
|
+
seg2Match,
|
|
64
|
+
dailyRoot: toHex(foldProof(leaf, v.mainTreeProof)),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=merkle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merkle.js","sourceRoot":"","sources":["../src/merkle.ts"],"names":[],"mappings":"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"}
|
package/dist/pda.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PublicKey } from "@solana/web3.js";
|
|
2
|
+
export declare const slipProgramId: PublicKey;
|
|
3
|
+
export declare const txlineProgramId: PublicKey;
|
|
4
|
+
export declare function marketPda(creator: PublicKey, id: bigint): PublicKey;
|
|
5
|
+
export declare function ticketPda(market: PublicKey, owner: PublicKey, nonce: bigint): PublicKey;
|
|
6
|
+
export declare function ata(mint: PublicKey, owner: PublicKey): PublicKey;
|
|
7
|
+
export declare const vaultAta: typeof ata;
|
|
8
|
+
export declare function dailyScoresRootsPda(minTimestampMs: number): {
|
|
9
|
+
pda: PublicKey;
|
|
10
|
+
epochDay: number;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=pda.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pda.d.ts","sourceRoot":"","sources":["../src/pda.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAK5C,eAAO,MAAM,aAAa,WAAiC,CAAC;AAC5D,eAAO,MAAM,eAAe,WAA0C,CAAC;AAIvE,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,GAAG,SAAS,CAGnE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAGvF;AAED,wBAAgB,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAEhE;AAED,eAAO,MAAM,QAAQ,YAAM,CAAC;AAE5B,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,MAAM,GAAG;IAAE,GAAG,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAShG"}
|
package/dist/pda.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { BN } from "@coral-xyz/anchor";
|
|
2
|
+
import { PublicKey } from "@solana/web3.js";
|
|
3
|
+
import { ASSOCIATED_TOKEN_PROGRAM_ID, TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync } from "@solana/spl-token";
|
|
4
|
+
import { validateMarketId, validateTicketNonce } from "./market.js";
|
|
5
|
+
import { SLIP_PROGRAM_ID, TXLINE_DEVNET_PROGRAM_ID } from "./types.js";
|
|
6
|
+
export const slipProgramId = new PublicKey(SLIP_PROGRAM_ID);
|
|
7
|
+
export const txlineProgramId = new PublicKey(TXLINE_DEVNET_PROGRAM_ID);
|
|
8
|
+
const u64 = (value) => new BN(value.toString()).toArrayLike(Buffer, "le", 8);
|
|
9
|
+
export function marketPda(creator, id) {
|
|
10
|
+
validateMarketId(id);
|
|
11
|
+
return PublicKey.findProgramAddressSync([Buffer.from("market"), creator.toBuffer(), u64(id)], slipProgramId)[0];
|
|
12
|
+
}
|
|
13
|
+
export function ticketPda(market, owner, nonce) {
|
|
14
|
+
validateTicketNonce(nonce);
|
|
15
|
+
return PublicKey.findProgramAddressSync([Buffer.from("ticket"), market.toBuffer(), owner.toBuffer(), u64(nonce)], slipProgramId)[0];
|
|
16
|
+
}
|
|
17
|
+
export function ata(mint, owner) {
|
|
18
|
+
return getAssociatedTokenAddressSync(mint, owner, true, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID);
|
|
19
|
+
}
|
|
20
|
+
export const vaultAta = ata;
|
|
21
|
+
export function dailyScoresRootsPda(minTimestampMs) {
|
|
22
|
+
if (!Number.isSafeInteger(minTimestampMs) || minTimestampMs < 0)
|
|
23
|
+
throw new Error("minTimestampMs must be a non-negative safe integer");
|
|
24
|
+
const epochDay = Math.floor(minTimestampMs / 86_400_000);
|
|
25
|
+
if (epochDay > 0xffff)
|
|
26
|
+
throw new Error("TxLINE epoch day must fit in u16");
|
|
27
|
+
const [pda] = PublicKey.findProgramAddressSync([Buffer.from("daily_scores_roots"), new BN(epochDay).toArrayLike(Buffer, "le", 2)], txlineProgramId);
|
|
28
|
+
return { pda, epochDay };
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=pda.js.map
|
package/dist/pda.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pda.js","sourceRoot":"","sources":["../src/pda.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,mBAAmB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,6BAA6B,EAAE,MAAM,mBAAmB,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAC;AAEvE,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,SAAS,CAAC,wBAAwB,CAAC,CAAC;AAEvE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AAErF,MAAM,UAAU,SAAS,CAAC,OAAkB,EAAE,EAAU;IACtD,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACrB,OAAO,SAAS,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AAClH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAiB,EAAE,KAAgB,EAAE,KAAa;IAC1E,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3B,OAAO,SAAS,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;AACtI,CAAC;AAED,MAAM,UAAU,GAAG,CAAC,IAAe,EAAE,KAAgB;IACnD,OAAO,6BAA6B,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,2BAA2B,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAE5B,MAAM,UAAU,mBAAmB,CAAC,cAAsB;IACxD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,cAAc,CAAC,IAAI,cAAc,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACvI,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,UAAU,CAAC,CAAC;IACzD,IAAI,QAAQ,GAAG,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IAC3E,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,sBAAsB,CAC5C,CAAC,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAClF,eAAe,CAChB,CAAC;IACF,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC3B,CAAC"}
|