@kehtus/proportion-sdk 0.4.2 → 1.1.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 -21
- package/dist/abi/challengeAccount.d.ts +1855 -0
- package/dist/abi/challengeAccount.d.ts.map +1 -0
- package/dist/abi/challengeAccount.js +2365 -0
- package/dist/abi/challengeAccount.js.map +1 -0
- package/dist/abi/challengeFactory.d.ts +1351 -0
- package/dist/abi/challengeFactory.d.ts.map +1 -0
- package/dist/abi/challengeFactory.js +1727 -0
- package/dist/abi/challengeFactory.js.map +1 -0
- package/dist/abi/challengeVault.d.ts +1392 -0
- package/dist/abi/challengeVault.d.ts.map +1 -0
- package/dist/abi/challengeVault.js +1793 -0
- package/dist/abi/challengeVault.js.map +1 -0
- package/dist/abi/factory.d.ts +4 -0
- package/dist/abi/factory.d.ts.map +1 -1
- package/dist/abi/factory.js +5 -0
- package/dist/abi/factory.js.map +1 -1
- package/dist/abi/fundedAccount.d.ts +49 -20
- package/dist/abi/fundedAccount.d.ts.map +1 -1
- package/dist/abi/fundedAccount.js +62 -26
- package/dist/abi/fundedAccount.js.map +1 -1
- package/dist/abi/mainVault.d.ts +409 -64
- package/dist/abi/mainVault.d.ts.map +1 -1
- package/dist/abi/mainVault.js +523 -75
- package/dist/abi/mainVault.js.map +1 -1
- package/dist/abi/priceOracle.d.ts +497 -0
- package/dist/abi/priceOracle.d.ts.map +1 -0
- package/dist/abi/priceOracle.js +644 -0
- package/dist/abi/priceOracle.js.map +1 -0
- package/dist/account.d.ts.map +1 -1
- package/dist/account.js +6 -0
- package/dist/account.js.map +1 -1
- package/dist/challenge/account.d.ts +95 -0
- package/dist/challenge/account.d.ts.map +1 -0
- package/dist/challenge/account.js +375 -0
- package/dist/challenge/account.js.map +1 -0
- package/dist/challenge/api.d.ts +49 -0
- package/dist/challenge/api.d.ts.map +1 -0
- package/dist/challenge/api.js +173 -0
- package/dist/challenge/api.js.map +1 -0
- package/dist/challenge/factory.d.ts +151 -0
- package/dist/challenge/factory.d.ts.map +1 -0
- package/dist/challenge/factory.js +355 -0
- package/dist/challenge/factory.js.map +1 -0
- package/dist/challenge/intents.d.ts +137 -0
- package/dist/challenge/intents.d.ts.map +1 -0
- package/dist/challenge/intents.js +218 -0
- package/dist/challenge/intents.js.map +1 -0
- package/dist/challenge/oracle.d.ts +50 -0
- package/dist/challenge/oracle.d.ts.map +1 -0
- package/dist/challenge/oracle.js +117 -0
- package/dist/challenge/oracle.js.map +1 -0
- package/dist/challenge/types.d.ts +652 -0
- package/dist/challenge/types.d.ts.map +1 -0
- package/dist/challenge/types.js +64 -0
- package/dist/challenge/types.js.map +1 -0
- package/dist/challenge/vault.d.ts +87 -0
- package/dist/challenge/vault.d.ts.map +1 -0
- package/dist/challenge/vault.js +299 -0
- package/dist/challenge/vault.js.map +1 -0
- package/dist/constants.d.ts +14 -4
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +23 -4
- package/dist/constants.js.map +1 -1
- package/dist/factory.d.ts +1 -1
- package/dist/factory.d.ts.map +1 -1
- package/dist/factory.js +12 -0
- package/dist/factory.js.map +1 -1
- package/dist/forwarder.d.ts +58 -0
- package/dist/forwarder.d.ts.map +1 -0
- package/dist/forwarder.js +145 -0
- package/dist/forwarder.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -1
- package/dist/indexer.d.ts +52 -0
- package/dist/indexer.d.ts.map +1 -1
- package/dist/indexer.js +349 -145
- package/dist/indexer.js.map +1 -1
- package/dist/sdk.d.ts +18 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +85 -32
- package/dist/sdk.js.map +1 -1
- package/dist/types.d.ts +54 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +35 -2
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +86 -7
- package/dist/utils.js.map +1 -1
- package/dist/vault.d.ts +44 -5
- package/dist/vault.d.ts.map +1 -1
- package/dist/vault.js +138 -12
- package/dist/vault.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
// ── On-chain enums (order must match Solidity exactly) ──
|
|
2
|
+
/** ChallengeAccount.Phase */
|
|
3
|
+
export var ChallengePhase;
|
|
4
|
+
(function (ChallengePhase) {
|
|
5
|
+
ChallengePhase[ChallengePhase["Uninitialized"] = 0] = "Uninitialized";
|
|
6
|
+
ChallengePhase[ChallengePhase["Challenge"] = 1] = "Challenge";
|
|
7
|
+
ChallengePhase[ChallengePhase["Passed"] = 2] = "Passed";
|
|
8
|
+
ChallengePhase[ChallengePhase["PaperFunded"] = 3] = "PaperFunded";
|
|
9
|
+
ChallengePhase[ChallengePhase["Failed"] = 4] = "Failed";
|
|
10
|
+
ChallengePhase[ChallengePhase["Closed"] = 5] = "Closed";
|
|
11
|
+
ChallengePhase[ChallengePhase["Promoted"] = 6] = "Promoted";
|
|
12
|
+
})(ChallengePhase || (ChallengePhase = {}));
|
|
13
|
+
/** ChallengeAccount.FailReason (annotates PhaseChanged; None on non-failure transitions). */
|
|
14
|
+
export var ChallengeFailReason;
|
|
15
|
+
(function (ChallengeFailReason) {
|
|
16
|
+
ChallengeFailReason[ChallengeFailReason["None"] = 0] = "None";
|
|
17
|
+
ChallengeFailReason[ChallengeFailReason["Drawdown"] = 1] = "Drawdown";
|
|
18
|
+
ChallengeFailReason[ChallengeFailReason["Expired"] = 2] = "Expired";
|
|
19
|
+
})(ChallengeFailReason || (ChallengeFailReason = {}));
|
|
20
|
+
/** ChallengeAccount.ExitOrderKind */
|
|
21
|
+
export var ExitOrderKind;
|
|
22
|
+
(function (ExitOrderKind) {
|
|
23
|
+
ExitOrderKind[ExitOrderKind["StopLoss"] = 0] = "StopLoss";
|
|
24
|
+
ExitOrderKind[ExitOrderKind["TakeProfit"] = 1] = "TakeProfit";
|
|
25
|
+
})(ExitOrderKind || (ExitOrderKind = {}));
|
|
26
|
+
/** ChallengePricingLib.ChallengeType */
|
|
27
|
+
export var ChallengeType;
|
|
28
|
+
(function (ChallengeType) {
|
|
29
|
+
ChallengeType[ChallengeType["OneStep"] = 0] = "OneStep";
|
|
30
|
+
ChallengeType[ChallengeType["TwoStep"] = 1] = "TwoStep";
|
|
31
|
+
})(ChallengeType || (ChallengeType = {}));
|
|
32
|
+
const phaseLabels = {
|
|
33
|
+
[ChallengePhase.Uninitialized]: "Uninitialized",
|
|
34
|
+
[ChallengePhase.Challenge]: "Challenge",
|
|
35
|
+
[ChallengePhase.Passed]: "Passed",
|
|
36
|
+
[ChallengePhase.PaperFunded]: "PaperFunded",
|
|
37
|
+
[ChallengePhase.Failed]: "Failed",
|
|
38
|
+
[ChallengePhase.Closed]: "Closed",
|
|
39
|
+
[ChallengePhase.Promoted]: "Promoted",
|
|
40
|
+
};
|
|
41
|
+
const labelPhases = {
|
|
42
|
+
Uninitialized: ChallengePhase.Uninitialized,
|
|
43
|
+
Challenge: ChallengePhase.Challenge,
|
|
44
|
+
Passed: ChallengePhase.Passed,
|
|
45
|
+
PaperFunded: ChallengePhase.PaperFunded,
|
|
46
|
+
Failed: ChallengePhase.Failed,
|
|
47
|
+
Closed: ChallengePhase.Closed,
|
|
48
|
+
Promoted: ChallengePhase.Promoted,
|
|
49
|
+
};
|
|
50
|
+
export function phaseToLabel(phase) {
|
|
51
|
+
return phaseLabels[phase];
|
|
52
|
+
}
|
|
53
|
+
export function labelToPhase(label) {
|
|
54
|
+
return labelPhases[label];
|
|
55
|
+
}
|
|
56
|
+
const failReasonLabels = {
|
|
57
|
+
[ChallengeFailReason.None]: "None",
|
|
58
|
+
[ChallengeFailReason.Drawdown]: "Drawdown",
|
|
59
|
+
[ChallengeFailReason.Expired]: "Expired",
|
|
60
|
+
};
|
|
61
|
+
export function failReasonToLabel(reason) {
|
|
62
|
+
return failReasonLabels[reason];
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/challenge/types.ts"],"names":[],"mappings":"AAEA,2DAA2D;AAE3D,6BAA6B;AAC7B,MAAM,CAAN,IAAY,cAQX;AARD,WAAY,cAAc;IACxB,qEAAa,CAAA;IACb,6DAAS,CAAA;IACT,uDAAM,CAAA;IACN,iEAAW,CAAA;IACX,uDAAM,CAAA;IACN,uDAAM,CAAA;IACN,2DAAQ,CAAA;AACV,CAAC,EARW,cAAc,KAAd,cAAc,QAQzB;AAED,6FAA6F;AAC7F,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,6DAAI,CAAA;IACJ,qEAAQ,CAAA;IACR,mEAAO,CAAA;AACT,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B;AAED,qCAAqC;AACrC,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,yDAAQ,CAAA;IACR,6DAAU,CAAA;AACZ,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AAED,wCAAwC;AACxC,MAAM,CAAN,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,uDAAO,CAAA;IACP,uDAAO,CAAA;AACT,CAAC,EAHW,aAAa,KAAb,aAAa,QAGxB;AA2BD,MAAM,WAAW,GAAgD;IAC/D,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,eAAe;IAC/C,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,WAAW;IACvC,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,QAAQ;IACjC,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,aAAa;IAC3C,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,QAAQ;IACjC,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,QAAQ;IACjC,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,UAAU;CACtC,CAAC;AAEF,MAAM,WAAW,GAAgD;IAC/D,aAAa,EAAE,cAAc,CAAC,aAAa;IAC3C,SAAS,EAAE,cAAc,CAAC,SAAS;IACnC,MAAM,EAAE,cAAc,CAAC,MAAM;IAC7B,WAAW,EAAE,cAAc,CAAC,WAAW;IACvC,MAAM,EAAE,cAAc,CAAC,MAAM;IAC7B,MAAM,EAAE,cAAc,CAAC,MAAM;IAC7B,QAAQ,EAAE,cAAc,CAAC,QAAQ;CAClC,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,KAAqB;IAChD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAA0B;IACrD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,gBAAgB,GAA0D;IAC9E,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,MAAM;IAClC,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,UAAU;IAC1C,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,SAAS;CACzC,CAAC;AAEF,MAAM,UAAU,iBAAiB,CAAC,MAA2B;IAC3D,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type Address, type Chain, type Hash, type PublicClient, type WalletClient } from "viem";
|
|
2
|
+
import type { BuilderBankStatus, PayoutState, QueuedPayout, RegisteredChallengeAccount } from "./types.js";
|
|
3
|
+
type AddressResolver = Address | (() => Promise<Address>);
|
|
4
|
+
/**
|
|
5
|
+
* ChallengeVault module — the sole USDC custodian of the B-book: builder banks,
|
|
6
|
+
* fee routing, and the FIFO payout queue.
|
|
7
|
+
*
|
|
8
|
+
* Writes here are builder-facing operations (bank deposits/withdrawals, A-book promotion,
|
|
9
|
+
* manual queue draining). Governance (upgrades, factory allow-list, setMainVault) is
|
|
10
|
+
* multisig territory and intentionally not covered.
|
|
11
|
+
*/
|
|
12
|
+
export declare class ChallengeVaultModule {
|
|
13
|
+
private publicClient;
|
|
14
|
+
private walletClient;
|
|
15
|
+
private chain;
|
|
16
|
+
private addressResolver;
|
|
17
|
+
private addressPromise;
|
|
18
|
+
private resolvedUsdc;
|
|
19
|
+
constructor(publicClient: PublicClient, walletClient: WalletClient | undefined, chain: Chain, addressResolver: AddressResolver, usdc?: Address);
|
|
20
|
+
/**
|
|
21
|
+
* Resolved ChallengeVault proxy address (lazy when constructed with a resolver).
|
|
22
|
+
* The in-flight promise is cached so concurrent callers share one RPC lookup;
|
|
23
|
+
* a failed resolution is cleared so the next call retries.
|
|
24
|
+
*/
|
|
25
|
+
getAddress(): Promise<Address>;
|
|
26
|
+
private requireWallet;
|
|
27
|
+
private write;
|
|
28
|
+
/**
|
|
29
|
+
* Full builder bank snapshot: balance/debt/delinquency plus the coverage and
|
|
30
|
+
* anti-drain views the frontend must surface (pendingPassedAccounts blocks new
|
|
31
|
+
* sales at 50; pendingPayoutCount caps queued payouts at 30).
|
|
32
|
+
*/
|
|
33
|
+
getBuilderBank(builder: Address): Promise<BuilderBankStatus>;
|
|
34
|
+
/** Per-account payout accounting (lifetime paid, in-flight pending, cooldown anchor, live queue entry). */
|
|
35
|
+
getPayoutState(account: Address): Promise<PayoutState>;
|
|
36
|
+
getRegisteredAccount(account: Address): Promise<RegisteredChallengeAccount>;
|
|
37
|
+
getQueuedPayout(queueId: bigint): Promise<QueuedPayout>;
|
|
38
|
+
/**
|
|
39
|
+
* The builder's live FIFO payout queue, head first (index 0 = next to be drained).
|
|
40
|
+
*
|
|
41
|
+
* On-chain the queue array is append-only: drained entries stay in place and
|
|
42
|
+
* `builderQueueHead` marks the live window start, so `builderQueueLength` counts
|
|
43
|
+
* every entry EVER queued and the live claims are `[head, length)`. Three dependent
|
|
44
|
+
* RPC round trips (head/length → ids → entries) — the live window is capped at
|
|
45
|
+
* MAX_PENDING_PAYOUTS = 30 so each is small; polling UIs should prefer
|
|
46
|
+
* `indexer.getPayoutQueue` (one GraphQL query) over this on-chain read.
|
|
47
|
+
*/
|
|
48
|
+
getBuilderQueue(builder: Address): Promise<QueuedPayout[]>;
|
|
49
|
+
/** Off-chain solvency monitor: usdc.balanceOf(vault) >= totalBuilderBalance. */
|
|
50
|
+
isTokenSolvent(): Promise<boolean>;
|
|
51
|
+
/** Static vault wiring + protocol-wide totals and rule constants. */
|
|
52
|
+
getConfig(): Promise<{
|
|
53
|
+
usdc: Address;
|
|
54
|
+
mainVault: Address;
|
|
55
|
+
owner: Address;
|
|
56
|
+
pendingOwner: Address;
|
|
57
|
+
totalBuilderBalance: bigint;
|
|
58
|
+
factoryActivationDelay: bigint;
|
|
59
|
+
payoutCooldown: bigint;
|
|
60
|
+
maxPayoutTotalBps: bigint;
|
|
61
|
+
maxSinglePayoutBps: bigint;
|
|
62
|
+
maxDailyPayoutBps: bigint;
|
|
63
|
+
maxPendingPayouts: bigint;
|
|
64
|
+
maxPendingPassedAccounts: bigint;
|
|
65
|
+
coverageMultiplier: bigint;
|
|
66
|
+
}>;
|
|
67
|
+
private getUsdc;
|
|
68
|
+
/** Approve the ChallengeVault to pull USDC (needed before depositBuilderBalance). */
|
|
69
|
+
approveUsdc(amount: bigint): Promise<Hash>;
|
|
70
|
+
/** Fund a builder's B-book bank (anyone can deposit on a builder's behalf). */
|
|
71
|
+
depositBuilderBalance(builder: Address, amount: bigint): Promise<Hash>;
|
|
72
|
+
/** Instant withdrawal of the caller's available bank balance. */
|
|
73
|
+
withdrawBuilderBalance(amount: bigint): Promise<Hash>;
|
|
74
|
+
/**
|
|
75
|
+
* Atomic A-book promotion of a Passed challenge: debits the builder bank by the
|
|
76
|
+
* MainVault activation fee and calls MainVault.activateFundedFor. The single mutable
|
|
77
|
+
* B-book → A-book boundary.
|
|
78
|
+
*/
|
|
79
|
+
promotePassedToAbook(account: Address): Promise<Hash>;
|
|
80
|
+
/**
|
|
81
|
+
* Drain the FIFO head as builder liquidity allows. Permissionless; the challenge-service
|
|
82
|
+
* keeper runs it automatically — this is the manual "process my queue now" button.
|
|
83
|
+
*/
|
|
84
|
+
executeNextQueuedPayout(builder: Address): Promise<Hash>;
|
|
85
|
+
}
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=vault.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.d.ts","sourceRoot":"","sources":["../../src/challenge/vault.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,OAAO,EACZ,KAAK,KAAK,EACV,KAAK,IAAI,EACT,KAAK,YAAY,EACjB,KAAK,YAAY,EAElB,MAAM,MAAM,CAAC;AAGd,OAAO,KAAK,EACV,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,0BAA0B,EAC3B,MAAM,YAAY,CAAC;AAEpB,KAAK,eAAe,GAAG,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAE1D;;;;;;;GAOG;AACH,qBAAa,oBAAoB;IAK7B,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,eAAe;IAPzB,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,YAAY,CAAsB;gBAGhC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,GAAG,SAAS,EACtC,KAAK,EAAE,KAAK,EACZ,eAAe,EAAE,eAAe,EACxC,IAAI,CAAC,EAAE,OAAO;IAMhB;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAWpC,OAAO,CAAC,aAAa;YASP,KAAK;IAWnB;;;;OAIG;IACG,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAuClE,2GAA2G;IACrG,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAWtD,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,0BAA0B,CAAC;IAW3E,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAW7D;;;;;;;;;OASG;IACG,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IA4ChE,gFAAgF;IAC1E,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IASxC,qEAAqE;IAC/D,SAAS,IAAI,OAAO,CAAC;QACzB,IAAI,EAAE,OAAO,CAAC;QACd,SAAS,EAAE,OAAO,CAAC;QACnB,KAAK,EAAE,OAAO,CAAC;QACf,YAAY,EAAE,OAAO,CAAC;QACtB,mBAAmB,EAAE,MAAM,CAAC;QAC5B,sBAAsB,EAAE,MAAM,CAAC;QAC/B,cAAc,EAAE,MAAM,CAAC;QACvB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,kBAAkB,EAAE,MAAM,CAAC;QAC3B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,CAAC;QAC1B,wBAAwB,EAAE,MAAM,CAAC;QACjC,kBAAkB,EAAE,MAAM,CAAC;KAC5B,CAAC;YAwCY,OAAO;IAWrB,qFAAqF;IAC/E,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUhD,+EAA+E;IACzE,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5E,iEAAiE;IAC3D,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D;;;;OAIG;IACG,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D;;;OAGG;IACG,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAS/D"}
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import { erc20Abi, } from "viem";
|
|
2
|
+
import { challengeVaultAbi } from "../abi/challengeVault.js";
|
|
3
|
+
import { assertAllSuccess } from "../utils.js";
|
|
4
|
+
/**
|
|
5
|
+
* ChallengeVault module — the sole USDC custodian of the B-book: builder banks,
|
|
6
|
+
* fee routing, and the FIFO payout queue.
|
|
7
|
+
*
|
|
8
|
+
* Writes here are builder-facing operations (bank deposits/withdrawals, A-book promotion,
|
|
9
|
+
* manual queue draining). Governance (upgrades, factory allow-list, setMainVault) is
|
|
10
|
+
* multisig territory and intentionally not covered.
|
|
11
|
+
*/
|
|
12
|
+
export class ChallengeVaultModule {
|
|
13
|
+
publicClient;
|
|
14
|
+
walletClient;
|
|
15
|
+
chain;
|
|
16
|
+
addressResolver;
|
|
17
|
+
addressPromise;
|
|
18
|
+
resolvedUsdc;
|
|
19
|
+
constructor(publicClient, walletClient, chain, addressResolver, usdc) {
|
|
20
|
+
this.publicClient = publicClient;
|
|
21
|
+
this.walletClient = walletClient;
|
|
22
|
+
this.chain = chain;
|
|
23
|
+
this.addressResolver = addressResolver;
|
|
24
|
+
if (typeof addressResolver === "string")
|
|
25
|
+
this.addressPromise = Promise.resolve(addressResolver);
|
|
26
|
+
this.resolvedUsdc = usdc;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Resolved ChallengeVault proxy address (lazy when constructed with a resolver).
|
|
30
|
+
* The in-flight promise is cached so concurrent callers share one RPC lookup;
|
|
31
|
+
* a failed resolution is cleared so the next call retries.
|
|
32
|
+
*/
|
|
33
|
+
async getAddress() {
|
|
34
|
+
if (!this.addressPromise) {
|
|
35
|
+
const resolver = this.addressResolver;
|
|
36
|
+
this.addressPromise = resolver().catch((err) => {
|
|
37
|
+
this.addressPromise = undefined;
|
|
38
|
+
throw err;
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return this.addressPromise;
|
|
42
|
+
}
|
|
43
|
+
requireWallet() {
|
|
44
|
+
if (!this.walletClient)
|
|
45
|
+
throw new Error("WalletClient required for write operations");
|
|
46
|
+
const walletChainId = this.walletClient.chain?.id;
|
|
47
|
+
if (walletChainId !== undefined && walletChainId !== this.chain.id) {
|
|
48
|
+
throw new Error(`WalletClient chain mismatch: expected ${this.chain.id}, got ${walletChainId}`);
|
|
49
|
+
}
|
|
50
|
+
return this.walletClient;
|
|
51
|
+
}
|
|
52
|
+
async write(params) {
|
|
53
|
+
const wallet = this.requireWallet();
|
|
54
|
+
const account = wallet.account;
|
|
55
|
+
if (!account)
|
|
56
|
+
throw new Error("WalletClient has no account");
|
|
57
|
+
return wallet.writeContract({ ...params, chain: this.chain, account });
|
|
58
|
+
}
|
|
59
|
+
// ── READS ───────────────────────────────────────────
|
|
60
|
+
/**
|
|
61
|
+
* Full builder bank snapshot: balance/debt/delinquency plus the coverage and
|
|
62
|
+
* anti-drain views the frontend must surface (pendingPassedAccounts blocks new
|
|
63
|
+
* sales at 50; pendingPayoutCount caps queued payouts at 30).
|
|
64
|
+
*/
|
|
65
|
+
async getBuilderBank(builder) {
|
|
66
|
+
const address = await this.getAddress();
|
|
67
|
+
const contract = { address, abi: challengeVaultAbi };
|
|
68
|
+
const results = await this.publicClient.multicall({
|
|
69
|
+
contracts: [
|
|
70
|
+
{ ...contract, functionName: "books", args: [builder] },
|
|
71
|
+
{ ...contract, functionName: "builderRisks", args: [builder] },
|
|
72
|
+
{ ...contract, functionName: "builderExposure", args: [builder] },
|
|
73
|
+
{ ...contract, functionName: "requiredCoverage", args: [builder] },
|
|
74
|
+
{ ...contract, functionName: "payoutLiquidity", args: [builder] },
|
|
75
|
+
{ ...contract, functionName: "shortfall", args: [builder] },
|
|
76
|
+
{ ...contract, functionName: "pendingPassedAccounts", args: [builder] },
|
|
77
|
+
{ ...contract, functionName: "builderPendingPayoutCount", args: [builder] },
|
|
78
|
+
],
|
|
79
|
+
});
|
|
80
|
+
const r = assertAllSuccess(results);
|
|
81
|
+
const book = r[0];
|
|
82
|
+
const risks = r[1];
|
|
83
|
+
return {
|
|
84
|
+
builder,
|
|
85
|
+
balance: book[0],
|
|
86
|
+
pendingPayouts: book[1],
|
|
87
|
+
delinquentSince: book[2],
|
|
88
|
+
exposure: r[2],
|
|
89
|
+
requiredCoverage: r[3],
|
|
90
|
+
payoutLiquidity: r[4],
|
|
91
|
+
shortfall: r[5],
|
|
92
|
+
pendingPassedAccounts: r[6],
|
|
93
|
+
pendingPayoutCount: r[7],
|
|
94
|
+
activeChallengeExposure6: risks[0],
|
|
95
|
+
passedExposure6: risks[1],
|
|
96
|
+
paperFundedExposure6: risks[2],
|
|
97
|
+
queuedPayoutExposure6: risks[3],
|
|
98
|
+
payoutDay: risks[4],
|
|
99
|
+
paidToday6: risks[5],
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** Per-account payout accounting (lifetime paid, in-flight pending, cooldown anchor, live queue entry). */
|
|
103
|
+
async getPayoutState(account) {
|
|
104
|
+
const address = await this.getAddress();
|
|
105
|
+
const [totalPaidGross6, pendingGross6, lastPayoutAt, queueId] = await this.publicClient.readContract({
|
|
106
|
+
address,
|
|
107
|
+
abi: challengeVaultAbi,
|
|
108
|
+
functionName: "payoutState",
|
|
109
|
+
args: [account],
|
|
110
|
+
});
|
|
111
|
+
return { totalPaidGross6, pendingGross6, lastPayoutAt, queueId };
|
|
112
|
+
}
|
|
113
|
+
async getRegisteredAccount(account) {
|
|
114
|
+
const address = await this.getAddress();
|
|
115
|
+
const [builder, trader, allocation6, maxPayoutTotal6, registered] = await this.publicClient.readContract({
|
|
116
|
+
address,
|
|
117
|
+
abi: challengeVaultAbi,
|
|
118
|
+
functionName: "accounts",
|
|
119
|
+
args: [account],
|
|
120
|
+
});
|
|
121
|
+
return { builder, trader, allocation6, maxPayoutTotal6, registered };
|
|
122
|
+
}
|
|
123
|
+
async getQueuedPayout(queueId) {
|
|
124
|
+
const address = await this.getAddress();
|
|
125
|
+
const [account, trader, remainingGross6, remainingExposure6] = await this.publicClient.readContract({
|
|
126
|
+
address,
|
|
127
|
+
abi: challengeVaultAbi,
|
|
128
|
+
functionName: "queuedPayouts",
|
|
129
|
+
args: [queueId],
|
|
130
|
+
});
|
|
131
|
+
return { queueId, account, trader, remainingGross6, remainingExposure6 };
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* The builder's live FIFO payout queue, head first (index 0 = next to be drained).
|
|
135
|
+
*
|
|
136
|
+
* On-chain the queue array is append-only: drained entries stay in place and
|
|
137
|
+
* `builderQueueHead` marks the live window start, so `builderQueueLength` counts
|
|
138
|
+
* every entry EVER queued and the live claims are `[head, length)`. Three dependent
|
|
139
|
+
* RPC round trips (head/length → ids → entries) — the live window is capped at
|
|
140
|
+
* MAX_PENDING_PAYOUTS = 30 so each is small; polling UIs should prefer
|
|
141
|
+
* `indexer.getPayoutQueue` (one GraphQL query) over this on-chain read.
|
|
142
|
+
*/
|
|
143
|
+
async getBuilderQueue(builder) {
|
|
144
|
+
const address = await this.getAddress();
|
|
145
|
+
const contract = { address, abi: challengeVaultAbi };
|
|
146
|
+
const headLength = await this.publicClient.multicall({
|
|
147
|
+
contracts: [
|
|
148
|
+
{ ...contract, functionName: "builderQueueHead", args: [builder] },
|
|
149
|
+
{ ...contract, functionName: "builderQueueLength", args: [builder] },
|
|
150
|
+
],
|
|
151
|
+
});
|
|
152
|
+
const [head, length] = assertAllSuccess(headLength, ["builderQueueHead", "builderQueueLength"]);
|
|
153
|
+
if (head >= length)
|
|
154
|
+
return [];
|
|
155
|
+
const idResults = await this.publicClient.multicall({
|
|
156
|
+
contracts: Array.from({ length: Number(length - head) }, (_, i) => ({
|
|
157
|
+
...contract,
|
|
158
|
+
functionName: "builderQueueAt",
|
|
159
|
+
args: [builder, head + BigInt(i)],
|
|
160
|
+
})),
|
|
161
|
+
});
|
|
162
|
+
const queueIds = assertAllSuccess(idResults);
|
|
163
|
+
const entryResults = await this.publicClient.multicall({
|
|
164
|
+
contracts: queueIds.map((queueId) => ({
|
|
165
|
+
...contract,
|
|
166
|
+
functionName: "queuedPayouts",
|
|
167
|
+
args: [queueId],
|
|
168
|
+
})),
|
|
169
|
+
});
|
|
170
|
+
const entries = assertAllSuccess(entryResults);
|
|
171
|
+
return entries.map((raw, i) => {
|
|
172
|
+
const [account, trader, remainingGross6, remainingExposure6] = raw;
|
|
173
|
+
return {
|
|
174
|
+
queueId: queueIds[i],
|
|
175
|
+
account,
|
|
176
|
+
trader,
|
|
177
|
+
remainingGross6,
|
|
178
|
+
remainingExposure6,
|
|
179
|
+
};
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/** Off-chain solvency monitor: usdc.balanceOf(vault) >= totalBuilderBalance. */
|
|
183
|
+
async isTokenSolvent() {
|
|
184
|
+
const address = await this.getAddress();
|
|
185
|
+
return this.publicClient.readContract({
|
|
186
|
+
address,
|
|
187
|
+
abi: challengeVaultAbi,
|
|
188
|
+
functionName: "tokenSolvent",
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** Static vault wiring + protocol-wide totals and rule constants. */
|
|
192
|
+
async getConfig() {
|
|
193
|
+
const address = await this.getAddress();
|
|
194
|
+
const contract = { address, abi: challengeVaultAbi };
|
|
195
|
+
const results = await this.publicClient.multicall({
|
|
196
|
+
contracts: [
|
|
197
|
+
{ ...contract, functionName: "usdc" },
|
|
198
|
+
{ ...contract, functionName: "mainVault" },
|
|
199
|
+
{ ...contract, functionName: "owner" },
|
|
200
|
+
{ ...contract, functionName: "pendingOwner" },
|
|
201
|
+
{ ...contract, functionName: "totalBuilderBalance" },
|
|
202
|
+
{ ...contract, functionName: "factoryActivationDelay" },
|
|
203
|
+
{ ...contract, functionName: "PAYOUT_COOLDOWN" },
|
|
204
|
+
{ ...contract, functionName: "MAX_PAYOUT_TOTAL_BPS" },
|
|
205
|
+
{ ...contract, functionName: "MAX_SINGLE_PAYOUT_BPS" },
|
|
206
|
+
{ ...contract, functionName: "MAX_DAILY_PAYOUT_BPS" },
|
|
207
|
+
{ ...contract, functionName: "MAX_PENDING_PAYOUTS" },
|
|
208
|
+
{ ...contract, functionName: "MAX_PENDING_PASSED_ACCOUNTS" },
|
|
209
|
+
{ ...contract, functionName: "COVERAGE_MULTIPLIER" },
|
|
210
|
+
],
|
|
211
|
+
});
|
|
212
|
+
const r = assertAllSuccess(results);
|
|
213
|
+
return {
|
|
214
|
+
usdc: r[0],
|
|
215
|
+
mainVault: r[1],
|
|
216
|
+
owner: r[2],
|
|
217
|
+
pendingOwner: r[3],
|
|
218
|
+
totalBuilderBalance: r[4],
|
|
219
|
+
factoryActivationDelay: r[5],
|
|
220
|
+
payoutCooldown: r[6],
|
|
221
|
+
maxPayoutTotalBps: r[7],
|
|
222
|
+
maxSinglePayoutBps: r[8],
|
|
223
|
+
maxDailyPayoutBps: r[9],
|
|
224
|
+
maxPendingPayouts: r[10],
|
|
225
|
+
maxPendingPassedAccounts: r[11],
|
|
226
|
+
coverageMultiplier: r[12],
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
// ── BUILDER WRITES ──────────────────────────────────
|
|
230
|
+
async getUsdc() {
|
|
231
|
+
if (this.resolvedUsdc)
|
|
232
|
+
return this.resolvedUsdc;
|
|
233
|
+
const address = await this.getAddress();
|
|
234
|
+
this.resolvedUsdc = await this.publicClient.readContract({
|
|
235
|
+
address,
|
|
236
|
+
abi: challengeVaultAbi,
|
|
237
|
+
functionName: "usdc",
|
|
238
|
+
});
|
|
239
|
+
return this.resolvedUsdc;
|
|
240
|
+
}
|
|
241
|
+
/** Approve the ChallengeVault to pull USDC (needed before depositBuilderBalance). */
|
|
242
|
+
async approveUsdc(amount) {
|
|
243
|
+
const [vault, usdc] = await Promise.all([this.getAddress(), this.getUsdc()]);
|
|
244
|
+
return this.write({
|
|
245
|
+
address: usdc,
|
|
246
|
+
abi: erc20Abi,
|
|
247
|
+
functionName: "approve",
|
|
248
|
+
args: [vault, amount],
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
/** Fund a builder's B-book bank (anyone can deposit on a builder's behalf). */
|
|
252
|
+
async depositBuilderBalance(builder, amount) {
|
|
253
|
+
const address = await this.getAddress();
|
|
254
|
+
return this.write({
|
|
255
|
+
address,
|
|
256
|
+
abi: challengeVaultAbi,
|
|
257
|
+
functionName: "depositBuilderBalance",
|
|
258
|
+
args: [builder, amount],
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
/** Instant withdrawal of the caller's available bank balance. */
|
|
262
|
+
async withdrawBuilderBalance(amount) {
|
|
263
|
+
const address = await this.getAddress();
|
|
264
|
+
return this.write({
|
|
265
|
+
address,
|
|
266
|
+
abi: challengeVaultAbi,
|
|
267
|
+
functionName: "withdrawBuilderBalance",
|
|
268
|
+
args: [amount],
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Atomic A-book promotion of a Passed challenge: debits the builder bank by the
|
|
273
|
+
* MainVault activation fee and calls MainVault.activateFundedFor. The single mutable
|
|
274
|
+
* B-book → A-book boundary.
|
|
275
|
+
*/
|
|
276
|
+
async promotePassedToAbook(account) {
|
|
277
|
+
const address = await this.getAddress();
|
|
278
|
+
return this.write({
|
|
279
|
+
address,
|
|
280
|
+
abi: challengeVaultAbi,
|
|
281
|
+
functionName: "promotePassedToAbook",
|
|
282
|
+
args: [account],
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Drain the FIFO head as builder liquidity allows. Permissionless; the challenge-service
|
|
287
|
+
* keeper runs it automatically — this is the manual "process my queue now" button.
|
|
288
|
+
*/
|
|
289
|
+
async executeNextQueuedPayout(builder) {
|
|
290
|
+
const address = await this.getAddress();
|
|
291
|
+
return this.write({
|
|
292
|
+
address,
|
|
293
|
+
abi: challengeVaultAbi,
|
|
294
|
+
functionName: "executeNextQueuedPayout",
|
|
295
|
+
args: [builder],
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=vault.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault.js","sourceRoot":"","sources":["../../src/challenge/vault.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,GAQT,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAU/C;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IAKrB;IACA;IACA;IACA;IAPF,cAAc,CAA+B;IAC7C,YAAY,CAAsB;IAE1C,YACU,YAA0B,EAC1B,YAAsC,EACtC,KAAY,EACZ,eAAgC,EACxC,IAAc;QAJN,iBAAY,GAAZ,YAAY,CAAc;QAC1B,iBAAY,GAAZ,YAAY,CAA0B;QACtC,UAAK,GAAL,KAAK,CAAO;QACZ,oBAAe,GAAf,eAAe,CAAiB;QAGxC,IAAI,OAAO,eAAe,KAAK,QAAQ;YAAE,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAChG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAyC,CAAC;YAChE,IAAI,CAAC,cAAc,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBAC7C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;gBAChC,MAAM,GAAG,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QACtF,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,EAAE,CAAC;QAClD,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,KAAK,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC,CAAC;QAClG,CAAC;QACD,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,KAAK,CACjB,MAA2F;QAE3F,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC,aAAa,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAA6B,CAAC,CAAC;IACpG,CAAC;IAED,uDAAuD;IAEvD;;;;OAIG;IACH,KAAK,CAAC,cAAc,CAAC,OAAgB;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAW,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YAChD,SAAS,EAAE;gBACT,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBACvD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBAC9D,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBACjE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBAClE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBACjE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBAC3D,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBACvE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,2BAA2B,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;aAC5E;SACF,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAsC,CAAC;QACvD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAA8D,CAAC;QAEhF,OAAO;YACL,OAAO;YACP,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YAChB,cAAc,EAAE,IAAI,CAAC,CAAC,CAAC;YACvB,eAAe,EAAE,IAAI,CAAC,CAAC,CAAC;YACxB,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAW;YACxB,gBAAgB,EAAE,CAAC,CAAC,CAAC,CAAW;YAChC,eAAe,EAAE,CAAC,CAAC,CAAC,CAAW;YAC/B,SAAS,EAAE,CAAC,CAAC,CAAC,CAAW;YACzB,qBAAqB,EAAE,CAAC,CAAC,CAAC,CAAW;YACrC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAW;YAClC,wBAAwB,EAAE,KAAK,CAAC,CAAC,CAAC;YAClC,eAAe,EAAE,KAAK,CAAC,CAAC,CAAC;YACzB,oBAAoB,EAAE,KAAK,CAAC,CAAC,CAAC;YAC9B,qBAAqB,EAAE,KAAK,CAAC,CAAC,CAAC;YAC/B,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;YACnB,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;SACrB,CAAC;IACJ,CAAC;IAED,2GAA2G;IAC3G,KAAK,CAAC,cAAc,CAAC,OAAgB;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACnG,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,aAAa;YAC3B,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,OAAgB;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACvG,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,UAAU;YACxB,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,CAAC,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YAClG,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,eAAe;YAC7B,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB,CAAC,CAAC;QACH,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,EAAE,CAAC;IAC3E,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,eAAe,CAAC,OAAgB;QACpC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAW,CAAC;QAE9D,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACnD,SAAS,EAAE;gBACT,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;gBAClE,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,oBAAoB,EAAE,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;aACrE;SACF,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,UAAU,EAAE,CAAC,kBAAkB,EAAE,oBAAoB,CAAC,CAA8B,CAAC;QAC7H,IAAI,IAAI,IAAI,MAAM;YAAE,OAAO,EAAE,CAAC;QAE9B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YAClD,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClE,GAAG,QAAQ;gBACX,YAAY,EAAE,gBAAgB;gBAC9B,IAAI,EAAE,CAAC,OAAO,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;aACxB,CAAA,CAAC;SACb,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAsB,CAAC;QAElE,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YACrD,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACpC,GAAG,QAAQ;gBACX,YAAY,EAAE,eAAe;gBAC7B,IAAI,EAAE,CAAC,OAAO,CAAC;aACN,CAAA,CAAC;SACb,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAE/C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;YAC5B,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,kBAAkB,CAAC,GAC1D,GAAkD,CAAC;YACrD,OAAO;gBACL,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;gBACpB,OAAO;gBACP,MAAM;gBACN,eAAe;gBACf,kBAAkB;aACnB,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAChF,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACpC,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,cAAc;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,KAAK,CAAC,SAAS;QAeb,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,iBAAiB,EAAW,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC;YAChD,SAAS,EAAE;gBACT,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE;gBACrC,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE;gBAC1C,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE;gBACtC,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE;gBAC7C,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,qBAAqB,EAAE;gBACpD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,wBAAwB,EAAE;gBACvD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,iBAAiB,EAAE;gBAChD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,sBAAsB,EAAE;gBACrD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,uBAAuB,EAAE;gBACtD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,sBAAsB,EAAE;gBACrD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,qBAAqB,EAAE;gBACpD,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,6BAA6B,EAAE;gBAC5D,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,qBAAqB,EAAE;aACrD;SACF,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO;YACL,IAAI,EAAE,CAAC,CAAC,CAAC,CAAY;YACrB,SAAS,EAAE,CAAC,CAAC,CAAC,CAAY;YAC1B,KAAK,EAAE,CAAC,CAAC,CAAC,CAAY;YACtB,YAAY,EAAE,CAAC,CAAC,CAAC,CAAY;YAC7B,mBAAmB,EAAE,CAAC,CAAC,CAAC,CAAW;YACnC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAW;YACtC,cAAc,EAAE,CAAC,CAAC,CAAC,CAAW;YAC9B,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAW;YACjC,kBAAkB,EAAE,CAAC,CAAC,CAAC,CAAW;YAClC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAW;YACjC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAW;YAClC,wBAAwB,EAAE,CAAC,CAAC,EAAE,CAAW;YACzC,kBAAkB,EAAE,CAAC,CAAC,EAAE,CAAW;SACpC,CAAC;IACJ,CAAC;IAED,uDAAuD;IAE/C,KAAK,CAAC,OAAO;QACnB,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC;QAChD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,YAAY,CAAC;YACvD,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,MAAM;SACrB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED,qFAAqF;IACrF,KAAK,CAAC,WAAW,CAAC,MAAc;QAC9B,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,SAAS;YACvB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;SACtB,CAAC,CAAC;IACL,CAAC;IAED,+EAA+E;IAC/E,KAAK,CAAC,qBAAqB,CAAC,OAAgB,EAAE,MAAc;QAC1D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,uBAAuB;YACrC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC;SACxB,CAAC,CAAC;IACL,CAAC;IAED,iEAAiE;IACjE,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,wBAAwB;YACtC,IAAI,EAAE,CAAC,MAAM,CAAC;SACf,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,oBAAoB,CAAC,OAAgB;QACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,sBAAsB;YACpC,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,uBAAuB,CAAC,OAAgB;QAC5C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC;YAChB,OAAO;YACP,GAAG,EAAE,iBAAiB;YACtB,YAAY,EAAE,yBAAyB;YACvC,IAAI,EAAE,CAAC,OAAO,CAAC;SAChB,CAAC,CAAC;IACL,CAAC;CACF"}
|
package/dist/constants.d.ts
CHANGED
|
@@ -20,16 +20,26 @@ export declare const hyperEvm: {
|
|
|
20
20
|
};
|
|
21
21
|
export declare const ADDRESSES: {
|
|
22
22
|
readonly MAIN_VAULT: "0xaC98618D06D0787D43353308286cDBa8A7aD4a8D";
|
|
23
|
-
readonly FORWARDER: "
|
|
23
|
+
readonly FORWARDER: "0xaf8370E399eb657114C4d82988169845b1B32694";
|
|
24
24
|
readonly USDC: "0xb88339CB7199b77E23DB6E890353E22632Ba630f";
|
|
25
25
|
};
|
|
26
|
+
export declare const CHALLENGE_ADDRESSES: {
|
|
27
|
+
readonly CHALLENGE_FACTORY: "0xc90Ab435B104e3E7eF580d5516d4F1B0912dFccC";
|
|
28
|
+
readonly CHALLENGE_VAULT: "0x405EFbC832323393a91127a1b83AE36B9eEC6b4D";
|
|
29
|
+
readonly CHALLENGE_PRICE_ORACLE: "0x1366f0954c601BAe7fB84b9242295293AE2C61F4";
|
|
30
|
+
readonly CHALLENGE_ACCOUNT_IMPL: "0x6DeA37698b1f8EdFCE1E86Db7EF5C3A6D13bBE2E";
|
|
31
|
+
};
|
|
26
32
|
export declare const BPS = 10000n;
|
|
27
33
|
export declare const MIN_DRAWDOWN_BPS = 500;
|
|
28
34
|
export declare const MAX_DRAWDOWN_BPS = 2500;
|
|
29
|
-
export declare const
|
|
30
|
-
export declare const PROTOCOL_FEE_BPS = 1000n;
|
|
35
|
+
export declare const PROTOCOL_FEE_BPS = 5000n;
|
|
31
36
|
export declare const OWNER_PROFIT_BPS = 8000n;
|
|
32
37
|
export declare const PROTOCOL_PROFIT_BPS = 700n;
|
|
38
|
+
export declare const SUBSCRIPTION_PROTOCOL_BPS = 1500n;
|
|
39
|
+
export declare const NON_OWNER_PROFIT_BPS = 2000n;
|
|
40
|
+
export declare const BUILDER_PROFIT_BPS_DEFAULT = 1400n;
|
|
41
|
+
export declare const BUILDER_PAYBACK_PROTOCOL_BPS_DEFAULT = 300n;
|
|
42
|
+
export declare const BUILDER_PAYBACK_FRACTION_BPS_DEFAULT = 5000n;
|
|
33
43
|
export declare const BUILDER_LEVERAGE = 10n;
|
|
34
44
|
export declare const MAX_UTILIZATION_BPS = 8000n;
|
|
35
45
|
export declare const MAX_SINGLE_ACCOUNT_BPS = 1000n;
|
|
@@ -41,7 +51,7 @@ export declare const BRIDGE_DELAY = 30;
|
|
|
41
51
|
export declare const CHECKPOINT_INTERVAL = 86400;
|
|
42
52
|
export declare const PROFITABLE_DAYS_REQUIRED = 3;
|
|
43
53
|
export declare const MIN_PROFIT_BPS = 70;
|
|
44
|
-
export declare const INSTANT_WITHDRAW_PROFIT_BPS =
|
|
54
|
+
export declare const INSTANT_WITHDRAW_PROFIT_BPS = 100;
|
|
45
55
|
export declare const MIN_WITHDRAW_AMOUNT = 1000000n;
|
|
46
56
|
export declare const HWM_PROFIT_LOCK_BPS = 3000;
|
|
47
57
|
export declare const MAX_LEVERAGE = 5;
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,MAAM,CAAC;AAE5B,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAQK,CAAC;AAE3B,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAGX,eAAO,MAAM,GAAG,SAAU,CAAC;AAC3B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,MAAM,CAAC;AAE5B,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;CAQK,CAAC;AAE3B,eAAO,MAAM,SAAS;;;;CAIZ,CAAC;AAIX,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAC;AAGX,eAAO,MAAM,GAAG,SAAU,CAAC;AAC3B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,gBAAgB,OAAO,CAAC;AACrC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,eAAO,MAAM,gBAAgB,QAAQ,CAAC;AACtC,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,yBAAyB,QAAQ,CAAC;AAI/C,eAAO,MAAM,oBAAoB,QAAQ,CAAC;AAC1C,eAAO,MAAM,0BAA0B,QAAQ,CAAC;AAChD,eAAO,MAAM,oCAAoC,OAAO,CAAC;AACzD,eAAO,MAAM,oCAAoC,QAAQ,CAAC;AAC1D,eAAO,MAAM,gBAAgB,MAAM,CAAC;AACpC,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AACzC,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAG5C,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,aAAa,IAAI,CAAC;AAC/B,eAAO,MAAM,mBAAmB,OAAO,CAAC;AAIxC,eAAO,MAAM,mBAAmB,QAAa,CAAC;AAC9C,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,mBAAmB,QAAQ,CAAC;AAGzC,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAC/C,eAAO,MAAM,mBAAmB,WAAa,CAAC;AAC9C,eAAO,MAAM,mBAAmB,OAAO,CAAC;AACxC,eAAO,MAAM,YAAY,IAAI,CAAC"}
|
package/dist/constants.js
CHANGED
|
@@ -10,17 +10,31 @@ export const hyperEvm = {
|
|
|
10
10
|
};
|
|
11
11
|
export const ADDRESSES = {
|
|
12
12
|
MAIN_VAULT: "0xaC98618D06D0787D43353308286cDBa8A7aD4a8D",
|
|
13
|
-
FORWARDER: "
|
|
13
|
+
FORWARDER: "0xaf8370E399eb657114C4d82988169845b1B32694",
|
|
14
14
|
USDC: "0xb88339CB7199b77E23DB6E890353E22632Ba630f",
|
|
15
15
|
};
|
|
16
|
+
// Challenge / B-book deployment (hyperevm 2026-06-26, EVM/deployment-challenge-hyperevm.json).
|
|
17
|
+
// CHALLENGE_FACTORY is the stable root: vault/oracle/implementation are read from it on-chain.
|
|
18
|
+
export const CHALLENGE_ADDRESSES = {
|
|
19
|
+
CHALLENGE_FACTORY: "0xc90Ab435B104e3E7eF580d5516d4F1B0912dFccC",
|
|
20
|
+
CHALLENGE_VAULT: "0x405EFbC832323393a91127a1b83AE36B9eEC6b4D",
|
|
21
|
+
CHALLENGE_PRICE_ORACLE: "0x1366f0954c601BAe7fB84b9242295293AE2C61F4",
|
|
22
|
+
CHALLENGE_ACCOUNT_IMPL: "0x6DeA37698b1f8EdFCE1E86Db7EF5C3A6D13bBE2E",
|
|
23
|
+
};
|
|
16
24
|
// BPS
|
|
17
25
|
export const BPS = 10000n;
|
|
18
26
|
export const MIN_DRAWDOWN_BPS = 500;
|
|
19
27
|
export const MAX_DRAWDOWN_BPS = 2500;
|
|
20
|
-
export const
|
|
21
|
-
export const PROTOCOL_FEE_BPS = 1000n;
|
|
28
|
+
export const PROTOCOL_FEE_BPS = 5000n;
|
|
22
29
|
export const OWNER_PROFIT_BPS = 8000n;
|
|
23
30
|
export const PROTOCOL_PROFIT_BPS = 700n;
|
|
31
|
+
export const SUBSCRIPTION_PROTOCOL_BPS = 1500n; // 15% of subscription fee to protocol
|
|
32
|
+
// Builder profit-share (activation-fee payback). Trader always keeps OWNER_PROFIT_BPS (80%);
|
|
33
|
+
// during payback the builder cut + protocol cut must fit the 20% non-owner pool.
|
|
34
|
+
export const NON_OWNER_PROFIT_BPS = 2000n; // 20% — owner+builder+protocol+vault cap for setters
|
|
35
|
+
export const BUILDER_PROFIT_BPS_DEFAULT = 1400n; // 14% builder cut during payback
|
|
36
|
+
export const BUILDER_PAYBACK_PROTOCOL_BPS_DEFAULT = 300n; // 3% protocol cut during payback (vs 7% normal)
|
|
37
|
+
export const BUILDER_PAYBACK_FRACTION_BPS_DEFAULT = 5000n; // target = 50% of the activation fee
|
|
24
38
|
export const BUILDER_LEVERAGE = 10n;
|
|
25
39
|
export const MAX_UTILIZATION_BPS = 8000n;
|
|
26
40
|
export const MAX_SINGLE_ACCOUNT_BPS = 1000n;
|
|
@@ -36,8 +50,13 @@ export const CHECKPOINT_INTERVAL = 86400;
|
|
|
36
50
|
// Trading rules
|
|
37
51
|
export const PROFITABLE_DAYS_REQUIRED = 3;
|
|
38
52
|
export const MIN_PROFIT_BPS = 70;
|
|
39
|
-
export const INSTANT_WITHDRAW_PROFIT_BPS =
|
|
53
|
+
export const INSTANT_WITHDRAW_PROFIT_BPS = 100; // 1% of accountSize
|
|
40
54
|
export const MIN_WITHDRAW_AMOUNT = 1000000n; // $1 in 6dec
|
|
41
55
|
export const HWM_PROFIT_LOCK_BPS = 3000; // lock 30% of profit growth into HWM
|
|
42
56
|
export const MAX_LEVERAGE = 5;
|
|
57
|
+
// Challenge / B-book rule constants are intentionally NOT mirrored here: ChallengeVault is
|
|
58
|
+
// UUPS-upgradeable and the ChallengeAccount implementation is swappable on the factory, so
|
|
59
|
+
// hardcoded copies would drift silently. Read them live instead:
|
|
60
|
+
// ChallengeVaultModule.getConfig() — payout cooldown/caps, coverage, queue limits
|
|
61
|
+
// ChallengeAccountModule.getAccountConstants() — challenge duration, min profit bar, taker fee
|
|
43
62
|
//# sourceMappingURL=constants.js.map
|
package/dist/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAE5B,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,EAAE,EAAE,GAAG;IACP,IAAI,EAAE,UAAU;IAChB,cAAc,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;IAC9D,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,iCAAiC,CAAC,EAAE,EAAE;IACnE,SAAS,EAAE;QACT,UAAU,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE;KACtE;CACuB,CAAC;AAE3B,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,4CAA4C;IACxD,SAAS,EAAE,4CAA4C;IACvD,IAAI,EAAE,4CAA4C;CAC1C,CAAC;AAEX,MAAM;AACN,MAAM,CAAC,MAAM,GAAG,GAAG,MAAO,CAAC;AAC3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AACpC,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AACrC,MAAM,CAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"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"}
|
package/dist/factory.d.ts
CHANGED
package/dist/factory.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../src/factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,OAAO,EACZ,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AAId,qBAAa,aAAa;IAEtB,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,cAAc;gBADd,YAAY,EAAE,YAAY,EAC1B,cAAc,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;YAG9C,iBAAiB;IAW/B,OAAO,CAAC,kBAAkB;YAWZ,eAAe;IAgBvB,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlE,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7C,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAUlD,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAU9C,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAO1D,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAUxE,gBAAgB,CAAC,OAAO,GAAE,MAAgB,GAAG,OAAO,CAAC,MAAM,CAAC;IA4E5D,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA2B9D,SAAS,IAAI,OAAO,CAAC;QACzB,cAAc,EAAE,OAAO,CAAC;QACxB,KAAK,EAAE,OAAO,CAAC;QACf,YAAY,EAAE,OAAO,CAAC;QACtB,IAAI,EAAE,OAAO,CAAC;QACd,KAAK,EAAE,OAAO,CAAC;KAChB,CAAC;CAsBH"}
|
package/dist/factory.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BaseError, ContractFunctionRevertedError, ContractFunctionZeroDataError, } from "viem";
|
|
1
2
|
import { factoryAbi } from "./abi/factory.js";
|
|
2
3
|
import { assertAllSuccess } from "./utils.js";
|
|
3
4
|
export class FactoryModule {
|
|
@@ -12,7 +13,18 @@ export class FactoryModule {
|
|
|
12
13
|
return this.factoryAddress;
|
|
13
14
|
return this.factoryAddress();
|
|
14
15
|
}
|
|
16
|
+
// allAccounts(uint256) is a plain public array getter — the only revert the CALL itself
|
|
17
|
+
// can produce is the out-of-bounds panic, so any decoded contract revert means "index past
|
|
18
|
+
// the end". Detect by viem error class (message text varies by RPC/viem version — e.g.
|
|
19
|
+
// 'The contract function "allAccounts" reverted.' matches none of the legacy patterns);
|
|
20
|
+
// transport/RPC failures produce neither cause class and still bubble. The message regex
|
|
21
|
+
// stays as a fallback for non-viem-shaped errors.
|
|
15
22
|
isOutOfBoundsError(error) {
|
|
23
|
+
if (error instanceof BaseError) {
|
|
24
|
+
const revert = error.walk((e) => e instanceof ContractFunctionRevertedError || e instanceof ContractFunctionZeroDataError);
|
|
25
|
+
if (revert)
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
16
28
|
const message = error instanceof Error ? error.message : String(error);
|
|
17
29
|
return /out of bounds|execution reverted|returned no data|position out of bounds/i.test(message);
|
|
18
30
|
}
|