@panoptic-eng/sdk 1.0.49 → 1.0.51
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/dist/cow/index.js.map +1 -1
- package/dist/{cow-DMX9ebPk.js → cow-CSSKPknb.js} +1 -1
- package/dist/deployments.d.ts +12 -4
- package/dist/deployments.d.ts.map +1 -1
- package/dist/deployments.js +78 -10
- package/dist/deployments.js.map +1 -1
- package/dist/{greeks-9aTE-DwO.js → greeks-CNi1-cnp.js} +39 -16
- package/dist/index.d.ts +518 -71
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +724 -91
- package/dist/index.js.map +1 -1
- package/dist/{irm-mySi_YMF.js → irm-BJaJSUjF.js} +80 -12
- package/dist/panoptic/v2/greeks/index.d.ts +12 -1
- package/dist/panoptic/v2/greeks/index.d.ts.map +1 -1
- package/dist/panoptic/v2/greeks/index.js +39 -16
- package/dist/panoptic/v2/greeks/index.js.map +1 -1
- package/dist/panoptic/v2/index.d.ts +1336 -74
- package/dist/panoptic/v2/index.d.ts.map +1 -1
- package/dist/panoptic/v2/index.js +20322 -18660
- package/dist/panoptic/v2/index.js.map +1 -1
- package/dist/panoptic/v2/react-public.d.ts +1518 -240
- package/dist/panoptic/v2/react-public.d.ts.map +1 -1
- package/dist/panoptic/v2/react-public.js +11518 -9319
- package/dist/panoptic/v2/react-public.js.map +1 -1
- package/dist/{rates-CDLIUGDz.js → rates-COAJpKRd.js} +612 -73
- package/dist/{router-45ulPnWe.js → router-B-I1eACz.js} +5 -43
- package/dist/router-BSS7HKd2.js +837 -0
- package/dist/{transactionFees-DUm6ilXB.js → transactionFees-DE-Whxab.js} +24 -8
- package/dist/uniswap/index.d.ts +465 -215
- package/dist/uniswap/index.d.ts.map +1 -1
- package/dist/uniswap/index.js +1799 -1076
- package/dist/uniswap/index.js.map +1 -1
- package/dist/{v2-DshssxX4.js → v2-zF6b01PI.js} +2488 -1596
- package/dist/vault-transaction-fees.d.ts +9 -4
- package/dist/vault-transaction-fees.d.ts.map +1 -1
- package/dist/vault-transaction-fees.js +24 -8
- package/dist/vault-transaction-fees.js.map +1 -1
- package/dist/{writes-2reV_omF.js → writes-D1zN0v9x.js} +4 -3
- package/dist/zodiac/index.d.ts +51 -7
- package/dist/zodiac/index.d.ts.map +1 -1
- package/dist/zodiac/index.js +154 -2
- package/dist/zodiac/index.js.map +1 -1
- package/package.json +2 -1
- package/dist/router-B2jY9Nyb.js +0 -312
|
@@ -3,6 +3,7 @@ import { Chain, Client, Transport } from "viem";
|
|
|
3
3
|
//#region src/hypoVault/transactionFees.d.ts
|
|
4
4
|
declare const MIN_VAULT_PRIORITY_FEE_PER_GAS = 100000000n;
|
|
5
5
|
declare const MAX_VAULT_PRIORITY_FEE_PER_GAS = 3000000000n;
|
|
6
|
+
declare const MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS = 8000000000n;
|
|
6
7
|
declare const MAX_VAULT_TRANSACTION_GAS_COST = 15000000000000000n;
|
|
7
8
|
type VaultTransactionFeeQuote = {
|
|
8
9
|
maxFeePerGas: bigint;
|
|
@@ -51,7 +52,7 @@ declare class VaultTransactionGasCostLimitError extends Error {
|
|
|
51
52
|
});
|
|
52
53
|
}
|
|
53
54
|
declare class VaultTransactionReplacementLimitError extends Error {
|
|
54
|
-
readonly code: 'GasCostCapExceeded';
|
|
55
|
+
readonly code: 'GasCostCapExceeded' | 'PriorityFeeCapExceeded';
|
|
55
56
|
readonly requiredMaxFeePerGas: bigint;
|
|
56
57
|
readonly requiredMaxPriorityFeePerGas: bigint;
|
|
57
58
|
readonly maximumAffordableFeePerGas: bigint;
|
|
@@ -62,7 +63,7 @@ declare class VaultTransactionReplacementLimitError extends Error {
|
|
|
62
63
|
requiredMaxPriorityFeePerGas,
|
|
63
64
|
maximumAffordableFeePerGas
|
|
64
65
|
}: {
|
|
65
|
-
code: 'GasCostCapExceeded';
|
|
66
|
+
code: 'GasCostCapExceeded' | 'PriorityFeeCapExceeded';
|
|
66
67
|
gasLimit: bigint;
|
|
67
68
|
requiredMaxFeePerGas: bigint;
|
|
68
69
|
requiredMaxPriorityFeePerGas: bigint;
|
|
@@ -72,11 +73,15 @@ declare class VaultTransactionReplacementLimitError extends Error {
|
|
|
72
73
|
declare function getVaultTransactionReplacementFeeQuote({
|
|
73
74
|
originalQuote,
|
|
74
75
|
historicalQuote,
|
|
75
|
-
gasLimit
|
|
76
|
+
gasLimit,
|
|
77
|
+
finalReplacement,
|
|
78
|
+
staleBoundsReplacement
|
|
76
79
|
}: {
|
|
77
80
|
originalQuote: Pick<VaultTransactionFeeQuote, 'maxFeePerGas' | 'maxPriorityFeePerGas'>;
|
|
78
81
|
historicalQuote: VaultDeltaHedgeFeeQuote;
|
|
79
82
|
gasLimit: bigint;
|
|
83
|
+
finalReplacement?: boolean;
|
|
84
|
+
staleBoundsReplacement?: boolean;
|
|
80
85
|
}): VaultDeltaHedgeFeeQuote;
|
|
81
86
|
declare function applyVaultTransactionGasCostLimit(quote: VaultTransactionFeeQuote, gasLimit: bigint): VaultTransactionFeeQuote;
|
|
82
87
|
declare function bufferVaultTransactionGasEstimate(gasEstimate: bigint): bigint;
|
|
@@ -97,5 +102,5 @@ declare function getVaultDeltaHedgeHistoricalFeeQuote<chain extends Chain | unde
|
|
|
97
102
|
* back immediately to the rolling historical p25 quote.
|
|
98
103
|
*/
|
|
99
104
|
declare function getVaultDeltaHedgeInitialFeeQuote<chain extends Chain | undefined>(client: Client<Transport, chain>): Promise<VaultDeltaHedgeFeeQuote>; //#endregion
|
|
100
|
-
export { MAX_VAULT_PRIORITY_FEE_PER_GAS, MAX_VAULT_TRANSACTION_GAS_COST, MIN_VAULT_PRIORITY_FEE_PER_GAS, VaultDeltaHedgeFeeQuote, VaultSignedTransactionFeeCaps, VaultSignedTransactionFeeValidationResult, VaultTransactionFeeEstimationError, VaultTransactionFeeQuote, VaultTransactionGasCostLimitError, VaultTransactionReplacementLimitError, applyVaultTransactionGasCostLimit, bufferVaultTransactionGasEstimate, getVaultDeltaHedgeHistoricalFeeQuote, getVaultDeltaHedgeInitialFeeQuote, getVaultTransactionFeeQuote, getVaultTransactionReplacementFeeQuote, validateVaultSignedTransactionFeeCaps };
|
|
105
|
+
export { MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS, MAX_VAULT_PRIORITY_FEE_PER_GAS, MAX_VAULT_TRANSACTION_GAS_COST, MIN_VAULT_PRIORITY_FEE_PER_GAS, VaultDeltaHedgeFeeQuote, VaultSignedTransactionFeeCaps, VaultSignedTransactionFeeValidationResult, VaultTransactionFeeEstimationError, VaultTransactionFeeQuote, VaultTransactionGasCostLimitError, VaultTransactionReplacementLimitError, applyVaultTransactionGasCostLimit, bufferVaultTransactionGasEstimate, getVaultDeltaHedgeHistoricalFeeQuote, getVaultDeltaHedgeInitialFeeQuote, getVaultTransactionFeeQuote, getVaultTransactionReplacementFeeQuote, validateVaultSignedTransactionFeeCaps };
|
|
101
106
|
//# sourceMappingURL=vault-transaction-fees.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-transaction-fees.d.ts","names":["Chain","Client","Transport","MIN_VAULT_PRIORITY_FEE_PER_GAS","MAX_VAULT_PRIORITY_FEE_PER_GAS","MAX_VAULT_TRANSACTION_GAS_COST","VaultTransactionFeeQuote","VaultDeltaHedgeFeeQuote","VaultSignedTransactionFeeCaps","VaultSignedTransactionFeeValidationResult","VaultTransactionFeeEstimationError","feeHistoryError","fallbackError","Error","VaultTransactionGasCostLimitError","gasLimit","maximumAffordableFeePerGas","minimumRequiredFeePerGas","VaultTransactionReplacementLimitError","code","requiredMaxFeePerGas","requiredMaxPriorityFeePerGas","FeeHistorySnapshot","FallbackFeeEstimate","clampPriorityFee","resolveFeeHistoryQuote","baseFeePerGas","reward","resolveDeltaHedgeFeeHistoryQuote","resolveRpcPriorityFeeQuote","rawPriorityFeePerGas","getVaultTransactionReplacementFeeQuote","originalQuote","historicalQuote","Pick","resolveFallbackQuote","estimatedMaxFeePerGas","estimatedPriorityFeePerGas","applyVaultTransactionGasCostLimit","bufferVaultTransactionGasEstimate","validateVaultSignedTransactionFeeCaps","resolveVaultTransactionFeeQuote","readFeeHistory","readFallbackEstimate","Promise","getVaultTransactionFeeQuote","chain","getVaultDeltaHedgeHistoricalFeeQuote","resolveVaultDeltaHedgeInitialFeeQuote","readRpcQuote","readHistoricalQuote","getVaultDeltaHedgeInitialFeeQuote","__transactionFeeTestUtils"],"sources":["../src/hypoVault/transactionFees.d.ts"],"sourcesContent":null,"mappings":";;;cACqBG,8BAAAA;cACAC,8BAAAA;AADAD,cAEAE,8BAAAA,GAF8B,kBAAA;AAC9BD,KAETE,wBAAAA,
|
|
1
|
+
{"version":3,"file":"vault-transaction-fees.d.ts","names":["Chain","Client","Transport","MIN_VAULT_PRIORITY_FEE_PER_GAS","MAX_VAULT_PRIORITY_FEE_PER_GAS","MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS","MAX_VAULT_TRANSACTION_GAS_COST","VaultTransactionFeeQuote","VaultDeltaHedgeFeeQuote","VaultSignedTransactionFeeCaps","VaultSignedTransactionFeeValidationResult","VaultTransactionFeeEstimationError","feeHistoryError","fallbackError","Error","VaultTransactionGasCostLimitError","gasLimit","maximumAffordableFeePerGas","minimumRequiredFeePerGas","VaultTransactionReplacementLimitError","code","requiredMaxFeePerGas","requiredMaxPriorityFeePerGas","FeeHistorySnapshot","FallbackFeeEstimate","clampPriorityFee","resolveFeeHistoryQuote","baseFeePerGas","reward","resolveDeltaHedgeFeeHistoryQuote","resolveRpcPriorityFeeQuote","rawPriorityFeePerGas","getVaultTransactionReplacementFeeQuote","originalQuote","historicalQuote","finalReplacement","staleBoundsReplacement","Pick","resolveFallbackQuote","estimatedMaxFeePerGas","estimatedPriorityFeePerGas","applyVaultTransactionGasCostLimit","bufferVaultTransactionGasEstimate","validateVaultSignedTransactionFeeCaps","resolveVaultTransactionFeeQuote","readFeeHistory","readFallbackEstimate","Promise","getVaultTransactionFeeQuote","chain","getVaultDeltaHedgeHistoricalFeeQuote","resolveVaultDeltaHedgeInitialFeeQuote","readRpcQuote","readHistoricalQuote","getVaultDeltaHedgeInitialFeeQuote","__transactionFeeTestUtils"],"sources":["../src/hypoVault/transactionFees.d.ts"],"sourcesContent":null,"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { estimateFeesPerGas, getBlock, getFeeHistory } from "viem/actions";
|
|
|
4
4
|
//#region src/hypoVault/transactionFees.ts
|
|
5
5
|
const MIN_VAULT_PRIORITY_FEE_PER_GAS = 100000000n;
|
|
6
6
|
const MAX_VAULT_PRIORITY_FEE_PER_GAS = 3000000000n;
|
|
7
|
+
const MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS = 8000000000n;
|
|
7
8
|
const MAX_VAULT_TRANSACTION_GAS_COST = 15000000000000000n;
|
|
8
9
|
const FEE_HISTORY_BLOCK_COUNT = 20;
|
|
9
10
|
const FEE_HISTORY_REWARD_PERCENTILES = [90];
|
|
@@ -12,6 +13,9 @@ const BASE_FEE_BUFFER_NUMERATOR = 1125n;
|
|
|
12
13
|
const BASE_FEE_BUFFER_DENOMINATOR = 1000n;
|
|
13
14
|
const REPLACEMENT_FEE_BUMP_NUMERATOR = 1125n;
|
|
14
15
|
const REPLACEMENT_FEE_BUMP_DENOMINATOR = 1000n;
|
|
16
|
+
const DELTA_HEDGE_PRIORITY_FEE_BUMP_NUMERATOR = 1300n;
|
|
17
|
+
const DELTA_HEDGE_PRIORITY_FEE_BUMP_DENOMINATOR = 1000n;
|
|
18
|
+
const MAX_DELTA_HEDGE_PRIORITY_FEE_PER_GAS = MAX_VAULT_PRIORITY_FEE_PER_GAS * REPLACEMENT_FEE_BUMP_DENOMINATOR / REPLACEMENT_FEE_BUMP_NUMERATOR;
|
|
15
19
|
const GAS_ESTIMATE_BUFFER_NUMERATOR = 3n;
|
|
16
20
|
const GAS_ESTIMATE_BUFFER_DENOMINATOR = 2n;
|
|
17
21
|
var VaultTransactionFeeEstimationError = class extends Error {
|
|
@@ -115,25 +119,37 @@ function resolveRpcPriorityFeeQuote({ baseFeePerGas, rawPriorityFeePerGas }) {
|
|
|
115
119
|
source: "rpc_priority_fee"
|
|
116
120
|
};
|
|
117
121
|
}
|
|
118
|
-
function getVaultTransactionReplacementFeeQuote({ originalQuote, historicalQuote, gasLimit }) {
|
|
122
|
+
function getVaultTransactionReplacementFeeQuote({ originalQuote, historicalQuote, gasLimit, finalReplacement = false, staleBoundsReplacement = false }) {
|
|
119
123
|
if (gasLimit <= 0n) throw new Error(`Vault transaction gas limit must be positive, received ${gasLimit.toString()}`);
|
|
120
|
-
const bumpedPriorityFee = ceilMultiplyFraction(originalQuote.maxPriorityFeePerGas, REPLACEMENT_FEE_BUMP_NUMERATOR, REPLACEMENT_FEE_BUMP_DENOMINATOR);
|
|
124
|
+
const bumpedPriorityFee = staleBoundsReplacement ? ceilMultiplyFraction(originalQuote.maxPriorityFeePerGas, REPLACEMENT_FEE_BUMP_NUMERATOR, REPLACEMENT_FEE_BUMP_DENOMINATOR) : ceilMultiplyFraction(originalQuote.maxPriorityFeePerGas, DELTA_HEDGE_PRIORITY_FEE_BUMP_NUMERATOR, DELTA_HEDGE_PRIORITY_FEE_BUMP_DENOMINATOR);
|
|
121
125
|
const bumpedMaxFee = ceilMultiplyFraction(originalQuote.maxFeePerGas, REPLACEMENT_FEE_BUMP_NUMERATOR, REPLACEMENT_FEE_BUMP_DENOMINATOR);
|
|
122
|
-
const
|
|
126
|
+
const escalatingPriorityFee = historicalQuote.maxPriorityFeePerGas > bumpedPriorityFee ? historicalQuote.maxPriorityFeePerGas : bumpedPriorityFee;
|
|
127
|
+
const priorityFeeLimit = staleBoundsReplacement ? MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS : finalReplacement ? MAX_VAULT_PRIORITY_FEE_PER_GAS : MAX_DELTA_HEDGE_PRIORITY_FEE_PER_GAS;
|
|
128
|
+
const desiredMaxPriorityFeePerGas = finalReplacement ? MAX_VAULT_PRIORITY_FEE_PER_GAS : staleBoundsReplacement ? bumpedPriorityFee : escalatingPriorityFee;
|
|
129
|
+
const requiredReplacementPriorityFee = ceilMultiplyFraction(originalQuote.maxPriorityFeePerGas, REPLACEMENT_FEE_BUMP_NUMERATOR, REPLACEMENT_FEE_BUMP_DENOMINATOR);
|
|
130
|
+
const requiredMaxPriorityFeePerGas = desiredMaxPriorityFeePerGas < priorityFeeLimit ? desiredMaxPriorityFeePerGas : priorityFeeLimit;
|
|
131
|
+
if (requiredMaxPriorityFeePerGas < requiredReplacementPriorityFee) throw new VaultTransactionReplacementLimitError({
|
|
132
|
+
code: "PriorityFeeCapExceeded",
|
|
133
|
+
gasLimit,
|
|
134
|
+
requiredMaxFeePerGas: originalQuote.maxFeePerGas,
|
|
135
|
+
requiredMaxPriorityFeePerGas: requiredReplacementPriorityFee,
|
|
136
|
+
maximumAffordableFeePerGas: MAX_VAULT_TRANSACTION_GAS_COST / gasLimit
|
|
137
|
+
});
|
|
123
138
|
const bufferedBaseFee = historicalQuote.minimumMaxFeePerGas - MIN_VAULT_PRIORITY_FEE_PER_GAS;
|
|
124
139
|
const currentMarketMaxFee = bufferedBaseFee + requiredMaxPriorityFeePerGas;
|
|
125
|
-
const
|
|
140
|
+
const desiredMaxFeePerGas = currentMarketMaxFee > bumpedMaxFee ? currentMarketMaxFee : bumpedMaxFee;
|
|
126
141
|
const maximumAffordableFeePerGas = MAX_VAULT_TRANSACTION_GAS_COST / gasLimit;
|
|
127
|
-
if (
|
|
142
|
+
if (bumpedMaxFee > maximumAffordableFeePerGas || requiredMaxPriorityFeePerGas > maximumAffordableFeePerGas) throw new VaultTransactionReplacementLimitError({
|
|
128
143
|
code: "GasCostCapExceeded",
|
|
129
144
|
gasLimit,
|
|
130
|
-
requiredMaxFeePerGas,
|
|
145
|
+
requiredMaxFeePerGas: bumpedMaxFee,
|
|
131
146
|
requiredMaxPriorityFeePerGas,
|
|
132
147
|
maximumAffordableFeePerGas
|
|
133
148
|
});
|
|
149
|
+
const maxFeePerGas = desiredMaxFeePerGas < maximumAffordableFeePerGas ? desiredMaxFeePerGas : maximumAffordableFeePerGas;
|
|
134
150
|
return {
|
|
135
151
|
...historicalQuote,
|
|
136
|
-
maxFeePerGas
|
|
152
|
+
maxFeePerGas,
|
|
137
153
|
maxPriorityFeePerGas: requiredMaxPriorityFeePerGas
|
|
138
154
|
};
|
|
139
155
|
}
|
|
@@ -275,5 +291,5 @@ async function getVaultDeltaHedgeInitialFeeQuote(client) {
|
|
|
275
291
|
}
|
|
276
292
|
|
|
277
293
|
//#endregion
|
|
278
|
-
export { MAX_VAULT_PRIORITY_FEE_PER_GAS, MAX_VAULT_TRANSACTION_GAS_COST, MIN_VAULT_PRIORITY_FEE_PER_GAS, VaultTransactionFeeEstimationError, VaultTransactionGasCostLimitError, VaultTransactionReplacementLimitError, applyVaultTransactionGasCostLimit, bufferVaultTransactionGasEstimate, getVaultDeltaHedgeHistoricalFeeQuote, getVaultDeltaHedgeInitialFeeQuote, getVaultTransactionFeeQuote, getVaultTransactionReplacementFeeQuote, validateVaultSignedTransactionFeeCaps };
|
|
294
|
+
export { MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS, MAX_VAULT_PRIORITY_FEE_PER_GAS, MAX_VAULT_TRANSACTION_GAS_COST, MIN_VAULT_PRIORITY_FEE_PER_GAS, VaultTransactionFeeEstimationError, VaultTransactionGasCostLimitError, VaultTransactionReplacementLimitError, applyVaultTransactionGasCostLimit, bufferVaultTransactionGasEstimate, getVaultDeltaHedgeHistoricalFeeQuote, getVaultDeltaHedgeInitialFeeQuote, getVaultTransactionFeeQuote, getVaultTransactionReplacementFeeQuote, validateVaultSignedTransactionFeeCaps };
|
|
279
295
|
//# sourceMappingURL=vault-transaction-fees.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vault-transaction-fees.js","names":["value: bigint","numerator: bigint","denominator: bigint","values: readonly bigint[]","priorityFee: bigint","quote: VaultTransactionFeeQuote","gasLimit: bigint","gasEstimate: bigint","feeCaps: VaultSignedTransactionFeeCaps","quote?: VaultTransactionFeeQuote","feeHistoryError: unknown","client: Client<Transport, chain>"],"sources":["../src/hypoVault/transactionFees.ts"],"sourcesContent":["import type { Chain, Client, Transport } from 'viem'\nimport { hexToBigInt } from 'viem'\nimport { estimateFeesPerGas, getBlock, getFeeHistory } from 'viem/actions'\n\nexport const MIN_VAULT_PRIORITY_FEE_PER_GAS = 100_000_000n // 0.1 gwei\nexport const MAX_VAULT_PRIORITY_FEE_PER_GAS = 3_000_000_000n // 3 gwei\nexport const MAX_VAULT_TRANSACTION_GAS_COST = 15_000_000_000_000_000n // 0.015 ETH\n\nconst FEE_HISTORY_BLOCK_COUNT = 20\nconst FEE_HISTORY_REWARD_PERCENTILES = [90]\nconst DELTA_HEDGE_FEE_HISTORY_REWARD_PERCENTILES = [25]\nconst BASE_FEE_BUFFER_NUMERATOR = 1_125n\nconst BASE_FEE_BUFFER_DENOMINATOR = 1_000n\nconst REPLACEMENT_FEE_BUMP_NUMERATOR = 1_125n\nconst REPLACEMENT_FEE_BUMP_DENOMINATOR = 1_000n\nconst GAS_ESTIMATE_BUFFER_NUMERATOR = 3n\nconst GAS_ESTIMATE_BUFFER_DENOMINATOR = 2n\n\nexport type VaultTransactionFeeQuote = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n minimumMaxFeePerGas: bigint\n source: 'fee_history' | 'viem_fallback' | 'rpc_priority_fee' | 'fee_history_p25'\n}\n\nexport type VaultDeltaHedgeFeeQuote = VaultTransactionFeeQuote & {\n rawPriorityFeePerGas: bigint\n}\n\nexport type VaultSignedTransactionFeeCaps = {\n gasLimit?: bigint | null\n maxFeePerGas: bigint | null\n maxPriorityFeePerGas: bigint | null\n}\n\nexport type VaultSignedTransactionFeeValidationResult =\n | { valid: true }\n | {\n valid: false\n code:\n | 'MissingEip1559Fees'\n | 'InvalidFeeCaps'\n | 'PriorityFeeTooLow'\n | 'PriorityFeeTooHigh'\n | 'MaxFeeTooLow'\n | 'GasCostTooHigh'\n reason: string\n }\n\nexport class VaultTransactionFeeEstimationError extends Error {\n readonly feeHistoryError: unknown\n readonly fallbackError: unknown\n\n constructor({\n feeHistoryError,\n fallbackError,\n }: {\n feeHistoryError: unknown\n fallbackError: unknown\n }) {\n super('Unable to estimate EIP-1559 fees for vault transaction')\n this.name = 'VaultTransactionFeeEstimationError'\n this.feeHistoryError = feeHistoryError\n this.fallbackError = fallbackError\n }\n}\n\nexport class VaultTransactionGasCostLimitError extends Error {\n readonly gasLimit: bigint\n readonly maximumAffordableFeePerGas: bigint\n readonly minimumRequiredFeePerGas: bigint\n\n constructor({\n gasLimit,\n maximumAffordableFeePerGas,\n minimumRequiredFeePerGas,\n }: {\n gasLimit: bigint\n maximumAffordableFeePerGas: bigint\n minimumRequiredFeePerGas: bigint\n }) {\n super(\n `Vault transaction cannot fit the ${MAX_VAULT_TRANSACTION_GAS_COST.toString()} wei gas-cost limit: ` +\n `gasLimit=${gasLimit.toString()}, maximumAffordableFeePerGas=${maximumAffordableFeePerGas.toString()}, ` +\n `minimumRequiredFeePerGas=${minimumRequiredFeePerGas.toString()}`,\n )\n this.name = 'VaultTransactionGasCostLimitError'\n this.gasLimit = gasLimit\n this.maximumAffordableFeePerGas = maximumAffordableFeePerGas\n this.minimumRequiredFeePerGas = minimumRequiredFeePerGas\n }\n}\n\nexport class VaultTransactionReplacementLimitError extends Error {\n readonly code: 'GasCostCapExceeded'\n readonly requiredMaxFeePerGas: bigint\n readonly requiredMaxPriorityFeePerGas: bigint\n readonly maximumAffordableFeePerGas: bigint\n\n constructor({\n code,\n gasLimit,\n requiredMaxFeePerGas,\n requiredMaxPriorityFeePerGas,\n maximumAffordableFeePerGas,\n }: {\n code: 'GasCostCapExceeded'\n gasLimit: bigint\n requiredMaxFeePerGas: bigint\n requiredMaxPriorityFeePerGas: bigint\n maximumAffordableFeePerGas: bigint\n }) {\n super(\n `Vault transaction replacement blocked by ${code}: gasLimit=${gasLimit.toString()}, ` +\n `requiredMaxFeePerGas=${requiredMaxFeePerGas.toString()}, ` +\n `requiredMaxPriorityFeePerGas=${requiredMaxPriorityFeePerGas.toString()}, ` +\n `maximumAffordableFeePerGas=${maximumAffordableFeePerGas.toString()}`,\n )\n this.name = 'VaultTransactionReplacementLimitError'\n this.code = code\n this.requiredMaxFeePerGas = requiredMaxFeePerGas\n this.requiredMaxPriorityFeePerGas = requiredMaxPriorityFeePerGas\n this.maximumAffordableFeePerGas = maximumAffordableFeePerGas\n }\n}\n\ntype FeeHistorySnapshot = {\n baseFeePerGas: readonly bigint[]\n reward?: readonly (readonly bigint[])[] | undefined\n}\n\ntype FallbackFeeEstimate = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction ceilMultiplyFraction(value: bigint, numerator: bigint, denominator: bigint): bigint {\n return (value * numerator + denominator - 1n) / denominator\n}\n\nfunction medianBigInt(values: readonly bigint[]): bigint | undefined {\n if (values.length === 0) return undefined\n const sorted = [...values].sort((left, right) => (left < right ? -1 : left > right ? 1 : 0))\n const upperMiddleIndex = Math.floor(sorted.length / 2)\n const upperMiddle = sorted[upperMiddleIndex]\n if (upperMiddle === undefined) return undefined\n if (sorted.length % 2 === 1) return upperMiddle\n const lowerMiddle = sorted[upperMiddleIndex - 1]\n return lowerMiddle === undefined ? undefined : (lowerMiddle + upperMiddle) / 2n\n}\n\nfunction clampPriorityFee(priorityFee: bigint): bigint {\n if (priorityFee < MIN_VAULT_PRIORITY_FEE_PER_GAS) return MIN_VAULT_PRIORITY_FEE_PER_GAS\n if (priorityFee > MAX_VAULT_PRIORITY_FEE_PER_GAS) return MAX_VAULT_PRIORITY_FEE_PER_GAS\n return priorityFee\n}\n\nfunction resolveFeeHistoryQuote({\n baseFeePerGas,\n reward,\n}: {\n baseFeePerGas: readonly bigint[]\n reward?: readonly (readonly bigint[])[] | undefined\n}): VaultTransactionFeeQuote | null {\n // feeHistory includes one additional base fee for the next block. The\n // second-to-last entry is therefore the latest mined block's base fee.\n const latestBaseFeeIndex = baseFeePerGas.length - 2\n if (latestBaseFeeIndex < 0 || reward === undefined || reward.length === 0) return null\n\n const p90Rewards = reward.flatMap((blockRewards) => {\n const p90 = blockRewards[0]\n return p90 === undefined ? [] : [p90]\n })\n const sampledPriorityFee = medianBigInt(p90Rewards)\n if (sampledPriorityFee === undefined) return null\n\n const maxPriorityFeePerGas = clampPriorityFee(sampledPriorityFee)\n const bufferedBaseFee = ceilMultiplyFraction(\n baseFeePerGas[latestBaseFeeIndex],\n BASE_FEE_BUFFER_NUMERATOR,\n BASE_FEE_BUFFER_DENOMINATOR,\n )\n\n return {\n maxFeePerGas: bufferedBaseFee + maxPriorityFeePerGas,\n maxPriorityFeePerGas,\n minimumMaxFeePerGas: bufferedBaseFee + MIN_VAULT_PRIORITY_FEE_PER_GAS,\n source: 'fee_history',\n }\n}\n\nfunction resolveDeltaHedgeFeeHistoryQuote({\n baseFeePerGas,\n reward,\n}: FeeHistorySnapshot): VaultDeltaHedgeFeeQuote | null {\n const latestBaseFeeIndex = baseFeePerGas.length - 2\n if (latestBaseFeeIndex < 0 || reward === undefined || reward.length === 0) return null\n\n const p25Rewards = reward.flatMap((blockRewards) => {\n const p25 = blockRewards[0]\n return p25 === undefined ? [] : [p25]\n })\n const rawPriorityFeePerGas = medianBigInt(p25Rewards)\n if (rawPriorityFeePerGas === undefined) return null\n\n const maxPriorityFeePerGas = clampPriorityFee(rawPriorityFeePerGas)\n const bufferedBaseFee = ceilMultiplyFraction(\n baseFeePerGas[latestBaseFeeIndex],\n BASE_FEE_BUFFER_NUMERATOR,\n BASE_FEE_BUFFER_DENOMINATOR,\n )\n return {\n maxFeePerGas: bufferedBaseFee + maxPriorityFeePerGas,\n maxPriorityFeePerGas,\n minimumMaxFeePerGas: bufferedBaseFee + MIN_VAULT_PRIORITY_FEE_PER_GAS,\n rawPriorityFeePerGas,\n source: 'fee_history_p25',\n }\n}\n\nfunction resolveRpcPriorityFeeQuote({\n baseFeePerGas,\n rawPriorityFeePerGas,\n}: {\n baseFeePerGas: bigint\n rawPriorityFeePerGas: bigint\n}): VaultDeltaHedgeFeeQuote {\n const bufferedBaseFee = ceilMultiplyFraction(\n baseFeePerGas,\n BASE_FEE_BUFFER_NUMERATOR,\n BASE_FEE_BUFFER_DENOMINATOR,\n )\n return {\n maxFeePerGas: bufferedBaseFee + rawPriorityFeePerGas,\n maxPriorityFeePerGas: rawPriorityFeePerGas,\n minimumMaxFeePerGas: bufferedBaseFee + rawPriorityFeePerGas,\n rawPriorityFeePerGas,\n source: 'rpc_priority_fee',\n }\n}\n\nexport function getVaultTransactionReplacementFeeQuote({\n originalQuote,\n historicalQuote,\n gasLimit,\n}: {\n originalQuote: Pick<VaultTransactionFeeQuote, 'maxFeePerGas' | 'maxPriorityFeePerGas'>\n historicalQuote: VaultDeltaHedgeFeeQuote\n gasLimit: bigint\n}): VaultDeltaHedgeFeeQuote {\n if (gasLimit <= 0n) {\n throw new Error(`Vault transaction gas limit must be positive, received ${gasLimit.toString()}`)\n }\n\n const bumpedPriorityFee = ceilMultiplyFraction(\n originalQuote.maxPriorityFeePerGas,\n REPLACEMENT_FEE_BUMP_NUMERATOR,\n REPLACEMENT_FEE_BUMP_DENOMINATOR,\n )\n const bumpedMaxFee = ceilMultiplyFraction(\n originalQuote.maxFeePerGas,\n REPLACEMENT_FEE_BUMP_NUMERATOR,\n REPLACEMENT_FEE_BUMP_DENOMINATOR,\n )\n // The historical p25 quote is already clamped to 3 gwei. A same-nonce\n // replacement may exceed that estimate cap when the required bump does.\n const requiredMaxPriorityFeePerGas =\n historicalQuote.maxPriorityFeePerGas > bumpedPriorityFee\n ? historicalQuote.maxPriorityFeePerGas\n : bumpedPriorityFee\n const bufferedBaseFee = historicalQuote.minimumMaxFeePerGas - MIN_VAULT_PRIORITY_FEE_PER_GAS\n const currentMarketMaxFee = bufferedBaseFee + requiredMaxPriorityFeePerGas\n const requiredMaxFeePerGas =\n currentMarketMaxFee > bumpedMaxFee ? currentMarketMaxFee : bumpedMaxFee\n const maximumAffordableFeePerGas = MAX_VAULT_TRANSACTION_GAS_COST / gasLimit\n\n if (requiredMaxFeePerGas > maximumAffordableFeePerGas) {\n throw new VaultTransactionReplacementLimitError({\n code: 'GasCostCapExceeded',\n gasLimit,\n requiredMaxFeePerGas,\n requiredMaxPriorityFeePerGas,\n maximumAffordableFeePerGas,\n })\n }\n\n return {\n ...historicalQuote,\n maxFeePerGas: requiredMaxFeePerGas,\n maxPriorityFeePerGas: requiredMaxPriorityFeePerGas,\n }\n}\n\nfunction resolveFallbackQuote({\n maxFeePerGas: estimatedMaxFeePerGas,\n maxPriorityFeePerGas: estimatedPriorityFeePerGas,\n}: {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}): VaultTransactionFeeQuote {\n const maxPriorityFeePerGas = clampPriorityFee(estimatedPriorityFeePerGas)\n const estimatedBaseFeeAllowance =\n estimatedMaxFeePerGas > estimatedPriorityFeePerGas\n ? estimatedMaxFeePerGas - estimatedPriorityFeePerGas\n : 0n\n\n return {\n maxFeePerGas: estimatedBaseFeeAllowance + maxPriorityFeePerGas,\n maxPriorityFeePerGas,\n minimumMaxFeePerGas: estimatedBaseFeeAllowance + MIN_VAULT_PRIORITY_FEE_PER_GAS,\n source: 'viem_fallback',\n }\n}\n\nexport function applyVaultTransactionGasCostLimit(\n quote: VaultTransactionFeeQuote,\n gasLimit: bigint,\n): VaultTransactionFeeQuote {\n if (gasLimit <= 0n) {\n throw new Error(`Vault transaction gas limit must be positive, received ${gasLimit.toString()}`)\n }\n\n const maximumAffordableFeePerGas = MAX_VAULT_TRANSACTION_GAS_COST / gasLimit\n if (maximumAffordableFeePerGas < quote.minimumMaxFeePerGas) {\n throw new VaultTransactionGasCostLimitError({\n gasLimit,\n maximumAffordableFeePerGas,\n minimumRequiredFeePerGas: quote.minimumMaxFeePerGas,\n })\n }\n\n if (quote.maxFeePerGas <= maximumAffordableFeePerGas) return quote\n\n const bufferedBaseFee = quote.minimumMaxFeePerGas - MIN_VAULT_PRIORITY_FEE_PER_GAS\n const affordablePriorityFee = maximumAffordableFeePerGas - bufferedBaseFee\n return {\n ...quote,\n maxFeePerGas: maximumAffordableFeePerGas,\n maxPriorityFeePerGas:\n quote.maxPriorityFeePerGas < affordablePriorityFee\n ? quote.maxPriorityFeePerGas\n : affordablePriorityFee,\n }\n}\n\nexport function bufferVaultTransactionGasEstimate(gasEstimate: bigint): bigint {\n if (gasEstimate <= 0n) {\n throw new Error(\n `Vault transaction gas estimate must be positive, received ${gasEstimate.toString()}`,\n )\n }\n return ceilMultiplyFraction(\n gasEstimate,\n GAS_ESTIMATE_BUFFER_NUMERATOR,\n GAS_ESTIMATE_BUFFER_DENOMINATOR,\n )\n}\n\nexport function validateVaultSignedTransactionFeeCaps(\n feeCaps: VaultSignedTransactionFeeCaps,\n quote?: VaultTransactionFeeQuote,\n): VaultSignedTransactionFeeValidationResult {\n const { gasLimit, maxFeePerGas, maxPriorityFeePerGas } = feeCaps\n if (maxFeePerGas === null || maxPriorityFeePerGas === null) {\n return {\n valid: false,\n code: 'MissingEip1559Fees',\n reason: 'Signed transaction must include EIP-1559 max fee and priority fee caps.',\n }\n }\n if (maxPriorityFeePerGas > maxFeePerGas) {\n return {\n valid: false,\n code: 'InvalidFeeCaps',\n reason:\n `Signed transaction maxPriorityFeePerGas (${maxPriorityFeePerGas.toString()} wei) ` +\n `cannot exceed maxFeePerGas (${maxFeePerGas.toString()} wei).`,\n }\n }\n if (maxPriorityFeePerGas < MIN_VAULT_PRIORITY_FEE_PER_GAS) {\n return {\n valid: false,\n code: 'PriorityFeeTooLow',\n reason:\n `Signed transaction maxPriorityFeePerGas (${maxPriorityFeePerGas.toString()} wei) ` +\n `must be at least ${MIN_VAULT_PRIORITY_FEE_PER_GAS.toString()} wei (0.1 gwei).`,\n }\n }\n if (maxPriorityFeePerGas > MAX_VAULT_PRIORITY_FEE_PER_GAS) {\n return {\n valid: false,\n code: 'PriorityFeeTooHigh',\n reason:\n `Signed transaction maxPriorityFeePerGas (${maxPriorityFeePerGas.toString()} wei) ` +\n `must not exceed ${MAX_VAULT_PRIORITY_FEE_PER_GAS.toString()} wei (3 gwei).`,\n }\n }\n if (\n gasLimit !== undefined &&\n gasLimit !== null &&\n gasLimit * maxFeePerGas > MAX_VAULT_TRANSACTION_GAS_COST\n ) {\n return {\n valid: false,\n code: 'GasCostTooHigh',\n reason:\n `Signed transaction maximum gas cost (${(gasLimit * maxFeePerGas).toString()} wei) ` +\n `must not exceed ${MAX_VAULT_TRANSACTION_GAS_COST.toString()} wei (0.015 ETH).`,\n }\n }\n if (quote !== undefined && maxFeePerGas < quote.minimumMaxFeePerGas) {\n return {\n valid: false,\n code: 'MaxFeeTooLow',\n reason:\n `Signed transaction maxFeePerGas (${maxFeePerGas.toString()} wei) must be at least ` +\n `${quote.minimumMaxFeePerGas.toString()} wei for the buffered next-block base fee ` +\n 'and 0.1 gwei minimum priority fee.',\n }\n }\n return { valid: true }\n}\n\nasync function resolveVaultTransactionFeeQuote({\n readFeeHistory,\n readFallbackEstimate,\n}: {\n readFeeHistory: () => Promise<FeeHistorySnapshot>\n readFallbackEstimate: () => Promise<FallbackFeeEstimate>\n}): Promise<VaultTransactionFeeQuote> {\n let feeHistoryError: unknown\n try {\n const quote = resolveFeeHistoryQuote(await readFeeHistory())\n if (quote !== null) return quote\n feeHistoryError = new Error('eth_feeHistory returned incomplete base fee or reward data')\n } catch (error) {\n feeHistoryError = error\n }\n\n try {\n return resolveFallbackQuote(await readFallbackEstimate())\n } catch (fallbackError) {\n throw new VaultTransactionFeeEstimationError({ feeHistoryError, fallbackError })\n }\n}\n\n/**\n * Resolve explicit EIP-1559 fees for operator-controlled vault transactions.\n *\n * The normal path follows the median p90 priority fee from the last 20 blocks,\n * with a 0.1 gwei floor and 3 gwei ceiling. If fee history is unavailable,\n * Viem's estimate is used while preserving those bounds and its original\n * base-fee allowance.\n */\nexport async function getVaultTransactionFeeQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n): Promise<VaultTransactionFeeQuote> {\n return resolveVaultTransactionFeeQuote({\n readFeeHistory: () =>\n getFeeHistory(client, {\n blockCount: FEE_HISTORY_BLOCK_COUNT,\n blockTag: 'latest',\n rewardPercentiles: FEE_HISTORY_REWARD_PERCENTILES,\n }),\n readFallbackEstimate: () => estimateFeesPerGas(client),\n })\n}\n\nexport async function getVaultDeltaHedgeHistoricalFeeQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n): Promise<VaultDeltaHedgeFeeQuote> {\n const feeHistory = await getFeeHistory(client, {\n blockCount: FEE_HISTORY_BLOCK_COUNT,\n blockTag: 'latest',\n rewardPercentiles: DELTA_HEDGE_FEE_HISTORY_REWARD_PERCENTILES,\n })\n const quote = resolveDeltaHedgeFeeHistoryQuote(feeHistory)\n if (quote === null) {\n throw new Error('eth_feeHistory returned incomplete p25 base fee or reward data')\n }\n return quote\n}\n\nasync function resolveVaultDeltaHedgeInitialFeeQuote({\n readRpcQuote,\n readHistoricalQuote,\n}: {\n readRpcQuote: () => Promise<{ baseFeePerGas: bigint; rawPriorityFeePerGas: bigint }>\n readHistoricalQuote: () => Promise<VaultDeltaHedgeFeeQuote>\n}): Promise<VaultDeltaHedgeFeeQuote> {\n try {\n return resolveRpcPriorityFeeQuote(await readRpcQuote())\n } catch {\n return readHistoricalQuote()\n }\n}\n\n/**\n * Resolve the first fee quote for a delta hedge from the connected RPC's\n * eth_maxPriorityFeePerGas recommendation. A failed RPC recommendation falls\n * back immediately to the rolling historical p25 quote.\n */\nexport async function getVaultDeltaHedgeInitialFeeQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n): Promise<VaultDeltaHedgeFeeQuote> {\n return resolveVaultDeltaHedgeInitialFeeQuote({\n readRpcQuote: async () => {\n const [rawPriorityFee, latestBlock] = await Promise.all([\n client.request({ method: 'eth_maxPriorityFeePerGas' }),\n getBlock(client, { blockTag: 'latest' }),\n ])\n if (latestBlock.baseFeePerGas === null) {\n throw new Error('Latest block does not include an EIP-1559 base fee')\n }\n return {\n baseFeePerGas: latestBlock.baseFeePerGas,\n rawPriorityFeePerGas: hexToBigInt(rawPriorityFee),\n }\n },\n readHistoricalQuote: () => getVaultDeltaHedgeHistoricalFeeQuote(client),\n })\n}\n\nexport const __transactionFeeTestUtils = {\n clampPriorityFee,\n resolveDeltaHedgeFeeHistoryQuote,\n resolveFallbackQuote,\n resolveFeeHistoryQuote,\n resolveRpcPriorityFeeQuote,\n resolveVaultDeltaHedgeInitialFeeQuote,\n resolveVaultTransactionFeeQuote,\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"vault-transaction-fees.js","names":["value: bigint","numerator: bigint","denominator: bigint","values: readonly bigint[]","priorityFee: bigint","quote: VaultTransactionFeeQuote","gasLimit: bigint","gasEstimate: bigint","feeCaps: VaultSignedTransactionFeeCaps","quote?: VaultTransactionFeeQuote","feeHistoryError: unknown","client: Client<Transport, chain>"],"sources":["../src/hypoVault/transactionFees.ts"],"sourcesContent":["import type { Chain, Client, Transport } from 'viem'\nimport { hexToBigInt } from 'viem'\nimport { estimateFeesPerGas, getBlock, getFeeHistory } from 'viem/actions'\n\nexport const MIN_VAULT_PRIORITY_FEE_PER_GAS = 100_000_000n // 0.1 gwei\nexport const MAX_VAULT_PRIORITY_FEE_PER_GAS = 3_000_000_000n // 3 gwei\nexport const MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS = 8_000_000_000n // 8 gwei\nexport const MAX_VAULT_TRANSACTION_GAS_COST = 15_000_000_000_000_000n // 0.015 ETH\n\nconst FEE_HISTORY_BLOCK_COUNT = 20\nconst FEE_HISTORY_REWARD_PERCENTILES = [90]\nconst DELTA_HEDGE_FEE_HISTORY_REWARD_PERCENTILES = [25]\nconst BASE_FEE_BUFFER_NUMERATOR = 1_125n\nconst BASE_FEE_BUFFER_DENOMINATOR = 1_000n\nconst REPLACEMENT_FEE_BUMP_NUMERATOR = 1_125n\nconst REPLACEMENT_FEE_BUMP_DENOMINATOR = 1_000n\nconst DELTA_HEDGE_PRIORITY_FEE_BUMP_NUMERATOR = 1_300n\nconst DELTA_HEDGE_PRIORITY_FEE_BUMP_DENOMINATOR = 1_000n\n// Leave the mandatory 12.5% replacement headroom for a final 3 gwei replacement.\nconst MAX_DELTA_HEDGE_PRIORITY_FEE_PER_GAS =\n (MAX_VAULT_PRIORITY_FEE_PER_GAS * REPLACEMENT_FEE_BUMP_DENOMINATOR) /\n REPLACEMENT_FEE_BUMP_NUMERATOR\nconst GAS_ESTIMATE_BUFFER_NUMERATOR = 3n\nconst GAS_ESTIMATE_BUFFER_DENOMINATOR = 2n\n\nexport type VaultTransactionFeeQuote = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n minimumMaxFeePerGas: bigint\n source: 'fee_history' | 'viem_fallback' | 'rpc_priority_fee' | 'fee_history_p25'\n}\n\nexport type VaultDeltaHedgeFeeQuote = VaultTransactionFeeQuote & {\n rawPriorityFeePerGas: bigint\n}\n\nexport type VaultSignedTransactionFeeCaps = {\n gasLimit?: bigint | null\n maxFeePerGas: bigint | null\n maxPriorityFeePerGas: bigint | null\n}\n\nexport type VaultSignedTransactionFeeValidationResult =\n | { valid: true }\n | {\n valid: false\n code:\n | 'MissingEip1559Fees'\n | 'InvalidFeeCaps'\n | 'PriorityFeeTooLow'\n | 'PriorityFeeTooHigh'\n | 'MaxFeeTooLow'\n | 'GasCostTooHigh'\n reason: string\n }\n\nexport class VaultTransactionFeeEstimationError extends Error {\n readonly feeHistoryError: unknown\n readonly fallbackError: unknown\n\n constructor({\n feeHistoryError,\n fallbackError,\n }: {\n feeHistoryError: unknown\n fallbackError: unknown\n }) {\n super('Unable to estimate EIP-1559 fees for vault transaction')\n this.name = 'VaultTransactionFeeEstimationError'\n this.feeHistoryError = feeHistoryError\n this.fallbackError = fallbackError\n }\n}\n\nexport class VaultTransactionGasCostLimitError extends Error {\n readonly gasLimit: bigint\n readonly maximumAffordableFeePerGas: bigint\n readonly minimumRequiredFeePerGas: bigint\n\n constructor({\n gasLimit,\n maximumAffordableFeePerGas,\n minimumRequiredFeePerGas,\n }: {\n gasLimit: bigint\n maximumAffordableFeePerGas: bigint\n minimumRequiredFeePerGas: bigint\n }) {\n super(\n `Vault transaction cannot fit the ${MAX_VAULT_TRANSACTION_GAS_COST.toString()} wei gas-cost limit: ` +\n `gasLimit=${gasLimit.toString()}, maximumAffordableFeePerGas=${maximumAffordableFeePerGas.toString()}, ` +\n `minimumRequiredFeePerGas=${minimumRequiredFeePerGas.toString()}`,\n )\n this.name = 'VaultTransactionGasCostLimitError'\n this.gasLimit = gasLimit\n this.maximumAffordableFeePerGas = maximumAffordableFeePerGas\n this.minimumRequiredFeePerGas = minimumRequiredFeePerGas\n }\n}\n\nexport class VaultTransactionReplacementLimitError extends Error {\n readonly code: 'GasCostCapExceeded' | 'PriorityFeeCapExceeded'\n readonly requiredMaxFeePerGas: bigint\n readonly requiredMaxPriorityFeePerGas: bigint\n readonly maximumAffordableFeePerGas: bigint\n\n constructor({\n code,\n gasLimit,\n requiredMaxFeePerGas,\n requiredMaxPriorityFeePerGas,\n maximumAffordableFeePerGas,\n }: {\n code: 'GasCostCapExceeded' | 'PriorityFeeCapExceeded'\n gasLimit: bigint\n requiredMaxFeePerGas: bigint\n requiredMaxPriorityFeePerGas: bigint\n maximumAffordableFeePerGas: bigint\n }) {\n super(\n `Vault transaction replacement blocked by ${code}: gasLimit=${gasLimit.toString()}, ` +\n `requiredMaxFeePerGas=${requiredMaxFeePerGas.toString()}, ` +\n `requiredMaxPriorityFeePerGas=${requiredMaxPriorityFeePerGas.toString()}, ` +\n `maximumAffordableFeePerGas=${maximumAffordableFeePerGas.toString()}`,\n )\n this.name = 'VaultTransactionReplacementLimitError'\n this.code = code\n this.requiredMaxFeePerGas = requiredMaxFeePerGas\n this.requiredMaxPriorityFeePerGas = requiredMaxPriorityFeePerGas\n this.maximumAffordableFeePerGas = maximumAffordableFeePerGas\n }\n}\n\ntype FeeHistorySnapshot = {\n baseFeePerGas: readonly bigint[]\n reward?: readonly (readonly bigint[])[] | undefined\n}\n\ntype FallbackFeeEstimate = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction ceilMultiplyFraction(value: bigint, numerator: bigint, denominator: bigint): bigint {\n return (value * numerator + denominator - 1n) / denominator\n}\n\nfunction medianBigInt(values: readonly bigint[]): bigint | undefined {\n if (values.length === 0) return undefined\n const sorted = [...values].sort((left, right) => (left < right ? -1 : left > right ? 1 : 0))\n const upperMiddleIndex = Math.floor(sorted.length / 2)\n const upperMiddle = sorted[upperMiddleIndex]\n if (upperMiddle === undefined) return undefined\n if (sorted.length % 2 === 1) return upperMiddle\n const lowerMiddle = sorted[upperMiddleIndex - 1]\n return lowerMiddle === undefined ? undefined : (lowerMiddle + upperMiddle) / 2n\n}\n\nfunction clampPriorityFee(priorityFee: bigint): bigint {\n if (priorityFee < MIN_VAULT_PRIORITY_FEE_PER_GAS) return MIN_VAULT_PRIORITY_FEE_PER_GAS\n if (priorityFee > MAX_VAULT_PRIORITY_FEE_PER_GAS) return MAX_VAULT_PRIORITY_FEE_PER_GAS\n return priorityFee\n}\n\nfunction resolveFeeHistoryQuote({\n baseFeePerGas,\n reward,\n}: {\n baseFeePerGas: readonly bigint[]\n reward?: readonly (readonly bigint[])[] | undefined\n}): VaultTransactionFeeQuote | null {\n // feeHistory includes one additional base fee for the next block. The\n // second-to-last entry is therefore the latest mined block's base fee.\n const latestBaseFeeIndex = baseFeePerGas.length - 2\n if (latestBaseFeeIndex < 0 || reward === undefined || reward.length === 0) return null\n\n const p90Rewards = reward.flatMap((blockRewards) => {\n const p90 = blockRewards[0]\n return p90 === undefined ? [] : [p90]\n })\n const sampledPriorityFee = medianBigInt(p90Rewards)\n if (sampledPriorityFee === undefined) return null\n\n const maxPriorityFeePerGas = clampPriorityFee(sampledPriorityFee)\n const bufferedBaseFee = ceilMultiplyFraction(\n baseFeePerGas[latestBaseFeeIndex],\n BASE_FEE_BUFFER_NUMERATOR,\n BASE_FEE_BUFFER_DENOMINATOR,\n )\n\n return {\n maxFeePerGas: bufferedBaseFee + maxPriorityFeePerGas,\n maxPriorityFeePerGas,\n minimumMaxFeePerGas: bufferedBaseFee + MIN_VAULT_PRIORITY_FEE_PER_GAS,\n source: 'fee_history',\n }\n}\n\nfunction resolveDeltaHedgeFeeHistoryQuote({\n baseFeePerGas,\n reward,\n}: FeeHistorySnapshot): VaultDeltaHedgeFeeQuote | null {\n const latestBaseFeeIndex = baseFeePerGas.length - 2\n if (latestBaseFeeIndex < 0 || reward === undefined || reward.length === 0) return null\n\n const p25Rewards = reward.flatMap((blockRewards) => {\n const p25 = blockRewards[0]\n return p25 === undefined ? [] : [p25]\n })\n const rawPriorityFeePerGas = medianBigInt(p25Rewards)\n if (rawPriorityFeePerGas === undefined) return null\n\n const maxPriorityFeePerGas = clampPriorityFee(rawPriorityFeePerGas)\n const bufferedBaseFee = ceilMultiplyFraction(\n baseFeePerGas[latestBaseFeeIndex],\n BASE_FEE_BUFFER_NUMERATOR,\n BASE_FEE_BUFFER_DENOMINATOR,\n )\n return {\n maxFeePerGas: bufferedBaseFee + maxPriorityFeePerGas,\n maxPriorityFeePerGas,\n minimumMaxFeePerGas: bufferedBaseFee + MIN_VAULT_PRIORITY_FEE_PER_GAS,\n rawPriorityFeePerGas,\n source: 'fee_history_p25',\n }\n}\n\nfunction resolveRpcPriorityFeeQuote({\n baseFeePerGas,\n rawPriorityFeePerGas,\n}: {\n baseFeePerGas: bigint\n rawPriorityFeePerGas: bigint\n}): VaultDeltaHedgeFeeQuote {\n const bufferedBaseFee = ceilMultiplyFraction(\n baseFeePerGas,\n BASE_FEE_BUFFER_NUMERATOR,\n BASE_FEE_BUFFER_DENOMINATOR,\n )\n return {\n maxFeePerGas: bufferedBaseFee + rawPriorityFeePerGas,\n maxPriorityFeePerGas: rawPriorityFeePerGas,\n minimumMaxFeePerGas: bufferedBaseFee + rawPriorityFeePerGas,\n rawPriorityFeePerGas,\n source: 'rpc_priority_fee',\n }\n}\n\nexport function getVaultTransactionReplacementFeeQuote({\n originalQuote,\n historicalQuote,\n gasLimit,\n finalReplacement = false,\n staleBoundsReplacement = false,\n}: {\n originalQuote: Pick<VaultTransactionFeeQuote, 'maxFeePerGas' | 'maxPriorityFeePerGas'>\n historicalQuote: VaultDeltaHedgeFeeQuote\n gasLimit: bigint\n finalReplacement?: boolean\n staleBoundsReplacement?: boolean\n}): VaultDeltaHedgeFeeQuote {\n if (gasLimit <= 0n) {\n throw new Error(`Vault transaction gas limit must be positive, received ${gasLimit.toString()}`)\n }\n\n const bumpedPriorityFee = staleBoundsReplacement\n ? ceilMultiplyFraction(\n originalQuote.maxPriorityFeePerGas,\n REPLACEMENT_FEE_BUMP_NUMERATOR,\n REPLACEMENT_FEE_BUMP_DENOMINATOR,\n )\n : ceilMultiplyFraction(\n originalQuote.maxPriorityFeePerGas,\n DELTA_HEDGE_PRIORITY_FEE_BUMP_NUMERATOR,\n DELTA_HEDGE_PRIORITY_FEE_BUMP_DENOMINATOR,\n )\n const bumpedMaxFee = ceilMultiplyFraction(\n originalQuote.maxFeePerGas,\n REPLACEMENT_FEE_BUMP_NUMERATOR,\n REPLACEMENT_FEE_BUMP_DENOMINATOR,\n )\n const escalatingPriorityFee =\n historicalQuote.maxPriorityFeePerGas > bumpedPriorityFee\n ? historicalQuote.maxPriorityFeePerGas\n : bumpedPriorityFee\n const priorityFeeLimit = staleBoundsReplacement\n ? MAX_STALE_DELTA_HEDGE_PRIORITY_FEE_PER_GAS\n : finalReplacement\n ? MAX_VAULT_PRIORITY_FEE_PER_GAS\n : MAX_DELTA_HEDGE_PRIORITY_FEE_PER_GAS\n const desiredMaxPriorityFeePerGas = finalReplacement\n ? MAX_VAULT_PRIORITY_FEE_PER_GAS\n : staleBoundsReplacement\n ? bumpedPriorityFee\n : escalatingPriorityFee\n const requiredReplacementPriorityFee = ceilMultiplyFraction(\n originalQuote.maxPriorityFeePerGas,\n REPLACEMENT_FEE_BUMP_NUMERATOR,\n REPLACEMENT_FEE_BUMP_DENOMINATOR,\n )\n const requiredMaxPriorityFeePerGas =\n desiredMaxPriorityFeePerGas < priorityFeeLimit ? desiredMaxPriorityFeePerGas : priorityFeeLimit\n if (requiredMaxPriorityFeePerGas < requiredReplacementPriorityFee) {\n throw new VaultTransactionReplacementLimitError({\n code: 'PriorityFeeCapExceeded',\n gasLimit,\n requiredMaxFeePerGas: originalQuote.maxFeePerGas,\n requiredMaxPriorityFeePerGas: requiredReplacementPriorityFee,\n maximumAffordableFeePerGas: MAX_VAULT_TRANSACTION_GAS_COST / gasLimit,\n })\n }\n const bufferedBaseFee = historicalQuote.minimumMaxFeePerGas - MIN_VAULT_PRIORITY_FEE_PER_GAS\n const currentMarketMaxFee = bufferedBaseFee + requiredMaxPriorityFeePerGas\n const desiredMaxFeePerGas =\n currentMarketMaxFee > bumpedMaxFee ? currentMarketMaxFee : bumpedMaxFee\n const maximumAffordableFeePerGas = MAX_VAULT_TRANSACTION_GAS_COST / gasLimit\n\n if (\n bumpedMaxFee > maximumAffordableFeePerGas ||\n requiredMaxPriorityFeePerGas > maximumAffordableFeePerGas\n ) {\n throw new VaultTransactionReplacementLimitError({\n code: 'GasCostCapExceeded',\n gasLimit,\n requiredMaxFeePerGas: bumpedMaxFee,\n requiredMaxPriorityFeePerGas,\n maximumAffordableFeePerGas,\n })\n }\n const maxFeePerGas =\n desiredMaxFeePerGas < maximumAffordableFeePerGas\n ? desiredMaxFeePerGas\n : maximumAffordableFeePerGas\n\n return {\n ...historicalQuote,\n maxFeePerGas,\n maxPriorityFeePerGas: requiredMaxPriorityFeePerGas,\n }\n}\n\nfunction resolveFallbackQuote({\n maxFeePerGas: estimatedMaxFeePerGas,\n maxPriorityFeePerGas: estimatedPriorityFeePerGas,\n}: {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}): VaultTransactionFeeQuote {\n const maxPriorityFeePerGas = clampPriorityFee(estimatedPriorityFeePerGas)\n const estimatedBaseFeeAllowance =\n estimatedMaxFeePerGas > estimatedPriorityFeePerGas\n ? estimatedMaxFeePerGas - estimatedPriorityFeePerGas\n : 0n\n\n return {\n maxFeePerGas: estimatedBaseFeeAllowance + maxPriorityFeePerGas,\n maxPriorityFeePerGas,\n minimumMaxFeePerGas: estimatedBaseFeeAllowance + MIN_VAULT_PRIORITY_FEE_PER_GAS,\n source: 'viem_fallback',\n }\n}\n\nexport function applyVaultTransactionGasCostLimit(\n quote: VaultTransactionFeeQuote,\n gasLimit: bigint,\n): VaultTransactionFeeQuote {\n if (gasLimit <= 0n) {\n throw new Error(`Vault transaction gas limit must be positive, received ${gasLimit.toString()}`)\n }\n\n const maximumAffordableFeePerGas = MAX_VAULT_TRANSACTION_GAS_COST / gasLimit\n if (maximumAffordableFeePerGas < quote.minimumMaxFeePerGas) {\n throw new VaultTransactionGasCostLimitError({\n gasLimit,\n maximumAffordableFeePerGas,\n minimumRequiredFeePerGas: quote.minimumMaxFeePerGas,\n })\n }\n\n if (quote.maxFeePerGas <= maximumAffordableFeePerGas) return quote\n\n const bufferedBaseFee = quote.minimumMaxFeePerGas - MIN_VAULT_PRIORITY_FEE_PER_GAS\n const affordablePriorityFee = maximumAffordableFeePerGas - bufferedBaseFee\n return {\n ...quote,\n maxFeePerGas: maximumAffordableFeePerGas,\n maxPriorityFeePerGas:\n quote.maxPriorityFeePerGas < affordablePriorityFee\n ? quote.maxPriorityFeePerGas\n : affordablePriorityFee,\n }\n}\n\nexport function bufferVaultTransactionGasEstimate(gasEstimate: bigint): bigint {\n if (gasEstimate <= 0n) {\n throw new Error(\n `Vault transaction gas estimate must be positive, received ${gasEstimate.toString()}`,\n )\n }\n return ceilMultiplyFraction(\n gasEstimate,\n GAS_ESTIMATE_BUFFER_NUMERATOR,\n GAS_ESTIMATE_BUFFER_DENOMINATOR,\n )\n}\n\nexport function validateVaultSignedTransactionFeeCaps(\n feeCaps: VaultSignedTransactionFeeCaps,\n quote?: VaultTransactionFeeQuote,\n): VaultSignedTransactionFeeValidationResult {\n const { gasLimit, maxFeePerGas, maxPriorityFeePerGas } = feeCaps\n if (maxFeePerGas === null || maxPriorityFeePerGas === null) {\n return {\n valid: false,\n code: 'MissingEip1559Fees',\n reason: 'Signed transaction must include EIP-1559 max fee and priority fee caps.',\n }\n }\n if (maxPriorityFeePerGas > maxFeePerGas) {\n return {\n valid: false,\n code: 'InvalidFeeCaps',\n reason:\n `Signed transaction maxPriorityFeePerGas (${maxPriorityFeePerGas.toString()} wei) ` +\n `cannot exceed maxFeePerGas (${maxFeePerGas.toString()} wei).`,\n }\n }\n if (maxPriorityFeePerGas < MIN_VAULT_PRIORITY_FEE_PER_GAS) {\n return {\n valid: false,\n code: 'PriorityFeeTooLow',\n reason:\n `Signed transaction maxPriorityFeePerGas (${maxPriorityFeePerGas.toString()} wei) ` +\n `must be at least ${MIN_VAULT_PRIORITY_FEE_PER_GAS.toString()} wei (0.1 gwei).`,\n }\n }\n if (maxPriorityFeePerGas > MAX_VAULT_PRIORITY_FEE_PER_GAS) {\n return {\n valid: false,\n code: 'PriorityFeeTooHigh',\n reason:\n `Signed transaction maxPriorityFeePerGas (${maxPriorityFeePerGas.toString()} wei) ` +\n `must not exceed ${MAX_VAULT_PRIORITY_FEE_PER_GAS.toString()} wei (3 gwei).`,\n }\n }\n if (\n gasLimit !== undefined &&\n gasLimit !== null &&\n gasLimit * maxFeePerGas > MAX_VAULT_TRANSACTION_GAS_COST\n ) {\n return {\n valid: false,\n code: 'GasCostTooHigh',\n reason:\n `Signed transaction maximum gas cost (${(gasLimit * maxFeePerGas).toString()} wei) ` +\n `must not exceed ${MAX_VAULT_TRANSACTION_GAS_COST.toString()} wei (0.015 ETH).`,\n }\n }\n if (quote !== undefined && maxFeePerGas < quote.minimumMaxFeePerGas) {\n return {\n valid: false,\n code: 'MaxFeeTooLow',\n reason:\n `Signed transaction maxFeePerGas (${maxFeePerGas.toString()} wei) must be at least ` +\n `${quote.minimumMaxFeePerGas.toString()} wei for the buffered next-block base fee ` +\n 'and 0.1 gwei minimum priority fee.',\n }\n }\n return { valid: true }\n}\n\nasync function resolveVaultTransactionFeeQuote({\n readFeeHistory,\n readFallbackEstimate,\n}: {\n readFeeHistory: () => Promise<FeeHistorySnapshot>\n readFallbackEstimate: () => Promise<FallbackFeeEstimate>\n}): Promise<VaultTransactionFeeQuote> {\n let feeHistoryError: unknown\n try {\n const quote = resolveFeeHistoryQuote(await readFeeHistory())\n if (quote !== null) return quote\n feeHistoryError = new Error('eth_feeHistory returned incomplete base fee or reward data')\n } catch (error) {\n feeHistoryError = error\n }\n\n try {\n return resolveFallbackQuote(await readFallbackEstimate())\n } catch (fallbackError) {\n throw new VaultTransactionFeeEstimationError({ feeHistoryError, fallbackError })\n }\n}\n\n/**\n * Resolve explicit EIP-1559 fees for operator-controlled vault transactions.\n *\n * The normal path follows the median p90 priority fee from the last 20 blocks,\n * with a 0.1 gwei floor and 3 gwei ceiling. If fee history is unavailable,\n * Viem's estimate is used while preserving those bounds and its original\n * base-fee allowance.\n */\nexport async function getVaultTransactionFeeQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n): Promise<VaultTransactionFeeQuote> {\n return resolveVaultTransactionFeeQuote({\n readFeeHistory: () =>\n getFeeHistory(client, {\n blockCount: FEE_HISTORY_BLOCK_COUNT,\n blockTag: 'latest',\n rewardPercentiles: FEE_HISTORY_REWARD_PERCENTILES,\n }),\n readFallbackEstimate: () => estimateFeesPerGas(client),\n })\n}\n\nexport async function getVaultDeltaHedgeHistoricalFeeQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n): Promise<VaultDeltaHedgeFeeQuote> {\n const feeHistory = await getFeeHistory(client, {\n blockCount: FEE_HISTORY_BLOCK_COUNT,\n blockTag: 'latest',\n rewardPercentiles: DELTA_HEDGE_FEE_HISTORY_REWARD_PERCENTILES,\n })\n const quote = resolveDeltaHedgeFeeHistoryQuote(feeHistory)\n if (quote === null) {\n throw new Error('eth_feeHistory returned incomplete p25 base fee or reward data')\n }\n return quote\n}\n\nasync function resolveVaultDeltaHedgeInitialFeeQuote({\n readRpcQuote,\n readHistoricalQuote,\n}: {\n readRpcQuote: () => Promise<{ baseFeePerGas: bigint; rawPriorityFeePerGas: bigint }>\n readHistoricalQuote: () => Promise<VaultDeltaHedgeFeeQuote>\n}): Promise<VaultDeltaHedgeFeeQuote> {\n try {\n return resolveRpcPriorityFeeQuote(await readRpcQuote())\n } catch {\n return readHistoricalQuote()\n }\n}\n\n/**\n * Resolve the first fee quote for a delta hedge from the connected RPC's\n * eth_maxPriorityFeePerGas recommendation. A failed RPC recommendation falls\n * back immediately to the rolling historical p25 quote.\n */\nexport async function getVaultDeltaHedgeInitialFeeQuote<chain extends Chain | undefined>(\n client: Client<Transport, chain>,\n): Promise<VaultDeltaHedgeFeeQuote> {\n return resolveVaultDeltaHedgeInitialFeeQuote({\n readRpcQuote: async () => {\n const [rawPriorityFee, latestBlock] = await Promise.all([\n client.request({ method: 'eth_maxPriorityFeePerGas' }),\n getBlock(client, { blockTag: 'latest' }),\n ])\n if (latestBlock.baseFeePerGas === null) {\n throw new Error('Latest block does not include an EIP-1559 base fee')\n }\n return {\n baseFeePerGas: latestBlock.baseFeePerGas,\n rawPriorityFeePerGas: hexToBigInt(rawPriorityFee),\n }\n },\n readHistoricalQuote: () => getVaultDeltaHedgeHistoricalFeeQuote(client),\n })\n}\n\nexport const __transactionFeeTestUtils = {\n clampPriorityFee,\n resolveDeltaHedgeFeeHistoryQuote,\n resolveFallbackQuote,\n resolveFeeHistoryQuote,\n resolveRpcPriorityFeeQuote,\n resolveVaultDeltaHedgeInitialFeeQuote,\n resolveVaultTransactionFeeQuote,\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { BatchValidationError, DEFAULT_VEGOID, InputListFailError, InvalidTickLimitsError, InvalidTokenIdParameterError, LEG_BITS, LEG_LIMITS, LEG_MASKS, LoanSlotExhaustedError, MaxRetriesExceededError, MissingPositionIdsError, NoLoanPositionsError, OracleRateLimitedError, PanopticError, PanopticValidationError, PositionSnapshotNotFoundError, ProviderLagError, STANDARD_TICK_WIDTHS, STRIKE_CONVERSION_FACTOR, SwapTokenMismatchError, SyncTimeoutError, TOKEN_ID_BITS, UnsafePremiumSettlementError, collateralTrackerV2Abi, createTxResult, decodeLeftRightUnsigned, decodeOracleTiming, decodePosition, decodeTickSpacing, formatTokenAmount, getBlockMeta, getOpenPositionIds, getPool, getPoolMetaKey, getPoolMetadata, getPositionMetaKey, getPositions, getPositionsKey, getSyncCheckpointKey, getTrackedPositionIds, jsonSerializer, oracleEpochAt, panopticErrorsAbi, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticPoolV2Abi, parsePanopticError, parseTokenAmount, submitWrite } from "./rates-
|
|
2
|
-
import { MAX_TICK, MIN_TICK, REORG_DEPTH, calculatePositionGreeks, priceToTick, roundToTickSpacing, sqrtPriceX96ToTick, tickLimits, tickToPrice, tickToPriceDecimalScaled, tickToSqrtPriceX96 } from "./greeks-
|
|
1
|
+
import { BatchValidationError, DEFAULT_VEGOID, InputListFailError, InvalidTickLimitsError, InvalidTokenIdParameterError, LEG_BITS, LEG_LIMITS, LEG_MASKS, LoanSlotExhaustedError, MaxRetriesExceededError, MissingPositionIdsError, NoLoanPositionsError, OracleRateLimitedError, PanopticError, PanopticValidationError, PositionSnapshotNotFoundError, ProviderLagError, STANDARD_TICK_WIDTHS, STRIKE_CONVERSION_FACTOR, SwapTokenMismatchError, SyncTimeoutError, TOKEN_ID_BITS, UnsafePremiumSettlementError, collateralTrackerV2Abi, createTxResult, decodeLeftRightUnsigned, decodeOracleTiming, decodePosition, decodeTickSpacing, formatTokenAmount, getBlockMeta, getOpenPositionIds, getPool, getPoolMetaKey, getPoolMetadata, getPositionMetaKey, getPositions, getPositionsKey, getSyncCheckpointKey, getTrackedPositionIds, jsonSerializer, oracleEpochAt, panopticErrorsAbi, panopticFactoryV3Abi, panopticFactoryV4Abi, panopticPoolV2Abi, parsePanopticError, parseTokenAmount, submitWrite } from "./rates-COAJpKRd.js";
|
|
2
|
+
import { MAX_TICK, MIN_TICK, REORG_DEPTH, calculatePositionGreeks, priceToTick, roundToTickSpacing, sqrtPriceX96ToTick, tickLimits, tickToPrice, tickToPriceDecimalScaled, tickToSqrtPriceX96 } from "./greeks-CNi1-cnp.js";
|
|
3
3
|
import { decodeFunctionResult, encodeFunctionData, erc20Abi, getAbiItem } from "viem";
|
|
4
4
|
|
|
5
5
|
//#region src/panoptic/v2/writes/broadcaster.ts
|
|
@@ -3595,7 +3595,7 @@ async function simulateWithTokenFlow(params) {
|
|
|
3595
3595
|
const delta1 = assetsAfter.assets1 - assetsBefore.assets1;
|
|
3596
3596
|
let gasEstimate = 0n;
|
|
3597
3597
|
try {
|
|
3598
|
-
gasEstimate = await client.estimateGas({
|
|
3598
|
+
if (params.estimateGas !== false) gasEstimate = await client.estimateGas({
|
|
3599
3599
|
account: user,
|
|
3600
3600
|
to: poolAddress,
|
|
3601
3601
|
data: callData,
|
|
@@ -5122,6 +5122,7 @@ async function simulateOpenPosition(params) {
|
|
|
5122
5122
|
]
|
|
5123
5123
|
});
|
|
5124
5124
|
const flowResult = await simulateWithTokenFlow({
|
|
5125
|
+
estimateGas: params.estimateGas,
|
|
5125
5126
|
client,
|
|
5126
5127
|
poolAddress,
|
|
5127
5128
|
user: account,
|
package/dist/zodiac/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Hex } from "viem";
|
|
1
|
+
import { Address, ContractFunctionArgs, ContractFunctionName, Hex } from "viem";
|
|
2
2
|
|
|
3
3
|
//#region src/zodiac/rolesAbi.d.ts
|
|
4
4
|
/** Minimal Zodiac Roles v2 modifier ABI used by the scoping/apply flows. */
|
|
@@ -99,12 +99,13 @@ declare const rolesV2Abi: readonly [{
|
|
|
99
99
|
readonly outputs: readonly [];
|
|
100
100
|
}]; //#endregion
|
|
101
101
|
//#region src/zodiac/applySteps.d.ts
|
|
102
|
-
|
|
103
|
-
|
|
102
|
+
type ScopeFunctionName = ContractFunctionName<typeof rolesV2Abi, 'nonpayable'>;
|
|
103
|
+
/** One idempotent Roles-modifier configuration call, paired with its ABI arguments. */
|
|
104
|
+
type ScopeStep = { [Name in ScopeFunctionName]: {
|
|
104
105
|
name: string;
|
|
105
|
-
functionName:
|
|
106
|
-
args:
|
|
107
|
-
}
|
|
106
|
+
functionName: Name;
|
|
107
|
+
args: ContractFunctionArgs<typeof rolesV2Abi, 'nonpayable', Name>;
|
|
108
|
+
} }[ScopeFunctionName];
|
|
108
109
|
/**
|
|
109
110
|
* Minimal structural client shapes (instead of viem's `PublicClient` /
|
|
110
111
|
* `WalletClient`) so any viem 2.x instance is accepted — pnpm peer-keying can
|
|
@@ -285,6 +286,49 @@ declare function buildDispatchCustomRoleSteps(params: {
|
|
|
285
286
|
extra?: Hex;
|
|
286
287
|
}): ScopeStep[];
|
|
287
288
|
|
|
289
|
+
//#endregion
|
|
290
|
+
//#region src/zodiac/roles/liquidator.d.ts
|
|
291
|
+
/**
|
|
292
|
+
* Liquidator role: scopes ONLY `PanopticLiquidator.liquidate(LiquidateParams)`
|
|
293
|
+
* on the helper. `initializePool`, `execute`, `multicall`, `sweep`, and
|
|
294
|
+
* `quoteLiquidation` are never scoped.
|
|
295
|
+
*
|
|
296
|
+
* Split of enforcement (must match the LiquidatorCondition contract and the
|
|
297
|
+
* hand-encoded tree in zodiac-modules/test/LiquidatorRolesFork.t.sol, which is
|
|
298
|
+
* the golden spec for this builder):
|
|
299
|
+
* - THIS TREE pins the static fields: pool ∈ allowlist, account ∉ {safe,
|
|
300
|
+
* helper}, swap targets ∈ {router, 0}, premia flags = 0, and — via
|
|
301
|
+
* ExecutionOptions.None — zero outer msg.value (attached value is excluded
|
|
302
|
+
* from the helper's minDelta floors, so it must never flow through the
|
|
303
|
+
* role; native shortfalls are funded via nativeFundingAmount instead).
|
|
304
|
+
* - THE ADAPTER (Custom node on positionIdListTo; Roles hands it full
|
|
305
|
+
* calldata) enforces the cross-field invariants: flash/swap tokens ∈ pool
|
|
306
|
+
* underlyings, swap groups zeroed together or exact nonzero amounts,
|
|
307
|
+
* nativeFundingAmount only on native pools, floors ≥ 0 with one positive.
|
|
308
|
+
*/
|
|
309
|
+
declare const LIQUIDATE_SELECTOR: `0x${string}`;
|
|
310
|
+
interface LiquidatorConditionsParams {
|
|
311
|
+
/** Deployed LiquidatorCondition adapter. */
|
|
312
|
+
adapter: Address;
|
|
313
|
+
/** The Safe (avatar) — excluded as a liquidation target. */
|
|
314
|
+
safe: Address;
|
|
315
|
+
/** The PanopticLiquidator helper — also excluded as a target. */
|
|
316
|
+
helper: Address;
|
|
317
|
+
/** Pinned swap router (Uniswap Universal Router). */
|
|
318
|
+
router: Address;
|
|
319
|
+
/** PanopticPool allowlist (at least one). */
|
|
320
|
+
pools: readonly Address[];
|
|
321
|
+
/** Trailing 12 bytes of the Custom compValue (unused by the adapter). */
|
|
322
|
+
extra?: Hex;
|
|
323
|
+
}
|
|
324
|
+
/** BFS ConditionFlat tree over liquidate's single LiquidateParams tuple. */
|
|
325
|
+
declare function buildLiquidatorConditions(params: LiquidatorConditionsParams): ConditionFlat[];
|
|
326
|
+
/** assignRoles → scopeTarget → scopeFunction for the liquidator role. */
|
|
327
|
+
declare function buildLiquidatorRoleSteps(params: LiquidatorConditionsParams & {
|
|
328
|
+
roleKey: Hex;
|
|
329
|
+
member: Address;
|
|
330
|
+
}): ScopeStep[];
|
|
331
|
+
|
|
288
332
|
//#endregion
|
|
289
333
|
//#region src/zodiac/roles/loanHedger.d.ts
|
|
290
334
|
/**
|
|
@@ -508,5 +552,5 @@ declare function loanBitmaskCondition(): {
|
|
|
508
552
|
};
|
|
509
553
|
|
|
510
554
|
//#endregion
|
|
511
|
-
export { CANONICAL_ADAPTERS, ConditionFlat, DELEVERAGER_ROLE_KEY, DEPOSIT_SELECTOR, DISPATCH_FROM_SELECTOR, DISPATCH_SELECTOR, EXECUTE_SELECTOR, ExecutionOptions, LOAN_BITMASK_WINDOW_SHIFTS, MAINTENANCE_ROLE_KEY, MULTICALL_SELECTOR, MULTISEND_SELECTOR, Operator, ParameterType, ROLLER_ROLE_KEY, SIZE_ADJUSTER_ROLE_KEY, ScopeStep, WETH_DEPOSIT_SELECTOR, WETH_WITHDRAW_SELECTOR, WITHDRAW_SELECTOR, WITHDRAW_WITH_POSITIONS_SELECTOR, addressEqualCompValue, applyScopeSteps, buildDeleveragerDispatchConditions, buildDeleveragerRoleSteps, buildDepositConditions, buildDispatchCustomConditions, buildDispatchCustomRoleSteps, buildDispatchFromConditions, buildLoanOnlyDispatchConditions, buildMaintenanceRoleSteps, buildRollerRoleSteps, buildSfpmSwapConditions, buildSfpmSwapVenueSteps, buildSizeAdjusterRoleSteps, buildWithdrawConditions, buildWithdrawWithPositionsConditions, customCompValue, isPureLoanTokenId, legFieldMask, loanBitmaskCompValueAt, loanBitmaskCondition, loanWidthFieldsMask, optionRatioFieldsMask, roleKey, rolesV2Abi, sfpmPoolIdPinExtra, sizeCapExtra, strikeFieldsMask };
|
|
555
|
+
export { CANONICAL_ADAPTERS, ConditionFlat, DELEVERAGER_ROLE_KEY, DEPOSIT_SELECTOR, DISPATCH_FROM_SELECTOR, DISPATCH_SELECTOR, EXECUTE_SELECTOR, ExecutionOptions, LIQUIDATE_SELECTOR, LOAN_BITMASK_WINDOW_SHIFTS, LiquidatorConditionsParams, MAINTENANCE_ROLE_KEY, MULTICALL_SELECTOR, MULTISEND_SELECTOR, Operator, ParameterType, ROLLER_ROLE_KEY, SIZE_ADJUSTER_ROLE_KEY, ScopeStep, WETH_DEPOSIT_SELECTOR, WETH_WITHDRAW_SELECTOR, WITHDRAW_SELECTOR, WITHDRAW_WITH_POSITIONS_SELECTOR, addressEqualCompValue, applyScopeSteps, buildDeleveragerDispatchConditions, buildDeleveragerRoleSteps, buildDepositConditions, buildDispatchCustomConditions, buildDispatchCustomRoleSteps, buildDispatchFromConditions, buildLiquidatorConditions, buildLiquidatorRoleSteps, buildLoanOnlyDispatchConditions, buildMaintenanceRoleSteps, buildRollerRoleSteps, buildSfpmSwapConditions, buildSfpmSwapVenueSteps, buildSizeAdjusterRoleSteps, buildWithdrawConditions, buildWithdrawWithPositionsConditions, customCompValue, isPureLoanTokenId, legFieldMask, loanBitmaskCompValueAt, loanBitmaskCondition, loanWidthFieldsMask, optionRatioFieldsMask, roleKey, rolesV2Abi, sfpmPoolIdPinExtra, sizeCapExtra, strikeFieldsMask };
|
|
512
556
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":["rolesV2Abi","rolesV2Abi","ScopeStep","ScopeStepsPublicClient","Promise","ScopeStepsWalletClient","applyScopeSteps","Hex","ConditionFlat","addressEqualCompValue","customCompValue","sizeCapExtra","ParameterType","Operator","CANONICAL_ADAPTERS","ExecutionOptions","Hex","ScopeStep","ConditionFlat","DELEVERAGER_ROLE_KEY","buildDeleveragerDispatchConditions","buildDeleveragerRoleSteps","Hex","ScopeStep","ConditionFlat","DISPATCH_SELECTOR","roleKey","buildDispatchCustomConditions","buildDispatchCustomRoleSteps","Hex","ConditionFlat","LOAN_BITMASK_WINDOW_SHIFTS","loanBitmaskCompValueAt","buildLoanOnlyDispatchConditions","WITHDRAW_SELECTOR","DEPOSIT_SELECTOR","EXECUTE_SELECTOR","buildWithdrawConditions","buildDepositConditions","Hex","ScopeStep","ConditionFlat","MAINTENANCE_ROLE_KEY","DISPATCH_FROM_SELECTOR","buildDispatchFromConditions","buildMaintenanceRoleSteps","Hex","ScopeStep","ROLLER_ROLE_KEY","buildRollerRoleSteps","Hex","ScopeStep","ConditionFlat","MULTICALL_SELECTOR","MULTISEND_SELECTOR","WETH_DEPOSIT_SELECTOR","WETH_WITHDRAW_SELECTOR","WITHDRAW_WITH_POSITIONS_SELECTOR","buildWithdrawWithPositionsConditions","sfpmPoolIdPinExtra","buildSfpmSwapConditions","buildSfpmSwapVenueSteps","Hex","ScopeStep","SIZE_ADJUSTER_ROLE_KEY","buildSizeAdjusterRoleSteps","legFieldMask","loanWidthFieldsMask","strikeFieldsMask","optionRatioFieldsMask","isPureLoanTokenId","loanBitmaskCondition"],"sources":["../../src/zodiac/rolesAbi.d.ts","../../src/zodiac/applySteps.d.ts","../../src/zodiac/conditions.d.ts","../../src/zodiac/constants.d.ts","../../src/zodiac/roles/deleverager.d.ts","../../src/zodiac/roles/dispatchCustomRole.d.ts","../../src/zodiac/roles/loanHedger.d.ts","../../src/zodiac/roles/maintenance.d.ts","../../src/zodiac/roles/roller.d.ts","../../src/zodiac/roles/sfpmSwap.d.ts","../../src/zodiac/roles/sizeAdjuster.d.ts","../../src/zodiac/tokenIdMask.d.ts"],"sourcesContent":null,"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["rolesV2Abi","ContractFunctionArgs","ContractFunctionName","rolesV2Abi","ScopeFunctionName","ScopeStep","Name","ScopeStepsPublicClient","Promise","ScopeStepsWalletClient","applyScopeSteps","Hex","ConditionFlat","addressEqualCompValue","customCompValue","sizeCapExtra","ParameterType","Operator","CANONICAL_ADAPTERS","ExecutionOptions","Hex","ScopeStep","ConditionFlat","DELEVERAGER_ROLE_KEY","buildDeleveragerDispatchConditions","buildDeleveragerRoleSteps","Hex","ScopeStep","ConditionFlat","DISPATCH_SELECTOR","roleKey","buildDispatchCustomConditions","buildDispatchCustomRoleSteps","Address","Hex","ScopeStep","ConditionFlat","LIQUIDATE_SELECTOR","LiquidatorConditionsParams","buildLiquidatorConditions","buildLiquidatorRoleSteps","Hex","ConditionFlat","LOAN_BITMASK_WINDOW_SHIFTS","loanBitmaskCompValueAt","buildLoanOnlyDispatchConditions","WITHDRAW_SELECTOR","DEPOSIT_SELECTOR","EXECUTE_SELECTOR","buildWithdrawConditions","buildDepositConditions","Hex","ScopeStep","ConditionFlat","MAINTENANCE_ROLE_KEY","DISPATCH_FROM_SELECTOR","buildDispatchFromConditions","buildMaintenanceRoleSteps","Hex","ScopeStep","ROLLER_ROLE_KEY","buildRollerRoleSteps","Hex","ScopeStep","ConditionFlat","MULTICALL_SELECTOR","MULTISEND_SELECTOR","WETH_DEPOSIT_SELECTOR","WETH_WITHDRAW_SELECTOR","WITHDRAW_WITH_POSITIONS_SELECTOR","buildWithdrawWithPositionsConditions","sfpmPoolIdPinExtra","buildSfpmSwapConditions","buildSfpmSwapVenueSteps","Hex","ScopeStep","SIZE_ADJUSTER_ROLE_KEY","buildSizeAdjusterRoleSteps","legFieldMask","loanWidthFieldsMask","strikeFieldsMask","optionRatioFieldsMask","isPureLoanTokenId","loanBitmaskCondition"],"sources":["../../src/zodiac/rolesAbi.d.ts","../../src/zodiac/applySteps.d.ts","../../src/zodiac/conditions.d.ts","../../src/zodiac/constants.d.ts","../../src/zodiac/roles/deleverager.d.ts","../../src/zodiac/roles/dispatchCustomRole.d.ts","../../src/zodiac/roles/liquidator.d.ts","../../src/zodiac/roles/loanHedger.d.ts","../../src/zodiac/roles/maintenance.d.ts","../../src/zodiac/roles/roller.d.ts","../../src/zodiac/roles/sfpmSwap.d.ts","../../src/zodiac/roles/sizeAdjuster.d.ts","../../src/zodiac/tokenIdMask.d.ts"],"sourcesContent":null,"mappings":"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"}
|
package/dist/zodiac/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { keccak256, toBytes, toFunctionSelector, zeroHash } from "viem";
|
|
1
|
+
import { keccak256, toBytes, toFunctionSelector, zeroAddress, zeroHash } from "viem";
|
|
2
2
|
|
|
3
3
|
//#region src/zodiac/rolesAbi.ts
|
|
4
4
|
/** Minimal Zodiac Roles v2 modifier ABI used by the scoping/apply flows. */
|
|
@@ -523,6 +523,158 @@ function buildDeleveragerRoleSteps(params) {
|
|
|
523
523
|
];
|
|
524
524
|
}
|
|
525
525
|
|
|
526
|
+
//#endregion
|
|
527
|
+
//#region src/zodiac/roles/liquidator.ts
|
|
528
|
+
/**
|
|
529
|
+
* Liquidator role: scopes ONLY `PanopticLiquidator.liquidate(LiquidateParams)`
|
|
530
|
+
* on the helper. `initializePool`, `execute`, `multicall`, `sweep`, and
|
|
531
|
+
* `quoteLiquidation` are never scoped.
|
|
532
|
+
*
|
|
533
|
+
* Split of enforcement (must match the LiquidatorCondition contract and the
|
|
534
|
+
* hand-encoded tree in zodiac-modules/test/LiquidatorRolesFork.t.sol, which is
|
|
535
|
+
* the golden spec for this builder):
|
|
536
|
+
* - THIS TREE pins the static fields: pool ∈ allowlist, account ∉ {safe,
|
|
537
|
+
* helper}, swap targets ∈ {router, 0}, premia flags = 0, and — via
|
|
538
|
+
* ExecutionOptions.None — zero outer msg.value (attached value is excluded
|
|
539
|
+
* from the helper's minDelta floors, so it must never flow through the
|
|
540
|
+
* role; native shortfalls are funded via nativeFundingAmount instead).
|
|
541
|
+
* - THE ADAPTER (Custom node on positionIdListTo; Roles hands it full
|
|
542
|
+
* calldata) enforces the cross-field invariants: flash/swap tokens ∈ pool
|
|
543
|
+
* underlyings, swap groups zeroed together or exact nonzero amounts,
|
|
544
|
+
* nativeFundingAmount only on native pools, floors ≥ 0 with one positive.
|
|
545
|
+
*/
|
|
546
|
+
const LIQUIDATE_SELECTOR = toFunctionSelector("liquidate((address,address,uint256[],uint256,address,uint256,uint256,address,bytes,address,uint256,address,bytes,address,uint256,int256,int256))");
|
|
547
|
+
/** BFS ConditionFlat tree over liquidate's single LiquidateParams tuple. */
|
|
548
|
+
function buildLiquidatorConditions(params) {
|
|
549
|
+
const { adapter, safe, helper, router, pools, extra = "0x" } = params;
|
|
550
|
+
if (pools.length === 0) throw new Error("liquidator role needs at least one pool");
|
|
551
|
+
const pass = (parent, paramType) => ({
|
|
552
|
+
parent,
|
|
553
|
+
paramType,
|
|
554
|
+
operator: Operator.Pass,
|
|
555
|
+
compValue: "0x"
|
|
556
|
+
});
|
|
557
|
+
const conditions = [
|
|
558
|
+
{
|
|
559
|
+
parent: 0,
|
|
560
|
+
paramType: ParameterType.Calldata,
|
|
561
|
+
operator: Operator.Matches,
|
|
562
|
+
compValue: "0x"
|
|
563
|
+
},
|
|
564
|
+
{
|
|
565
|
+
parent: 0,
|
|
566
|
+
paramType: ParameterType.Tuple,
|
|
567
|
+
operator: Operator.Matches,
|
|
568
|
+
compValue: "0x"
|
|
569
|
+
},
|
|
570
|
+
{
|
|
571
|
+
parent: 1,
|
|
572
|
+
paramType: ParameterType.None,
|
|
573
|
+
operator: Operator.Or,
|
|
574
|
+
compValue: "0x"
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
parent: 1,
|
|
578
|
+
paramType: ParameterType.None,
|
|
579
|
+
operator: Operator.Nor,
|
|
580
|
+
compValue: "0x"
|
|
581
|
+
},
|
|
582
|
+
{
|
|
583
|
+
parent: 1,
|
|
584
|
+
paramType: ParameterType.Array,
|
|
585
|
+
operator: Operator.Custom,
|
|
586
|
+
compValue: customCompValue(adapter, extra)
|
|
587
|
+
},
|
|
588
|
+
{
|
|
589
|
+
parent: 1,
|
|
590
|
+
paramType: ParameterType.Static,
|
|
591
|
+
operator: Operator.EqualTo,
|
|
592
|
+
compValue: "0x0000000000000000000000000000000000000000000000000000000000000000"
|
|
593
|
+
},
|
|
594
|
+
pass(1, ParameterType.Static),
|
|
595
|
+
pass(1, ParameterType.Static),
|
|
596
|
+
pass(1, ParameterType.Static),
|
|
597
|
+
{
|
|
598
|
+
parent: 1,
|
|
599
|
+
paramType: ParameterType.None,
|
|
600
|
+
operator: Operator.Or,
|
|
601
|
+
compValue: "0x"
|
|
602
|
+
},
|
|
603
|
+
pass(1, ParameterType.Dynamic),
|
|
604
|
+
pass(1, ParameterType.Static),
|
|
605
|
+
pass(1, ParameterType.Static),
|
|
606
|
+
{
|
|
607
|
+
parent: 1,
|
|
608
|
+
paramType: ParameterType.None,
|
|
609
|
+
operator: Operator.Or,
|
|
610
|
+
compValue: "0x"
|
|
611
|
+
},
|
|
612
|
+
pass(1, ParameterType.Dynamic),
|
|
613
|
+
pass(1, ParameterType.Static),
|
|
614
|
+
pass(1, ParameterType.Static),
|
|
615
|
+
pass(1, ParameterType.Static),
|
|
616
|
+
pass(1, ParameterType.Static)
|
|
617
|
+
];
|
|
618
|
+
for (const pool of pools) conditions.push({
|
|
619
|
+
parent: 2,
|
|
620
|
+
paramType: ParameterType.Static,
|
|
621
|
+
operator: Operator.EqualTo,
|
|
622
|
+
compValue: addressEqualCompValue(pool)
|
|
623
|
+
});
|
|
624
|
+
for (const excluded of [safe, helper]) conditions.push({
|
|
625
|
+
parent: 3,
|
|
626
|
+
paramType: ParameterType.Static,
|
|
627
|
+
operator: Operator.EqualTo,
|
|
628
|
+
compValue: addressEqualCompValue(excluded)
|
|
629
|
+
});
|
|
630
|
+
conditions.push(pass(4, ParameterType.Static));
|
|
631
|
+
for (const parent of [9, 13]) {
|
|
632
|
+
conditions.push({
|
|
633
|
+
parent,
|
|
634
|
+
paramType: ParameterType.Static,
|
|
635
|
+
operator: Operator.EqualTo,
|
|
636
|
+
compValue: addressEqualCompValue(router)
|
|
637
|
+
});
|
|
638
|
+
conditions.push({
|
|
639
|
+
parent,
|
|
640
|
+
paramType: ParameterType.Static,
|
|
641
|
+
operator: Operator.EqualTo,
|
|
642
|
+
compValue: addressEqualCompValue(zeroAddress)
|
|
643
|
+
});
|
|
644
|
+
}
|
|
645
|
+
return conditions;
|
|
646
|
+
}
|
|
647
|
+
/** assignRoles → scopeTarget → scopeFunction for the liquidator role. */
|
|
648
|
+
function buildLiquidatorRoleSteps(params) {
|
|
649
|
+
return [
|
|
650
|
+
{
|
|
651
|
+
name: "assignRoles(liquidator member)",
|
|
652
|
+
functionName: "assignRoles",
|
|
653
|
+
args: [
|
|
654
|
+
params.member,
|
|
655
|
+
[params.roleKey],
|
|
656
|
+
[true]
|
|
657
|
+
]
|
|
658
|
+
},
|
|
659
|
+
{
|
|
660
|
+
name: "scopeTarget(helper)",
|
|
661
|
+
functionName: "scopeTarget",
|
|
662
|
+
args: [params.roleKey, params.helper]
|
|
663
|
+
},
|
|
664
|
+
{
|
|
665
|
+
name: "scopeFunction(liquidate, liquidator conditions)",
|
|
666
|
+
functionName: "scopeFunction",
|
|
667
|
+
args: [
|
|
668
|
+
params.roleKey,
|
|
669
|
+
params.helper,
|
|
670
|
+
LIQUIDATE_SELECTOR,
|
|
671
|
+
buildLiquidatorConditions(params),
|
|
672
|
+
ExecutionOptions.None
|
|
673
|
+
]
|
|
674
|
+
}
|
|
675
|
+
];
|
|
676
|
+
}
|
|
677
|
+
|
|
526
678
|
//#endregion
|
|
527
679
|
//#region src/zodiac/tokenIdMask.ts
|
|
528
680
|
/**
|
|
@@ -1150,5 +1302,5 @@ function buildSizeAdjusterRoleSteps(params) {
|
|
|
1150
1302
|
}
|
|
1151
1303
|
|
|
1152
1304
|
//#endregion
|
|
1153
|
-
export { CANONICAL_ADAPTERS, DELEVERAGER_ROLE_KEY, DEPOSIT_SELECTOR, DISPATCH_FROM_SELECTOR, DISPATCH_SELECTOR, EXECUTE_SELECTOR, ExecutionOptions, LOAN_BITMASK_WINDOW_SHIFTS, MAINTENANCE_ROLE_KEY, MULTICALL_SELECTOR, MULTISEND_SELECTOR, Operator, ParameterType, ROLLER_ROLE_KEY, SIZE_ADJUSTER_ROLE_KEY, WETH_DEPOSIT_SELECTOR, WETH_WITHDRAW_SELECTOR, WITHDRAW_SELECTOR, WITHDRAW_WITH_POSITIONS_SELECTOR, addressEqualCompValue, applyScopeSteps, buildDeleveragerDispatchConditions, buildDeleveragerRoleSteps, buildDepositConditions, buildDispatchCustomConditions, buildDispatchCustomRoleSteps, buildDispatchFromConditions, buildLoanOnlyDispatchConditions, buildMaintenanceRoleSteps, buildRollerRoleSteps, buildSfpmSwapConditions, buildSfpmSwapVenueSteps, buildSizeAdjusterRoleSteps, buildWithdrawConditions, buildWithdrawWithPositionsConditions, customCompValue, isPureLoanTokenId, legFieldMask, loanBitmaskCompValueAt, loanBitmaskCondition, loanWidthFieldsMask, optionRatioFieldsMask, roleKey, rolesV2Abi, sfpmPoolIdPinExtra, sizeCapExtra, strikeFieldsMask };
|
|
1305
|
+
export { CANONICAL_ADAPTERS, DELEVERAGER_ROLE_KEY, DEPOSIT_SELECTOR, DISPATCH_FROM_SELECTOR, DISPATCH_SELECTOR, EXECUTE_SELECTOR, ExecutionOptions, LIQUIDATE_SELECTOR, LOAN_BITMASK_WINDOW_SHIFTS, MAINTENANCE_ROLE_KEY, MULTICALL_SELECTOR, MULTISEND_SELECTOR, Operator, ParameterType, ROLLER_ROLE_KEY, SIZE_ADJUSTER_ROLE_KEY, WETH_DEPOSIT_SELECTOR, WETH_WITHDRAW_SELECTOR, WITHDRAW_SELECTOR, WITHDRAW_WITH_POSITIONS_SELECTOR, addressEqualCompValue, applyScopeSteps, buildDeleveragerDispatchConditions, buildDeleveragerRoleSteps, buildDepositConditions, buildDispatchCustomConditions, buildDispatchCustomRoleSteps, buildDispatchFromConditions, buildLiquidatorConditions, buildLiquidatorRoleSteps, buildLoanOnlyDispatchConditions, buildMaintenanceRoleSteps, buildRollerRoleSteps, buildSfpmSwapConditions, buildSfpmSwapVenueSteps, buildSizeAdjusterRoleSteps, buildWithdrawConditions, buildWithdrawWithPositionsConditions, customCompValue, isPureLoanTokenId, legFieldMask, loanBitmaskCompValueAt, loanBitmaskCondition, loanWidthFieldsMask, optionRatioFieldsMask, roleKey, rolesV2Abi, sfpmPoolIdPinExtra, sizeCapExtra, strikeFieldsMask };
|
|
1154
1306
|
//# sourceMappingURL=index.js.map
|