@bordrless/shared 0.4.0 → 0.5.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/api.d.ts +300 -1
- package/dist/programs.d.ts +25 -1
- package/dist/programs.js +33 -1
- package/package.json +1 -1
package/dist/api.d.ts
CHANGED
|
@@ -244,6 +244,8 @@ export interface LaunchSummary {
|
|
|
244
244
|
protocolModel: ProtocolModel;
|
|
245
245
|
/** Under the share model, Bordrless's share of the cuts in basis points (2,500 = a quarter); null under the flat model. */
|
|
246
246
|
protocolShareBps: number | null;
|
|
247
|
+
/** The pool's LP fee (the sniper fee included) goes to Bordrless in SOL: a launch pool created at or after the DEX upgrade of 2026-10-08 (`LP_FEE_TO_PROTOCOL_FROM_SLOT`). False on one created before it, whose LP fee stays in the pool. */
|
|
248
|
+
lpFeeToProtocol: boolean;
|
|
247
249
|
/** Total fee of a buy by the §7.3 formula, outside the sniper window. */
|
|
248
250
|
buyFeeBps: number;
|
|
249
251
|
/** Total fee of a sell by the §7.3 formula, outside the sniper window. */
|
|
@@ -447,7 +449,8 @@ export interface PreparedTx {
|
|
|
447
449
|
stage: number;
|
|
448
450
|
label: string;
|
|
449
451
|
/** Keys the browser holds that must also sign (a launch's fresh mint). */
|
|
450
|
-
|
|
452
|
+
/** Keys the browser holds that sign after the wallet: a launch's fresh mint, a new launch config. */
|
|
453
|
+
extraSigners: ('mint' | 'config')[];
|
|
451
454
|
}
|
|
452
455
|
export interface SwapPrepareResponse {
|
|
453
456
|
transactions: PreparedTx[];
|
|
@@ -496,7 +499,20 @@ export interface LaunchPrepareRequest {
|
|
|
496
499
|
* (what the site showed is what launches), and a custom hook's accounts are resolved for `mint`.
|
|
497
500
|
*/
|
|
498
501
|
config?: Address;
|
|
502
|
+
/**
|
|
503
|
+
* A companion (docs/companions.md): the launch's creator is a program, so its creator fees are
|
|
504
|
+
* bought back and burned, streamed to holders or paid to the launcher by code, with no keeper.
|
|
505
|
+
* The launcher is the beneficiary; a first buy is then the companion's, vesting to them over
|
|
506
|
+
* `vestDays`. Not with the creator wallet lock or a custom hook; the holders' templates need
|
|
507
|
+
* holder rewards.
|
|
508
|
+
*/
|
|
509
|
+
companion?: {
|
|
510
|
+
template: CompanionTemplate;
|
|
511
|
+
vestDays?: number;
|
|
512
|
+
};
|
|
499
513
|
}
|
|
514
|
+
/** The companion templates (`COMPANION_TEMPLATES` in the SDK). */
|
|
515
|
+
export type CompanionTemplate = 'buysItself' | 'rugProofDev' | 'buybackAndReward';
|
|
500
516
|
export interface LaunchPrepareResponse {
|
|
501
517
|
intentId: string;
|
|
502
518
|
mint: Address;
|
|
@@ -539,6 +555,24 @@ export interface RewardsPrepareRequest {
|
|
|
539
555
|
/** Unwrap the bridged SOL to SOL and close the temporary holding. */
|
|
540
556
|
unwrap: boolean;
|
|
541
557
|
}
|
|
558
|
+
/**
|
|
559
|
+
* Send `amount` of `mint` from the owner's holding to `to`'s (made on the way when missing, the
|
|
560
|
+
* sender paying its rent). Wallets cannot build this themselves: the token program's transfer takes
|
|
561
|
+
* the mint's hook accounts, which the backend resolves. A holding under the creator lock or the
|
|
562
|
+
* early-buyer lock is refused with the lock (code `locked`), as the program would refuse it.
|
|
563
|
+
*/
|
|
564
|
+
export interface TransferPrepareRequest {
|
|
565
|
+
owner: Address;
|
|
566
|
+
mint: Address;
|
|
567
|
+
to: Address;
|
|
568
|
+
/** Base units of the token. */
|
|
569
|
+
amount: Amount;
|
|
570
|
+
}
|
|
571
|
+
export interface TransferPrepareResponse {
|
|
572
|
+
transactions: PreparedTx[];
|
|
573
|
+
/** Lamports the sender pays for the recipient's holding; 0 when it already exists. */
|
|
574
|
+
rentLamports: Amount;
|
|
575
|
+
}
|
|
542
576
|
/** Claim the creator fees of launches the owner created: up to about 4 mints per transaction, paid as SOL. */
|
|
543
577
|
export interface CreatorPrepareRequest {
|
|
544
578
|
owner: Address;
|
|
@@ -600,6 +634,8 @@ export interface BridgePool {
|
|
|
600
634
|
lpFeeBps: number;
|
|
601
635
|
/** The flat protocol rate of the quote on this pool (ordinary pools; 0 under the share model). */
|
|
602
636
|
protocolFeeBps: number;
|
|
637
|
+
/** The LP fee goes to Bordrless in SOL (a launch pool since the upgrade of 2026-10-08, `LP_FEE_TO_PROTOCOL_FROM_SLOT`); false when it stays in the pool, as an ordinary pool's always does. */
|
|
638
|
+
lpFeeToProtocol: boolean;
|
|
603
639
|
baseReserve: Amount;
|
|
604
640
|
quoteReserve: Amount;
|
|
605
641
|
volume24hUsd: number | null;
|
|
@@ -639,6 +675,8 @@ export interface PoolSummary {
|
|
|
639
675
|
protocolModel?: ProtocolModel;
|
|
640
676
|
/** Under the share model, Bordrless's share of what the hooks cut, in basis points; null (or absent) under the flat model. */
|
|
641
677
|
protocolShareBps?: number | null;
|
|
678
|
+
/** The LP fee goes to Bordrless in SOL (a launch pool since the upgrade of 2026-10-08); false when it stays in the pool. Absent from backends that predate it. */
|
|
679
|
+
lpFeeToProtocol?: boolean;
|
|
642
680
|
hookProgram: Address | null;
|
|
643
681
|
/** The base token's creator-written hook (§5.8), for a launch pool whose token has one; null or absent otherwise. */
|
|
644
682
|
customHook?: CustomHookInfo | null;
|
|
@@ -681,3 +719,264 @@ export interface ApiErrorBody {
|
|
|
681
719
|
error: string;
|
|
682
720
|
code?: string;
|
|
683
721
|
}
|
|
722
|
+
/** Which of the standard's programs emitted an event: the five of Bordrless, or any hook program (`hook`). */
|
|
723
|
+
export type ExplorerProgram = 'token' | 'swap' | 'bridge' | 'launch' | 'kit' | 'hook';
|
|
724
|
+
/** What an address turned out to be, in the order the backend looks: a mint, a pool, a bridge wrapper, a holding, a program, a wallet, a launch config, or nothing it knows. */
|
|
725
|
+
export type ExplorerKind = 'mint' | 'pool' | 'wrapper' | 'holding' | 'program' | 'wallet' | 'config' | 'unknown';
|
|
726
|
+
export interface ExplorerStats {
|
|
727
|
+
/** Mints of the standard the indexer has seen. */
|
|
728
|
+
mints: number;
|
|
729
|
+
/** Holdings with a balance. */
|
|
730
|
+
holdings: number;
|
|
731
|
+
/** Transactions indexed (distinct signatures), all time and in the last 24 hours. */
|
|
732
|
+
transactions: number;
|
|
733
|
+
transactions24h: number;
|
|
734
|
+
/** The newest slot indexed; null before the first event. */
|
|
735
|
+
newestSlot: number | null;
|
|
736
|
+
}
|
|
737
|
+
/** A token an event's amounts are in. */
|
|
738
|
+
export interface ExplorerToken {
|
|
739
|
+
mint: Address;
|
|
740
|
+
symbol: string;
|
|
741
|
+
decimals: number;
|
|
742
|
+
}
|
|
743
|
+
/** One decoded event of `chain_events`, as the explorer shows it. */
|
|
744
|
+
export interface ExplorerEvent {
|
|
745
|
+
signature: string;
|
|
746
|
+
ordinal: number;
|
|
747
|
+
slot: number;
|
|
748
|
+
blockTime: number | null;
|
|
749
|
+
/** The program id that emitted it. */
|
|
750
|
+
program: Address;
|
|
751
|
+
/** The IDL's event name in PascalCase (`Transferred`, `Swapped`, `KitInstalled`). */
|
|
752
|
+
name: string;
|
|
753
|
+
/** The account the event is mostly about (the mint, the pool, the holding, ...); null when it has none. */
|
|
754
|
+
subject: Address | null;
|
|
755
|
+
/** The decoded fields: keys as the SDK's coder gives them (camelCase), pubkeys as base58, integers as decimal strings. */
|
|
756
|
+
payload: Record<string, unknown>;
|
|
757
|
+
/** The tokens its amounts are in, where the indexer knows them: the event's own mint (or the pool's base), and the pool's quote. */
|
|
758
|
+
base: ExplorerToken | null;
|
|
759
|
+
quote: ExplorerToken | null;
|
|
760
|
+
}
|
|
761
|
+
export interface ExplorerEvents {
|
|
762
|
+
events: ExplorerEvent[];
|
|
763
|
+
/** The cursor for the page after this one (`before=`); null on the last page. */
|
|
764
|
+
next: string | null;
|
|
765
|
+
}
|
|
766
|
+
/** `GET /v1/explorer/tx/:signature`: a transaction the indexer has, with every event it decoded, in order. */
|
|
767
|
+
export interface ExplorerTx {
|
|
768
|
+
signature: string;
|
|
769
|
+
slot: number;
|
|
770
|
+
blockTime: number | null;
|
|
771
|
+
/** The program ids its events came from, first seen first. */
|
|
772
|
+
programs: Address[];
|
|
773
|
+
events: ExplorerEvent[];
|
|
774
|
+
}
|
|
775
|
+
export interface ExplorerMint {
|
|
776
|
+
mint: Address;
|
|
777
|
+
name: string;
|
|
778
|
+
symbol: string;
|
|
779
|
+
image: string | null;
|
|
780
|
+
decimals: number;
|
|
781
|
+
supply: Amount;
|
|
782
|
+
maxSupply: Amount;
|
|
783
|
+
creator: Address;
|
|
784
|
+
createdAt: number;
|
|
785
|
+
kind: 'launch' | 'bridged' | 'lp' | 'other';
|
|
786
|
+
mintAuthority: Address | null;
|
|
787
|
+
freezeAuthority: Address | null;
|
|
788
|
+
hookAuthority: Address | null;
|
|
789
|
+
metadataAuthority: Address | null;
|
|
790
|
+
hookProgram: Address | null;
|
|
791
|
+
hookFlags: number;
|
|
792
|
+
/** Holdings with a balance. */
|
|
793
|
+
holders: number;
|
|
794
|
+
}
|
|
795
|
+
export interface ExplorerHolder {
|
|
796
|
+
owner: Address;
|
|
797
|
+
holding: Address;
|
|
798
|
+
amount: Amount;
|
|
799
|
+
/** Of the supply, 0 to 1. */
|
|
800
|
+
share: number;
|
|
801
|
+
}
|
|
802
|
+
/** A pool as the explorer lists it on a mint's page, or shows it on its own. */
|
|
803
|
+
export interface ExplorerPool {
|
|
804
|
+
pool: Address;
|
|
805
|
+
baseMint: Address;
|
|
806
|
+
quoteMint: Address;
|
|
807
|
+
baseSymbol: string;
|
|
808
|
+
quoteSymbol: string;
|
|
809
|
+
baseDecimals: number;
|
|
810
|
+
quoteDecimals: number;
|
|
811
|
+
baseReserve: Amount;
|
|
812
|
+
quoteReserve: Amount;
|
|
813
|
+
lpMint: Address;
|
|
814
|
+
lpSupply: Amount;
|
|
815
|
+
lpFeeBps: number;
|
|
816
|
+
protocolFeeBps: number;
|
|
817
|
+
protocolModel: ProtocolModel;
|
|
818
|
+
protocolShareBps: number | null;
|
|
819
|
+
/** The LP fee goes to Bordrless in SOL (a launch pool since the upgrade of 2026-10-08); false when it stays in the pool. */
|
|
820
|
+
lpFeeToProtocol: boolean;
|
|
821
|
+
hookProgram: Address | null;
|
|
822
|
+
hookFlags: number;
|
|
823
|
+
curve: boolean;
|
|
824
|
+
creator: Address;
|
|
825
|
+
createdAt: number;
|
|
826
|
+
swapCount: number;
|
|
827
|
+
volume24hUsd: number | null;
|
|
828
|
+
/** The launch this is the pool of, if any. */
|
|
829
|
+
launchMint: Address | null;
|
|
830
|
+
}
|
|
831
|
+
export interface ExplorerHolding {
|
|
832
|
+
holding: Address;
|
|
833
|
+
mint: Address;
|
|
834
|
+
owner: Address;
|
|
835
|
+
amount: Amount;
|
|
836
|
+
symbol: string;
|
|
837
|
+
name: string;
|
|
838
|
+
image: string | null;
|
|
839
|
+
decimals: number;
|
|
840
|
+
/** Dollars, where the token has a pool against bridged SOL and SOL has a price. */
|
|
841
|
+
valueUsd: number | null;
|
|
842
|
+
}
|
|
843
|
+
export interface ExplorerProgramInfo extends ProgramInfo {
|
|
844
|
+
/** The program's name on the standard ("Token", "DEX", "Half-Life"); a hook the site does not know is "Hook". */
|
|
845
|
+
name: string;
|
|
846
|
+
/** Events indexed, by event name, most first. */
|
|
847
|
+
counts: {
|
|
848
|
+
name: string;
|
|
849
|
+
count: number;
|
|
850
|
+
}[];
|
|
851
|
+
}
|
|
852
|
+
export interface ExplorerWrapper {
|
|
853
|
+
wrapper: Address;
|
|
854
|
+
underlyingMint: Address;
|
|
855
|
+
underlyingProgram: Address;
|
|
856
|
+
wrappedMint: Address;
|
|
857
|
+
vault: Address;
|
|
858
|
+
decimals: number;
|
|
859
|
+
native: boolean;
|
|
860
|
+
totalWrapped: Amount;
|
|
861
|
+
name: string;
|
|
862
|
+
symbol: string;
|
|
863
|
+
image: string | null;
|
|
864
|
+
registrar: Address;
|
|
865
|
+
registeredAt: number;
|
|
866
|
+
}
|
|
867
|
+
/** A `LaunchConfig` (docs/hooks-v2.md §5.7) as its `LaunchConfigCreated` event told it, and the launches made from it. */
|
|
868
|
+
export interface ExplorerConfig {
|
|
869
|
+
config: Address;
|
|
870
|
+
creator: Address | null;
|
|
871
|
+
label: string | null;
|
|
872
|
+
creatorFeeBps: number | null;
|
|
873
|
+
customHook: Address | null;
|
|
874
|
+
customHookFlags: number | null;
|
|
875
|
+
rules: Record<string, unknown> | null;
|
|
876
|
+
launches: {
|
|
877
|
+
mint: Address;
|
|
878
|
+
name: string;
|
|
879
|
+
symbol: string;
|
|
880
|
+
image: string | null;
|
|
881
|
+
}[];
|
|
882
|
+
}
|
|
883
|
+
/** A short reference to a token, for lists. */
|
|
884
|
+
export interface ExplorerTokenRef {
|
|
885
|
+
mint: Address;
|
|
886
|
+
name: string;
|
|
887
|
+
symbol: string;
|
|
888
|
+
image: string | null;
|
|
889
|
+
}
|
|
890
|
+
/** `GET /v1/explorer/address/:address`: what lives at an address, by kind. Every kind carries the newest events touching it. */
|
|
891
|
+
export type ExplorerAddress = {
|
|
892
|
+
address: Address;
|
|
893
|
+
events: ExplorerEvent[];
|
|
894
|
+
} & ({
|
|
895
|
+
kind: 'mint';
|
|
896
|
+
mint: ExplorerMint;
|
|
897
|
+
launch: {
|
|
898
|
+
status: LaunchStatus;
|
|
899
|
+
} | null;
|
|
900
|
+
wrapper: {
|
|
901
|
+
underlyingMint: Address;
|
|
902
|
+
native: boolean;
|
|
903
|
+
} | null;
|
|
904
|
+
pools: ExplorerPool[];
|
|
905
|
+
holders: ExplorerHolder[];
|
|
906
|
+
} | {
|
|
907
|
+
kind: 'pool';
|
|
908
|
+
pool: ExplorerPool;
|
|
909
|
+
trades: Trade[];
|
|
910
|
+
} | {
|
|
911
|
+
kind: 'wrapper';
|
|
912
|
+
wrapper: ExplorerWrapper;
|
|
913
|
+
} | {
|
|
914
|
+
kind: 'holding';
|
|
915
|
+
holding: ExplorerHolding;
|
|
916
|
+
} | {
|
|
917
|
+
kind: 'program';
|
|
918
|
+
program: ExplorerProgramInfo;
|
|
919
|
+
} | {
|
|
920
|
+
kind: 'wallet';
|
|
921
|
+
holdings: ExplorerHolding[];
|
|
922
|
+
totalUsd: number | null;
|
|
923
|
+
created: ExplorerTokenRef[];
|
|
924
|
+
} | {
|
|
925
|
+
kind: 'config';
|
|
926
|
+
config: ExplorerConfig;
|
|
927
|
+
} | {
|
|
928
|
+
kind: 'unknown';
|
|
929
|
+
});
|
|
930
|
+
/** One answer to a search: an address resolved to its kind, a transaction, or a mint whose name or ticker matched. */
|
|
931
|
+
export interface ExplorerHit {
|
|
932
|
+
kind: ExplorerKind | 'tx';
|
|
933
|
+
address: Address;
|
|
934
|
+
name: string | null;
|
|
935
|
+
symbol: string | null;
|
|
936
|
+
image: string | null;
|
|
937
|
+
}
|
|
938
|
+
export interface ExplorerSearch {
|
|
939
|
+
query: string;
|
|
940
|
+
hits: ExplorerHit[];
|
|
941
|
+
}
|
|
942
|
+
/**
|
|
943
|
+
* `POST /v1/config/prepare`: a `LaunchConfig` made from the launch page (Build your own, §5.7), for a
|
|
944
|
+
* hook program of the creator's own. `config` is the address of a keypair the browser made; it signs
|
|
945
|
+
* after the wallet. The kit's rules can't go with a hook of one's own, so a config carries burn and a
|
|
946
|
+
* creator fee only.
|
|
947
|
+
*/
|
|
948
|
+
export interface ConfigPrepareRequest {
|
|
949
|
+
creator: Address;
|
|
950
|
+
config: Address;
|
|
951
|
+
customHook: Address;
|
|
952
|
+
/** `TOKEN_HOOK_FLAGS`: at least one callback, no unknown bit. */
|
|
953
|
+
customHookFlags: number;
|
|
954
|
+
burnBuyBps: number;
|
|
955
|
+
burnSellBps: number;
|
|
956
|
+
creatorFeeBps: number;
|
|
957
|
+
/** At most 32 bytes. */
|
|
958
|
+
label: string;
|
|
959
|
+
}
|
|
960
|
+
export interface ConfigPrepareResponse {
|
|
961
|
+
config: Address;
|
|
962
|
+
transactions: PreparedTx[];
|
|
963
|
+
}
|
|
964
|
+
/** `GET /v1/hooks/:program?mint=`: a hook program as the launch page checks it, and whether it is prepared for the mint. */
|
|
965
|
+
export interface HookInspection {
|
|
966
|
+
program: Address;
|
|
967
|
+
/** Deployed as a program on this cluster. */
|
|
968
|
+
executable: boolean;
|
|
969
|
+
/** None of Bordrless's own programs. */
|
|
970
|
+
ownProgram: boolean;
|
|
971
|
+
upgradeAuthority: Address | null;
|
|
972
|
+
upgradeable: boolean | null;
|
|
973
|
+
/** With a mint: the registry it must write for that mint, `["bordrless-hook-accounts", mint]` under the program. */
|
|
974
|
+
registry: Address | null;
|
|
975
|
+
/** With a mint: whether that registry exists and decodes. */
|
|
976
|
+
registryReady: boolean | null;
|
|
977
|
+
/** The registry's extra accounts, once it exists; a launch fits at most `maxExtras`. */
|
|
978
|
+
extras: number | null;
|
|
979
|
+
maxExtras: number;
|
|
980
|
+
/** Why it can't be launched with yet, one sentence each. */
|
|
981
|
+
problems: string[];
|
|
982
|
+
}
|
package/dist/programs.d.ts
CHANGED
|
@@ -14,6 +14,8 @@ export declare const PROGRAM_IDS: {
|
|
|
14
14
|
readonly kit: "14RJQXPdJfkehit6ezktjd3xujamf8nVSKw2shKamaEH";
|
|
15
15
|
/** Half-Life (programs/half_life): an exit fee that halves every six hours a token is held, burned. */
|
|
16
16
|
readonly halfLife: "53SpmtkdPWQ63mWoDeXk8P9tuwiT4ed2Wx4fwfy5NSF8";
|
|
17
|
+
/** Companions (programs/bordrless_companion, docs/companions.md): a launch whose creator is a program, its fees bought back, shared with holders or vested by code. */
|
|
18
|
+
readonly companion: "6ZUM1gWBH9hBBNoJoaVAGwSftyZ6CUda6vUZTW9MsJuo";
|
|
17
19
|
};
|
|
18
20
|
/**
|
|
19
21
|
* Half-Life, Bordrless's own token hook (programs/half_life/README.md): the `LaunchConfig` the
|
|
@@ -39,6 +41,26 @@ export declare const HALF_LIFE: {
|
|
|
39
41
|
* (20% at 0, halved every six hours, linear within each, 0 from 48 h).
|
|
40
42
|
*/
|
|
41
43
|
export declare function halfLifeFeePpm(ageSecs: number): number;
|
|
44
|
+
/**
|
|
45
|
+
* The DEX upgrade of 2026-10-08 (docs/hooks-v2.md §3.1, "The LP fee of a launch pool is
|
|
46
|
+
* Bordrless's"): from this slot on mainnet a launch pool's LP fee (the sniper fee included) is
|
|
47
|
+
* taken in SOL and paid to Bordrless with the protocol fee; a launch pool created before it keeps
|
|
48
|
+
* its LP fee in the pool, compounding, as its traders were told. The slot is the DEX program's
|
|
49
|
+
* last upgrade, read from its ProgramData account; the time is that slot's block time
|
|
50
|
+
* (`getBlockTime`, unix seconds), which the backend compares a pool's `created_at` against (the
|
|
51
|
+
* pools table keeps a timestamp, not a slot). Devnet and localnet were deployed after the rule:
|
|
52
|
+
* every launch pool there pays Bordrless.
|
|
53
|
+
*/
|
|
54
|
+
export declare const LP_FEE_TO_PROTOCOL_FROM_SLOT = 454439142;
|
|
55
|
+
export declare const LP_FEE_TO_PROTOCOL_FROM_TIME = 1791434238;
|
|
56
|
+
/**
|
|
57
|
+
* Whether a pool's LP fee goes to Bordrless (`LaunchSummary.lpFeeToProtocol`): every launch pool's
|
|
58
|
+
* (the share model), whenever it was created. The upgraded DEX keys the fee's destination on the
|
|
59
|
+
* pool's fee model alone, so a launch pool opened before the upgrade compounded its LP fee until
|
|
60
|
+
* that slot and pays Bordrless since. An ordinary pool's LP fee is its liquidity's. `createdAt`
|
|
61
|
+
* and `cluster` are kept for the record of when the rule began (the constants above).
|
|
62
|
+
*/
|
|
63
|
+
export declare function lpFeeToProtocol(shareModel: boolean, _createdAt: number, _cluster: 'mainnet' | 'devnet' | 'localnet'): boolean;
|
|
42
64
|
/** The wSOL mint, which stands for native SOL on the bridge. */
|
|
43
65
|
export declare const NATIVE_MINT = "So11111111111111111111111111111111111111112";
|
|
44
66
|
export declare const TOKEN_PROGRAM_ID = "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
|
|
@@ -89,9 +111,11 @@ export declare const FIXED_ADDRESSES: {
|
|
|
89
111
|
readonly kitEventAuthority: "9abhxVTuwck5Ux79act3e2Vkfem7Q4zBwATMctUvHvuE";
|
|
90
112
|
/** `["hook-authority"]` under the kit: it signs the token program's `write_hook_data` in `claim`. */
|
|
91
113
|
readonly kitHookAuthority: "2repKA1JgDkBo4AffscVee342dcBcH6c2yfpUTRrAiEN";
|
|
114
|
+
/** `["__event_authority"]` under the companion program. */
|
|
115
|
+
readonly companionEventAuthority: "7QuoYRuD9MHzX5EN7qqj62iwNPVqfy74RzmwJ524cgDt";
|
|
92
116
|
};
|
|
93
117
|
/**
|
|
94
|
-
* The protocol lookup table (docs/hooks-v2.md §6; programs-summary §2.7): the
|
|
118
|
+
* The protocol lookup table (docs/hooks-v2.md §6; programs-summary §2.7): the 22 fixed addresses
|
|
95
119
|
* no top-level instruction invokes, in the order the programs' tests load them and `pnpm admin
|
|
96
120
|
* init` must write them (a v0 message names table entries by index). Programs a transaction
|
|
97
121
|
* invokes at top level (the kit for claims and shares) are kept in the static keys by the v0
|
package/dist/programs.js
CHANGED
|
@@ -14,6 +14,8 @@ export const PROGRAM_IDS = {
|
|
|
14
14
|
kit: '14RJQXPdJfkehit6ezktjd3xujamf8nVSKw2shKamaEH',
|
|
15
15
|
/** Half-Life (programs/half_life): an exit fee that halves every six hours a token is held, burned. */
|
|
16
16
|
halfLife: '53SpmtkdPWQ63mWoDeXk8P9tuwiT4ed2Wx4fwfy5NSF8',
|
|
17
|
+
/** Companions (programs/bordrless_companion, docs/companions.md): a launch whose creator is a program, its fees bought back, shared with holders or vested by code. */
|
|
18
|
+
companion: '6ZUM1gWBH9hBBNoJoaVAGwSftyZ6CUda6vUZTW9MsJuo',
|
|
17
19
|
};
|
|
18
20
|
/**
|
|
19
21
|
* Half-Life, Bordrless's own token hook (programs/half_life/README.md): the `LaunchConfig` the
|
|
@@ -49,6 +51,28 @@ export function halfLifeFeePpm(ageSecs) {
|
|
|
49
51
|
const lo = Math.floor(HALF_LIFE.maxFeePpm / 2 ** (halvings + 1));
|
|
50
52
|
return hi - Math.floor(((hi - lo) * into) / HALF_LIFE.halfLifeSecs);
|
|
51
53
|
}
|
|
54
|
+
/**
|
|
55
|
+
* The DEX upgrade of 2026-10-08 (docs/hooks-v2.md §3.1, "The LP fee of a launch pool is
|
|
56
|
+
* Bordrless's"): from this slot on mainnet a launch pool's LP fee (the sniper fee included) is
|
|
57
|
+
* taken in SOL and paid to Bordrless with the protocol fee; a launch pool created before it keeps
|
|
58
|
+
* its LP fee in the pool, compounding, as its traders were told. The slot is the DEX program's
|
|
59
|
+
* last upgrade, read from its ProgramData account; the time is that slot's block time
|
|
60
|
+
* (`getBlockTime`, unix seconds), which the backend compares a pool's `created_at` against (the
|
|
61
|
+
* pools table keeps a timestamp, not a slot). Devnet and localnet were deployed after the rule:
|
|
62
|
+
* every launch pool there pays Bordrless.
|
|
63
|
+
*/
|
|
64
|
+
export const LP_FEE_TO_PROTOCOL_FROM_SLOT = 454_439_142;
|
|
65
|
+
export const LP_FEE_TO_PROTOCOL_FROM_TIME = 1_791_434_238;
|
|
66
|
+
/**
|
|
67
|
+
* Whether a pool's LP fee goes to Bordrless (`LaunchSummary.lpFeeToProtocol`): every launch pool's
|
|
68
|
+
* (the share model), whenever it was created. The upgraded DEX keys the fee's destination on the
|
|
69
|
+
* pool's fee model alone, so a launch pool opened before the upgrade compounded its LP fee until
|
|
70
|
+
* that slot and pays Bordrless since. An ordinary pool's LP fee is its liquidity's. `createdAt`
|
|
71
|
+
* and `cluster` are kept for the record of when the rule began (the constants above).
|
|
72
|
+
*/
|
|
73
|
+
export function lpFeeToProtocol(shareModel, _createdAt, _cluster) {
|
|
74
|
+
return shareModel;
|
|
75
|
+
}
|
|
52
76
|
/** The wSOL mint, which stands for native SOL on the bridge. */
|
|
53
77
|
export const NATIVE_MINT = 'So11111111111111111111111111111111111111112';
|
|
54
78
|
export const TOKEN_PROGRAM_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';
|
|
@@ -99,9 +123,11 @@ export const FIXED_ADDRESSES = {
|
|
|
99
123
|
kitEventAuthority: '9abhxVTuwck5Ux79act3e2Vkfem7Q4zBwATMctUvHvuE',
|
|
100
124
|
/** `["hook-authority"]` under the kit: it signs the token program's `write_hook_data` in `claim`. */
|
|
101
125
|
kitHookAuthority: '2repKA1JgDkBo4AffscVee342dcBcH6c2yfpUTRrAiEN',
|
|
126
|
+
/** `["__event_authority"]` under the companion program. */
|
|
127
|
+
companionEventAuthority: '7QuoYRuD9MHzX5EN7qqj62iwNPVqfy74RzmwJ524cgDt',
|
|
102
128
|
};
|
|
103
129
|
/**
|
|
104
|
-
* The protocol lookup table (docs/hooks-v2.md §6; programs-summary §2.7): the
|
|
130
|
+
* The protocol lookup table (docs/hooks-v2.md §6; programs-summary §2.7): the 22 fixed addresses
|
|
105
131
|
* no top-level instruction invokes, in the order the programs' tests load them and `pnpm admin
|
|
106
132
|
* init` must write them (a v0 message names table entries by index). Programs a transaction
|
|
107
133
|
* invokes at top level (the kit for claims and shares) are kept in the static keys by the v0
|
|
@@ -126,6 +152,12 @@ export const PROTOCOL_LOOKUP_TABLE_ADDRESSES = [
|
|
|
126
152
|
FIXED_ADDRESSES.bridgedSolMint,
|
|
127
153
|
SYSTEM_PROGRAM_ID,
|
|
128
154
|
ASSOCIATED_TOKEN_PROGRAM_ID,
|
|
155
|
+
// Appended 2026-10-08 for launches through a companion (docs/companions.md): the companion's event
|
|
156
|
+
// authority and the programs it invokes, so its launch transaction fits (1,142 bytes instead of 1,266).
|
|
157
|
+
FIXED_ADDRESSES.companionEventAuthority,
|
|
158
|
+
PROGRAM_IDS.launch,
|
|
159
|
+
PROGRAM_IDS.swap,
|
|
160
|
+
PROGRAM_IDS.token,
|
|
129
161
|
];
|
|
130
162
|
/** Token hook flags (`Mint.hookFlags`). */
|
|
131
163
|
export const TOKEN_HOOK_FLAGS = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bordrless/shared",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Bordrless policy (the same math as crates/bordrless-core), program addresses and the API types shared by the server and the site. No Solana dependencies.",
|
|
6
6
|
"license": "Apache-2.0",
|