@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 @@
1
+ {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../src/reads.ts"],"names":[],"mappings":"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"}
package/dist/reads.js ADDED
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Reading FLOOR launches off an EVM chain with viem.
3
+ *
4
+ * - `poolState` is one `eth_call`, decoded at one width (`decodePoolState` refuses any other).
5
+ * - The pool id comes from `hook.poolForAccount(launch)` — THE HOOK IS THE SOURCE OF THE ID, never the registry entry or a
6
+ * derived key. The pool's own FLOOR Platform fee is read off `poolState.teamFeeBps` and cap-checked.
7
+ * - The sale's getters are read in one batch; its `teamFeeBps()` only on a set whose row names a team vault.
8
+ * - The deployer is `factory.creatorOf(launch)` on the entry's registrar; the published floor is `1.0001^-floorTick`.
9
+ *
10
+ * ⛔ Nothing here lists by draining a chain. `listLaunches` reads ONE registry page per call (newest first) and hands back a
11
+ * cursor; `getLaunch` resolves a token by its own `launch()` and the registry's `isRegistered`, then finds its entry in a
12
+ * BOUNDED newest-first scan (`maxRegistryScan`), remembering every entry it has seen.
13
+ */
14
+ import { BaseError, ContractFunctionRevertedError, decodeFunctionResult, encodeFunctionData, getAddress, zeroAddress, zeroHash } from 'viem';
15
+ import { HOOK_ABI, LAUNCH_ABI, POOL_ABI, POOL_STATE_ABI, POOL_STATE_WORDS, REGISTRY_ABI, TOKEN_ABI, FACTORY_ABI, WALLET_SCAN_ABI } from './abi/index.js';
16
+ import { EVM_NETWORKS, setHasTeamFee } from './deployments.js';
17
+ import { FloorEvmError } from './errors.js';
18
+ import { MAX_POOL_TEAM_FEE_BPS, MAX_SALE_TEAM_FEE_BPS, rateWithinCap } from './fees.js';
19
+ import { decodeSlot0, poolIdOfKey, poolKey, poolStateSlot, priceX18AtTick, quoteAtCurrency1 } from './pool.js';
20
+ import { saleReadsFrom } from './sale.js';
21
+ /** The registry's page size. */
22
+ export const REGISTRY_PAGE_MAX = 500n;
23
+ /** `poolState(id)` calldata. */
24
+ export function poolStateCalldata(id) {
25
+ return encodeFunctionData({ abi: HOOK_ABI, functionName: 'poolState', args: [id] });
26
+ }
27
+ /** The raw `poolState` return → the named tuple. ⛔ A return of any width but `POOL_STATE_WORDS` is refused by name; viem
28
+ * itself would decode a longer one without complaint. */
29
+ export function decodePoolState(data) {
30
+ const hex = data.length >= 2 ? data.slice(2) : '';
31
+ const words = hex.length / 64;
32
+ if (hex.length > 0 && words !== POOL_STATE_WORDS) {
33
+ throw new FloorEvmError('contract_mismatch', `poolState returned ${words} words; the engine's layout has ${POOL_STATE_WORDS}`);
34
+ }
35
+ return decodeFunctionResult({ abi: HOOK_ABI, functionName: 'poolState', data });
36
+ }
37
+ /** ONE `eth_call` of `poolState(id)`, decoded through `decodePoolState`. */
38
+ export async function readPoolState(client, hook, id) {
39
+ const { data } = await client.call({ to: hook, data: poolStateCalldata(id) });
40
+ if (!data || data === '0x')
41
+ throw new FloorEvmError('contract_mismatch', `poolState(${id}) at ${hook} returned no data`);
42
+ return decodePoolState(data);
43
+ }
44
+ /** A pool's rates off its state, the FLOOR Platform fee checked against its cap (`RateAboveCap` past it). */
45
+ export function poolRatesOf(st) {
46
+ const n = (v, what) => {
47
+ if (v > 10000n)
48
+ throw new FloorEvmError('contract_mismatch', `poolState.${what} = ${v} is not a bps rate`);
49
+ return Number(v);
50
+ };
51
+ return {
52
+ skimBuyFarBps: n(st.skimBuyFarBps, 'skimBuyFarBps'),
53
+ skimSellFarBps: n(st.skimSellFarBps, 'skimSellFarBps'),
54
+ skimBuyAtFloorBps: n(st.skimBuyAtFloorBps, 'skimBuyAtFloorBps'),
55
+ skimSellAtFloorBps: n(st.skimSellAtFloorBps, 'skimSellAtFloorBps'),
56
+ creatorBuyBps: n(st.creatorBuyBps, 'creatorBuyBps'),
57
+ creatorSellBps: n(st.creatorSellBps, 'creatorSellBps'),
58
+ holderBuyBps: n(st.holderBuyBps, 'holderBuyBps'),
59
+ holderSellBps: n(st.holderSellBps, 'holderSellBps'),
60
+ teamFeeBps: rateWithinCap(Number(st.teamFeeBps), MAX_POOL_TEAM_FEE_BPS, 'the pool\'s FLOOR Platform fee (PoolState.teamFeeBps)'),
61
+ };
62
+ }
63
+ /** The pool's `Slot0` off the PoolManager (`extsload` of the pool's state slot). */
64
+ export async function readSlot0(client, poolManager, poolId) {
65
+ const word = await client.readContract({ address: poolManager, abi: POOL_STATE_ABI, functionName: 'extsload', args: [poolStateSlot(poolId)] });
66
+ return decodeSlot0(word);
67
+ }
68
+ /** Whether a viem error is a contract REVERT (an answer: "no"), as opposed to a transport failure (not an answer). */
69
+ export function isRevert(e) {
70
+ return e instanceof BaseError && e.walk((x) => x instanceof ContractFunctionRevertedError) instanceof ContractFunctionRevertedError;
71
+ }
72
+ export async function readRegistryCount(client, d) {
73
+ return client.readContract({ address: d.registry, abi: REGISTRY_ABI, functionName: 'count' });
74
+ }
75
+ export async function readRegistryPage(client, d, start, n) {
76
+ return client.readContract({ address: d.registry, abi: REGISTRY_ABI, functionName: 'page', args: [start, n] });
77
+ }
78
+ /**
79
+ * The launch contract behind a token, checked against THIS chain's registry. A token whose `launch()` reverts, is zero, or is
80
+ * not registered here is not a FLOOR launch on this chain: `FloorEvmError('not_a_launch')`.
81
+ */
82
+ export async function launchOfToken(client, d, token) {
83
+ let launch;
84
+ try {
85
+ launch = await client.readContract({ address: token, abi: WALLET_SCAN_ABI, functionName: 'launch' });
86
+ }
87
+ catch (e) {
88
+ if (isRevert(e))
89
+ throw new FloorEvmError('not_a_launch', `${token} answers no launch() — not a FLOOR token`, { cause: e });
90
+ throw e;
91
+ }
92
+ if (BigInt(launch) === 0n)
93
+ throw new FloorEvmError('not_a_launch', `${token}'s launch() is zero`);
94
+ const registered = await client.readContract({ address: d.registry, abi: REGISTRY_ABI, functionName: 'isRegistered', args: [launch] });
95
+ if (!registered)
96
+ throw new FloorEvmError('not_a_launch', `${token}'s launch ${launch} is not registered on chain ${d.chainId}'s registry ${d.registry}`);
97
+ return getAddress(launch);
98
+ }
99
+ /** A quote asset's address, symbol and decimals. Native: the chain's symbol and 18. */
100
+ export async function readQuoteAsset(client, chainId, quote, nativeSymbol) {
101
+ if (quote === null)
102
+ return { address: null, symbol: nativeSymbol ?? EVM_NETWORKS[chainId]?.nativeSymbol ?? 'native', decimals: 18 };
103
+ const [symbol, decimals] = await Promise.all([
104
+ client.readContract({ address: quote, abi: TOKEN_ABI, functionName: 'symbol' }),
105
+ client.readContract({ address: quote, abi: TOKEN_ABI, functionName: 'decimals' }),
106
+ ]);
107
+ return { address: quote, symbol, decimals };
108
+ }
109
+ /** The sale's getters in one batch, checked (`saleReadsFrom`). The fee is asked only on a set that carries it. */
110
+ export async function readSale(client, d, launch) {
111
+ const r = (functionName) => client.readContract({ address: launch, abi: LAUNCH_ABI, functionName });
112
+ const [funded, saleTokens, sold, raised, p0, p1, tranches, graduated, teamFeeBps] = await Promise.all([
113
+ r('funded'), r('saleTokens'), r('sold'), r('raised'), r('p0'), r('p1'), r('tranches'), r('graduated'),
114
+ setHasTeamFee(d) ? client.readContract({ address: launch, abi: LAUNCH_ABI, functionName: 'teamFeeBps' }).then((v) => rateWithinCap(Number(v), MAX_SALE_TEAM_FEE_BPS, `the sale ${launch}'s FLOOR Platform fee`)) : Promise.resolve(0),
115
+ ]);
116
+ return saleReadsFrom({ funded, saleTokens, sold, raised, p0, p1, tranches, graduated, teamFeeBps });
117
+ }
118
+ /** The hook's id for the launch's pool. A revert or a zero id is "not a launch this hook serves". */
119
+ export async function readPoolId(client, hook, launch) {
120
+ let id;
121
+ try {
122
+ id = await client.readContract({ address: hook, abi: HOOK_ABI, functionName: 'poolForAccount', args: [launch] });
123
+ }
124
+ catch (e) {
125
+ if (isRevert(e))
126
+ throw new FloorEvmError('not_a_launch', `hook ${hook} reverted poolForAccount(${launch})`, { cause: e });
127
+ throw e;
128
+ }
129
+ if (id === zeroHash)
130
+ throw new FloorEvmError('not_a_launch', `hook ${hook} has no pool for launch ${launch}`);
131
+ return id;
132
+ }
133
+ /**
134
+ * A launch, read whole from its registry entry: the token, the sale or the pool, the rates, the floor. Every rate is read
135
+ * off this launch's own contracts; nothing is assumed.
136
+ */
137
+ export async function readLaunchFromEntry(client, d, e, opts = {}) {
138
+ const token = getAddress(e.token), hook = getAddress(e.hook), launch = getAddress(e.launch);
139
+ const poolId = await readPoolId(client, hook, launch);
140
+ const [st, name, symbol, decimals, totalSupply, graduated, creator] = await Promise.all([
141
+ readPoolState(client, hook, poolId),
142
+ client.readContract({ address: token, abi: TOKEN_ABI, functionName: 'name' }),
143
+ client.readContract({ address: token, abi: TOKEN_ABI, functionName: 'symbol' }),
144
+ client.readContract({ address: token, abi: TOKEN_ABI, functionName: 'decimals' }),
145
+ client.readContract({ address: token, abi: TOKEN_ABI, functionName: 'totalSupply' }),
146
+ client.readContract({ address: launch, abi: LAUNCH_ABI, functionName: 'graduated' }),
147
+ client.readContract({ address: e.registrar, abi: FACTORY_ABI, functionName: 'creatorOf', args: [launch] }).then((a) => (BigInt(a) === 0n ? null : getAddress(a)), () => null),
148
+ ]);
149
+ if (st.token.toLowerCase() !== token.toLowerCase())
150
+ throw new FloorEvmError('contract_mismatch', `pool ${poolId} names token ${st.token}, not ${token}`);
151
+ const quoteToken = BigInt(st.quoteToken) === 0n ? null : getAddress(st.quoteToken);
152
+ const key = poolKey(token, hook, quoteToken ?? zeroAddress);
153
+ /* ⛔ The key this SDK will sign must hash to the hook's id for the launch. */
154
+ if (poolIdOfKey(key).toLowerCase() !== poolId.toLowerCase())
155
+ throw new FloorEvmError('contract_mismatch', `pool ${poolId}: the key of ${token} / ${quoteToken ?? 'native'} on hook ${hook} hashes to ${poolIdOfKey(key)}, not the hook's id`);
156
+ const orient = quoteAtCurrency1(key, quoteToken ?? zeroAddress);
157
+ if (orient === null || orient !== st.quoteIsCurrency1)
158
+ throw new FloorEvmError('contract_mismatch', `pool ${poolId}'s quote orientation disagrees with its key`);
159
+ const [quote, sale] = await Promise.all([
160
+ readQuoteAsset(client, d.chainId, quoteToken, opts.nativeSymbol),
161
+ graduated ? Promise.resolve(null) : readSale(client, d, launch),
162
+ ]);
163
+ const poolRates = poolRatesOf(st);
164
+ const bidWidth = st.bidWidth === 0 ? st.tickSpacing : st.bidWidth;
165
+ return {
166
+ ref: { chain: { family: 'evm', chainId: d.chainId }, token },
167
+ name, symbol, decimals, totalSupply, quote,
168
+ /* An unfunded sale takes no buy yet (`FloorLaunch._buy` reverts `NotFunded`): 'pending'. */
169
+ phase: graduated ? 'graduated' : sale?.funded ? 'bonding' : 'pending',
170
+ mode: e.mode,
171
+ creator,
172
+ floorPriceX18: graduated ? priceX18AtTick(st.floorTick, decimals, quote.decimals) : null,
173
+ raw: {
174
+ chainId: d.chainId, launch, token, hook, poolId, poolKey: key, rewards: getAddress(e.rewards), registrar: getAddress(e.registrar),
175
+ registeredAt: e.at, quoteToken, quoteIsCurrency1: st.quoteIsCurrency1, creator,
176
+ sale, saleTeamFeeBps: sale ? sale.teamFeeBps : null, poolRates, floorTick: st.floorTick, bidWidth, poolState: st,
177
+ },
178
+ };
179
+ }
180
+ /**
181
+ * The pool's staircase cushion edge (`stairs()` through `hook.execute(poolId, …)`): what the gap buy skim reads.
182
+ * `cushionLiq` 0 = no cushion standing.
183
+ */
184
+ export async function readCushion(client, hook, poolId) {
185
+ const inner = encodeFunctionData({ abi: POOL_ABI, functionName: 'stairs' });
186
+ const { data } = await client.call({ to: hook, data: encodeFunctionData({ abi: HOOK_ABI, functionName: 'execute', args: [poolId, inner] }) });
187
+ if (!data || data === '0x')
188
+ throw new FloorEvmError('contract_mismatch', `stairs() of pool ${poolId} at ${hook} returned no data`);
189
+ const bytes = decodeFunctionResult({ abi: HOOK_ABI, functionName: 'execute', data });
190
+ const st = decodeFunctionResult({ abi: POOL_ABI, functionName: 'stairs', data: bytes });
191
+ return { cushionLower: st.cushionLower, cushionLiq: st.cushionLiq };
192
+ }
193
+ /** Reads a holder's sale position (`allocation`, `contributed`) — what a sell-back pays against. */
194
+ export async function readSalePosition(client, launch, holder) {
195
+ const [allocation, contributed] = await Promise.all([
196
+ client.readContract({ address: launch, abi: LAUNCH_ABI, functionName: 'allocation', args: [holder] }),
197
+ client.readContract({ address: launch, abi: LAUNCH_ABI, functionName: 'contributed', args: [holder] }),
198
+ ]);
199
+ return { allocation, contributed };
200
+ }
201
+ //# sourceMappingURL=reads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reads.js","sourceRoot":"","sources":["../src/reads.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ /**
2
+ * The UniversalRouter / v4 payloads a FLOOR pool swap is sent as.
3
+ *
4
+ * ⛔ No off-chain Permit2 signature anywhere: instead of a signed permit inside the swap (PERMIT2_PERMIT, 0x8a), Permit2's
5
+ * on-chain `approve` goes in the same EIP-5792 batch as the trade, so the batch is one wallet prompt.
6
+ *
7
+ * ⛔ TWO byte tables overlap: 0x10 is V4_SWAP as a COMMAND and TAKE_PORTION as an ACTION.
8
+ * ⛔ TAKE_ALL's amount is the MINIMUM received: at zero it accepts any output. Every swap here carries a positive one.
9
+ * ⛔ The struct layout depends on the router's RELEASE (2.1.1 adds `minHopPriceX36`); a UniversalRouter with no recorded
10
+ * release is refused before a byte is encoded.
11
+ */
12
+ import { type Address, type Hex } from 'viem';
13
+ import type { PoolKey } from './pool.js';
14
+ import type { UrRelease } from './deployments.js';
15
+ export type V4Layout = 'plain' | 'minHop';
16
+ export declare function v4LayoutOf(kind: 'universal' | 'v4router', release: UrRelease | undefined): V4Layout;
17
+ /** `IV4Router.ExactInputSingleParams` in the router's layout. There is NO price-limit field. */
18
+ export declare function exactInSingleTuple(layout: V4Layout): {
19
+ readonly type: "tuple";
20
+ readonly components: readonly [{
21
+ readonly name: "poolKey";
22
+ readonly type: "tuple";
23
+ readonly components: readonly [{
24
+ readonly name: "currency0";
25
+ readonly type: "address";
26
+ }, {
27
+ readonly name: "currency1";
28
+ readonly type: "address";
29
+ }, {
30
+ readonly name: "fee";
31
+ readonly type: "uint24";
32
+ }, {
33
+ readonly name: "tickSpacing";
34
+ readonly type: "int24";
35
+ }, {
36
+ readonly name: "hooks";
37
+ readonly type: "address";
38
+ }];
39
+ }, {
40
+ readonly name: "zeroForOne";
41
+ readonly type: "bool";
42
+ }, {
43
+ readonly name: "amountIn";
44
+ readonly type: "uint128";
45
+ }, {
46
+ readonly name: "amountOutMinimum";
47
+ readonly type: "uint128";
48
+ }, ...{
49
+ readonly name: "minHopPriceX36";
50
+ readonly type: "uint256";
51
+ }[], {
52
+ readonly name: "hookData";
53
+ readonly type: "bytes";
54
+ }];
55
+ };
56
+ export interface V4SingleIn {
57
+ key: PoolKey;
58
+ zeroForOne: boolean;
59
+ amountIn: bigint;
60
+ amountOutMinimum: bigint;
61
+ minHopPriceX36?: bigint;
62
+ hookData?: Hex;
63
+ }
64
+ export declare function encodeV4ExactInSingle(layout: V4Layout, p: V4SingleIn): Hex;
65
+ export interface SwapPlan {
66
+ commands: Hex;
67
+ inputs: readonly Hex[];
68
+ }
69
+ export declare function encodeV4Actions(actions: Hex, params: readonly Hex[]): Hex;
70
+ export interface V4SwapArgs {
71
+ layout: V4Layout;
72
+ key: PoolKey;
73
+ zeroForOne: boolean;
74
+ currencyIn: Address;
75
+ currencyOut: Address;
76
+ amountIn: bigint;
77
+ minOut: bigint;
78
+ /** `router`: the input is already in the router (a `FloorSwapRatchet` paid it there) — SETTLE from the router's balance. */
79
+ payer?: 'user' | 'router';
80
+ }
81
+ /**
82
+ * One exact-in single-hop v4 swap as UniversalRouter commands: V4_SWAP (SWAP_EXACT_IN_SINGLE, SETTLE_ALL, TAKE_ALL), plus a
83
+ * SWEEP of native back to the caller when the input is native (the router keeps no change).
84
+ */
85
+ export declare function encodeV4Swap(a: V4SwapArgs): SwapPlan;
86
+ /** `IV4Quoter.QuoteExactSingleParams` for the key and direction a swap will sign. */
87
+ export declare function quoteParamsForKey(key: PoolKey, zeroForOne: boolean, exactAmount: bigint): {
88
+ poolKey: PoolKey;
89
+ zeroForOne: boolean;
90
+ exactAmount: bigint;
91
+ hookData: Hex;
92
+ };
93
+ /** A minimum received `slippageBps` under a quote, rounded DOWN; 0 for a quote of nothing (which callers refuse). 100 bps
94
+ * is a 1% slippage allowance. */
95
+ export declare function minOutFromBps(quoted: bigint, slippageBps: number): bigint;
96
+ /** Permit2's largest grant (uint160) and expiration (uint48). */
97
+ export declare const PERMIT2_MAX_AMOUNT: bigint;
98
+ export declare const PERMIT2_MAX_EXPIRATION: bigint;
99
+ //# sourceMappingURL=router.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAuB,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AACnE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAYlD,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1C,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,EAAE,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAMnG;AAWD,gGAAgG;AAChG,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYlD;AAWD,MAAM,WAAW,UAAU;IAAG,GAAG,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE;AAUtJ,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,GAAG,GAAG,CAI1E;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,GAAG,CAAC;IACd,MAAM,EAAE,SAAS,GAAG,EAAE,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,GAAG,EAAE,GAAG,GAAG,CAEzE;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,QAAQ,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,4HAA4H;IAC5H,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,QAAQ,CA8BpD;AAED,qFAAqF;AACrF,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM;;;;cACc,GAAG;EACxG;AAED;kCACkC;AAClC,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAIzE;AAED,iEAAiE;AACjE,eAAO,MAAM,kBAAkB,QAAoB,CAAC;AACpD,eAAO,MAAM,sBAAsB,QAAmB,CAAC"}
package/dist/router.js ADDED
@@ -0,0 +1,132 @@
1
+ /**
2
+ * The UniversalRouter / v4 payloads a FLOOR pool swap is sent as.
3
+ *
4
+ * ⛔ No off-chain Permit2 signature anywhere: instead of a signed permit inside the swap (PERMIT2_PERMIT, 0x8a), Permit2's
5
+ * on-chain `approve` goes in the same EIP-5792 batch as the trade, so the batch is one wallet prompt.
6
+ *
7
+ * ⛔ TWO byte tables overlap: 0x10 is V4_SWAP as a COMMAND and TAKE_PORTION as an ACTION.
8
+ * ⛔ TAKE_ALL's amount is the MINIMUM received: at zero it accepts any output. Every swap here carries a positive one.
9
+ * ⛔ The struct layout depends on the router's RELEASE (2.1.1 adds `minHopPriceX36`); a UniversalRouter with no recorded
10
+ * release is refused before a byte is encoded.
11
+ */
12
+ import { encodeAbiParameters } from 'viem';
13
+ const CMD_SWEEP = '04';
14
+ const CMD_V4_SWAP = '10';
15
+ const ACT_SWAP_EXACT_IN_SINGLE = '06';
16
+ const ACT_SETTLE = '0b';
17
+ const ACT_SETTLE_ALL = '0c';
18
+ const ACT_TAKE_ALL = '0f';
19
+ /** `ActionConstants.MSG_SENDER`: the router maps address(1) to the real caller. */
20
+ const MSG_SENDER = '0x0000000000000000000000000000000000000001';
21
+ const NATIVE = '0x0000000000000000000000000000000000000000';
22
+ export function v4LayoutOf(kind, release) {
23
+ if (kind === 'v4router')
24
+ return 'plain';
25
+ if (kind !== 'universal')
26
+ throw new Error(`v4 actions: ${String(kind)} is not an actions router`);
27
+ if (release === '2.1.1')
28
+ return 'minHop';
29
+ if (release === '2.0.0')
30
+ return 'plain';
31
+ throw new Error(`v4LayoutOf: a UniversalRouter needs its recorded release (got ${String(release)})`);
32
+ }
33
+ const POOL_KEY_TUPLE = {
34
+ type: 'tuple',
35
+ components: [
36
+ { name: 'currency0', type: 'address' }, { name: 'currency1', type: 'address' },
37
+ { name: 'fee', type: 'uint24' }, { name: 'tickSpacing', type: 'int24' },
38
+ { name: 'hooks', type: 'address' },
39
+ ],
40
+ };
41
+ /** `IV4Router.ExactInputSingleParams` in the router's layout. There is NO price-limit field. */
42
+ export function exactInSingleTuple(layout) {
43
+ return {
44
+ type: 'tuple',
45
+ components: [
46
+ { ...POOL_KEY_TUPLE, name: 'poolKey' },
47
+ { name: 'zeroForOne', type: 'bool' },
48
+ { name: 'amountIn', type: 'uint128' },
49
+ { name: 'amountOutMinimum', type: 'uint128' },
50
+ ...(layout === 'minHop' ? [{ name: 'minHopPriceX36', type: 'uint256' }] : []),
51
+ { name: 'hookData', type: 'bytes' },
52
+ ],
53
+ };
54
+ }
55
+ const CURRENCY_AND_AMOUNT = [{ type: 'address' }, { type: 'uint256' }];
56
+ const UINT128_MAX = (1n << 128n) - 1n;
57
+ function u128(v, what) {
58
+ if (v < 0n)
59
+ throw new Error(`${what}: an amount cannot be negative`);
60
+ if (v > UINT128_MAX)
61
+ throw new Error(`${what}: ${v} does not fit uint128`);
62
+ return v;
63
+ }
64
+ function minHopFor(layout, v) {
65
+ if (layout === 'plain') {
66
+ if (v !== undefined)
67
+ throw new Error('minHopPriceX36: this router\'s release has no such field');
68
+ return null;
69
+ }
70
+ return v ?? 0n;
71
+ }
72
+ export function encodeV4ExactInSingle(layout, p) {
73
+ const minHop = minHopFor(layout, p.minHopPriceX36);
74
+ const base = { poolKey: p.key, zeroForOne: p.zeroForOne, amountIn: u128(p.amountIn, 'amountIn'), amountOutMinimum: u128(p.amountOutMinimum, 'amountOutMinimum'), hookData: p.hookData ?? '0x' };
75
+ return encodeAbiParameters([exactInSingleTuple(layout)], [minHop === null ? base : { ...base, minHopPriceX36: minHop }]);
76
+ }
77
+ export function encodeV4Actions(actions, params) {
78
+ return encodeAbiParameters([{ type: 'bytes' }, { type: 'bytes[]' }], [actions, params]);
79
+ }
80
+ /**
81
+ * One exact-in single-hop v4 swap as UniversalRouter commands: V4_SWAP (SWAP_EXACT_IN_SINGLE, SETTLE_ALL, TAKE_ALL), plus a
82
+ * SWEEP of native back to the caller when the input is native (the router keeps no change).
83
+ */
84
+ export function encodeV4Swap(a) {
85
+ const key = a.key;
86
+ const amountIn = u128(a.amountIn, 'amountIn');
87
+ const minOut = u128(a.minOut, 'minOut');
88
+ if (amountIn === 0n)
89
+ throw new Error('amountIn: the amount must be greater than zero');
90
+ const [in0, in1] = a.zeroForOne ? [key.currency0, key.currency1] : [key.currency1, key.currency0];
91
+ if (a.currencyIn.toLowerCase() !== in0.toLowerCase() || a.currencyOut.toLowerCase() !== in1.toLowerCase()) {
92
+ throw new Error('v4 swap: currencyIn / currencyOut are not the key\'s currencies in this direction');
93
+ }
94
+ const { currencyIn, currencyOut } = a;
95
+ const fromRouter = a.payer === 'router' && currencyIn.toLowerCase() !== NATIVE;
96
+ const actions = ('0x' + ACT_SWAP_EXACT_IN_SINGLE + (fromRouter ? ACT_SETTLE : ACT_SETTLE_ALL) + ACT_TAKE_ALL);
97
+ const params = [
98
+ encodeV4ExactInSingle(a.layout, { key, zeroForOne: a.zeroForOne, amountIn, amountOutMinimum: minOut }),
99
+ fromRouter
100
+ ? encodeAbiParameters([{ type: 'address' }, { type: 'uint256' }, { type: 'bool' }], [currencyIn, 0n, false])
101
+ : encodeAbiParameters(CURRENCY_AND_AMOUNT, [currencyIn, amountIn]),
102
+ encodeAbiParameters(CURRENCY_AND_AMOUNT, [currencyOut, minOut]),
103
+ ];
104
+ const v4Input = encodeV4Actions(actions, params);
105
+ if (currencyIn.toLowerCase() !== NATIVE) {
106
+ return { commands: `0x${CMD_V4_SWAP}`, inputs: [v4Input] };
107
+ }
108
+ return {
109
+ commands: `0x${CMD_V4_SWAP}${CMD_SWEEP}`,
110
+ inputs: [
111
+ v4Input,
112
+ encodeAbiParameters([{ type: 'address' }, { type: 'address' }, { type: 'uint256' }], [NATIVE, MSG_SENDER, 0n]),
113
+ ],
114
+ };
115
+ }
116
+ /** `IV4Quoter.QuoteExactSingleParams` for the key and direction a swap will sign. */
117
+ export function quoteParamsForKey(key, zeroForOne, exactAmount) {
118
+ return { poolKey: key, zeroForOne, exactAmount: u128(exactAmount, 'exactAmount'), hookData: '0x' };
119
+ }
120
+ /** A minimum received `slippageBps` under a quote, rounded DOWN; 0 for a quote of nothing (which callers refuse). 100 bps
121
+ * is a 1% slippage allowance. */
122
+ export function minOutFromBps(quoted, slippageBps) {
123
+ if (quoted <= 0n)
124
+ return 0n;
125
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > 9_900)
126
+ throw new RangeError(`slippage ${slippageBps} bps is not in 0..9900`);
127
+ return (quoted * BigInt(10_000 - slippageBps)) / 10000n;
128
+ }
129
+ /** Permit2's largest grant (uint160) and expiration (uint48). */
130
+ export const PERMIT2_MAX_AMOUNT = (1n << 160n) - 1n;
131
+ export const PERMIT2_MAX_EXPIRATION = (1n << 48n) - 1n;
132
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
package/dist/sale.d.ts ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * The bonding sale's arithmetic: tranche prices, the buy walk and the sell-back payout, in bigint.
3
+ *
4
+ * Mirrors `FloorLaunch._buy` / `_walk` / `_sell`. A sale prices at one price (`p0 == p1`); `p1` is still read and walked.
5
+ *
6
+ * ⛔ The FLOOR Platform fee rides ON TOP of the sale price: a buy's `amountIn` is the GROSS cap, the walk spends at most
7
+ * `saleNetOf(gross)`, the fee is `floor(spent × bps / 10_000)`, and the change comes back to the payer.
8
+ * ⛔ A buy never receives more than the sale has left: an overfill is filled to the end and the rest refunded.
9
+ * ⛔ ROUNDING is per contract version (`ContractRules.saleCost`, read off the deployment row): the current `FloorLaunch`
10
+ * rounds a tranche's cost UP (`(tokens × price + 1e18 − 1) / 1e18`), older ones DOWN
11
+ * (`tokens × price / 1e18`). Pass the row's rule; a quote in the other rounding is off by up to one base unit a tranche.
12
+ * ⛔ The SELL-BACK is per contract version too (`ContractRules.sellBack`): stateless at the sale price, or pro-rata.
13
+ */
14
+ import type { ContractRules } from './deployments.js';
15
+ export declare const MAX_TRANCHES = 255;
16
+ /** A sale's book as its getters answer it. */
17
+ export interface SaleBook {
18
+ saleTokens: bigint;
19
+ sold: bigint;
20
+ p0: bigint;
21
+ p1: bigint;
22
+ tranches: number;
23
+ /** The SALE's own FLOOR Platform fee, bps (`FloorLaunch.teamFeeBps()`), 0 on a set without the fee. */
24
+ teamFeeBps: number;
25
+ }
26
+ export interface SaleReads extends SaleBook {
27
+ funded: boolean;
28
+ raised: bigint;
29
+ graduated: boolean;
30
+ }
31
+ export declare function validTranches(n: unknown): n is number;
32
+ /** The getters' answers, checked: tranches in 1..255, the fee a rate under the sale's cap. Throws `MalformedSale`. */
33
+ export declare function saleReadsFrom(raw: Omit<SaleReads, 'tranches'> & {
34
+ tranches: number | bigint;
35
+ }): SaleReads;
36
+ export declare function trancheSize(s: SaleBook): bigint;
37
+ /** Tranche `i`'s price: raw quote per WHOLE (1e18-unit) token, linear from `p0` to `p1`. */
38
+ export declare function tranchePrice(s: SaleBook, i: number): bigint;
39
+ export declare function currentTranche(s: SaleBook): number;
40
+ /** How a tranche's cost is rounded (`ContractRules.saleCost`). */
41
+ export type SaleCostRounding = ContractRules['saleCost'];
42
+ /** A tranche slice's cost: `tokens × price / unit`, rounded as `rounding` says. */
43
+ export declare function trancheCost(tokens: bigint, price: bigint, unit: bigint, rounding: SaleCostRounding): bigint;
44
+ /** The whole raise: what buying every sale token costs (before the FLOOR Platform fee). */
45
+ export declare function saleTargetWei(s: SaleBook, rounding?: SaleCostRounding): bigint;
46
+ export interface SaleBuyQuote {
47
+ /** Tokens received. */
48
+ got: bigint;
49
+ /** Quote spent at the sale price (the raise grows by this). */
50
+ spent: bigint;
51
+ /** The sale's FLOOR Platform fee on `spent`. */
52
+ fee: bigint;
53
+ /** The most one buy can receive now (what is left). */
54
+ maxGot: bigint;
55
+ /** The least GROSS that buys everything left. */
56
+ fillWei: bigint;
57
+ /** True when `amountIn` exceeds `fillWei` (the rest is refunded). */
58
+ overfills: boolean;
59
+ }
60
+ /**
61
+ * A bonding buy of GROSS `amountInWei` (the fee rides on top). `tokenDecimals` is 18 on every EVM launch. `rounding` is the
62
+ * deployment's `ContractRules.saleCost` (default: the current contracts, `ceil`). `fillWei` is the least gross whose net
63
+ * walks to the end of the sale in that rounding.
64
+ */
65
+ export declare function saleBuyQuote(s: SaleBook, amountInWei: bigint, tokenDecimals: number, rounding?: SaleCostRounding): SaleBuyQuote;
66
+ /**
67
+ * A sell-back of `tokens` (`FloorLaunch._sell`), less the sale's FLOOR Platform fee (`floor(payout × bps / 10_000)`).
68
+ * - `stateless` (the current contracts, default): `payout = tokens × p0 / 1e18` — the tokens at the sale's one price,
69
+ * rounded down — capped at the position's `contributed`.
70
+ * - `proRata` (older contracts): `payout = contributed × tokens / allocation`, rounded down.
71
+ * The position (`allocation` tokens bought for `contributed` quote) bounds both: `null` where the sale would revert
72
+ * (`tokens` zero or above the allocation).
73
+ */
74
+ export declare function sellBackQuote(p0: bigint, contributed: bigint, allocation: bigint, tokens: bigint, teamFeeBps: number, rule?: ContractRules['sellBack']): {
75
+ payout: bigint;
76
+ fee: bigint;
77
+ paid: bigint;
78
+ } | null;
79
+ //# sourceMappingURL=sale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sale.d.ts","sourceRoot":"","sources":["../src/sale.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC,8CAA8C;AAC9C,MAAM,WAAW,QAAQ;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,uGAAuG;IACvG,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAErD;AAED,sHAAsH;AACtH,wBAAgB,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,GAAG,SAAS,CAOzG;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAE/C;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAIlD;AAED,kEAAkE;AAClE,MAAM,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;AAEzD,mFAAmF;AACnF,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAG3G;AAED,2FAA2F;AAC3F,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAE,gBAAyB,GAAG,MAAM,CAWtF;AA+BD,MAAM,WAAW,YAAY;IAC3B,uBAAuB;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,uDAAuD;IACvD,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,OAAO,EAAE,MAAM,CAAC;IAChB,qEAAqE;IACrE,SAAS,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,GAAE,gBAAyB,GAAG,YAAY,CAMvI;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,GAAE,aAAa,CAAC,UAAU,CAAe,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAU1N"}