auctionflow-sdk 1.1.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.mjs CHANGED
@@ -5,6 +5,10 @@ import {
5
5
  zeroAddress
6
6
  } from "viem";
7
7
 
8
+ // src/constants/protocol.ts
9
+ var MIN_LIQUIDITY_BPS = 2e3;
10
+ var DEFAULT_LIQUIDITY_BPS = 5e3;
11
+
8
12
  // src/builders/auction-builder.ts
9
13
  var AuctionBuilder = class {
10
14
  config = {};
@@ -27,6 +31,16 @@ var AuctionBuilder = class {
27
31
  this.config.maxRaise = maxRaise;
28
32
  return this;
29
33
  }
34
+ /**
35
+ * Share of the raise, in basis points, seeded into a Uniswap pool when the
36
+ * auction migrates (5000 = 50%). The rest goes to the creator. Defaults to
37
+ * 50%; must be between 20% and 100%.
38
+ */
39
+ withLiquidity(liquidityBps) {
40
+ if (!Number.isInteger(liquidityBps)) throw new Error("liquidityBps must be an integer");
41
+ this.config.liquidityBps = BigInt(liquidityBps);
42
+ return this;
43
+ }
30
44
  withSchedule(startTime, endTime) {
31
45
  this.config.startTime = startTime;
32
46
  this.config.endTime = endTime;
@@ -49,11 +63,15 @@ var AuctionBuilder = class {
49
63
  throw new Error(`Missing required field: ${key}`);
50
64
  }
51
65
  }
52
- const config = this.config;
66
+ const config = { liquidityBps: BigInt(DEFAULT_LIQUIDITY_BPS), ...this.config };
53
67
  if (config.maxSupply <= 0n) throw new Error("maxSupply must be greater than 0");
54
68
  if (config.basePrice <= 0n) throw new Error("basePrice must be greater than 0");
55
69
  if (config.slope < 0n) throw new Error("slope must not be negative");
56
70
  if (config.maxRaise <= 0n) throw new Error("maxRaise must be greater than 0");
71
+ const liquidityBps = config.liquidityBps;
72
+ if (liquidityBps < BigInt(MIN_LIQUIDITY_BPS) || liquidityBps > 10000n) {
73
+ throw new Error(`liquidityBps must be between ${MIN_LIQUIDITY_BPS} and 10000`);
74
+ }
57
75
  if (config.startTime >= config.endTime) {
58
76
  throw new Error("startTime must be before endTime");
59
77
  }
@@ -63,7 +81,7 @@ var AuctionBuilder = class {
63
81
 
64
82
  // src/constants/addresses.ts
65
83
  var AUCTION_ADDRESSES = {
66
- 84532: "0xadc3e02e962eed3856d7bee0315f84d187be1fea",
84
+ 84532: "0x722f4521b96aca1df7c65a1dbe3b1713803ccea9",
67
85
  8453: "0x0000000000000000000000000000000000000000"
68
86
  // not yet deployed
69
87
  };
@@ -86,10 +104,67 @@ var tokenAuctionAbi = [
86
104
  "name": "defaultFeeBps_",
87
105
  "type": "uint256",
88
106
  "internalType": "uint256"
107
+ },
108
+ {
109
+ "name": "positionManager_",
110
+ "type": "address",
111
+ "internalType": "contract INonfungiblePositionManager"
89
112
  }
90
113
  ],
91
114
  "stateMutability": "nonpayable"
92
115
  },
116
+ {
117
+ "type": "function",
118
+ "name": "MAX_FEE_BPS",
119
+ "inputs": [],
120
+ "outputs": [
121
+ {
122
+ "name": "",
123
+ "type": "uint256",
124
+ "internalType": "uint256"
125
+ }
126
+ ],
127
+ "stateMutability": "view"
128
+ },
129
+ {
130
+ "type": "function",
131
+ "name": "MAX_LP_FEE_SHARE_BPS",
132
+ "inputs": [],
133
+ "outputs": [
134
+ {
135
+ "name": "",
136
+ "type": "uint256",
137
+ "internalType": "uint256"
138
+ }
139
+ ],
140
+ "stateMutability": "view"
141
+ },
142
+ {
143
+ "type": "function",
144
+ "name": "MIN_LIQUIDITY_BPS",
145
+ "inputs": [],
146
+ "outputs": [
147
+ {
148
+ "name": "",
149
+ "type": "uint256",
150
+ "internalType": "uint256"
151
+ }
152
+ ],
153
+ "stateMutability": "view"
154
+ },
155
+ {
156
+ "type": "function",
157
+ "name": "POOL_FEE",
158
+ "inputs": [],
159
+ "outputs": [
160
+ {
161
+ "name": "",
162
+ "type": "uint24",
163
+ "internalType": "uint24"
164
+ }
165
+ ],
166
+ "stateMutability": "view"
167
+ },
93
168
  {
94
169
  "type": "function",
95
170
  "name": "auctionCount",
@@ -163,6 +238,16 @@ var tokenAuctionAbi = [
163
238
  "name": "protocolFeeBps",
164
239
  "type": "uint256",
165
240
  "internalType": "uint256"
241
+ },
242
+ {
243
+ "name": "liquidityBps",
244
+ "type": "uint256",
245
+ "internalType": "uint256"
246
+ },
247
+ {
248
+ "name": "lpFeeShareBps",
249
+ "type": "uint256",
250
+ "internalType": "uint256"
166
251
  }
167
252
  ]
168
253
  },
@@ -197,11 +282,40 @@ var tokenAuctionAbi = [
197
282
  "name": "amount",
198
283
  "type": "uint256",
199
284
  "internalType": "uint256"
285
+ },
286
+ {
287
+ "name": "maxCost",
288
+ "type": "uint256",
289
+ "internalType": "uint256"
200
290
  }
201
291
  ],
202
292
  "outputs": [],
203
293
  "stateMutability": "nonpayable"
204
294
  },
295
+ {
296
+ "type": "function",
297
+ "name": "collectFees",
298
+ "inputs": [
299
+ {
300
+ "name": "auctionId",
301
+ "type": "uint256",
302
+ "internalType": "uint256"
303
+ }
304
+ ],
305
+ "outputs": [
306
+ {
307
+ "name": "tokenFees",
308
+ "type": "uint256",
309
+ "internalType": "uint256"
310
+ },
311
+ {
312
+ "name": "paymentFees",
313
+ "type": "uint256",
314
+ "internalType": "uint256"
315
+ }
316
+ ],
317
+ "stateMutability": "nonpayable"
318
+ },
205
319
  {
206
320
  "type": "function",
207
321
  "name": "completeAuction",
@@ -220,63 +334,107 @@ var tokenAuctionAbi = [
220
334
  "name": "createAuction",
221
335
  "inputs": [
222
336
  {
223
- "name": "name",
224
- "type": "string",
225
- "internalType": "string"
226
- },
227
- {
228
- "name": "symbol",
229
- "type": "string",
230
- "internalType": "string"
231
- },
337
+ "name": "p",
338
+ "type": "tuple",
339
+ "internalType": "struct TokenAuction.AuctionParams",
340
+ "components": [
341
+ {
342
+ "name": "name",
343
+ "type": "string",
344
+ "internalType": "string"
345
+ },
346
+ {
347
+ "name": "symbol",
348
+ "type": "string",
349
+ "internalType": "string"
350
+ },
351
+ {
352
+ "name": "maxSupply",
353
+ "type": "uint256",
354
+ "internalType": "uint256"
355
+ },
356
+ {
357
+ "name": "paymentToken",
358
+ "type": "address",
359
+ "internalType": "address"
360
+ },
361
+ {
362
+ "name": "basePrice",
363
+ "type": "uint256",
364
+ "internalType": "uint256"
365
+ },
366
+ {
367
+ "name": "slope",
368
+ "type": "uint256",
369
+ "internalType": "uint256"
370
+ },
371
+ {
372
+ "name": "maxRaise",
373
+ "type": "uint256",
374
+ "internalType": "uint256"
375
+ },
376
+ {
377
+ "name": "startTime",
378
+ "type": "uint256",
379
+ "internalType": "uint256"
380
+ },
381
+ {
382
+ "name": "endTime",
383
+ "type": "uint256",
384
+ "internalType": "uint256"
385
+ },
386
+ {
387
+ "name": "liquidityBps",
388
+ "type": "uint256",
389
+ "internalType": "uint256"
390
+ }
391
+ ]
392
+ }
393
+ ],
394
+ "outputs": [
232
395
  {
233
- "name": "maxSupply",
396
+ "name": "auctionId",
234
397
  "type": "uint256",
235
398
  "internalType": "uint256"
236
- },
399
+ }
400
+ ],
401
+ "stateMutability": "nonpayable"
402
+ },
403
+ {
404
+ "type": "function",
405
+ "name": "custodied",
406
+ "inputs": [
237
407
  {
238
- "name": "paymentToken",
408
+ "name": "",
239
409
  "type": "address",
240
410
  "internalType": "address"
241
- },
242
- {
243
- "name": "basePrice",
244
- "type": "uint256",
245
- "internalType": "uint256"
246
- },
247
- {
248
- "name": "slope",
249
- "type": "uint256",
250
- "internalType": "uint256"
251
- },
252
- {
253
- "name": "maxRaise",
254
- "type": "uint256",
255
- "internalType": "uint256"
256
- },
257
- {
258
- "name": "startTime",
259
- "type": "uint256",
260
- "internalType": "uint256"
261
- },
411
+ }
412
+ ],
413
+ "outputs": [
262
414
  {
263
- "name": "endTime",
415
+ "name": "",
264
416
  "type": "uint256",
265
417
  "internalType": "uint256"
266
418
  }
267
419
  ],
420
+ "stateMutability": "view"
421
+ },
422
+ {
423
+ "type": "function",
424
+ "name": "defaultFeeBps",
425
+ "inputs": [],
268
426
  "outputs": [
269
427
  {
270
- "name": "auctionId",
428
+ "name": "",
271
429
  "type": "uint256",
272
430
  "internalType": "uint256"
273
431
  }
274
432
  ],
275
- "stateMutability": "nonpayable"
433
+ "stateMutability": "view"
276
434
  },
277
435
  {
278
436
  "type": "function",
279
- "name": "defaultFeeBps",
437
+ "name": "defaultLpFeeShareBps",
280
438
  "inputs": [],
281
439
  "outputs": [
282
440
  {
@@ -335,6 +493,19 @@ var tokenAuctionAbi = [
335
493
  ],
336
494
  "stateMutability": "view"
337
495
  },
496
+ {
497
+ "type": "function",
498
+ "name": "migrate",
499
+ "inputs": [
500
+ {
501
+ "name": "auctionId",
502
+ "type": "uint256",
503
+ "internalType": "uint256"
504
+ }
505
+ ],
506
+ "outputs": [],
507
+ "stateMutability": "nonpayable"
508
+ },
338
509
  {
339
510
  "type": "function",
340
511
  "name": "owner",
@@ -348,6 +519,57 @@ var tokenAuctionAbi = [
348
519
  ],
349
520
  "stateMutability": "view"
350
521
  },
522
+ {
523
+ "type": "function",
524
+ "name": "poolOf",
525
+ "inputs": [
526
+ {
527
+ "name": "",
528
+ "type": "uint256",
529
+ "internalType": "uint256"
530
+ }
531
+ ],
532
+ "outputs": [
533
+ {
534
+ "name": "",
535
+ "type": "address",
536
+ "internalType": "address"
537
+ }
538
+ ],
539
+ "stateMutability": "view"
540
+ },
541
+ {
542
+ "type": "function",
543
+ "name": "positionId",
544
+ "inputs": [
545
+ {
546
+ "name": "",
547
+ "type": "uint256",
548
+ "internalType": "uint256"
549
+ }
550
+ ],
551
+ "outputs": [
552
+ {
553
+ "name": "",
554
+ "type": "uint256",
555
+ "internalType": "uint256"
556
+ }
557
+ ],
558
+ "stateMutability": "view"
559
+ },
560
+ {
561
+ "type": "function",
562
+ "name": "positionManager",
563
+ "inputs": [],
564
+ "outputs": [
565
+ {
566
+ "name": "",
567
+ "type": "address",
568
+ "internalType": "contract INonfungiblePositionManager"
569
+ }
570
+ ],
571
+ "stateMutability": "view"
572
+ },
351
573
  {
352
574
  "type": "function",
353
575
  "name": "proceedsWithdrawn",
@@ -387,6 +609,63 @@ var tokenAuctionAbi = [
387
609
  "outputs": [],
388
610
  "stateMutability": "nonpayable"
389
611
  },
612
+ {
613
+ "type": "function",
614
+ "name": "setDefaultFeeBps",
615
+ "inputs": [
616
+ {
617
+ "name": "feeBps",
618
+ "type": "uint256",
619
+ "internalType": "uint256"
620
+ }
621
+ ],
622
+ "outputs": [],
623
+ "stateMutability": "nonpayable"
624
+ },
625
+ {
626
+ "type": "function",
627
+ "name": "setDefaultLpFeeShareBps",
628
+ "inputs": [
629
+ {
630
+ "name": "shareBps",
631
+ "type": "uint256",
632
+ "internalType": "uint256"
633
+ }
634
+ ],
635
+ "outputs": [],
636
+ "stateMutability": "nonpayable"
637
+ },
638
+ {
639
+ "type": "function",
640
+ "name": "setProtocolFeeRecipient",
641
+ "inputs": [
642
+ {
643
+ "name": "recipient",
644
+ "type": "address",
645
+ "internalType": "address"
646
+ }
647
+ ],
648
+ "outputs": [],
649
+ "stateMutability": "nonpayable"
650
+ },
651
+ {
652
+ "type": "function",
653
+ "name": "sweep",
654
+ "inputs": [
655
+ {
656
+ "name": "token",
657
+ "type": "address",
658
+ "internalType": "contract IERC20"
659
+ },
660
+ {
661
+ "name": "to",
662
+ "type": "address",
663
+ "internalType": "address"
664
+ }
665
+ ],
666
+ "outputs": [],
667
+ "stateMutability": "nonpayable"
668
+ },
390
669
  {
391
670
  "type": "function",
392
671
  "name": "transferOwnership",
@@ -400,6 +679,29 @@ var tokenAuctionAbi = [
400
679
  "outputs": [],
401
680
  "stateMutability": "nonpayable"
402
681
  },
682
+ {
683
+ "type": "function",
684
+ "name": "uniswapV3SwapCallback",
685
+ "inputs": [
686
+ {
687
+ "name": "amount0Delta",
688
+ "type": "int256",
689
+ "internalType": "int256"
690
+ },
691
+ {
692
+ "name": "amount1Delta",
693
+ "type": "int256",
694
+ "internalType": "int256"
695
+ },
696
+ {
697
+ "name": "data",
698
+ "type": "bytes",
699
+ "internalType": "bytes"
700
+ }
701
+ ],
702
+ "outputs": [],
703
+ "stateMutability": "nonpayable"
704
+ },
403
705
  {
404
706
  "type": "function",
405
707
  "name": "userPurchases",
@@ -519,6 +821,12 @@ var tokenAuctionAbi = [
519
821
  "type": "uint256",
520
822
  "indexed": false,
521
823
  "internalType": "uint256"
824
+ },
825
+ {
826
+ "name": "liquidityBps",
827
+ "type": "uint256",
828
+ "indexed": false,
829
+ "internalType": "uint256"
522
830
  }
523
831
  ],
524
832
  "anonymous": false
@@ -534,10 +842,103 @@ var tokenAuctionAbi = [
534
842
  "internalType": "uint256"
535
843
  },
536
844
  {
537
- "name": "liquidityPool",
845
+ "name": "pool",
538
846
  "type": "address",
539
847
  "indexed": false,
540
848
  "internalType": "address"
849
+ },
850
+ {
851
+ "name": "positionId",
852
+ "type": "uint256",
853
+ "indexed": false,
854
+ "internalType": "uint256"
855
+ },
856
+ {
857
+ "name": "tokenLiquidity",
858
+ "type": "uint256",
859
+ "indexed": false,
860
+ "internalType": "uint256"
861
+ },
862
+ {
863
+ "name": "paymentLiquidity",
864
+ "type": "uint256",
865
+ "indexed": false,
866
+ "internalType": "uint256"
867
+ }
868
+ ],
869
+ "anonymous": false
870
+ },
871
+ {
872
+ "type": "event",
873
+ "name": "DefaultFeeBpsUpdated",
874
+ "inputs": [
875
+ {
876
+ "name": "previous",
877
+ "type": "uint256",
878
+ "indexed": false,
879
+ "internalType": "uint256"
880
+ },
881
+ {
882
+ "name": "current",
883
+ "type": "uint256",
884
+ "indexed": false,
885
+ "internalType": "uint256"
886
+ }
887
+ ],
888
+ "anonymous": false
889
+ },
890
+ {
891
+ "type": "event",
892
+ "name": "DefaultLpFeeShareBpsUpdated",
893
+ "inputs": [
894
+ {
895
+ "name": "previous",
896
+ "type": "uint256",
897
+ "indexed": false,
898
+ "internalType": "uint256"
899
+ },
900
+ {
901
+ "name": "current",
902
+ "type": "uint256",
903
+ "indexed": false,
904
+ "internalType": "uint256"
905
+ }
906
+ ],
907
+ "anonymous": false
908
+ },
909
+ {
910
+ "type": "event",
911
+ "name": "LpFeesCollected",
912
+ "inputs": [
913
+ {
914
+ "name": "auctionId",
915
+ "type": "uint256",
916
+ "indexed": true,
917
+ "internalType": "uint256"
918
+ },
919
+ {
920
+ "name": "creatorTokenFees",
921
+ "type": "uint256",
922
+ "indexed": false,
923
+ "internalType": "uint256"
924
+ },
925
+ {
926
+ "name": "creatorPaymentFees",
927
+ "type": "uint256",
928
+ "indexed": false,
929
+ "internalType": "uint256"
930
+ },
931
+ {
932
+ "name": "protocolTokenFees",
933
+ "type": "uint256",
934
+ "indexed": false,
935
+ "internalType": "uint256"
936
+ },
937
+ {
938
+ "name": "protocolPaymentFees",
939
+ "type": "uint256",
940
+ "indexed": false,
941
+ "internalType": "uint256"
541
942
  }
542
943
  ],
543
944
  "anonymous": false
@@ -586,6 +987,50 @@ var tokenAuctionAbi = [
586
987
  ],
587
988
  "anonymous": false
588
989
  },
990
+ {
991
+ "type": "event",
992
+ "name": "ProtocolFeeRecipientUpdated",
993
+ "inputs": [
994
+ {
995
+ "name": "previous",
996
+ "type": "address",
997
+ "indexed": true,
998
+ "internalType": "address"
999
+ },
1000
+ {
1001
+ "name": "current",
1002
+ "type": "address",
1003
+ "indexed": true,
1004
+ "internalType": "address"
1005
+ }
1006
+ ],
1007
+ "anonymous": false
1008
+ },
1009
+ {
1010
+ "type": "event",
1011
+ "name": "Swept",
1012
+ "inputs": [
1013
+ {
1014
+ "name": "token",
1015
+ "type": "address",
1016
+ "indexed": true,
1017
+ "internalType": "address"
1018
+ },
1019
+ {
1020
+ "name": "to",
1021
+ "type": "address",
1022
+ "indexed": true,
1023
+ "internalType": "address"
1024
+ },
1025
+ {
1026
+ "name": "amount",
1027
+ "type": "uint256",
1028
+ "indexed": false,
1029
+ "internalType": "uint256"
1030
+ }
1031
+ ],
1032
+ "anonymous": false
1033
+ },
589
1034
  {
590
1035
  "type": "event",
591
1036
  "name": "TokensPurchased",
@@ -676,13 +1121,18 @@ var tokenAuctionAbi = [
676
1121
  ];
677
1122
 
678
1123
  // src/utils/bonding-curve.ts
1124
+ var TOKEN_SCALE = 10n ** 18n;
1125
+ var ceilDiv = (a, b) => (a + b - 1n) / b;
679
1126
  function calculateBuyCost(currentSupply, amount, basePrice, slope) {
680
- const linearCost = basePrice * amount;
681
- const curveCost = slope * amount * (2n * currentSupply + amount) / 2n;
1127
+ const linearCost = ceilDiv(basePrice * amount, TOKEN_SCALE);
1128
+ const curveCost = ceilDiv(
1129
+ slope * amount * (2n * currentSupply + amount),
1130
+ 2n * TOKEN_SCALE * TOKEN_SCALE
1131
+ );
682
1132
  return linearCost + curveCost;
683
1133
  }
684
1134
  function spotPrice(currentSupply, basePrice, slope) {
685
- return basePrice + slope * currentSupply;
1135
+ return basePrice + slope * currentSupply / TOKEN_SCALE;
686
1136
  }
687
1137
  function calculateBuyQuote(currentSupply, amount, basePrice, slope, feeBps) {
688
1138
  const cost = calculateBuyCost(currentSupply, amount, basePrice, slope);
@@ -694,6 +1144,37 @@ function calculateBuyQuote(currentSupply, amount, basePrice, slope, feeBps) {
694
1144
  spotPriceAfter: spotPrice(currentSupply + amount, basePrice, slope)
695
1145
  };
696
1146
  }
1147
+ var DEFAULT_SLIPPAGE_BPS = 100;
1148
+ function applySlippage(total, slippageBps) {
1149
+ if (!Number.isInteger(slippageBps) || slippageBps < 0 || slippageBps > 1e4) {
1150
+ throw new Error("slippageBps must be an integer between 0 and 10000");
1151
+ }
1152
+ return (total * BigInt(1e4 + slippageBps) + 9999n) / 10000n;
1153
+ }
1154
+ function maxBuyable(currentSupply, budget, basePrice, slope, upperBound) {
1155
+ let hi = budget * TOKEN_SCALE / basePrice + 1n;
1156
+ if (hi > upperBound) hi = upperBound;
1157
+ let lo = 0n;
1158
+ while (lo < hi) {
1159
+ const mid = (lo + hi + 1n) / 2n;
1160
+ if (calculateBuyCost(currentSupply, mid, basePrice, slope) <= budget) lo = mid;
1161
+ else hi = mid - 1n;
1162
+ }
1163
+ return lo;
1164
+ }
1165
+ function fillPurchase(currentSupply, requested, basePrice, slope, totalRaised, maxRaise) {
1166
+ const remaining = maxRaise - totalRaised;
1167
+ const cost = calculateBuyCost(currentSupply, requested, basePrice, slope);
1168
+ if (cost < remaining) return { amount: requested, cost, fillsAuction: false };
1169
+ if (cost === remaining) return { amount: requested, cost, fillsAuction: true };
1170
+ const amount = maxBuyable(currentSupply, remaining, basePrice, slope, requested);
1171
+ if (amount === 0n) throw new Error("Auction is sold out");
1172
+ return {
1173
+ amount,
1174
+ cost: calculateBuyCost(currentSupply, amount, basePrice, slope),
1175
+ fillsAuction: true
1176
+ };
1177
+ }
697
1178
 
698
1179
  // src/utils/chains.ts
699
1180
  import { base, baseSepolia } from "viem/chains";
@@ -742,34 +1223,50 @@ var AuctionFlowSDK = class {
742
1223
  abi: tokenAuctionAbi,
743
1224
  functionName: "createAuction",
744
1225
  args: [
745
- config.name,
746
- config.symbol,
747
- config.maxSupply,
748
- config.paymentToken,
749
- config.basePrice,
750
- config.slope,
751
- config.maxRaise,
752
- config.startTime,
753
- config.endTime
1226
+ {
1227
+ name: config.name,
1228
+ symbol: config.symbol,
1229
+ maxSupply: config.maxSupply,
1230
+ paymentToken: config.paymentToken,
1231
+ basePrice: config.basePrice,
1232
+ slope: config.slope,
1233
+ maxRaise: config.maxRaise,
1234
+ startTime: config.startTime,
1235
+ endTime: config.endTime,
1236
+ liquidityBps: config.liquidityBps ?? BigInt(DEFAULT_LIQUIDITY_BPS)
1237
+ }
754
1238
  ]
755
1239
  });
756
1240
  return hash;
757
1241
  }
758
- async buyTokens(auctionId, amount) {
1242
+ /**
1243
+ * Buy `amount` tokens (in token wei). The price rises with every purchase, so
1244
+ * the contract takes a maximum total cost and reverts if the price moved past
1245
+ * it before the transaction landed.
1246
+ *
1247
+ * Pass `maxCost` to set that bound exactly, or `slippageBps` to derive it
1248
+ * from a fresh quote (default 100 = 1% above the quoted total).
1249
+ */
1250
+ async buyTokens(auctionId, amount, options = {}) {
759
1251
  if (!this.walletClient) throw new Error("Wallet client required");
1252
+ const maxCost = options.maxCost ?? applySlippage(
1253
+ (await this.getQuote(auctionId, amount)).totalCost,
1254
+ options.slippageBps ?? DEFAULT_SLIPPAGE_BPS
1255
+ );
760
1256
  const hash = await this.walletClient.writeContract({
761
1257
  chain: this.chain,
762
1258
  account: this.walletClient.account,
763
1259
  address: this.auctionAddress,
764
1260
  abi: tokenAuctionAbi,
765
1261
  functionName: "buyTokens",
766
- args: [auctionId, amount]
1262
+ args: [auctionId, amount, maxCost]
767
1263
  });
768
1264
  return hash;
769
1265
  }
770
1266
  /**
771
- * Withdraw a completed auction's raised payment tokens to its creator.
772
- * Only the auction's creator can call this, and only once.
1267
+ * Pay a completed auction's creator their share of the raise: everything
1268
+ * not reserved for Uniswap liquidity. Creator only, once, before or after
1269
+ * migration.
773
1270
  */
774
1271
  async withdrawProceeds(auctionId) {
775
1272
  if (!this.walletClient) throw new Error("Wallet client required");
@@ -783,6 +1280,53 @@ var AuctionFlowSDK = class {
783
1280
  });
784
1281
  return hash;
785
1282
  }
1283
+ /**
1284
+ * Move a completed auction's liquidity into a Uniswap v3 pool at the
1285
+ * auction's final price, lock it, and unlock the token for trading. Anyone
1286
+ * may call it.
1287
+ */
1288
+ async migrate(auctionId) {
1289
+ return this.write("migrate", [auctionId]);
1290
+ }
1291
+ /**
1292
+ * Collect the migrated pool's trading fees. The protocol takes its share and
1293
+ * the creator receives the rest. Anyone may call it.
1294
+ */
1295
+ async collectFees(auctionId) {
1296
+ return this.write("collectFees", [auctionId]);
1297
+ }
1298
+ /** The Uniswap pool and position for a migrated auction. */
1299
+ async getMigration(auctionId) {
1300
+ const [pool, positionId] = await Promise.all([
1301
+ this.publicClient.readContract({
1302
+ address: this.auctionAddress,
1303
+ abi: tokenAuctionAbi,
1304
+ functionName: "poolOf",
1305
+ args: [auctionId]
1306
+ }),
1307
+ this.publicClient.readContract({
1308
+ address: this.auctionAddress,
1309
+ abi: tokenAuctionAbi,
1310
+ functionName: "positionId",
1311
+ args: [auctionId]
1312
+ })
1313
+ ]);
1314
+ return {
1315
+ pool: pool === zeroAddress ? null : pool,
1316
+ positionId: positionId === 0n ? null : positionId
1317
+ };
1318
+ }
1319
+ async write(functionName, args) {
1320
+ if (!this.walletClient) throw new Error("Wallet client required");
1321
+ return this.walletClient.writeContract({
1322
+ chain: this.chain,
1323
+ account: this.walletClient.account,
1324
+ address: this.auctionAddress,
1325
+ abi: tokenAuctionAbi,
1326
+ functionName,
1327
+ args
1328
+ });
1329
+ }
786
1330
  // Read: Has an auction's creator already withdrawn its proceeds?
787
1331
  async hasWithdrawnProceeds(auctionId) {
788
1332
  return this.publicClient.readContract({
@@ -805,18 +1349,22 @@ var AuctionFlowSDK = class {
805
1349
  // Read: Get buy quote (off-chain calculation)
806
1350
  async getQuote(auctionId, amount) {
807
1351
  const auction = await this.getAuction(auctionId);
808
- const quote = calculateBuyQuote(
1352
+ const fill = fillPurchase(
809
1353
  auction.totalSold,
810
1354
  amount,
811
1355
  auction.basePrice,
812
1356
  auction.slope,
813
- auction.protocolFeeBps
1357
+ auction.totalRaised,
1358
+ auction.maxRaise
814
1359
  );
1360
+ const fee = fill.cost * auction.protocolFeeBps / 10000n;
815
1361
  return {
816
- cost: quote.cost,
817
- fee: quote.fee,
818
- totalCost: quote.total,
819
- spotPriceAfter: quote.spotPriceAfter
1362
+ amount: fill.amount,
1363
+ cost: fill.cost,
1364
+ fee,
1365
+ totalCost: fill.cost + fee,
1366
+ spotPriceAfter: spotPrice(auction.totalSold + fill.amount, auction.basePrice, auction.slope),
1367
+ fillsAuction: fill.fillsAuction
820
1368
  };
821
1369
  }
822
1370
  // Read: Get spot price
@@ -842,7 +1390,9 @@ var AuctionFlowSDK = class {
842
1390
  state: raw.state,
843
1391
  totalRaised: raw.totalRaised,
844
1392
  totalSold: raw.totalSold,
845
- protocolFeeBps: raw.config.protocolFeeBps
1393
+ protocolFeeBps: raw.config.protocolFeeBps,
1394
+ liquidityBps: raw.config.liquidityBps,
1395
+ lpFeeShareBps: raw.config.lpFeeShareBps
846
1396
  };
847
1397
  }
848
1398
  };
@@ -860,9 +1410,15 @@ export {
860
1410
  AuctionBuilder,
861
1411
  AuctionFlowSDK,
862
1412
  AuctionState,
1413
+ DEFAULT_LIQUIDITY_BPS,
1414
+ DEFAULT_SLIPPAGE_BPS,
1415
+ MIN_LIQUIDITY_BPS,
863
1416
  USDC_ADDRESSES,
1417
+ applySlippage,
864
1418
  calculateBuyCost,
865
1419
  calculateBuyQuote,
1420
+ fillPurchase,
1421
+ maxBuyable,
866
1422
  spotPrice
867
1423
  };
868
1424
  //# sourceMappingURL=index.mjs.map