lpsignal 0.9.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.
@@ -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.9.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.",
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",
@@ -9,6 +9,10 @@
9
9
  ".": {
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.js"
12
+ },
13
+ "./liquidity": {
14
+ "types": "./dist/liquidity/index.d.ts",
15
+ "import": "./dist/liquidity/index.js"
12
16
  }
13
17
  },
14
18
  "files": [
@@ -51,6 +55,16 @@
51
55
  "@types/node": "^22.0.0",
52
56
  "@types/ws": "^8.5.12",
53
57
  "typescript": "^5.6.0",
58
+ "undici": "^7.30.0",
59
+ "viem": "^2.57.2",
54
60
  "vitest": "^3.2.0"
61
+ },
62
+ "peerDependencies": {
63
+ "viem": "^2.21.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "viem": {
67
+ "optional": true
68
+ }
55
69
  }
56
70
  }