auctionflow-sdk 1.2.0 → 1.3.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/dist/index.js CHANGED
@@ -24,9 +24,15 @@ __export(index_exports, {
24
24
  AuctionBuilder: () => AuctionBuilder,
25
25
  AuctionFlowSDK: () => AuctionFlowSDK,
26
26
  AuctionState: () => AuctionState,
27
+ DEFAULT_LIQUIDITY_BPS: () => DEFAULT_LIQUIDITY_BPS,
28
+ DEFAULT_SLIPPAGE_BPS: () => DEFAULT_SLIPPAGE_BPS,
29
+ MIN_LIQUIDITY_BPS: () => MIN_LIQUIDITY_BPS,
27
30
  USDC_ADDRESSES: () => USDC_ADDRESSES,
31
+ applySlippage: () => applySlippage,
28
32
  calculateBuyCost: () => calculateBuyCost,
29
33
  calculateBuyQuote: () => calculateBuyQuote,
34
+ fillPurchase: () => fillPurchase,
35
+ maxBuyable: () => maxBuyable,
30
36
  spotPrice: () => spotPrice
31
37
  });
32
38
  module.exports = __toCommonJS(index_exports);
@@ -34,6 +40,10 @@ module.exports = __toCommonJS(index_exports);
34
40
  // src/client.ts
35
41
  var import_viem = require("viem");
36
42
 
43
+ // src/constants/protocol.ts
44
+ var MIN_LIQUIDITY_BPS = 2e3;
45
+ var DEFAULT_LIQUIDITY_BPS = 5e3;
46
+
37
47
  // src/builders/auction-builder.ts
38
48
  var AuctionBuilder = class {
39
49
  config = {};
@@ -56,6 +66,16 @@ var AuctionBuilder = class {
56
66
  this.config.maxRaise = maxRaise;
57
67
  return this;
58
68
  }
69
+ /**
70
+ * Share of the raise, in basis points, seeded into a Uniswap pool when the
71
+ * auction migrates (5000 = 50%). The rest goes to the creator. Defaults to
72
+ * 50%; must be between 20% and 100%.
73
+ */
74
+ withLiquidity(liquidityBps) {
75
+ if (!Number.isInteger(liquidityBps)) throw new Error("liquidityBps must be an integer");
76
+ this.config.liquidityBps = BigInt(liquidityBps);
77
+ return this;
78
+ }
59
79
  withSchedule(startTime, endTime) {
60
80
  this.config.startTime = startTime;
61
81
  this.config.endTime = endTime;
@@ -78,11 +98,15 @@ var AuctionBuilder = class {
78
98
  throw new Error(`Missing required field: ${key}`);
79
99
  }
80
100
  }
81
- const config = this.config;
101
+ const config = { liquidityBps: BigInt(DEFAULT_LIQUIDITY_BPS), ...this.config };
82
102
  if (config.maxSupply <= 0n) throw new Error("maxSupply must be greater than 0");
83
103
  if (config.basePrice <= 0n) throw new Error("basePrice must be greater than 0");
84
104
  if (config.slope < 0n) throw new Error("slope must not be negative");
85
105
  if (config.maxRaise <= 0n) throw new Error("maxRaise must be greater than 0");
106
+ const liquidityBps = config.liquidityBps;
107
+ if (liquidityBps < BigInt(MIN_LIQUIDITY_BPS) || liquidityBps > 10000n) {
108
+ throw new Error(`liquidityBps must be between ${MIN_LIQUIDITY_BPS} and 10000`);
109
+ }
86
110
  if (config.startTime >= config.endTime) {
87
111
  throw new Error("startTime must be before endTime");
88
112
  }
@@ -92,7 +116,7 @@ var AuctionBuilder = class {
92
116
 
93
117
  // src/constants/addresses.ts
94
118
  var AUCTION_ADDRESSES = {
95
- 84532: "0x91519ca6c0b7a0e116a590c89a095199ff9f0054",
119
+ 84532: "0x722f4521b96aca1df7c65a1dbe3b1713803ccea9",
96
120
  8453: "0x0000000000000000000000000000000000000000"
97
121
  // not yet deployed
98
122
  };
@@ -115,10 +139,67 @@ var tokenAuctionAbi = [
115
139
  "name": "defaultFeeBps_",
116
140
  "type": "uint256",
117
141
  "internalType": "uint256"
142
+ },
143
+ {
144
+ "name": "positionManager_",
145
+ "type": "address",
146
+ "internalType": "contract INonfungiblePositionManager"
118
147
  }
119
148
  ],
120
149
  "stateMutability": "nonpayable"
121
150
  },
151
+ {
152
+ "type": "function",
153
+ "name": "MAX_FEE_BPS",
154
+ "inputs": [],
155
+ "outputs": [
156
+ {
157
+ "name": "",
158
+ "type": "uint256",
159
+ "internalType": "uint256"
160
+ }
161
+ ],
162
+ "stateMutability": "view"
163
+ },
164
+ {
165
+ "type": "function",
166
+ "name": "MAX_LP_FEE_SHARE_BPS",
167
+ "inputs": [],
168
+ "outputs": [
169
+ {
170
+ "name": "",
171
+ "type": "uint256",
172
+ "internalType": "uint256"
173
+ }
174
+ ],
175
+ "stateMutability": "view"
176
+ },
177
+ {
178
+ "type": "function",
179
+ "name": "MIN_LIQUIDITY_BPS",
180
+ "inputs": [],
181
+ "outputs": [
182
+ {
183
+ "name": "",
184
+ "type": "uint256",
185
+ "internalType": "uint256"
186
+ }
187
+ ],
188
+ "stateMutability": "view"
189
+ },
190
+ {
191
+ "type": "function",
192
+ "name": "POOL_FEE",
193
+ "inputs": [],
194
+ "outputs": [
195
+ {
196
+ "name": "",
197
+ "type": "uint24",
198
+ "internalType": "uint24"
199
+ }
200
+ ],
201
+ "stateMutability": "view"
202
+ },
122
203
  {
123
204
  "type": "function",
124
205
  "name": "auctionCount",
@@ -192,6 +273,16 @@ var tokenAuctionAbi = [
192
273
  "name": "protocolFeeBps",
193
274
  "type": "uint256",
194
275
  "internalType": "uint256"
276
+ },
277
+ {
278
+ "name": "liquidityBps",
279
+ "type": "uint256",
280
+ "internalType": "uint256"
281
+ },
282
+ {
283
+ "name": "lpFeeShareBps",
284
+ "type": "uint256",
285
+ "internalType": "uint256"
195
286
  }
196
287
  ]
197
288
  },
@@ -226,11 +317,40 @@ var tokenAuctionAbi = [
226
317
  "name": "amount",
227
318
  "type": "uint256",
228
319
  "internalType": "uint256"
320
+ },
321
+ {
322
+ "name": "maxCost",
323
+ "type": "uint256",
324
+ "internalType": "uint256"
229
325
  }
230
326
  ],
231
327
  "outputs": [],
232
328
  "stateMutability": "nonpayable"
233
329
  },
330
+ {
331
+ "type": "function",
332
+ "name": "collectFees",
333
+ "inputs": [
334
+ {
335
+ "name": "auctionId",
336
+ "type": "uint256",
337
+ "internalType": "uint256"
338
+ }
339
+ ],
340
+ "outputs": [
341
+ {
342
+ "name": "tokenFees",
343
+ "type": "uint256",
344
+ "internalType": "uint256"
345
+ },
346
+ {
347
+ "name": "paymentFees",
348
+ "type": "uint256",
349
+ "internalType": "uint256"
350
+ }
351
+ ],
352
+ "stateMutability": "nonpayable"
353
+ },
234
354
  {
235
355
  "type": "function",
236
356
  "name": "completeAuction",
@@ -249,63 +369,107 @@ var tokenAuctionAbi = [
249
369
  "name": "createAuction",
250
370
  "inputs": [
251
371
  {
252
- "name": "name",
253
- "type": "string",
254
- "internalType": "string"
255
- },
256
- {
257
- "name": "symbol",
258
- "type": "string",
259
- "internalType": "string"
260
- },
372
+ "name": "p",
373
+ "type": "tuple",
374
+ "internalType": "struct TokenAuction.AuctionParams",
375
+ "components": [
376
+ {
377
+ "name": "name",
378
+ "type": "string",
379
+ "internalType": "string"
380
+ },
381
+ {
382
+ "name": "symbol",
383
+ "type": "string",
384
+ "internalType": "string"
385
+ },
386
+ {
387
+ "name": "maxSupply",
388
+ "type": "uint256",
389
+ "internalType": "uint256"
390
+ },
391
+ {
392
+ "name": "paymentToken",
393
+ "type": "address",
394
+ "internalType": "address"
395
+ },
396
+ {
397
+ "name": "basePrice",
398
+ "type": "uint256",
399
+ "internalType": "uint256"
400
+ },
401
+ {
402
+ "name": "slope",
403
+ "type": "uint256",
404
+ "internalType": "uint256"
405
+ },
406
+ {
407
+ "name": "maxRaise",
408
+ "type": "uint256",
409
+ "internalType": "uint256"
410
+ },
411
+ {
412
+ "name": "startTime",
413
+ "type": "uint256",
414
+ "internalType": "uint256"
415
+ },
416
+ {
417
+ "name": "endTime",
418
+ "type": "uint256",
419
+ "internalType": "uint256"
420
+ },
421
+ {
422
+ "name": "liquidityBps",
423
+ "type": "uint256",
424
+ "internalType": "uint256"
425
+ }
426
+ ]
427
+ }
428
+ ],
429
+ "outputs": [
261
430
  {
262
- "name": "maxSupply",
431
+ "name": "auctionId",
263
432
  "type": "uint256",
264
433
  "internalType": "uint256"
265
- },
434
+ }
435
+ ],
436
+ "stateMutability": "nonpayable"
437
+ },
438
+ {
439
+ "type": "function",
440
+ "name": "custodied",
441
+ "inputs": [
266
442
  {
267
- "name": "paymentToken",
443
+ "name": "",
268
444
  "type": "address",
269
445
  "internalType": "address"
270
- },
271
- {
272
- "name": "basePrice",
273
- "type": "uint256",
274
- "internalType": "uint256"
275
- },
276
- {
277
- "name": "slope",
278
- "type": "uint256",
279
- "internalType": "uint256"
280
- },
281
- {
282
- "name": "maxRaise",
283
- "type": "uint256",
284
- "internalType": "uint256"
285
- },
286
- {
287
- "name": "startTime",
288
- "type": "uint256",
289
- "internalType": "uint256"
290
- },
446
+ }
447
+ ],
448
+ "outputs": [
291
449
  {
292
- "name": "endTime",
450
+ "name": "",
293
451
  "type": "uint256",
294
452
  "internalType": "uint256"
295
453
  }
296
454
  ],
455
+ "stateMutability": "view"
456
+ },
457
+ {
458
+ "type": "function",
459
+ "name": "defaultFeeBps",
460
+ "inputs": [],
297
461
  "outputs": [
298
462
  {
299
- "name": "auctionId",
463
+ "name": "",
300
464
  "type": "uint256",
301
465
  "internalType": "uint256"
302
466
  }
303
467
  ],
304
- "stateMutability": "nonpayable"
468
+ "stateMutability": "view"
305
469
  },
306
470
  {
307
471
  "type": "function",
308
- "name": "defaultFeeBps",
472
+ "name": "defaultLpFeeShareBps",
309
473
  "inputs": [],
310
474
  "outputs": [
311
475
  {
@@ -364,6 +528,19 @@ var tokenAuctionAbi = [
364
528
  ],
365
529
  "stateMutability": "view"
366
530
  },
531
+ {
532
+ "type": "function",
533
+ "name": "migrate",
534
+ "inputs": [
535
+ {
536
+ "name": "auctionId",
537
+ "type": "uint256",
538
+ "internalType": "uint256"
539
+ }
540
+ ],
541
+ "outputs": [],
542
+ "stateMutability": "nonpayable"
543
+ },
367
544
  {
368
545
  "type": "function",
369
546
  "name": "owner",
@@ -377,6 +554,57 @@ var tokenAuctionAbi = [
377
554
  ],
378
555
  "stateMutability": "view"
379
556
  },
557
+ {
558
+ "type": "function",
559
+ "name": "poolOf",
560
+ "inputs": [
561
+ {
562
+ "name": "",
563
+ "type": "uint256",
564
+ "internalType": "uint256"
565
+ }
566
+ ],
567
+ "outputs": [
568
+ {
569
+ "name": "",
570
+ "type": "address",
571
+ "internalType": "address"
572
+ }
573
+ ],
574
+ "stateMutability": "view"
575
+ },
576
+ {
577
+ "type": "function",
578
+ "name": "positionId",
579
+ "inputs": [
580
+ {
581
+ "name": "",
582
+ "type": "uint256",
583
+ "internalType": "uint256"
584
+ }
585
+ ],
586
+ "outputs": [
587
+ {
588
+ "name": "",
589
+ "type": "uint256",
590
+ "internalType": "uint256"
591
+ }
592
+ ],
593
+ "stateMutability": "view"
594
+ },
595
+ {
596
+ "type": "function",
597
+ "name": "positionManager",
598
+ "inputs": [],
599
+ "outputs": [
600
+ {
601
+ "name": "",
602
+ "type": "address",
603
+ "internalType": "contract INonfungiblePositionManager"
604
+ }
605
+ ],
606
+ "stateMutability": "view"
607
+ },
380
608
  {
381
609
  "type": "function",
382
610
  "name": "proceedsWithdrawn",
@@ -416,6 +644,63 @@ var tokenAuctionAbi = [
416
644
  "outputs": [],
417
645
  "stateMutability": "nonpayable"
418
646
  },
647
+ {
648
+ "type": "function",
649
+ "name": "setDefaultFeeBps",
650
+ "inputs": [
651
+ {
652
+ "name": "feeBps",
653
+ "type": "uint256",
654
+ "internalType": "uint256"
655
+ }
656
+ ],
657
+ "outputs": [],
658
+ "stateMutability": "nonpayable"
659
+ },
660
+ {
661
+ "type": "function",
662
+ "name": "setDefaultLpFeeShareBps",
663
+ "inputs": [
664
+ {
665
+ "name": "shareBps",
666
+ "type": "uint256",
667
+ "internalType": "uint256"
668
+ }
669
+ ],
670
+ "outputs": [],
671
+ "stateMutability": "nonpayable"
672
+ },
673
+ {
674
+ "type": "function",
675
+ "name": "setProtocolFeeRecipient",
676
+ "inputs": [
677
+ {
678
+ "name": "recipient",
679
+ "type": "address",
680
+ "internalType": "address"
681
+ }
682
+ ],
683
+ "outputs": [],
684
+ "stateMutability": "nonpayable"
685
+ },
686
+ {
687
+ "type": "function",
688
+ "name": "sweep",
689
+ "inputs": [
690
+ {
691
+ "name": "token",
692
+ "type": "address",
693
+ "internalType": "contract IERC20"
694
+ },
695
+ {
696
+ "name": "to",
697
+ "type": "address",
698
+ "internalType": "address"
699
+ }
700
+ ],
701
+ "outputs": [],
702
+ "stateMutability": "nonpayable"
703
+ },
419
704
  {
420
705
  "type": "function",
421
706
  "name": "transferOwnership",
@@ -429,6 +714,29 @@ var tokenAuctionAbi = [
429
714
  "outputs": [],
430
715
  "stateMutability": "nonpayable"
431
716
  },
717
+ {
718
+ "type": "function",
719
+ "name": "uniswapV3SwapCallback",
720
+ "inputs": [
721
+ {
722
+ "name": "amount0Delta",
723
+ "type": "int256",
724
+ "internalType": "int256"
725
+ },
726
+ {
727
+ "name": "amount1Delta",
728
+ "type": "int256",
729
+ "internalType": "int256"
730
+ },
731
+ {
732
+ "name": "data",
733
+ "type": "bytes",
734
+ "internalType": "bytes"
735
+ }
736
+ ],
737
+ "outputs": [],
738
+ "stateMutability": "nonpayable"
739
+ },
432
740
  {
433
741
  "type": "function",
434
742
  "name": "userPurchases",
@@ -548,6 +856,12 @@ var tokenAuctionAbi = [
548
856
  "type": "uint256",
549
857
  "indexed": false,
550
858
  "internalType": "uint256"
859
+ },
860
+ {
861
+ "name": "liquidityBps",
862
+ "type": "uint256",
863
+ "indexed": false,
864
+ "internalType": "uint256"
551
865
  }
552
866
  ],
553
867
  "anonymous": false
@@ -563,10 +877,103 @@ var tokenAuctionAbi = [
563
877
  "internalType": "uint256"
564
878
  },
565
879
  {
566
- "name": "liquidityPool",
880
+ "name": "pool",
567
881
  "type": "address",
568
882
  "indexed": false,
569
883
  "internalType": "address"
884
+ },
885
+ {
886
+ "name": "positionId",
887
+ "type": "uint256",
888
+ "indexed": false,
889
+ "internalType": "uint256"
890
+ },
891
+ {
892
+ "name": "tokenLiquidity",
893
+ "type": "uint256",
894
+ "indexed": false,
895
+ "internalType": "uint256"
896
+ },
897
+ {
898
+ "name": "paymentLiquidity",
899
+ "type": "uint256",
900
+ "indexed": false,
901
+ "internalType": "uint256"
902
+ }
903
+ ],
904
+ "anonymous": false
905
+ },
906
+ {
907
+ "type": "event",
908
+ "name": "DefaultFeeBpsUpdated",
909
+ "inputs": [
910
+ {
911
+ "name": "previous",
912
+ "type": "uint256",
913
+ "indexed": false,
914
+ "internalType": "uint256"
915
+ },
916
+ {
917
+ "name": "current",
918
+ "type": "uint256",
919
+ "indexed": false,
920
+ "internalType": "uint256"
921
+ }
922
+ ],
923
+ "anonymous": false
924
+ },
925
+ {
926
+ "type": "event",
927
+ "name": "DefaultLpFeeShareBpsUpdated",
928
+ "inputs": [
929
+ {
930
+ "name": "previous",
931
+ "type": "uint256",
932
+ "indexed": false,
933
+ "internalType": "uint256"
934
+ },
935
+ {
936
+ "name": "current",
937
+ "type": "uint256",
938
+ "indexed": false,
939
+ "internalType": "uint256"
940
+ }
941
+ ],
942
+ "anonymous": false
943
+ },
944
+ {
945
+ "type": "event",
946
+ "name": "LpFeesCollected",
947
+ "inputs": [
948
+ {
949
+ "name": "auctionId",
950
+ "type": "uint256",
951
+ "indexed": true,
952
+ "internalType": "uint256"
953
+ },
954
+ {
955
+ "name": "creatorTokenFees",
956
+ "type": "uint256",
957
+ "indexed": false,
958
+ "internalType": "uint256"
959
+ },
960
+ {
961
+ "name": "creatorPaymentFees",
962
+ "type": "uint256",
963
+ "indexed": false,
964
+ "internalType": "uint256"
965
+ },
966
+ {
967
+ "name": "protocolTokenFees",
968
+ "type": "uint256",
969
+ "indexed": false,
970
+ "internalType": "uint256"
971
+ },
972
+ {
973
+ "name": "protocolPaymentFees",
974
+ "type": "uint256",
975
+ "indexed": false,
976
+ "internalType": "uint256"
570
977
  }
571
978
  ],
572
979
  "anonymous": false
@@ -615,6 +1022,50 @@ var tokenAuctionAbi = [
615
1022
  ],
616
1023
  "anonymous": false
617
1024
  },
1025
+ {
1026
+ "type": "event",
1027
+ "name": "ProtocolFeeRecipientUpdated",
1028
+ "inputs": [
1029
+ {
1030
+ "name": "previous",
1031
+ "type": "address",
1032
+ "indexed": true,
1033
+ "internalType": "address"
1034
+ },
1035
+ {
1036
+ "name": "current",
1037
+ "type": "address",
1038
+ "indexed": true,
1039
+ "internalType": "address"
1040
+ }
1041
+ ],
1042
+ "anonymous": false
1043
+ },
1044
+ {
1045
+ "type": "event",
1046
+ "name": "Swept",
1047
+ "inputs": [
1048
+ {
1049
+ "name": "token",
1050
+ "type": "address",
1051
+ "indexed": true,
1052
+ "internalType": "address"
1053
+ },
1054
+ {
1055
+ "name": "to",
1056
+ "type": "address",
1057
+ "indexed": true,
1058
+ "internalType": "address"
1059
+ },
1060
+ {
1061
+ "name": "amount",
1062
+ "type": "uint256",
1063
+ "indexed": false,
1064
+ "internalType": "uint256"
1065
+ }
1066
+ ],
1067
+ "anonymous": false
1068
+ },
618
1069
  {
619
1070
  "type": "event",
620
1071
  "name": "TokensPurchased",
@@ -706,9 +1157,13 @@ var tokenAuctionAbi = [
706
1157
 
707
1158
  // src/utils/bonding-curve.ts
708
1159
  var TOKEN_SCALE = 10n ** 18n;
1160
+ var ceilDiv = (a, b) => (a + b - 1n) / b;
709
1161
  function calculateBuyCost(currentSupply, amount, basePrice, slope) {
710
- const linearCost = basePrice * amount / TOKEN_SCALE;
711
- const curveCost = slope * amount * (2n * currentSupply + amount) / (2n * TOKEN_SCALE * TOKEN_SCALE);
1162
+ const linearCost = ceilDiv(basePrice * amount, TOKEN_SCALE);
1163
+ const curveCost = ceilDiv(
1164
+ slope * amount * (2n * currentSupply + amount),
1165
+ 2n * TOKEN_SCALE * TOKEN_SCALE
1166
+ );
712
1167
  return linearCost + curveCost;
713
1168
  }
714
1169
  function spotPrice(currentSupply, basePrice, slope) {
@@ -724,6 +1179,37 @@ function calculateBuyQuote(currentSupply, amount, basePrice, slope, feeBps) {
724
1179
  spotPriceAfter: spotPrice(currentSupply + amount, basePrice, slope)
725
1180
  };
726
1181
  }
1182
+ var DEFAULT_SLIPPAGE_BPS = 100;
1183
+ function applySlippage(total, slippageBps) {
1184
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > 1e4) {
1185
+ throw new Error("slippageBps must be an integer between 0 and 10000");
1186
+ }
1187
+ return (total * BigInt(1e4 + slippageBps) + 9999n) / 10000n;
1188
+ }
1189
+ function maxBuyable(currentSupply, budget, basePrice, slope, upperBound) {
1190
+ let hi = budget * TOKEN_SCALE / basePrice + 1n;
1191
+ if (hi > upperBound) hi = upperBound;
1192
+ let lo = 0n;
1193
+ while (lo < hi) {
1194
+ const mid = (lo + hi + 1n) / 2n;
1195
+ if (calculateBuyCost(currentSupply, mid, basePrice, slope) <= budget) lo = mid;
1196
+ else hi = mid - 1n;
1197
+ }
1198
+ return lo;
1199
+ }
1200
+ function fillPurchase(currentSupply, requested, basePrice, slope, totalRaised, maxRaise) {
1201
+ const remaining = maxRaise - totalRaised;
1202
+ const cost = calculateBuyCost(currentSupply, requested, basePrice, slope);
1203
+ if (cost < remaining) return { amount: requested, cost, fillsAuction: false };
1204
+ if (cost === remaining) return { amount: requested, cost, fillsAuction: true };
1205
+ const amount = maxBuyable(currentSupply, remaining, basePrice, slope, requested);
1206
+ if (amount === 0n) throw new Error("Auction is sold out");
1207
+ return {
1208
+ amount,
1209
+ cost: calculateBuyCost(currentSupply, amount, basePrice, slope),
1210
+ fillsAuction: true
1211
+ };
1212
+ }
727
1213
 
728
1214
  // src/utils/chains.ts
729
1215
  var import_chains = require("viem/chains");
@@ -772,34 +1258,50 @@ var AuctionFlowSDK = class {
772
1258
  abi: tokenAuctionAbi,
773
1259
  functionName: "createAuction",
774
1260
  args: [
775
- config.name,
776
- config.symbol,
777
- config.maxSupply,
778
- config.paymentToken,
779
- config.basePrice,
780
- config.slope,
781
- config.maxRaise,
782
- config.startTime,
783
- config.endTime
1261
+ {
1262
+ name: config.name,
1263
+ symbol: config.symbol,
1264
+ maxSupply: config.maxSupply,
1265
+ paymentToken: config.paymentToken,
1266
+ basePrice: config.basePrice,
1267
+ slope: config.slope,
1268
+ maxRaise: config.maxRaise,
1269
+ startTime: config.startTime,
1270
+ endTime: config.endTime,
1271
+ liquidityBps: config.liquidityBps ?? BigInt(DEFAULT_LIQUIDITY_BPS)
1272
+ }
784
1273
  ]
785
1274
  });
786
1275
  return hash;
787
1276
  }
788
- async buyTokens(auctionId, amount) {
1277
+ /**
1278
+ * Buy `amount` tokens (in token wei). The price rises with every purchase, so
1279
+ * the contract takes a maximum total cost and reverts if the price moved past
1280
+ * it before the transaction landed.
1281
+ *
1282
+ * Pass `maxCost` to set that bound exactly, or `slippageBps` to derive it
1283
+ * from a fresh quote (default 100 = 1% above the quoted total).
1284
+ */
1285
+ async buyTokens(auctionId, amount, options = {}) {
789
1286
  if (!this.walletClient) throw new Error("Wallet client required");
1287
+ const maxCost = options.maxCost ?? applySlippage(
1288
+ (await this.getQuote(auctionId, amount)).totalCost,
1289
+ options.slippageBps ?? DEFAULT_SLIPPAGE_BPS
1290
+ );
790
1291
  const hash = await this.walletClient.writeContract({
791
1292
  chain: this.chain,
792
1293
  account: this.walletClient.account,
793
1294
  address: this.auctionAddress,
794
1295
  abi: tokenAuctionAbi,
795
1296
  functionName: "buyTokens",
796
- args: [auctionId, amount]
1297
+ args: [auctionId, amount, maxCost]
797
1298
  });
798
1299
  return hash;
799
1300
  }
800
1301
  /**
801
- * Withdraw a completed auction's raised payment tokens to its creator.
802
- * Only the auction's creator can call this, and only once.
1302
+ * Pay a completed auction's creator their share of the raise: everything
1303
+ * not reserved for Uniswap liquidity. Creator only, once, before or after
1304
+ * migration.
803
1305
  */
804
1306
  async withdrawProceeds(auctionId) {
805
1307
  if (!this.walletClient) throw new Error("Wallet client required");
@@ -813,6 +1315,53 @@ var AuctionFlowSDK = class {
813
1315
  });
814
1316
  return hash;
815
1317
  }
1318
+ /**
1319
+ * Move a completed auction's liquidity into a Uniswap v3 pool at the
1320
+ * auction's final price, lock it, and unlock the token for trading. Anyone
1321
+ * may call it.
1322
+ */
1323
+ async migrate(auctionId) {
1324
+ return this.write("migrate", [auctionId]);
1325
+ }
1326
+ /**
1327
+ * Collect the migrated pool's trading fees. The protocol takes its share and
1328
+ * the creator receives the rest. Anyone may call it.
1329
+ */
1330
+ async collectFees(auctionId) {
1331
+ return this.write("collectFees", [auctionId]);
1332
+ }
1333
+ /** The Uniswap pool and position for a migrated auction. */
1334
+ async getMigration(auctionId) {
1335
+ const [pool, positionId] = await Promise.all([
1336
+ this.publicClient.readContract({
1337
+ address: this.auctionAddress,
1338
+ abi: tokenAuctionAbi,
1339
+ functionName: "poolOf",
1340
+ args: [auctionId]
1341
+ }),
1342
+ this.publicClient.readContract({
1343
+ address: this.auctionAddress,
1344
+ abi: tokenAuctionAbi,
1345
+ functionName: "positionId",
1346
+ args: [auctionId]
1347
+ })
1348
+ ]);
1349
+ return {
1350
+ pool: pool === import_viem.zeroAddress ? null : pool,
1351
+ positionId: positionId === 0n ? null : positionId
1352
+ };
1353
+ }
1354
+ async write(functionName, args) {
1355
+ if (!this.walletClient) throw new Error("Wallet client required");
1356
+ return this.walletClient.writeContract({
1357
+ chain: this.chain,
1358
+ account: this.walletClient.account,
1359
+ address: this.auctionAddress,
1360
+ abi: tokenAuctionAbi,
1361
+ functionName,
1362
+ args
1363
+ });
1364
+ }
816
1365
  // Read: Has an auction's creator already withdrawn its proceeds?
817
1366
  async hasWithdrawnProceeds(auctionId) {
818
1367
  return this.publicClient.readContract({
@@ -835,18 +1384,22 @@ var AuctionFlowSDK = class {
835
1384
  // Read: Get buy quote (off-chain calculation)
836
1385
  async getQuote(auctionId, amount) {
837
1386
  const auction = await this.getAuction(auctionId);
838
- const quote = calculateBuyQuote(
1387
+ const fill = fillPurchase(
839
1388
  auction.totalSold,
840
1389
  amount,
841
1390
  auction.basePrice,
842
1391
  auction.slope,
843
- auction.protocolFeeBps
1392
+ auction.totalRaised,
1393
+ auction.maxRaise
844
1394
  );
1395
+ const fee = fill.cost * auction.protocolFeeBps / 10000n;
845
1396
  return {
846
- cost: quote.cost,
847
- fee: quote.fee,
848
- totalCost: quote.total,
849
- spotPriceAfter: quote.spotPriceAfter
1397
+ amount: fill.amount,
1398
+ cost: fill.cost,
1399
+ fee,
1400
+ totalCost: fill.cost + fee,
1401
+ spotPriceAfter: spotPrice(auction.totalSold + fill.amount, auction.basePrice, auction.slope),
1402
+ fillsAuction: fill.fillsAuction
850
1403
  };
851
1404
  }
852
1405
  // Read: Get spot price
@@ -872,7 +1425,9 @@ var AuctionFlowSDK = class {
872
1425
  state: raw.state,
873
1426
  totalRaised: raw.totalRaised,
874
1427
  totalSold: raw.totalSold,
875
- protocolFeeBps: raw.config.protocolFeeBps
1428
+ protocolFeeBps: raw.config.protocolFeeBps,
1429
+ liquidityBps: raw.config.liquidityBps,
1430
+ lpFeeShareBps: raw.config.lpFeeShareBps
876
1431
  };
877
1432
  }
878
1433
  };
@@ -891,9 +1446,15 @@ var AuctionState = /* @__PURE__ */ ((AuctionState2) => {
891
1446
  AuctionBuilder,
892
1447
  AuctionFlowSDK,
893
1448
  AuctionState,
1449
+ DEFAULT_LIQUIDITY_BPS,
1450
+ DEFAULT_SLIPPAGE_BPS,
1451
+ MIN_LIQUIDITY_BPS,
894
1452
  USDC_ADDRESSES,
1453
+ applySlippage,
895
1454
  calculateBuyCost,
896
1455
  calculateBuyQuote,
1456
+ fillPurchase,
1457
+ maxBuyable,
897
1458
  spotPrice
898
1459
  });
899
1460
  //# sourceMappingURL=index.js.map