lpsignal 0.10.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/README.zh.md +10 -0
- package/dist/liquidity/index.d.ts +47 -0
- package/dist/liquidity/index.js +68 -1
- package/dist/liquidity/index.js.map +1 -1
- package/dist/liquidity/swap.d.ts +128 -0
- package/dist/liquidity/swap.js +127 -0
- package/dist/liquidity/swap.js.map +1 -0
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -158,6 +158,31 @@ await sendPlan(wallet, publicClient, [rest.call]);
|
|
|
158
158
|
- Positions staked in an Aerodrome / Velodrome gauge belong to the gauge and are not listed by `positions`.
|
|
159
159
|
- Not financial advice: a range that paid well can lose money if the price leaves it.
|
|
160
160
|
|
|
161
|
+
## Swapping
|
|
162
|
+
|
|
163
|
+
`planSwap` swaps one of a pool's tokens for the other (e.g. the side you are short of before adding) through the
|
|
164
|
+
[KyberSwap](https://kyberswap.com) aggregator, with **LPSignal's fee: 0.25% of the input (0.05% in stable pools)**,
|
|
165
|
+
sent by the aggregator's router to LPSignal's address. The aggregator's answers are checked, never trusted: the quote
|
|
166
|
+
must be close to the pool's own on-chain price, and the transaction it builds is decoded — the router, the tokens and
|
|
167
|
+
amount, the recipient (your own address), exactly LPSignal's fee and no other, no permit, and a guaranteed minimum out
|
|
168
|
+
no lower than your slippage allows — then simulated. The router pays at least `minReturn` or the swap reverts.
|
|
169
|
+
|
|
170
|
+
```js
|
|
171
|
+
import { planSwap, sendPlan } from 'lpsignal/liquidity';
|
|
172
|
+
// 0.1 ETH (paid as the native coin) for USDC in the WETH/USDC pool
|
|
173
|
+
const swap = await planSwap(publicClient, pool, { owner: account.address, fromSide: 0, fromNative: true, amountIn: parseEther('0.1') });
|
|
174
|
+
console.log(swap.quoteOut, swap.minReturn, swap.feeBps);
|
|
175
|
+
await sendPlan(wallet, publicClient, [...swap.approvals, swap.swap]); // an exact approval if needed, then the swap
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- `minOut`: the least the swap must deliver (e.g. what you are short of); refused (`SwapRefused` `moved`) if the quote
|
|
179
|
+
less the slippage no longer covers it. Other refusals: `impact` (the quote is too far under the pool price),
|
|
180
|
+
`quote` / `calldata` (the aggregator's answer did not match), `simulation` (it would revert now).
|
|
181
|
+
- Send the plan right away (quotes move; it expires after `deadlineS`, default 10 minutes). A swap's deadline sits in
|
|
182
|
+
calldata nobody can check, so after a `TxUnknown` / `TxPending` find out what became of that very transaction before
|
|
183
|
+
swapping again (`sendPlan` blocks the account meanwhile).
|
|
184
|
+
- Uniswap v4 pools are not supported. The aggregator refuses some addresses (e.g. well-known test keys).
|
|
185
|
+
|
|
161
186
|
## License
|
|
162
187
|
|
|
163
188
|
MIT
|
package/README.zh.md
CHANGED
|
@@ -88,6 +88,16 @@ await lps.setSubscriptions(['net_apr', 'burst', 'depeg']); // 推送哪些类型
|
|
|
88
88
|
- 质押在 Aerodrome / Velodrome gauge 里的仓位属于 gauge,`positions` 不会列出。
|
|
89
89
|
- 不构成投资建议:过去收益好的区间,价格离开后也可能亏损。
|
|
90
90
|
|
|
91
|
+
## 兑换
|
|
92
|
+
|
|
93
|
+
`planSwap` 通过 [KyberSwap](https://kyberswap.com) 聚合器,把池子里的一种代币兑换成另一种(例如添加前补足不够的那一边)。**LPSignal 收取输入金额的 0.25%(稳定型池 0.05%)作为手续费**,由聚合器路由合约直接转到 LPSignal 的地址。聚合器的返回不会被直接信任:报价必须接近池子自身的链上价格;它构造的交易会被解码核对,包括路由合约、代币和数量、收款人(你自己的地址)、手续费恰好是 LPSignal 的且没有其他费用、没有 permit、保证的最少到账不低于你的滑点允许值,然后再模拟一次。路由合约保证至少到账 `minReturn`,否则交易回滚。
|
|
94
|
+
|
|
95
|
+
用法:`planSwap(publicClient, pool, { owner, fromSide, amountIn, fromNative?, toNative?, slippageBps?, minOut? })` → `sendPlan(wallet, publicClient, [...plan.approvals, plan.swap])`。
|
|
96
|
+
|
|
97
|
+
- `minOut`:这次兑换至少要到账的数量(例如你缺的数量);报价扣除滑点后不够时会拒绝(`SwapRefused` `moved`)。其他拒绝原因:`impact`(报价比池子价格低太多)、`quote` / `calldata`(聚合器返回与请求不符)、`simulation`(现在发送会失败)。
|
|
98
|
+
- 计划生成后请立即发送(报价会变;`deadlineS` 后失效,默认 10 分钟)。兑换的截止时间写在无法核对的 calldata 里,所以遇到 `TxUnknown` / `TxPending` 后,请先弄清那笔交易本身的结果再兑换(期间 `sendPlan` 会锁住该账户)。
|
|
99
|
+
- 不支持 Uniswap v4 池子。聚合器会拒绝部分地址(例如公开的测试私钥)。
|
|
100
|
+
|
|
91
101
|
## 开发
|
|
92
102
|
|
|
93
103
|
```bash
|
|
@@ -10,10 +10,15 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Never re-send a mint whose receipt you have not seen: a second one would add the same amounts again (sendPlan
|
|
12
12
|
* throws TxPending with the hash instead of guessing).
|
|
13
|
+
*
|
|
14
|
+
* Swapping one pool token for the other (e.g. for the side you are short of) goes through the KyberSwap aggregator with
|
|
15
|
+
* LPSignal's fee (0.25%, 0.05% in stable pools, taken from the input) — planSwap checks every answer of the aggregator
|
|
16
|
+
* against the pool's own price and the calldata it builds, then sendPlan sends it like any other plan.
|
|
13
17
|
*/
|
|
14
18
|
import { type Address, type Hex, type PublicClient, type WalletClient } from 'viem';
|
|
15
19
|
import { type Call, type MintPlan, type Position } from './core.js';
|
|
16
20
|
export * from './core.js';
|
|
21
|
+
export * from './swap.js';
|
|
17
22
|
/** a pool as the API returns it (`client.pool(chain, address).pool`) — only these fields are used */
|
|
18
23
|
export interface PoolInfo {
|
|
19
24
|
chain: string;
|
|
@@ -25,6 +30,7 @@ export interface PoolInfo {
|
|
|
25
30
|
decimals1: number;
|
|
26
31
|
fee: number;
|
|
27
32
|
tickSpacing: number;
|
|
33
|
+
pairClass?: string;
|
|
28
34
|
}
|
|
29
35
|
export interface AddOptions {
|
|
30
36
|
/** the wallet that pays and receives the position */
|
|
@@ -101,6 +107,47 @@ export interface RemovePlan {
|
|
|
101
107
|
* principal and fees — to the owner. A repeated partial removal would take that share again: send it once.
|
|
102
108
|
*/
|
|
103
109
|
export declare function planRemoveLiquidity(client: PublicClient, pos: WalletPosition, o: RemoveOptions): Promise<RemovePlan>;
|
|
110
|
+
export interface SwapOptions {
|
|
111
|
+
/** the wallet that pays and receives */
|
|
112
|
+
owner: Address;
|
|
113
|
+
/** the pool token paid in (0 = token0, 1 = token1); the other one is bought */
|
|
114
|
+
fromSide: 0 | 1;
|
|
115
|
+
/** how much is paid in, raw units */
|
|
116
|
+
amountIn: bigint;
|
|
117
|
+
/** pay in / receive the chain's native coin instead of that side's wrapped token */
|
|
118
|
+
fromNative?: boolean;
|
|
119
|
+
toNative?: boolean;
|
|
120
|
+
/** the price move tolerated (default 50 = 0.5%) */
|
|
121
|
+
slippageBps?: number;
|
|
122
|
+
/** the least the swap must deliver (e.g. the shortfall it is for): refused (SwapRefused 'moved') below it */
|
|
123
|
+
minOut?: bigint;
|
|
124
|
+
/** seconds until it expires (default 10 minutes): send the plan right away, quotes move */
|
|
125
|
+
deadlineS?: number;
|
|
126
|
+
}
|
|
127
|
+
export interface SwapPlan {
|
|
128
|
+
/** an exact approval of the aggregator's router, if the allowance is short (none for a native input) */
|
|
129
|
+
approvals: PlanCall[];
|
|
130
|
+
swap: PlanCall;
|
|
131
|
+
amountIn: bigint;
|
|
132
|
+
quoteOut: bigint;
|
|
133
|
+
/** what the router guarantees to deliver or it reverts */
|
|
134
|
+
minReturn: bigint;
|
|
135
|
+
/** LPSignal's fee, bps of the input */
|
|
136
|
+
feeBps: number;
|
|
137
|
+
/** simulated from the owner before returning (not when an approval must land first) */
|
|
138
|
+
simulated: boolean;
|
|
139
|
+
deadline: number;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* A swap between the pool's two tokens through the KyberSwap aggregator, with LPSignal's fee. The aggregator's answers
|
|
143
|
+
* are checked, never trusted: the quote must be within the allowed impact of the pool's own price (SwapRefused
|
|
144
|
+
* 'impact'), and the calldata is decoded — router, swap() only, tokens, amount, value, recipient = owner, exactly our
|
|
145
|
+
* fee, flags, no permit, the split, and a minimum no lower than the pool-price floor, `minOut` and the quote less the
|
|
146
|
+
* slippage (SwapRefused 'calldata'); then simulated (SwapRefused 'simulation'). The router itself pays at least that
|
|
147
|
+
* minimum or reverts. Send it with sendPlan; a swap's deadline is in calldata nobody can check, so a send of unknown
|
|
148
|
+
* outcome must be resolved by its own transaction before swapping again (sendPlan blocks the account meanwhile).
|
|
149
|
+
*/
|
|
150
|
+
export declare function planSwap(client: PublicClient, pool: PoolInfo, o: SwapOptions): Promise<SwapPlan>;
|
|
104
151
|
/** a transaction was sent but its receipt was not seen in time: it may still land — do not send it again blindly */
|
|
105
152
|
export declare class TxPending extends Error {
|
|
106
153
|
readonly hash: Hex;
|
package/dist/liquidity/index.js
CHANGED
|
@@ -10,10 +10,17 @@
|
|
|
10
10
|
*
|
|
11
11
|
* Never re-send a mint whose receipt you have not seen: a second one would add the same amounts again (sendPlan
|
|
12
12
|
* throws TxPending with the hash instead of guessing).
|
|
13
|
+
*
|
|
14
|
+
* Swapping one pool token for the other (e.g. for the side you are short of) goes through the KyberSwap aggregator with
|
|
15
|
+
* LPSignal's fee (0.25%, 0.05% in stable pools, taken from the input) — planSwap checks every answer of the aggregator
|
|
16
|
+
* against the pool's own price and the calldata it builds, then sendPlan sends it like any other plan.
|
|
13
17
|
*/
|
|
14
18
|
import { defineChain } from 'viem';
|
|
15
|
-
import {
|
|
19
|
+
import { decodeFunctionData } from 'viem';
|
|
20
|
+
import { approvalsNeeded, CHAIN_ID, COLLECT_ABI, ERC20, isSlipstream, NPM, NPM_READ, otherAmount, planMint, rangeTicks, removeAmounts, removeCall, SLOT0, WRAPPED, } from './core.js';
|
|
21
|
+
import { buildSwap, checkSwapCall, fetchQuote, KYBER_ROUTER, KYBER_ROUTER_ABI, maxImpactBps, minOutFloor, requiredMinOut, spotOut, swapFeeBps, SwapRefused } from './swap.js';
|
|
16
22
|
export * from './core.js';
|
|
23
|
+
export * from './swap.js';
|
|
17
24
|
const MULTICALL3 = '0xcA11bde05977b3631167028862bE2a173976CA11';
|
|
18
25
|
const DEFAULT_SLIPPAGE_BPS = 50;
|
|
19
26
|
const DEFAULT_DEADLINE_S = 20 * 60;
|
|
@@ -144,6 +151,66 @@ export async function planRemoveLiquidity(client, pos, o) {
|
|
|
144
151
|
: removeAmounts(sqrtPriceX96, live, o.shareBps, o.slippageBps ?? DEFAULT_SLIPPAGE_BPS);
|
|
145
152
|
return { ...a, deadline, call: bind(removeCall(pos.chain, pos.dex, pos.tokenId, a, o.owner, BigInt(deadline)), pos.chain, o.owner) };
|
|
146
153
|
}
|
|
154
|
+
/**
|
|
155
|
+
* A swap between the pool's two tokens through the KyberSwap aggregator, with LPSignal's fee. The aggregator's answers
|
|
156
|
+
* are checked, never trusted: the quote must be within the allowed impact of the pool's own price (SwapRefused
|
|
157
|
+
* 'impact'), and the calldata is decoded — router, swap() only, tokens, amount, value, recipient = owner, exactly our
|
|
158
|
+
* fee, flags, no permit, the split, and a minimum no lower than the pool-price floor, `minOut` and the quote less the
|
|
159
|
+
* slippage (SwapRefused 'calldata'); then simulated (SwapRefused 'simulation'). The router itself pays at least that
|
|
160
|
+
* minimum or reverts. Send it with sendPlan; a swap's deadline is in calldata nobody can check, so a send of unknown
|
|
161
|
+
* outcome must be resolved by its own transaction before swapping again (sendPlan blocks the account meanwhile).
|
|
162
|
+
*/
|
|
163
|
+
export async function planSwap(client, pool, o) {
|
|
164
|
+
if (pool.dex === 'uniswap_v4')
|
|
165
|
+
throw new Error('swapping is offered for v3-style pools (their price bounds the quote); not Uniswap v4');
|
|
166
|
+
await assertChain(client, pool.chain);
|
|
167
|
+
const pairClass = pool.pairClass ?? 'volatile';
|
|
168
|
+
const token = (side) => (side === 0 ? pool.token0 : pool.token1).toLowerCase();
|
|
169
|
+
const toSide = o.fromSide === 0 ? 1 : 0;
|
|
170
|
+
for (const [side, native] of [[o.fromSide, o.fromNative], [toSide, o.toNative]]) {
|
|
171
|
+
if (native && token(side) !== WRAPPED[pool.chain])
|
|
172
|
+
throw new Error(`side ${side} is not the wrapped native token: it cannot be paid / received as the native coin`);
|
|
173
|
+
}
|
|
174
|
+
if (o.amountIn <= 0n)
|
|
175
|
+
throw new Error('amountIn must be positive');
|
|
176
|
+
const slippageBps = o.slippageBps ?? DEFAULT_SLIPPAGE_BPS;
|
|
177
|
+
// (10000 or more would take the minimum out to nothing: any price would do)
|
|
178
|
+
if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps >= 10_000)
|
|
179
|
+
throw new RangeError('slippageBps must be an integer from 0 to 9999');
|
|
180
|
+
if (o.minOut !== undefined && o.minOut < 0n)
|
|
181
|
+
throw new RangeError('minOut must not be negative');
|
|
182
|
+
const from = { token: token(o.fromSide), native: !!o.fromNative }, to = { token: token(toSide), native: !!o.toNative };
|
|
183
|
+
const feeBps = swapFeeBps(pairClass), impactBps = maxImpactBps(pairClass);
|
|
184
|
+
const [[sqrtPriceX96], allowance] = await Promise.all([
|
|
185
|
+
client.readContract({ address: pool.address, abi: SLOT0, functionName: 'slot0' }),
|
|
186
|
+
from.native ? Promise.resolve(0n) : client.readContract({ address: from.token, abi: ERC20, functionName: 'allowance', args: [o.owner, KYBER_ROUTER] }),
|
|
187
|
+
]);
|
|
188
|
+
const approvals = from.native ? [] : approvalsNeeded(pool.chain, KYBER_ROUTER, [{ token: from.token, amount: o.amountIn, allowance }]);
|
|
189
|
+
const spot = spotOut(sqrtPriceX96, o.fromSide === 0, o.amountIn, feeBps);
|
|
190
|
+
const q = await fetchQuote(pool.chain, from, to, o.amountIn, feeBps);
|
|
191
|
+
if (q.amountOut < minOutFloor(spot, impactBps, 0))
|
|
192
|
+
throw new SwapRefused('impact', `quote ${q.amountOut} vs pool ${spot}`);
|
|
193
|
+
const need = o.minOut ?? 0n;
|
|
194
|
+
if ((q.amountOut * BigInt(10_000 - slippageBps)) / 10000n < need)
|
|
195
|
+
throw new SwapRefused('moved', `quote ${q.amountOut} for ${need}`);
|
|
196
|
+
const deadline = Math.floor(Date.now() / 1000) + (o.deadlineS ?? 10 * 60);
|
|
197
|
+
const c = await buildSwap(pool.chain, q, o.owner, slippageBps, deadline);
|
|
198
|
+
checkSwapCall(c, { from, to, amountIn: o.amountIn, account: o.owner, feeBps, minOut: requiredMinOut({ spot, impactBps, slippageBps, need, quoteOut: q.amountOut }) });
|
|
199
|
+
const simulated = approvals.length === 0;
|
|
200
|
+
if (simulated) {
|
|
201
|
+
try {
|
|
202
|
+
await client.call({ account: o.owner, to: c.to, data: c.data, value: c.value });
|
|
203
|
+
}
|
|
204
|
+
catch (e) {
|
|
205
|
+
throw new SwapRefused('simulation', String(e.message ?? e).slice(0, 200));
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
const minReturn = decodeFunctionData({ abi: KYBER_ROUTER_ABI, data: c.data }).args[0].desc.minReturnAmount;
|
|
209
|
+
return {
|
|
210
|
+
approvals: approvals.map((a) => bind(a, pool.chain, o.owner)), swap: bind(c, pool.chain, o.owner),
|
|
211
|
+
amountIn: o.amountIn, quoteOut: q.amountOut, minReturn, feeBps, simulated, deadline,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
147
214
|
/** a transaction was sent but its receipt was not seen in time: it may still land — do not send it again blindly */
|
|
148
215
|
export class TxPending extends Error {
|
|
149
216
|
hash;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/liquidity/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/liquidity/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swapping one pool token for the other (e.g. to top up an add) through the KyberSwap aggregator, with LPSignal's fee:
|
|
3
|
+
* `swapFeeBps` of the input, sent by the router to SWAP_FEE_RECEIVER — the same code the lpsignal.app web app runs,
|
|
4
|
+
* kept in step with it. Your own wallet sends it; nothing of LPSignal's holds funds.
|
|
5
|
+
*
|
|
6
|
+
* The aggregator's answers are never trusted as they come: the quote must be within `maxImpactBps` of the pool's own
|
|
7
|
+
* price (read on chain), and the calldata is decoded and checked before the wallet is asked — the router, `swap()`
|
|
8
|
+
* only, tokens, amount, the recipient = the wallet, our fee and no other, the exact flags, no permit, and a minimum out
|
|
9
|
+
* no lower than the pool price allows. The router itself pays the recipient at least that minimum or reverts.
|
|
10
|
+
*/
|
|
11
|
+
import { type Address } from 'viem';
|
|
12
|
+
import type { Call } from './core.js';
|
|
13
|
+
export declare const KYBER_ROUTER: Address;
|
|
14
|
+
export declare const SWAP_FEE_RECEIVER: Address;
|
|
15
|
+
/** the aggregator's name for a chain's native coin */
|
|
16
|
+
export declare const KYBER_NATIVE: Address;
|
|
17
|
+
/** our fee: 0.05% between stablecoins, else 0.25% (of the input) */
|
|
18
|
+
export declare const swapFeeBps: (pairClass: string) => number;
|
|
19
|
+
/** how far the quote may fall short of the pool's own price (pool fees, route costs, impact) before it is refused */
|
|
20
|
+
export declare const maxImpactBps: (pairClass: string) => number;
|
|
21
|
+
export declare class SwapRefused extends Error {
|
|
22
|
+
readonly reason: 'impact' | 'quote' | 'calldata' | 'simulation' | 'moved';
|
|
23
|
+
constructor(reason: 'impact' | 'quote' | 'calldata' | 'simulation' | 'moved', detail: string);
|
|
24
|
+
}
|
|
25
|
+
export interface SwapSide {
|
|
26
|
+
token: Address;
|
|
27
|
+
native: boolean;
|
|
28
|
+
}
|
|
29
|
+
export interface Quote {
|
|
30
|
+
summary: Record<string, unknown>;
|
|
31
|
+
amountIn: bigint;
|
|
32
|
+
amountOut: bigint;
|
|
33
|
+
}
|
|
34
|
+
/** the best route for `amountIn` with our fee in it (its echo checked: tokens, amount, fee, router) */
|
|
35
|
+
export declare function fetchQuote(chain: string, from: SwapSide, to: SwapSide, amountIn: bigint, feeBps: number): Promise<Quote>;
|
|
36
|
+
/** the swap transaction for a quote (to be checked with checkSwapCall before sending) */
|
|
37
|
+
export declare function buildSwap(chain: string, q: Quote, account: Address, slippageBps: number, deadline: number): Promise<Call>;
|
|
38
|
+
/** what `amountIn` buys at the pool's own price, after our fee (raw units; sqrtPriceX96 = √(token1/token0)) */
|
|
39
|
+
export declare function spotOut(sqrtPriceX96: bigint, inIsToken0: boolean, amountIn: bigint, feeBps: number): bigint;
|
|
40
|
+
/** the least a swap may promise: the pool price, less the impact allowed, less the slippage */
|
|
41
|
+
export declare const minOutFloor: (spot: bigint, impactBps: number, slippageBps: number) => bigint;
|
|
42
|
+
/**
|
|
43
|
+
* The minimum a built swap must promise: no lower than the pool-price floor, the shortfall it is for (`need`), or the
|
|
44
|
+
* quote less the user's slippage — with 0.01% for the build's rounding (it re-reads the route, a unit or so under).
|
|
45
|
+
*/
|
|
46
|
+
export declare function requiredMinOut(o: {
|
|
47
|
+
spot: bigint;
|
|
48
|
+
impactBps: number;
|
|
49
|
+
slippageBps: number;
|
|
50
|
+
need: bigint;
|
|
51
|
+
quoteOut: bigint;
|
|
52
|
+
}): bigint;
|
|
53
|
+
declare const ROUTER_ABI: readonly [{
|
|
54
|
+
readonly name: "swap";
|
|
55
|
+
readonly type: "function";
|
|
56
|
+
readonly stateMutability: "payable";
|
|
57
|
+
readonly inputs: readonly [{
|
|
58
|
+
readonly type: "tuple";
|
|
59
|
+
readonly components: readonly [{
|
|
60
|
+
readonly type: "address";
|
|
61
|
+
readonly name: "callTarget";
|
|
62
|
+
}, {
|
|
63
|
+
readonly type: "address";
|
|
64
|
+
readonly name: "approveTarget";
|
|
65
|
+
}, {
|
|
66
|
+
readonly type: "bytes";
|
|
67
|
+
readonly name: "targetData";
|
|
68
|
+
}, {
|
|
69
|
+
readonly name: "desc";
|
|
70
|
+
readonly type: "tuple";
|
|
71
|
+
readonly components: readonly [{
|
|
72
|
+
readonly type: "address";
|
|
73
|
+
readonly name: "srcToken";
|
|
74
|
+
}, {
|
|
75
|
+
readonly type: "address";
|
|
76
|
+
readonly name: "dstToken";
|
|
77
|
+
}, {
|
|
78
|
+
readonly type: "address[]";
|
|
79
|
+
readonly name: "srcReceivers";
|
|
80
|
+
}, {
|
|
81
|
+
readonly type: "uint256[]";
|
|
82
|
+
readonly name: "srcAmounts";
|
|
83
|
+
}, {
|
|
84
|
+
readonly type: "address[]";
|
|
85
|
+
readonly name: "feeReceivers";
|
|
86
|
+
}, {
|
|
87
|
+
readonly type: "uint256[]";
|
|
88
|
+
readonly name: "feeAmounts";
|
|
89
|
+
}, {
|
|
90
|
+
readonly type: "address";
|
|
91
|
+
readonly name: "dstReceiver";
|
|
92
|
+
}, {
|
|
93
|
+
readonly type: "uint256";
|
|
94
|
+
readonly name: "amount";
|
|
95
|
+
}, {
|
|
96
|
+
readonly type: "uint256";
|
|
97
|
+
readonly name: "minReturnAmount";
|
|
98
|
+
}, {
|
|
99
|
+
readonly type: "uint256";
|
|
100
|
+
readonly name: "flags";
|
|
101
|
+
}, {
|
|
102
|
+
readonly type: "bytes";
|
|
103
|
+
readonly name: "permit";
|
|
104
|
+
}];
|
|
105
|
+
}, {
|
|
106
|
+
readonly type: "bytes";
|
|
107
|
+
readonly name: "clientData";
|
|
108
|
+
}];
|
|
109
|
+
readonly name: "execution";
|
|
110
|
+
}];
|
|
111
|
+
readonly outputs: readonly [{
|
|
112
|
+
readonly type: "uint256";
|
|
113
|
+
readonly name: "returnAmount";
|
|
114
|
+
}, {
|
|
115
|
+
readonly type: "uint256";
|
|
116
|
+
readonly name: "gasUsed";
|
|
117
|
+
}];
|
|
118
|
+
}];
|
|
119
|
+
export { ROUTER_ABI as KYBER_ROUTER_ABI };
|
|
120
|
+
/** throws SwapRefused unless the call is exactly the swap meant: see the module comment */
|
|
121
|
+
export declare function checkSwapCall(c: Call, exp: {
|
|
122
|
+
from: SwapSide;
|
|
123
|
+
to: SwapSide;
|
|
124
|
+
amountIn: bigint;
|
|
125
|
+
account: Address;
|
|
126
|
+
feeBps: number;
|
|
127
|
+
minOut: bigint;
|
|
128
|
+
}): void;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Swapping one pool token for the other (e.g. to top up an add) through the KyberSwap aggregator, with LPSignal's fee:
|
|
3
|
+
* `swapFeeBps` of the input, sent by the router to SWAP_FEE_RECEIVER — the same code the lpsignal.app web app runs,
|
|
4
|
+
* kept in step with it. Your own wallet sends it; nothing of LPSignal's holds funds.
|
|
5
|
+
*
|
|
6
|
+
* The aggregator's answers are never trusted as they come: the quote must be within `maxImpactBps` of the pool's own
|
|
7
|
+
* price (read on chain), and the calldata is decoded and checked before the wallet is asked — the router, `swap()`
|
|
8
|
+
* only, tokens, amount, the recipient = the wallet, our fee and no other, the exact flags, no permit, and a minimum out
|
|
9
|
+
* no lower than the pool price allows. The router itself pays the recipient at least that minimum or reverts.
|
|
10
|
+
*/
|
|
11
|
+
import { decodeFunctionData, getAddress, parseAbi } from 'viem';
|
|
12
|
+
export const KYBER_ROUTER = '0x6131b5fae19ea4f9d964eac0408e4408b66337b5';
|
|
13
|
+
export const SWAP_FEE_RECEIVER = '0x13ac5bf01871ec16a9a5276f1e167da846af6a33';
|
|
14
|
+
/** the aggregator's name for a chain's native coin */
|
|
15
|
+
export const KYBER_NATIVE = '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee';
|
|
16
|
+
const API = 'https://aggregator-api.kyberswap.com';
|
|
17
|
+
const CLIENT_ID = 'lpsignal';
|
|
18
|
+
/** what a build from our quotes carries: _FEE_IN_BPS (0x80) + the base flag (0x200); fee on the output (0x40), partial
|
|
19
|
+
* fills (0x01) or burning/claiming (0x04/0x08/0x10) would change what the user signs: refused */
|
|
20
|
+
const FLAGS = 0x280n;
|
|
21
|
+
const BPS = 10000n;
|
|
22
|
+
/** our fee: 0.05% between stablecoins, else 0.25% (of the input) */
|
|
23
|
+
export const swapFeeBps = (pairClass) => (pairClass === 'stable' ? 5 : 25);
|
|
24
|
+
/** how far the quote may fall short of the pool's own price (pool fees, route costs, impact) before it is refused */
|
|
25
|
+
export const maxImpactBps = (pairClass) => (pairClass === 'stable' ? 50 : pairClass === 'correlated' ? 100 : 300);
|
|
26
|
+
export class SwapRefused extends Error {
|
|
27
|
+
reason;
|
|
28
|
+
constructor(reason, detail) {
|
|
29
|
+
super(`swap refused (${reason}): ${detail}`);
|
|
30
|
+
this.reason = reason;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const kyberToken = (s) => (s.native ? KYBER_NATIVE : s.token.toLowerCase());
|
|
34
|
+
const same = (a, b) => a.toLowerCase() === b.toLowerCase();
|
|
35
|
+
async function call(url, init = {}) {
|
|
36
|
+
const res = await fetch(url, { ...init, headers: { 'x-client-id': CLIENT_ID, ...(init.body ? { 'content-type': 'application/json' } : {}) }, signal: AbortSignal.timeout(15_000) });
|
|
37
|
+
return res.json();
|
|
38
|
+
}
|
|
39
|
+
/** the best route for `amountIn` with our fee in it (its echo checked: tokens, amount, fee, router) */
|
|
40
|
+
export async function fetchQuote(chain, from, to, amountIn, feeBps) {
|
|
41
|
+
const q = new URLSearchParams({
|
|
42
|
+
tokenIn: kyberToken(from), tokenOut: kyberToken(to), amountIn: amountIn.toString(),
|
|
43
|
+
feeAmount: String(feeBps), isInBps: 'true', chargeFeeBy: 'currency_in', feeReceiver: SWAP_FEE_RECEIVER,
|
|
44
|
+
// market makers' signed quotes expire within seconds: a wallet confirmation could outlast them (a revert, gas lost)
|
|
45
|
+
excludeRFQSources: 'true',
|
|
46
|
+
});
|
|
47
|
+
const r = await call(`${API}/${chain}/api/v1/routes?${q}`);
|
|
48
|
+
const s = r.data?.routeSummary;
|
|
49
|
+
if (r.code !== 0 || !s)
|
|
50
|
+
throw new SwapRefused('quote', r.message ?? 'no route');
|
|
51
|
+
const fee = s.extraFee;
|
|
52
|
+
if (!same(String(s.tokenIn), kyberToken(from)) || !same(String(s.tokenOut), kyberToken(to)) || BigInt(String(s.amountIn)) !== amountIn
|
|
53
|
+
|| String(fee?.feeAmount) !== String(feeBps) || fee?.chargeFeeBy !== 'currency_in' || fee?.isInBps !== true || !same(String(fee?.feeReceiver), SWAP_FEE_RECEIVER)
|
|
54
|
+
|| !same(String(r.data.routerAddress), KYBER_ROUTER))
|
|
55
|
+
throw new SwapRefused('quote', 'the route does not match the request');
|
|
56
|
+
return { summary: s, amountIn, amountOut: BigInt(String(s.amountOut)) };
|
|
57
|
+
}
|
|
58
|
+
/** the swap transaction for a quote (to be checked with checkSwapCall before sending) */
|
|
59
|
+
export async function buildSwap(chain, q, account, slippageBps, deadline) {
|
|
60
|
+
const r = await call(`${API}/${chain}/api/v1/route/build`, {
|
|
61
|
+
method: 'POST', body: JSON.stringify({ routeSummary: q.summary, sender: account, recipient: account, slippageTolerance: slippageBps, deadline, source: CLIENT_ID }),
|
|
62
|
+
});
|
|
63
|
+
const d = r.data;
|
|
64
|
+
if (r.code !== 0 || !d || typeof d.data !== 'string')
|
|
65
|
+
throw new SwapRefused('quote', r.message ?? 'no calldata');
|
|
66
|
+
return { to: getAddress(String(d.routerAddress)), data: d.data, value: BigInt(String(d.transactionValue ?? '0')) };
|
|
67
|
+
}
|
|
68
|
+
/** what `amountIn` buys at the pool's own price, after our fee (raw units; sqrtPriceX96 = √(token1/token0)) */
|
|
69
|
+
export function spotOut(sqrtPriceX96, inIsToken0, amountIn, feeBps) {
|
|
70
|
+
const net = (amountIn * (BPS - BigInt(feeBps))) / BPS;
|
|
71
|
+
const p2 = sqrtPriceX96 * sqrtPriceX96;
|
|
72
|
+
return inIsToken0 ? (net * p2) >> 192n : (net << 192n) / p2;
|
|
73
|
+
}
|
|
74
|
+
/** the least a swap may promise: the pool price, less the impact allowed, less the slippage */
|
|
75
|
+
export const minOutFloor = (spot, impactBps, slippageBps) => (((spot * (BPS - BigInt(impactBps))) / BPS) * (BPS - BigInt(slippageBps))) / BPS;
|
|
76
|
+
/**
|
|
77
|
+
* The minimum a built swap must promise: no lower than the pool-price floor, the shortfall it is for (`need`), or the
|
|
78
|
+
* quote less the user's slippage — with 0.01% for the build's rounding (it re-reads the route, a unit or so under).
|
|
79
|
+
*/
|
|
80
|
+
export function requiredMinOut(o) {
|
|
81
|
+
const quoteMin = (o.quoteOut * (BPS - BigInt(o.slippageBps) - 1n)) / BPS;
|
|
82
|
+
return [minOutFloor(o.spot, o.impactBps, o.slippageBps), o.need, quoteMin].reduce((a, b) => (a > b ? a : b));
|
|
83
|
+
}
|
|
84
|
+
const ROUTER_ABI = parseAbi([
|
|
85
|
+
'struct SwapDescriptionV2 { address srcToken; address dstToken; address[] srcReceivers; uint256[] srcAmounts; address[] feeReceivers; uint256[] feeAmounts; address dstReceiver; uint256 amount; uint256 minReturnAmount; uint256 flags; bytes permit; }',
|
|
86
|
+
'struct SwapExecutionParams { address callTarget; address approveTarget; bytes targetData; SwapDescriptionV2 desc; bytes clientData; }',
|
|
87
|
+
'function swap(SwapExecutionParams execution) payable returns (uint256 returnAmount, uint256 gasUsed)',
|
|
88
|
+
]);
|
|
89
|
+
export { ROUTER_ABI as KYBER_ROUTER_ABI };
|
|
90
|
+
/** throws SwapRefused unless the call is exactly the swap meant: see the module comment */
|
|
91
|
+
export function checkSwapCall(c, exp) {
|
|
92
|
+
const bad = (what) => { throw new SwapRefused('calldata', what); };
|
|
93
|
+
if (!same(c.to, KYBER_ROUTER))
|
|
94
|
+
bad('router');
|
|
95
|
+
let desc;
|
|
96
|
+
try {
|
|
97
|
+
const d = decodeFunctionData({ abi: ROUTER_ABI, data: c.data });
|
|
98
|
+
if (d.functionName !== 'swap')
|
|
99
|
+
bad('function');
|
|
100
|
+
desc = d.args[0].desc;
|
|
101
|
+
}
|
|
102
|
+
catch (e) {
|
|
103
|
+
if (e instanceof SwapRefused)
|
|
104
|
+
throw e;
|
|
105
|
+
return bad('undecodable');
|
|
106
|
+
}
|
|
107
|
+
if (!same(desc.srcToken, kyberToken(exp.from)) || !same(desc.dstToken, kyberToken(exp.to)))
|
|
108
|
+
bad('tokens');
|
|
109
|
+
if (desc.amount !== exp.amountIn)
|
|
110
|
+
bad('amount');
|
|
111
|
+
if (c.value !== (exp.from.native ? exp.amountIn : 0n))
|
|
112
|
+
bad('value');
|
|
113
|
+
if (!same(desc.dstReceiver, exp.account))
|
|
114
|
+
bad('recipient');
|
|
115
|
+
if (desc.feeReceivers.length !== 1 || !same(desc.feeReceivers[0], SWAP_FEE_RECEIVER) || desc.feeAmounts.length !== 1 || desc.feeAmounts[0] !== BigInt(exp.feeBps))
|
|
116
|
+
bad('fee');
|
|
117
|
+
if (desc.flags !== FLAGS)
|
|
118
|
+
bad('flags');
|
|
119
|
+
if (desc.permit !== '0x')
|
|
120
|
+
bad('permit');
|
|
121
|
+
// a token input: the router hands the executor the amount less our fee, no more (native: carried as value)
|
|
122
|
+
if (!exp.from.native && desc.srcAmounts.reduce((a, b) => a + b, 0n) !== exp.amountIn - (exp.amountIn * BigInt(exp.feeBps)) / BPS)
|
|
123
|
+
bad('split');
|
|
124
|
+
if (desc.minReturnAmount < exp.minOut || desc.minReturnAmount === 0n)
|
|
125
|
+
bad('minimum');
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=swap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap.js","sourceRoot":"","sources":["../../src/liquidity/swap.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lpsignal",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Official LPSignal SDK: net-of-IL APR signals for concentrated-liquidity pools, a WebSocket stream that never misses a signal, webhook verification and the REST API, and adding / removing liquidity from your own wallet (lpsignal/liquidity).",
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "Official LPSignal SDK: net-of-IL APR signals for concentrated-liquidity pools, a WebSocket stream that never misses a signal, webhook verification and the REST API, and adding / removing liquidity and swapping from your own wallet (lpsignal/liquidity).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
"@types/node": "^22.0.0",
|
|
56
56
|
"@types/ws": "^8.5.12",
|
|
57
57
|
"typescript": "^5.6.0",
|
|
58
|
+
"undici": "^7.30.0",
|
|
58
59
|
"viem": "^2.57.2",
|
|
59
60
|
"vitest": "^3.2.0"
|
|
60
61
|
},
|