@coinlist-co/react 0.5.1 → 0.9.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/{chunk-5E3P7AMH.js → chunk-AAER5LOL.js} +3 -1
- package/dist/chunk-AAER5LOL.js.map +1 -0
- package/dist/chunk-I5YTJ5SL.js +644 -0
- package/dist/chunk-I5YTJ5SL.js.map +1 -0
- package/dist/{chunk-N3WBC2VS.js → chunk-MKCOK3DF.js} +68 -57
- package/dist/chunk-MKCOK3DF.js.map +1 -0
- package/dist/chunk-Z2HAA2TI.js +768 -0
- package/dist/chunk-Z2HAA2TI.js.map +1 -0
- package/dist/client/index.cjs +3360 -556
- package/dist/client/index.cjs.map +1 -1
- package/dist/client/index.d.cts +921 -18
- package/dist/client/index.d.ts +921 -18
- package/dist/client/index.js +2275 -392
- package/dist/client/index.js.map +1 -1
- package/dist/collections-B84Vw55t.d.cts +28 -0
- package/dist/collections-BQbFJS3g.d.ts +28 -0
- package/dist/requirement-C2w45Q11.d.cts +969 -0
- package/dist/requirement-C2w45Q11.d.ts +969 -0
- package/dist/server/index.cjs +521 -37
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +116 -9
- package/dist/server/index.d.ts +116 -9
- package/dist/server/index.js +95 -28
- package/dist/server/index.js.map +1 -1
- package/dist/shared/index.cjs +1264 -42
- package/dist/shared/index.cjs.map +1 -1
- package/dist/shared/index.d.cts +644 -3
- package/dist/shared/index.d.ts +644 -3
- package/dist/shared/index.js +220 -5
- package/dist/shared/index.js.map +1 -1
- package/package.json +33 -30
- package/dist/chunk-5E3P7AMH.js.map +0 -1
- package/dist/chunk-CRACFEJ4.js +0 -17
- package/dist/chunk-CRACFEJ4.js.map +0 -1
- package/dist/chunk-N3WBC2VS.js.map +0 -1
- package/dist/chunk-V6WO67RO.js +0 -311
- package/dist/chunk-V6WO67RO.js.map +0 -1
- package/dist/client/styles.css +0 -2
- package/dist/requirement-BEO42QOr.d.cts +0 -387
- package/dist/requirement-BEO42QOr.d.ts +0 -387
package/dist/client/index.d.cts
CHANGED
|
@@ -1,7 +1,204 @@
|
|
|
1
1
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
2
|
import * as react from 'react';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { Hex, Abi, Hash, TransactionReceipt } from 'viem';
|
|
5
|
+
import { E as EvmWalletAddress, a as EthereumChain, C as CoinListSwapNamespace, O as OfferId, b as EvmContractAddress, B as Bps, c as BlockchainAmount, S as SwapNamespaceImpl, A as AuthorizationCode, d as CodeVerifier, e as Config, f as OAuthAccessToken, g as Offer, P as PaginationParams, h as PaginatedResponse, i as OfferDetail, j as Participation, k as ParticipationsPaginationParams, l as ParticipationId, m as CreateParticipationParams, n as CreateWalletOwnershipChallengeParams, W as WalletOwnershipChallenge, o as ConnectExternalWalletParams, p as OfferOptionAddress, q as OfferOptionId, r as OfferOptionAddressId, R as Requirement, s as RequirementStatusInfo, t as Pii, D as DocumentType, u as DocumentSubmission, K as KycLevelName, v as KycToken, w as WalletChallengeType, x as RequirementType, y as RequirementStatusValue, z as Erc20Asset, F as AssetDecimals, G as StablecoinSymbol } from '../requirement-C2w45Q11.cjs';
|
|
6
|
+
import { S as SwapQuote, N as NonEmptyArray } from '../collections-B84Vw55t.cjs';
|
|
7
|
+
|
|
8
|
+
type WriteContractParams = {
|
|
9
|
+
abi: Abi;
|
|
10
|
+
address: `0x${string}`;
|
|
11
|
+
functionName: string;
|
|
12
|
+
args?: readonly unknown[];
|
|
13
|
+
value?: bigint;
|
|
14
|
+
chain: EthereumChain;
|
|
15
|
+
};
|
|
16
|
+
type BroadcastTxParams = {
|
|
17
|
+
to: `0x${string}`;
|
|
18
|
+
data: Hex;
|
|
19
|
+
chain: EthereumChain;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* The signing-only wallet capability: address + `signMessage`. This is all the
|
|
23
|
+
* external-wallet ownership proof needs (see `useConnectWallet`), so hosts can
|
|
24
|
+
* satisfy that flow without implementing on-chain capabilities. The richer
|
|
25
|
+
* {@link EvmWallet} extends this for swap flows.
|
|
26
|
+
*
|
|
27
|
+
* SDK users implement this against their own wallet stack (e.g. viem, wagmi,
|
|
28
|
+
* Privy). `signMessage` throws on failure and the SDK classifies it.
|
|
29
|
+
*/
|
|
30
|
+
interface EvmSigner {
|
|
31
|
+
readonly address: EvmWalletAddress;
|
|
32
|
+
signMessage(message: string): Promise<Hex>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The full on-chain wallet the SDK needs to run the swap flows: an
|
|
36
|
+
* {@link EvmSigner} plus contract writes, raw-tx broadcast, and confirmation.
|
|
37
|
+
* SDK users implement this against their own wallet stack (e.g. viem, wagmi,
|
|
38
|
+
* Privy).
|
|
39
|
+
*
|
|
40
|
+
* Methods throw on failure. The SDK catches and classifies the thrown error
|
|
41
|
+
* (viem's `UserRejectedRequestError`, `InsufficientFundsError`, timeouts, …)
|
|
42
|
+
* into a typed {@link WalletError}, so implementers can simply let their wallet
|
|
43
|
+
* library's errors propagate.
|
|
44
|
+
*/
|
|
45
|
+
interface EvmWallet extends EvmSigner {
|
|
46
|
+
writeContract(params: WriteContractParams): Promise<Hash>;
|
|
47
|
+
broadcastRawTx(params: BroadcastTxParams): Promise<Hash>;
|
|
48
|
+
awaitTx(hash: Hash, chain: EthereumChain): Promise<TransactionReceipt>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* A classified wallet/transaction failure. The SDK derives this from whatever
|
|
53
|
+
* the {@link EvmWallet} throws, so consumers get a stable, typed error
|
|
54
|
+
* shape regardless of the underlying wallet library.
|
|
55
|
+
*/
|
|
56
|
+
type WalletError = {
|
|
57
|
+
type: 'user_rejected';
|
|
58
|
+
} | {
|
|
59
|
+
type: 'insufficient_funds';
|
|
60
|
+
} | {
|
|
61
|
+
type: 'contract_reverted';
|
|
62
|
+
reason: string;
|
|
63
|
+
} | {
|
|
64
|
+
type: 'timeout';
|
|
65
|
+
hash: Hash;
|
|
66
|
+
} | {
|
|
67
|
+
type: 'unknown';
|
|
68
|
+
cause: unknown;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Classifies an error thrown by an {@link EvmWallet} into a typed
|
|
72
|
+
* {@link WalletError}. Pass the transaction `hash` when awaiting a receipt so a
|
|
73
|
+
* timeout can be reported against it.
|
|
74
|
+
*/
|
|
75
|
+
declare function classifyWalletError(error: unknown, ctx?: {
|
|
76
|
+
hash?: Hash;
|
|
77
|
+
}): WalletError;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Progress phases emitted by {@link executeSwap}, in the order they occur. An
|
|
81
|
+
* allowance that already covers the swap skips the approval phases.
|
|
82
|
+
*/
|
|
83
|
+
type SwapExecutionPhase = 'checking-status' | 'checking-allowance' | 'resetting-allowance' | 'confirming-allowance-reset' | 'approving' | 'confirming-approval' | 'swapping' | 'confirming-swap';
|
|
84
|
+
/** A step-tagged reason {@link executeSwap} failed. */
|
|
85
|
+
type SwapExecutionError = {
|
|
86
|
+
step: 'status-check';
|
|
87
|
+
} | {
|
|
88
|
+
step: 'swap-stopped';
|
|
89
|
+
} | {
|
|
90
|
+
step: 'allowance-check';
|
|
91
|
+
} | {
|
|
92
|
+
step: 'approval';
|
|
93
|
+
cause: WalletError;
|
|
94
|
+
} | {
|
|
95
|
+
step: 'approval-reverted';
|
|
96
|
+
} | {
|
|
97
|
+
step: 'swap';
|
|
98
|
+
cause: WalletError;
|
|
99
|
+
} | {
|
|
100
|
+
step: 'swap-reverted';
|
|
101
|
+
};
|
|
102
|
+
type SwapExecutionResult = {
|
|
103
|
+
type: 'success';
|
|
104
|
+
swapTxHash: Hash;
|
|
105
|
+
inputAmount: BlockchainAmount;
|
|
106
|
+
fee: BlockchainAmount;
|
|
107
|
+
outputAmount: BlockchainAmount;
|
|
108
|
+
pricePerShare: BlockchainAmount | null;
|
|
109
|
+
recipientAddress: EvmWalletAddress;
|
|
110
|
+
} | {
|
|
111
|
+
type: 'error';
|
|
112
|
+
error: SwapExecutionError;
|
|
113
|
+
};
|
|
114
|
+
type ExecuteSwapParams = {
|
|
115
|
+
swap: CoinListSwapNamespace;
|
|
116
|
+
wallet: EvmWallet;
|
|
117
|
+
contractAddress: EvmContractAddress;
|
|
118
|
+
chain: EthereumChain;
|
|
119
|
+
inputTokenAddress: EvmContractAddress;
|
|
120
|
+
quote: SwapQuote;
|
|
121
|
+
slippageBps: Bps;
|
|
122
|
+
onProgress?: (phase: SwapExecutionPhase) => void;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Executes an on-chain swap end-to-end: verifies the contract is not paused,
|
|
126
|
+
* ensures a sufficient ERC-20 allowance (resetting a stale non-zero allowance
|
|
127
|
+
* first for USDT-style tokens), submits the swap, waits for it to mine, and
|
|
128
|
+
* decodes the confirmed output from the `Swapped` event (falling back to the
|
|
129
|
+
* quote's estimate).
|
|
130
|
+
*
|
|
131
|
+
* The wallet is only asked to sign after all read-only checks pass, so a user
|
|
132
|
+
* never signs a transaction the swap would revert. Progress is reported via
|
|
133
|
+
* `onProgress` for consumers rendering loading states.
|
|
134
|
+
*/
|
|
135
|
+
declare function executeSwap(params: ExecuteSwapParams): Promise<SwapExecutionResult>;
|
|
136
|
+
/** Progress phases emitted by {@link authorizeWallet}, in order. */
|
|
137
|
+
type WalletAuthorizationPhase = 'checking-authorization' | 'requesting-challenge' | 'signing-message' | 'submitting-signature' | 'broadcasting-transaction' | 'awaiting-confirmation' | 'verifying-authorization';
|
|
138
|
+
/** A step-tagged reason {@link authorizeWallet} failed. */
|
|
139
|
+
type WalletAuthorizationError = {
|
|
140
|
+
step: 'authorization-check';
|
|
141
|
+
} | {
|
|
142
|
+
step: 'challenge-request';
|
|
143
|
+
} | {
|
|
144
|
+
step: 'signing';
|
|
145
|
+
cause: WalletError;
|
|
146
|
+
} | {
|
|
147
|
+
step: 'allow-wallet';
|
|
148
|
+
} | {
|
|
149
|
+
step: 'broadcast';
|
|
150
|
+
cause: WalletError;
|
|
151
|
+
} | {
|
|
152
|
+
step: 'not-authorized';
|
|
153
|
+
};
|
|
154
|
+
type WalletAuthorizationResult = {
|
|
155
|
+
type: 'success';
|
|
156
|
+
} | {
|
|
157
|
+
type: 'error';
|
|
158
|
+
error: WalletAuthorizationError;
|
|
159
|
+
};
|
|
160
|
+
type AuthorizeWalletParams = {
|
|
161
|
+
swap: CoinListSwapNamespace;
|
|
162
|
+
wallet: EvmWallet;
|
|
163
|
+
offerId: OfferId;
|
|
164
|
+
contractAddress: EvmContractAddress;
|
|
165
|
+
chain: EthereumChain;
|
|
166
|
+
onProgress?: (phase: WalletAuthorizationPhase) => void;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* Proves ownership of a wallet and allow-lists it for an offer's swap: checks
|
|
170
|
+
* whether it is already authorized, otherwise signs a challenge, submits it,
|
|
171
|
+
* broadcasts any returned allow-list transaction, and re-verifies on-chain.
|
|
172
|
+
*
|
|
173
|
+
* Wallet selection/connection is the app's responsibility — this operates on an
|
|
174
|
+
* already-connected {@link EvmWallet}. Progress is reported via
|
|
175
|
+
* `onProgress`.
|
|
176
|
+
*/
|
|
177
|
+
declare function authorizeWallet(params: AuthorizeWalletParams): Promise<WalletAuthorizationResult>;
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* The client-side swap namespace: everything the shared
|
|
181
|
+
* {@link CoinListSwapNamespace} reads/writes over the API, plus the on-chain
|
|
182
|
+
* flows that drive a wallet (`executeSwap`, `authorizeWallet`). The flows take
|
|
183
|
+
* the wallet and addresses per call; the namespace itself supplies the API
|
|
184
|
+
* reads they depend on.
|
|
185
|
+
*/
|
|
186
|
+
interface CoinListClientSwapNamespace extends CoinListSwapNamespace {
|
|
187
|
+
/**
|
|
188
|
+
* Runs an on-chain swap end-to-end against the given wallet: status check,
|
|
189
|
+
* ERC-20 allowance/approval, swap submission, and receipt confirmation.
|
|
190
|
+
*/
|
|
191
|
+
executeSwap(params: Omit<ExecuteSwapParams, 'swap'>): Promise<SwapExecutionResult>;
|
|
192
|
+
/**
|
|
193
|
+
* Proves ownership of a wallet and allow-lists it for an offer's swap,
|
|
194
|
+
* broadcasting any required allow-list transaction.
|
|
195
|
+
*/
|
|
196
|
+
authorizeWallet(params: Omit<AuthorizeWalletParams, 'swap'>): Promise<WalletAuthorizationResult>;
|
|
197
|
+
}
|
|
198
|
+
declare class ClientSwapNamespaceImpl extends SwapNamespaceImpl implements CoinListClientSwapNamespace {
|
|
199
|
+
executeSwap(params: Omit<ExecuteSwapParams, 'swap'>): Promise<SwapExecutionResult>;
|
|
200
|
+
authorizeWallet(params: Omit<AuthorizeWalletParams, 'swap'>): Promise<WalletAuthorizationResult>;
|
|
201
|
+
}
|
|
5
202
|
|
|
6
203
|
type AuthState = 'unknown' | 'logged-in' | 'logged-out';
|
|
7
204
|
/** Discriminated error reasons from {@link CoinListClient.completeOAuth}. */
|
|
@@ -132,6 +329,44 @@ interface CoinListClient {
|
|
|
132
329
|
* {@link NotAuthenticatedError}.
|
|
133
330
|
*/
|
|
134
331
|
createParticipation(params: CreateParticipationParams): Promise<Participation>;
|
|
332
|
+
/**
|
|
333
|
+
* Creates a single-use wallet-ownership challenge for the given wallet and
|
|
334
|
+
* chain. The user signs the returned {@link WalletOwnershipChallenge.message}
|
|
335
|
+
* with their wallet, then passes the signature to
|
|
336
|
+
* {@link connectExternalWallet}.
|
|
337
|
+
*
|
|
338
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
339
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
340
|
+
* {@link NotAuthenticatedError}.
|
|
341
|
+
*/
|
|
342
|
+
createWalletOwnershipChallenge(params: CreateWalletOwnershipChallengeParams): Promise<WalletOwnershipChallenge>;
|
|
343
|
+
/**
|
|
344
|
+
* Connects a proven external wallet to an offer option, using a signature of
|
|
345
|
+
* a challenge from {@link createWalletOwnershipChallenge}.
|
|
346
|
+
*
|
|
347
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
348
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
349
|
+
* {@link NotAuthenticatedError}.
|
|
350
|
+
*/
|
|
351
|
+
connectExternalWallet(offerId: OfferId, params: ConnectExternalWalletParams): Promise<OfferOptionAddress>;
|
|
352
|
+
/**
|
|
353
|
+
* Lists the user's proven wallet bindings for a single offer option (the
|
|
354
|
+
* bound address for `external_wallet`, or all whitelisted wallets for
|
|
355
|
+
* `whitelisted_wallet`).
|
|
356
|
+
*
|
|
357
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
358
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
359
|
+
* {@link NotAuthenticatedError}.
|
|
360
|
+
*/
|
|
361
|
+
listOptionAddresses(offerId: OfferId, offerOptionId: OfferOptionId): Promise<OfferOptionAddress[]>;
|
|
362
|
+
/**
|
|
363
|
+
* Removes one of the user's wallet bindings and returns the removed binding.
|
|
364
|
+
*
|
|
365
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
366
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
367
|
+
* {@link NotAuthenticatedError}.
|
|
368
|
+
*/
|
|
369
|
+
removeOptionAddress(offerId: OfferId, addressId: OfferOptionAddressId): Promise<OfferOptionAddress>;
|
|
135
370
|
/**
|
|
136
371
|
* Fetches the requirements for all options of a given offer, grouped by option ID.
|
|
137
372
|
*
|
|
@@ -148,15 +383,63 @@ interface CoinListClient {
|
|
|
148
383
|
* {@link NotAuthenticatedError}.
|
|
149
384
|
*/
|
|
150
385
|
fetchRequirementStatuses(offerId: OfferId): Promise<RequirementStatusInfo[]>;
|
|
386
|
+
/**
|
|
387
|
+
* Fetches the current user's PII, used to pre-fill tax forms such as the
|
|
388
|
+
* W-8BEN. Fields the entity hasn't provided are `null`.
|
|
389
|
+
*
|
|
390
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
391
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
392
|
+
* {@link NotAuthenticatedError}.
|
|
393
|
+
*/
|
|
394
|
+
fetchPii(): Promise<Pii>;
|
|
395
|
+
/**
|
|
396
|
+
* Starts (or resumes) a document signing submission for the given type
|
|
397
|
+
* (currently only `tax_certification`, e.g. W-8BEN/W-8BEN-E). `fields` are
|
|
398
|
+
* signing-form values keyed by the document's DocuSeal field names,
|
|
399
|
+
* forwarded verbatim to Passport to pre-fill the document.
|
|
400
|
+
*
|
|
401
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
402
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
403
|
+
* {@link NotAuthenticatedError}.
|
|
404
|
+
*/
|
|
405
|
+
submitDocument(documentType: DocumentType, fields: Record<string, string>): Promise<DocumentSubmission>;
|
|
406
|
+
/**
|
|
407
|
+
* Creates a short-lived Sumsub WebSDK access token for the current user so an
|
|
408
|
+
* identity verification (KYC) flow can be started, e.g. by the
|
|
409
|
+
* `IdentityVerification` component. `levelName` selects the Sumsub
|
|
410
|
+
* verification level; defaults to the backend's standard level. `reset`
|
|
411
|
+
* resets the Sumsub applicant first, so an already-approved level can be
|
|
412
|
+
* executed again (e.g. to update stale PII) — pass the `kycReset` value
|
|
413
|
+
* from the requirement status, and never on mid-flow token refreshes.
|
|
414
|
+
*
|
|
415
|
+
* This method must be called only when the user's {@link AuthState} is
|
|
416
|
+
* `'logged-in'`. If the user is not authenticated, it throws
|
|
417
|
+
* {@link NotAuthenticatedError}.
|
|
418
|
+
*/
|
|
419
|
+
createKycToken(levelName?: KycLevelName, reset?: boolean): Promise<KycToken>;
|
|
151
420
|
/**
|
|
152
421
|
* Opens the CoinList page for completing a given requirement in a new tab.
|
|
153
|
-
* For `jurisdiction` requirements there is no CTA, so this
|
|
422
|
+
* For `jurisdiction` and `document` requirements there is no CTA, so this
|
|
423
|
+
* is a no-op — `document` requires the caller to use {@link fetchPii} and
|
|
424
|
+
* {@link submitDocument} directly (e.g. via a custom
|
|
425
|
+
* `onRequirementActionOverride`).
|
|
154
426
|
*/
|
|
155
427
|
handleRequirement(requirement: Requirement): void;
|
|
156
428
|
/**
|
|
157
429
|
* Opens the CoinList support ticket page in a new tab.
|
|
158
430
|
*/
|
|
159
431
|
contactSupport(): void;
|
|
432
|
+
/**
|
|
433
|
+
* On-chain swap operations: quoting a swap, reading swap-contract state and
|
|
434
|
+
* token allowances, and proving/allow-listing wallet ownership — e.g.
|
|
435
|
+
* `coinlist.swap.getOutputToken({ contractAddress, chain })`.
|
|
436
|
+
*
|
|
437
|
+
* The API-backed reads must be called only when the user's {@link AuthState}
|
|
438
|
+
* is `'logged-in'`; if the user is not authenticated, they throw
|
|
439
|
+
* {@link NotAuthenticatedError}. The on-chain flows (`executeSwap`,
|
|
440
|
+
* `authorizeWallet`) additionally drive a caller-supplied wallet.
|
|
441
|
+
*/
|
|
442
|
+
readonly swap: CoinListClientSwapNamespace;
|
|
160
443
|
}
|
|
161
444
|
declare function createCoinListClient(config: ClientConfig): CoinListClient;
|
|
162
445
|
|
|
@@ -170,9 +453,48 @@ type CoinListProviderProps = {
|
|
|
170
453
|
children: ReactNode;
|
|
171
454
|
};
|
|
172
455
|
/**
|
|
173
|
-
* Provide CoinList (api + config) to the tree
|
|
456
|
+
* Provide CoinList (api + config) to the tree WITHOUT any styling. Renders only the
|
|
457
|
+
* React context: no DOM, no <style>, no .clco-sdk-root. Safe to mount app-wide:
|
|
458
|
+
* it has zero visual impact on the host's own pages.
|
|
459
|
+
*
|
|
460
|
+
* Use this when you need useCoinList() available app-wide. SDK visual components
|
|
461
|
+
* self-scope, so you do not need to wrap them in {@link CoinListStyleScope}.
|
|
462
|
+
* {@link CoinListProvider} is an identical alias with a friendlier name.
|
|
174
463
|
*/
|
|
175
|
-
declare function
|
|
464
|
+
declare function CoinListContextProvider({ config, children, }: CoinListProviderProps): react_jsx_runtime.JSX.Element;
|
|
465
|
+
/**
|
|
466
|
+
* The provider to mount once at your app root. Provides the CoinList client context
|
|
467
|
+
* to the whole tree with zero visual impact: it renders no DOM, no `<style>`, and no
|
|
468
|
+
* `.clco-sdk-root`, so it never styles the host's own pages. SDK visual components
|
|
469
|
+
* (CoinListSignInCard, OffersGrid, ...) style themselves, so you do not need to wrap
|
|
470
|
+
* them in {@link CoinListStyleScope}.
|
|
471
|
+
*
|
|
472
|
+
* Alias of {@link CoinListContextProvider}: identical behavior, friendlier name for
|
|
473
|
+
* the common "mount one provider" case.
|
|
474
|
+
*/
|
|
475
|
+
declare const CoinListProvider: typeof CoinListContextProvider;
|
|
476
|
+
|
|
477
|
+
type CoinListStyleScopeProps = {
|
|
478
|
+
children: ReactNode;
|
|
479
|
+
};
|
|
480
|
+
/**
|
|
481
|
+
* Render the SDK styling wrapper: the Inter font links and the .clco-sdk-root div
|
|
482
|
+
* with the self-contained, scoped <style> injection. Mount this around SDK visual
|
|
483
|
+
* components only. Keep it off the host's own pages to avoid styling them.
|
|
484
|
+
*
|
|
485
|
+
* This component self-injects all SDK styles via a <style> tag so consumers do not
|
|
486
|
+
* need to import any CSS files or configure their bundler. Styles are fully scoped
|
|
487
|
+
* to .clco-sdk-root and do not leak to the host page. On React 19 the <style> is a
|
|
488
|
+
* hoistable resource (href + precedence), so it is lifted to <head> and deduplicated
|
|
489
|
+
* across every scope on the page; on React 18 the extra attributes are inert and it
|
|
490
|
+
* renders in place.
|
|
491
|
+
*
|
|
492
|
+
* The wrapper div uses `display: contents` so it generates no box of its own, so an
|
|
493
|
+
* SDK component wrapped by this stays the layout element in the host's flex/grid.
|
|
494
|
+
* Inheritance (font, color, custom-property tokens) and the scoped descendant reset
|
|
495
|
+
* (`.clco-sdk-root *`) still apply through it.
|
|
496
|
+
*/
|
|
497
|
+
declare function CoinListStyleScope({ children }: CoinListStyleScopeProps): react_jsx_runtime.JSX.Element;
|
|
176
498
|
|
|
177
499
|
interface CoinListSignInCardProps {
|
|
178
500
|
state?: 'idle' | 'error';
|
|
@@ -189,9 +511,11 @@ interface CoinListSignInCardProps {
|
|
|
189
511
|
/**
|
|
190
512
|
* Sign-in card that prompts the user to authenticate with CoinList.
|
|
191
513
|
*
|
|
192
|
-
* Use this component
|
|
193
|
-
* By default, clicking the sign-in button starts the CoinList
|
|
194
|
-
* {@link CoinListClient#startOAuth}; pass `onSignIn` to override.
|
|
514
|
+
* Use this component inside a tree wrapped by {@link CoinListProvider} (for the
|
|
515
|
+
* client context). By default, clicking the sign-in button starts the CoinList
|
|
516
|
+
* OAuth flow via {@link CoinListClient#startOAuth}; pass `onSignIn` to override.
|
|
517
|
+
*
|
|
518
|
+
* Self-scoped: renders fully styled on its own, no `CoinListStyleScope` needed.
|
|
195
519
|
*/
|
|
196
520
|
declare function CoinListSignInCard({ state, onSignIn, onClose, className, }?: CoinListSignInCardProps): ReactNode;
|
|
197
521
|
|
|
@@ -214,6 +538,10 @@ interface Props {
|
|
|
214
538
|
/** Optional className applied to an outer wrapper element. */
|
|
215
539
|
containerClassName?: string;
|
|
216
540
|
}
|
|
541
|
+
/**
|
|
542
|
+
* Offer card. Self-scoped: renders fully styled on its own, with no
|
|
543
|
+
* `CoinListStyleScope` needed. Also composed by {@link OffersGrid}.
|
|
544
|
+
*/
|
|
217
545
|
declare function OfferCard({ offer, onClick, className, containerClassName, }: Props): ReactNode;
|
|
218
546
|
|
|
219
547
|
interface OffersGridProps {
|
|
@@ -246,8 +574,239 @@ interface OffersGridProps {
|
|
|
246
574
|
* Uses `loading` / `error` slots when provided; otherwise renders standard
|
|
247
575
|
* fallback loading and error states. Offer cards are interactive only when
|
|
248
576
|
* `onOfferClick` is provided.
|
|
577
|
+
*
|
|
578
|
+
* Self-scoped: renders fully styled on its own, with no `CoinListStyleScope` needed.
|
|
579
|
+
*/
|
|
580
|
+
declare function OffersGrid(props?: OffersGridProps): ReactNode;
|
|
581
|
+
|
|
582
|
+
/** Load state of a connected-wallet list. */
|
|
583
|
+
type WalletsStatus = 'ready' | 'loading' | 'error';
|
|
584
|
+
/** A single connected wallet, shaped for display in {@link ConnectedWalletList}. */
|
|
585
|
+
type ConnectedWalletUi = {
|
|
586
|
+
/** Id of the connected wallet, used to remove it. */
|
|
587
|
+
id: string;
|
|
588
|
+
/** Full wallet address (for `title`/`aria`). */
|
|
589
|
+
address: string;
|
|
590
|
+
/** Shortened address for display (e.g. `0x1234…abcd`). */
|
|
591
|
+
shortAddress: string;
|
|
592
|
+
};
|
|
593
|
+
interface ConnectedWalletListProps {
|
|
594
|
+
wallets: ConnectedWalletUi[];
|
|
595
|
+
/**
|
|
596
|
+
* Removes a connected wallet by id. May return a promise; the row shows a
|
|
597
|
+
* removing state until it settles and surfaces an inline error on rejection.
|
|
598
|
+
* `null`/omitted hides the remove control (read-only list).
|
|
599
|
+
*/
|
|
600
|
+
onRemove?: ((id: string) => void | Promise<void>) | null;
|
|
601
|
+
/** Opens the connect flow to add another wallet. Omit to hide the button. */
|
|
602
|
+
onAdd?: (() => void) | null;
|
|
603
|
+
/** Label for the add button. Defaults to "Add wallet". */
|
|
604
|
+
addLabel?: string;
|
|
605
|
+
/**
|
|
606
|
+
* Load state of the wallets. `'loading'`/`'error'` render a status message so
|
|
607
|
+
* a failed or in-flight fetch is not mistaken for a genuinely empty list.
|
|
608
|
+
* Defaults to `'ready'`.
|
|
609
|
+
*/
|
|
610
|
+
status?: WalletsStatus;
|
|
611
|
+
className?: string;
|
|
612
|
+
}
|
|
613
|
+
/**
|
|
614
|
+
* Presentational list of a user's connected wallets for a whitelisted-wallet
|
|
615
|
+
* requirement: each row shows the address with an inline two-step remove
|
|
616
|
+
* confirmation, plus an optional "Add wallet" button. Self-contained — holds
|
|
617
|
+
* only per-row confirm/removing/error UI state; all data and side effects come
|
|
618
|
+
* from props.
|
|
619
|
+
*/
|
|
620
|
+
declare function ConnectedWalletList({ wallets, onRemove, onAdd, addLabel, status, className, }: ConnectedWalletListProps): ReactNode;
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* The host-provided wallet the ownership flow signs with: the signing-only
|
|
624
|
+
* {@link EvmSigner} plus the {@link EthereumChain} the signature is proven on.
|
|
625
|
+
* `chain` rides on the wallet (not the offer) because the binding is
|
|
626
|
+
* chain-agnostic: it only records which EVM chain signed.
|
|
627
|
+
*/
|
|
628
|
+
type ConnectWallet = EvmSigner & {
|
|
629
|
+
readonly chain: EthereumChain;
|
|
630
|
+
};
|
|
631
|
+
/**
|
|
632
|
+
* Machine-readable classification of a connect-wallet failure, so consumers can
|
|
633
|
+
* branch on the cause (e.g. hide a retry affordance on a terminal failure)
|
|
634
|
+
* instead of pattern-matching a display string.
|
|
635
|
+
*/
|
|
636
|
+
type ConnectWalletErrorCode = 'not_authenticated' | 'user_rejected' | 'wallet_not_whitelisted' | 'max_wallets_reached' | 'unknown';
|
|
637
|
+
/**
|
|
638
|
+
* A classified connect-wallet failure. `retryable` is false when re-signing the
|
|
639
|
+
* same wallet can never succeed (a terminal binding rejection, or no signed-in
|
|
640
|
+
* session). Display copy is the caller's concern, kept out of the core.
|
|
641
|
+
*/
|
|
642
|
+
type ConnectWalletFlowError = {
|
|
643
|
+
code: ConnectWalletErrorCode;
|
|
644
|
+
retryable: boolean;
|
|
645
|
+
};
|
|
646
|
+
/** Progress phases emitted by {@link connectExternalWalletFlow}, in order. */
|
|
647
|
+
type ConnectWalletPhase = 'requesting-challenge' | 'signing-message' | 'submitting-signature';
|
|
648
|
+
type ConnectWalletFlowResult = {
|
|
649
|
+
type: 'success';
|
|
650
|
+
binding: OfferOptionAddress;
|
|
651
|
+
} | {
|
|
652
|
+
type: 'cancelled';
|
|
653
|
+
} | {
|
|
654
|
+
type: 'error';
|
|
655
|
+
error: ConnectWalletFlowError;
|
|
656
|
+
};
|
|
657
|
+
/** The client surface the flow actually depends on, kept narrow on purpose. */
|
|
658
|
+
type ConnectWalletClient = Pick<CoinListClient, 'createWalletOwnershipChallenge' | 'connectExternalWallet'>;
|
|
659
|
+
type ConnectWalletFlowParams = {
|
|
660
|
+
coinlist: ConnectWalletClient;
|
|
661
|
+
/** Host-provided connected wallet the flow signs with. */
|
|
662
|
+
wallet: ConnectWallet;
|
|
663
|
+
offerId: OfferId;
|
|
664
|
+
offerOptionId: OfferOptionId;
|
|
665
|
+
/** Challenge framing; defaults to `'siwe'`. */
|
|
666
|
+
challengeType?: WalletChallengeType;
|
|
667
|
+
/** SIWE statement shown in the signing prompt. */
|
|
668
|
+
statement?: string;
|
|
669
|
+
/**
|
|
670
|
+
* Polled before each irreversible step (signing, binding). Return true to
|
|
671
|
+
* abandon a superseded attempt; the flow then resolves `{ type: 'cancelled' }`
|
|
672
|
+
* without prompting the wallet or binding. React hooks pass a generation
|
|
673
|
+
* check here; non-React callers can omit it.
|
|
674
|
+
*/
|
|
675
|
+
isCancelled?: () => boolean;
|
|
676
|
+
/** Reports flow progress for consumers rendering loading states. */
|
|
677
|
+
onProgress?: (phase: ConnectWalletPhase) => void;
|
|
678
|
+
};
|
|
679
|
+
/**
|
|
680
|
+
* Drives the external-wallet ownership flow for one offer option:
|
|
681
|
+
* `createWalletOwnershipChallenge` -> host `wallet.signMessage` ->
|
|
682
|
+
* `connectExternalWallet`. Pure and signer-agnostic: signing is delegated to
|
|
683
|
+
* the host-provided {@link ConnectWallet}, and no React is involved so non-hook
|
|
684
|
+
* consumers can drive it directly (mirrors `authorizeWallet` in `swap-flows`).
|
|
685
|
+
* EVM / EOA + SIWE only for now.
|
|
249
686
|
*/
|
|
250
|
-
declare function
|
|
687
|
+
declare function connectExternalWalletFlow(params: ConnectWalletFlowParams): Promise<ConnectWalletFlowResult>;
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* A display-ready connect-wallet error: the core flow's machine-readable code
|
|
691
|
+
* and `retryable` flag, plus copy for the UI.
|
|
692
|
+
*/
|
|
693
|
+
type ConnectWalletError = {
|
|
694
|
+
code: ConnectWalletErrorCode;
|
|
695
|
+
message: string;
|
|
696
|
+
retryable: boolean;
|
|
697
|
+
};
|
|
698
|
+
/**
|
|
699
|
+
* Signing-in-flight and the last sign error live inside the READY state (not a
|
|
700
|
+
* separate top-level state) so a failed attempt returns to READY and can be
|
|
701
|
+
* retried without re-opening the modal. Mirrors {@link SignState} in
|
|
702
|
+
* `useTaxDocument`.
|
|
703
|
+
*/
|
|
704
|
+
type ConnectWalletSignState = {
|
|
705
|
+
type: 'idle';
|
|
706
|
+
error: ConnectWalletError | null;
|
|
707
|
+
} | {
|
|
708
|
+
type: 'signing';
|
|
709
|
+
};
|
|
710
|
+
type ConnectWalletState = {
|
|
711
|
+
type: 'NEEDS_WALLET';
|
|
712
|
+
} | {
|
|
713
|
+
type: 'READY';
|
|
714
|
+
address: EvmWalletAddress;
|
|
715
|
+
sign: ConnectWalletSignState;
|
|
716
|
+
} | {
|
|
717
|
+
type: 'CONNECTED';
|
|
718
|
+
binding: OfferOptionAddress;
|
|
719
|
+
};
|
|
720
|
+
interface UseConnectWalletOptions {
|
|
721
|
+
/** The hook resets state each time it opens. */
|
|
722
|
+
isOpen: boolean;
|
|
723
|
+
offerId: OfferId;
|
|
724
|
+
offerOptionId: OfferOptionId;
|
|
725
|
+
/** Host-provided connected wallet, or `null` while none is connected. */
|
|
726
|
+
wallet: ConnectWallet | null;
|
|
727
|
+
/** Challenge framing; defaults to `'siwe'`. */
|
|
728
|
+
challengeType?: WalletChallengeType;
|
|
729
|
+
/** SIWE statement shown in the signing prompt. */
|
|
730
|
+
statement?: string;
|
|
731
|
+
}
|
|
732
|
+
interface UseConnectWalletResult {
|
|
733
|
+
state: ConnectWalletState;
|
|
734
|
+
/** READY.sign: idle -> signing -> (CONNECTED | idle w/ error). No-op otherwise. */
|
|
735
|
+
onSign: () => void;
|
|
736
|
+
}
|
|
737
|
+
/**
|
|
738
|
+
* React wrapper over {@link connectExternalWalletFlow}. Owns the modal state
|
|
739
|
+
* machine, the display copy, and generation-token supersession (so a wallet
|
|
740
|
+
* switch, modal close, or unmount cancels an in-flight attempt). The flow logic
|
|
741
|
+
* itself lives in the framework-free core so non-React consumers can drive it.
|
|
742
|
+
*/
|
|
743
|
+
declare function useConnectWallet({ isOpen, offerId, offerOptionId, wallet, challengeType, statement, }: UseConnectWalletOptions): UseConnectWalletResult;
|
|
744
|
+
|
|
745
|
+
interface ConnectWalletModalProps {
|
|
746
|
+
isOpen: boolean;
|
|
747
|
+
onClose: () => void;
|
|
748
|
+
offerId: OfferId;
|
|
749
|
+
optionId: OfferOptionId;
|
|
750
|
+
/** Host-provided connected wallet, or `null` while none is connected. */
|
|
751
|
+
wallet: ConnectWallet | null;
|
|
752
|
+
/** Called once the wallet is bound to the offer option, right before close. */
|
|
753
|
+
onConnected?: (binding: OfferOptionAddress) => void;
|
|
754
|
+
/**
|
|
755
|
+
* Called when the user asks to connect (or switch) a wallet: the "Connect
|
|
756
|
+
* wallet" button when none is connected, and "Use a different wallet" when one
|
|
757
|
+
* already is.
|
|
758
|
+
*/
|
|
759
|
+
onRequestConnect?: () => void;
|
|
760
|
+
/** Challenge framing; defaults to `'siwe'`. */
|
|
761
|
+
challengeType?: WalletChallengeType;
|
|
762
|
+
/** SIWE statement shown in the signing prompt. */
|
|
763
|
+
statement?: string;
|
|
764
|
+
className?: string;
|
|
765
|
+
}
|
|
766
|
+
/**
|
|
767
|
+
* Batteries-included modal for the external-wallet ownership flow. Drives
|
|
768
|
+
* {@link useConnectWallet} (challenge -> host signs -> connect) for one offer
|
|
769
|
+
* option. Signing is delegated to the host-provided {@link ConnectWallet}: the SDK
|
|
770
|
+
* never bundles a wallet stack.
|
|
771
|
+
*
|
|
772
|
+
* No portal is used — rendering stays inside the normal DOM tree so it keeps
|
|
773
|
+
* this SDK's `.clco-sdk-root`-scoped theme tokens without needing its own
|
|
774
|
+
* {@link CoinListStyleScope}.
|
|
775
|
+
*/
|
|
776
|
+
declare function ConnectWalletModal({ isOpen, onClose, offerId, optionId, wallet, onConnected, onRequestConnect, challengeType, statement, className, }: ConnectWalletModalProps): react_jsx_runtime.JSX.Element | null;
|
|
777
|
+
|
|
778
|
+
interface IdentityVerificationProps {
|
|
779
|
+
/**
|
|
780
|
+
* Sumsub verification level to start. Determines which screens the Sumsub
|
|
781
|
+
* WebSDK shows. Defaults to the backend's standard identity level.
|
|
782
|
+
*/
|
|
783
|
+
levelName?: KycLevelName;
|
|
784
|
+
/**
|
|
785
|
+
* Reset the Sumsub applicant before starting the flow, so an
|
|
786
|
+
* already-approved level can be executed again (e.g. to update stale PII).
|
|
787
|
+
* Pass the `kycReset` value from the requirement status. Applies only to
|
|
788
|
+
* the initial token — mid-flow token refreshes never repeat the reset.
|
|
789
|
+
*/
|
|
790
|
+
reset?: boolean;
|
|
791
|
+
/** BCP-47 language tag for the Sumsub UI, e.g. `'en'`. */
|
|
792
|
+
locale?: string;
|
|
793
|
+
/**
|
|
794
|
+
* Called when the user submits their data in the Sumsub flow. Verification
|
|
795
|
+
* continues asynchronously on the backend, so the requirement typically moves
|
|
796
|
+
* to a pending state first — refetch requirement statuses to observe it.
|
|
797
|
+
*/
|
|
798
|
+
onSubmitted?: () => void;
|
|
799
|
+
/** Called when the Sumsub flow reports an error. */
|
|
800
|
+
onError?: (error: Error) => void;
|
|
801
|
+
className?: string;
|
|
802
|
+
}
|
|
803
|
+
/**
|
|
804
|
+
* Inline Sumsub identity verification flow. Fetches a Sumsub WebSDK access
|
|
805
|
+
* token via {@link useKycToken} and renders the Sumsub iframe. Used by
|
|
806
|
+
* `RequirementsChecklist` for `identity_verified` requirements, and can also
|
|
807
|
+
* be rendered standalone.
|
|
808
|
+
*/
|
|
809
|
+
declare function IdentityVerification({ levelName, reset, locale, onSubmitted, onError, className, }: IdentityVerificationProps): ReactNode;
|
|
251
810
|
|
|
252
811
|
type RequirementVariant = 'verification' | 'wallet';
|
|
253
812
|
declare const RequirementVariant: {
|
|
@@ -266,21 +825,40 @@ type RequirementItemUi = {
|
|
|
266
825
|
status: RequirementStatus;
|
|
267
826
|
label: string;
|
|
268
827
|
description: string;
|
|
269
|
-
|
|
828
|
+
/**
|
|
829
|
+
* `true` for `whitelisted_wallet` (a multi-slot list the user can add to and
|
|
830
|
+
* remove from), `false` for the single-slot `external_wallet`.
|
|
831
|
+
*/
|
|
832
|
+
multiWallet: boolean;
|
|
833
|
+
/** The user's connected wallets. Single-slot requirements have at most one. */
|
|
834
|
+
connectedWallets: ConnectedWalletUi[];
|
|
270
835
|
};
|
|
271
836
|
declare const RequirementItemUi: {
|
|
272
|
-
fromDomain(req: Requirement, statusInfo: RequirementStatusInfo | undefined, label: string, description: string,
|
|
837
|
+
fromDomain(req: Requirement, statusInfo: RequirementStatusInfo | undefined, label: string, description: string, addresses?: OfferOptionAddress[]): RequirementItemUi;
|
|
273
838
|
};
|
|
274
839
|
interface RequirementItemProps {
|
|
275
840
|
ui: RequirementItemUi;
|
|
276
841
|
expanded?: boolean;
|
|
277
842
|
onToggle?: () => void;
|
|
278
|
-
walletAddress?: string;
|
|
279
843
|
className?: string;
|
|
844
|
+
/** Connect / change / add-wallet action (opens the connect flow). */
|
|
280
845
|
onAction?: (() => void) | null;
|
|
846
|
+
/** Removes a bound wallet by id (whitelisted-wallet requirements only). */
|
|
847
|
+
onRemoveWallet?: ((id: string) => void | Promise<void>) | null;
|
|
848
|
+
/**
|
|
849
|
+
* Load state of {@link RequirementItemUi.connectedWallets}. `'loading'` /
|
|
850
|
+
* `'error'` keep a fetch-in-flight or failed fetch from looking like an empty
|
|
851
|
+
* wallet list. Defaults to `'ready'`.
|
|
852
|
+
*/
|
|
853
|
+
walletsStatus?: WalletsStatus;
|
|
281
854
|
onContactSupport?: (() => void) | null;
|
|
282
855
|
}
|
|
283
|
-
|
|
856
|
+
/**
|
|
857
|
+
* A single requirement row (label, status, expandable action zone). Self-scoped:
|
|
858
|
+
* renders fully styled on its own, with no `CoinListStyleScope` needed. Also composed
|
|
859
|
+
* by {@link RequirementsChecklist}.
|
|
860
|
+
*/
|
|
861
|
+
declare function RequirementItem({ ui, expanded, onToggle, className, onAction, onRemoveWallet, walletsStatus, onContactSupport, }: RequirementItemProps): react_jsx_runtime.JSX.Element;
|
|
284
862
|
|
|
285
863
|
type LoadRequirementsReason = 'not-authenticated' | 'generic-error';
|
|
286
864
|
type LoadRequirementsState = {
|
|
@@ -321,7 +899,9 @@ interface UseRequirementsResult {
|
|
|
321
899
|
* Returns `LOADING` while CoinList is initializing or while data is being fetched.
|
|
322
900
|
* Returns `CONTENT` with requirements and statuses on success.
|
|
323
901
|
* Returns `ERROR` with:
|
|
324
|
-
* - `not-authenticated`
|
|
902
|
+
* - `not-authenticated` immediately (no request is sent) when the client's
|
|
903
|
+
* auth state is logged-out, or when fetching fails with
|
|
904
|
+
* {@link NotAuthenticatedError}
|
|
325
905
|
* - `generic-error` for any other failure
|
|
326
906
|
*/
|
|
327
907
|
declare function useRequirements(offerId: OfferId, options?: UseRequirementsOptions): UseRequirementsResult;
|
|
@@ -335,8 +915,9 @@ interface RequirementsChecklistProps {
|
|
|
335
915
|
/**
|
|
336
916
|
* Called when the user clicks a requirement's action button (e.g. "Continue", "Connect wallet").
|
|
337
917
|
* Defaults to {@link CoinListClient#handleRequirement}, which opens the corresponding CoinList
|
|
338
|
-
* page in a new tab
|
|
339
|
-
*
|
|
918
|
+
* page in a new tab — except for `document` requirements, which default to opening a built-in
|
|
919
|
+
* {@link TaxDocumentModal} instead. Pass your own handler to override this behavior for all
|
|
920
|
+
* requirement types, or pass `null` to disable the action button entirely.
|
|
340
921
|
*/
|
|
341
922
|
onRequirementActionOverride?: ((requirement: Requirement) => void) | null;
|
|
342
923
|
/**
|
|
@@ -346,21 +927,54 @@ interface RequirementsChecklistProps {
|
|
|
346
927
|
* the contact support button entirely.
|
|
347
928
|
*/
|
|
348
929
|
onContactSupportOverride?: ((requirement: Requirement) => void) | null;
|
|
930
|
+
/**
|
|
931
|
+
* Host-provided connected wallet used to satisfy `external_wallet` /
|
|
932
|
+
* `whitelisted_wallet` requirements in-app via {@link ConnectWalletModal}.
|
|
933
|
+
* Pass a connected {@link ConnectWallet}, or `null` while none is connected
|
|
934
|
+
* (then also pass {@link onRequestConnect} so the modal can prompt to
|
|
935
|
+
* connect). When this prop is omitted entirely — or is `null` without an
|
|
936
|
+
* {@link onRequestConnect} to act on — wallet requirements fall back to
|
|
937
|
+
* {@link CoinListClient#handleRequirement} (opening CoinList in a new tab).
|
|
938
|
+
*/
|
|
939
|
+
wallet?: ConnectWallet | null;
|
|
940
|
+
/** Called when the user asks to connect a wallet and none is connected yet. */
|
|
941
|
+
onRequestConnect?: () => void;
|
|
349
942
|
/** Override the default label for a requirement type. */
|
|
350
943
|
getLabel?: (requirement: Requirement) => string;
|
|
351
944
|
/** Override the default description for a requirement type. */
|
|
352
945
|
getDescription?: (requirement: Requirement) => string | null;
|
|
353
946
|
/** Optional loading slot. */
|
|
354
947
|
loading?: ReactNode;
|
|
948
|
+
/**
|
|
949
|
+
* Rendered when the user is not authenticated. Defaults to
|
|
950
|
+
* {@link CoinListSignInCard}, which prompts the user to sign in and starts
|
|
951
|
+
* the CoinList OAuth flow. Pass `null` to render nothing.
|
|
952
|
+
*/
|
|
953
|
+
unauthenticatedState?: ReactNode;
|
|
355
954
|
/** Optional error slot. */
|
|
356
955
|
error?: ReactNode;
|
|
357
956
|
className?: string;
|
|
358
957
|
/**
|
|
359
958
|
* Requirements data pre-fetched on the server (e.g. via
|
|
360
959
|
* `CoinListServer.fetchOfferRequirements()` + `fetchRequirementStatuses()`).
|
|
361
|
-
* When provided, the component uses this data as-is and skips the client-side
|
|
960
|
+
* When provided, the component uses this data as-is and skips the client-side
|
|
961
|
+
* requirements fetch. Connected-wallet addresses for wallet requirements are
|
|
962
|
+
* not part of `RequirementsData` and are always fetched client-side.
|
|
362
963
|
*/
|
|
363
964
|
data?: RequirementsData;
|
|
965
|
+
/**
|
|
966
|
+
* Options for the inline Sumsub verification flow shown for KYC-backed
|
|
967
|
+
* requirements (`identity_verified`, `kyc_approved`, `accreditation`) when
|
|
968
|
+
* `onRequirementActionOverride` is not provided. The flow starts whenever
|
|
969
|
+
* the requirement's status carries a `kycLevel` — the backend prescribes
|
|
970
|
+
* both the level and whether the applicant must be reset first.
|
|
971
|
+
*/
|
|
972
|
+
identityVerificationOptions?: {
|
|
973
|
+
/** Override the backend-prescribed Sumsub verification level. */
|
|
974
|
+
levelName?: KycLevelName;
|
|
975
|
+
/** BCP-47 language tag for the Sumsub UI, e.g. `'en'`. */
|
|
976
|
+
locale?: string;
|
|
977
|
+
};
|
|
364
978
|
}
|
|
365
979
|
/**
|
|
366
980
|
* Connected requirements checklist that fetches requirements and statuses
|
|
@@ -370,13 +984,142 @@ interface RequirementsChecklistProps {
|
|
|
370
984
|
* Pass `data` (pre-fetched server-side) to use that data as-is and skip
|
|
371
985
|
* the initial client-side fetch.
|
|
372
986
|
*
|
|
987
|
+
* When the user is not authenticated, renders a sign-in card instead of the
|
|
988
|
+
* checklist — without fetching. Pass `unauthenticatedState` to customize
|
|
989
|
+
* that state, or `null` to render nothing.
|
|
990
|
+
*
|
|
373
991
|
* By default, clicking a requirement's action button opens the corresponding
|
|
374
992
|
* CoinList page in a new tab via {@link CoinListClient#handleRequirement}. It is
|
|
375
993
|
* recommended to omit `onRequirementActionOverride` and rely on this default.
|
|
376
994
|
* Pass your own handler only if you need custom navigation behavior, or `null`
|
|
377
995
|
* to disable the action button entirely.
|
|
996
|
+
*
|
|
997
|
+
* Self-scoped: renders fully styled on its own, with no `CoinListStyleScope` needed.
|
|
998
|
+
*/
|
|
999
|
+
declare function RequirementsChecklist(props: RequirementsChecklistProps): ReactNode;
|
|
1000
|
+
|
|
1001
|
+
interface TaxDocumentModalProps {
|
|
1002
|
+
isOpen: boolean;
|
|
1003
|
+
onClose: () => void;
|
|
1004
|
+
/** Called once the document is successfully signed, right before the modal closes. */
|
|
1005
|
+
onSubmitted?: (submission: DocumentSubmission) => void;
|
|
1006
|
+
className?: string;
|
|
1007
|
+
}
|
|
1008
|
+
/**
|
|
1009
|
+
* Batteries-included modal for the tax document (W-8BEN / W-8BEN-E) signing
|
|
1010
|
+
* flow. Fetches the current user's PII via {@link useTaxDocument}, lets
|
|
1011
|
+
* individuals review/edit it before signing; company/trust entities see a
|
|
1012
|
+
* plain sign screen with no fields.
|
|
1013
|
+
*
|
|
1014
|
+
* No portal is used — rendering stays inside the normal DOM tree so it keeps
|
|
1015
|
+
* this SDK's `.clco-sdk-root`-scoped theme tokens without needing its own
|
|
1016
|
+
* {@link CoinListStyleScope}.
|
|
1017
|
+
*/
|
|
1018
|
+
declare function TaxDocumentModal({ isOpen, onClose, onSubmitted, className, }: TaxDocumentModalProps): react_jsx_runtime.JSX.Element | null;
|
|
1019
|
+
|
|
1020
|
+
/**
|
|
1021
|
+
* The state of the swap's output-token fetch.
|
|
1022
|
+
*
|
|
1023
|
+
* - `LOADING`: no result yet (initial, or provider still initializing).
|
|
1024
|
+
* - `ERROR`: the fetch failed.
|
|
1025
|
+
* - `CONTENT`: the output token was fetched successfully.
|
|
1026
|
+
*
|
|
1027
|
+
* A stale `CONTENT`/`ERROR` is preserved while a re-fetch (e.g. after a chain
|
|
1028
|
+
* change) is in flight, rather than flipping back to `LOADING`.
|
|
1029
|
+
*/
|
|
1030
|
+
type SwapOutputTokenState = {
|
|
1031
|
+
type: 'LOADING';
|
|
1032
|
+
} | {
|
|
1033
|
+
type: 'ERROR';
|
|
1034
|
+
} | {
|
|
1035
|
+
type: 'CONTENT';
|
|
1036
|
+
outputToken: Erc20Asset;
|
|
1037
|
+
};
|
|
1038
|
+
interface UseSwapOutputTokenOptions {
|
|
1039
|
+
/** The swap contract whose output token to read. */
|
|
1040
|
+
contractAddress: EvmContractAddress;
|
|
1041
|
+
chain: EthereumChain;
|
|
1042
|
+
/** When false, the hook does not fetch. */
|
|
1043
|
+
enabled: boolean;
|
|
1044
|
+
}
|
|
1045
|
+
interface UseSwapOutputTokenResult {
|
|
1046
|
+
outputTokenState: SwapOutputTokenState;
|
|
1047
|
+
}
|
|
1048
|
+
/**
|
|
1049
|
+
* Fetches the ERC-20 output token a swap contract pays out. Re-fetches when the
|
|
1050
|
+
* contract or chain changes, and once when `enabled` flips to true.
|
|
1051
|
+
*
|
|
1052
|
+
* The fetch runs once (no polling); a failure resolves to `ERROR` and is not
|
|
1053
|
+
* retried until a dependency changes.
|
|
1054
|
+
*/
|
|
1055
|
+
declare function useSwapOutputToken(options: UseSwapOutputTokenOptions): UseSwapOutputTokenResult;
|
|
1056
|
+
|
|
1057
|
+
interface UseSwapQuoteOptions {
|
|
1058
|
+
/** The swap contract to quote against. */
|
|
1059
|
+
contractAddress: EvmContractAddress;
|
|
1060
|
+
chain: EthereumChain;
|
|
1061
|
+
/** The gross amount the user wants to swap, in the input token. */
|
|
1062
|
+
inputAmount: BlockchainAmount;
|
|
1063
|
+
inputTokenAddress: EvmContractAddress;
|
|
1064
|
+
/**
|
|
1065
|
+
* Decimals of the swap's output token. Quoting is skipped until this is
|
|
1066
|
+
* known (e.g. while {@link useSwapOutputToken} is still loading).
|
|
1067
|
+
*/
|
|
1068
|
+
outputTokenDecimals: AssetDecimals | null;
|
|
1069
|
+
/** How often to refresh the quote. Defaults to {@link SWAP_POLL_INTERVAL_MS}. */
|
|
1070
|
+
pollIntervalMs?: number;
|
|
1071
|
+
/** When false, the hook neither fetches nor polls. */
|
|
1072
|
+
enabled: boolean;
|
|
1073
|
+
}
|
|
1074
|
+
interface UseSwapQuoteResult {
|
|
1075
|
+
/** The latest quote, or `null` until the first successful fetch. */
|
|
1076
|
+
quote: SwapQuote | null;
|
|
1077
|
+
/** True until the first quote arrives; false while the hook is disabled. */
|
|
1078
|
+
isLoading: boolean;
|
|
1079
|
+
/** True while a background poll refreshes an existing quote. */
|
|
1080
|
+
isRefreshing: boolean;
|
|
1081
|
+
}
|
|
1082
|
+
/**
|
|
1083
|
+
* Polls a read-only swap quote for `inputAmount` of `inputTokenAddress` against
|
|
1084
|
+
* the given swap contract, refreshing every `pollIntervalMs`.
|
|
1085
|
+
*
|
|
1086
|
+
* A failed fetch is swallowed: the last quote stays visible and the next poll
|
|
1087
|
+
* tick retries. Quoting is skipped while `outputTokenDecimals` is `null` or
|
|
1088
|
+
* `enabled` is false, and until the CoinList provider finishes initializing.
|
|
378
1089
|
*/
|
|
379
|
-
declare function
|
|
1090
|
+
declare function useSwapQuote(options: UseSwapQuoteOptions): UseSwapQuoteResult;
|
|
1091
|
+
|
|
1092
|
+
interface UseSwapTokenBalancesOptions {
|
|
1093
|
+
address: EvmWalletAddress;
|
|
1094
|
+
chain: EthereumChain;
|
|
1095
|
+
/** The assets to read balances for. */
|
|
1096
|
+
assets: NonEmptyArray<StablecoinSymbol>;
|
|
1097
|
+
/** How often to refresh balances. Defaults to {@link SWAP_POLL_INTERVAL_MS}. */
|
|
1098
|
+
pollIntervalMs?: number;
|
|
1099
|
+
/** When false, the hook neither fetches nor polls. */
|
|
1100
|
+
enabled: boolean;
|
|
1101
|
+
}
|
|
1102
|
+
interface UseSwapTokenBalancesResult {
|
|
1103
|
+
/**
|
|
1104
|
+
* Raw on-chain balances keyed by the requested assets. Each requested asset
|
|
1105
|
+
* has an entry once a fetch settles (`bigint` on success, `null` on failure).
|
|
1106
|
+
* Assets that were not requested are absent.
|
|
1107
|
+
*/
|
|
1108
|
+
balances: Map<StablecoinSymbol, bigint | null>;
|
|
1109
|
+
isLoading: boolean;
|
|
1110
|
+
}
|
|
1111
|
+
/**
|
|
1112
|
+
* Polls the raw ERC-20 balances of `assets` for `address`, refreshing every
|
|
1113
|
+
* `pollIntervalMs`. Each asset settles independently: a failed read maps to
|
|
1114
|
+
* `null` while the others still resolve. A poll tick is skipped while the
|
|
1115
|
+
* previous fetch is still in flight. `assets` is compared by contents, so
|
|
1116
|
+
* passing an inline array does not restart the poll.
|
|
1117
|
+
*
|
|
1118
|
+
* `isLoading` is true only until the first poll settles; background polls do
|
|
1119
|
+
* not toggle it. Disabled (or before the provider is ready) the hook does not
|
|
1120
|
+
* fetch.
|
|
1121
|
+
*/
|
|
1122
|
+
declare function useSwapTokenBalances(options: UseSwapTokenBalancesOptions): UseSwapTokenBalancesResult;
|
|
380
1123
|
|
|
381
1124
|
interface UseCoinListResult {
|
|
382
1125
|
/**
|
|
@@ -432,6 +1175,47 @@ interface UseCompleteOAuthOptions {
|
|
|
432
1175
|
*/
|
|
433
1176
|
declare function useCompleteOAuth(options: UseCompleteOAuthOptions): void;
|
|
434
1177
|
|
|
1178
|
+
type KycTokenErrorReason = 'not-authenticated' | 'generic-error';
|
|
1179
|
+
type KycTokenState = {
|
|
1180
|
+
type: 'IDLE';
|
|
1181
|
+
} | {
|
|
1182
|
+
type: 'LOADING';
|
|
1183
|
+
} | {
|
|
1184
|
+
type: 'ERROR';
|
|
1185
|
+
reason: KycTokenErrorReason;
|
|
1186
|
+
} | {
|
|
1187
|
+
type: 'CONTENT';
|
|
1188
|
+
token: string;
|
|
1189
|
+
};
|
|
1190
|
+
interface UseKycTokenResult {
|
|
1191
|
+
kycTokenState: KycTokenState;
|
|
1192
|
+
/**
|
|
1193
|
+
* Fetches a fresh Sumsub WebSDK access token and transitions the state to
|
|
1194
|
+
* `CONTENT` (or `ERROR`). Resolves with the token so it can also be used
|
|
1195
|
+
* imperatively, e.g. as the Sumsub `expirationHandler`. Rejects on failure.
|
|
1196
|
+
*/
|
|
1197
|
+
fetchToken: () => Promise<string>;
|
|
1198
|
+
}
|
|
1199
|
+
/**
|
|
1200
|
+
* Creates Sumsub WebSDK access tokens for the current user via
|
|
1201
|
+
* {@link CoinListClient#createKycToken}, exposed as a state machine.
|
|
1202
|
+
*
|
|
1203
|
+
* Starts in `IDLE`; call `fetchToken()` to request a token. Returns `LOADING`
|
|
1204
|
+
* while the request is in flight, then `CONTENT` with the token on success, or
|
|
1205
|
+
* `ERROR` with:
|
|
1206
|
+
* - `not-authenticated` when fetching fails with {@link NotAuthenticatedError}
|
|
1207
|
+
* - `generic-error` for any other failure
|
|
1208
|
+
*
|
|
1209
|
+
* `reset` (resetting the Sumsub applicant so an already-approved level can be
|
|
1210
|
+
* redone) tracks the latest value of the `reset` argument up until a token is
|
|
1211
|
+
* first issued; after that, mid-flow token refreshes must never repeat the
|
|
1212
|
+
* reset, or the user's in-progress submission would be wiped, so further
|
|
1213
|
+
* changes to `reset` are ignored. Failed attempts keep the reset pending, so
|
|
1214
|
+
* retrying still requests it — the backend treats resetting an
|
|
1215
|
+
* already-pristine applicant as a no-op.
|
|
1216
|
+
*/
|
|
1217
|
+
declare function useKycToken(levelName?: KycLevelName, reset?: boolean): UseKycTokenResult;
|
|
1218
|
+
|
|
435
1219
|
type LoadOfferDetailsReason = 'not-authenticated' | 'generic-error';
|
|
436
1220
|
type LoadOfferDetailsState = {
|
|
437
1221
|
type: 'LOADING';
|
|
@@ -500,6 +1284,51 @@ interface UseOffersResult {
|
|
|
500
1284
|
*/
|
|
501
1285
|
declare function useOffers(options?: UseOffersOptions): UseOffersResult;
|
|
502
1286
|
|
|
1287
|
+
type LoadOptionAddressesReason = 'not-authenticated' | 'generic-error';
|
|
1288
|
+
type LoadOptionAddressesState = {
|
|
1289
|
+
type: 'LOADING';
|
|
1290
|
+
} | {
|
|
1291
|
+
type: 'ERROR';
|
|
1292
|
+
reason: LoadOptionAddressesReason;
|
|
1293
|
+
} | {
|
|
1294
|
+
type: 'CONTENT';
|
|
1295
|
+
addresses: OfferOptionAddress[];
|
|
1296
|
+
};
|
|
1297
|
+
interface UseOptionAddressesOptions {
|
|
1298
|
+
/**
|
|
1299
|
+
* Bound wallets pre-fetched on the server (e.g. via
|
|
1300
|
+
* `CoinListServer.listOptionAddresses()`). When provided, the hook uses this
|
|
1301
|
+
* data as-is and skips the initial client-side fetch. Calling `refetch()`
|
|
1302
|
+
* (or `disconnect()`) will still trigger a fresh fetch.
|
|
1303
|
+
*/
|
|
1304
|
+
data?: OfferOptionAddress[];
|
|
1305
|
+
/**
|
|
1306
|
+
* When `false`, the hook stays in a benign empty `CONTENT` state and sends no
|
|
1307
|
+
* request. Use it to avoid fetching bindings for options with no wallet
|
|
1308
|
+
* requirement. Defaults to `true`.
|
|
1309
|
+
*/
|
|
1310
|
+
enabled?: boolean;
|
|
1311
|
+
}
|
|
1312
|
+
interface UseOptionAddressesResult {
|
|
1313
|
+
addressesState: LoadOptionAddressesState;
|
|
1314
|
+
/** Triggers a re-fetch of the bound wallets. */
|
|
1315
|
+
refetch: () => void;
|
|
1316
|
+
/**
|
|
1317
|
+
* Removes a bound wallet, then refetches the list. Rejects (without
|
|
1318
|
+
* refetching) if the removal fails, so callers can surface the error.
|
|
1319
|
+
*/
|
|
1320
|
+
disconnect: (addressId: OfferOptionAddressId) => Promise<void>;
|
|
1321
|
+
}
|
|
1322
|
+
/**
|
|
1323
|
+
* Loads the user's proven wallet bindings for a single offer option, then
|
|
1324
|
+
* exposes them via a state machine plus `refetch`/`disconnect` actions.
|
|
1325
|
+
*
|
|
1326
|
+
* Returns `LOADING` while CoinList is initializing or data is being fetched,
|
|
1327
|
+
* `CONTENT` with the bindings on success, and `ERROR` with `not-authenticated`
|
|
1328
|
+
* (logged-out, or a {@link NotAuthenticatedError}) or `generic-error` otherwise.
|
|
1329
|
+
*/
|
|
1330
|
+
declare function useOptionAddresses(offerId: OfferId, offerOptionId: OfferOptionId, options?: UseOptionAddressesOptions): UseOptionAddressesResult;
|
|
1331
|
+
|
|
503
1332
|
type LoadParticipationsReason = 'not-authenticated' | 'generic-error';
|
|
504
1333
|
type LoadParticipationsState = {
|
|
505
1334
|
type: 'LOADING';
|
|
@@ -535,4 +1364,78 @@ interface UseParticipationsResult {
|
|
|
535
1364
|
*/
|
|
536
1365
|
declare function useParticipations(offerId?: OfferId, options?: UseParticipationsOptions): UseParticipationsResult;
|
|
537
1366
|
|
|
538
|
-
|
|
1367
|
+
type TaxDocumentFields = {
|
|
1368
|
+
fullLegalName: string;
|
|
1369
|
+
dob: string;
|
|
1370
|
+
countryOfCitizenship: string;
|
|
1371
|
+
taxId: string;
|
|
1372
|
+
permanentAddress: string;
|
|
1373
|
+
};
|
|
1374
|
+
/**
|
|
1375
|
+
* Structured address pieces sent split in the payload (`City` / `Country`).
|
|
1376
|
+
* Kept separate from the single editable `permanentAddress` display string
|
|
1377
|
+
* and never shown or edited in the form.
|
|
1378
|
+
*/
|
|
1379
|
+
type TaxDocumentAddressParts = {
|
|
1380
|
+
city: string;
|
|
1381
|
+
country: string;
|
|
1382
|
+
};
|
|
1383
|
+
/**
|
|
1384
|
+
* Signing-in-flight and the last sign error live inside the REVIEW/SIGN_ONLY
|
|
1385
|
+
* state (not a separate top-level state) so a failed sign never loses the
|
|
1386
|
+
* user's fields.
|
|
1387
|
+
*/
|
|
1388
|
+
type SignState = {
|
|
1389
|
+
type: 'idle';
|
|
1390
|
+
error: string | null;
|
|
1391
|
+
} | {
|
|
1392
|
+
type: 'signing';
|
|
1393
|
+
};
|
|
1394
|
+
type TaxDocumentState = {
|
|
1395
|
+
type: 'LOADING';
|
|
1396
|
+
} | {
|
|
1397
|
+
type: 'REVIEW';
|
|
1398
|
+
fields: TaxDocumentFields;
|
|
1399
|
+
addressParts: TaxDocumentAddressParts;
|
|
1400
|
+
piiUnavailable: boolean;
|
|
1401
|
+
sign: SignState;
|
|
1402
|
+
} | {
|
|
1403
|
+
type: 'EDITING';
|
|
1404
|
+
fields: TaxDocumentFields;
|
|
1405
|
+
original: TaxDocumentFields;
|
|
1406
|
+
addressParts: TaxDocumentAddressParts;
|
|
1407
|
+
piiUnavailable: boolean;
|
|
1408
|
+
} | {
|
|
1409
|
+
type: 'SIGN_ONLY';
|
|
1410
|
+
sign: SignState;
|
|
1411
|
+
} | {
|
|
1412
|
+
type: 'ERROR';
|
|
1413
|
+
reason: 'not-authenticated' | 'generic-error';
|
|
1414
|
+
} | {
|
|
1415
|
+
type: 'SUBMITTED';
|
|
1416
|
+
submission: DocumentSubmission;
|
|
1417
|
+
};
|
|
1418
|
+
interface UseTaxDocumentOptions {
|
|
1419
|
+
/** The hook only fetches PII while open; state resets each time it opens. */
|
|
1420
|
+
isOpen: boolean;
|
|
1421
|
+
}
|
|
1422
|
+
interface UseTaxDocumentResult {
|
|
1423
|
+
state: TaxDocumentState;
|
|
1424
|
+
onEditField: (field: keyof TaxDocumentFields, value: string) => void;
|
|
1425
|
+
onStartEdit: () => void;
|
|
1426
|
+
onSaveEdit: () => void;
|
|
1427
|
+
onCancelEdit: () => void;
|
|
1428
|
+
onSign: () => void;
|
|
1429
|
+
}
|
|
1430
|
+
/**
|
|
1431
|
+
* Loads the current user's PII and drives the tax document (W-8BEN /
|
|
1432
|
+
* W-8BEN-E) signing flow.
|
|
1433
|
+
*
|
|
1434
|
+
* Always fetches PII once per open — it's the only way to learn the
|
|
1435
|
+
* entity's `kind`. For company/trust entities the fetched values are
|
|
1436
|
+
* discarded (only `kind` is used) and the form is skipped entirely
|
|
1437
|
+
* (`SIGN_ONLY`); for individuals they seed the review screen (`REVIEW`).
|
|
1438
|
+
*/
|
|
1439
|
+
declare function useTaxDocument({ isOpen, }: UseTaxDocumentOptions): UseTaxDocumentResult;
|
|
1440
|
+
|
|
1441
|
+
export { type AuthState, type AuthorizeWalletParams, type BroadcastTxParams, ChecklistStatus, type ClientConfig, ClientSwapNamespaceImpl, type CoinListClient, CoinListClientInitializationError, type CoinListClientSwapNamespace, CoinListContext, CoinListContextProvider, type CoinListContextValue, CoinListProvider, type CoinListProviderProps, CoinListSignInCard, type CoinListSignInCardProps, CoinListStyleScope, type CoinListStyleScopeProps, type CompleteOAuthFailureReason, type ConnectWallet, type ConnectWalletError, type ConnectWalletErrorCode, type ConnectWalletFlowError, type ConnectWalletFlowParams, type ConnectWalletFlowResult, ConnectWalletModal, type ConnectWalletModalProps, type ConnectWalletPhase, type ConnectWalletSignState, type ConnectWalletState, ConnectedWalletList, type ConnectedWalletListProps, type ConnectedWalletUi, type EvmSigner, type EvmWallet, type ExecuteSwapParams, IdentityVerification, type IdentityVerificationProps, KycLevelName, KycToken, type KycTokenErrorReason, type KycTokenState, type LoadOfferDetailsReason, type LoadOfferDetailsState, type LoadOffersReason, type LoadOffersState, type LoadOptionAddressesReason, type LoadOptionAddressesState, type LoadParticipationsReason, type LoadParticipationsState, type LoadRequirementsReason, type LoadRequirementsState, OAUTH_CODE_VERIFIER_KEY, OAUTH_STATE_KEY, type OauthClientErrorReason, type OauthClientResult, OfferCard, type Props as OfferCardProps, OfferCardUi, OffersGrid, type OffersGridProps, RequirementItem, type RequirementItemProps, RequirementItemUi, RequirementStatus, RequirementVariant, RequirementsChecklist, type RequirementsChecklistProps, type RequirementsData, type SignState, type SwapExecutionError, type SwapExecutionPhase, type SwapExecutionResult, type SwapOutputTokenState, type TaxDocumentAddressParts, type TaxDocumentFields, TaxDocumentModal, type TaxDocumentModalProps, type TaxDocumentState, type UseCoinListResult, type UseCompleteOAuthOptions, type UseConnectWalletOptions, type UseConnectWalletResult, type UseKycTokenResult, type UseOfferDetailsOptions, type UseOfferDetailsResult, type UseOffersOptions, type UseOffersResult, type UseOptionAddressesOptions, type UseOptionAddressesResult, type UseParticipationsOptions, type UseParticipationsResult, type UseRequirementsOptions, type UseRequirementsResult, type UseSwapOutputTokenOptions, type UseSwapOutputTokenResult, type UseSwapQuoteOptions, type UseSwapQuoteResult, type UseSwapTokenBalancesOptions, type UseSwapTokenBalancesResult, type UseTaxDocumentOptions, type UseTaxDocumentResult, type WalletAuthorizationError, type WalletAuthorizationPhase, type WalletAuthorizationResult, type WalletError, type WalletsStatus, type WriteContractParams, authorizeWallet, classifyWalletError, connectExternalWalletFlow, createCoinListClient, executeSwap, useCoinList, useCompleteOAuth, useConnectWallet, useKycToken, useOfferDetails, useOffers, useOptionAddresses, useParticipations, useRequirements, useSwapOutputToken, useSwapQuote, useSwapTokenBalances, useTaxDocument };
|