@floorlaunchpad/sdk-evm 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/LICENSE +61 -0
  2. package/README.md +154 -2
  3. package/dist/abi/floor.d.ts +1315 -0
  4. package/dist/abi/floor.d.ts.map +1 -0
  5. package/dist/abi/floor.js +154 -0
  6. package/dist/abi/floor.js.map +1 -0
  7. package/dist/abi/generated.d.ts +12824 -0
  8. package/dist/abi/generated.d.ts.map +1 -0
  9. package/dist/abi/generated.js +1264 -0
  10. package/dist/abi/generated.js.map +1 -0
  11. package/dist/abi/index.d.ts +2 -0
  12. package/dist/abi/index.d.ts.map +1 -0
  13. package/dist/abi/index.js +2 -0
  14. package/dist/abi/index.js.map +1 -0
  15. package/dist/adapter.d.ts +89 -0
  16. package/dist/adapter.d.ts.map +1 -0
  17. package/dist/adapter.js +250 -0
  18. package/dist/adapter.js.map +1 -0
  19. package/dist/deployments.d.ts +154 -0
  20. package/dist/deployments.d.ts.map +1 -0
  21. package/dist/deployments.js +368 -0
  22. package/dist/deployments.js.map +1 -0
  23. package/dist/errors.d.ts +56 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +42 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/events.d.ts +45 -0
  28. package/dist/events.d.ts.map +1 -0
  29. package/dist/events.js +78 -0
  30. package/dist/events.js.map +1 -0
  31. package/dist/fees.d.ts +100 -0
  32. package/dist/fees.d.ts.map +1 -0
  33. package/dist/fees.js +156 -0
  34. package/dist/fees.js.map +1 -0
  35. package/dist/index.d.ts +18 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +18 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/pool.d.ts +63 -0
  40. package/dist/pool.d.ts.map +1 -0
  41. package/dist/pool.js +118 -0
  42. package/dist/pool.js.map +1 -0
  43. package/dist/reads.d.ts +107 -0
  44. package/dist/reads.d.ts.map +1 -0
  45. package/dist/reads.js +201 -0
  46. package/dist/reads.js.map +1 -0
  47. package/dist/router.d.ts +99 -0
  48. package/dist/router.d.ts.map +1 -0
  49. package/dist/router.js +132 -0
  50. package/dist/router.js.map +1 -0
  51. package/dist/sale.d.ts +79 -0
  52. package/dist/sale.d.ts.map +1 -0
  53. package/dist/sale.js +123 -0
  54. package/dist/sale.js.map +1 -0
  55. package/dist/send.d.ts +64 -0
  56. package/dist/send.d.ts.map +1 -0
  57. package/dist/send.js +137 -0
  58. package/dist/send.js.map +1 -0
  59. package/dist/simulate.d.ts +180 -0
  60. package/dist/simulate.d.ts.map +1 -0
  61. package/dist/simulate.js +270 -0
  62. package/dist/simulate.js.map +1 -0
  63. package/dist/trade.d.ts +140 -0
  64. package/dist/trade.d.ts.map +1 -0
  65. package/dist/trade.js +170 -0
  66. package/dist/trade.js.map +1 -0
  67. package/package.json +43 -4
@@ -0,0 +1,89 @@
1
+ /**
2
+ * `createEvmAdapter` — `@floorlaunchpad/sdk`'s `FloorChainAdapter` for EVM chains.
3
+ *
4
+ * One adapter serves any number of chains; each chain needs a FLOOR set in its deployment row (`floorDeploymentFor` refuses
5
+ * the others by name at construction) and a transport. Reads go through viem `PublicClient`s; `build*` returns unsigned
6
+ * transactions and never signs.
7
+ */
8
+ import { type PublicClient, type Transport } from 'viem';
9
+ import type { Amount, ChainRef, FloorChainAdapter, LaunchRef, Quote, Side, TradeParams, UnsignedTx } from '@floorlaunchpad/sdk';
10
+ import { type Deployment } from './deployments.js';
11
+ import { type EvmLaunch } from './reads.js';
12
+ import { type ApprovalAmount } from './trade.js';
13
+ /** A quote with what an EVM integrator needs beside the shared shape. */
14
+ export interface EvmQuote extends Quote {
15
+ /** `sale` before graduation (the bonding sale), `pool` after (the v4 pool). */
16
+ readonly venue: 'sale' | 'pool';
17
+ /**
18
+ * True when every fee part is the contracts' own integer arithmetic (a bonding trade). False on a pool swap: `amountOut` is
19
+ * the V4Quoter's simulation, but the parts are computed from the pool's rates at the PRE-trade tick — a sell's skim is
20
+ * charged at the post-swap tick (a minimum here) and the LP fee is stated in the quote at the swap's own rate.
21
+ */
22
+ readonly feesExact: boolean;
23
+ /** A bonding buy past what the sale has left: the quote the sale refunds. 0 otherwise. */
24
+ readonly refund: Amount;
25
+ /** True when this buy sells the sale out, so it graduates the launch in the same transaction. */
26
+ readonly graduates: boolean;
27
+ }
28
+ export interface EvmAdapterOptions {
29
+ /** The chain ids this adapter serves. Each must have a FLOOR set (in `deployments` or the committed table). */
30
+ readonly chains: readonly number[];
31
+ /** One transport per chain id. */
32
+ readonly transports?: Readonly<Record<number, Transport>>;
33
+ /** RPC URLs per chain id, used with viem's `http` transport where no `transports` / `clients` entry is given. */
34
+ readonly rpcUrls?: Readonly<Record<number, string>>;
35
+ /** Ready-made viem clients per chain id. Win over `transports` and `rpcUrls`. */
36
+ readonly clients?: Readonly<Record<number, PublicClient>>;
37
+ /** Extra or replacement deployment rows (a local Anvil set, a set not yet in the committed table), checked like the rest. */
38
+ readonly deployments?: Readonly<Record<number, Deployment>>;
39
+ /** The most registry entries `getLaunch` walks (newest first) to find a token's entry. Default 5,000 (ten pages of 500). */
40
+ readonly maxRegistryScan?: number;
41
+ /** The clock, in ms, for swap deadlines. Default `Date.now`. */
42
+ readonly now?: () => number;
43
+ /** The native asset's symbol per chain where `EVM_NETWORKS` does not name one. */
44
+ readonly nativeSymbols?: Readonly<Record<number, string>>;
45
+ }
46
+ /** The adapter, with the EVM-only calls beside the shared interface. */
47
+ export interface EvmAdapter extends FloorChainAdapter {
48
+ getLaunch(ref: LaunchRef): Promise<EvmLaunch>;
49
+ listLaunches(chain: ChainRef, opts?: {
50
+ readonly limit?: number;
51
+ readonly cursor?: string;
52
+ }): Promise<{
53
+ readonly launches: readonly EvmLaunch[];
54
+ readonly cursor: string | null;
55
+ }>;
56
+ /** A sell before graduation is a sell-back, at the sale price and bounded by the SELLER's position: pass `opts.trader`. */
57
+ quote(ref: LaunchRef, side: Side, amountIn: Amount, opts?: {
58
+ readonly trader?: string;
59
+ }): Promise<EvmQuote>;
60
+ /** Alias of `quote(ref, 'sell', tokens, { trader: seller })` before graduation. */
61
+ quoteSellBack(ref: LaunchRef, seller: string, tokens: Amount): Promise<EvmQuote>;
62
+ /**
63
+ * Every call the trade needs, in order: the approvals the trader has NOT yet granted (read now: the token's ERC-20
64
+ * approval of the sale or of Permit2, Permit2's on-chain approval of the router), then the trade. Send it with
65
+ * `sendEvmCalls` — one wallet prompt where the wallet takes an EIP-5792 batch.
66
+ */
67
+ buildTrade(params: TradeParams, opts?: TradeOptions): Promise<UnsignedTx>;
68
+ /** The deployment row a chain is served from. */
69
+ deploymentOf(chainId: number): Deployment;
70
+ /** The viem client a chain is read through. */
71
+ clientOf(chainId: number): PublicClient;
72
+ }
73
+ /** EVM-only choices for a trade. */
74
+ export interface TradeOptions {
75
+ /** Swap deadline (unix seconds); overrides `TradeParams.deadline`. Default: now + 600 s. */
76
+ readonly deadline?: bigint;
77
+ /** Send a pool swap through the chain's `FloorSwapRatchet` (where its row has one), running a due ratchet in the same tx. */
78
+ readonly swapRatchet?: {
79
+ readonly ratchet: boolean;
80
+ readonly sweep?: boolean;
81
+ };
82
+ /**
83
+ * How much each missing approval grants. Default `exact` for a bonding buy (the quote approved to the launch's own sale
84
+ * contract), `unlimited` for a pool swap (Permit2 and the UniversalRouter / `FloorSwapRatchet`).
85
+ */
86
+ readonly approvalAmount?: ApprovalAmount;
87
+ }
88
+ export declare function createEvmAdapter(options: EvmAdapterOptions): EvmAdapter;
89
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * `createEvmAdapter` — `@floorlaunchpad/sdk`'s `FloorChainAdapter` for EVM chains.
3
+ *
4
+ * One adapter serves any number of chains; each chain needs a FLOOR set in its deployment row (`floorDeploymentFor` refuses
5
+ * the others by name at construction) and a transport. Reads go through viem `PublicClient`s; `build*` returns unsigned
6
+ * transactions and never signs.
7
+ */
8
+ import { createPublicClient, getAddress, http } from 'viem';
9
+ import { V4_QUOTER_ABI } from './abi/index.js';
10
+ import { EVM_DEPLOYMENTS, checkDeployment, floorDeploymentFor, permit2For, rulesOf, swapRatchetOf, swapRouterOf } from './deployments.js';
11
+ import { FloorEvmError } from './errors.js';
12
+ import { assertWholeTake, bondingFeeParts, gapSkimBps, poolFeeParts, skimBpsAt } from './fees.js';
13
+ import { bandTicks, marketTick } from './pool.js';
14
+ import { launchOfToken, readCushion, readLaunchFromEntry, readRegistryCount, readRegistryPage, readSalePosition, readSlot0, REGISTRY_PAGE_MAX } from './reads.js';
15
+ import { quoteParamsForKey } from './router.js';
16
+ import { saleBuyQuote, sellBackQuote } from './sale.js';
17
+ import { BOND_BUY_GAS_FLOOR, SWAP_DEADLINE_SECONDS, bondBuyApprovals, buildBondBuy, buildPoolSwap, buildSellBack, buildSwapRatchet, evmTx, pendingApprovals, poolSwapApprovals } from './trade.js';
18
+ const MAX_LIST = 100;
19
+ export function createEvmAdapter(options) {
20
+ if (options.chains.length === 0)
21
+ throw new FloorEvmError('bad_params', 'createEvmAdapter: no chains');
22
+ const table = { ...EVM_DEPLOYMENTS };
23
+ for (const [k, d] of Object.entries(options.deployments ?? {}))
24
+ table[Number(k)] = checkDeployment(Number(k), d);
25
+ const deps = new Map();
26
+ const clients = new Map();
27
+ for (const chainId of options.chains) {
28
+ deps.set(chainId, floorDeploymentFor(chainId, table));
29
+ const given = options.clients?.[chainId];
30
+ if (given) {
31
+ clients.set(chainId, given);
32
+ continue;
33
+ }
34
+ const t = options.transports?.[chainId];
35
+ const url = options.rpcUrls?.[chainId];
36
+ if (!t && !url)
37
+ throw new FloorEvmError('bad_params', `createEvmAdapter: chain ${chainId} has no client, transport or rpc URL`);
38
+ clients.set(chainId, createPublicClient({ transport: t ?? http(url) }));
39
+ }
40
+ const now = options.now ?? Date.now;
41
+ const maxScan = BigInt(options.maxRegistryScan ?? 5_000);
42
+ const entries = new Map();
43
+ const checkedChain = new Map();
44
+ const chainIdOf = (chain) => {
45
+ if (chain.family !== 'evm')
46
+ throw new FloorEvmError('bad_params', `the EVM adapter serves no ${chain.family} chain`);
47
+ if (!deps.has(chain.chainId))
48
+ throw new FloorEvmError('bad_params', `the EVM adapter does not serve chain ${chain.chainId}`);
49
+ return chain.chainId;
50
+ };
51
+ const deploymentOf = (chainId) => {
52
+ const d = deps.get(chainId);
53
+ if (!d)
54
+ throw new FloorEvmError('bad_params', `the EVM adapter does not serve chain ${chainId}`);
55
+ return d;
56
+ };
57
+ /** ⛔ The client must be on the chain it is used for: a registry address read on another chain is a different contract. */
58
+ const clientOf = (chainId) => {
59
+ const c = clients.get(chainId);
60
+ if (!c)
61
+ throw new FloorEvmError('bad_params', `the EVM adapter does not serve chain ${chainId}`);
62
+ return c;
63
+ };
64
+ const ready = (chainId) => {
65
+ const c = clientOf(chainId);
66
+ let p = checkedChain.get(chainId);
67
+ if (!p) {
68
+ p = c.getChainId().then((id) => {
69
+ if (id !== chainId)
70
+ throw new FloorEvmError('contract_mismatch', `the client for chain ${chainId} is connected to chain ${id}`);
71
+ });
72
+ p.catch(() => checkedChain.delete(chainId));
73
+ checkedChain.set(chainId, p);
74
+ }
75
+ return p.then(() => c);
76
+ };
77
+ const entryKey = (chainId, token) => `${chainId}:${token.toLowerCase()}`;
78
+ const remember = (chainId, list) => { for (const e of list)
79
+ entries.set(entryKey(chainId, e.token), e); };
80
+ const nativeSymbol = (chainId) => options.nativeSymbols?.[chainId];
81
+ async function entryFor(chainId, token) {
82
+ const hit = entries.get(entryKey(chainId, token));
83
+ if (hit)
84
+ return hit;
85
+ const client = await ready(chainId), d = deploymentOf(chainId);
86
+ await launchOfToken(client, d, token);
87
+ const count = await readRegistryCount(client, d);
88
+ let end = count, walked = 0n;
89
+ while (end > 0n && walked < maxScan) {
90
+ const start = end > REGISTRY_PAGE_MAX ? end - REGISTRY_PAGE_MAX : 0n;
91
+ const page = await readRegistryPage(client, d, start, end - start);
92
+ remember(chainId, page);
93
+ const found = page.find((e) => e.token.toLowerCase() === token.toLowerCase());
94
+ if (found)
95
+ return found;
96
+ walked += end - start;
97
+ end = start;
98
+ }
99
+ throw new FloorEvmError('not_found', `${token} is registered on chain ${chainId}, but its entry is not among the newest ${walked} of ${count} (raise maxRegistryScan)`);
100
+ }
101
+ async function getLaunch(ref) {
102
+ const chainId = chainIdOf(ref.chain);
103
+ const token = getAddress(ref.token);
104
+ const e = await entryFor(chainId, token);
105
+ return readLaunchFromEntry(await ready(chainId), deploymentOf(chainId), e, { nativeSymbol: nativeSymbol(chainId) });
106
+ }
107
+ async function listLaunches(chain, opts = {}) {
108
+ const chainId = chainIdOf(chain);
109
+ const client = await ready(chainId), d = deploymentOf(chainId);
110
+ const limit = opts.limit ?? 20;
111
+ if (!Number.isInteger(limit) || limit < 1 || limit > MAX_LIST)
112
+ throw new FloorEvmError('bad_params', `listLaunches: limit ${limit} is not in 1..${MAX_LIST}`);
113
+ const count = await readRegistryCount(client, d);
114
+ let end = count;
115
+ if (opts.cursor !== undefined) {
116
+ if (!/^[0-9]+$/.test(opts.cursor) || BigInt(opts.cursor) > count)
117
+ throw new FloorEvmError('bad_params', `listLaunches: cursor ${opts.cursor} is not a registry position`);
118
+ end = BigInt(opts.cursor);
119
+ }
120
+ const start = end > BigInt(limit) ? end - BigInt(limit) : 0n;
121
+ const page = end > start ? await readRegistryPage(client, d, start, end - start) : [];
122
+ remember(chainId, page);
123
+ const read = await Promise.all([...page].reverse().map((e) => readLaunchFromEntry(client, d, e, { nativeSymbol: nativeSymbol(chainId) }).catch((err) => {
124
+ /* A registry entry this hook does not serve is dropped (a reverted `poolForAccount`);
125
+ a transport failure is not an answer and rejects the page. */
126
+ if (err instanceof FloorEvmError && (err.code === 'not_a_launch' || err.code === 'contract_mismatch'))
127
+ return null;
128
+ throw err;
129
+ })));
130
+ return { launches: read.filter((l) => l !== null), cursor: start > 0n ? start.toString() : null };
131
+ }
132
+ async function poolQuote(L, side, amountIn) {
133
+ const chainId = L.raw.chainId, d = deploymentOf(chainId), client = await ready(chainId);
134
+ if (!d.quoter)
135
+ throw new FloorEvmError('no_quote', `chain ${chainId} records no V4Quoter: a pool trade cannot be priced`);
136
+ const buying = side === 'buy';
137
+ const zeroForOne = buying ? !L.raw.quoteIsCurrency1 : L.raw.quoteIsCurrency1;
138
+ const [sim, slot0] = await Promise.all([
139
+ client.simulateContract({ address: d.quoter, abi: V4_QUOTER_ABI, functionName: 'quoteExactInputSingle', args: [quoteParamsForKey(L.raw.poolKey, zeroForOne, amountIn)] }).catch((e) => {
140
+ throw new FloorEvmError('no_quote', `the V4Quoter could not price ${side} ${amountIn} on pool ${L.raw.poolId}`, { cause: e });
141
+ }),
142
+ readSlot0(client, d.poolManager, L.raw.poolId),
143
+ ]);
144
+ const [amountOut] = sim.result;
145
+ if (amountOut <= 0n)
146
+ throw new FloorEvmError('no_quote', `the V4Quoter priced ${side} ${amountIn} at nothing`);
147
+ const dearEdge = L.raw.floorTick - bandTicks(L.raw.poolState.tickSpacing);
148
+ const current = marketTick(slot0.tick, L.raw.quoteIsCurrency1);
149
+ let skim = skimBpsAt(side, dearEdge - current, L.raw.poolRates);
150
+ /* The engine scales a buy's skim by the cushion gap on contracts that carry the rule (`_takeFees` → `_gapSkim`). */
151
+ if (buying && rulesOf(d).gapSkim)
152
+ skim = gapSkimBps(skim, await readCushion(client, L.raw.hook, L.raw.poolId), current);
153
+ const fees = poolFeeParts(side, amountIn, amountOut, skim, L.raw.poolRates);
154
+ assertWholeTake(fees);
155
+ return { launch: L.ref, side, amountIn, amountOut, fees, venue: 'pool', feesExact: false, refund: 0n, graduates: false };
156
+ }
157
+ function saleBuy(L, amountIn) {
158
+ const sale = L.raw.sale;
159
+ if (!sale)
160
+ throw new FloorEvmError('contract_mismatch', 'a bonding launch with no sale book');
161
+ if (!sale.funded)
162
+ throw new FloorEvmError('no_quote', `the sale ${L.raw.launch} is not funded yet`);
163
+ const q = saleBuyQuote(sale, amountIn, L.decimals, rulesOf(deploymentOf(L.raw.chainId)).saleCost);
164
+ if (q.got <= 0n)
165
+ throw new FloorEvmError('no_quote', `the sale ${L.raw.launch} sells nothing for ${amountIn}`);
166
+ const fees = bondingFeeParts(q.fee);
167
+ assertWholeTake(fees);
168
+ const paid = q.spent + q.fee;
169
+ return { launch: L.ref, side: 'buy', amountIn: paid, amountOut: q.got, fees, venue: 'sale', feesExact: true, refund: amountIn - paid, graduates: q.got === q.maxGot };
170
+ }
171
+ async function sellBack(L, seller, tokens) {
172
+ if (L.raw.sale === null)
173
+ throw new FloorEvmError('bad_params', 'the launch has graduated: there is no sell-back, sell into the pool');
174
+ const pos = await readSalePosition(await ready(L.raw.chainId), L.raw.launch, seller);
175
+ const q = sellBackQuote(L.raw.sale.p0, pos.contributed, pos.allocation, tokens, L.raw.sale.teamFeeBps, rulesOf(deploymentOf(L.raw.chainId)).sellBack);
176
+ if (!q)
177
+ throw new FloorEvmError('bad_params', `${seller} can sell back at most ${pos.allocation} tokens of this sale (asked ${tokens})`);
178
+ const fees = bondingFeeParts(q.fee);
179
+ assertWholeTake(fees);
180
+ return { launch: L.ref, side: 'sell', amountIn: tokens, amountOut: q.paid, fees, venue: 'sale', feesExact: true, refund: 0n, graduates: false };
181
+ }
182
+ async function quote(ref, side, amountIn, opts = {}) {
183
+ if (amountIn <= 0n)
184
+ throw new FloorEvmError('bad_params', 'amountIn must be > 0');
185
+ const L = await getLaunch(ref);
186
+ if (L.phase === 'graduated')
187
+ return poolQuote(L, side, amountIn);
188
+ if (side === 'buy')
189
+ return saleBuy(L, amountIn);
190
+ if (!opts.trader)
191
+ throw new FloorEvmError('bad_params', 'a sell before graduation is a sell-back, bounded by the seller\'s position: pass opts.trader');
192
+ return sellBack(L, getAddress(opts.trader), amountIn);
193
+ }
194
+ async function quoteSellBack(ref, seller, tokens) {
195
+ return quote(ref, 'sell', tokens, { trader: seller });
196
+ }
197
+ function poolRoute(L, opts) {
198
+ const d = deploymentOf(L.raw.chainId);
199
+ const router = swapRouterOf(d);
200
+ if (!router)
201
+ throw new FloorEvmError('bad_params', `chain ${L.raw.chainId} records no swap router`);
202
+ if (router.kind !== 'universal')
203
+ throw new FloorEvmError('bad_params', `chain ${L.raw.chainId}'s router is PoolSwapTest, which enforces no minimum received — refused`);
204
+ const ratchet = opts.swapRatchet ? swapRatchetOf(d) : null;
205
+ if (opts.swapRatchet && !ratchet)
206
+ throw new FloorEvmError('bad_params', `chain ${L.raw.chainId} records no FloorSwapRatchet`);
207
+ return { d, router, ratchet, permit2: permit2For(d, router) };
208
+ }
209
+ async function buildTrade(params, opts = {}) {
210
+ if (params.amountIn <= 0n)
211
+ throw new FloorEvmError('bad_params', 'amountIn must be > 0');
212
+ if (params.minAmountOut <= 0n)
213
+ throw new FloorEvmError('bad_params', 'minAmountOut must be > 0');
214
+ const trader = getAddress(params.trader);
215
+ const L = await getLaunch(params.launch);
216
+ const chainId = L.raw.chainId, client = await ready(chainId);
217
+ if (L.phase !== 'graduated') {
218
+ const q = params.side === 'buy' ? saleBuy(L, params.amountIn) : await sellBack(L, trader, params.amountIn);
219
+ /* ⛔ The sale takes no minimum on chain: the minimum is checked HERE, against the book as just read. */
220
+ if (q.amountOut < params.minAmountOut)
221
+ throw new FloorEvmError('min_out_unmet', `the sale gives ${q.amountOut}, under the minimum ${params.minAmountOut}`);
222
+ if (params.side === 'sell')
223
+ return evmTx(chainId, [buildSellBack({ token: L.raw.token, tokens: params.amountIn })]);
224
+ const buy = { launch: L.raw.launch, quote: L.raw.quoteToken, amountIn: params.amountIn };
225
+ const missing = await pendingApprovals(client, trader, bondBuyApprovals(buy, opts.approvalAmount ?? 'exact'), now());
226
+ /* Any buy while the sale is open can become the one that sells it out and graduates it inline (other buys may land
227
+ first): every bonding buy carries the gas floor. */
228
+ return evmTx(chainId, [...missing.map((s) => s.call), { ...buildBondBuy(buy), gas: BOND_BUY_GAS_FLOOR }]);
229
+ }
230
+ const { d, router, ratchet, permit2 } = poolRoute(L, opts);
231
+ const deadline = opts.deadline ?? params.deadline ?? BigInt(Math.floor(now() / 1000)) + SWAP_DEADLINE_SECONDS;
232
+ const args = {
233
+ side: params.side, token: L.raw.token, hook: L.raw.hook, poolId: L.raw.poolId, quote: L.raw.quoteToken,
234
+ quoteIsCurrency1: L.raw.quoteIsCurrency1, amountIn: params.amountIn, minOut: params.minAmountOut, deadline,
235
+ router: { address: router.address, release: router.release },
236
+ };
237
+ const trade = ratchet && opts.swapRatchet
238
+ ? buildSwapRatchet({ ...args, swapRatchet: ratchet, ratchet: opts.swapRatchet.ratchet, ...(opts.swapRatchet.sweep !== undefined ? { sweep: opts.swapRatchet.sweep } : {}) })
239
+ : buildPoolSwap(args);
240
+ const steps = poolSwapApprovals({ side: params.side, token: L.raw.token, quote: L.raw.quoteToken, amountIn: params.amountIn, spender: ratchet ?? router.address, permit2 }, opts.approvalAmount ?? 'unlimited');
241
+ const missing = await pendingApprovals(client, trader, steps, now());
242
+ return evmTx(chainId, [...missing.map((s) => s.call), trade]);
243
+ }
244
+ return {
245
+ chains: options.chains.map((chainId) => ({ family: 'evm', chainId })),
246
+ getLaunch, listLaunches, quote, quoteSellBack, buildTrade,
247
+ deploymentOf, clientOf,
248
+ };
249
+ }
250
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Where FLOOR's contracts and Uniswap's v4 contracts are, per EVM chain id — plain data, no environment reads.
3
+ *
4
+ * Not included:
5
+ * - chain 31337 (Anvil): its addresses change on every local deploy. A caller with a local chain passes its own row
6
+ * (`createEvmAdapter({ deployments: { 31337: {...} } })`), checked by the same rules as these rows (`checkDeployment`).
7
+ * - RPC endpoints: the caller names its own transport or RPC URL.
8
+ *
9
+ * Two kinds of row share this table: a chain with a FLOOR set (Ethereum, Base, BSC, Robinhood Chain and Arc mainnets, which
10
+ * share one set of addresses, and Sepolia), and chains that carry only Uniswap's v4 contracts (FLOOR is not deployed there). `floorDeploymentFor` REFUSES the second kind by name —
11
+ * it never hands back an `ABSENT` field as if it were an address.
12
+ */
13
+ import { type Address } from 'viem';
14
+ /** How a swap reaches the pool. `universal` = Uniswap's UniversalRouter (pulls a token through Permit2); `poolswaptest` =
15
+ * v4-core's TEST harness (no minimum-out, no deadline; testnets only); `v4router` = a dev `MockV4Router` (local only). */
16
+ export type RouterKind = 'poolswaptest' | 'universal' | 'v4router';
17
+ /** The UniversalRouter release a `universal` row runs: 2.1.1 adds `minHopPriceX36` inside every v4 swap struct; 2.0.0 does not. */
18
+ export type UrRelease = '2.0.0' | '2.1.1';
19
+ export type SwapRouter = {
20
+ address: Address;
21
+ kind: 'poolswaptest';
22
+ } | {
23
+ address: Address;
24
+ kind: 'universal';
25
+ release: UrRelease;
26
+ };
27
+ export interface Deployment {
28
+ /** Equal to this row's key in `EVM_DEPLOYMENTS` (`checkDeployment` enforces it). */
29
+ chainId: number;
30
+ /** An input to every CREATE2 salt of the set. Empty where FLOOR is not deployed. */
31
+ deploymentId: string;
32
+ explorer?: string;
33
+ /** Uniswap's canonical v4 PoolManager on this chain — the one FLOOR's hook is (or will be) deployed against. */
34
+ poolManager: Address;
35
+ /** FLOOR's `FloorRegistry`. `ABSENT` where FLOOR is not deployed. */
36
+ registry: Address;
37
+ /** FLOOR's `FloorSingletonFactory`. `ABSENT` where FLOOR is not deployed. */
38
+ factory: Address;
39
+ /** FLOOR's `FloorVesting`. `ABSENT` where FLOOR is not deployed. */
40
+ vesting: Address;
41
+ /** The chain's one singleton FLOOR hook: every FLOOR pool on the chain is a v4 pool keyed by this hook (an indexer finds
42
+ * them by it in the PoolManager's `Initialize`). Optional. */
43
+ singletonHook?: Address;
44
+ /** The timelock that owns the set's upgrades. Optional. */
45
+ upgradeTimelock?: Address;
46
+ /** The platform treasury. Optional. */
47
+ platformTreasury?: Address;
48
+ /** `FloorRecipientClaims`. Optional: missing means "not part of this deployment". */
49
+ recipientClaims?: Address;
50
+ /** The chain's one `FloorHolderRewards` proxy. Optional. */
51
+ holderRewards?: Address;
52
+ /** The team vault `sweepTeamFees` pays the FLOOR Platform fee into. ITS PRESENCE is the signal that this set's contracts
53
+ * carry the FLOOR Platform fee ABI (`setHasTeamFee`); a set without it is never asked a rate and charges 0. */
54
+ teamTreasury?: Address;
55
+ /** `FloorTraderReferrals`. Optional. */
56
+ traderReferrals?: Address;
57
+ /** The block the set was deployed at — where a log scan starts. `0n` where FLOOR is not deployed. */
58
+ startBlock: bigint;
59
+ /** Every router, in preference order. Read through `swapRouterOf`, never by index. Empty = no swap router. */
60
+ routers: readonly {
61
+ address: Address;
62
+ kind: RouterKind;
63
+ release?: UrRelease;
64
+ }[];
65
+ /** Only for a row whose router pulls through Permit2. Omitted = this router needs none. */
66
+ permit2?: Address;
67
+ /** Uniswap's V4Quoter — the minimum-out source for a hooked pool. */
68
+ quoter?: Address;
69
+ stateView?: Address;
70
+ /** Uniswap v3 as this row's UniversalRouter reaches it (route hops). */
71
+ v3?: {
72
+ factory: Address;
73
+ quoter: Address;
74
+ weth: Address;
75
+ };
76
+ /** `FloorZap` (ETH → a stock quote → a sale buy). */
77
+ zap?: Address;
78
+ zapAerodrome?: Address;
79
+ zapAerodromeRouter?: Address;
80
+ /** `FloorPresetRegistry`: the launch presets' rows. Optional. */
81
+ presetRegistry?: Address;
82
+ /** `FloorSwapRatchet`: a pool trade through it can run a due ratchet in the same transaction. Only beside a `universal` router. */
83
+ swapRatchet?: Address;
84
+ /** Which contract behaviours this set's FLOOR contracts have. Omitted fields default to `CURRENT_RULES`. */
85
+ rules?: Partial<ContractRules>;
86
+ note?: string;
87
+ }
88
+ /**
89
+ * The contract behaviours that differ between FLOOR contract versions, which a quote must model to match the set it reads.
90
+ */
91
+ export interface ContractRules {
92
+ /** How `FloorLaunch._walk` rounds a tranche's cost: `ceil` = `(tokens·price + 1e18 − 1) / 1e18`, `floor` = `tokens·price / 1e18`. */
93
+ saleCost: 'floor' | 'ceil';
94
+ /** What `FloorLaunch._sell` pays: `stateless` = `min(tokens·p0 / 1e18, contributed)`; `proRata` = `contributed·tokens / allocation`. */
95
+ sellBack: 'stateless' | 'proRata';
96
+ /** Whether the engine scales a BUY's floor skim by the cushion gap (`_gapSkim`, the linear ramp; `gapSkimBps`). */
97
+ gapSkim: boolean;
98
+ }
99
+ /** The current FLOOR contracts: costs rounded up, the stateless sell-back, the gap buy skim. */
100
+ export declare const CURRENT_RULES: Readonly<ContractRules>;
101
+ /** Older FLOOR contracts: costs rounded down, the pro-rata sell-back, no gap buy skim. For a caller's row of such a set. */
102
+ export declare const OLDER_RULES: Readonly<ContractRules>;
103
+ /** A row's contract rules: its own `rules` over `CURRENT_RULES`. */
104
+ export declare function rulesOf(d: Pick<Deployment, 'rules'>): ContractRules;
105
+ /**
106
+ * NOT an address: a REQUIRED FLOOR contract that is not deployed on the chain. `''`, never a plausible hex string — a fake
107
+ * address does not throw, it reads address zero and lists nothing. `floorDeploymentFor` refuses a row still carrying one.
108
+ * Only the `CONTRACT_FIELDS` use it; every optional field uses `undefined`.
109
+ */
110
+ export declare const ABSENT: Address;
111
+ /** The fields `floorDeploymentFor` insists on, in the order they are needed. */
112
+ export declare const CONTRACT_FIELDS: readonly ["registry", "factory", "poolManager", "vesting"];
113
+ /** Permit2 — one address on every chain that has it (a CREATE2 deploy); each row that names it was checked against the chain. */
114
+ export declare const PERMIT2: Address;
115
+ /** Labels and native symbols for the EVM chain ids FLOOR names. */
116
+ export declare const EVM_NETWORKS: Readonly<Record<number, {
117
+ label: string;
118
+ nativeSymbol: string;
119
+ testnet: boolean;
120
+ }>>;
121
+ /**
122
+ * The rows, keyed by chain id. Six carry a FLOOR set: the five mainnets (1, 8453, 56, 4663, 5042; one set of addresses on
123
+ * all five, except Base's `zapAerodrome` and Ethereum, which has no `swapRatchet`) and Sepolia (11155111). The others carry
124
+ * Uniswap's v4 contracts only.
125
+ */
126
+ export declare const EVM_DEPLOYMENTS: Readonly<Record<number, Deployment>>;
127
+ /**
128
+ * A row's own consistency: the key and `chainId` agree; every set address is a
129
+ * well-formed, non-zero address; a REQUIRED field is either an address or `ABSENT`; Permit2 is the one Permit2 address.
130
+ * Throws `DeploymentConfigError` naming the field.
131
+ */
132
+ export declare function checkDeployment(key: number, d: Deployment): Deployment;
133
+ /** True when a row exists for the chain — of either kind. */
134
+ export declare function hasDeployment(chainId: number, table?: Readonly<Record<number, Deployment>>): boolean;
135
+ /**
136
+ * The chain's row, ONLY if it carries a FLOOR set: every `CONTRACT_FIELDS` address real. Otherwise a `DeploymentConfigError`
137
+ * naming the chain and the first missing contract — never a row with an `ABSENT` field handed on.
138
+ */
139
+ export declare function floorDeploymentFor(chainId: number, table?: Readonly<Record<number, Deployment>>): Deployment;
140
+ /** Whether a trade can settle on the chain at all: a PoolManager and at least one router. Orthogonal to having a FLOOR set. */
141
+ export declare function isTradable(chainId: number, table?: Readonly<Record<number, Deployment>>): boolean;
142
+ /** The router a single-hop pool swap goes through: the first non-`v4router` entry. A `universal` one carries its release. */
143
+ export declare function swapRouterOf(d: Pick<Deployment, 'routers'>): SwapRouter | null;
144
+ /** Permit2, only for a router that pulls through it (`universal`). */
145
+ export declare function permit2For(d: Pick<Deployment, 'permit2'>, router: {
146
+ kind: RouterKind;
147
+ } | null): Address | null;
148
+ /** `FloorSwapRatchet`, only beside a `universal` swap router (it wraps one UniversalRouter). */
149
+ export declare function swapRatchetOf(d: Pick<Deployment, 'routers' | 'swapRatchet'>): Address | null;
150
+ /** The FLOOR Platform fee ABI is on this set exactly when its row names a team vault. */
151
+ export declare function setHasTeamFee(d: Pick<Deployment, 'teamTreasury'>): boolean;
152
+ /** A row's optional address, or `null` where it is absent or zero. */
153
+ export declare function optionalAddress(a: Address | undefined): Address | null;
154
+ //# sourceMappingURL=deployments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployments.d.ts","sourceRoot":"","sources":["../src/deployments.ts"],"names":[],"mappings":"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"}