@bordrless/shared 0.8.0 → 0.10.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/policy.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  * `programs/tests/vectors/launch-fees.json`, which the Rust tests render from the reference the
7
7
  * programs are held to, and requires exact equality.
8
8
  */
9
- import type { CompanionSplitBps, CompanionTemplate, GameKindName, GameRequest, GameRolloverReason, JackpotRequest, LaunchRules, LaunchRulesInput, LotteryRequest, Side, StreakRequest } from './api.ts';
9
+ import type { CompanionSplitBps, CompanionTemplate, GameKindName, GameRequest, GameRolloverReason, JackpotRequest, LaunchRules, LaunchRulesInput, LossCoverRequest, LossCoverTerms, LotteryRequest, PayeeRequest, PayoutTermsRequest, ScriptRequest, Side, SnowballRequest, SnowballTerms, StreakRequest } from './api.ts';
10
10
  import type { StudioGameSettings } from './studio.ts';
11
11
  export declare const BPS = 10000n;
12
12
  export declare const WAD: bigint;
@@ -24,6 +24,15 @@ export declare const CURVE_BPS = 7500n;
24
24
  export declare const LP_FEE_BPS = 30;
25
25
  /** Protocol fee of an ordinary DEX pool (anyone's pool), in basis points of the quote side: the flat model (§3.1). */
26
26
  export declare const PROTOCOL_FEE_BPS = 100;
27
+ /**
28
+ * The LP fee tiers the create-pool form offers for an ordinary pool (docs/dex.md decision 2): 0.25%
29
+ * (the default, for bridged pairs), 1% and 2% (memecoins). The program takes any value from 0 to 90%;
30
+ * three tiers keep the number of duplicate pools per pair down (§3.5).
31
+ */
32
+ export declare const POOL_FEE_TIERS_BPS: readonly [25, 100, 200];
33
+ export declare const POOL_FEE_TIER_DEFAULT_BPS = 25;
34
+ export type PoolFeeTierBps = (typeof POOL_FEE_TIERS_BPS)[number];
35
+ export declare const isPoolFeeTier: (bps: unknown) => bps is PoolFeeTierBps;
27
36
  /**
28
37
  * Bordrless's take on a launch pool (its curve and the same pool after graduation), the share
29
38
  * model of §3.1 (2026-10-07: "we earn 25% of their total fees, not 0.25%"): a quarter of what the
@@ -35,6 +44,8 @@ export declare const PROTOCOL_FEE_BPS = 100;
35
44
  export declare const LAUNCH_PROTOCOL_SHARE_BPS = 2500;
36
45
  /** The largest share the DEX config may set (`MAX_PROTOCOL_SHARE_BPS`): all of the cuts. */
37
46
  export declare const MAX_PROTOCOL_SHARE_BPS = 10000;
47
+ /** The largest flat protocol fee the DEX config may set (`bordrless_swap::constants::MAX_PROTOCOL_FEE_BPS`): 10% of the quote side. */
48
+ export declare const MAX_PROTOCOL_FEE_BPS = 1000;
38
49
  /** Largest creator fee a launch may choose. */
39
50
  export declare const MAX_CREATOR_FEE_BPS = 200;
40
51
  /** The creator fee choices offered on the launch form. */
@@ -286,27 +297,32 @@ export declare const COMPANION_MAX_VEST_DAYS = 365;
286
297
  /** The whole creator fee to the launcher: an ordinary launch, with no companion. */
287
298
  export declare const LAUNCHER_SPLIT: Readonly<CompanionSplitBps>;
288
299
  /**
289
- * The companion program's game limits (`constants.rs`; `GAME_LIMITS` in the SDK, the same numbers):
290
- * a round's length, the minimum pot, the prize's least share, a claim window's bounds, the most
291
- * attempts, and the half of a round the attempts may take. The launch form holds its choices to
292
- * them and the backend refuses anything outside them (`lotteryProblem`).
300
+ * The Jackpot's limits as the site offers them: the round's length (the programs take rounds from 5
301
+ * minutes since the five-minute rounds upgrade of 2026-10-12; the owner set the site's floor at 15
302
+ * minutes, which is also its default), the minimum pot, the prize's least share, a claim window's
303
+ * bounds (`MIN_CLAIM_WINDOW` in the companion, a minute), the most attempts, and the half of a round
304
+ * the attempts may take. The launch form holds its choices to them and the backend refuses anything
305
+ * outside them (`lotteryProblem`). `GAME_LIMITS` in the SDK is the programs' own.
293
306
  */
294
307
  export declare const LOTTERY_LIMITS: {
295
- readonly minRoundSecs: 3600;
308
+ readonly minRoundSecs: 900;
296
309
  readonly maxRoundSecs: number;
297
310
  readonly minMinPotLamports: 100000000n;
298
311
  readonly maxMinPotLamports: 1000000000000n;
299
312
  readonly minPrizeBps: 1000;
300
- readonly minClaimWindowSecs: 300;
313
+ readonly minClaimWindowSecs: 60;
301
314
  readonly maxClaimWindowSecs: 86400;
302
315
  readonly maxAttempts: 16;
303
316
  readonly claimsPerRound: 2;
317
+ /** A streak's epoch and its claim window keep the programs' older floors (`MIN_EPOCH_SECS`, `MIN_EPOCH_CLAIM_WINDOW`). */
318
+ readonly minEpochSecs: 3600;
319
+ readonly minEpochClaimWindowSecs: 300;
304
320
  /** The most a pot holds while its hook is not audited: 10 SOL, the rest of the pot's share bought back. */
305
321
  readonly potCapLamports: 10000000000n;
306
322
  /** Lamports the setup pays for the hook's state and registry and the game's account (mainnet rent, 2026-10-08). */
307
323
  readonly rentLamports: bigint;
308
324
  };
309
- /** The lottery the launch form starts with (docs/games.md, spec example 1): 6-hour rounds, 70% of the fee to the pot, 30% bought back, draws from 0.5 SOL paying the whole pot, 8 claim attempts of 10 minutes. */
325
+ /** The lottery the launch form starts with (the owner, 2026-10-12): 15-minute rounds, 70% of the fee to the pot, 30% bought back, draws from 0.5 SOL paying the whole pot, 3 claim attempts of 2 minutes (`lotteryClaimsFor`). */
310
326
  export declare const LOTTERY_DEFAULTS: Readonly<LotteryRequest>;
311
327
  /** The round lengths the form offers (seconds), each with its label. */
312
328
  export declare const LOTTERY_ROUND_CHOICES: readonly {
@@ -323,8 +339,10 @@ export declare const LOTTERY_PRIZE_CHOICES_BPS: readonly [10000, 5000, 2500];
323
339
  /** The pot's share moves in steps of 10%, like the Split control's. */
324
340
  export declare const LOTTERY_POT_STEP_BPS = 1000;
325
341
  /**
326
- * The claim windows and attempts the form fixes for a round length: 8 attempts of 10 minutes for a
327
- * round of 6 hours or more, 6 of 5 minutes for an hour (the attempts must fit in half a round).
342
+ * The claim windows and attempts the form fixes for a round length (the attempts must fit in half a
343
+ * round, `claimsPerRound`): 8 attempts of 10 minutes from 6 hours, 6 of 5 minutes from an hour, 3 of
344
+ * 2 minutes from 15 minutes, and 2 of a minute under that (the programs' 5-minute rounds, which the
345
+ * site does not offer).
328
346
  */
329
347
  export declare function lotteryClaimsFor(roundSecs: number): {
330
348
  claimWindowSecs: number;
@@ -342,11 +360,11 @@ export declare function lotteryRequestOf(raw: unknown): LotteryRequest | null;
342
360
  export declare function lotteryProblem(game: LotteryRequest, split: CompanionSplitBps, rules: LaunchRulesInput, creatorFeeBps: number): string | null;
343
361
  /** The copy rules of a lottery coin (docs/games.md): said on the launch form, the review step and the token page, never "provably fair", "guaranteed" or "audited". */
344
362
  export declare const LOTTERY_COPY: {
345
- readonly held: "The pot is held by the companion program and paid out by code. Randomness by ORAO VRF.";
346
- readonly odds: "Your odds = your tokens in the round. Sell before the payout and you forfeit.";
347
- readonly stop: "Bordrless can stop this game: its pot would be bought back and burned. Nobody is paid.";
348
- readonly cap: "Pot capped at 10 SOL until the game’s hook is audited.";
349
- readonly oracle: "Randomness by ORAO VRF: ORAO’s three signers produce it. They could withhold or bias a draw; Bordrless can’t.";
363
+ readonly held: "The pot is held by code, not by a person. Each round, one holder is picked at random and paid in SOL.";
364
+ readonly odds: "Your odds are your share of the tokens held through the round. Tokens you buy count from the next round, and selling during a round takes you out of it.";
365
+ readonly stop: "Bordrless can stop the game. If it does, the pot buys back and burns the token and no one is paid.";
366
+ readonly cap: "The pot holds at most 10 SOL for now. Anything above that buys back and burns the token.";
367
+ readonly oracle: "The random numbers come from ORAO, an outside service. Neither Bordrless nor the launcher can pick the winner.";
350
368
  };
351
369
  /** The jackpot's timer and the streak's minimum streak: the companion's bounds (`GAME_LIMITS` in the SDK). */
352
370
  export declare const GAME_KIND_LIMITS: {
@@ -383,20 +401,20 @@ export declare const GAME_KIND_NAMES: Readonly<Record<GameKindName, string>>;
383
401
  * stop this game"; never "provably fair", "guaranteed" or "audited".
384
402
  */
385
403
  export declare const JACKPOT_COPY: {
386
- readonly held: "The pot is held by the companion program and paid out by code. No randomness: the last buyer wins.";
387
- readonly rule: "The last buyer wins if they keep every token they bought: any sale or transfer forfeits.";
388
- readonly unfunded: "If the pot is below its minimum when a round is settled, the round pays nothing and the pot carries on.";
389
- readonly curve: "Buys count while the coin is on its curve: the jackpot ends at graduation (the round under way is still paid).";
390
- readonly cap: "Pot capped at 10 SOL until the game’s hook is audited.";
391
- readonly stop: "Bordrless can stop this game: its pot would be bought back and burned. Nobody is paid.";
404
+ readonly held: "The pot is held by code, not by a person. No luck involved: the last buyer wins.";
405
+ readonly rule: "The last buyer wins when the timer runs out, as long as they still hold what they bought. Selling or sending any of it forfeits.";
406
+ readonly unfunded: "If the pot is under its minimum when the timer runs out, no prize is paid and the pot keeps growing.";
407
+ readonly curve: "The game runs while the coin is on its curve and ends at graduation. A round under way is still paid.";
408
+ readonly cap: "The pot holds at most 10 SOL for now. Anything above that buys back and burns the token.";
409
+ readonly stop: "Bordrless can stop the game. If it does, the pot buys back and burns the token and no one is paid.";
392
410
  };
393
411
  export declare const STREAK_COPY: {
394
- readonly held: "The pot is held by the companion program and paid out by code. No randomness: holders share in proportion to what they held.";
395
- readonly rule: "Send anything, to anyone, and you lose this epoch’s and last epoch’s share. Claim before you sell.";
396
- readonly weight: "Your weight is what you held since the epoch began: tokens that arrive during an epoch count from the next.";
397
- readonly claims: "Shares are claimed during the next epoch; the keeper claims for everyone whose share covers the fee, the rest claim here. What is not claimed rolls over.";
398
- readonly cap: "Pot capped at 10 SOL until the game’s hook is audited.";
399
- readonly stop: "Bordrless can stop this game: its pot would be bought back and burned. Nobody is paid.";
412
+ readonly held: "The pot is held by code, not by a person. No luck involved: holders share it in proportion to what they held.";
413
+ readonly rule: "Hold through the epoch without sending anything. Any sale or transfer drops you out of this epoch and the last one.";
414
+ readonly weight: "Your share is based on what you held when the epoch began. Tokens you buy during an epoch count from the next one.";
415
+ readonly claims: "Shares are paid out during the next epoch. Most are paid automatically; small ones are claimed here. Unclaimed shares stay in the pot.";
416
+ readonly cap: "The pot holds at most 10 SOL for now. Anything above that buys back and burns the token.";
417
+ readonly stop: "Bordrless can stop the game. If it does, the pot buys back and burns the token and no one is paid.";
400
418
  };
401
419
  /** Why a round paid no prize, in a few words each (`GameRolloverReason`). */
402
420
  export declare const ROLLOVER_WORDS: Readonly<Record<GameRolloverReason, string>>;
@@ -422,6 +440,168 @@ export declare function companionRequestSplit(raw: unknown): CompanionSplitBps |
422
440
  * `CreatorLockUnsupported`, `HolderRewardsOff`), and a creator fee for it to run.
423
441
  */
424
442
  export declare function companionSplitProblem(split: CompanionSplitBps, rules: Pick<LaunchRulesInput, 'holderFeeBuyBps' | 'holderFeeSellBps' | 'creatorLockDays'>, creatorFeeBps: number): string | null;
443
+ /** The presets the launch form offers. Every one spends the pot on volume and trades even when the price is flat; they differ in how fast and how big. */
444
+ export type SnowballPreset = 'conservative' | 'normal' | 'aggressive';
445
+ export declare const SNOWBALL_PRESETS: Readonly<Record<SnowballPreset, Readonly<SnowballTerms>>>;
446
+ export declare const SNOWBALL_PRESET_LIST: readonly SnowballPreset[];
447
+ export declare const SNOWBALL_DEFAULT_PRESET: SnowballPreset;
448
+ /** The custom controls' choices. The program takes anything within `SNOWBALL_BOUNDS`. */
449
+ export declare const SNOWBALL_STEP_CHOICES_BPS: readonly [50, 100, 200, 300, 500, 1000];
450
+ export declare const SNOWBALL_SIZE_CHOICES_BPS: readonly [1000, 2500, 5000, 7500, 10000];
451
+ export declare const SNOWBALL_POOL_CHOICES_BPS: readonly [100, 200, 500, 1000];
452
+ export declare const SNOWBALL_INTERVAL_CHOICES_SECS: readonly [10, 30, 60, 300];
453
+ /** The program's bounds (`create_snowball`). */
454
+ export declare const SNOWBALL_BOUNDS: {
455
+ readonly minStepBps: 50;
456
+ readonly maxStepBps: 2000;
457
+ readonly minSizeBps: 100;
458
+ readonly maxSizeBps: 10000;
459
+ readonly minPoolBps: 25;
460
+ readonly maxPoolBps: 1000;
461
+ readonly minInterval: 10;
462
+ readonly maxInterval: 86400;
463
+ };
464
+ /** The Snowball a launch request's `companion` names; null without one; `'malformed'` when it is there and not whole numbers and a flag. */
465
+ export declare function snowballRequestOf(companion: unknown): SnowballRequest | null | 'malformed';
466
+ /**
467
+ * Why a Snowball with this split can't run these rules at this fee, in the words the launch form and
468
+ * the backend use (`companion_rules`); null when it can: the market maker's part with the split adds up
469
+ * to 10,000, its terms are within the program's bounds, and what any companion needs
470
+ * (`companionSplitProblem`'s rules).
471
+ */
472
+ export declare function snowballProblem(s: SnowballRequest, split: CompanionSplitBps, rules: Pick<LaunchRulesInput, 'holderFeeBuyBps' | 'holderFeeSellBps' | 'creatorLockDays'>, creatorFeeBps: number): string | null;
473
+ /** The companion program's script bounds (`create_script`): steps 10 seconds to a day apart, at most 512 bytes of init data, at most 10,240 bytes of state. */
474
+ export declare const SCRIPT_BOUNDS: {
475
+ readonly minInterval: 10;
476
+ readonly maxInterval: 86400;
477
+ readonly maxInitLen: 512;
478
+ readonly maxStateLen: 10240;
479
+ };
480
+ /** The interval choices the launch form offers (seconds): a minute, five, fifteen, an hour, a day. */
481
+ export declare const SCRIPT_INTERVAL_CHOICES_SECS: readonly [60, 300, 900, 3600, 86400];
482
+ /**
483
+ * How many bytes a script's init data holds, as the request writes it: hex (an even number of hex
484
+ * digits, `0x` or not) or base64; the empty string is no data. Null when it is neither. Hex is tried
485
+ * first: a text that reads as both (`abcd`) is read as hex.
486
+ */
487
+ export declare function scriptInitDataLength(raw: string): number | null;
488
+ /** The custom companion's script a launch request's `companion` names; null without one; `'malformed'` when it is there and not the fields `ScriptRequest` takes. */
489
+ export declare function scriptRequestOf(companion: unknown): ScriptRequest | null | 'malformed';
490
+ /** The companion program's bounds on payout terms (`PayoutTermsArgs::valid`): each share 1 to 10,000 basis points, the window 10 seconds to a day. */
491
+ export declare const PAYOUT_TERMS_BOUNDS: {
492
+ readonly minWindowSecs: 10;
493
+ readonly maxWindowSecs: 86400;
494
+ };
495
+ /** Whether payout terms are within the companion program's bounds (`create_script_v2` refuses them otherwise, `BadPayoutTerms`). */
496
+ export declare function payoutTermsWithin(t: PayoutTermsRequest): boolean;
497
+ /**
498
+ * Why a custom companion with this split can't run these rules at this fee, in the words the launch
499
+ * form and the backend use (`companion_rules`); null when it can: the pot's part with the split adds
500
+ * up to 10,000, the interval, the init data and the state are within the program's bounds, and what
501
+ * any companion needs (`companionSplitProblem`'s rules). Whether the script is approved is the
502
+ * backend's to check (`script_not_approved`).
503
+ */
504
+ export declare function scriptProblem(s: ScriptRequest, split: CompanionSplitBps, rules: Pick<LaunchRulesInput, 'holderFeeBuyBps' | 'holderFeeSellBps' | 'creatorLockDays'>, creatorFeeBps: number): string | null;
505
+ /** The most wallets that share a launcher's part (`set_payees`; the SDK's `MAX_PAYEES`). */
506
+ export declare const MAX_PAYEES = 10;
507
+ /** The payees a launch request's `companion` names (`companion.payees`); null without any (absent, null or empty); `'malformed'` when they are there and not a list of `{ wallet, bps }` with an address and a whole number. */
508
+ export declare function payeesRequestOf(companion: unknown): PayeeRequest[] | null | 'malformed';
509
+ /** What the payees leave the launcher of their part, basis points of it (10,000 with none). */
510
+ export declare const payeesLeaveBps: (payees: readonly Pick<PayeeRequest, "bps">[]) => number;
511
+ /**
512
+ * Why `set_payees` would refuse these payees (`BadPayees`), in the words the launch form and the
513
+ * backend use (`companion_rules`); null when it would take them: 1 to 10 wallets, each named once,
514
+ * each 0.01% to 100% of the launcher's part and 100% in all at most; none the default key, the
515
+ * launcher (`beneficiary`) or one of `reserved` (the companion and its creator address, which the
516
+ * backend derives for the mint). A split with no part for the launcher has nothing to share.
517
+ */
518
+ export declare function payeesProblem(payees: readonly PayeeRequest[], split: Pick<CompanionSplitBps, 'beneficiaryBps'>, beneficiary: string, reserved?: readonly string[]): string | null;
519
+ /**
520
+ * Why a request's `allowWalletPayouts` can't be taken (`companion_rules`); null when it can, or it
521
+ * is off: only a custom hook's script with payout terms (`script.payout`, `create_script_v2`) may
522
+ * pay wallets, never Lossback's (its script pays holders under water, and nothing else).
523
+ */
524
+ export declare function walletPayoutsProblem(allow: boolean, script: Pick<ScriptRequest, 'payout'> | null): string | null;
525
+ /**
526
+ * The bounds a Lossback coin's terms keep within, as the site offers them: the programs' own
527
+ * (`loss_cover_script::CoverTerms::valid`, the companion's `PayoutTermsArgs::valid`) and the
528
+ * policy's tighter ones (the step at least 10 s and at most a quarter of the round, a holding of
529
+ * at most 1% of the supply, a loss of at least 0.0001 SOL, a wait of at most a day). The keeper's
530
+ * batches (`batchPaying`, `batchMeasuring`) are what one step carries within the runtime's
531
+ * instruction trace, measured by the programs' `loss_cover_vectors` (a measuring step carries one
532
+ * fewer on a coin's first step, when the creator's holding is made on the way).
533
+ */
534
+ export declare const LOSS_COVER_LIMITS: {
535
+ readonly minRoundSecs: 60;
536
+ readonly maxRoundSecs: 86400;
537
+ readonly minStepSecs: 10;
538
+ readonly maxStepSecs: 3600;
539
+ /** The step is at most this part of the round: a round has at least four steps. */
540
+ readonly stepsPerRoundMin: 4;
541
+ readonly minBps: 100;
542
+ readonly maxBps: 10000;
543
+ readonly minCoverBps: 1000;
544
+ readonly maxCoverBps: 10000;
545
+ /** The least holding that counts, at most this part of the supply (basis points). */
546
+ readonly maxMinHoldingBps: 100;
547
+ readonly minMinLossLamports: 100000n;
548
+ readonly maxMinAgeSecs: 86400;
549
+ readonly maxMinPotLamports: 100000000000n;
550
+ readonly batchPaying: 7;
551
+ readonly batchMeasuring: 13;
552
+ };
553
+ /**
554
+ * The terms the site launches a Lossback coin with: rounds of 5 minutes stepped every 15 seconds,
555
+ * the whole pot available to each step, each holding and each round, the whole loss covered when
556
+ * the pot can, a holding of 100,000 tokens (6 decimals: base units) and a loss of 0.001 SOL at
557
+ * least, a minute after its last buy (the owner, 2026-10-12; the first coin, LIFEVEST, was made with
558
+ * half an hour, fixed in its script state), a round only once the pot holds 1 SOL, the hook's whole
559
+ * fee row to the pot (the launcher's row 0: `potBps` is 10,000 less the launcher's part). The
560
+ * launcher sets `roundSecs`, `minPotLamports`, `coverBps` and `minHolding` (`LossCoverRequest`);
561
+ * the rest is fixed here. There is no cooldown: a holding is measured or paid once a round.
562
+ */
563
+ /** A holding's wait in words: "45 seconds", "1 minute", "30 minutes". */
564
+ export declare function ageWords(secs: number): string;
565
+ export declare const LOSS_COVER_DEFAULTS: {
566
+ readonly potBps: 10000;
567
+ readonly roundSecs: 300;
568
+ readonly stepSecs: 15;
569
+ readonly roundBps: 10000;
570
+ readonly stepBps: 10000;
571
+ readonly holdingBps: 10000;
572
+ readonly coverBps: 10000;
573
+ readonly minHolding: "100000000000";
574
+ readonly minLossLamports: "1000000";
575
+ readonly minAgeSecs: 60;
576
+ readonly minPotLamports: "1000000000";
577
+ };
578
+ /** The round lengths the launch form offers (seconds): 5, 10, 30 and 60 minutes. */
579
+ export declare const LOSS_COVER_ROUND_CHOICES_SECS: readonly [300, 600, 1800, 3600];
580
+ /** The cover shares the launch form offers: the whole loss, half, a quarter. */
581
+ export declare const LOSS_COVER_COVER_CHOICES_BPS: readonly [10000, 5000, 2500];
582
+ /** The minimum pots the launch form offers, lamports: none, 0.5, 1, 5 SOL. */
583
+ export declare const LOSS_COVER_MIN_POT_CHOICES_LAMPORTS: readonly ["0", "500000000", "1000000000", "5000000000"];
584
+ /** The Lossback terms a launch request's `companion` names (`companion.lossCover`); null without them; `'malformed'` when they are there and not whole numbers and lamport strings. */
585
+ export declare function lossCoverRequestOf(companion: unknown): LossCoverRequest | null | 'malformed';
586
+ /** The full terms a request launches with: what it names, the rest from `LOSS_COVER_DEFAULTS`. */
587
+ export declare function lossCoverTermsOf(s: LossCoverRequest): LossCoverTerms;
588
+ /** The pot's part of every fee claim for a Lossback coin: what the launcher's part of the split leaves (the hook's whole fee row). */
589
+ export declare const lossCoverPotBps: (split: CompanionSplitBps) => number;
590
+ /**
591
+ * Why a Lossback coin with these terms can't launch with this split on these rules at this fee, in
592
+ * the words the launch form and the backend use (`companion_rules`); null when it can: a creator
593
+ * fee to fill the pot, no other token rules (it launches from Bordrless's Loss cover config, which
594
+ * has none, and runs its own hook in the kit's place), nothing bought back and no holders' part (the
595
+ * pot and the launcher only), a part for the pot, and the terms within `LOSS_COVER_LIMITS` (the
596
+ * programs refuse anything outside their own bounds at the setup's dry run). `supply` is the
597
+ * launch's, for the least holding's cap.
598
+ */
599
+ export declare function lossCoverProblem(s: LossCoverRequest, split: CompanionSplitBps, rules: LaunchRulesInput, creatorFeeBps: number, supply?: bigint): string | null;
600
+ /**
601
+ * The review step's sentence for a Lossback coin, in numbers: what it does, never that it protects
602
+ * anyone (docs/loss-cover.md §5).
603
+ */
604
+ export declare function lossCoverSentence(s: LossCoverRequest, decimals?: number): string;
425
605
  /** The template whose split this is, or null for any other split. */
426
606
  export declare function companionTemplateOf(split: CompanionSplitBps): CompanionTemplate | null;
427
607
  /** Kit module bits (§4.2). */