@coinlist-co/react 0.12.2-rc.4851c6a → 0.12.2-rc.4cc3d7e

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.
@@ -19,6 +19,17 @@ type ClientId = Newtype<string, 'ClientId'>;
19
19
  declare const ClientId: (value: string) => ClientId;
20
20
  type ClientSecret = Newtype<string, 'ClientSecret'>;
21
21
  declare const ClientSecret: (value: string) => ClientSecret;
22
+ /**
23
+ * The PKCE pair a finished authorization hands from the browser to the
24
+ * partner's backend: `CoinListClient#auth.completeOAuth` produces it, and
25
+ * `CoinListServer#auth.completeOAuth` exchanges it for a session.
26
+ */
27
+ type AuthorizationGrant = {
28
+ /** The short-lived authorization code parsed out of the redirect URL. */
29
+ code: AuthorizationCode;
30
+ /** The `code_verifier` the browser generated when starting the flow. */
31
+ codeVerifier: CodeVerifier;
32
+ };
22
33
 
23
34
  /**
24
35
  * A classified wallet or transaction failure. The SDK derives this from
@@ -401,6 +412,12 @@ declare const AsyncOfferDetail: {
401
412
  type CoinListTokenSaleOfferDetail = OfferDetailBase & OfferEditorial & {
402
413
  type: 'coinlist::token_sale';
403
414
  logoUrl: string;
415
+ /**
416
+ * Every chain this sale takes participations on, with the contract a
417
+ * participation's approval names as its spender. Empty means it takes
418
+ * participations nowhere.
419
+ */
420
+ fundingContracts: OfferFundingContract[];
404
421
  };
405
422
  type SuperstateSwapOfferDetail = OfferDetailBase & OfferEditorial & {
406
423
  type: 'superstate::swap';
@@ -546,6 +563,19 @@ type OfferVaultContract = {
546
563
  chain: Chain;
547
564
  address: EvmContractAddress;
548
565
  };
566
+ /**
567
+ * A chain a CoinList token sale takes participations on, with the contract a
568
+ * participation's approval names as its spender: the sale pulls the payment
569
+ * through that allowance once it settles.
570
+ *
571
+ * Its own type rather than an {@link OfferVaultContract}, although the shape
572
+ * is the same, because the meaning is not: nothing is sent to this contract
573
+ * at checkout, it is only approved.
574
+ */
575
+ type OfferFundingContract = {
576
+ chain: Chain;
577
+ address: EvmContractAddress;
578
+ };
549
579
 
550
580
  /**
551
581
  * One vault: a share token on one chain. What the status and position reads
@@ -559,13 +589,14 @@ type CentrifugeVaultRef = {
559
589
  chain: EthereumChain;
560
590
  };
561
591
  /**
562
- * Which leg of a vault trade: `invest` turns the funding token into shares,
563
- * `redeem` turns shares back into the funding token. Each wallet holds one
564
- * pooled position per vault per direction, and a claim settles one of them.
592
+ * Which side of a vault trade: `deposit` (buy) turns the funding token into
593
+ * shares, `redeem` (sell) turns shares back into the funding token. The
594
+ * contract's own names. Each wallet holds one pooled position per vault per
595
+ * direction, and a claim settles one of them.
565
596
  *
566
597
  * @alpha
567
598
  */
568
- type CentrifugeClaimDirection = 'invest' | 'redeem';
599
+ type CentrifugeClaimDirection = 'deposit' | 'redeem';
569
600
  /**
570
601
  * Why a deposit cannot be placed on a vault right now. Kept verbatim from the
571
602
  * wire: frontline publishes it as a closed set for clients to branch on.
@@ -579,13 +610,6 @@ type CentrifugeOrderReason = 'vault_unlinked' | 'vault_halted' | 'proxy_not_perm
579
610
  * @alpha
580
611
  */
581
612
  type CentrifugeVaultReason = Exclude<CentrifugeOrderReason, 'below_minimum'>;
582
- /**
583
- * Where a wallet stands on a vault. Not a lifecycle - see
584
- * {@link CentrifugeVaultPosition.status}.
585
- *
586
- * @alpha
587
- */
588
- type CentrifugePositionStatus = 'none' | 'pending' | 'partially_filled' | 'filled' | 'claimed';
589
613
  /**
590
614
  * Whether a deposit can be placed, as one union rather than the wire's
591
615
  * `can_order` beside `reasons`: a blocked answer always says why, and an
@@ -675,97 +699,93 @@ type CentrifugeVaultClaimTransaction = CentrifugeVaultTransactionCore & {
675
699
  claimableShares: BlockchainAmount;
676
700
  };
677
701
  /**
678
- * One wallet's standing on one vault: what it put in, what has settled, and
679
- * what it can claim. The endpoint a returning user lands on, and the one that
680
- * says whether to offer the claim.
702
+ * The funding token a vault is paid in, in that token's decimals. Nominally
703
+ * distinct from {@link CentrifugeShares}: the two legs settle in opposite
704
+ * units, and the compiler, not a comment, keeps one from standing in for the
705
+ * other.
706
+ *
707
+ * @alpha
708
+ */
709
+ type CentrifugeAssets = BlockchainAmount & {
710
+ readonly [centrifugeUnit]: 'assets';
711
+ };
712
+ /** @alpha */
713
+ declare const CentrifugeAssets: (amount: BlockchainAmount) => CentrifugeAssets;
714
+ /**
715
+ * A vault's share token, in its decimals. See {@link CentrifugeAssets}.
716
+ *
717
+ * @alpha
718
+ */
719
+ type CentrifugeShares = BlockchainAmount & {
720
+ readonly [centrifugeUnit]: 'shares';
721
+ };
722
+ /** @alpha */
723
+ declare const CentrifugeShares: (amount: BlockchainAmount) => CentrifugeShares;
724
+ /**
725
+ * The phantom key {@link CentrifugeAssets} and {@link CentrifugeShares} are
726
+ * told apart by. A second key rather than a second `Newtype`, because
727
+ * `BlockchainAmount` already spends the `Newtype` brand: two brands on one key
728
+ * intersect to `never`, and the units would become assignable to each other.
729
+ */
730
+ declare const centrifugeUnit: unique symbol;
731
+ /**
732
+ * One wallet's Deposit (buy) standing on one vault, read from the proxy.
681
733
  *
682
- * The amounts are independent of each other: each piece of a request settles
683
- * and is claimed on its own, so a wallet can be pending, claimable and claimed
684
- * at once. There is no per-fulfilment breakdown; settlement pools every
685
- * fulfilment into one {@link averagePrice}.
734
+ * The proxy keeps one pooled position per wallet: a FIFO slice of the vault's
735
+ * queue, which the fund fills on its own schedule. `pending` and `claimable`
736
+ * coexist - a fill can cover part of the slice - and neither says anything
737
+ * about earlier claims.
738
+ *
739
+ * Both are in the funding token, the unit the proxy tracks a deposit in. The
740
+ * shares a claim pays are not here: the proxy publishes no claim price, and
741
+ * its spot `convertToShares` is documented as not being one.
686
742
  *
687
743
  * @alpha
688
744
  */
689
- type CentrifugeVaultPosition = {
745
+ type CentrifugeDepositPosition = {
690
746
  chain: EthereumChain;
691
- symbol: AssetSymbol;
747
+ /** The CoinList proxy the position lives on. */
748
+ proxy: EvmContractAddress;
692
749
  walletAddress: EvmWalletAddress;
693
- /**
694
- * Derived by frontline from the amounts. Not a lifecycle: a new request
695
- * moves it back to `pending` while earlier shares stay claimed.
696
- */
697
- status: CentrifugePositionStatus;
698
- /** Funding token ever requested. */
699
- requested: BlockchainAmount;
700
- /** Of {@link requested}, what is still queued. */
701
- pending: BlockchainAmount;
702
- /** Of {@link requested}, what has been fulfilled. */
703
- filledAssets: BlockchainAmount;
704
- /** Shares the fulfilments earned. Held by the proxy until claimed. */
705
- earnedShares: BlockchainAmount;
706
- claimedShares: BlockchainAmount;
707
- /** Non-zero means a claim will return calldata. */
708
- claimableShares: BlockchainAmount;
709
- /**
710
- * What the wallet holds on the share token. Can exceed
711
- * {@link claimedShares}: shares acquired any other way count here.
712
- */
713
- shareBalance: BlockchainAmount;
714
- /** Pooled rate over everything claimed. Null before the first claim. */
715
- averagePrice: DecimalString | null;
716
- /** Centrifuge froze this wallet on the share token. Blocks claiming. */
717
- frozen: boolean;
718
- asOf: Date;
750
+ /** Still queued, not yet filled: `pendingDepositRequest`. */
751
+ pending: CentrifugeAssets;
752
+ /** Filled and not yet claimed: `claimableDepositRequest`. A claim takes it all. */
753
+ claimable: CentrifugeAssets;
719
754
  };
720
755
  /**
721
- * One wallet's standing on the redeem side of a vault: shares queued to sell,
722
- * and the funding token a fill has made claimable. The mirror of
723
- * {@link CentrifugeVaultPosition}, and as independent of it: a wallet can be
724
- * investing and redeeming on the same vault at once.
725
- *
726
- * TODO(frontline, ENG-1909): built against a guessed wire shape - see
727
- * `CentrifugeVaultRedeemPositionDto`.
756
+ * One wallet's Redeem (sell) standing on one vault, read from the proxy. The
757
+ * mirror of {@link CentrifugeDepositPosition}, in shares, and as independent
758
+ * of it: a wallet can deposit and redeem on one vault at once.
728
759
  *
729
760
  * @alpha
730
761
  */
731
- type CentrifugeVaultRedeemPosition = {
762
+ type CentrifugeRedeemPosition = {
732
763
  chain: EthereumChain;
733
- symbol: AssetSymbol;
764
+ /** The CoinList proxy the position lives on. */
765
+ proxy: EvmContractAddress;
734
766
  walletAddress: EvmWalletAddress;
735
- status: CentrifugePositionStatus;
736
- /** Shares still queued for redemption. */
737
- pending: BlockchainAmount;
738
- /**
739
- * Funding token a claim would pay out now. An estimate: the vault prices the
740
- * claimable shares at the claim. Non-zero means a claim returns calldata.
741
- */
742
- claimableAssets: BlockchainAmount;
743
- /** Centrifuge froze this wallet on the share token. Blocks claiming. */
744
- frozen: boolean;
745
- asOf: Date;
767
+ /** Still queued, not yet filled: `pendingRedeemRequest`. */
768
+ pending: CentrifugeShares;
769
+ /** Filled and not yet claimed: `claimableRedeemRequest`. A claim takes it all. */
770
+ claimable: CentrifugeShares;
746
771
  };
747
772
  /**
748
- * One wallet's position on one leg of a vault trade, tagged with the leg. The
749
- * two legs are read from two endpoints and settle in opposite units - the
750
- * invest leg queues the funding token and pays out shares, the redeem leg the
751
- * reverse - so the tag is what says which unit each figure is in.
773
+ * One wallet's position on one side of a vault trade, tagged with the side.
774
+ * The two sides are tracked in opposite units - the funding token for
775
+ * `deposit`, shares for `redeem` - so the tag is what says which unit each
776
+ * figure is in.
752
777
  *
753
778
  * @alpha
754
779
  */
755
780
  type CentrifugeVaultLeg = {
756
- direction: 'invest';
757
- position: CentrifugeVaultPosition;
781
+ direction: 'deposit';
782
+ position: CentrifugeDepositPosition;
758
783
  } | {
759
784
  direction: 'redeem';
760
- position: CentrifugeVaultRedeemPosition;
785
+ position: CentrifugeRedeemPosition;
761
786
  };
762
787
  /** @alpha */
763
788
  declare const CentrifugeVaultLeg: {
764
- /**
765
- * What a claim on the leg would collect: shares for `invest`, the funding
766
- * token for `redeem`.
767
- */
768
- claimable: (leg: CentrifugeVaultLeg) => BlockchainAmount;
769
789
  /** Whether the leg has anything queued or anything ready to claim. */
770
790
  isActive: (leg: CentrifugeVaultLeg) => boolean;
771
791
  };
@@ -779,7 +799,7 @@ declare const CentrifugeVaultLeg: {
779
799
  type CentrifugeVaultLegId = Newtype<string, 'CentrifugeVaultLegId'>;
780
800
  /** @alpha */
781
801
  declare const CentrifugeVaultLegId: {
782
- /** Addresses compare case-insensitively: frontline echoes them lower case. */
802
+ /** Addresses compare case-insensitively: a host may pass either case. */
783
803
  of: (leg: CentrifugeVaultLeg) => CentrifugeVaultLegId;
784
804
  };
785
805
  /**
@@ -797,6 +817,96 @@ type CentrifugeVaultClaimProceedsTransaction = CentrifugeVaultTransactionCore &
797
817
  claimableAssets: BlockchainAmount;
798
818
  };
799
819
 
820
+ /**
821
+ * An absolute URL to a logo image in the token registry. Registry image URLs
822
+ * are content-fingerprinted and served immutable, so a value is safe to cache
823
+ * for as long as you hold it.
824
+ */
825
+ type TokenLogoUrl = Newtype<string, 'TokenLogoUrl'>;
826
+ declare const TokenLogoUrl: (value: string) => TokenLogoUrl;
827
+ type TokenLogoImage = {
828
+ url: TokenLogoUrl;
829
+ width: number;
830
+ height: number;
831
+ };
832
+ /**
833
+ * `VECTOR` is a single SVG. `RASTER` has webp variants at 32/64/128/256/512px
834
+ * widths (never wider than the original): use the smallest one that covers
835
+ * your render size, or `original` if none does.
836
+ */
837
+ type TokenLogo = {
838
+ kind: 'VECTOR';
839
+ url: TokenLogoUrl;
840
+ } | {
841
+ kind: 'RASTER';
842
+ original: TokenLogoImage;
843
+ variants: TokenLogoImage[];
844
+ };
845
+ /**
846
+ * Display metadata for one token, from CoinList's public token registry.
847
+ *
848
+ * Keyed by `(chain, address)` — never by symbol, which can collide. The
849
+ * registry is curated: a token missing from it is an expected answer, not an
850
+ * error, so lookups return `null` rather than throwing.
851
+ */
852
+ type TokenMetadata = {
853
+ identifier: TokenIdentifier;
854
+ name: string;
855
+ symbol: AssetSymbol;
856
+ decimals: AssetDecimals;
857
+ logo: TokenLogo;
858
+ /** Dark-theme logo; `null` when the registry configures none. */
859
+ logoDark: TokenLogo | null;
860
+ };
861
+
862
+ /**
863
+ * One chain a vault offer runs on, with everything a screen needs to read and
864
+ * show a position there: the proxy every request and claim goes through, the
865
+ * share token it issues, and the funding token it is paid in.
866
+ *
867
+ * The share token's `symbol` is the one amounts are labelled with. Vault
868
+ * routes are keyed by the offer's asset code, from `centrifugeShareSymbol`.
869
+ *
870
+ * @alpha
871
+ */
872
+ type CentrifugeVault = {
873
+ chain: EthereumChain;
874
+ proxy: EvmContractAddress;
875
+ share: TokenMetadata;
876
+ funding: TokenMetadata;
877
+ };
878
+ /**
879
+ * The vaults an offer runs on, or why a chain could not be resolved: one
880
+ * entry per `vaultContracts` chain, in the offer's order.
881
+ *
882
+ * @alpha
883
+ */
884
+ type CentrifugeVaultResolution = {
885
+ type: 'resolved';
886
+ vault: CentrifugeVault;
887
+ } | {
888
+ type: 'unresolved';
889
+ chain: OfferToken['chain'];
890
+ /** Which token the offer or the registry could not name. */
891
+ missing: 'share-token' | 'funding-token' | 'evm-chain';
892
+ };
893
+ /**
894
+ * Resolves each chain of a vault offer to its share and funding tokens.
895
+ *
896
+ * The offer names tokens by role and address only - the share token as
897
+ * `vault`, the coin it is paid in as `funding` - so `lookup` turns each into
898
+ * metadata. A function rather than a registry snapshot, so this module does
899
+ * not depend on where the metadata comes from.
900
+ *
901
+ * A chain whose tokens cannot be named is reported rather than dropped: its
902
+ * position cannot be read without the symbol, and a caller has to know it is
903
+ * not showing it. When a chain lists several funding tokens, the first one
904
+ * `lookup` knows wins - a vault is priced in one.
905
+ *
906
+ * @alpha
907
+ */
908
+ declare function resolveCentrifugeVaults(offer: CentrifugeVaultOfferDetail, lookup: (token: OfferToken) => TokenMetadata | null): CentrifugeVaultResolution[];
909
+
800
910
  /** @alpha */
801
911
  type GetCentrifugeVaultStatusParams = {
802
912
  /** Share token symbol of the vault, e.g. `deJTRSY`. */
@@ -821,6 +931,17 @@ type CentrifugeWalletParams = GetCentrifugeVaultStatusParams & {
821
931
  */
822
932
  walletAddress: EvmWalletAddress;
823
933
  };
934
+ /**
935
+ * A chain read of one wallet on one vault. The vault is the resolved one:
936
+ * its proxy is what the views live on, and its tokens' decimals scale the
937
+ * amounts, so neither is read again.
938
+ *
939
+ * @alpha
940
+ */
941
+ type ReadCentrifugePositionParams = {
942
+ vault: CentrifugeVault;
943
+ walletAddress: EvmWalletAddress;
944
+ };
824
945
  /**
825
946
  * What `POST /v1/centrifuge/vault/invest` is asked for: the wallet that will
826
947
  * broadcast the request and fund it, plus the deposit.
@@ -838,7 +959,9 @@ type BuildCentrifugeVaultBuyParams = CentrifugeWalletParams & {
838
959
  /**
839
960
  * Centrifuge vault reads and claims: the vault-wide ordering gate, each
840
961
  * wallet's position per direction, and the calldata that claims a filled
841
- * request.
962
+ * request - e.g. `coinlist.centrifuge.getVaultStatus({ ... })`. Broadcasting a
963
+ * request or a claim needs a wallet, so that half is client-only, on
964
+ * `ClientCentrifugeNamespace`.
842
965
  *
843
966
  * The reads are free to poll - none spends an attestation, so a client may
844
967
  * call them while the user sizes a deposit or waits on a fill.
@@ -853,21 +976,27 @@ type BuildCentrifugeVaultBuyParams = CentrifugeWalletParams & {
853
976
  * timer. Broadcasting the buy calldata places a request. It does not buy
854
977
  * shares.
855
978
  *
856
- * Every method requires `AuthState === 'logged-in'` and throws
979
+ * Every Frontline method requires `AuthState === 'logged-in'` and throws
857
980
  * {@link NotAuthenticatedError} otherwise.
981
+ * {@link CentrifugeNamespace.readDepositPosition} and
982
+ * {@link CentrifugeNamespace.readRedeemPosition} read the proxy over RPC and
983
+ * do not; through CoinList's RPC proxy a logged-out read fails with its 401.
858
984
  *
859
985
  * @alpha
860
986
  */
861
987
  interface CentrifugeNamespace {
862
988
  getVaultStatus(params: GetCentrifugeVaultStatusParams): Promise<CentrifugeVaultStatus>;
863
- /** The wallet's invest position: funding queued, shares claimable. */
864
- getPosition(params: CentrifugeWalletParams): Promise<CentrifugeVaultPosition>;
865
989
  /**
866
- * The wallet's redeem position: shares queued, funding claimable.
867
- *
868
- * TODO(frontline, ENG-1909): built against a guessed endpoint.
990
+ * The wallet's Deposit (buy) standing on the vault: funding token still
991
+ * queued, and funding token filled and ready to claim. A wallet that has
992
+ * never touched the vault reads as zeroes.
993
+ */
994
+ readDepositPosition(params: ReadCentrifugePositionParams): Promise<CentrifugeDepositPosition>;
995
+ /**
996
+ * The wallet's Redeem (sell) standing on the vault: shares still queued,
997
+ * and shares filled and ready to claim.
869
998
  */
870
- getRedeemPosition(params: CentrifugeWalletParams): Promise<CentrifugeVaultRedeemPosition>;
999
+ readRedeemPosition(params: ReadCentrifugePositionParams): Promise<CentrifugeRedeemPosition>;
871
1000
  /**
872
1001
  * Calldata claiming every claimable share. Broadcast it from
873
1002
  * `params.walletAddress`: the proxy credits the sender.
@@ -910,14 +1039,6 @@ interface PaginatedResponse<T> {
910
1039
  type ParticipationId = Newtype<string, 'ParticipationId'>;
911
1040
  /** Casts a string into a typed {@link ParticipationId}. */
912
1041
  declare const ParticipationId: (value: string) => ParticipationId;
913
- /** Blockchain identifier for where a participation is funded. */
914
- type Blockchain = Newtype<string, 'Blockchain'>;
915
- /** Casts a string into a typed {@link Blockchain}. */
916
- declare const Blockchain: (value: string) => Blockchain;
917
- /** Wallet address used for a participation. */
918
- type WalletAddress = Newtype<`0x${string}`, 'WalletAddress'>;
919
- /** Casts a `0x`-prefixed string into a typed {@link WalletAddress}. */
920
- declare const WalletAddress: (value: `0x${string}`) => WalletAddress;
921
1042
  /** Possible participation lifecycle states returned by the API. */
922
1043
  type ParticipationStatus = 'prepared' | 'pending' | 'submitted' | 'completed' | 'failed' | 'remit_submitted' | 'remitted' | 'remit_failed';
923
1044
  /** Domain model for a participation returned by CoinList APIs. */
@@ -936,14 +1057,20 @@ type Participation = {
936
1057
  displayAmount: string;
937
1058
  /** Asset metadata for the participation amount. */
938
1059
  asset: Asset;
939
- /** Funding chain identifier. */
940
- chain: Blockchain;
1060
+ /**
1061
+ * The chain the participation is funded on, or null when frontline names
1062
+ * one this SDK does not model yet. Lenient on purpose: participations are
1063
+ * listed, and one record on a newer chain must not fail the whole list -
1064
+ * the same reason `isChain` drops what it cannot name elsewhere, except a
1065
+ * participation is the user's own money and is kept rather than dropped.
1066
+ */
1067
+ chain: Chain | null;
941
1068
  /** Creation timestamp, if returned by API. */
942
1069
  insertedAt: Date | null;
943
1070
  /** Last update timestamp, if returned by API. */
944
1071
  updatedAt: Date | null;
945
1072
  /** Wallet used for participation, blank values normalized to null. */
946
- walletAddress: WalletAddress | null;
1073
+ walletAddress: EvmWalletAddress | null;
947
1074
  };
948
1075
  /** Parameters required to create a new participation. */
949
1076
  type CreateParticipationParams = {
@@ -951,10 +1078,10 @@ type CreateParticipationParams = {
951
1078
  offerId: OfferId;
952
1079
  /** Offer option selected for participation. */
953
1080
  offerOptionId: OfferOptionId;
954
- /** Blockchain for funding. */
955
- chain: Blockchain;
1081
+ /** Chain the participation is funded on. */
1082
+ chain: EthereumChain;
956
1083
  /** Wallet address that funds the participation. */
957
- walletAddress: WalletAddress;
1084
+ walletAddress: EvmWalletAddress;
958
1085
  /**
959
1086
  * Decimal token amount to participate with (e.g. `"100"` for 100 USDC), NOT
960
1087
  * raw base units. The backend rescales this by the asset's decimals to verify
@@ -977,8 +1104,11 @@ interface ParticipationsPaginationParams extends PaginationParams {
977
1104
 
978
1105
  /**
979
1106
  * Read/write operations for token sales: listing and reading the current user's
980
- * participations, and recording a new one. The on-chain execution flow
981
- * (`executeTokenSale`) is layered on top of this in the client-side namespace.
1107
+ * participations, and recording a new one - e.g. `coinlist.tokenSale.list()`.
1108
+ *
1109
+ * The on-chain purchase, `ClientCoinListTokenSaleNamespace.execute`, is
1110
+ * layered on top of this in the client-side namespace and is not available on
1111
+ * `CoinListServer`, since it needs a wallet to sign with.
982
1112
  */
983
1113
  interface CoinListTokenSaleNamespace {
984
1114
  /**
@@ -1332,7 +1462,10 @@ type BuildOndoSellParams = BuildOndoSwapParamsCore & {
1332
1462
  };
1333
1463
 
1334
1464
  /**
1335
- * Ondo swap reads, plus the write that turns one into a fillable transaction.
1465
+ * Ondo swap reads - whether an asset is tradable right now and what it costs,
1466
+ * e.g. `coinlist.ondo.getQuote({ ... })` - plus the writes that turn a quote
1467
+ * into a fillable transaction. Approving and broadcasting need a wallet, so
1468
+ * they are client-only, on `ClientOndoNamespace`.
1336
1469
  *
1337
1470
  * The two reads are free to poll - neither spends an attestation, so a client
1338
1471
  * may call them while the user edits an order. The two builders are not:
@@ -1486,8 +1619,8 @@ type SwapStatus = {
1486
1619
  */
1487
1620
  type AllowWalletResponse = {
1488
1621
  action: 'broadcast_transaction';
1489
- to: EvmContractAddress;
1490
- data: HexEncodedTransactionData;
1622
+ /** Broadcast as-is: the allow-list call, already encoded. */
1623
+ tx: Tx;
1491
1624
  } | {
1492
1625
  action: 'none';
1493
1626
  alreadyAllowed: boolean;
@@ -1495,7 +1628,9 @@ type AllowWalletResponse = {
1495
1628
 
1496
1629
  /**
1497
1630
  * Read/write operations for the on-chain swap flow: quoting a swap, inspecting
1498
- * contract state, and proving/allow-listing wallet ownership.
1631
+ * contract state, and allow-listing a proven wallet - e.g.
1632
+ * `coinlist.superstate.getOutputToken({ contractAddress, chain })`. The
1633
+ * wallet-driven flows are client-only, on `ClientSuperstateSwapNamespace`.
1499
1634
  *
1500
1635
  * Every read here is a contract call the SDK makes itself. By default those go
1501
1636
  * through CoinList's authenticated JSON-RPC proxy, so a logged-out caller gets
@@ -1569,6 +1704,29 @@ type KycToken = {
1569
1704
  token: string;
1570
1705
  };
1571
1706
 
1707
+ type CreateKycTokenParams = {
1708
+ /**
1709
+ * Sumsub verification level to run. Defaults to the backend's standard
1710
+ * level.
1711
+ */
1712
+ levelName?: KycLevelName;
1713
+ /**
1714
+ * Resets the Sumsub applicant first, so an already-approved level can be
1715
+ * executed again (e.g. to update stale PII). Pass the `kycReset` value from
1716
+ * the requirement status, and never on mid-flow token refreshes.
1717
+ */
1718
+ reset?: boolean;
1719
+ };
1720
+ type SubmitDocumentParams = {
1721
+ /** Currently only `tax_certification` (W-8BEN / W-8BEN-E). */
1722
+ documentType: DocumentType;
1723
+ /**
1724
+ * Signing-form values keyed by the document's DocuSeal field names,
1725
+ * forwarded verbatim to pre-fill the document.
1726
+ */
1727
+ fields: Record<string, string>;
1728
+ };
1729
+
1572
1730
  /** Whether the PII belongs to an individual or a company/trust entity. */
1573
1731
  type PiiKind = 'person' | 'company';
1574
1732
  /** ISO 3166-1 alpha-2 country code (e.g. `'US'`). */
@@ -1628,33 +1786,11 @@ type RequirementStatusInfo = {
1628
1786
  kycReset?: boolean;
1629
1787
  };
1630
1788
 
1631
- type CreateKycTokenParams = {
1632
- /**
1633
- * Sumsub verification level to run. Defaults to the backend's standard
1634
- * level.
1635
- */
1636
- levelName?: KycLevelName;
1637
- /**
1638
- * Resets the Sumsub applicant first, so an already-approved level can be
1639
- * executed again (e.g. to update stale PII). Pass the `kycReset` value from
1640
- * the requirement status, and never on mid-flow token refreshes.
1641
- */
1642
- reset?: boolean;
1643
- };
1644
- type SubmitDocumentParams = {
1645
- /** Currently only `tax_certification` (W-8BEN / W-8BEN-E). */
1646
- documentType: DocumentType;
1647
- /**
1648
- * Signing-form values keyed by the document's DocuSeal field names,
1649
- * forwarded verbatim to pre-fill the document.
1650
- */
1651
- fields: Record<string, string>;
1652
- };
1653
1789
  /**
1654
1790
  * Everything a user must satisfy before they can participate in an offer:
1655
1791
  * reading the checklist and its live statuses, and the operations that satisfy
1656
- * individual requirements — identity verification (KYC) and tax-document
1657
- * signing.
1792
+ * individual requirements - identity verification (KYC) and tax-document
1793
+ * signing. E.g. `coinlist.requirements.statuses(offerId)`.
1658
1794
  *
1659
1795
  * Wallet requirements (`external_wallet`, `whitelisted_wallet`) are satisfied
1660
1796
  * through `WalletsNamespace` instead, since wallet proofs are also used
@@ -1782,11 +1918,13 @@ type RemoveOptionAddressParams = {
1782
1918
  /** Binding to remove, as returned by {@link WalletsNamespace.list}. */
1783
1919
  addressId: OfferOptionAddressId;
1784
1920
  };
1921
+
1785
1922
  /**
1786
1923
  * The user's external wallets: proving ownership of one, binding it to an
1787
- * offer option, and managing those bindings.
1924
+ * offer option, and managing those bindings - e.g.
1925
+ * `coinlist.wallets.list({ offerId, offerOptionId })`.
1788
1926
  *
1789
- * Ownership proof is a provider-agnostic primitive — the swap flow uses the
1927
+ * Ownership proof is a provider-agnostic primitive - the swap flow uses the
1790
1928
  * same challenge to allow-list a wallet — so it lives here rather than being
1791
1929
  * duplicated per product namespace.
1792
1930
  *
@@ -1820,11 +1958,12 @@ interface WalletsNamespace {
1820
1958
 
1821
1959
  /**
1822
1960
  * Reads over CoinList's offers: the catalogue a user can browse, and the full
1823
- * detail of a single offer.
1961
+ * detail of a single offer - e.g. `coinlist.offers.list()` or
1962
+ * `coinlist.offers.get(offerId)`.
1824
1963
  *
1825
1964
  * Every method requires an authenticated user and throws
1826
1965
  * {@link NotAuthenticatedError} otherwise. On the server, the same reads are
1827
- * additionally available with an app-level token — see
1966
+ * additionally available with an app-level token - see
1828
1967
  * `ServerOffersNamespace`.
1829
1968
  */
1830
1969
  interface OffersNamespace {
@@ -1861,7 +2000,8 @@ type GetTokenBalanceParams = {
1861
2000
  /**
1862
2001
  * Generic ERC-20 reads shared across on-chain flows (swap, token sale): the
1863
2002
  * allowance an owner has granted a spender, and the raw token balance an owner
1864
- * holds. These are plain token reads, not tied to any single product flow.
2003
+ * holds. These are plain token reads, not tied to any single product flow -
2004
+ * e.g. `coinlist.erc20.getBalance({ ... })`.
1865
2005
  *
1866
2006
  * Read from the chain rather than from a CoinList endpoint. By default that
1867
2007
  * goes through CoinList's authenticated JSON-RPC proxy, so a logged-out caller
@@ -1883,55 +2023,16 @@ interface Erc20Namespace {
1883
2023
  }
1884
2024
 
1885
2025
  /**
1886
- * An absolute URL to a logo image in the token registry. Registry image URLs
1887
- * are content-fingerprinted and served immutable, so a value is safe to cache
1888
- * for as long as you hold it.
1889
- */
1890
- type TokenLogoUrl = Newtype<string, 'TokenLogoUrl'>;
1891
- declare const TokenLogoUrl: (value: string) => TokenLogoUrl;
1892
- type TokenLogoImage = {
1893
- url: TokenLogoUrl;
1894
- width: number;
1895
- height: number;
1896
- };
1897
- /**
1898
- * `VECTOR` is a single SVG. `RASTER` has webp variants at 32/64/128/256/512px
1899
- * widths (never wider than the original): use the smallest one that covers
1900
- * your render size, or `original` if none does.
1901
- */
1902
- type TokenLogo = {
1903
- kind: 'VECTOR';
1904
- url: TokenLogoUrl;
1905
- } | {
1906
- kind: 'RASTER';
1907
- original: TokenLogoImage;
1908
- variants: TokenLogoImage[];
1909
- };
1910
- /**
1911
- * Display metadata for one token, from CoinList's public token registry.
1912
- *
1913
- * Keyed by `(chain, address)` — never by symbol, which can collide. The
1914
- * registry is curated: a token missing from it is an expected answer, not an
1915
- * error, so lookups return `null` rather than throwing.
1916
- */
1917
- type TokenMetadata = {
1918
- identifier: TokenIdentifier;
1919
- name: string;
1920
- symbol: AssetSymbol;
1921
- decimals: AssetDecimals;
1922
- logo: TokenLogo;
1923
- /** Dark-theme logo; `null` when the registry configures none. */
1924
- logoDark: TokenLogo | null;
1925
- };
1926
-
1927
- /**
1928
- * Token display metadata — name, symbol, decimals, and logos — from
2026
+ * Token display metadata - name, symbol, decimals, and logos - from
1929
2027
  * CoinList's public token registry, keyed by {@link TokenIdentifier} (the
1930
- * same chain + address pairs `Offer.tokens` carries).
2028
+ * same chain + address pairs `Offer.tokens` carries) - e.g.
2029
+ * `coinlist.tokens.get({ chain, address })` for an entry of `Offer.tokens`,
2030
+ * or `coinlist.tokens.list()` for the whole catalogue in one request.
1931
2031
  *
1932
2032
  * Unlike the other namespaces, this one is public: no method requires an
1933
- * authenticated user, and nothing here touches the CoinList API — reads go to
1934
- * the registry's CDN.
2033
+ * authenticated user, and nothing here touches the CoinList API - reads go to
2034
+ * the registry's CDN. On `CoinListServer` it therefore also works with a
2035
+ * read-only `SessionStore`.
1935
2036
  */
1936
2037
  interface TokensNamespace {
1937
2038
  /**
@@ -2505,13 +2606,15 @@ interface Config {
2505
2606
  readonly redirectUri: RedirectUri;
2506
2607
  /**
2507
2608
  * Recommended to leave undefined. Used to change the CoinList environment;
2508
- * default is production.
2609
+ * default is production. An empty string throws a `ValidationError` when
2610
+ * the client is built: omit the field to use the default.
2509
2611
  */
2510
2612
  readonly baseUrl?: string;
2511
2613
  /**
2512
2614
  * Recommended to leave undefined. Overrides the base URL of the public
2513
2615
  * token registry backing `coinlist.tokens`; default is the production
2514
- * registry.
2616
+ * registry. An empty string throws a `ValidationError` when the client is
2617
+ * built: omit the field to use the default.
2515
2618
  */
2516
2619
  readonly tokensBaseUrl?: string;
2517
2620
  /**
@@ -2602,8 +2705,6 @@ interface Config {
2602
2705
  readonly onSessionExpired?: () => Promise<void>;
2603
2706
  }
2604
2707
 
2605
- type ClientCredentialsOAuth = Newtype<OAuthAccessToken, 'ClientCredentialsOAuth'>;
2606
- declare const ClientCredentialsOAuth: (value: OAuthAccessToken) => ClientCredentialsOAuth;
2607
2708
  type OAuthAccessToken = {
2608
2709
  value: string;
2609
2710
  expiresAt: Date;
@@ -2653,4 +2754,4 @@ declare const Seconds: {
2653
2754
  toMillis: (value: Seconds) => Millis;
2654
2755
  };
2655
2756
 
2656
- export { type PinoLoggerOptions as $, AuthorizationCode as A, BlockchainAmount as B, CodeVerifier as C, StablecoinSymbol as D, EthereumChain as E, type Erc20Asset as F, type OfferType as G, type CoinListTokenSaleOfferDetail as H, type OfferDetail as I, CentrifugeVaultLegId as J, type CentrifugeVaultOfferDetail as K, Seconds as L, type AsyncOfferType as M, AsyncOfferDetail as N, type OfferVaultContract as O, type Participation as P, type Offer as Q, type RequirementsNamespace as R, type SwapQuote as S, type TokensNamespace as T, type TokenMetadata as U, type RequirementStatusInfo as V, type WalletError as W, type KycLevelName as X, type RequirementType as Y, type RequirementStatusValue as Z, RequirementId as _, AssetSymbol as a, type GetOndoQuoteParams as a$, type Logger as a0, type BuildCentrifugeVaultBuyParams as a1, type BuildOndoBuyParams as a2, type OndoSwapOfferDetail as a3, type BuildOndoSellParams as a4, type OndoQuote as a5, type OndoQuoteSize as a6, type OndoTradingStatus as a7, AssetDecimals as a8, type SuperstateSwapOfferDetail as a9, type CentrifugeOrderability as aA, type CentrifugePositionStatus as aB, type CentrifugeVaultClaimProceedsTransaction as aC, type CentrifugeVaultClaimTransaction as aD, type CentrifugeVaultOffer as aE, type CentrifugeVaultPosition as aF, type CentrifugeVaultReason as aG, type CentrifugeVaultRedeemPosition as aH, type CentrifugeVaultTransactionCore as aI, type CentrifugeWalletParams as aJ, Chain as aK, type CoinListTokenSaleOffer as aL, type ConnectExternalWalletParams as aM, type CreateKycTokenParams as aN, type CreateParticipationParams as aO, type CreateWalletOwnershipChallengeParams as aP, Cursor as aQ, type DebugEvent as aR, DecimalString as aS, type DocumentFormType as aT, type DocumentSubmissionStatus as aU, type DocumentType as aV, ETHEREUM_CHAINS as aW, EpochMillis as aX, type FaqItem as aY, type FrontlineEventId as aZ, type GetCentrifugeVaultStatusParams as a_, CentrifugeVaultLeg as aa, type CentrifugeVaultRef as ab, OfferOptionAddressId as ac, type DocumentSubmission as ad, type CentrifugeVaultStatus as ae, type TokenIdentifier as af, type OAuthSession as ag, ClientCredentialsOAuth as ah, type PaginationParams as ai, type PaginatedResponse as aj, ClientSecret as ak, type RequestId as al, ClientId as am, RedirectUri as an, CodeChallenge as ao, PKCEState as ap, type SwapStatus as aq, KnownAssetSymbol as ar, type AllowWalletParams as as, type AllowWalletResponse as at, type Asset as au, AssetCode as av, type BaseEvent as aw, Blockchain as ax, type BuildOndoSwapParamsCore as ay, type CentrifugeOrderReason as az, EvmContractAddress as b, type Tx as b$, type GetOndoTradingStatusParams as b0, type GetSwapAuthorizationParams as b1, type GetSwapPreviewParams as b2, type GetSwapQuoteParams as b3, type GetTokenAllowanceParams as b4, type GetTokenBalanceParams as b5, HexEncodedTransactionData as b6, Isin as b7, Iso2CountryCode as b8, type KycToken as b9, type ParticipationsPaginationParams as bA, PauseFlags as bB, type Pii as bC, type PiiAddress as bD, type PiiJurisdiction as bE, type PiiKind as bF, type ProductionLogLevel as bG, type RedactedWalletError as bH, type RemoveOptionAddressParams as bI, type RequirementActionNeededReason as bJ, type RpcConfig as bK, type RpcFailureReason as bL, SOLANA_CHAINS as bM, STABLE_DECIMALS as bN, type SafeEvent as bO, type SafeFields as bP, SolanaChain as bQ, type SubmitDocumentParams as bR, type SuperstateSwapOffer as bS, type SwapContractRef as bT, type SwapPreview as bU, type TermItem as bV, Ticker as bW, type TokenLogo as bX, type TokenLogoImage as bY, TokenLogoUrl as bZ, type TokenRole as b_, type Link as ba, type ListOptionAddressesParams as bb, type LogBinding as bc, type LogBindings as bd, type LogCause as be, type LogLevel as bf, type LogScope as bg, type LogValue as bh, MAX_ASSET_DECIMALS as bi, MAX_UINT_256 as bj, type Milestone as bk, Millis as bl, type Newtype as bm, OAuthRefreshToken as bn, type OfferBase as bo, type OfferDetailBase as bp, type OfferEditorial as bq, type OfferOption as br, OfferOptionSlug as bs, OfferSlug as bt, type OfferToken as bu, type OndoQuoteDuration as bv, type OndoSellOutcome as bw, type OndoSwapOffer as bx, ParticipationId as by, type ParticipationStatus as bz, type CentrifugeVaultBuyTransaction as c, type Uint256 as c0, type UnredactedFields as c1, WalletAddress as c2, type WalletOwnershipChallenge as c3, type WalletOwnershipChallengeParamsBase as c4, type WalletProtocol as c5, assertUint256 as c6, isChain as c7, isOfferType as c8, parseUint256 as c9, type CentrifugeClaimDirection as d, type CentrifugeNamespace as e, OfferId as f, OfferOptionId as g, AssetId as h, type CoinListTokenSaleNamespace as i, type OfferSwapContract as j, type OndoBuyTransaction as k, type OndoSellTransaction as l, type OndoNamespace as m, type OndoSwapTransactionCore as n, type OrderBookSide as o, Bps as p, EvmWalletAddress as q, type SuperstateSwapNamespace as r, type Requirement as s, type WalletChallengeType as t, type OfferOptionAddress as u, type WalletsNamespace as v, type Config as w, type OAuthAccessToken as x, type OffersNamespace as y, type Erc20Namespace as z };
2757
+ export { type CentrifugeVaultStatus as $, type AuthorizationGrant as A, BlockchainAmount as B, type CentrifugeVaultBuyTransaction as C, type Offer as D, EthereumChain as E, type TokenMetadata as F, type OfferDetail as G, type Erc20Asset as H, CentrifugeVaultLegId as I, type CentrifugeVaultOfferDetail as J, Seconds as K, AsyncOfferDetail as L, type RequirementStatusInfo as M, type KycLevelName as N, type OfferVaultContract as O, type Participation as P, type RequirementType as Q, type RequirementsNamespace as R, StablecoinSymbol as S, type TokensNamespace as T, type RequirementStatusValue as U, RequirementId as V, type WalletError as W, type PinoLoggerOptions as X, type Logger as Y, AuthorizationCode as Z, CodeVerifier as _, AssetSymbol as a, type GetCentrifugeVaultStatusParams as a$, type CentrifugeVaultRef as a0, type BuildOndoBuyParams as a1, type OndoSwapOfferDetail as a2, type BuildOndoSellParams as a3, type OndoQuote as a4, type OndoQuoteSize as a5, type OndoTradingStatus as a6, AssetDecimals as a7, type SuperstateSwapOfferDetail as a8, CentrifugeVaultLeg as a9, type CentrifugeOrderReason as aA, type CentrifugeOrderability as aB, type CentrifugeRedeemPosition as aC, CentrifugeShares as aD, type CentrifugeVaultClaimProceedsTransaction as aE, type CentrifugeVaultClaimTransaction as aF, type CentrifugeVaultOffer as aG, type CentrifugeVaultReason as aH, type CentrifugeVaultResolution as aI, type CentrifugeVaultTransactionCore as aJ, type CentrifugeWalletParams as aK, Chain as aL, type CoinListTokenSaleOffer as aM, type ConnectExternalWalletParams as aN, type CreateKycTokenParams as aO, type CreateParticipationParams as aP, type CreateWalletOwnershipChallengeParams as aQ, Cursor as aR, type DebugEvent as aS, DecimalString as aT, type DocumentFormType as aU, type DocumentSubmissionStatus as aV, type DocumentType as aW, ETHEREUM_CHAINS as aX, EpochMillis as aY, type FaqItem as aZ, type FrontlineEventId as a_, type CentrifugeVault as aa, OfferOptionAddressId as ab, type DocumentSubmission as ac, type TokenIdentifier as ad, type OAuthSession as ae, type PaginationParams as af, type PaginatedResponse as ag, ClientSecret as ah, ClientId as ai, RedirectUri as aj, CodeChallenge as ak, PKCEState as al, type RequestId as am, type SwapStatus as an, KnownAssetSymbol as ao, type AllowWalletParams as ap, type AllowWalletResponse as aq, type Asset as ar, AssetCode as as, AssetId as at, type AsyncOfferType as au, type BaseEvent as av, type BuildCentrifugeVaultBuyParams as aw, type BuildOndoSwapParamsCore as ax, CentrifugeAssets as ay, type CentrifugeDepositPosition as az, EvmContractAddress as b, type TokenLogo as b$, type GetOndoQuoteParams as b0, type GetOndoTradingStatusParams as b1, type GetSwapAuthorizationParams as b2, type GetSwapPreviewParams as b3, type GetSwapQuoteParams as b4, type GetTokenAllowanceParams as b5, type GetTokenBalanceParams as b6, HexEncodedTransactionData as b7, Isin as b8, Iso2CountryCode as b9, type OndoSwapOffer as bA, ParticipationId as bB, type ParticipationStatus as bC, type ParticipationsPaginationParams as bD, PauseFlags as bE, type Pii as bF, type PiiAddress as bG, type PiiJurisdiction as bH, type PiiKind as bI, type ProductionLogLevel as bJ, type ReadCentrifugePositionParams as bK, type RedactedWalletError as bL, type RemoveOptionAddressParams as bM, type RequirementActionNeededReason as bN, type RpcConfig as bO, type RpcFailureReason as bP, SOLANA_CHAINS as bQ, STABLE_DECIMALS as bR, type SafeEvent as bS, type SafeFields as bT, SolanaChain as bU, type SubmitDocumentParams as bV, type SuperstateSwapOffer as bW, type SwapContractRef as bX, type SwapPreview as bY, type TermItem as bZ, Ticker as b_, type KycToken as ba, type Link as bb, type ListOptionAddressesParams as bc, type LogBinding as bd, type LogBindings as be, type LogCause as bf, type LogLevel as bg, type LogScope as bh, type LogValue as bi, MAX_ASSET_DECIMALS as bj, MAX_UINT_256 as bk, type Milestone as bl, Millis as bm, type Newtype as bn, OAuthRefreshToken as bo, type OfferBase as bp, type OfferDetailBase as bq, type OfferEditorial as br, type OfferFundingContract as bs, type OfferOption as bt, OfferOptionSlug as bu, OfferSlug as bv, type OfferToken as bw, type OfferType as bx, type OndoQuoteDuration as by, type OndoSellOutcome as bz, type CentrifugeClaimDirection as c, type TokenLogoImage as c0, TokenLogoUrl as c1, type TokenRole as c2, type Tx as c3, type Uint256 as c4, type UnredactedFields as c5, type WalletOwnershipChallenge as c6, type WalletOwnershipChallengeParamsBase as c7, type WalletProtocol as c8, assertUint256 as c9, isChain as ca, isOfferType as cb, parseUint256 as cc, resolveCentrifugeVaults as cd, type CentrifugeNamespace as d, type CoinListTokenSaleOfferDetail as e, OfferOptionId as f, type CoinListTokenSaleNamespace as g, type OfferSwapContract as h, type OndoBuyTransaction as i, type OndoSellTransaction as j, type OndoNamespace as k, type OndoSwapTransactionCore as l, type OrderBookSide as m, OfferId as n, type SwapQuote as o, Bps as p, EvmWalletAddress as q, type SuperstateSwapNamespace as r, type Requirement as s, type WalletChallengeType as t, type OfferOptionAddress as u, type WalletsNamespace as v, type Config as w, type OAuthAccessToken as x, type OffersNamespace as y, type Erc20Namespace as z };