levr-sdk 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -4
- package/dist/esm/client/hook/index.js +5 -9
- package/dist/esm/client/hook/index.js.map +1 -1
- package/dist/esm/client/hook/use-airdrop.js +19 -0
- package/dist/esm/client/hook/use-airdrop.js.map +1 -0
- package/dist/esm/client/hook/use-clanker.js +1 -34
- package/dist/esm/client/hook/use-clanker.js.map +1 -1
- package/dist/esm/client/hook/use-governance.js +2 -2
- package/dist/esm/client/hook/use-governance.js.map +1 -1
- package/dist/esm/client/hook/use-project.js +30 -6
- package/dist/esm/client/hook/use-project.js.map +1 -1
- package/dist/esm/client/hook/use-swap.js +0 -2
- package/dist/esm/client/hook/use-swap.js.map +1 -1
- package/dist/esm/client/levr-provider.js +10 -7
- package/dist/esm/client/levr-provider.js.map +1 -1
- package/dist/esm/fee-receivers.js +35 -6
- package/dist/esm/fee-receivers.js.map +1 -1
- package/dist/esm/governance.js +3 -12
- package/dist/esm/governance.js.map +1 -1
- package/dist/esm/project.js +106 -63
- package/dist/esm/project.js.map +1 -1
- package/dist/esm/quote/index.js +2 -2
- package/dist/esm/quote/v4.js +142 -128
- package/dist/esm/quote/v4.js.map +1 -1
- package/dist/esm/stake.js +1 -1
- package/dist/esm/stake.js.map +1 -1
- package/dist/esm/treasury.js +70 -148
- package/dist/esm/treasury.js.map +1 -1
- package/dist/esm/usd-price.js +21 -4
- package/dist/esm/usd-price.js.map +1 -1
- package/dist/esm/user.js +1 -1
- package/dist/esm/user.js.map +1 -1
- package/dist/types/client/hook/index.d.ts +5 -12
- package/dist/types/client/hook/index.d.ts.map +1 -1
- package/dist/types/client/hook/use-airdrop.d.ts +11 -0
- package/dist/types/client/hook/use-airdrop.d.ts.map +1 -0
- package/dist/types/client/hook/use-clanker.d.ts +1 -18
- package/dist/types/client/hook/use-clanker.d.ts.map +1 -1
- package/dist/types/client/hook/use-governance.d.ts +2 -1
- package/dist/types/client/hook/use-governance.d.ts.map +1 -1
- package/dist/types/client/hook/use-project.d.ts +11 -1
- package/dist/types/client/hook/use-project.d.ts.map +1 -1
- package/dist/types/client/hook/use-swap.d.ts.map +1 -1
- package/dist/types/client/levr-provider.d.ts +3 -10
- package/dist/types/client/levr-provider.d.ts.map +1 -1
- package/dist/types/fee-receivers.d.ts +514 -0
- package/dist/types/fee-receivers.d.ts.map +1 -1
- package/dist/types/governance.d.ts +2 -5
- package/dist/types/governance.d.ts.map +1 -1
- package/dist/types/project.d.ts +25 -6
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/quote/index.d.ts +2 -2
- package/dist/types/quote/v4.d.ts +5 -7
- package/dist/types/quote/v4.d.ts.map +1 -1
- package/dist/types/treasury.d.ts +1 -7
- package/dist/types/treasury.d.ts.map +1 -1
- package/dist/types/usd-price.d.ts +6 -1
- package/dist/types/usd-price.d.ts.map +1 -1
- package/dist/types/user.d.ts +1 -1
- package/dist/types/user.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/esm/quote/v4.js
CHANGED
|
@@ -1,131 +1,73 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { IClankerHookDynamicFee, IClankerHookStaticFee, V4Quoter } from "../abis/index.js";
|
|
3
|
-
import { UNISWAP_V4_QUOTER } from "../constants.js";
|
|
1
|
+
import { encodeFunctionData, formatUnits } from "viem";
|
|
2
|
+
import { IClankerHookDynamicFee, IClankerHookStaticFee, StateView, V4Quoter } from "../abis/index.js";
|
|
3
|
+
import { UNISWAP_V4_QUOTER, UNISWAP_V4_STATE_VIEW } from "../constants.js";
|
|
4
|
+
import { getPoolId } from "../pool-key.js";
|
|
4
5
|
// ============================================================================
|
|
5
6
|
// V4 Helper Functions
|
|
6
7
|
// ============================================================================
|
|
7
8
|
/**
|
|
8
|
-
* @description
|
|
9
|
+
* @description Convert sqrtPriceX96 to a decimal price (token1/token0)
|
|
10
|
+
* Uses the standard Uniswap formula: price = (sqrtPriceX96 / 2^96)^2
|
|
11
|
+
* Adjusted for token decimals
|
|
9
12
|
*/
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
functionName: "pairedFee",
|
|
24
|
-
args: [poolId],
|
|
25
|
-
},
|
|
26
|
-
],
|
|
27
|
-
});
|
|
28
|
-
if (results[0].status === "success" && results[1].status === "success") {
|
|
29
|
-
return {
|
|
30
|
-
clankerFee: Number(results[0].result),
|
|
31
|
-
pairedFee: Number(results[1].result),
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* @description Try to get dynamic fee configuration from a Clanker hook
|
|
42
|
-
*/
|
|
43
|
-
const tryGetDynamicFees = async (publicClient, hookAddress, poolId) => {
|
|
44
|
-
try {
|
|
45
|
-
const config = await publicClient.readContract({
|
|
46
|
-
address: hookAddress,
|
|
47
|
-
abi: IClankerHookDynamicFee,
|
|
48
|
-
functionName: "poolConfigVars",
|
|
49
|
-
args: [poolId],
|
|
50
|
-
});
|
|
51
|
-
return {
|
|
52
|
-
baseFee: Number(config.baseFee),
|
|
53
|
-
maxLpFee: Number(config.maxLpFee),
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
catch {
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
};
|
|
60
|
-
/**
|
|
61
|
-
* @description Get hook fee information from Clanker hooks
|
|
62
|
-
*/
|
|
63
|
-
const getHookFees = async (publicClient, poolKey) => {
|
|
64
|
-
// Generate pool ID for hook queries (keccak256 of abi.encode(PoolKey))
|
|
65
|
-
const poolId = keccak256(encodeAbiParameters([
|
|
66
|
-
{
|
|
67
|
-
type: "tuple",
|
|
68
|
-
components: [
|
|
69
|
-
{ name: "currency0", type: "address" },
|
|
70
|
-
{ name: "currency1", type: "address" },
|
|
71
|
-
{ name: "fee", type: "uint24" },
|
|
72
|
-
{ name: "tickSpacing", type: "int24" },
|
|
73
|
-
{ name: "hooks", type: "address" },
|
|
74
|
-
],
|
|
75
|
-
},
|
|
76
|
-
], [poolKey]));
|
|
77
|
-
// Try static fees first
|
|
78
|
-
const staticFees = await tryGetStaticFees(publicClient, poolKey.hooks, poolId);
|
|
79
|
-
if (staticFees) {
|
|
80
|
-
return {
|
|
81
|
-
type: "static",
|
|
82
|
-
clankerFee: staticFees.clankerFee,
|
|
83
|
-
pairedFee: staticFees.pairedFee,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
// Try dynamic fees
|
|
87
|
-
const dynamicFees = await tryGetDynamicFees(publicClient, poolKey.hooks, poolId);
|
|
88
|
-
if (dynamicFees) {
|
|
89
|
-
return {
|
|
90
|
-
type: "dynamic",
|
|
91
|
-
baseFee: dynamicFees.baseFee,
|
|
92
|
-
maxLpFee: dynamicFees.maxLpFee,
|
|
93
|
-
};
|
|
13
|
+
const sqrtPriceX96ToPrice = (sqrtPriceX96, decimals0, decimals1) => {
|
|
14
|
+
// Convert sqrtPriceX96 to a decimal number
|
|
15
|
+
// price = (sqrtPriceX96 / 2^96)^2
|
|
16
|
+
const Q96 = 2n ** 96n;
|
|
17
|
+
const numerator = sqrtPriceX96 * sqrtPriceX96;
|
|
18
|
+
const denominator = Q96 * Q96;
|
|
19
|
+
// Get the price as a float
|
|
20
|
+
let price = Number(numerator) / Number(denominator);
|
|
21
|
+
// Adjust for token decimals: price represents token1/token0
|
|
22
|
+
// If token0 has more decimals, we need to scale up the price
|
|
23
|
+
if (decimals0 !== decimals1) {
|
|
24
|
+
const decimalAdjustment = 10 ** (decimals0 - decimals1);
|
|
25
|
+
price = price * decimalAdjustment;
|
|
94
26
|
}
|
|
95
|
-
return
|
|
27
|
+
return price;
|
|
96
28
|
};
|
|
97
29
|
/**
|
|
98
|
-
* @description Calculate price impact using
|
|
99
|
-
* Compares the execution price to the
|
|
30
|
+
* @description Calculate price impact using the actual pool state
|
|
31
|
+
* Compares the execution price from the quote to the spot price before the swap
|
|
32
|
+
*
|
|
33
|
+
* This is the standard AMM price impact calculation:
|
|
34
|
+
* - Spot price (before swap): derived from sqrtPriceX96
|
|
35
|
+
* - Execution price: actual rate from quote (amountOut / amountIn)
|
|
36
|
+
* - Price impact: % difference between spot and execution price
|
|
37
|
+
*
|
|
38
|
+
* The execution price inherently accounts for price movement during the swap,
|
|
39
|
+
* as it represents the average price across the entire trade.
|
|
100
40
|
*/
|
|
101
|
-
const calculatePriceImpact = (amountIn, amountOut,
|
|
41
|
+
const calculatePriceImpact = (sqrtPriceX96, amountIn, amountOut, currency0Decimals, currency1Decimals, zeroForOne) => {
|
|
102
42
|
try {
|
|
103
|
-
//
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
const amountInFormatted = parseFloat(formatUnits(amountIn, zeroForOne ? currency0Decimals : currency1Decimals));
|
|
107
|
-
const amountOutFormatted = parseFloat(formatUnits(amountOut, zeroForOne ? currency1Decimals : currency0Decimals));
|
|
108
|
-
if (amountInFormatted === 0 || amountOutFormatted === 0)
|
|
43
|
+
// Get spot price from sqrtPriceX96 (token1/token0)
|
|
44
|
+
const spotPrice = sqrtPriceX96ToPrice(sqrtPriceX96, currency0Decimals, currency1Decimals);
|
|
45
|
+
if (spotPrice === 0)
|
|
109
46
|
return undefined;
|
|
110
|
-
//
|
|
111
|
-
|
|
112
|
-
const
|
|
113
|
-
|
|
47
|
+
// Calculate execution price from the quote
|
|
48
|
+
// Format amounts to decimals
|
|
49
|
+
const amountInFloat = parseFloat(formatUnits(amountIn, zeroForOne ? currency0Decimals : currency1Decimals));
|
|
50
|
+
const amountOutFloat = parseFloat(formatUnits(amountOut, zeroForOne ? currency1Decimals : currency0Decimals));
|
|
51
|
+
if (amountInFloat === 0 || amountOutFloat === 0)
|
|
114
52
|
return undefined;
|
|
115
|
-
//
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
? tokenPrice / wethPrice // Token → WETH
|
|
122
|
-
: wethPrice / tokenPrice; // WETH → Token
|
|
123
|
-
// Getting better or equal rate than market - minimal impact
|
|
124
|
-
if (executionRate >= marketRate) {
|
|
125
|
-
return 0.1;
|
|
53
|
+
// Execution price depends on swap direction
|
|
54
|
+
let executionPrice;
|
|
55
|
+
if (zeroForOne) {
|
|
56
|
+
// Swapping token0 -> token1
|
|
57
|
+
// Execution price = token1 received / token0 given = token1/token0
|
|
58
|
+
executionPrice = amountOutFloat / amountInFloat;
|
|
126
59
|
}
|
|
127
|
-
|
|
128
|
-
|
|
60
|
+
else {
|
|
61
|
+
// Swapping token1 -> token0
|
|
62
|
+
// Execution price = token0 received / token1 given = token0/token1
|
|
63
|
+
// Convert to token1/token0 to compare with spot price
|
|
64
|
+
executionPrice = 1 / (amountOutFloat / amountInFloat);
|
|
65
|
+
}
|
|
66
|
+
// Calculate price impact: |spotPrice - executionPrice| / spotPrice * 100
|
|
67
|
+
// For zeroForOne: we're buying token1, so price moves up -> execution > spot
|
|
68
|
+
// For oneForZero: we're buying token0, so price (token1/token0) moves down -> execution < spot
|
|
69
|
+
const impact = Math.abs((spotPrice - executionPrice) / spotPrice) * 100;
|
|
70
|
+
// Return impact in basis points-like format (as percentage)
|
|
129
71
|
return impact;
|
|
130
72
|
}
|
|
131
73
|
catch (error) {
|
|
@@ -138,6 +80,7 @@ const calculatePriceImpact = (amountIn, amountOut, currency0, currency1, currenc
|
|
|
138
80
|
// ============================================================================
|
|
139
81
|
/**
|
|
140
82
|
* @description Quote a swap on Uniswap V4 by reading from the quoter contract
|
|
83
|
+
* Uses a single multicall for optimal performance when fetching quote, pool state, and hook fees
|
|
141
84
|
* @param params Quote parameters including pool key and amount
|
|
142
85
|
* @returns Quote result with output amount, gas estimate, price impact, and hook fees
|
|
143
86
|
*/
|
|
@@ -145,16 +88,22 @@ export const quoteV4Read = async (params) => {
|
|
|
145
88
|
if (!params.publicClient) {
|
|
146
89
|
throw new Error("publicClient is required for read method");
|
|
147
90
|
}
|
|
148
|
-
const { publicClient, poolKey, zeroForOne, amountIn, hookData = "0x",
|
|
91
|
+
const { publicClient, poolKey, zeroForOne, amountIn, hookData = "0x", currency0Decimals = 18, currency1Decimals = 18, calculatePriceImpact: shouldCalculatePriceImpact = true, } = params;
|
|
149
92
|
const chainId = publicClient.chain?.id;
|
|
150
93
|
if (!chainId)
|
|
151
94
|
throw new Error("Chain ID not found on public client");
|
|
152
95
|
const quoterAddress = UNISWAP_V4_QUOTER(chainId);
|
|
153
96
|
if (!quoterAddress)
|
|
154
97
|
throw new Error(`V4 Quoter address not found for chain ID ${chainId}`);
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
98
|
+
const stateViewAddress = UNISWAP_V4_STATE_VIEW(chainId);
|
|
99
|
+
if (!stateViewAddress)
|
|
100
|
+
throw new Error(`V4 StateView address not found for chain ID ${chainId}`);
|
|
101
|
+
// Prepare pool ID for pool state and hook fee queries
|
|
102
|
+
const poolId = getPoolId(poolKey);
|
|
103
|
+
// Build multicall contracts array
|
|
104
|
+
const contracts = [
|
|
105
|
+
// Contract 0: Quote
|
|
106
|
+
{
|
|
158
107
|
address: quoterAddress,
|
|
159
108
|
abi: V4Quoter,
|
|
160
109
|
functionName: "quoteExactInputSingle",
|
|
@@ -172,15 +121,80 @@ export const quoteV4Read = async (params) => {
|
|
|
172
121
|
hookData,
|
|
173
122
|
},
|
|
174
123
|
],
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
124
|
+
},
|
|
125
|
+
// Contract 1: Pool state (sqrtPriceX96) - only if calculating price impact
|
|
126
|
+
...(shouldCalculatePriceImpact
|
|
127
|
+
? [
|
|
128
|
+
{
|
|
129
|
+
address: stateViewAddress,
|
|
130
|
+
abi: StateView,
|
|
131
|
+
functionName: "getSlot0",
|
|
132
|
+
args: [poolId],
|
|
133
|
+
},
|
|
134
|
+
]
|
|
135
|
+
: []),
|
|
136
|
+
// Contracts 2-3: Static hook fees
|
|
137
|
+
{
|
|
138
|
+
address: poolKey.hooks,
|
|
139
|
+
abi: IClankerHookStaticFee,
|
|
140
|
+
functionName: "clankerFee",
|
|
141
|
+
args: [poolId],
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
address: poolKey.hooks,
|
|
145
|
+
abi: IClankerHookStaticFee,
|
|
146
|
+
functionName: "pairedFee",
|
|
147
|
+
args: [poolId],
|
|
148
|
+
},
|
|
149
|
+
// Contract 4: Dynamic hook fees
|
|
150
|
+
{
|
|
151
|
+
address: poolKey.hooks,
|
|
152
|
+
abi: IClankerHookDynamicFee,
|
|
153
|
+
functionName: "poolConfigVars",
|
|
154
|
+
args: [poolId],
|
|
155
|
+
},
|
|
156
|
+
];
|
|
157
|
+
// Execute single multicall
|
|
158
|
+
const results = await publicClient.multicall({ contracts });
|
|
159
|
+
// Parse quote result (always at index 0)
|
|
160
|
+
const quoteResult = results[0];
|
|
161
|
+
if (quoteResult.status !== "success") {
|
|
162
|
+
throw new Error("Quote failed");
|
|
163
|
+
}
|
|
164
|
+
const [amountOut, gasEstimate] = quoteResult.result;
|
|
165
|
+
// Parse pool state result (at index 1 if price impact calculation is enabled)
|
|
166
|
+
let priceImpactBps;
|
|
167
|
+
const poolStateIndex = shouldCalculatePriceImpact ? 1 : -1;
|
|
168
|
+
if (shouldCalculatePriceImpact && results[poolStateIndex]?.status === "success") {
|
|
169
|
+
const poolState = results[poolStateIndex].result;
|
|
170
|
+
priceImpactBps = calculatePriceImpact(poolState[0], // sqrtPriceX96
|
|
171
|
+
amountIn, amountOut, currency0Decimals, currency1Decimals, zeroForOne);
|
|
172
|
+
}
|
|
173
|
+
// Parse hook fees (indices adjust based on whether pool state was fetched)
|
|
174
|
+
const hookFeeBaseIndex = shouldCalculatePriceImpact ? 2 : 1;
|
|
175
|
+
const staticFeeResults = [
|
|
176
|
+
results[hookFeeBaseIndex], // clankerFee
|
|
177
|
+
results[hookFeeBaseIndex + 1], // pairedFee
|
|
178
|
+
];
|
|
179
|
+
const dynamicFeeResult = results[hookFeeBaseIndex + 2]; // poolConfigVars
|
|
180
|
+
let hookFees;
|
|
181
|
+
// Try static fees first
|
|
182
|
+
if (staticFeeResults[0]?.status === "success" && staticFeeResults[1]?.status === "success") {
|
|
183
|
+
hookFees = {
|
|
184
|
+
type: "static",
|
|
185
|
+
clankerFee: Number(staticFeeResults[0].result),
|
|
186
|
+
pairedFee: Number(staticFeeResults[1].result),
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
// Try dynamic fees
|
|
190
|
+
else if (dynamicFeeResult?.status === "success") {
|
|
191
|
+
const config = dynamicFeeResult.result;
|
|
192
|
+
hookFees = {
|
|
193
|
+
type: "dynamic",
|
|
194
|
+
baseFee: Number(config.baseFee),
|
|
195
|
+
maxLpFee: Number(config.maxLpFee),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
184
198
|
return {
|
|
185
199
|
amountOut,
|
|
186
200
|
gasEstimate,
|
package/dist/esm/quote/v4.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"v4.js","sourceRoot":"","sources":["../../../src/quote/v4.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"v4.js","sourceRoot":"","sources":["../../../src/quote/v4.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/stake.js
CHANGED
|
@@ -134,7 +134,7 @@ export class Stake {
|
|
|
134
134
|
// Use forwarder's executeMulticall for meta-transaction support
|
|
135
135
|
const calls = tokenAddresses.map((tokenAddress) => ({
|
|
136
136
|
target: this.stakingAddress,
|
|
137
|
-
allowFailure:
|
|
137
|
+
allowFailure: true,
|
|
138
138
|
value: 0n,
|
|
139
139
|
callData: encodeFunctionData({
|
|
140
140
|
abi: LevrStaking_v1,
|
package/dist/esm/stake.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stake.js","sourceRoot":"","sources":["../../src/stake.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"stake.js","sourceRoot":"","sources":["../../src/stake.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/treasury.js
CHANGED
|
@@ -1,162 +1,84 @@
|
|
|
1
1
|
import { erc20Abi } from "viem";
|
|
2
2
|
import { IClankerAirdrop } from "./abis/index.js";
|
|
3
3
|
import { formatBalanceWithUsd } from "./balance.js";
|
|
4
|
-
import { GET_CLANKER_AIRDROP_ADDRESS
|
|
5
|
-
|
|
6
|
-
* Find treasury airdrop allocation by checking all known amounts using multicall
|
|
7
|
-
*/
|
|
8
|
-
async function findTreasuryAllocation(publicClient, clankerToken, treasury) {
|
|
4
|
+
import { GET_CLANKER_AIRDROP_ADDRESS } from "./constants.js";
|
|
5
|
+
export async function getTreasuryAirdropStatus(publicClient, clankerToken, treasury, tokenDecimals, tokenUsdPrice) {
|
|
9
6
|
const chainId = publicClient.chain?.id;
|
|
10
7
|
const airdropAddress = GET_CLANKER_AIRDROP_ADDRESS(chainId);
|
|
11
|
-
if (!airdropAddress)
|
|
8
|
+
if (!airdropAddress) {
|
|
12
9
|
return null;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
const currentBlock = await publicClient.getBlockNumber();
|
|
13
|
+
const blocksToSearch = 100000n;
|
|
14
|
+
const fromBlock = currentBlock > blocksToSearch ? currentBlock - blocksToSearch : 0n;
|
|
15
|
+
const logs = await publicClient.getLogs({
|
|
16
|
+
address: airdropAddress,
|
|
17
|
+
event: {
|
|
18
|
+
type: "event",
|
|
19
|
+
name: "AirdropCreated",
|
|
20
|
+
inputs: [
|
|
21
|
+
{ name: "token", type: "address", indexed: true },
|
|
22
|
+
{ name: "admin", type: "address", indexed: true },
|
|
23
|
+
{ name: "merkleRoot", type: "bytes32", indexed: false },
|
|
24
|
+
{ name: "supply", type: "uint256", indexed: false },
|
|
25
|
+
{ name: "lockupDuration", type: "uint256", indexed: false },
|
|
26
|
+
{ name: "vestingDuration", type: "uint256", indexed: false },
|
|
27
|
+
],
|
|
28
|
+
},
|
|
29
|
+
args: {
|
|
30
|
+
token: clankerToken,
|
|
23
31
|
},
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
args: [clankerToken, treasury, amount],
|
|
30
|
-
})),
|
|
31
|
-
], // Mixed ABIs in multicall
|
|
32
|
-
allowFailure: true,
|
|
33
|
-
});
|
|
34
|
-
// Extract treasury balance from first result
|
|
35
|
-
const treasuryBalanceResult = results[0];
|
|
36
|
-
const treasuryBalance = treasuryBalanceResult && treasuryBalanceResult.status === "success"
|
|
37
|
-
? treasuryBalanceResult.result
|
|
38
|
-
: 0n;
|
|
39
|
-
// Extract airdrop check results (skip first result which is balance)
|
|
40
|
-
const airdropResults = results.slice(1);
|
|
41
|
-
// Collect all valid results
|
|
42
|
-
const allResults = [];
|
|
43
|
-
for (let i = 0; i < airdropResults.length; i++) {
|
|
44
|
-
const result = airdropResults[i];
|
|
45
|
-
const amount = amounts[i];
|
|
46
|
-
if (result.status === "success" && result.result !== undefined) {
|
|
47
|
-
const available = result.result;
|
|
48
|
-
if (available > 0n) {
|
|
49
|
-
// Available - highest priority (1)
|
|
50
|
-
allResults.push({ amount, available, status: "available", priority: 1 });
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
// Available is 0 - check treasury balance to determine if claimed or locked
|
|
54
|
-
const isClaimed = treasuryBalance >= amount;
|
|
55
|
-
const priority = isClaimed ? 4 : 2;
|
|
56
|
-
const status = isClaimed ? "claimed" : "locked";
|
|
57
|
-
const error = isClaimed ? "Treasury airdrop already claimed" : "Airdrop is still locked";
|
|
58
|
-
allResults.push({ amount, available: 0n, status, priority, error });
|
|
59
|
-
}
|
|
32
|
+
fromBlock,
|
|
33
|
+
toBlock: "latest",
|
|
34
|
+
});
|
|
35
|
+
if (logs.length === 0) {
|
|
36
|
+
return null;
|
|
60
37
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
// Other errors - treat as locked (priority 2)
|
|
94
|
-
allResults.push({
|
|
95
|
-
amount,
|
|
96
|
-
available: 0n,
|
|
97
|
-
status: "locked",
|
|
98
|
-
error: errorMessage,
|
|
99
|
-
priority: 2,
|
|
100
|
-
});
|
|
38
|
+
const latestLog = logs[logs.length - 1];
|
|
39
|
+
const { supply } = latestLog.args;
|
|
40
|
+
const allocatedAmount = supply;
|
|
41
|
+
const results = await publicClient.multicall({
|
|
42
|
+
contracts: [
|
|
43
|
+
{
|
|
44
|
+
address: airdropAddress,
|
|
45
|
+
abi: IClankerAirdrop,
|
|
46
|
+
functionName: "amountAvailableToClaim",
|
|
47
|
+
args: [clankerToken, treasury, allocatedAmount],
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
address: clankerToken,
|
|
51
|
+
abi: erc20Abi,
|
|
52
|
+
functionName: "balanceOf",
|
|
53
|
+
args: [treasury],
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
allowFailure: false,
|
|
57
|
+
});
|
|
58
|
+
const [availableAmount, treasuryBalance] = results;
|
|
59
|
+
if (availableAmount === 0n) {
|
|
60
|
+
const isAlreadyClaimed = treasuryBalance >= allocatedAmount;
|
|
61
|
+
return {
|
|
62
|
+
availableAmount: formatBalanceWithUsd(0n, tokenDecimals, tokenUsdPrice),
|
|
63
|
+
allocatedAmount: formatBalanceWithUsd(allocatedAmount, tokenDecimals, tokenUsdPrice),
|
|
64
|
+
isAvailable: false,
|
|
65
|
+
proof: [],
|
|
66
|
+
error: isAlreadyClaimed
|
|
67
|
+
? "Treasury airdrop already claimed"
|
|
68
|
+
: "Airdrop is still locked (lockup period not passed)",
|
|
69
|
+
};
|
|
101
70
|
}
|
|
71
|
+
return {
|
|
72
|
+
availableAmount: formatBalanceWithUsd(availableAmount, tokenDecimals, tokenUsdPrice),
|
|
73
|
+
allocatedAmount: formatBalanceWithUsd(allocatedAmount, tokenDecimals, tokenUsdPrice),
|
|
74
|
+
isAvailable: true,
|
|
75
|
+
proof: [],
|
|
76
|
+
error: undefined,
|
|
77
|
+
};
|
|
102
78
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
// Sort by priority (lower is better), then by amount (higher is better for same priority)
|
|
108
|
-
allResults.sort((a, b) => {
|
|
109
|
-
if (a.priority !== b.priority) {
|
|
110
|
-
return a.priority - b.priority;
|
|
111
|
-
}
|
|
112
|
-
// For same priority, prefer larger amounts
|
|
113
|
-
return a.amount > b.amount ? -1 : 1;
|
|
114
|
-
});
|
|
115
|
-
// Return the best result
|
|
116
|
-
const best = allResults[0];
|
|
117
|
-
return {
|
|
118
|
-
amount: best.amount,
|
|
119
|
-
available: best.available,
|
|
120
|
-
status: best.status,
|
|
121
|
-
error: best.error,
|
|
122
|
-
};
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Get treasury airdrop status
|
|
126
|
-
*/
|
|
127
|
-
export async function getTreasuryAirdropStatus(publicClient, clankerToken, treasury, tokenDecimals, tokenUsdPrice) {
|
|
128
|
-
const allocation = await findTreasuryAllocation(publicClient, clankerToken, treasury);
|
|
129
|
-
if (!allocation) {
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error("Failed to fetch airdrop:", error);
|
|
130
81
|
return null;
|
|
131
82
|
}
|
|
132
|
-
// Generate appropriate error message based on status
|
|
133
|
-
let error;
|
|
134
|
-
switch (allocation.status) {
|
|
135
|
-
case "available":
|
|
136
|
-
error = undefined;
|
|
137
|
-
break;
|
|
138
|
-
case "locked":
|
|
139
|
-
error = allocation.error || "Airdrop is still locked (lockup period not passed)";
|
|
140
|
-
break;
|
|
141
|
-
case "claimed":
|
|
142
|
-
error = "Treasury airdrop already claimed";
|
|
143
|
-
break;
|
|
144
|
-
case "not_found":
|
|
145
|
-
error = "No treasury airdrop found";
|
|
146
|
-
break;
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
149
|
-
availableAmount: formatBalanceWithUsd(allocation.available, tokenDecimals, tokenUsdPrice),
|
|
150
|
-
allocatedAmount: formatBalanceWithUsd(allocation.amount, tokenDecimals, tokenUsdPrice),
|
|
151
|
-
isAvailable: allocation.status === "available" && allocation.available > 0n,
|
|
152
|
-
error,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Get available airdrop amount for treasury
|
|
157
|
-
*/
|
|
158
|
-
export async function getTreasuryAirdropAvailable(publicClient, clankerToken, treasury) {
|
|
159
|
-
const allocation = await findTreasuryAllocation(publicClient, clankerToken, treasury);
|
|
160
|
-
return allocation?.available || 0n;
|
|
161
83
|
}
|
|
162
84
|
//# sourceMappingURL=treasury.js.map
|