@coinlist-co/react 0.11.1-rc.e102bdb → 0.12.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.
Files changed (33) hide show
  1. package/dist/{chunk-7CTH4KPU.js → chunk-6CQHDASY.js} +648 -620
  2. package/dist/chunk-6CQHDASY.js.map +1 -0
  3. package/dist/{chunk-UZUQALFY.js → chunk-F6WGUKZC.js} +9 -9
  4. package/dist/chunk-F6WGUKZC.js.map +1 -0
  5. package/dist/{chunk-LSPZETDH.js → chunk-ZFBEI3BW.js} +131 -134
  6. package/dist/chunk-ZFBEI3BW.js.map +1 -0
  7. package/dist/client/index.cjs +1489 -1346
  8. package/dist/client/index.cjs.map +1 -1
  9. package/dist/client/index.d.cts +395 -254
  10. package/dist/client/index.d.ts +395 -254
  11. package/dist/client/index.js +852 -739
  12. package/dist/client/index.js.map +1 -1
  13. package/dist/{collections-BBI_XydI.d.cts → collections-DOm9VKVm.d.cts} +1 -1
  14. package/dist/{collections-BrX9rRWc.d.ts → collections-aCv-Wr2a.d.ts} +1 -1
  15. package/dist/{config-CMl1bR3F.d.cts → config-DIaFzrMW.d.cts} +56 -13
  16. package/dist/{config-CMl1bR3F.d.ts → config-DIaFzrMW.d.ts} +56 -13
  17. package/dist/server/index.cjs +262 -236
  18. package/dist/server/index.cjs.map +1 -1
  19. package/dist/server/index.d.cts +4 -4
  20. package/dist/server/index.d.ts +4 -4
  21. package/dist/server/index.js +3 -3
  22. package/dist/server/index.js.map +1 -1
  23. package/dist/{shared → universal}/index.cjs +948 -919
  24. package/dist/universal/index.cjs.map +1 -0
  25. package/dist/{shared → universal}/index.d.cts +566 -536
  26. package/dist/{shared → universal}/index.d.ts +566 -536
  27. package/dist/{shared → universal}/index.js +9 -5
  28. package/package.json +23 -17
  29. package/dist/chunk-7CTH4KPU.js.map +0 -1
  30. package/dist/chunk-LSPZETDH.js.map +0 -1
  31. package/dist/chunk-UZUQALFY.js.map +0 -1
  32. package/dist/shared/index.cjs.map +0 -1
  33. /package/dist/{shared → universal}/index.js.map +0 -0
@@ -4,7 +4,7 @@ import {
4
4
  PINO_LEVEL,
5
5
  SDK_LOGGER_NAME,
6
6
  loggerOverPino
7
- } from "../chunk-UZUQALFY.js";
7
+ } from "../chunk-F6WGUKZC.js";
8
8
  import {
9
9
  AuthorizationCode,
10
10
  CodeVerifier,
@@ -36,9 +36,9 @@ import {
36
36
  formattedPricePerShare,
37
37
  generatePKCEParams,
38
38
  isStopped,
39
- ondoSwapContractAddress,
40
- superstateSwapContractAddress
41
- } from "../chunk-LSPZETDH.js";
39
+ superstateSwapContractAddress,
40
+ swapSpender
41
+ } from "../chunk-ZFBEI3BW.js";
42
42
  import {
43
43
  API_VERSION,
44
44
  AssetDecimals,
@@ -85,7 +85,7 @@ import {
85
85
  shortenAddress,
86
86
  txExplorerUrl,
87
87
  usdAmount
88
- } from "../chunk-7CTH4KPU.js";
88
+ } from "../chunk-6CQHDASY.js";
89
89
 
90
90
  // src/client/CoinListProvider.tsx
91
91
  import {
@@ -233,7 +233,7 @@ var ClientAuthNamespaceImpl = class {
233
233
  }
234
234
  };
235
235
 
236
- // src/client/core/blockchain/wallet-error.ts
236
+ // src/client/core/shared/blockchain/wallet-error.ts
237
237
  import {
238
238
  BaseError,
239
239
  ContractFunctionRevertedError,
@@ -268,7 +268,7 @@ function revertReason(error) {
268
268
  return error.reason ?? error.data?.errorName ?? error.signature ?? null;
269
269
  }
270
270
 
271
- // src/client/core/blockchain/erc20/approval.ts
271
+ // src/client/core/shared/blockchain/erc20/approval.ts
272
272
  async function ensureErc20Allowance({
273
273
  erc20,
274
274
  chain,
@@ -445,7 +445,7 @@ async function executeTokenSale(params) {
445
445
  return { type: "success", participation, approvalTxHash };
446
446
  }
447
447
 
448
- // src/client/core/observability/flow-logging.ts
448
+ // src/client/core/shared/observability/flow-logging.ts
449
449
  async function withFlowLogging(log, flow, fields, onProgress, run) {
450
450
  const flowLog = log.child({ flow });
451
451
  flowLog.info(() => ({ msg: "flow started", fields }));
@@ -537,16 +537,6 @@ var ClientCoinListTokenSaleNamespaceImpl = class extends CoinListTokenSaleNamesp
537
537
  }
538
538
  };
539
539
 
540
- // src/shared/core/blockchain/address.ts
541
- import { isAddressEqual } from "viem";
542
- function isSameEvmAddress(a, b) {
543
- try {
544
- return isAddressEqual(a, b);
545
- } catch {
546
- return false;
547
- }
548
- }
549
-
550
540
  // src/client/core/checkout/ondo/ondo-flows.ts
551
541
  async function prepareOndoBuy(params) {
552
542
  const { ondo, symbol, chain, wallet, amount } = params;
@@ -573,9 +563,17 @@ async function prepareOndoSell(params) {
573
563
  );
574
564
  }
575
565
  async function prepare(params, build) {
576
- const { erc20, wallet, chain, tokenAddress, amount, onProgress } = params;
566
+ const {
567
+ erc20,
568
+ wallet,
569
+ chain,
570
+ swapContracts,
571
+ tokenAddress,
572
+ amount,
573
+ onProgress
574
+ } = params;
577
575
  const emit = (phase) => onProgress?.(phase);
578
- const spender = ondoSwapContractAddress(chain);
576
+ const spender = swapSpender(swapContracts, chain);
579
577
  if (spender === null) {
580
578
  return { type: "error", error: { step: "unsupported-chain", chain } };
581
579
  }
@@ -606,16 +604,6 @@ async function executeOndoSwap(params) {
606
604
  if (now.getTime() >= transaction.expiresAt.getTime()) {
607
605
  return { type: "error", error: { step: "quote-expired" } };
608
606
  }
609
- const spender = ondoSwapContractAddress(chain);
610
- if (spender === null || !isSameEvmAddress(transaction.tx.to, spender)) {
611
- return {
612
- type: "error",
613
- error: {
614
- step: "spender-mismatch",
615
- expected: spender ?? transaction.tx.to
616
- }
617
- };
618
- }
619
607
  emit("broadcasting-swap");
620
608
  let txHash;
621
609
  try {
@@ -907,7 +895,7 @@ var ClientSuperstateSwapNamespaceImpl = class extends SuperstateSwapNamespaceImp
907
895
  }
908
896
  };
909
897
 
910
- // src/client/core/utils/open-in-new-tab.ts
898
+ // src/client/core/shared/utils/open-in-new-tab.ts
911
899
  function openInNewTab(url) {
912
900
  window.open(url, "_blank", "noopener,noreferrer");
913
901
  }
@@ -1100,7 +1088,7 @@ var CoinListProvider = CoinListContextProvider;
1100
1088
  import { createContext as createContext4, useContext as useContext3 } from "react";
1101
1089
 
1102
1090
  // src/client/generated/sdk-styles.gen.ts
1103
- var sdkStyles = '/*! tailwindcss v4.2.1 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--clcosdk-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--clcosdk-color-red-400:oklch(70.4% .191 22.216);--clcosdk-color-red-500:oklch(63.7% .237 25.331);--clcosdk-color-amber-500:oklch(76.9% .188 70.08);--clcosdk-color-gray-400:oklch(70.7% .022 261.325);--clcosdk-color-gray-500:oklch(55.1% .027 264.364);--clcosdk-color-black:#000;--clcosdk-spacing:.25rem;--clcosdk-container-sm:24rem;--clcosdk-container-md:28rem;--clcosdk-container-xl:36rem;--clcosdk-text-xs:.75rem;--clcosdk-text-xs--line-height:calc(1 / .75);--clcosdk-text-sm:.875rem;--clcosdk-text-sm--line-height:calc(1.25 / .875);--clcosdk-text-base:1rem;--clcosdk-text-base--line-height:calc(1.5 / 1);--clcosdk-text-lg:1.125rem;--clcosdk-text-lg--line-height:calc(1.75 / 1.125);--clcosdk-font-weight-normal:400;--clcosdk-font-weight-medium:500;--clcosdk-font-weight-semibold:600;--clcosdk-radius-md:.375rem;--clcosdk-radius-lg:.5rem;--clcosdk-radius-xl:.75rem;--clcosdk-radius-2xl:1rem;--clcosdk-ease-out:cubic-bezier(0, 0, .2, 1);--clcosdk-ease-in-out:cubic-bezier(.4, 0, .2, 1);--clcosdk-animate-spin:spin 1s linear infinite;--clcosdk-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--clcosdk-color-brand-primary:var(--color-brand-primary)}}@layer base{.clco-sdk-root{--color-brand-primary:#171717;--color-brand-primary-hover:#000;--color-brand-primary-active:#262626;--color-accent:#2b3a67;--color-accent-hover:#243057;--color-accent-active:#1d2647;--color-accent-focus:#c7d2fe;--color-accent-subtle:#eef1f8;--color-text-primary:#171717;--color-text-secondary:#8c8c8c;--color-text-disabled:#d1d1d1;--color-text-inverse:#fff;--color-background:#fff;--color-surface:#fafafa;--color-section:#f3f3f3;--color-border:#e5e5e5;--color-divider:#ececec;--color-overlay:#00000080;--color-positive:#15803d;--color-positive-subtle:#dcfce7;--color-negative:#dc2626;--color-negative-subtle:#fee2e2;--color-success:#2c8c5e;--color-success-subtle:#e6f4ec;--color-success-border:#cfe9db;--color-warning:#e08a1a;--color-warning-subtle:#fff7ed;--color-warning-border:#fdead7;--color-error:#b42318;--color-error-subtle:#feeceb;--color-error-border:#fbd5d2;--shadow-step-active:0px 0px 10px 0px #0000001a;--shadow-dialog:0px 8px 32px 0px #0000001a;--btn-primary-gradient:linear-gradient(180deg, #262626 0%, #1c1c1c 50%, #0f0f0f 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #00000059, inset 0px 1px 2px 0px #ffffff2e, inset 0px 1px 0px 0px #ffffff1a;--sale-card-surface:linear-gradient(to top, #0a0a0a 0%, #1a1a1a 100%);--color-sale-card-text:#f4f4f5;--color-sale-card-text-muted:#a1a1aa;--color-sale-card-text-strong:#fff;--color-sale-card-border:#ffffff40;--color-sale-card-chrome-border:#ffffff4d;--color-sale-card-chrome-bg:#ffffff26;--color-sale-card-chrome-emphasis-border:#fff6;--color-sale-card-chrome-emphasis-bg:#ffffff40;--color-sale-card-focus-ring:#ffffff80}@media (prefers-color-scheme:dark){.clco-sdk-root:not(:where(.light,.light *)){--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6}}:where(.dark,.dark *) .clco-sdk-root{--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6}.clco-sdk-root{color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.clco-sdk-root *,.clco-sdk-root :before,.clco-sdk-root :after{box-sizing:border-box}.clco-sdk-root button{appearance:none;cursor:pointer;font:inherit;color:inherit;background:0 0;border:none;padding:0}.clco-sdk-root input,.clco-sdk-root textarea,.clco-sdk-root select{font:inherit;color:inherit;background:0 0;border:none;border-radius:0;padding:0}.clco-sdk-root a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.clco-sdk-root ul,.clco-sdk-root ol{margin:0;padding:0;list-style:none}.clco-sdk-root h1,.clco-sdk-root h2,.clco-sdk-root h3,.clco-sdk-root h4,.clco-sdk-root h5,.clco-sdk-root h6,.clco-sdk-root p,.clco-sdk-root figure,.clco-sdk-root blockquote,.clco-sdk-root dl,.clco-sdk-root dd,.clco-sdk-root pre{margin:0}.clco-sdk-root img,.clco-sdk-root svg{max-width:100%;display:block}@keyframes clco-status-ping{0%{opacity:.7;transform:scale(1)}75%,to{opacity:0;transform:scale(3.25)}}.clco-sdk-root .clcosdk-status-dot-ping{animation:1.6s cubic-bezier(0,0,.2,1) infinite clco-status-ping}@media (prefers-reduced-motion:reduce){.clco-sdk-root .clcosdk-status-dot-ping{opacity:0;animation:none}}}@layer components;@layer utilities{.clcosdk\\:pointer-events-none{pointer-events:none}.clcosdk\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.clcosdk\\:absolute{position:absolute}.clcosdk\\:fixed{position:fixed}.clcosdk\\:relative{position:relative}.clcosdk\\:inset-0{inset:calc(var(--clcosdk-spacing) * 0)}.clcosdk\\:top-1\\/2{top:50%}.clcosdk\\:top-4{top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:top-full{top:100%}.clcosdk\\:-right-0\\.5{right:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:right-4{right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:right-\\[-14\\%\\]{right:-14%}.clcosdk\\:-bottom-0\\.5{bottom:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:bottom-full{bottom:100%}.clcosdk\\:left-1\\/2{left:50%}.clcosdk\\:z-0{z-index:0}.clcosdk\\:z-10{z-index:10}.clcosdk\\:z-50{z-index:50}.clcosdk\\:order-1{order:1}.clcosdk\\:order-2{order:2}.clcosdk\\:mt-2{margin-top:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:mt-4{margin-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:mt-auto{margin-top:auto}.clcosdk\\:mb-2{margin-bottom:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:flex{display:flex}.clcosdk\\:grid{display:grid}.clcosdk\\:inline-flex{display:inline-flex}.clcosdk\\:size-2{width:calc(var(--clcosdk-spacing) * 2);height:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:size-3{width:calc(var(--clcosdk-spacing) * 3);height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:size-3\\.5{width:calc(var(--clcosdk-spacing) * 3.5);height:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:size-4{width:calc(var(--clcosdk-spacing) * 4);height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:size-5{width:calc(var(--clcosdk-spacing) * 5);height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:size-10{width:calc(var(--clcosdk-spacing) * 10);height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:size-16{width:calc(var(--clcosdk-spacing) * 16);height:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:size-24{width:calc(var(--clcosdk-spacing) * 24);height:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:size-\\[15rem\\]{width:15rem;height:15rem}.clcosdk\\:size-full{width:100%;height:100%}.clcosdk\\:h-1{height:calc(var(--clcosdk-spacing) * 1)}.clcosdk\\:h-3{height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:h-4{height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:h-5{height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:h-6{height:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:h-8{height:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:h-10{height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:h-11{height:calc(var(--clcosdk-spacing) * 11)}.clcosdk\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:h-14{height:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:h-\\[18px\\]{height:18px}.clcosdk\\:h-\\[54px\\]{height:54px}.clcosdk\\:h-\\[71px\\]{height:71px}.clcosdk\\:h-auto{height:auto}.clcosdk\\:h-full{height:100%}.clcosdk\\:h-px{height:1px}.clcosdk\\:max-h-\\[92vh\\]{max-height:92vh}.clcosdk\\:max-h-full{max-height:100%}.clcosdk\\:min-h-0{min-height:calc(var(--clcosdk-spacing) * 0)}.clcosdk\\:min-h-9{min-height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:min-h-40{min-height:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:min-h-screen{min-height:100vh}.clcosdk\\:w-1{width:calc(var(--clcosdk-spacing) * 1)}.clcosdk\\:w-4{width:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:w-5{width:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:w-6{width:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:w-8{width:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:w-10{width:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:w-16{width:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:w-20{width:calc(var(--clcosdk-spacing) * 20)}.clcosdk\\:w-24{width:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:w-28{width:calc(var(--clcosdk-spacing) * 28)}.clcosdk\\:w-32{width:calc(var(--clcosdk-spacing) * 32)}.clcosdk\\:w-40{width:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:w-48{width:calc(var(--clcosdk-spacing) * 48)}.clcosdk\\:w-80{width:calc(var(--clcosdk-spacing) * 80)}.clcosdk\\:w-96{width:calc(var(--clcosdk-spacing) * 96)}.clcosdk\\:w-\\[16px\\]{width:16px}.clcosdk\\:w-\\[28rem\\]{width:28rem}.clcosdk\\:w-\\[448px\\]{width:448px}.clcosdk\\:w-auto{width:auto}.clcosdk\\:w-component{width:448px}.clcosdk\\:w-fit{width:fit-content}.clcosdk\\:w-full{width:100%}.clcosdk\\:w-max{width:max-content}.clcosdk\\:max-w-\\[16rem\\]{max-width:16rem}.clcosdk\\:max-w-\\[28rem\\]{max-width:28rem}.clcosdk\\:max-w-\\[30rem\\]{max-width:30rem}.clcosdk\\:max-w-\\[40rem\\]{max-width:40rem}.clcosdk\\:max-w-\\[56rem\\]{max-width:56rem}.clcosdk\\:max-w-\\[64rem\\]{max-width:64rem}.clcosdk\\:max-w-\\[760px\\]{max-width:760px}.clcosdk\\:max-w-full{max-width:100%}.clcosdk\\:max-w-md{max-width:var(--clcosdk-container-md)}.clcosdk\\:max-w-sm{max-width:var(--clcosdk-container-sm)}.clcosdk\\:max-w-xl{max-width:var(--clcosdk-container-xl)}.clcosdk\\:min-w-0{min-width:calc(var(--clcosdk-spacing) * 0)}.clcosdk\\:flex-1{flex:1}.clcosdk\\:shrink-0{flex-shrink:0}.clcosdk\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:rotate-90{rotate:90deg}.clcosdk\\:rotate-180{rotate:180deg}.clcosdk\\:animate-pulse{animation:var(--clcosdk-animate-pulse)}.clcosdk\\:animate-spin{animation:var(--clcosdk-animate-spin)}.clcosdk\\:cursor-pointer{cursor:pointer}.clcosdk\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.clcosdk\\:grid-rows-\\[0fr\\]{grid-template-rows:0fr}.clcosdk\\:grid-rows-\\[1fr\\]{grid-template-rows:1fr}.clcosdk\\:flex-col{flex-direction:column}.clcosdk\\:flex-wrap{flex-wrap:wrap}.clcosdk\\:items-center{align-items:center}.clcosdk\\:items-end{align-items:flex-end}.clcosdk\\:items-start{align-items:flex-start}.clcosdk\\:justify-between{justify-content:space-between}.clcosdk\\:justify-center{justify-content:center}.clcosdk\\:justify-end{justify-content:flex-end}.clcosdk\\:gap-1{gap:calc(var(--clcosdk-spacing) * 1)}.clcosdk\\:gap-1\\.5{gap:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:gap-2{gap:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:gap-2\\.5{gap:calc(var(--clcosdk-spacing) * 2.5)}.clcosdk\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:gap-\\[5px\\]{gap:5px}:where(.clcosdk\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.clcosdk\\:divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.clcosdk\\:divide-divider>:not(:last-child)){border-color:var(--color-divider)}.clcosdk\\:self-start{align-self:flex-start}.clcosdk\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.clcosdk\\:overflow-hidden{overflow:hidden}.clcosdk\\:overflow-y-auto{overflow-y:auto}.clcosdk\\:rounded{border-radius:.25rem}.clcosdk\\:rounded-2xl{border-radius:var(--clcosdk-radius-2xl)}.clcosdk\\:rounded-\\[20px\\]{border-radius:20px}.clcosdk\\:rounded-\\[28px\\]{border-radius:28px}.clcosdk\\:rounded-btn{border-radius:12px}.clcosdk\\:rounded-card{border-radius:24px}.clcosdk\\:rounded-full{border-radius:3.40282e38px}.clcosdk\\:rounded-lg{border-radius:var(--clcosdk-radius-lg)}.clcosdk\\:rounded-md{border-radius:var(--clcosdk-radius-md)}.clcosdk\\:rounded-xl{border-radius:var(--clcosdk-radius-xl)}.clcosdk\\:border{border-style:var(--tw-border-style);border-width:1px}.clcosdk\\:border-2{border-style:var(--tw-border-style);border-width:2px}.clcosdk\\:border-\\[1\\.5px\\]{border-style:var(--tw-border-style);border-width:1.5px}.clcosdk\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.clcosdk\\:border-accent\\/60{border-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:border-accent\\/60{border-color:color-mix(in oklab, var(--color-accent) 60%, transparent)}}.clcosdk\\:border-amber-500{border-color:var(--clcosdk-color-amber-500)}.clcosdk\\:border-background{border-color:var(--color-background)}.clcosdk\\:border-border{border-color:var(--color-border)}.clcosdk\\:border-brand-primary{border-color:var(--color-brand-primary)}.clcosdk\\:border-current{border-color:currentColor}.clcosdk\\:border-divider{border-color:var(--color-divider)}.clcosdk\\:border-error-border{border-color:var(--color-error-border)}.clcosdk\\:border-sale-card-border{border-color:var(--color-sale-card-border)}.clcosdk\\:border-sale-card-chrome-border{border-color:var(--color-sale-card-chrome-border)}.clcosdk\\:border-success-border{border-color:var(--color-success-border)}.clcosdk\\:border-warning-border{border-color:var(--color-warning-border)}.clcosdk\\:border-t-transparent{border-top-color:#0000}.clcosdk\\:bg-background{background-color:var(--color-background)}.clcosdk\\:bg-black\\/50{background-color:var(--clcosdk-color-black)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:bg-black\\/50{background-color:color-mix(in oklab, var(--clcosdk-color-black) 50%, transparent)}}.clcosdk\\:bg-brand-primary{background-color:var(--color-brand-primary)}.clcosdk\\:bg-divider{background-color:var(--color-divider)}.clcosdk\\:bg-error-subtle{background-color:var(--color-error-subtle)}.clcosdk\\:bg-overlay{background-color:var(--color-overlay)}.clcosdk\\:bg-positive{background-color:var(--color-positive)}.clcosdk\\:bg-positive-subtle{background-color:var(--color-positive-subtle)}.clcosdk\\:bg-sale-card-chrome-bg{background-color:var(--color-sale-card-chrome-bg)}.clcosdk\\:bg-section{background-color:var(--color-section)}.clcosdk\\:bg-success-subtle{background-color:var(--color-success-subtle)}.clcosdk\\:bg-surface{background-color:var(--color-surface)}.clcosdk\\:bg-text-disabled{background-color:var(--color-text-disabled)}.clcosdk\\:bg-text-primary{background-color:var(--color-text-primary)}.clcosdk\\:bg-transparent{background-color:#0000}.clcosdk\\:bg-warning-subtle{background-color:var(--color-warning-subtle)}.clcosdk\\:bg-\\[image\\:var\\(--btn-primary-gradient\\)\\]{background-image:var(--btn-primary-gradient)}.clcosdk\\:bg-\\[image\\:var\\(--sale-card-surface\\)\\]{background-image:var(--sale-card-surface)}.clcosdk\\:object-contain{object-fit:contain}.clcosdk\\:object-cover{object-fit:cover}.clcosdk\\:p-0{padding:calc(var(--clcosdk-spacing) * 0)}.clcosdk\\:p-1\\.5{padding:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:p-3{padding:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:p-3\\.5{padding:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:p-5{padding:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:p-16{padding:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:px-2{padding-inline:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:px-3{padding-inline:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:px-4{padding-inline:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:px-5{padding-inline:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:py-1\\.5{padding-block:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:py-3{padding-block:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:py-8{padding-block:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:py-12{padding-block:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:pt-1{padding-top:calc(var(--clcosdk-spacing) * 1)}.clcosdk\\:pt-4{padding-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pt-14{padding-top:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:pr-1\\.5{padding-right:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:pr-3{padding-right:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pb-4{padding-bottom:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pl-3{padding-left:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:text-center{text-align:center}.clcosdk\\:text-left{text-align:left}.clcosdk\\:text-right{text-align:right}.clcosdk\\:font-mono{font-family:var(--clcosdk-font-mono)}.clcosdk\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:text-lg{font-size:var(--clcosdk-text-lg);line-height:var(--tw-leading,var(--clcosdk-text-lg--line-height))}.clcosdk\\:text-sm{font-size:var(--clcosdk-text-sm);line-height:var(--tw-leading,var(--clcosdk-text-sm--line-height))}.clcosdk\\:text-xs{font-size:var(--clcosdk-text-xs);line-height:var(--tw-leading,var(--clcosdk-text-xs--line-height))}.clcosdk\\:text-\\[11px\\]{font-size:11px}.clcosdk\\:text-\\[12px\\]{font-size:12px}.clcosdk\\:text-\\[13px\\]{font-size:13px}.clcosdk\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:text-\\[15px\\]{font-size:15px}.clcosdk\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:text-\\[22px\\]{font-size:22px}.clcosdk\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:text-\\[36px\\]{font-size:36px}.clcosdk\\:text-\\[48px\\]{font-size:48px}.clcosdk\\:text-\\[64px\\]{font-size:64px}.clcosdk\\:leading-\\[105\\%\\]{--tw-leading:105%;line-height:105%}.clcosdk\\:leading-\\[108\\%\\]{--tw-leading:108%;line-height:108%}.clcosdk\\:leading-\\[110\\%\\]{--tw-leading:110%;line-height:110%}.clcosdk\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:leading-\\[130\\%\\]{--tw-leading:130%;line-height:130%}.clcosdk\\:leading-\\[140\\%\\]{--tw-leading:140%;line-height:140%}.clcosdk\\:leading-\\[150\\%\\]{--tw-leading:150%;line-height:150%}.clcosdk\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}.clcosdk\\:font-medium{--tw-font-weight:var(--clcosdk-font-weight-medium);font-weight:var(--clcosdk-font-weight-medium)}.clcosdk\\:font-normal{--tw-font-weight:var(--clcosdk-font-weight-normal);font-weight:var(--clcosdk-font-weight-normal)}.clcosdk\\:font-semibold{--tw-font-weight:var(--clcosdk-font-weight-semibold);font-weight:var(--clcosdk-font-weight-semibold)}.clcosdk\\:tracking-\\[0\\.12px\\]{--tw-tracking:.12px;letter-spacing:.12px}.clcosdk\\:tracking-\\[0\\.28px\\]{--tw-tracking:.28px;letter-spacing:.28px}.clcosdk\\:break-words{overflow-wrap:break-word}.clcosdk\\:whitespace-nowrap{white-space:nowrap}.clcosdk\\:text-background{color:var(--color-background)}.clcosdk\\:text-brand-primary{color:var(--color-brand-primary)}.clcosdk\\:text-error{color:var(--color-error)}.clcosdk\\:text-positive{color:var(--color-positive)}.clcosdk\\:text-sale-card-text{color:var(--color-sale-card-text)}.clcosdk\\:text-sale-card-text-muted{color:var(--color-sale-card-text-muted)}.clcosdk\\:text-sale-card-text-strong{color:var(--color-sale-card-text-strong)}.clcosdk\\:text-success{color:var(--color-success)}.clcosdk\\:text-text-disabled{color:var(--color-text-disabled)}.clcosdk\\:text-text-inverse{color:var(--color-text-inverse)}.clcosdk\\:text-text-primary{color:var(--color-text-primary)}.clcosdk\\:text-text-secondary{color:var(--color-text-secondary)}.clcosdk\\:text-warning{color:var(--color-warning)}.clcosdk\\:capitalize{text-transform:capitalize}.clcosdk\\:lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:no-underline{text-decoration-line:none}.clcosdk\\:underline{text-decoration-line:underline}.clcosdk\\:underline-offset-2{text-underline-offset:2px}.clcosdk\\:underline-offset-4{text-underline-offset:4px}.clcosdk\\:opacity-0{opacity:0}.clcosdk\\:opacity-60{opacity:.6}.clcosdk\\:shadow-\\[0_0_0_3px_rgba\\(59\\,130\\,246\\,0\\.2\\)\\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,#3b82f633);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_1px_1px_0px_rgba\\(10\\,10\\,10\\,0\\.04\\)\\,0px_8px_12px_0px_rgba\\(10\\,10\\,10\\,0\\.08\\)\\]{--tw-shadow:0px 1px 1px 0px var(--tw-shadow-color,#0a0a0a0a), 0px 8px 12px 0px var(--tw-shadow-color,#0a0a0a14);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_4px_12px_0px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\,0px_12px_28px_0px_rgba\\(0\\,0\\,0\\,0\\.13\\)\\]{--tw-shadow:0px 4px 12px 0px var(--tw-shadow-color,#00000014), 0px 12px 28px 0px var(--tw-shadow-color,#00000021);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[var\\(--btn-primary-shadow\\)\\]{--tw-shadow:var(--btn-primary-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-card{--tw-shadow:0px 4px 6px -2px var(--tw-shadow-color,#0000000d), 0px 12px 24px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-dialog{--tw-shadow:var(--shadow-dialog);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-step-active{--tw-shadow:var(--shadow-step-active);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:transition-\\[background-color\\,border-color\\]{transition-property:background-color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.clcosdk\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.clcosdk\\:duration-500{--tw-duration:.5s;transition-duration:.5s}.clcosdk\\:ease-in-out{--tw-ease:var(--clcosdk-ease-in-out);transition-timing-function:var(--clcosdk-ease-in-out)}.clcosdk\\:ease-out{--tw-ease:var(--clcosdk-ease-out);transition-timing-function:var(--clcosdk-ease-out)}.clcosdk\\:outline-none{--tw-outline-style:none;outline-style:none}.clcosdk\\:group-focus-within\\:opacity-100:is(:where(.clcosdk\\:group):focus-within *){opacity:1}@media (hover:hover){.clcosdk\\:group-hover\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):hover *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-hover\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):hover *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:group-hover\\:opacity-100:is(:where(.clcosdk\\:group):hover *){opacity:1}}.clcosdk\\:group-focus-visible\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):focus-visible *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-focus-visible\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):focus-visible *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:placeholder\\:text-text-disabled::placeholder{color:var(--color-text-disabled)}@media (hover:hover){.clcosdk\\:hover\\:scale-\\[1\\.02\\]:hover{scale:1.02}.clcosdk\\:hover\\:border-text-disabled:hover{border-color:var(--color-text-disabled)}.clcosdk\\:hover\\:bg-\\[\\#fcdcd8\\]:hover{background-color:#fcdcd8}.clcosdk\\:hover\\:bg-border:hover{background-color:var(--color-border)}.clcosdk\\:hover\\:bg-brand-primary:hover{background-color:var(--color-brand-primary)}.clcosdk\\:hover\\:bg-brand-primary-hover:hover{background-color:var(--color-brand-primary-hover)}.clcosdk\\:hover\\:bg-section:hover{background-color:var(--color-section)}.clcosdk\\:hover\\:bg-surface:hover{background-color:var(--color-surface)}.clcosdk\\:hover\\:text-\\[\\#8b1a13\\]:hover{color:#8b1a13}.clcosdk\\:hover\\:text-text-primary:hover{color:var(--color-text-primary)}.clcosdk\\:hover\\:underline:hover{text-decoration-line:underline}.clcosdk\\:hover\\:opacity-80:hover{opacity:.8}.clcosdk\\:hover\\:opacity-90:hover{opacity:.9}}.clcosdk\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:focus-visible\\:ring-gray-400:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-400)}.clcosdk\\:focus-visible\\:ring-gray-500:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-500)}.clcosdk\\:focus-visible\\:ring-red-400:focus-visible{--tw-ring-color:var(--clcosdk-color-red-400)}.clcosdk\\:focus-visible\\:ring-red-500:focus-visible{--tw-ring-color:var(--clcosdk-color-red-500)}.clcosdk\\:focus-visible\\:ring-sale-card-focus-ring:focus-visible{--tw-ring-color:var(--color-sale-card-focus-ring)}.clcosdk\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.clcosdk\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.clcosdk\\:active\\:bg-\\[\\#d9d9d9\\]:active{background-color:#d9d9d9}.clcosdk\\:active\\:bg-\\[\\#f9c9c4\\]:active{background-color:#f9c9c4}.clcosdk\\:active\\:bg-border:active{background-color:var(--color-border)}.clcosdk\\:active\\:bg-brand-primary-active:active{background-color:var(--color-brand-primary-active)}.clcosdk\\:active\\:text-\\[\\#6d1510\\]:active{color:#6d1510}.clcosdk\\:active\\:opacity-80:active{opacity:.8}.clcosdk\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.clcosdk\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.clcosdk\\:disabled\\:opacity-40:disabled{opacity:.4}.clcosdk\\:disabled\\:opacity-50:disabled{opacity:.5}.clcosdk\\:aria-disabled\\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.clcosdk\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}@media not all and (min-width:48rem){.clcosdk\\:max-md\\:hidden{display:none}.clcosdk\\:max-md\\:w-full{width:100%}.clcosdk\\:max-md\\:justify-start{justify-content:flex-start}.clcosdk\\:max-md\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:max-md\\:rounded-none{border-radius:0}.clcosdk\\:max-md\\:border-0{border-style:var(--tw-border-style);border-width:0}.clcosdk\\:max-md\\:bg-transparent{background-color:#0000}.clcosdk\\:max-md\\:p-0{padding:calc(var(--clcosdk-spacing) * 0)}@media (hover:hover){.clcosdk\\:max-md\\:hover\\:scale-100:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}@media (min-width:40rem){.clcosdk\\:sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.clcosdk\\:md\\:right-\\[-10\\%\\]{right:-10%}.clcosdk\\:md\\:order-1{order:1}.clcosdk\\:md\\:order-2{order:2}.clcosdk\\:md\\:hidden{display:none}.clcosdk\\:md\\:size-\\[20rem\\]{width:20rem;height:20rem}.clcosdk\\:md\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:h-\\[54px\\]{height:54px}.clcosdk\\:md\\:w-9{width:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-\\[minmax\\(0\\,11fr\\)_minmax\\(0\\,8fr\\)\\]{grid-template-columns:minmax(0,11fr) minmax(0,8fr)}.clcosdk\\:md\\:flex-row{flex-direction:row}.clcosdk\\:md\\:items-center{align-items:center}.clcosdk\\:md\\:items-end{align-items:flex-end}.clcosdk\\:md\\:justify-between{justify-content:space-between}.clcosdk\\:md\\:justify-end{justify-content:flex-end}.clcosdk\\:md\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:md\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:gap-x-12{column-gap:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:self-end{align-self:flex-end}.clcosdk\\:md\\:rounded-\\[40px\\]{border-radius:40px}.clcosdk\\:md\\:rounded-card{border-radius:24px}.clcosdk\\:md\\:rounded-dialog{border-radius:32px}.clcosdk\\:md\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:px-8{padding-inline:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-2{padding-right:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:pl-4{padding-left:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:md\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:md\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:md\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:md\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:md\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:md\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:not(:where(.light,.light *)):hover{background-color:#f8717133}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:where(.dark,.dark *):hover{background-color:#f8717133}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:not(:where(.light,.light *)):hover{color:#fca5a5}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:where(.dark,.dark *):hover{color:#fca5a5}}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:not(:where(.light,.light *)):active{background-color:#f871714d}}.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:where(.dark,.dark *):active{background-color:#f871714d}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-divider:not(:where(.light,.light *)):active{background-color:var(--color-divider)}}.clcosdk\\:dark\\:active\\:bg-divider:where(.dark,.dark *):active{background-color:var(--color-divider)}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:not(:where(.light,.light *)):active{color:#f87171}}.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:where(.dark,.dark *):active{color:#f87171}.clcosdk\\:\\[\\&_circle\\]\\:fill-error-subtle circle{fill:var(--color-error-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-success-subtle circle{fill:var(--color-success-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-warning-subtle circle{fill:var(--color-warning-subtle)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}';
1091
+ var sdkStyles = '/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */\n@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-duration:initial;--tw-ease:initial;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--clcosdk-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--clcosdk-color-red-400:oklch(70.4% .191 22.216);--clcosdk-color-red-500:oklch(63.7% .237 25.331);--clcosdk-color-amber-500:oklch(76.9% .188 70.08);--clcosdk-color-gray-400:oklch(70.7% .022 261.325);--clcosdk-color-gray-500:oklch(55.1% .027 264.364);--clcosdk-color-black:#000;--clcosdk-spacing:.25rem;--clcosdk-container-sm:24rem;--clcosdk-container-md:28rem;--clcosdk-container-xl:36rem;--clcosdk-text-xs:.75rem;--clcosdk-text-xs--line-height:calc(1 / .75);--clcosdk-text-sm:.875rem;--clcosdk-text-sm--line-height:calc(1.25 / .875);--clcosdk-text-base:1rem;--clcosdk-text-base--line-height:calc(1.5 / 1);--clcosdk-text-lg:1.125rem;--clcosdk-text-lg--line-height:calc(1.75 / 1.125);--clcosdk-font-weight-normal:400;--clcosdk-font-weight-medium:500;--clcosdk-font-weight-semibold:600;--clcosdk-radius-md:.375rem;--clcosdk-radius-lg:.5rem;--clcosdk-radius-xl:.75rem;--clcosdk-radius-2xl:1rem;--clcosdk-ease-out:cubic-bezier(0, 0, .2, 1);--clcosdk-ease-in-out:cubic-bezier(.4, 0, .2, 1);--clcosdk-animate-spin:spin 1s linear infinite;--clcosdk-animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--clcosdk-color-brand-primary:var(--color-brand-primary)}}@layer base{.clco-sdk-root{--color-brand-primary:#171717;--color-brand-primary-hover:#000;--color-brand-primary-active:#262626;--color-accent:#2b3a67;--color-accent-hover:#243057;--color-accent-active:#1d2647;--color-accent-focus:#c7d2fe;--color-accent-subtle:#eef1f8;--color-text-primary:#171717;--color-text-secondary:#8c8c8c;--color-text-disabled:#d1d1d1;--color-text-inverse:#fff;--color-background:#fff;--color-surface:#fafafa;--color-section:#f3f3f3;--color-border:#e5e5e5;--color-divider:#ececec;--color-overlay:#00000080;--color-positive:#15803d;--color-positive-subtle:#dcfce7;--color-negative:#dc2626;--color-negative-subtle:#fee2e2;--color-success:#2c8c5e;--color-success-subtle:#e6f4ec;--color-success-border:#cfe9db;--color-warning:#e08a1a;--color-warning-subtle:#fff7ed;--color-warning-border:#fdead7;--color-error:#b42318;--color-error-subtle:#feeceb;--color-error-border:#fbd5d2;--shadow-step-active:0px 0px 10px 0px #0000001a;--shadow-dialog:0px 8px 32px 0px #0000001a;--btn-primary-gradient:linear-gradient(180deg, #262626 0%, #1c1c1c 50%, #0f0f0f 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #00000059, inset 0px 1px 2px 0px #ffffff2e, inset 0px 1px 0px 0px #ffffff1a;--sale-card-surface:linear-gradient(to top, #0a0a0a 0%, #1a1a1a 100%);--color-sale-card-text:#f4f4f5;--color-sale-card-text-muted:#a1a1aa;--color-sale-card-text-strong:#fff;--color-sale-card-border:#ffffff40;--color-sale-card-chrome-border:#ffffff4d;--color-sale-card-chrome-bg:#ffffff26;--color-sale-card-chrome-emphasis-border:#fff6;--color-sale-card-chrome-emphasis-bg:#ffffff40;--color-sale-card-focus-ring:#ffffff80}@media (prefers-color-scheme:dark){.clco-sdk-root:not(:where(.light,.light *)){--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6}}:where(.dark,.dark *) .clco-sdk-root{--color-brand-primary:#f4f4f5;--color-brand-primary-hover:#fff;--color-brand-primary-active:#e4e4e7;--color-accent:#6f82c9;--color-accent-hover:#8799e4;--color-accent-active:#5b6fcf;--color-accent-focus:#6f82c959;--color-accent-subtle:#6f82c91f;--color-text-primary:#f4f4f5;--color-text-secondary:#a1a1aa;--color-text-disabled:#71717a;--color-text-inverse:#171717;--color-background:#0f1115;--color-surface:#161a20;--color-section:#20242c;--color-border:#2a2e35;--color-divider:#323741;--color-overlay:#000000b3;--color-positive:#22c55e;--color-positive-subtle:#22c55e1f;--color-negative:#ef4444;--color-negative-subtle:#ef44441f;--color-success:#34d399;--color-success-subtle:#34d3991f;--color-success-border:#34d39940;--color-warning:#f59e0b;--color-warning-subtle:#f59e0b1f;--color-warning-border:#f59e0b40;--color-error:#f87171;--color-error-subtle:#f871711f;--color-error-border:#f8717140;--shadow-step-active:0px 0px 10px 0px #00000080;--shadow-dialog:0px 8px 32px 0px #0009;--btn-primary-gradient:linear-gradient(180deg, #fafafa 0%, #f0f0f0 50%, #e4e4e7 100%);--btn-primary-shadow:inset 0px -1px 3px 0px #0000001f, inset 0px 1px 2px 0px #fff9, inset 0px 1px 0px 0px #fff6}.clco-sdk-root{color:var(--color-text-primary);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,sans-serif}.clco-sdk-root *,.clco-sdk-root :before,.clco-sdk-root :after{box-sizing:border-box}.clco-sdk-root button{appearance:none;cursor:pointer;font:inherit;color:inherit;background:0 0;border:none;padding:0}.clco-sdk-root input,.clco-sdk-root textarea,.clco-sdk-root select{font:inherit;color:inherit;background:0 0;border:none;border-radius:0;padding:0}.clco-sdk-root a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}.clco-sdk-root ul,.clco-sdk-root ol{margin:0;padding:0;list-style:none}.clco-sdk-root h1,.clco-sdk-root h2,.clco-sdk-root h3,.clco-sdk-root h4,.clco-sdk-root h5,.clco-sdk-root h6,.clco-sdk-root p,.clco-sdk-root figure,.clco-sdk-root blockquote,.clco-sdk-root dl,.clco-sdk-root dd,.clco-sdk-root pre{margin:0}.clco-sdk-root img,.clco-sdk-root svg{max-width:100%;display:block}@keyframes clco-status-ping{0%{opacity:.7;transform:scale(1)}75%,to{opacity:0;transform:scale(3.25)}}.clco-sdk-root .clcosdk-status-dot-ping{animation:1.6s cubic-bezier(0,0,.2,1) infinite clco-status-ping}@media (prefers-reduced-motion:reduce){.clco-sdk-root .clcosdk-status-dot-ping{opacity:0;animation:none}}}@layer components;@layer utilities{.clcosdk\\:pointer-events-none{pointer-events:none}.clcosdk\\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.clcosdk\\:absolute{position:absolute}.clcosdk\\:fixed{position:fixed}.clcosdk\\:relative{position:relative}.clcosdk\\:inset-0{inset:0}.clcosdk\\:top-1\\/2{top:50%}.clcosdk\\:top-4{top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:top-full{top:100%}.clcosdk\\:-right-0\\.5{right:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:right-4{right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:right-\\[-14\\%\\]{right:-14%}.clcosdk\\:-bottom-0\\.5{bottom:calc(var(--clcosdk-spacing) * -.5)}.clcosdk\\:bottom-full{bottom:100%}.clcosdk\\:left-1\\/2{left:50%}.clcosdk\\:z-0{z-index:0}.clcosdk\\:z-10{z-index:10}.clcosdk\\:z-50{z-index:50}.clcosdk\\:order-1{order:1}.clcosdk\\:order-2{order:2}.clcosdk\\:mt-2{margin-top:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:mt-4{margin-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:mt-auto{margin-top:auto}.clcosdk\\:mb-2{margin-bottom:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:flex{display:flex}.clcosdk\\:grid{display:grid}.clcosdk\\:inline-flex{display:inline-flex}.clcosdk\\:size-2{width:calc(var(--clcosdk-spacing) * 2);height:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:size-3{width:calc(var(--clcosdk-spacing) * 3);height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:size-3\\.5{width:calc(var(--clcosdk-spacing) * 3.5);height:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:size-4{width:calc(var(--clcosdk-spacing) * 4);height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:size-5{width:calc(var(--clcosdk-spacing) * 5);height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:size-10{width:calc(var(--clcosdk-spacing) * 10);height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:size-16{width:calc(var(--clcosdk-spacing) * 16);height:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:size-24{width:calc(var(--clcosdk-spacing) * 24);height:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:size-\\[15rem\\]{width:15rem;height:15rem}.clcosdk\\:size-full{width:100%;height:100%}.clcosdk\\:h-1{height:var(--clcosdk-spacing)}.clcosdk\\:h-3{height:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:h-4{height:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:h-5{height:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:h-6{height:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:h-8{height:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:h-10{height:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:h-11{height:calc(var(--clcosdk-spacing) * 11)}.clcosdk\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:h-14{height:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:h-\\[18px\\]{height:18px}.clcosdk\\:h-\\[54px\\]{height:54px}.clcosdk\\:h-\\[71px\\]{height:71px}.clcosdk\\:h-auto{height:auto}.clcosdk\\:h-full{height:100%}.clcosdk\\:h-px{height:1px}.clcosdk\\:max-h-\\[92vh\\]{max-height:92vh}.clcosdk\\:max-h-full{max-height:100%}.clcosdk\\:min-h-0{min-height:0}.clcosdk\\:min-h-9{min-height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:min-h-40{min-height:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:min-h-screen{min-height:100vh}.clcosdk\\:w-1{width:var(--clcosdk-spacing)}.clcosdk\\:w-4{width:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:w-5{width:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:w-6{width:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:w-8{width:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:w-10{width:calc(var(--clcosdk-spacing) * 10)}.clcosdk\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:w-16{width:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:w-20{width:calc(var(--clcosdk-spacing) * 20)}.clcosdk\\:w-24{width:calc(var(--clcosdk-spacing) * 24)}.clcosdk\\:w-28{width:calc(var(--clcosdk-spacing) * 28)}.clcosdk\\:w-32{width:calc(var(--clcosdk-spacing) * 32)}.clcosdk\\:w-40{width:calc(var(--clcosdk-spacing) * 40)}.clcosdk\\:w-48{width:calc(var(--clcosdk-spacing) * 48)}.clcosdk\\:w-80{width:calc(var(--clcosdk-spacing) * 80)}.clcosdk\\:w-96{width:calc(var(--clcosdk-spacing) * 96)}.clcosdk\\:w-\\[16px\\]{width:16px}.clcosdk\\:w-\\[28rem\\]{width:28rem}.clcosdk\\:w-\\[448px\\]{width:448px}.clcosdk\\:w-auto{width:auto}.clcosdk\\:w-component{width:448px}.clcosdk\\:w-fit{width:fit-content}.clcosdk\\:w-full{width:100%}.clcosdk\\:w-max{width:max-content}.clcosdk\\:max-w-\\[16rem\\]{max-width:16rem}.clcosdk\\:max-w-\\[28rem\\]{max-width:28rem}.clcosdk\\:max-w-\\[30rem\\]{max-width:30rem}.clcosdk\\:max-w-\\[40rem\\]{max-width:40rem}.clcosdk\\:max-w-\\[56rem\\]{max-width:56rem}.clcosdk\\:max-w-\\[64rem\\]{max-width:64rem}.clcosdk\\:max-w-\\[760px\\]{max-width:760px}.clcosdk\\:max-w-full{max-width:100%}.clcosdk\\:max-w-md{max-width:var(--clcosdk-container-md)}.clcosdk\\:max-w-sm{max-width:var(--clcosdk-container-sm)}.clcosdk\\:max-w-xl{max-width:var(--clcosdk-container-xl)}.clcosdk\\:min-w-0{min-width:0}.clcosdk\\:flex-1{flex:1}.clcosdk\\:shrink-0{flex-shrink:0}.clcosdk\\:-translate-x-1\\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:-translate-y-1\\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.clcosdk\\:rotate-90{rotate:90deg}.clcosdk\\:rotate-180{rotate:180deg}.clcosdk\\:animate-pulse{animation:var(--clcosdk-animate-pulse)}.clcosdk\\:animate-spin{animation:var(--clcosdk-animate-spin)}.clcosdk\\:cursor-pointer{cursor:pointer}.clcosdk\\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.clcosdk\\:grid-rows-\\[0fr\\]{grid-template-rows:0fr}.clcosdk\\:grid-rows-\\[1fr\\]{grid-template-rows:1fr}.clcosdk\\:flex-col{flex-direction:column}.clcosdk\\:flex-wrap{flex-wrap:wrap}.clcosdk\\:items-center{align-items:center}.clcosdk\\:items-end{align-items:flex-end}.clcosdk\\:items-start{align-items:flex-start}.clcosdk\\:justify-between{justify-content:space-between}.clcosdk\\:justify-center{justify-content:center}.clcosdk\\:justify-end{justify-content:flex-end}.clcosdk\\:gap-1{gap:var(--clcosdk-spacing)}.clcosdk\\:gap-1\\.5{gap:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:gap-2{gap:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:gap-2\\.5{gap:calc(var(--clcosdk-spacing) * 2.5)}.clcosdk\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:gap-\\[5px\\]{gap:5px}:where(.clcosdk\\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--clcosdk-spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--clcosdk-spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.clcosdk\\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.clcosdk\\:divide-border>:not(:last-child)){border-color:var(--color-border)}:where(.clcosdk\\:divide-divider>:not(:last-child)){border-color:var(--color-divider)}.clcosdk\\:self-start{align-self:flex-start}.clcosdk\\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.clcosdk\\:overflow-hidden{overflow:hidden}.clcosdk\\:overflow-y-auto{overflow-y:auto}.clcosdk\\:rounded{border-radius:.25rem}.clcosdk\\:rounded-2xl{border-radius:var(--clcosdk-radius-2xl)}.clcosdk\\:rounded-\\[20px\\]{border-radius:20px}.clcosdk\\:rounded-\\[28px\\]{border-radius:28px}.clcosdk\\:rounded-btn{border-radius:12px}.clcosdk\\:rounded-card{border-radius:24px}.clcosdk\\:rounded-full{border-radius:3.40282e38px}.clcosdk\\:rounded-lg{border-radius:var(--clcosdk-radius-lg)}.clcosdk\\:rounded-md{border-radius:var(--clcosdk-radius-md)}.clcosdk\\:rounded-xl{border-radius:var(--clcosdk-radius-xl)}.clcosdk\\:border{border-style:var(--tw-border-style);border-width:1px}.clcosdk\\:border-2{border-style:var(--tw-border-style);border-width:2px}.clcosdk\\:border-\\[1\\.5px\\]{border-style:var(--tw-border-style);border-width:1.5px}.clcosdk\\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.clcosdk\\:border-accent\\/60{border-color:var(--color-accent)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:border-accent\\/60{border-color:color-mix(in oklab, var(--color-accent) 60%, transparent)}}.clcosdk\\:border-amber-500{border-color:var(--clcosdk-color-amber-500)}.clcosdk\\:border-background{border-color:var(--color-background)}.clcosdk\\:border-border{border-color:var(--color-border)}.clcosdk\\:border-brand-primary{border-color:var(--color-brand-primary)}.clcosdk\\:border-current{border-color:currentColor}.clcosdk\\:border-divider{border-color:var(--color-divider)}.clcosdk\\:border-error-border{border-color:var(--color-error-border)}.clcosdk\\:border-sale-card-border{border-color:var(--color-sale-card-border)}.clcosdk\\:border-sale-card-chrome-border{border-color:var(--color-sale-card-chrome-border)}.clcosdk\\:border-success-border{border-color:var(--color-success-border)}.clcosdk\\:border-warning-border{border-color:var(--color-warning-border)}.clcosdk\\:border-t-transparent{border-top-color:#0000}.clcosdk\\:bg-background{background-color:var(--color-background)}.clcosdk\\:bg-black\\/50{background-color:var(--clcosdk-color-black)}@supports (color:color-mix(in lab, red, red)){.clcosdk\\:bg-black\\/50{background-color:color-mix(in oklab, var(--clcosdk-color-black) 50%, transparent)}}.clcosdk\\:bg-brand-primary{background-color:var(--color-brand-primary)}.clcosdk\\:bg-divider{background-color:var(--color-divider)}.clcosdk\\:bg-error-subtle{background-color:var(--color-error-subtle)}.clcosdk\\:bg-overlay{background-color:var(--color-overlay)}.clcosdk\\:bg-positive{background-color:var(--color-positive)}.clcosdk\\:bg-positive-subtle{background-color:var(--color-positive-subtle)}.clcosdk\\:bg-sale-card-chrome-bg{background-color:var(--color-sale-card-chrome-bg)}.clcosdk\\:bg-section{background-color:var(--color-section)}.clcosdk\\:bg-success-subtle{background-color:var(--color-success-subtle)}.clcosdk\\:bg-surface{background-color:var(--color-surface)}.clcosdk\\:bg-text-disabled{background-color:var(--color-text-disabled)}.clcosdk\\:bg-text-primary{background-color:var(--color-text-primary)}.clcosdk\\:bg-transparent{background-color:#0000}.clcosdk\\:bg-warning-subtle{background-color:var(--color-warning-subtle)}.clcosdk\\:bg-\\[image\\:var\\(--btn-primary-gradient\\)\\]{background-image:var(--btn-primary-gradient)}.clcosdk\\:bg-\\[image\\:var\\(--sale-card-surface\\)\\]{background-image:var(--sale-card-surface)}.clcosdk\\:object-contain{object-fit:contain}.clcosdk\\:object-cover{object-fit:cover}.clcosdk\\:p-0{padding:0}.clcosdk\\:p-1\\.5{padding:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:p-3{padding:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:p-3\\.5{padding:calc(var(--clcosdk-spacing) * 3.5)}.clcosdk\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:p-5{padding:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:p-16{padding:calc(var(--clcosdk-spacing) * 16)}.clcosdk\\:px-2{padding-inline:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:px-3{padding-inline:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:px-4{padding-inline:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:px-5{padding-inline:calc(var(--clcosdk-spacing) * 5)}.clcosdk\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:py-1\\.5{padding-block:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:py-3{padding-block:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:py-8{padding-block:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:py-12{padding-block:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:pt-1{padding-top:var(--clcosdk-spacing)}.clcosdk\\:pt-4{padding-top:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pt-14{padding-top:calc(var(--clcosdk-spacing) * 14)}.clcosdk\\:pr-1\\.5{padding-right:calc(var(--clcosdk-spacing) * 1.5)}.clcosdk\\:pr-3{padding-right:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pb-4{padding-bottom:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:pl-3{padding-left:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:text-center{text-align:center}.clcosdk\\:text-left{text-align:left}.clcosdk\\:text-right{text-align:right}.clcosdk\\:font-mono{font-family:var(--clcosdk-font-mono)}.clcosdk\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:text-lg{font-size:var(--clcosdk-text-lg);line-height:var(--tw-leading,var(--clcosdk-text-lg--line-height))}.clcosdk\\:text-sm{font-size:var(--clcosdk-text-sm);line-height:var(--tw-leading,var(--clcosdk-text-sm--line-height))}.clcosdk\\:text-xs{font-size:var(--clcosdk-text-xs);line-height:var(--tw-leading,var(--clcosdk-text-xs--line-height))}.clcosdk\\:text-\\[11px\\]{font-size:11px}.clcosdk\\:text-\\[12px\\]{font-size:12px}.clcosdk\\:text-\\[13px\\]{font-size:13px}.clcosdk\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:text-\\[15px\\]{font-size:15px}.clcosdk\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:text-\\[22px\\]{font-size:22px}.clcosdk\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:text-\\[36px\\]{font-size:36px}.clcosdk\\:text-\\[48px\\]{font-size:48px}.clcosdk\\:text-\\[64px\\]{font-size:64px}.clcosdk\\:leading-\\[105\\%\\]{--tw-leading:105%;line-height:105%}.clcosdk\\:leading-\\[108\\%\\]{--tw-leading:108%;line-height:108%}.clcosdk\\:leading-\\[110\\%\\]{--tw-leading:110%;line-height:110%}.clcosdk\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:leading-\\[130\\%\\]{--tw-leading:130%;line-height:130%}.clcosdk\\:leading-\\[140\\%\\]{--tw-leading:140%;line-height:140%}.clcosdk\\:leading-\\[150\\%\\]{--tw-leading:150%;line-height:150%}.clcosdk\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}.clcosdk\\:font-medium{--tw-font-weight:var(--clcosdk-font-weight-medium);font-weight:var(--clcosdk-font-weight-medium)}.clcosdk\\:font-normal{--tw-font-weight:var(--clcosdk-font-weight-normal);font-weight:var(--clcosdk-font-weight-normal)}.clcosdk\\:font-semibold{--tw-font-weight:var(--clcosdk-font-weight-semibold);font-weight:var(--clcosdk-font-weight-semibold)}.clcosdk\\:tracking-\\[0\\.12px\\]{--tw-tracking:.12px;letter-spacing:.12px}.clcosdk\\:tracking-\\[0\\.28px\\]{--tw-tracking:.28px;letter-spacing:.28px}.clcosdk\\:break-words{overflow-wrap:break-word}.clcosdk\\:whitespace-nowrap{white-space:nowrap}.clcosdk\\:text-background{color:var(--color-background)}.clcosdk\\:text-brand-primary{color:var(--color-brand-primary)}.clcosdk\\:text-error{color:var(--color-error)}.clcosdk\\:text-positive{color:var(--color-positive)}.clcosdk\\:text-sale-card-text{color:var(--color-sale-card-text)}.clcosdk\\:text-sale-card-text-muted{color:var(--color-sale-card-text-muted)}.clcosdk\\:text-sale-card-text-strong{color:var(--color-sale-card-text-strong)}.clcosdk\\:text-success{color:var(--color-success)}.clcosdk\\:text-text-disabled{color:var(--color-text-disabled)}.clcosdk\\:text-text-inverse{color:var(--color-text-inverse)}.clcosdk\\:text-text-primary{color:var(--color-text-primary)}.clcosdk\\:text-text-secondary{color:var(--color-text-secondary)}.clcosdk\\:text-warning{color:var(--color-warning)}.clcosdk\\:capitalize{text-transform:capitalize}.clcosdk\\:lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.clcosdk\\:no-underline{text-decoration-line:none}.clcosdk\\:underline{text-decoration-line:underline}.clcosdk\\:underline-offset-2{text-underline-offset:2px}.clcosdk\\:underline-offset-4{text-underline-offset:4px}.clcosdk\\:opacity-0{opacity:0}.clcosdk\\:opacity-60{opacity:.6}.clcosdk\\:shadow-\\[0_0_0_3px_rgba\\(59\\,130\\,246\\,0\\.2\\)\\]{--tw-shadow:0 0 0 3px var(--tw-shadow-color,#3b82f633);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_1px_1px_0px_rgba\\(10\\,10\\,10\\,0\\.04\\)\\,0px_8px_12px_0px_rgba\\(10\\,10\\,10\\,0\\.08\\)\\]{--tw-shadow:0px 1px 1px 0px var(--tw-shadow-color,#0a0a0a0a), 0px 8px 12px 0px var(--tw-shadow-color,#0a0a0a14);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[0px_4px_12px_0px_rgba\\(0\\,0\\,0\\,0\\.08\\)\\,0px_12px_28px_0px_rgba\\(0\\,0\\,0\\,0\\.13\\)\\]{--tw-shadow:0px 4px 12px 0px var(--tw-shadow-color,#00000014), 0px 12px 28px 0px var(--tw-shadow-color,#00000021);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-\\[var\\(--btn-primary-shadow\\)\\]{--tw-shadow:var(--btn-primary-shadow);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-card{--tw-shadow:0px 4px 6px -2px var(--tw-shadow-color,#0000000d), 0px 12px 24px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-dialog{--tw-shadow:var(--shadow-dialog);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:shadow-step-active{--tw-shadow:var(--shadow-step-active);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:transition-\\[background-color\\,border-color\\]{transition-property:background-color,border-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-\\[grid-template-rows\\]{transition-property:grid-template-rows;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.clcosdk\\:duration-200{--tw-duration:.2s;transition-duration:.2s}.clcosdk\\:duration-300{--tw-duration:.3s;transition-duration:.3s}.clcosdk\\:duration-500{--tw-duration:.5s;transition-duration:.5s}.clcosdk\\:ease-in-out{--tw-ease:var(--clcosdk-ease-in-out);transition-timing-function:var(--clcosdk-ease-in-out)}.clcosdk\\:ease-out{--tw-ease:var(--clcosdk-ease-out);transition-timing-function:var(--clcosdk-ease-out)}.clcosdk\\:outline-none{--tw-outline-style:none;outline-style:none}.clcosdk\\:group-focus-within\\:opacity-100:is(:where(.clcosdk\\:group):focus-within *){opacity:1}@media (hover:hover){.clcosdk\\:group-hover\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):hover *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-hover\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):hover *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:group-hover\\:opacity-100:is(:where(.clcosdk\\:group):hover *){opacity:1}}.clcosdk\\:group-focus-visible\\:border-sale-card-chrome-emphasis-border:is(:where(.clcosdk\\:group):focus-visible *){border-color:var(--color-sale-card-chrome-emphasis-border)}.clcosdk\\:group-focus-visible\\:bg-sale-card-chrome-emphasis-bg:is(:where(.clcosdk\\:group):focus-visible *){background-color:var(--color-sale-card-chrome-emphasis-bg)}.clcosdk\\:placeholder\\:text-text-disabled::placeholder{color:var(--color-text-disabled)}@media (hover:hover){.clcosdk\\:hover\\:scale-\\[1\\.02\\]:hover{scale:1.02}.clcosdk\\:hover\\:border-text-disabled:hover{border-color:var(--color-text-disabled)}.clcosdk\\:hover\\:bg-\\[\\#fcdcd8\\]:hover{background-color:#fcdcd8}.clcosdk\\:hover\\:bg-border:hover{background-color:var(--color-border)}.clcosdk\\:hover\\:bg-brand-primary:hover{background-color:var(--color-brand-primary)}.clcosdk\\:hover\\:bg-brand-primary-hover:hover{background-color:var(--color-brand-primary-hover)}.clcosdk\\:hover\\:bg-section:hover{background-color:var(--color-section)}.clcosdk\\:hover\\:bg-surface:hover{background-color:var(--color-surface)}.clcosdk\\:hover\\:text-\\[\\#8b1a13\\]:hover{color:#8b1a13}.clcosdk\\:hover\\:text-text-primary:hover{color:var(--color-text-primary)}.clcosdk\\:hover\\:underline:hover{text-decoration-line:underline}.clcosdk\\:hover\\:opacity-80:hover{opacity:.8}.clcosdk\\:hover\\:opacity-90:hover{opacity:.9}}.clcosdk\\:focus-visible\\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.clcosdk\\:focus-visible\\:ring-gray-400:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-400)}.clcosdk\\:focus-visible\\:ring-gray-500:focus-visible{--tw-ring-color:var(--clcosdk-color-gray-500)}.clcosdk\\:focus-visible\\:ring-red-400:focus-visible{--tw-ring-color:var(--clcosdk-color-red-400)}.clcosdk\\:focus-visible\\:ring-red-500:focus-visible{--tw-ring-color:var(--clcosdk-color-red-500)}.clcosdk\\:focus-visible\\:ring-sale-card-focus-ring:focus-visible{--tw-ring-color:var(--color-sale-card-focus-ring)}.clcosdk\\:focus-visible\\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.clcosdk\\:focus-visible\\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.clcosdk\\:active\\:bg-\\[\\#d9d9d9\\]:active{background-color:#d9d9d9}.clcosdk\\:active\\:bg-\\[\\#f9c9c4\\]:active{background-color:#f9c9c4}.clcosdk\\:active\\:bg-border:active{background-color:var(--color-border)}.clcosdk\\:active\\:bg-brand-primary-active:active{background-color:var(--color-brand-primary-active)}.clcosdk\\:active\\:text-\\[\\#6d1510\\]:active{color:#6d1510}.clcosdk\\:active\\:opacity-80:active{opacity:.8}.clcosdk\\:disabled\\:pointer-events-none:disabled{pointer-events:none}.clcosdk\\:disabled\\:cursor-not-allowed:disabled{cursor:not-allowed}.clcosdk\\:disabled\\:opacity-40:disabled{opacity:.4}.clcosdk\\:disabled\\:opacity-50:disabled{opacity:.5}.clcosdk\\:aria-disabled\\:cursor-not-allowed[aria-disabled=true]{cursor:not-allowed}.clcosdk\\:aria-disabled\\:opacity-50[aria-disabled=true]{opacity:.5}@media not all and (min-width:48rem){.clcosdk\\:max-md\\:hidden{display:none}.clcosdk\\:max-md\\:w-full{width:100%}.clcosdk\\:max-md\\:justify-start{justify-content:flex-start}.clcosdk\\:max-md\\:gap-4{gap:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:max-md\\:rounded-none{border-radius:0}.clcosdk\\:max-md\\:border-0{border-style:var(--tw-border-style);border-width:0}.clcosdk\\:max-md\\:bg-transparent{background-color:#0000}.clcosdk\\:max-md\\:p-0{padding:0}@media (hover:hover){.clcosdk\\:max-md\\:hover\\:scale-100:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x) var(--tw-scale-y)}}}@media (min-width:40rem){.clcosdk\\:sm\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.clcosdk\\:md\\:right-\\[-10\\%\\]{right:-10%}.clcosdk\\:md\\:order-1{order:1}.clcosdk\\:md\\:order-2{order:2}.clcosdk\\:md\\:hidden{display:none}.clcosdk\\:md\\:size-\\[20rem\\]{width:20rem;height:20rem}.clcosdk\\:md\\:h-9{height:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:h-12{height:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:h-\\[54px\\]{height:54px}.clcosdk\\:md\\:w-9{width:calc(var(--clcosdk-spacing) * 9)}.clcosdk\\:md\\:w-12{width:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.clcosdk\\:md\\:grid-cols-\\[minmax\\(0\\,11fr\\)_minmax\\(0\\,8fr\\)\\]{grid-template-columns:minmax(0,11fr) minmax(0,8fr)}.clcosdk\\:md\\:flex-row{flex-direction:row}.clcosdk\\:md\\:items-center{align-items:center}.clcosdk\\:md\\:items-end{align-items:flex-end}.clcosdk\\:md\\:justify-between{justify-content:space-between}.clcosdk\\:md\\:justify-end{justify-content:flex-end}.clcosdk\\:md\\:gap-3{gap:calc(var(--clcosdk-spacing) * 3)}.clcosdk\\:md\\:gap-6{gap:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:gap-x-12{column-gap:calc(var(--clcosdk-spacing) * 12)}.clcosdk\\:md\\:self-end{align-self:flex-end}.clcosdk\\:md\\:rounded-\\[40px\\]{border-radius:40px}.clcosdk\\:md\\:rounded-card{border-radius:24px}.clcosdk\\:md\\:rounded-dialog{border-radius:32px}.clcosdk\\:md\\:p-4{padding:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:p-6{padding:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:p-8{padding:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:px-6{padding-inline:calc(var(--clcosdk-spacing) * 6)}.clcosdk\\:md\\:px-8{padding-inline:calc(var(--clcosdk-spacing) * 8)}.clcosdk\\:md\\:py-2{padding-block:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-2{padding-right:calc(var(--clcosdk-spacing) * 2)}.clcosdk\\:md\\:pr-4{padding-right:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:pl-4{padding-left:calc(var(--clcosdk-spacing) * 4)}.clcosdk\\:md\\:text-base{font-size:var(--clcosdk-text-base);line-height:var(--tw-leading,var(--clcosdk-text-base--line-height))}.clcosdk\\:md\\:text-\\[14px\\]{font-size:14px}.clcosdk\\:md\\:text-\\[16px\\]{font-size:16px}.clcosdk\\:md\\:text-\\[18px\\]{font-size:18px}.clcosdk\\:md\\:text-\\[28px\\]{font-size:28px}.clcosdk\\:md\\:leading-\\[120\\%\\]{--tw-leading:120%;line-height:120%}.clcosdk\\:md\\:leading-\\[160\\%\\]{--tw-leading:160%;line-height:160%}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:not(:where(.light,.light *)):hover{background-color:#f8717133}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.20\\)\\]:where(.dark,.dark *):hover{background-color:#f8717133}}@media (prefers-color-scheme:dark){@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:not(:where(.light,.light *)):hover{color:#fca5a5}}}@media (hover:hover){.clcosdk\\:dark\\:hover\\:text-\\[\\#fca5a5\\]:where(.dark,.dark *):hover{color:#fca5a5}}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:not(:where(.light,.light *)):active{background-color:#f871714d}}.clcosdk\\:dark\\:active\\:bg-\\[rgba\\(248\\,113\\,113\\,0\\.30\\)\\]:where(.dark,.dark *):active{background-color:#f871714d}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:bg-divider:not(:where(.light,.light *)):active{background-color:var(--color-divider)}}.clcosdk\\:dark\\:active\\:bg-divider:where(.dark,.dark *):active{background-color:var(--color-divider)}@media (prefers-color-scheme:dark){.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:not(:where(.light,.light *)):active{color:#f87171}}.clcosdk\\:dark\\:active\\:text-\\[\\#f87171\\]:where(.dark,.dark *):active{color:#f87171}.clcosdk\\:\\[\\&_circle\\]\\:fill-error-subtle circle{fill:var(--color-error-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-success-subtle circle{fill:var(--color-success-subtle)}.clcosdk\\:\\[\\&_circle\\]\\:fill-warning-subtle circle{fill:var(--color-warning-subtle)}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}';
1104
1092
 
1105
1093
  // src/client/CoinListStyleScope.tsx
1106
1094
  import { Fragment, jsx as jsx2, jsxs } from "react/jsx-runtime";
@@ -1633,7 +1621,7 @@ function CoinListSignInCardContainer({
1633
1621
  }
1634
1622
 
1635
1623
  // src/client/components/checkout/CheckoutContainer.tsx
1636
- import { useState as useState22 } from "react";
1624
+ import { useState as useState23 } from "react";
1637
1625
 
1638
1626
  // src/client/components/checkout/shared/amount/CheckoutAmountInput.tsx
1639
1627
  import { useId } from "react";
@@ -5431,7 +5419,7 @@ function ErrorView4({
5431
5419
  }
5432
5420
 
5433
5421
  // src/client/hooks/checkout/ondo/buy/useOndoBuyCheckoutViewModel.ts
5434
- import { useState as useState10 } from "react";
5422
+ import { useState as useState11 } from "react";
5435
5423
 
5436
5424
  // src/client/hooks/checkout/ondo/buy/amount/useOndoBuyAmountViewModel.ts
5437
5425
  import { useEffect as useEffect4, useRef as useRef3, useState as useState4 } from "react";
@@ -5458,6 +5446,26 @@ function stablecoinIconUrl(symbol) {
5458
5446
  function offerIconUrl(offer) {
5459
5447
  return offer.logoUrl === "" ? null : AssetIconUrl(offer.logoUrl);
5460
5448
  }
5449
+ function tokenLogoUrl(logo, minWidth = 40) {
5450
+ switch (logo.kind) {
5451
+ case "VECTOR":
5452
+ return AssetIconUrl(logo.url);
5453
+ case "RASTER": {
5454
+ const chosen = logo.variants.reduce(
5455
+ (smallest, variant) => variant.width >= minWidth && (smallest === null || variant.width < smallest.width) ? variant : smallest,
5456
+ null
5457
+ );
5458
+ return AssetIconUrl((chosen ?? logo.original).url);
5459
+ }
5460
+ default: {
5461
+ const exhaustive = logo;
5462
+ return exhaustive;
5463
+ }
5464
+ }
5465
+ }
5466
+ function offerAssetIconUrl(offer, tokenMetadata) {
5467
+ return (tokenMetadata ? tokenLogoUrl(tokenMetadata.logo) : null) ?? offerIconUrl(offer);
5468
+ }
5461
5469
 
5462
5470
  // src/client/hooks/checkout/shared/checkout-ui.types.ts
5463
5471
  var CheckoutAssetUi = {
@@ -5466,10 +5474,10 @@ var CheckoutAssetUi = {
5466
5474
  * name and symbol, the caller supplies the chain it is being traded on and
5467
5475
  * whatever icon it has for it.
5468
5476
  *
5469
- * `iconUrl` is a caller's parameter rather than the token's own because a
5470
- * token does not carry one - the SDK ships no icon registry, and the only
5471
- * source is the offer being bought. Which is also why it defaults to `null`:
5472
- * the input asset a user pays with has no offer behind it.
5477
+ * `iconUrl` is a caller's parameter rather than the token's own because an
5478
+ * `Erc20Asset` does not carry one, and which source supplies it is the
5479
+ * caller's to decide. Which is also why it defaults to `null`: the input
5480
+ * asset a user pays with has no offer behind it.
5473
5481
  *
5474
5482
  * An asset sourced from the offer rather than from a token has its own
5475
5483
  * companion, {@link fromOffer}. One companion per source, not one per call
@@ -5486,7 +5494,7 @@ var CheckoutAssetUi = {
5486
5494
  }),
5487
5495
  /**
5488
5496
  * The view of the asset an offer sells: the offer supplies its name and the
5489
- * only icon the SDK has, the caller supplies the symbol and the chain.
5497
+ * fallback artwork, the caller supplies the symbol and the chain.
5490
5498
  *
5491
5499
  * `symbol` is a parameter rather than `offer.asset.code` because the symbol a
5492
5500
  * provider trades under is the provider's, not the catalogue's - Ondo's
@@ -5494,14 +5502,26 @@ var CheckoutAssetUi = {
5494
5502
  * asset stands in. Keeping it out here is what lets one companion serve every
5495
5503
  * provider instead of forking per provider.
5496
5504
  *
5505
+ * The icon is resolved from the public token registry when `tokenMetadata`
5506
+ * carries a listed token — `useCheckoutOfferTokenMetadata` fetches it,
5507
+ * keyed by the token `OfferDetail.tokens` lists for this chain — and falls
5508
+ * back to the offer's own logo otherwise. `null` covers every way the
5509
+ * registry answer can be absent (unlisted, not settled, lookup failed);
5510
+ * which one it is stays the concern of the hook's state machine, not of
5511
+ * this model, because the icon is the same either way.
5512
+ *
5497
5513
  * Deliberately no decimals. An offer names an asset; it does not answer for
5498
5514
  * the scale of any particular quantity, and every amount a checkout renders
5499
5515
  * arrives as a `BlockchainAmount` carrying its own.
5500
5516
  */
5501
- fromOffer: (offer, { symbol, networkName }) => ({
5517
+ fromOffer: (offer, {
5518
+ symbol,
5519
+ networkName,
5520
+ tokenMetadata
5521
+ }) => ({
5502
5522
  name: offer.name,
5503
5523
  symbol,
5504
- iconUrl: offerIconUrl(offer),
5524
+ iconUrl: offerAssetIconUrl(offer, tokenMetadata),
5505
5525
  network: { name: networkName, iconUrl: null }
5506
5526
  })
5507
5527
  };
@@ -5586,6 +5606,7 @@ function useOndoBuyAmountViewModel({
5586
5606
  stepInput,
5587
5607
  ondoSymbol,
5588
5608
  chain,
5609
+ swapContracts,
5589
5610
  enabled = true,
5590
5611
  onComplete,
5591
5612
  onEdit
@@ -5690,6 +5711,7 @@ function useOndoBuyAmountViewModel({
5690
5711
  wallet: stepInput.wallet,
5691
5712
  symbol: ondoSymbol,
5692
5713
  chain,
5714
+ swapContracts,
5693
5715
  // The input asset is USDC on every chain the SDK models (it is the
5694
5716
  // only member of `ONDO_SUPPORTED_INPUT_ASSETS`), and its registry
5695
5717
  // table is total, so the address is never null.
@@ -6020,6 +6042,7 @@ function useOndoBuyReviewViewModel({
6020
6042
  ondoSymbol,
6021
6043
  chain,
6022
6044
  offer,
6045
+ outputTokenMetadata,
6023
6046
  enabled = true,
6024
6047
  onComplete
6025
6048
  }) {
@@ -6072,7 +6095,8 @@ function useOndoBuyReviewViewModel({
6072
6095
  type: "active",
6073
6096
  outputAsset: CheckoutAssetUi.fromOffer(offer, {
6074
6097
  symbol: ondoSymbol,
6075
- networkName: getNetworkName(chain)
6098
+ networkName: getNetworkName(chain),
6099
+ tokenMetadata: outputTokenMetadata
6076
6100
  }),
6077
6101
  outputAmount: assetAmount(
6078
6102
  formatAmount(built.receiveOutputAmount, locale),
@@ -6210,8 +6234,6 @@ function executionErrorMessage(error) {
6210
6234
  switch (error.step) {
6211
6235
  case "quote-expired":
6212
6236
  return "That quote expired. Get a new one to place your order.";
6213
- case "spender-mismatch":
6214
- return "This quote does not match the approval you gave. Get a new one.";
6215
6237
  case "swap":
6216
6238
  switch (error.cause.type) {
6217
6239
  case "user_rejected":
@@ -6405,6 +6427,7 @@ function useOndoSidebarViewModel({
6405
6427
  offer,
6406
6428
  ondoSymbol,
6407
6429
  chain,
6430
+ tokenMetadata,
6408
6431
  priceState,
6409
6432
  tradingStatusState
6410
6433
  }) {
@@ -6412,7 +6435,8 @@ function useOndoSidebarViewModel({
6412
6435
  const state = {
6413
6436
  asset: CheckoutAssetUi.fromOffer(offer, {
6414
6437
  symbol: ondoSymbol,
6415
- networkName: getNetworkName(chain)
6438
+ networkName: getNetworkName(chain),
6439
+ tokenMetadata
6416
6440
  }),
6417
6441
  // No frontline endpoint carries any of these today, and the detail list
6418
6442
  // drops a null row rather than dashing it.
@@ -6602,6 +6626,99 @@ function toConfirmedWalletUi(wallets, wallet) {
6602
6626
  };
6603
6627
  }
6604
6628
 
6629
+ // src/client/hooks/shared/useTokenMetadata.ts
6630
+ import { useCallback as useCallback3, useEffect as useEffect10, useState as useState10 } from "react";
6631
+ var DISABLED_STATE = { type: "DISABLED" };
6632
+ var LOADING_STATE = { type: "LOADING" };
6633
+ function useTokenMetadata(options) {
6634
+ const { chain, address, data, enabled = true } = options;
6635
+ const { coinlist, isReady } = useCoinList();
6636
+ const log = useLogger("useTokenMetadata");
6637
+ const [state, setState] = useState10(
6638
+ () => data !== void 0 ? { type: "CONTENT", tokenMetadata: data } : LOADING_STATE
6639
+ );
6640
+ const [refetchCount, setRefetchCount] = useState10(0);
6641
+ const refetch = useCallback3(() => {
6642
+ setRefetchCount((count) => count + 1);
6643
+ }, []);
6644
+ useEffect10(() => {
6645
+ let isCancelled = false;
6646
+ const seedActive = data !== void 0 && refetchCount === 0;
6647
+ if (!isReady || !enabled || seedActive) {
6648
+ return () => {
6649
+ isCancelled = true;
6650
+ };
6651
+ }
6652
+ setState(LOADING_STATE);
6653
+ coinlist.tokens.get({ chain, address }).then((tokenMetadata) => {
6654
+ if (!isCancelled) {
6655
+ log.debug(() => ({
6656
+ msg: "settled",
6657
+ fields: {
6658
+ state: "CONTENT",
6659
+ listed: tokenMetadata !== null,
6660
+ symbol: tokenMetadata?.symbol ?? null
6661
+ }
6662
+ }));
6663
+ setState({ type: "CONTENT", tokenMetadata });
6664
+ }
6665
+ }).catch((error) => {
6666
+ if (!isCancelled) {
6667
+ log.failure(
6668
+ () => ({
6669
+ msg: "settled",
6670
+ fields: { state: "ERROR", reason: "generic-error" }
6671
+ }),
6672
+ error
6673
+ );
6674
+ setState({ type: "ERROR", reason: "generic-error" });
6675
+ }
6676
+ });
6677
+ return () => {
6678
+ isCancelled = true;
6679
+ };
6680
+ }, [coinlist, isReady, enabled, chain, address, data, refetchCount, log]);
6681
+ return {
6682
+ // LOADING would be a lie while disabled: nothing is in flight and nothing
6683
+ // will replace it. Settled states (a seed, a previous answer) survive.
6684
+ state: !enabled && state.type === "LOADING" ? DISABLED_STATE : state,
6685
+ refetch
6686
+ };
6687
+ }
6688
+
6689
+ // src/client/hooks/checkout/shared/data/useCheckoutOfferTokenMetadata.ts
6690
+ var NO_TOKEN_ADDRESS = EvmContractAddress(
6691
+ "0x0000000000000000000000000000000000000000"
6692
+ );
6693
+ function offerTokenIdentifier(offer, chain) {
6694
+ const byChain = offer.tokens.filter((token) => token.chain === chain);
6695
+ const asset = byChain.find((token) => token.role === "swap") ?? byChain.find((token) => token.role === "distribution");
6696
+ return asset === void 0 ? null : { chain, address: asset.address };
6697
+ }
6698
+ function tokenMetadataOf(state) {
6699
+ return state.type === "CONTENT" ? state.tokenMetadata : null;
6700
+ }
6701
+ function useCheckoutOfferTokenMetadata({
6702
+ offer,
6703
+ chain,
6704
+ data,
6705
+ enabled = true
6706
+ }) {
6707
+ const identifier = offerTokenIdentifier(offer, chain);
6708
+ const { state } = useTokenMetadata({
6709
+ // Primitive keys, not the identifier object: the underlying hook re-fetches
6710
+ // only when `(chain, address)` changes, so a host that rebuilds the offer
6711
+ // object per render does not refetch the registry per render.
6712
+ chain: identifier?.chain ?? chain,
6713
+ address: identifier?.address ?? NO_TOKEN_ADDRESS,
6714
+ // Nothing to look up when the offer lists no token here: seed "not
6715
+ // listed" and never fire a request against the placeholder address.
6716
+ enabled: enabled && identifier !== null,
6717
+ data: data !== void 0 ? data : identifier === null ? null : void 0
6718
+ });
6719
+ return { state };
6720
+ }
6721
+
6605
6722
  // src/client/hooks/checkout/ondo/buy/useOndoBuyCheckoutViewModel.ts
6606
6723
  function useOndoBuyCheckoutViewModel({
6607
6724
  offer,
@@ -6612,9 +6729,10 @@ function useOndoBuyCheckoutViewModel({
6612
6729
  onOrderConfirmed
6613
6730
  }) {
6614
6731
  const locale = useLocale();
6615
- const [step, setStep] = useState10({ type: "wallet" });
6616
- const [orderConfirmed, setOrderConfirmed] = useState10({ type: "hidden" });
6617
- const live = enabled && ondoSwapContractAddress(chain) !== null;
6732
+ const [step, setStep] = useState11({ type: "wallet" });
6733
+ const [orderConfirmed, setOrderConfirmed] = useState11(null);
6734
+ const swappableHere = swapSpender(offer.swapContracts, chain) !== null;
6735
+ const live = enabled && swappableHere;
6618
6736
  const { state: priceState } = useOndoPrice({
6619
6737
  symbol: ondoSymbol,
6620
6738
  side: "buy",
@@ -6628,6 +6746,20 @@ function useOndoBuyCheckoutViewModel({
6628
6746
  pollIntervalMs: ONDO_POLL_INTERVAL_MS,
6629
6747
  enabled: live
6630
6748
  });
6749
+ const { state: outputTokenMetadataState } = useCheckoutOfferTokenMetadata({
6750
+ offer,
6751
+ chain,
6752
+ enabled: live
6753
+ });
6754
+ const outputTokenMetadata = tokenMetadataOf(outputTokenMetadataState);
6755
+ const orderConfirmedUi = (order) => order === null ? { type: "hidden" } : toOrderConfirmedUi({
6756
+ order,
6757
+ chain,
6758
+ locale,
6759
+ offer,
6760
+ ondoSymbol,
6761
+ outputTokenMetadata
6762
+ });
6631
6763
  const { state: walletState, onEvent: onWalletEvent } = useOndoWalletSelectViewModel({
6632
6764
  stepInput: walletStepInput(step),
6633
6765
  wallets,
@@ -6642,6 +6774,7 @@ function useOndoBuyCheckoutViewModel({
6642
6774
  }),
6643
6775
  ondoSymbol,
6644
6776
  chain,
6777
+ swapContracts: offer.swapContracts,
6645
6778
  enabled: live,
6646
6779
  // Both transitions read the step through the updater rather than the one
6647
6780
  // this render closed over. Preparing an amount takes an approval to mine,
@@ -6673,11 +6806,10 @@ function useOndoBuyCheckoutViewModel({
6673
6806
  ondoSymbol,
6674
6807
  chain,
6675
6808
  offer,
6809
+ outputTokenMetadata,
6676
6810
  enabled: live,
6677
6811
  onComplete: (order) => {
6678
- setOrderConfirmed(
6679
- toOrderConfirmedUi({ order, chain, locale, offer, ondoSymbol })
6680
- );
6812
+ setOrderConfirmed(order);
6681
6813
  setStep({ type: "wallet" });
6682
6814
  onOrderConfirmed?.(order);
6683
6815
  }
@@ -6686,16 +6818,17 @@ function useOndoBuyCheckoutViewModel({
6686
6818
  offer,
6687
6819
  ondoSymbol,
6688
6820
  chain,
6821
+ tokenMetadata: outputTokenMetadata,
6689
6822
  priceState,
6690
6823
  tradingStatusState
6691
6824
  });
6692
- const state = ondoSwapContractAddress(chain) === null ? { type: "error", reason: "unsupported-chain" } : {
6825
+ const state = !swappableHere ? { type: "error", reason: "unsupported-chain" } : {
6693
6826
  type: "content",
6694
6827
  wallet: walletState,
6695
6828
  amount: amountState,
6696
6829
  review: reviewState,
6697
6830
  sidebar: sidebarState,
6698
- orderConfirmed
6831
+ orderConfirmed: orderConfirmedUi(orderConfirmed)
6699
6832
  };
6700
6833
  const onEvent = (event) => {
6701
6834
  switch (event.type) {
@@ -6719,7 +6852,7 @@ function useOndoBuyCheckoutViewModel({
6719
6852
  onReviewEvent(event);
6720
6853
  return;
6721
6854
  case "ON_CLOSE_ORDER_CONFIRMED":
6722
- setOrderConfirmed({ type: "hidden" });
6855
+ setOrderConfirmed(null);
6723
6856
  return;
6724
6857
  default: {
6725
6858
  const exhaustive = event;
@@ -6773,14 +6906,16 @@ function toOrderConfirmedUi({
6773
6906
  chain,
6774
6907
  locale,
6775
6908
  offer,
6776
- ondoSymbol
6909
+ ondoSymbol,
6910
+ outputTokenMetadata
6777
6911
  }) {
6778
6912
  const inputSymbol = TOKEN_REGISTRY.erc20(order.inputAsset).symbol;
6779
6913
  return {
6780
6914
  type: "visible",
6781
6915
  outputAsset: CheckoutAssetUi.fromOffer(offer, {
6782
6916
  symbol: ondoSymbol,
6783
- networkName: getNetworkName(chain)
6917
+ networkName: getNetworkName(chain),
6918
+ tokenMetadata: outputTokenMetadata
6784
6919
  }),
6785
6920
  outputAmount: assetAmount(
6786
6921
  formatAmount(order.transaction.receiveOutputAmount, locale),
@@ -6800,13 +6935,13 @@ function toOrderConfirmedUi({
6800
6935
  }
6801
6936
 
6802
6937
  // src/client/hooks/checkout/ondo/sell/useOndoSellCheckoutViewModel.ts
6803
- import { useState as useState15 } from "react";
6938
+ import { useState as useState16 } from "react";
6804
6939
 
6805
6940
  // src/client/hooks/checkout/ondo/sell/amount/useOndoSellAmountViewModel.ts
6806
- import { useEffect as useEffect11, useRef as useRef9, useState as useState12 } from "react";
6941
+ import { useEffect as useEffect12, useRef as useRef9, useState as useState13 } from "react";
6807
6942
 
6808
6943
  // src/client/hooks/shared/erc20/useErc20Balance.ts
6809
- import { useEffect as useEffect10, useRef as useRef8, useState as useState11 } from "react";
6944
+ import { useEffect as useEffect11, useRef as useRef8, useState as useState12 } from "react";
6810
6945
  function useErc20Balance(options) {
6811
6946
  const {
6812
6947
  tokenAddress,
@@ -6817,12 +6952,12 @@ function useErc20Balance(options) {
6817
6952
  } = options;
6818
6953
  const { coinlist, isReady } = useCoinList();
6819
6954
  const log = useLogger("useErc20Balance");
6820
- const [balance, setBalance] = useState11(null);
6821
- const [isLoading, setIsLoading] = useState11(true);
6955
+ const [balance, setBalance] = useState12(null);
6956
+ const [isLoading, setIsLoading] = useState12(true);
6822
6957
  const fetchIdRef = useRef8(0);
6823
6958
  const isFetchingRef = useRef8(false);
6824
6959
  const hasReadRef = useRef8(false);
6825
- useEffect10(() => {
6960
+ useEffect11(() => {
6826
6961
  if (!isReady) return;
6827
6962
  setBalance(null);
6828
6963
  hasReadRef.current = false;
@@ -6899,15 +7034,16 @@ function useOndoSellAmountViewModel({
6899
7034
  ondoSymbol,
6900
7035
  chain,
6901
7036
  offer,
7037
+ inputTokenMetadata,
6902
7038
  enabled = true,
6903
7039
  onComplete,
6904
7040
  onEdit
6905
7041
  }) {
6906
7042
  const { coinlist } = useCoinList();
6907
7043
  const locale = useLocale();
6908
- const [amountInput, setAmountInput] = useState12("");
6909
- const [error, setError] = useState12(null);
6910
- const [phase, setPhase] = useState12(null);
7044
+ const [amountInput, setAmountInput] = useState13("");
7045
+ const [error, setError] = useState13(null);
7046
+ const [phase, setPhase] = useState13(null);
6911
7047
  const preparationIdRef = useRef9(0);
6912
7048
  const isActive = stepInput.type === "active";
6913
7049
  const networkName = getNetworkName(chain);
@@ -6919,7 +7055,7 @@ function useOndoSellAmountViewModel({
6919
7055
  chain,
6920
7056
  enabled: enabled && isActive && sellAsset2 !== null
6921
7057
  });
6922
- useEffect11(() => {
7058
+ useEffect12(() => {
6923
7059
  if (stepInput.type === "incomplete") {
6924
7060
  ++preparationIdRef.current;
6925
7061
  setAmountInput("");
@@ -6945,7 +7081,8 @@ function useOndoSellAmountViewModel({
6945
7081
  type: "complete",
6946
7082
  asset: CheckoutAssetUi.fromOffer(offer, {
6947
7083
  symbol: stepInput.inputAsset,
6948
- networkName
7084
+ networkName,
7085
+ tokenMetadata: inputTokenMetadata
6949
7086
  }),
6950
7087
  amountFormatted: assetAmount(
6951
7088
  formatAmount(stepInput.amount, locale),
@@ -6967,7 +7104,8 @@ function useOndoSellAmountViewModel({
6967
7104
  return {
6968
7105
  asset: CheckoutAssetUi.fromOffer(offer, {
6969
7106
  symbol: ondoSymbol,
6970
- networkName
7107
+ networkName,
7108
+ tokenMetadata: inputTokenMetadata
6971
7109
  }),
6972
7110
  balance: assetAmount(formatAmount(amount, locale), ondoSymbol),
6973
7111
  rawBalance: balance
@@ -7003,6 +7141,7 @@ function useOndoSellAmountViewModel({
7003
7141
  wallet: stepInput.wallet,
7004
7142
  symbol: ondoSymbol,
7005
7143
  chain,
7144
+ swapContracts: offer.swapContracts,
7006
7145
  // The asset, not a stablecoin: a sell spends what it is selling, so this
7007
7146
  // is the contract the swap contract has to be allowed to pull from.
7008
7147
  tokenAddress: asset.address,
@@ -7153,15 +7292,15 @@ function preparationErrorMessage2(error) {
7153
7292
  }
7154
7293
 
7155
7294
  // src/client/hooks/checkout/ondo/sell/review/useOndoSellReviewViewModel.ts
7156
- import { useEffect as useEffect13, useRef as useRef11, useState as useState14 } from "react";
7295
+ import { useEffect as useEffect14, useRef as useRef11, useState as useState15 } from "react";
7157
7296
 
7158
7297
  // src/client/hooks/checkout/ondo/sell/data/useOndoSellTransaction.ts
7159
- import { useCallback as useCallback3, useEffect as useEffect12, useRef as useRef10, useState as useState13 } from "react";
7298
+ import { useCallback as useCallback4, useEffect as useEffect13, useRef as useRef10, useState as useState14 } from "react";
7160
7299
  function useOndoSellTransaction(options) {
7161
7300
  const { request, data, enabled } = options;
7162
7301
  const { coinlist, isReady } = useCoinList();
7163
7302
  const log = useLogger("useOndoSellTransaction");
7164
- const [state, setState] = useState13(
7303
+ const [state, setState] = useState14(
7165
7304
  () => data === void 0 ? { type: "LOADING" } : {
7166
7305
  type: "CONTENT",
7167
7306
  transaction: data,
@@ -7174,7 +7313,7 @@ function useOndoSellTransaction(options) {
7174
7313
  const requestKey = request === null ? null : stableKey2(request);
7175
7314
  const requestRef = useRef10(request);
7176
7315
  requestRef.current = request;
7177
- const build = useCallback3(async () => {
7316
+ const build = useCallback4(async () => {
7178
7317
  const params = requestRef.current;
7179
7318
  if (!isReady || !enabled || params === null) return;
7180
7319
  if (isFetchingRef.current) return;
@@ -7210,7 +7349,7 @@ function useOndoSellTransaction(options) {
7210
7349
  isFetchingRef.current = false;
7211
7350
  }
7212
7351
  }, [coinlist, isReady, enabled, log]);
7213
- useEffect12(() => {
7352
+ useEffect13(() => {
7214
7353
  if (data === void 0) return;
7215
7354
  ++fetchIdRef.current;
7216
7355
  setState({
@@ -7221,14 +7360,14 @@ function useOndoSellTransaction(options) {
7221
7360
  });
7222
7361
  }, [data]);
7223
7362
  const hasSeed = data !== void 0;
7224
- useEffect12(() => {
7363
+ useEffect13(() => {
7225
7364
  if (hasSeed || requestKey === null) return;
7226
7365
  build();
7227
7366
  return () => {
7228
7367
  ++fetchIdRef.current;
7229
7368
  };
7230
7369
  }, [build, requestKey, hasSeed]);
7231
- const refetch = useCallback3(() => {
7370
+ const refetch = useCallback4(() => {
7232
7371
  build();
7233
7372
  }, [build]);
7234
7373
  return { state, refetch };
@@ -7253,8 +7392,8 @@ function useOndoSellReviewViewModel({
7253
7392
  }) {
7254
7393
  const { coinlist } = useCoinList();
7255
7394
  const locale = useLocale();
7256
- const [phase, setPhase] = useState14(null);
7257
- const [error, setError] = useState14(null);
7395
+ const [phase, setPhase] = useState15(null);
7396
+ const [error, setError] = useState15(null);
7258
7397
  const isActive = stepInput.type === "active";
7259
7398
  const { state: transactionState, refetch } = useOndoSellTransaction({
7260
7399
  request: isActive ? {
@@ -7267,7 +7406,7 @@ function useOndoSellReviewViewModel({
7267
7406
  enabled: enabled && isActive
7268
7407
  });
7269
7408
  const executionIdRef = useRef11(0);
7270
- useEffect13(() => {
7409
+ useEffect14(() => {
7271
7410
  if (stepInput.type === "incomplete") {
7272
7411
  ++executionIdRef.current;
7273
7412
  setError(null);
@@ -7444,8 +7583,6 @@ function executionErrorMessage2(error) {
7444
7583
  switch (error.step) {
7445
7584
  case "quote-expired":
7446
7585
  return "That quote expired. Get a new one to place your order.";
7447
- case "spender-mismatch":
7448
- return "This quote does not match the approval you gave. Get a new one.";
7449
7586
  case "swap":
7450
7587
  switch (error.cause.type) {
7451
7588
  case "user_rejected":
@@ -7479,13 +7616,14 @@ function useOndoSellCheckoutViewModel({
7479
7616
  onOrderConfirmed
7480
7617
  }) {
7481
7618
  const locale = useLocale();
7482
- const [initialStep] = useState15(
7619
+ const [initialStep] = useState16(
7483
7620
  () => wallets.preselected === null ? { type: "wallet" } : { type: "amount", wallet: wallets.preselected }
7484
7621
  );
7485
- const [step, setStep] = useState15(initialStep);
7622
+ const [step, setStep] = useState16(initialStep);
7486
7623
  const hasWalletStep = initialStep.type === "wallet";
7487
- const [orderConfirmed, setOrderConfirmed] = useState15({ type: "hidden" });
7488
- const live = enabled && ondoSwapContractAddress(chain) !== null;
7624
+ const [orderConfirmed, setOrderConfirmed] = useState16(null);
7625
+ const swappableHere = swapSpender(offer.swapContracts, chain) !== null;
7626
+ const live = enabled && swappableHere;
7489
7627
  const { state: priceState } = useOndoPrice({
7490
7628
  symbol: ondoSymbol,
7491
7629
  side: "sell",
@@ -7499,6 +7637,20 @@ function useOndoSellCheckoutViewModel({
7499
7637
  pollIntervalMs: ONDO_POLL_INTERVAL_MS,
7500
7638
  enabled: live
7501
7639
  });
7640
+ const { state: inputTokenMetadataState } = useCheckoutOfferTokenMetadata({
7641
+ offer,
7642
+ chain,
7643
+ enabled: live
7644
+ });
7645
+ const inputTokenMetadata = tokenMetadataOf(inputTokenMetadataState);
7646
+ const orderConfirmedUi = (order) => order === null ? { type: "hidden" } : toOrderConfirmedUi2({
7647
+ order,
7648
+ chain,
7649
+ locale,
7650
+ offer,
7651
+ ondoSymbol,
7652
+ inputTokenMetadata
7653
+ });
7502
7654
  const { state: walletState, onEvent: onWalletEvent } = useOndoWalletSelectViewModel({
7503
7655
  stepInput: walletStepInput2(step),
7504
7656
  wallets,
@@ -7515,6 +7667,7 @@ function useOndoSellCheckoutViewModel({
7515
7667
  ondoSymbol,
7516
7668
  chain,
7517
7669
  offer,
7670
+ inputTokenMetadata,
7518
7671
  enabled: live,
7519
7672
  // Both transitions read the step through the updater rather than the one
7520
7673
  // this render closed over. Preparing an amount takes an approval to mine,
@@ -7547,9 +7700,7 @@ function useOndoSellCheckoutViewModel({
7547
7700
  chain,
7548
7701
  enabled: live,
7549
7702
  onComplete: (order) => {
7550
- setOrderConfirmed(
7551
- toOrderConfirmedUi2({ order, chain, locale, offer, ondoSymbol })
7552
- );
7703
+ setOrderConfirmed(order);
7553
7704
  setStep(initialStep);
7554
7705
  onOrderConfirmed?.(order);
7555
7706
  }
@@ -7558,16 +7709,17 @@ function useOndoSellCheckoutViewModel({
7558
7709
  offer,
7559
7710
  ondoSymbol,
7560
7711
  chain,
7712
+ tokenMetadata: inputTokenMetadata,
7561
7713
  priceState,
7562
7714
  tradingStatusState
7563
7715
  });
7564
- const state = ondoSwapContractAddress(chain) === null ? { type: "error", reason: "unsupported-chain" } : {
7716
+ const state = !swappableHere ? { type: "error", reason: "unsupported-chain" } : {
7565
7717
  type: "content",
7566
7718
  wallet: hasWalletStep ? walletState : null,
7567
7719
  amount: amountState,
7568
7720
  review: reviewState,
7569
7721
  sidebar: sidebarState,
7570
- orderConfirmed
7722
+ orderConfirmed: orderConfirmedUi(orderConfirmed)
7571
7723
  };
7572
7724
  const onEvent = (event) => {
7573
7725
  switch (event.type) {
@@ -7591,7 +7743,7 @@ function useOndoSellCheckoutViewModel({
7591
7743
  onReviewEvent(event);
7592
7744
  return;
7593
7745
  case "ON_CLOSE_SELL_ORDER_CONFIRMED":
7594
- setOrderConfirmed({ type: "hidden" });
7746
+ setOrderConfirmed(null);
7595
7747
  return;
7596
7748
  default: {
7597
7749
  const exhaustive = event;
@@ -7659,14 +7811,16 @@ function toOrderConfirmedUi2({
7659
7811
  chain,
7660
7812
  locale,
7661
7813
  offer,
7662
- ondoSymbol
7814
+ ondoSymbol,
7815
+ inputTokenMetadata
7663
7816
  }) {
7664
7817
  const settlementSymbol = TOKEN_REGISTRY.erc20(ONDO_SETTLEMENT_ASSET).symbol;
7665
7818
  return {
7666
7819
  type: "visible",
7667
7820
  soldAsset: CheckoutAssetUi.fromOffer(offer, {
7668
7821
  symbol: ondoSymbol,
7669
- networkName: getNetworkName(chain)
7822
+ networkName: getNetworkName(chain),
7823
+ tokenMetadata: inputTokenMetadata
7670
7824
  }),
7671
7825
  soldAmount: assetAmount(
7672
7826
  formatAmount(order.transaction.spendInputAmount, locale),
@@ -7690,10 +7844,10 @@ function toOrderConfirmedUi2({
7690
7844
  }
7691
7845
 
7692
7846
  // src/client/hooks/checkout/superstate/swap/useSuperstateSwapCheckoutViewModel.ts
7693
- import { useState as useState21 } from "react";
7847
+ import { useState as useState22 } from "react";
7694
7848
 
7695
7849
  // src/client/hooks/checkout/superstate/swap/amount/useSuperstateAmountViewModel.ts
7696
- import { useEffect as useEffect14, useState as useState16 } from "react";
7850
+ import { useEffect as useEffect15, useState as useState17 } from "react";
7697
7851
  var NO_WALLET3 = EvmWalletAddress(
7698
7852
  "0x0000000000000000000000000000000000000000"
7699
7853
  );
@@ -7707,11 +7861,11 @@ function useSuperstateAmountViewModel({
7707
7861
  enabled = true
7708
7862
  }) {
7709
7863
  const locale = useLocale();
7710
- const [amountInput, setAmountInput] = useState16("");
7711
- const [selectedAsset, setSelectedAsset] = useState16(
7864
+ const [amountInput, setAmountInput] = useState17("");
7865
+ const [selectedAsset, setSelectedAsset] = useState17(
7712
7866
  SUPERSTATE_SUPPORTED_INPUT_ASSETS[0]
7713
7867
  );
7714
- const [error, setError] = useState16(null);
7868
+ const [error, setError] = useState17(null);
7715
7869
  const isActive = stepInput.type === "active";
7716
7870
  const networkName = getNetworkName(chain);
7717
7871
  const { balances, isLoading: balancesLoading } = useErc20TokenBalances({
@@ -7724,7 +7878,7 @@ function useSuperstateAmountViewModel({
7724
7878
  // on this step satisfies the first and not the second.
7725
7879
  enabled: enabled && isActive
7726
7880
  });
7727
- useEffect14(() => {
7881
+ useEffect15(() => {
7728
7882
  if (stepInput.type === "incomplete") {
7729
7883
  setAmountInput("");
7730
7884
  setSelectedAsset(SUPERSTATE_SUPPORTED_INPUT_ASSETS[0]);
@@ -7895,20 +8049,20 @@ function toInputAssetUi2({
7895
8049
  }
7896
8050
 
7897
8051
  // src/client/hooks/checkout/superstate/swap/data/useSwapOutputToken.ts
7898
- import { useCallback as useCallback4, useEffect as useEffect15, useRef as useRef12, useState as useState17 } from "react";
7899
- var LOADING_STATE = { type: "LOADING" };
8052
+ import { useCallback as useCallback5, useEffect as useEffect16, useRef as useRef12, useState as useState18 } from "react";
8053
+ var LOADING_STATE2 = { type: "LOADING" };
7900
8054
  function useSwapOutputToken(options) {
7901
8055
  const { contractAddress, chain, enabled } = options;
7902
8056
  const { coinlist, isReady } = useCoinList();
7903
8057
  const log = useLogger("useSwapOutputToken");
7904
- const [outputTokenState, setOutputTokenState] = useState17(LOADING_STATE);
7905
- const [retryCount, setRetryCount] = useState17(0);
8058
+ const [outputTokenState, setOutputTokenState] = useState18(LOADING_STATE2);
8059
+ const [retryCount, setRetryCount] = useState18(0);
7906
8060
  const fetchIdRef = useRef12(0);
7907
- const refetch = useCallback4(() => {
7908
- setOutputTokenState(LOADING_STATE);
8061
+ const refetch = useCallback5(() => {
8062
+ setOutputTokenState(LOADING_STATE2);
7909
8063
  setRetryCount((count) => count + 1);
7910
8064
  }, []);
7911
- useEffect15(() => {
8065
+ useEffect16(() => {
7912
8066
  if (!enabled || !isReady) return;
7913
8067
  const currentFetchId = ++fetchIdRef.current;
7914
8068
  const load = async () => {
@@ -7941,7 +8095,7 @@ function useSwapOutputToken(options) {
7941
8095
  }
7942
8096
 
7943
8097
  // src/client/hooks/checkout/superstate/swap/data/useSwapQuote.ts
7944
- import { useEffect as useEffect16, useRef as useRef13, useState as useState18 } from "react";
8098
+ import { useEffect as useEffect17, useRef as useRef13, useState as useState19 } from "react";
7945
8099
  function useSwapQuote(options) {
7946
8100
  const {
7947
8101
  contractAddress,
@@ -7954,13 +8108,13 @@ function useSwapQuote(options) {
7954
8108
  } = options;
7955
8109
  const { coinlist, isReady } = useCoinList();
7956
8110
  const log = useLogger("useSwapQuote");
7957
- const [quote, setQuote] = useState18(null);
7958
- const [isLoading, setIsLoading] = useState18(true);
7959
- const [isRefreshing, setIsRefreshing] = useState18(false);
8111
+ const [quote, setQuote] = useState19(null);
8112
+ const [isLoading, setIsLoading] = useState19(true);
8113
+ const [isRefreshing, setIsRefreshing] = useState19(false);
7960
8114
  const isFetchingRef = useRef13(false);
7961
8115
  const hasQuoteRef = useRef13(false);
7962
8116
  const fetchIdRef = useRef13(0);
7963
- useEffect16(() => {
8117
+ useEffect17(() => {
7964
8118
  if (!isReady) return;
7965
8119
  if (!enabled) {
7966
8120
  setIsLoading(false);
@@ -8030,7 +8184,7 @@ function useSwapQuote(options) {
8030
8184
  }
8031
8185
 
8032
8186
  // src/client/hooks/checkout/superstate/swap/review/useSuperstateReviewViewModel.ts
8033
- import { useEffect as useEffect17, useState as useState19 } from "react";
8187
+ import { useEffect as useEffect18, useState as useState20 } from "react";
8034
8188
  function useSuperstateReviewViewModel({
8035
8189
  stepInput,
8036
8190
  contractAddress,
@@ -8040,11 +8194,11 @@ function useSuperstateReviewViewModel({
8040
8194
  }) {
8041
8195
  const { coinlist, isReady } = useCoinList();
8042
8196
  const locale = useLocale();
8043
- const [slippageBps, setSlippageBps] = useState19(DEFAULT_SLIPPAGE_BPS);
8044
- const [slippageExpanded, setSlippageExpanded] = useState19(false);
8045
- const [phase, setPhase] = useState19(null);
8046
- const [error, setError] = useState19(null);
8047
- useEffect17(() => {
8197
+ const [slippageBps, setSlippageBps] = useState20(DEFAULT_SLIPPAGE_BPS);
8198
+ const [slippageExpanded, setSlippageExpanded] = useState20(false);
8199
+ const [phase, setPhase] = useState20(null);
8200
+ const [error, setError] = useState20(null);
8201
+ useEffect18(() => {
8048
8202
  if (stepInput.type === "incomplete") {
8049
8203
  setSlippageBps(DEFAULT_SLIPPAGE_BPS);
8050
8204
  setSlippageExpanded(false);
@@ -8373,7 +8527,7 @@ function priceUi(quote, outputToken, locale) {
8373
8527
  }
8374
8528
 
8375
8529
  // src/client/hooks/checkout/superstate/swap/wallet/useSuperstateWalletViewModel.ts
8376
- import { useEffect as useEffect18, useState as useState20 } from "react";
8530
+ import { useEffect as useEffect19, useState as useState21 } from "react";
8377
8531
  var CONNECT_FAILED2 = "Could not connect that wallet. Please try again.";
8378
8532
  function useSuperstateWalletViewModel({
8379
8533
  stepInput,
@@ -8386,12 +8540,12 @@ function useSuperstateWalletViewModel({
8386
8540
  }) {
8387
8541
  const { coinlist, isReady } = useCoinList();
8388
8542
  const log = useLogger("useSuperstateWalletViewModel");
8389
- const [selected, setSelected] = useState20(null);
8390
- const [phase, setPhase] = useState20(null);
8391
- const [error, setError] = useState20(null);
8543
+ const [selected, setSelected] = useState21(null);
8544
+ const [phase, setPhase] = useState21(null);
8545
+ const [error, setError] = useState21(null);
8392
8546
  const networkName = getNetworkName(chain);
8393
8547
  const selectedWallet = resolveWallet2(wallets, selected);
8394
- useEffect18(() => {
8548
+ useEffect19(() => {
8395
8549
  if (stepInput.type === "completed") {
8396
8550
  setPhase(null);
8397
8551
  setError(null);
@@ -8610,12 +8764,20 @@ function useSuperstateSwapCheckoutViewModel({
8610
8764
  }) {
8611
8765
  const locale = useLocale();
8612
8766
  const contractAddress = superstateSwapContractAddress(chain);
8613
- const assetIconUrl = offerIconUrl(offer);
8614
- const [step, setStep] = useState21({ type: "wallet" });
8615
- const [orderConfirmed, setOrderConfirmed] = useState21({ type: "hidden" });
8767
+ const [step, setStep] = useState22({ type: "wallet" });
8768
+ const [orderConfirmed, setOrderConfirmed] = useState22(null);
8616
8769
  const { inputAmount, inputTokenAddress } = quoteInput(step, chain);
8617
8770
  const live = enabled && contractAddress !== null;
8618
8771
  const contract = contractAddress ?? NO_CONTRACT;
8772
+ const { state: offerTokenMetadataState } = useCheckoutOfferTokenMetadata({
8773
+ offer,
8774
+ chain,
8775
+ enabled: live
8776
+ });
8777
+ const assetIconUrl = offerAssetIconUrl(
8778
+ offer,
8779
+ tokenMetadataOf(offerTokenMetadataState)
8780
+ );
8619
8781
  const { outputTokenState, refetch: refetchOutputToken } = useSwapOutputToken({
8620
8782
  contractAddress: contract,
8621
8783
  chain,
@@ -8672,9 +8834,7 @@ function useSuperstateSwapCheckoutViewModel({
8672
8834
  chain,
8673
8835
  assetIconUrl,
8674
8836
  onComplete: (order) => {
8675
- setOrderConfirmed(
8676
- toOrderConfirmedUi3({ order, chain, locale, assetIconUrl })
8677
- );
8837
+ setOrderConfirmed(order);
8678
8838
  setStep({ type: "wallet" });
8679
8839
  onOrderConfirmed?.(order);
8680
8840
  }
@@ -8700,7 +8860,15 @@ function useSuperstateSwapCheckoutViewModel({
8700
8860
  amount: amountState,
8701
8861
  review: reviewState,
8702
8862
  sidebar: sidebarState,
8703
- orderConfirmed
8863
+ // Derived here rather than in the review completion callback, so a
8864
+ // registry lookup that settles while the order is being placed still
8865
+ // reaches the dialog instead of the fallback icon that closure captured.
8866
+ orderConfirmed: orderConfirmed === null ? { type: "hidden" } : toOrderConfirmedUi3({
8867
+ order: orderConfirmed,
8868
+ chain,
8869
+ locale,
8870
+ assetIconUrl
8871
+ })
8704
8872
  };
8705
8873
  };
8706
8874
  const onEvent = (event) => {
@@ -8725,7 +8893,7 @@ function useSuperstateSwapCheckoutViewModel({
8725
8893
  onReviewEvent(event);
8726
8894
  return;
8727
8895
  case "ON_CLOSE_ORDER_CONFIRMED":
8728
- setOrderConfirmed({ type: "hidden" });
8896
+ setOrderConfirmed(null);
8729
8897
  return;
8730
8898
  case "ON_RETRY_LOAD":
8731
8899
  refetchOutputToken();
@@ -8840,7 +9008,7 @@ function CheckoutContainer({
8840
9008
  enabled = true,
8841
9009
  className
8842
9010
  }) {
8843
- const [side] = useState22(() => config["ondo::swap"].side());
9011
+ const [side] = useState23(() => config["ondo::swap"].side());
8844
9012
  const isOndo = offer.type === "ondo::swap";
8845
9013
  const ondoSymbol = config["ondo::swap"].symbol(offer);
8846
9014
  const ondoBuy = useOndoBuyCheckoutViewModel({
@@ -9413,23 +9581,23 @@ function EmptyState() {
9413
9581
  }
9414
9582
 
9415
9583
  // src/client/hooks/offers/grid/useOffersGridViewModel.ts
9416
- import { useCallback as useCallback5, useMemo as useMemo4 } from "react";
9584
+ import { useCallback as useCallback6, useMemo as useMemo4 } from "react";
9417
9585
 
9418
9586
  // src/client/hooks/offers/data/useOffers.ts
9419
- import { useEffect as useEffect19, useState as useState23 } from "react";
9420
- var LOADING_STATE2 = { type: "LOADING" };
9587
+ import { useEffect as useEffect20, useState as useState24 } from "react";
9588
+ var LOADING_STATE3 = { type: "LOADING" };
9421
9589
  function useOffers(options = {}) {
9422
9590
  const { coinlist, isReady } = useCoinList();
9423
9591
  const log = useLogger("useOffers");
9424
9592
  const { data: serverOffers } = options;
9425
- const [offersState, setOffersState] = useState23(
9426
- serverOffers !== void 0 ? { type: "CONTENT", offers: serverOffers } : LOADING_STATE2
9593
+ const [offersState, setOffersState] = useState24(
9594
+ serverOffers !== void 0 ? { type: "CONTENT", offers: serverOffers } : LOADING_STATE3
9427
9595
  );
9428
- useEffect19(() => {
9596
+ useEffect20(() => {
9429
9597
  let isCancelled = false;
9430
9598
  if (!isReady) {
9431
9599
  if (serverOffers === void 0) {
9432
- setOffersState(LOADING_STATE2);
9600
+ setOffersState(LOADING_STATE3);
9433
9601
  }
9434
9602
  return () => {
9435
9603
  isCancelled = true;
@@ -9440,7 +9608,7 @@ function useOffers(options = {}) {
9440
9608
  isCancelled = true;
9441
9609
  };
9442
9610
  }
9443
- setOffersState(LOADING_STATE2);
9611
+ setOffersState(LOADING_STATE3);
9444
9612
  coinlist.offers.list().then((offers) => {
9445
9613
  if (!isCancelled) {
9446
9614
  log.debug(() => ({
@@ -9495,7 +9663,7 @@ function useOffersGridViewModel(options = {}) {
9495
9663
  () => toUiState(offersState, onOfferClick !== void 0),
9496
9664
  [offersState, onOfferClick]
9497
9665
  );
9498
- const onEvent = useCallback5(
9666
+ const onEvent = useCallback6(
9499
9667
  (event) => {
9500
9668
  switch (event.type) {
9501
9669
  case "ON_OFFER_CLICK": {
@@ -9555,14 +9723,14 @@ function OffersGridContainer({
9555
9723
  return /* @__PURE__ */ jsx55(OffersGridView, { state, onEvent, ...viewProps });
9556
9724
  }
9557
9725
 
9558
- // src/client/components/requirements/checklist/ConnectedWalletList.tsx
9559
- import { useState as useState24 } from "react";
9726
+ // src/client/components/requirements/ConnectedWalletList.tsx
9727
+ import { useState as useState25 } from "react";
9560
9728
  import { jsx as jsx56, jsxs as jsxs40 } from "react/jsx-runtime";
9561
9729
  function ConnectedWalletRow({
9562
9730
  wallet,
9563
9731
  onRemove
9564
9732
  }) {
9565
- const [state, setState] = useState24("idle");
9733
+ const [state, setState] = useState25("idle");
9566
9734
  const remove = async () => {
9567
9735
  if (!onRemove) return;
9568
9736
  setState("removing");
@@ -9671,91 +9839,307 @@ function ConnectedWalletListBody({
9671
9839
  );
9672
9840
  }
9673
9841
 
9674
- // src/client/components/requirements/checklist/RequirementItem.tsx
9675
- import { ChevronRight } from "lucide-react";
9676
-
9677
- // src/client/components/design-system/StepStatusIcon.tsx
9678
- import { CircleCheck as CircleCheck2, CircleX, Info as Info5 } from "lucide-react";
9679
- import { jsx as jsx57 } from "react/jsx-runtime";
9680
- var statusConfig = {
9681
- required: {
9682
- Icon: Info5,
9683
- colorClass: "clcosdk:text-warning",
9684
- fillClass: "clcosdk:[&_circle]:fill-warning-subtle"
9685
- },
9686
- pending: {
9687
- Icon: Info5,
9688
- colorClass: "clcosdk:text-warning",
9689
- fillClass: "clcosdk:[&_circle]:fill-warning-subtle"
9690
- },
9691
- completed: {
9692
- Icon: CircleCheck2,
9693
- colorClass: "clcosdk:text-success",
9694
- fillClass: "clcosdk:[&_circle]:fill-success-subtle"
9695
- },
9696
- rejected: {
9697
- Icon: CircleX,
9698
- colorClass: "clcosdk:text-error",
9699
- fillClass: "clcosdk:[&_circle]:fill-error-subtle"
9700
- }
9701
- };
9702
- function StepStatusIcon({ status, className }) {
9703
- const { Icon, colorClass, fillClass } = statusConfig[status];
9704
- return /* @__PURE__ */ jsx57(
9705
- Icon,
9706
- {
9707
- className: cn(
9708
- "clcosdk:h-6 clcosdk:w-6 clcosdk:shrink-0",
9709
- colorClass,
9710
- fillClass,
9711
- className
9712
- ),
9713
- "aria-hidden": "true"
9714
- }
9715
- );
9842
+ // src/client/components/requirements/identity-verification/IdentityVerificationView.tsx
9843
+ import SumsubWebSdk from "@sumsub/websdk-react";
9844
+ import { jsx as jsx57, jsxs as jsxs41 } from "react/jsx-runtime";
9845
+ function IdentityVerificationView(props) {
9846
+ return /* @__PURE__ */ jsx57(CoinListStyleScope, { children: /* @__PURE__ */ jsx57(IdentityVerificationViewBody, { ...props }) });
9716
9847
  }
9717
-
9718
- // src/client/components/requirements/checklist/RequirementItem.tsx
9719
- import { Fragment as Fragment9, jsx as jsx58, jsxs as jsxs41 } from "react/jsx-runtime";
9720
- function VerificationActionZone({
9721
- status,
9722
- onAction,
9723
- onContactSupport
9848
+ function IdentityVerificationViewBody({
9849
+ state,
9850
+ onEvent,
9851
+ className
9724
9852
  }) {
9725
- switch (status) {
9726
- case "required":
9727
- if (onAction === null) return null;
9728
- return /* @__PURE__ */ jsx58(ClButton, { size: "sm", onClick: onAction, children: "Continue" });
9729
- case "pending":
9730
- return /* @__PURE__ */ jsx58(
9731
- AlertBanner,
9853
+ switch (state.type) {
9854
+ case "loading":
9855
+ return /* @__PURE__ */ jsx57(
9856
+ "output",
9732
9857
  {
9733
- variant: "warning",
9734
- content: "Under review. We'll notify you when complete."
9858
+ "aria-live": "polite",
9859
+ className: cn(
9860
+ "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center",
9861
+ className
9862
+ ),
9863
+ children: /* @__PURE__ */ jsx57("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading identity verification..." })
9735
9864
  }
9736
9865
  );
9737
- case "completed":
9738
- return /* @__PURE__ */ jsx58(AlertBanner, { variant: "success", content: "Identity verified." });
9739
- case "rejected":
9740
- return /* @__PURE__ */ jsx58(
9741
- AlertBanner,
9866
+ case "error":
9867
+ return /* @__PURE__ */ jsxs41(
9868
+ "div",
9742
9869
  {
9743
- variant: "error",
9744
- content: onContactSupport === null ? "Verification rejected." : /* @__PURE__ */ jsxs41(Fragment9, { children: [
9745
- "Verification rejected.",
9746
- " ",
9747
- /* @__PURE__ */ jsx58(
9748
- "button",
9749
- {
9750
- type: "button",
9751
- onClick: onContactSupport,
9752
- className: "clcosdk:underline",
9753
- children: "Contact support"
9754
- }
9755
- ),
9756
- "."
9757
- ] })
9758
- }
9870
+ className: cn(
9871
+ "clcosdk:flex clcosdk:flex-col clcosdk:gap-4",
9872
+ className
9873
+ ),
9874
+ children: [
9875
+ /* @__PURE__ */ jsx57(AlertBanner, { variant: "error", icon: true, content: state.message }),
9876
+ state.retryable && /* @__PURE__ */ jsx57(ClButton, { size: "sm", onClick: () => onEvent({ type: "ON_RETRY" }), children: "Try again" })
9877
+ ]
9878
+ }
9879
+ );
9880
+ case "ready":
9881
+ return /* @__PURE__ */ jsx57("div", { className: cn("clcosdk:w-full", className), children: /* @__PURE__ */ jsx57(
9882
+ SumsubWebSdk,
9883
+ {
9884
+ accessToken: state.accessToken,
9885
+ expirationHandler: state.refreshToken,
9886
+ config: state.locale === void 0 ? {} : { lang: state.locale },
9887
+ options: { addViewportTag: false, adaptIframeHeight: true },
9888
+ onMessage: (type, payload) => {
9889
+ onSumsubMessage(type, payload, onEvent);
9890
+ },
9891
+ onError: (error) => {
9892
+ onEvent({ type: "ON_ERROR", error: toError(error) });
9893
+ }
9894
+ }
9895
+ ) });
9896
+ default: {
9897
+ const exhaustive = state;
9898
+ return exhaustive;
9899
+ }
9900
+ }
9901
+ }
9902
+ function onSumsubMessage(type, payload, onEvent) {
9903
+ switch (type) {
9904
+ case "idCheck.onApplicantSubmitted":
9905
+ onEvent({ type: "ON_SUBMITTED" });
9906
+ return;
9907
+ case "idCheck.onError": {
9908
+ const message = payload?.message ?? "Verification error";
9909
+ onEvent({ type: "ON_ERROR", error: new Error(message) });
9910
+ return;
9911
+ }
9912
+ default:
9913
+ return;
9914
+ }
9915
+ }
9916
+ function toError(error) {
9917
+ return error instanceof Error ? error : new Error("Verification error");
9918
+ }
9919
+
9920
+ // src/client/hooks/requirements/identity-verification/useIdentityVerificationViewModel.ts
9921
+ import { useCallback as useCallback8, useEffect as useEffect22, useMemo as useMemo5, useRef as useRef15 } from "react";
9922
+
9923
+ // src/client/hooks/requirements/data/useKycToken.ts
9924
+ import { useCallback as useCallback7, useEffect as useEffect21, useRef as useRef14, useState as useState26 } from "react";
9925
+ var IDLE_STATE = { type: "IDLE" };
9926
+ var LOADING_STATE4 = { type: "LOADING" };
9927
+ function useKycToken(levelName, reset) {
9928
+ const { coinlist } = useCoinList();
9929
+ const log = useLogger("useKycToken");
9930
+ const [kycTokenState, setKycTokenState] = useState26(IDLE_STATE);
9931
+ const resetPendingRef = useRef14(reset === true);
9932
+ const tokenIssuedRef = useRef14(false);
9933
+ useEffect21(() => {
9934
+ if (!tokenIssuedRef.current) {
9935
+ resetPendingRef.current = reset === true;
9936
+ }
9937
+ }, [reset]);
9938
+ const fetchToken = useCallback7(async () => {
9939
+ setKycTokenState(LOADING_STATE4);
9940
+ try {
9941
+ const kycToken = await coinlist.requirements.createKycToken({
9942
+ levelName,
9943
+ reset: resetPendingRef.current
9944
+ });
9945
+ resetPendingRef.current = false;
9946
+ tokenIssuedRef.current = true;
9947
+ log.debug(() => ({
9948
+ msg: "settled",
9949
+ fields: { state: "CONTENT" }
9950
+ }));
9951
+ setKycTokenState({ type: "CONTENT", token: kycToken.token });
9952
+ return kycToken.token;
9953
+ } catch (error) {
9954
+ const reason = error instanceof NotAuthenticatedError ? "not-authenticated" : "generic-error";
9955
+ log.failure(
9956
+ () => ({ msg: "settled", fields: { state: "ERROR", reason } }),
9957
+ error
9958
+ );
9959
+ setKycTokenState({ type: "ERROR", reason });
9960
+ throw error;
9961
+ }
9962
+ }, [coinlist, levelName, log]);
9963
+ return { kycTokenState, fetchToken };
9964
+ }
9965
+
9966
+ // src/client/hooks/requirements/identity-verification/useIdentityVerificationViewModel.ts
9967
+ var NOT_AUTHENTICATED_MESSAGE2 = "Sign in to verify your identity.";
9968
+ var GENERIC_ERROR_MESSAGE2 = "Unable to start identity verification right now. Please try again.";
9969
+ function useIdentityVerificationViewModel(options = {}) {
9970
+ const { levelName, reset, locale, onSubmitted, onError } = options;
9971
+ const { kycTokenState, fetchToken } = useKycToken(levelName, reset);
9972
+ const fetchedRef = useRef15(false);
9973
+ useEffect22(() => {
9974
+ if (fetchedRef.current) {
9975
+ return;
9976
+ }
9977
+ fetchedRef.current = true;
9978
+ fetchToken().catch(() => {
9979
+ });
9980
+ }, [fetchToken]);
9981
+ const state = useMemo5(() => {
9982
+ switch (kycTokenState.type) {
9983
+ case "IDLE":
9984
+ case "LOADING":
9985
+ return { type: "loading" };
9986
+ case "ERROR": {
9987
+ const notAuthenticated = kycTokenState.reason === "not-authenticated";
9988
+ return {
9989
+ type: "error",
9990
+ message: notAuthenticated ? NOT_AUTHENTICATED_MESSAGE2 : GENERIC_ERROR_MESSAGE2,
9991
+ retryable: !notAuthenticated
9992
+ };
9993
+ }
9994
+ case "CONTENT":
9995
+ return {
9996
+ type: "ready",
9997
+ accessToken: kycTokenState.token,
9998
+ locale,
9999
+ refreshToken: fetchToken
10000
+ };
10001
+ default: {
10002
+ const exhaustive = kycTokenState;
10003
+ return exhaustive;
10004
+ }
10005
+ }
10006
+ }, [kycTokenState, locale, fetchToken]);
10007
+ const onEvent = useCallback8(
10008
+ (event) => {
10009
+ switch (event.type) {
10010
+ case "ON_RETRY":
10011
+ fetchToken().catch(() => {
10012
+ });
10013
+ return;
10014
+ case "ON_SUBMITTED":
10015
+ onSubmitted?.();
10016
+ return;
10017
+ case "ON_ERROR":
10018
+ onError?.(event.error);
10019
+ return;
10020
+ default: {
10021
+ const exhaustive = event;
10022
+ return exhaustive;
10023
+ }
10024
+ }
10025
+ },
10026
+ [fetchToken, onSubmitted, onError]
10027
+ );
10028
+ return { state, onEvent };
10029
+ }
10030
+
10031
+ // src/client/components/requirements/identity-verification/IdentityVerificationContainer.tsx
10032
+ import { jsx as jsx58 } from "react/jsx-runtime";
10033
+ function IdentityVerificationContainer({
10034
+ levelName,
10035
+ reset,
10036
+ locale,
10037
+ onSubmitted,
10038
+ onError,
10039
+ className
10040
+ }) {
10041
+ const { state, onEvent } = useIdentityVerificationViewModel({
10042
+ levelName,
10043
+ reset,
10044
+ locale,
10045
+ onSubmitted,
10046
+ onError
10047
+ });
10048
+ return /* @__PURE__ */ jsx58(
10049
+ IdentityVerificationView,
10050
+ {
10051
+ state,
10052
+ onEvent,
10053
+ className
10054
+ }
10055
+ );
10056
+ }
10057
+
10058
+ // src/client/components/requirements/RequirementItem.tsx
10059
+ import { ChevronRight } from "lucide-react";
10060
+
10061
+ // src/client/components/design-system/StepStatusIcon.tsx
10062
+ import { CircleCheck as CircleCheck2, CircleX, Info as Info5 } from "lucide-react";
10063
+ import { jsx as jsx59 } from "react/jsx-runtime";
10064
+ var statusConfig = {
10065
+ required: {
10066
+ Icon: Info5,
10067
+ colorClass: "clcosdk:text-warning",
10068
+ fillClass: "clcosdk:[&_circle]:fill-warning-subtle"
10069
+ },
10070
+ pending: {
10071
+ Icon: Info5,
10072
+ colorClass: "clcosdk:text-warning",
10073
+ fillClass: "clcosdk:[&_circle]:fill-warning-subtle"
10074
+ },
10075
+ completed: {
10076
+ Icon: CircleCheck2,
10077
+ colorClass: "clcosdk:text-success",
10078
+ fillClass: "clcosdk:[&_circle]:fill-success-subtle"
10079
+ },
10080
+ rejected: {
10081
+ Icon: CircleX,
10082
+ colorClass: "clcosdk:text-error",
10083
+ fillClass: "clcosdk:[&_circle]:fill-error-subtle"
10084
+ }
10085
+ };
10086
+ function StepStatusIcon({ status, className }) {
10087
+ const { Icon, colorClass, fillClass } = statusConfig[status];
10088
+ return /* @__PURE__ */ jsx59(
10089
+ Icon,
10090
+ {
10091
+ className: cn(
10092
+ "clcosdk:h-6 clcosdk:w-6 clcosdk:shrink-0",
10093
+ colorClass,
10094
+ fillClass,
10095
+ className
10096
+ ),
10097
+ "aria-hidden": "true"
10098
+ }
10099
+ );
10100
+ }
10101
+
10102
+ // src/client/components/requirements/RequirementItem.tsx
10103
+ import { Fragment as Fragment9, jsx as jsx60, jsxs as jsxs42 } from "react/jsx-runtime";
10104
+ function VerificationActionZone({
10105
+ status,
10106
+ onAction,
10107
+ onContactSupport
10108
+ }) {
10109
+ switch (status) {
10110
+ case "required":
10111
+ if (onAction === null) return null;
10112
+ return /* @__PURE__ */ jsx60(ClButton, { size: "sm", onClick: onAction, children: "Continue" });
10113
+ case "pending":
10114
+ return /* @__PURE__ */ jsx60(
10115
+ AlertBanner,
10116
+ {
10117
+ variant: "warning",
10118
+ content: "Under review. We'll notify you when complete."
10119
+ }
10120
+ );
10121
+ case "completed":
10122
+ return /* @__PURE__ */ jsx60(AlertBanner, { variant: "success", content: "Identity verified." });
10123
+ case "rejected":
10124
+ return /* @__PURE__ */ jsx60(
10125
+ AlertBanner,
10126
+ {
10127
+ variant: "error",
10128
+ content: onContactSupport === null ? "Verification rejected." : /* @__PURE__ */ jsxs42(Fragment9, { children: [
10129
+ "Verification rejected.",
10130
+ " ",
10131
+ /* @__PURE__ */ jsx60(
10132
+ "button",
10133
+ {
10134
+ type: "button",
10135
+ onClick: onContactSupport,
10136
+ className: "clcosdk:underline",
10137
+ children: "Contact support"
10138
+ }
10139
+ ),
10140
+ "."
10141
+ ] })
10142
+ }
9759
10143
  );
9760
10144
  }
9761
10145
  }
@@ -9768,8 +10152,8 @@ function WalletActionZone({
9768
10152
  onRemoveWallet
9769
10153
  }) {
9770
10154
  if (multiWallet) {
9771
- return /* @__PURE__ */ jsxs41(Fragment9, { children: [
9772
- /* @__PURE__ */ jsx58(
10155
+ return /* @__PURE__ */ jsxs42(Fragment9, { children: [
10156
+ /* @__PURE__ */ jsx60(
9773
10157
  ConnectedWalletList,
9774
10158
  {
9775
10159
  wallets: connectedWallets,
@@ -9778,7 +10162,7 @@ function WalletActionZone({
9778
10162
  status: walletsStatus
9779
10163
  }
9780
10164
  ),
9781
- status === "rejected" && /* @__PURE__ */ jsx58(
10165
+ status === "rejected" && /* @__PURE__ */ jsx60(
9782
10166
  AlertBanner,
9783
10167
  {
9784
10168
  variant: "error",
@@ -9789,21 +10173,21 @@ function WalletActionZone({
9789
10173
  }
9790
10174
  if (status === "completed") {
9791
10175
  const connected = connectedWallets[0];
9792
- return /* @__PURE__ */ jsxs41(Fragment9, { children: [
9793
- onAction !== null && /* @__PURE__ */ jsx58(ClButton, { size: "sm", variant: "secondary", onClick: onAction, children: "Change wallet" }),
9794
- walletsStatus === "loading" ? /* @__PURE__ */ jsx58(
10176
+ return /* @__PURE__ */ jsxs42(Fragment9, { children: [
10177
+ onAction !== null && /* @__PURE__ */ jsx60(ClButton, { size: "sm", variant: "secondary", onClick: onAction, children: "Change wallet" }),
10178
+ walletsStatus === "loading" ? /* @__PURE__ */ jsx60(
9795
10179
  AlertBanner,
9796
10180
  {
9797
10181
  variant: "info",
9798
10182
  content: "Loading your connected wallet\u2026"
9799
10183
  }
9800
- ) : walletsStatus === "error" ? /* @__PURE__ */ jsx58(
10184
+ ) : walletsStatus === "error" ? /* @__PURE__ */ jsx60(
9801
10185
  AlertBanner,
9802
10186
  {
9803
10187
  variant: "error",
9804
10188
  content: "Couldn't load your connected wallet."
9805
10189
  }
9806
- ) : /* @__PURE__ */ jsx58(
10190
+ ) : /* @__PURE__ */ jsx60(
9807
10191
  AlertBanner,
9808
10192
  {
9809
10193
  variant: "success",
@@ -9813,9 +10197,9 @@ function WalletActionZone({
9813
10197
  ] });
9814
10198
  }
9815
10199
  if (status === "rejected") {
9816
- return /* @__PURE__ */ jsxs41(Fragment9, { children: [
9817
- onAction !== null && /* @__PURE__ */ jsx58(ClButton, { size: "sm", onClick: onAction, children: "Connect wallet" }),
9818
- /* @__PURE__ */ jsx58(
10200
+ return /* @__PURE__ */ jsxs42(Fragment9, { children: [
10201
+ onAction !== null && /* @__PURE__ */ jsx60(ClButton, { size: "sm", onClick: onAction, children: "Connect wallet" }),
10202
+ /* @__PURE__ */ jsx60(
9819
10203
  AlertBanner,
9820
10204
  {
9821
10205
  variant: "error",
@@ -9825,7 +10209,7 @@ function WalletActionZone({
9825
10209
  ] });
9826
10210
  }
9827
10211
  if (onAction === null) return null;
9828
- return /* @__PURE__ */ jsx58(ClButton, { size: "sm", onClick: onAction, children: "Connect wallet" });
10212
+ return /* @__PURE__ */ jsx60(ClButton, { size: "sm", onClick: onAction, children: "Connect wallet" });
9829
10213
  }
9830
10214
  function RequirementItem({
9831
10215
  ui,
@@ -9837,7 +10221,7 @@ function RequirementItem({
9837
10221
  walletsStatus,
9838
10222
  onContactSupport
9839
10223
  }) {
9840
- return /* @__PURE__ */ jsx58(CoinListStyleScope, { children: /* @__PURE__ */ jsxs41(
10224
+ return /* @__PURE__ */ jsx60(CoinListStyleScope, { children: /* @__PURE__ */ jsxs42(
9841
10225
  "div",
9842
10226
  {
9843
10227
  className: cn(
@@ -9845,7 +10229,7 @@ function RequirementItem({
9845
10229
  className
9846
10230
  ),
9847
10231
  children: [
9848
- /* @__PURE__ */ jsxs41(
10232
+ /* @__PURE__ */ jsxs42(
9849
10233
  "button",
9850
10234
  {
9851
10235
  type: "button",
@@ -9853,9 +10237,9 @@ function RequirementItem({
9853
10237
  "aria-expanded": expanded,
9854
10238
  className: "clcosdk:flex clcosdk:h-14 clcosdk:w-full clcosdk:cursor-pointer clcosdk:items-center clcosdk:justify-between clcosdk:rounded-2xl clcosdk:px-2 clcosdk:transition-colors clcosdk:hover:bg-surface",
9855
10239
  children: [
9856
- /* @__PURE__ */ jsxs41("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-3", children: [
9857
- /* @__PURE__ */ jsx58(StepStatusIcon, { status: ui.status }),
9858
- /* @__PURE__ */ jsx58(
10240
+ /* @__PURE__ */ jsxs42("div", { className: "clcosdk:flex clcosdk:items-center clcosdk:gap-3", children: [
10241
+ /* @__PURE__ */ jsx60(StepStatusIcon, { status: ui.status }),
10242
+ /* @__PURE__ */ jsx60(
9859
10243
  "span",
9860
10244
  {
9861
10245
  className: cn(
@@ -9866,7 +10250,7 @@ function RequirementItem({
9866
10250
  }
9867
10251
  )
9868
10252
  ] }),
9869
- /* @__PURE__ */ jsx58(
10253
+ /* @__PURE__ */ jsx60(
9870
10254
  ChevronRight,
9871
10255
  {
9872
10256
  className: cn(
@@ -9879,15 +10263,15 @@ function RequirementItem({
9879
10263
  ]
9880
10264
  }
9881
10265
  ),
9882
- /* @__PURE__ */ jsx58(
10266
+ /* @__PURE__ */ jsx60(
9883
10267
  "div",
9884
10268
  {
9885
10269
  className: cn(
9886
10270
  "clcosdk:grid clcosdk:transition-[grid-template-rows] clcosdk:duration-300 clcosdk:ease-in-out",
9887
10271
  expanded ? "clcosdk:grid-rows-[1fr]" : "clcosdk:grid-rows-[0fr]"
9888
10272
  ),
9889
- children: /* @__PURE__ */ jsx58("div", { className: "clcosdk:min-h-0 clcosdk:overflow-hidden", children: /* @__PURE__ */ jsxs41("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:px-2 clcosdk:pb-4", children: [
9890
- /* @__PURE__ */ jsx58(
10273
+ children: /* @__PURE__ */ jsx60("div", { className: "clcosdk:min-h-0 clcosdk:overflow-hidden", children: /* @__PURE__ */ jsxs42("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:px-2 clcosdk:pb-4", children: [
10274
+ /* @__PURE__ */ jsx60(
9891
10275
  "p",
9892
10276
  {
9893
10277
  className: cn(
@@ -9897,14 +10281,14 @@ function RequirementItem({
9897
10281
  children: ui.description
9898
10282
  }
9899
10283
  ),
9900
- ui.variant === "verification" ? /* @__PURE__ */ jsx58(
10284
+ ui.variant === "verification" ? /* @__PURE__ */ jsx60(
9901
10285
  VerificationActionZone,
9902
10286
  {
9903
10287
  status: ui.status,
9904
10288
  onAction,
9905
10289
  onContactSupport
9906
10290
  }
9907
- ) : /* @__PURE__ */ jsx58(
10291
+ ) : /* @__PURE__ */ jsx60(
9908
10292
  WalletActionZone,
9909
10293
  {
9910
10294
  status: ui.status,
@@ -9923,10 +10307,10 @@ function RequirementItem({
9923
10307
  ) });
9924
10308
  }
9925
10309
 
9926
- // src/client/components/requirements/checklist/RequirementsChecklistView.tsx
9927
- import { jsx as jsx59, jsxs as jsxs42 } from "react/jsx-runtime";
10310
+ // src/client/components/requirements/RequirementsChecklistView.tsx
10311
+ import { jsx as jsx61, jsxs as jsxs43 } from "react/jsx-runtime";
9928
10312
  function RequirementsChecklistView(props) {
9929
- return /* @__PURE__ */ jsx59(CoinListStyleScope, { children: /* @__PURE__ */ jsx59(RequirementsChecklistViewBody, { ...props }) });
10313
+ return /* @__PURE__ */ jsx61(CoinListStyleScope, { children: /* @__PURE__ */ jsx61(RequirementsChecklistViewBody, { ...props }) });
9930
10314
  }
9931
10315
  function RequirementsChecklistViewBody({
9932
10316
  state,
@@ -9938,11 +10322,11 @@ function RequirementsChecklistViewBody({
9938
10322
  }) {
9939
10323
  switch (state.type) {
9940
10324
  case "loading":
9941
- return loading ?? /* @__PURE__ */ jsx59(LoadingState2, {});
10325
+ return loading ?? /* @__PURE__ */ jsx61(LoadingState2, {});
9942
10326
  case "not-authenticated":
9943
10327
  return unauthenticatedState ?? null;
9944
10328
  case "error":
9945
- return error ?? /* @__PURE__ */ jsx59(
10329
+ return error ?? /* @__PURE__ */ jsx61(
9946
10330
  AlertBanner,
9947
10331
  {
9948
10332
  variant: "error",
@@ -9952,7 +10336,7 @@ function RequirementsChecklistViewBody({
9952
10336
  }
9953
10337
  );
9954
10338
  case "content":
9955
- return /* @__PURE__ */ jsxs42(
10339
+ return /* @__PURE__ */ jsxs43(
9956
10340
  "div",
9957
10341
  {
9958
10342
  className: cn(
@@ -9960,11 +10344,11 @@ function RequirementsChecklistViewBody({
9960
10344
  className
9961
10345
  ),
9962
10346
  children: [
9963
- /* @__PURE__ */ jsxs42("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
9964
- /* @__PURE__ */ jsx59("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
9965
- /* @__PURE__ */ jsx59("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: state.description })
10347
+ /* @__PURE__ */ jsxs43("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
10348
+ /* @__PURE__ */ jsx61("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
10349
+ /* @__PURE__ */ jsx61("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: state.description })
9966
10350
  ] }),
9967
- /* @__PURE__ */ jsx59("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:divide-y clcosdk:divide-divider", children: state.items.map((row) => /* @__PURE__ */ jsx59(
10351
+ /* @__PURE__ */ jsx61("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:divide-y clcosdk:divide-divider", children: state.items.map((row) => /* @__PURE__ */ jsx61(
9968
10352
  RequirementItem,
9969
10353
  {
9970
10354
  ui: row.item,
@@ -9983,7 +10367,7 @@ function RequirementsChecklistViewBody({
9983
10367
  },
9984
10368
  row.id
9985
10369
  )) }),
9986
- state.ineligible && /* @__PURE__ */ jsx59(
10370
+ state.ineligible && /* @__PURE__ */ jsx61(
9987
10371
  AlertBanner,
9988
10372
  {
9989
10373
  variant: "error",
@@ -9991,7 +10375,7 @@ function RequirementsChecklistViewBody({
9991
10375
  content: "You are not eligible to participate."
9992
10376
  }
9993
10377
  ),
9994
- state.continueAction && /* @__PURE__ */ jsx59(
10378
+ state.continueAction && /* @__PURE__ */ jsx61(
9995
10379
  ClButton,
9996
10380
  {
9997
10381
  fullWidth: true,
@@ -10003,274 +10387,25 @@ function RequirementsChecklistViewBody({
10003
10387
  ]
10004
10388
  }
10005
10389
  );
10006
- default: {
10007
- const exhaustive = state;
10008
- return exhaustive;
10009
- }
10010
- }
10011
- }
10012
- function LoadingState2() {
10013
- return /* @__PURE__ */ jsx59(
10014
- "output",
10015
- {
10016
- "aria-live": "polite",
10017
- className: "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center clcosdk:rounded-2xl clcosdk:border clcosdk:border-border clcosdk:bg-background clcosdk:p-6",
10018
- children: /* @__PURE__ */ jsx59("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading requirements..." })
10019
- }
10020
- );
10021
- }
10022
-
10023
- // src/client/components/requirements/checklist/VerificationOverlay.tsx
10024
- import { jsx as jsx60, jsxs as jsxs43 } from "react/jsx-runtime";
10025
- function VerificationOverlay({
10026
- onClose,
10027
- children
10028
- }) {
10029
- return /* @__PURE__ */ jsx60(CoinListStyleScope, { children: /* @__PURE__ */ jsx60(VerificationOverlayBody, { onClose, children }) });
10030
- }
10031
- function VerificationOverlayBody({
10032
- onClose,
10033
- children
10034
- }) {
10035
- return /* @__PURE__ */ jsx60(
10036
- "div",
10037
- {
10038
- role: "dialog",
10039
- "aria-modal": "true",
10040
- "aria-label": "Identity verification",
10041
- className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-overlay clcosdk:p-4",
10042
- children: /* @__PURE__ */ jsxs43("div", { className: "clcosdk:relative clcosdk:flex clcosdk:max-h-[92vh] clcosdk:w-full clcosdk:max-w-[760px] clcosdk:flex-col clcosdk:overflow-y-auto clcosdk:rounded-2xl clcosdk:bg-background clcosdk:p-6 clcosdk:pt-14", children: [
10043
- /* @__PURE__ */ jsx60(
10044
- CloseButton,
10045
- {
10046
- onClick: onClose,
10047
- className: "clcosdk:absolute clcosdk:top-4 clcosdk:right-4"
10048
- }
10049
- ),
10050
- children
10051
- ] })
10052
- }
10053
- );
10054
- }
10055
-
10056
- // src/client/components/requirements/identity-verification/IdentityVerificationView.tsx
10057
- import SumsubWebSdk from "@sumsub/websdk-react";
10058
- import { jsx as jsx61, jsxs as jsxs44 } from "react/jsx-runtime";
10059
- function IdentityVerificationView(props) {
10060
- return /* @__PURE__ */ jsx61(CoinListStyleScope, { children: /* @__PURE__ */ jsx61(IdentityVerificationViewBody, { ...props }) });
10061
- }
10062
- function IdentityVerificationViewBody({
10063
- state,
10064
- onEvent,
10065
- className
10066
- }) {
10067
- switch (state.type) {
10068
- case "loading":
10069
- return /* @__PURE__ */ jsx61(
10070
- "output",
10071
- {
10072
- "aria-live": "polite",
10073
- className: cn(
10074
- "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center",
10075
- className
10076
- ),
10077
- children: /* @__PURE__ */ jsx61("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading identity verification..." })
10078
- }
10079
- );
10080
- case "error":
10081
- return /* @__PURE__ */ jsxs44(
10082
- "div",
10083
- {
10084
- className: cn(
10085
- "clcosdk:flex clcosdk:flex-col clcosdk:gap-4",
10086
- className
10087
- ),
10088
- children: [
10089
- /* @__PURE__ */ jsx61(AlertBanner, { variant: "error", icon: true, content: state.message }),
10090
- state.retryable && /* @__PURE__ */ jsx61(ClButton, { size: "sm", onClick: () => onEvent({ type: "ON_RETRY" }), children: "Try again" })
10091
- ]
10092
- }
10093
- );
10094
- case "ready":
10095
- return /* @__PURE__ */ jsx61("div", { className: cn("clcosdk:w-full", className), children: /* @__PURE__ */ jsx61(
10096
- SumsubWebSdk,
10097
- {
10098
- accessToken: state.accessToken,
10099
- expirationHandler: state.refreshToken,
10100
- config: state.locale === void 0 ? {} : { lang: state.locale },
10101
- options: { addViewportTag: false, adaptIframeHeight: true },
10102
- onMessage: (type, payload) => {
10103
- onSumsubMessage(type, payload, onEvent);
10104
- },
10105
- onError: (error) => {
10106
- onEvent({ type: "ON_ERROR", error: toError(error) });
10107
- }
10108
- }
10109
- ) });
10110
- default: {
10111
- const exhaustive = state;
10112
- return exhaustive;
10113
- }
10114
- }
10115
- }
10116
- function onSumsubMessage(type, payload, onEvent) {
10117
- switch (type) {
10118
- case "idCheck.onApplicantSubmitted":
10119
- onEvent({ type: "ON_SUBMITTED" });
10120
- return;
10121
- case "idCheck.onError": {
10122
- const message = payload?.message ?? "Verification error";
10123
- onEvent({ type: "ON_ERROR", error: new Error(message) });
10124
- return;
10125
- }
10126
- default:
10127
- return;
10128
- }
10129
- }
10130
- function toError(error) {
10131
- return error instanceof Error ? error : new Error("Verification error");
10132
- }
10133
-
10134
- // src/client/hooks/requirements/identity-verification/useIdentityVerificationViewModel.ts
10135
- import { useCallback as useCallback7, useEffect as useEffect21, useMemo as useMemo5, useRef as useRef15 } from "react";
10136
-
10137
- // src/client/hooks/requirements/data/useKycToken.ts
10138
- import { useCallback as useCallback6, useEffect as useEffect20, useRef as useRef14, useState as useState25 } from "react";
10139
- var IDLE_STATE = { type: "IDLE" };
10140
- var LOADING_STATE3 = { type: "LOADING" };
10141
- function useKycToken(levelName, reset) {
10142
- const { coinlist } = useCoinList();
10143
- const log = useLogger("useKycToken");
10144
- const [kycTokenState, setKycTokenState] = useState25(IDLE_STATE);
10145
- const resetPendingRef = useRef14(reset === true);
10146
- const tokenIssuedRef = useRef14(false);
10147
- useEffect20(() => {
10148
- if (!tokenIssuedRef.current) {
10149
- resetPendingRef.current = reset === true;
10150
- }
10151
- }, [reset]);
10152
- const fetchToken = useCallback6(async () => {
10153
- setKycTokenState(LOADING_STATE3);
10154
- try {
10155
- const kycToken = await coinlist.requirements.createKycToken({
10156
- levelName,
10157
- reset: resetPendingRef.current
10158
- });
10159
- resetPendingRef.current = false;
10160
- tokenIssuedRef.current = true;
10161
- log.debug(() => ({
10162
- msg: "settled",
10163
- fields: { state: "CONTENT" }
10164
- }));
10165
- setKycTokenState({ type: "CONTENT", token: kycToken.token });
10166
- return kycToken.token;
10167
- } catch (error) {
10168
- const reason = error instanceof NotAuthenticatedError ? "not-authenticated" : "generic-error";
10169
- log.failure(
10170
- () => ({ msg: "settled", fields: { state: "ERROR", reason } }),
10171
- error
10172
- );
10173
- setKycTokenState({ type: "ERROR", reason });
10174
- throw error;
10175
- }
10176
- }, [coinlist, levelName, log]);
10177
- return { kycTokenState, fetchToken };
10178
- }
10179
-
10180
- // src/client/hooks/requirements/identity-verification/useIdentityVerificationViewModel.ts
10181
- var NOT_AUTHENTICATED_MESSAGE2 = "Sign in to verify your identity.";
10182
- var GENERIC_ERROR_MESSAGE2 = "Unable to start identity verification right now. Please try again.";
10183
- function useIdentityVerificationViewModel(options = {}) {
10184
- const { levelName, reset, locale, onSubmitted, onError } = options;
10185
- const { kycTokenState, fetchToken } = useKycToken(levelName, reset);
10186
- const fetchedRef = useRef15(false);
10187
- useEffect21(() => {
10188
- if (fetchedRef.current) {
10189
- return;
10190
- }
10191
- fetchedRef.current = true;
10192
- fetchToken().catch(() => {
10193
- });
10194
- }, [fetchToken]);
10195
- const state = useMemo5(() => {
10196
- switch (kycTokenState.type) {
10197
- case "IDLE":
10198
- case "LOADING":
10199
- return { type: "loading" };
10200
- case "ERROR": {
10201
- const notAuthenticated = kycTokenState.reason === "not-authenticated";
10202
- return {
10203
- type: "error",
10204
- message: notAuthenticated ? NOT_AUTHENTICATED_MESSAGE2 : GENERIC_ERROR_MESSAGE2,
10205
- retryable: !notAuthenticated
10206
- };
10207
- }
10208
- case "CONTENT":
10209
- return {
10210
- type: "ready",
10211
- accessToken: kycTokenState.token,
10212
- locale,
10213
- refreshToken: fetchToken
10214
- };
10215
- default: {
10216
- const exhaustive = kycTokenState;
10217
- return exhaustive;
10218
- }
10219
- }
10220
- }, [kycTokenState, locale, fetchToken]);
10221
- const onEvent = useCallback7(
10222
- (event) => {
10223
- switch (event.type) {
10224
- case "ON_RETRY":
10225
- fetchToken().catch(() => {
10226
- });
10227
- return;
10228
- case "ON_SUBMITTED":
10229
- onSubmitted?.();
10230
- return;
10231
- case "ON_ERROR":
10232
- onError?.(event.error);
10233
- return;
10234
- default: {
10235
- const exhaustive = event;
10236
- return exhaustive;
10237
- }
10238
- }
10239
- },
10240
- [fetchToken, onSubmitted, onError]
10241
- );
10242
- return { state, onEvent };
10390
+ default: {
10391
+ const exhaustive = state;
10392
+ return exhaustive;
10393
+ }
10394
+ }
10243
10395
  }
10244
-
10245
- // src/client/components/requirements/identity-verification/IdentityVerificationContainer.tsx
10246
- import { jsx as jsx62 } from "react/jsx-runtime";
10247
- function IdentityVerificationContainer({
10248
- levelName,
10249
- reset,
10250
- locale,
10251
- onSubmitted,
10252
- onError,
10253
- className
10254
- }) {
10255
- const { state, onEvent } = useIdentityVerificationViewModel({
10256
- levelName,
10257
- reset,
10258
- locale,
10259
- onSubmitted,
10260
- onError
10261
- });
10262
- return /* @__PURE__ */ jsx62(
10263
- IdentityVerificationView,
10396
+ function LoadingState2() {
10397
+ return /* @__PURE__ */ jsx61(
10398
+ "output",
10264
10399
  {
10265
- state,
10266
- onEvent,
10267
- className
10400
+ "aria-live": "polite",
10401
+ className: "clcosdk:flex clcosdk:min-h-40 clcosdk:items-center clcosdk:justify-center clcosdk:rounded-2xl clcosdk:border clcosdk:border-border clcosdk:bg-background clcosdk:p-6",
10402
+ children: /* @__PURE__ */ jsx61("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Loading requirements..." })
10268
10403
  }
10269
10404
  );
10270
10405
  }
10271
10406
 
10272
10407
  // src/client/components/requirements/tax-document/TaxDocumentModalView.tsx
10273
- import { jsx as jsx63, jsxs as jsxs45 } from "react/jsx-runtime";
10408
+ import { jsx as jsx62, jsxs as jsxs44 } from "react/jsx-runtime";
10274
10409
  function TaxDocumentModalView({
10275
10410
  state,
10276
10411
  onEvent,
@@ -10279,7 +10414,7 @@ function TaxDocumentModalView({
10279
10414
  if (state.type === "hidden") {
10280
10415
  return null;
10281
10416
  }
10282
- return /* @__PURE__ */ jsx63(CoinListStyleScope, { children: /* @__PURE__ */ jsx63("div", { className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-black/50 clcosdk:p-4", children: /* @__PURE__ */ jsxs45(
10417
+ return /* @__PURE__ */ jsx62(CoinListStyleScope, { children: /* @__PURE__ */ jsx62("div", { className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-black/50 clcosdk:p-4", children: /* @__PURE__ */ jsxs44(
10283
10418
  "div",
10284
10419
  {
10285
10420
  className: cn(
@@ -10287,11 +10422,11 @@ function TaxDocumentModalView({
10287
10422
  className
10288
10423
  ),
10289
10424
  children: [
10290
- /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:items-start clcosdk:justify-between clcosdk:gap-4", children: [
10291
- /* @__PURE__ */ jsx63("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
10292
- /* @__PURE__ */ jsx63(CloseButton, { onClick: () => onEvent({ type: "ON_CLOSE" }) })
10425
+ /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:items-start clcosdk:justify-between clcosdk:gap-4", children: [
10426
+ /* @__PURE__ */ jsx62("h3", { className: cn(typeClasses.h3, "clcosdk:text-text-primary"), children: state.title }),
10427
+ /* @__PURE__ */ jsx62(CloseButton, { onClick: () => onEvent({ type: "ON_CLOSE" }) })
10293
10428
  ] }),
10294
- /* @__PURE__ */ jsx63(Screen, { screen: state.screen, onEvent })
10429
+ /* @__PURE__ */ jsx62(Screen, { screen: state.screen, onEvent })
10295
10430
  ]
10296
10431
  }
10297
10432
  ) }) });
@@ -10302,11 +10437,11 @@ function Screen({
10302
10437
  }) {
10303
10438
  switch (screen.type) {
10304
10439
  case "loading":
10305
- return /* @__PURE__ */ jsx63(LoadingScreen, {});
10440
+ return /* @__PURE__ */ jsx62(LoadingScreen, {});
10306
10441
  case "error":
10307
- return /* @__PURE__ */ jsx63(AlertBanner, { variant: "error", icon: true, content: screen.message });
10442
+ return /* @__PURE__ */ jsx62(AlertBanner, { variant: "error", icon: true, content: screen.message });
10308
10443
  case "review":
10309
- return /* @__PURE__ */ jsx63(
10444
+ return /* @__PURE__ */ jsx62(
10310
10445
  ReviewScreen,
10311
10446
  {
10312
10447
  fields: screen.fields,
@@ -10317,9 +10452,9 @@ function Screen({
10317
10452
  }
10318
10453
  );
10319
10454
  case "editing":
10320
- return /* @__PURE__ */ jsx63(EditScreen, { fields: screen.fields, onEvent });
10455
+ return /* @__PURE__ */ jsx62(EditScreen, { fields: screen.fields, onEvent });
10321
10456
  case "sign-only":
10322
- return /* @__PURE__ */ jsx63(
10457
+ return /* @__PURE__ */ jsx62(
10323
10458
  SignOnlyScreen,
10324
10459
  {
10325
10460
  signing: screen.signing,
@@ -10334,14 +10469,14 @@ function Screen({
10334
10469
  }
10335
10470
  }
10336
10471
  function LoadingScreen() {
10337
- return /* @__PURE__ */ jsx63(
10472
+ return /* @__PURE__ */ jsx62(
10338
10473
  "output",
10339
10474
  {
10340
10475
  "aria-live": "polite",
10341
10476
  className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4",
10342
- children: [0, 1, 2, 3, 4].map((row) => /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1", children: [
10343
- /* @__PURE__ */ jsx63("div", { className: "clcosdk:h-3 clcosdk:w-28 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" }),
10344
- /* @__PURE__ */ jsx63("div", { className: "clcosdk:h-5 clcosdk:w-48 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" })
10477
+ children: [0, 1, 2, 3, 4].map((row) => /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1", children: [
10478
+ /* @__PURE__ */ jsx62("div", { className: "clcosdk:h-3 clcosdk:w-28 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" }),
10479
+ /* @__PURE__ */ jsx62("div", { className: "clcosdk:h-5 clcosdk:w-48 clcosdk:animate-pulse clcosdk:rounded clcosdk:bg-surface" })
10345
10480
  ] }, row))
10346
10481
  }
10347
10482
  );
@@ -10353,9 +10488,9 @@ function ReviewScreen({
10353
10488
  signError,
10354
10489
  onEvent
10355
10490
  }) {
10356
- return /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
10357
- /* @__PURE__ */ jsx63("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Review your information below. If anything looks incorrect, edit before signing." }),
10358
- piiUnavailable && /* @__PURE__ */ jsx63(
10491
+ return /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
10492
+ /* @__PURE__ */ jsx62("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "Review your information below. If anything looks incorrect, edit before signing." }),
10493
+ piiUnavailable && /* @__PURE__ */ jsx62(
10359
10494
  AlertBanner,
10360
10495
  {
10361
10496
  variant: "info",
@@ -10363,27 +10498,27 @@ function ReviewScreen({
10363
10498
  content: "We don't have this information on file yet \u2014 please fill it in below."
10364
10499
  }
10365
10500
  ),
10366
- /* @__PURE__ */ jsx63("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, displayValue }) => /* @__PURE__ */ jsxs45(
10501
+ /* @__PURE__ */ jsx62("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, displayValue }) => /* @__PURE__ */ jsxs44(
10367
10502
  "div",
10368
10503
  {
10369
10504
  className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1",
10370
10505
  children: [
10371
- /* @__PURE__ */ jsx63(
10506
+ /* @__PURE__ */ jsx62(
10372
10507
  "span",
10373
10508
  {
10374
10509
  className: cn(typeClasses.label, "clcosdk:text-text-secondary"),
10375
10510
  children: label
10376
10511
  }
10377
10512
  ),
10378
- /* @__PURE__ */ jsx63("span", { className: cn(typeClasses.body, "clcosdk:text-text-primary"), children: displayValue })
10513
+ /* @__PURE__ */ jsx62("span", { className: cn(typeClasses.body, "clcosdk:text-text-primary"), children: displayValue })
10379
10514
  ]
10380
10515
  },
10381
10516
  field
10382
10517
  )) }),
10383
- /* @__PURE__ */ jsx63("p", { className: cn(typeClasses.caption, "clcosdk:text-text-secondary"), children: "By signing, you certify that the information above is accurate and that you are the beneficial owner of the income this form relates to. This document cannot be edited once signed." }),
10384
- signError && /* @__PURE__ */ jsx63(AlertBanner, { variant: "error", icon: true, content: signError }),
10385
- /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
10386
- /* @__PURE__ */ jsx63(
10518
+ /* @__PURE__ */ jsx62("p", { className: cn(typeClasses.caption, "clcosdk:text-text-secondary"), children: "By signing, you certify that the information above is accurate and that you are the beneficial owner of the income this form relates to. This document cannot be edited once signed." }),
10519
+ signError && /* @__PURE__ */ jsx62(AlertBanner, { variant: "error", icon: true, content: signError }),
10520
+ /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
10521
+ /* @__PURE__ */ jsx62(
10387
10522
  ClButton,
10388
10523
  {
10389
10524
  fullWidth: true,
@@ -10393,7 +10528,7 @@ function ReviewScreen({
10393
10528
  children: "Sign W-8BEN"
10394
10529
  }
10395
10530
  ),
10396
- /* @__PURE__ */ jsx63(
10531
+ /* @__PURE__ */ jsx62(
10397
10532
  ClButton,
10398
10533
  {
10399
10534
  fullWidth: true,
@@ -10410,20 +10545,20 @@ function EditScreen({
10410
10545
  fields,
10411
10546
  onEvent
10412
10547
  }) {
10413
- return /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
10414
- /* @__PURE__ */ jsx63("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, placeholder, value }) => /* @__PURE__ */ jsxs45(
10548
+ return /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
10549
+ /* @__PURE__ */ jsx62("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-4 clcosdk:border-t clcosdk:border-divider clcosdk:pt-4", children: fields.map(({ field, label, placeholder, value }) => /* @__PURE__ */ jsxs44(
10415
10550
  "label",
10416
10551
  {
10417
10552
  className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-1",
10418
10553
  children: [
10419
- /* @__PURE__ */ jsx63(
10554
+ /* @__PURE__ */ jsx62(
10420
10555
  "span",
10421
10556
  {
10422
10557
  className: cn(typeClasses.label, "clcosdk:text-text-secondary"),
10423
10558
  children: label
10424
10559
  }
10425
10560
  ),
10426
- /* @__PURE__ */ jsx63(
10561
+ /* @__PURE__ */ jsx62(
10427
10562
  "input",
10428
10563
  {
10429
10564
  type: "text",
@@ -10444,9 +10579,9 @@ function EditScreen({
10444
10579
  },
10445
10580
  field
10446
10581
  )) }),
10447
- /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
10448
- /* @__PURE__ */ jsx63(ClButton, { fullWidth: true, onClick: () => onEvent({ type: "ON_SAVE_EDIT" }), children: "Save & review" }),
10449
- /* @__PURE__ */ jsx63(
10582
+ /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-2", children: [
10583
+ /* @__PURE__ */ jsx62(ClButton, { fullWidth: true, onClick: () => onEvent({ type: "ON_SAVE_EDIT" }), children: "Save & review" }),
10584
+ /* @__PURE__ */ jsx62(
10450
10585
  ClButton,
10451
10586
  {
10452
10587
  fullWidth: true,
@@ -10463,10 +10598,10 @@ function SignOnlyScreen({
10463
10598
  signError,
10464
10599
  onEvent
10465
10600
  }) {
10466
- return /* @__PURE__ */ jsxs45("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
10467
- /* @__PURE__ */ jsx63("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "As an entity investor, you must complete a W-8BEN-E to confirm your foreign tax status and claim applicable treaty benefits. You'll receive an email to complete the signing." }),
10468
- signError && /* @__PURE__ */ jsx63(AlertBanner, { variant: "error", icon: true, content: signError }),
10469
- /* @__PURE__ */ jsx63(
10601
+ return /* @__PURE__ */ jsxs44("div", { className: "clcosdk:flex clcosdk:flex-col clcosdk:gap-6", children: [
10602
+ /* @__PURE__ */ jsx62("p", { className: cn(typeClasses.body, "clcosdk:text-text-secondary"), children: "As an entity investor, you must complete a W-8BEN-E to confirm your foreign tax status and claim applicable treaty benefits. You'll receive an email to complete the signing." }),
10603
+ signError && /* @__PURE__ */ jsx62(AlertBanner, { variant: "error", icon: true, content: signError }),
10604
+ /* @__PURE__ */ jsx62(
10470
10605
  ClButton,
10471
10606
  {
10472
10607
  fullWidth: true,
@@ -10480,12 +10615,12 @@ function SignOnlyScreen({
10480
10615
  }
10481
10616
 
10482
10617
  // src/client/hooks/requirements/tax-document/useTaxDocumentModalViewModel.ts
10483
- import { useCallback as useCallback9, useEffect as useEffect23, useMemo as useMemo6 } from "react";
10618
+ import { useCallback as useCallback10, useEffect as useEffect24, useMemo as useMemo6 } from "react";
10484
10619
 
10485
10620
  // src/client/hooks/requirements/data/useTaxDocument.ts
10486
- import { useCallback as useCallback8, useEffect as useEffect22, useState as useState26 } from "react";
10621
+ import { useCallback as useCallback9, useEffect as useEffect23, useState as useState27 } from "react";
10487
10622
  var IDLE_SIGN = { type: "idle", error: null };
10488
- var LOADING_STATE4 = { type: "LOADING" };
10623
+ var LOADING_STATE5 = { type: "LOADING" };
10489
10624
  var SIGN_FAILED_MESSAGE = "Unable to sign document. Please try again.";
10490
10625
  var DOB_INVALID_MESSAGE = "Enter your date of birth as MM/DD/YYYY.";
10491
10626
  var FIELD_KEYS = {
@@ -10558,8 +10693,8 @@ function useTaxDocument({
10558
10693
  }) {
10559
10694
  const { coinlist, isReady } = useCoinList();
10560
10695
  const log = useLogger("useTaxDocument");
10561
- const [state, setState] = useState26(LOADING_STATE4);
10562
- useEffect22(() => {
10696
+ const [state, setState] = useState27(LOADING_STATE5);
10697
+ useEffect23(() => {
10563
10698
  let isCancelled = false;
10564
10699
  if (!isOpen) {
10565
10700
  return () => {
@@ -10567,12 +10702,12 @@ function useTaxDocument({
10567
10702
  };
10568
10703
  }
10569
10704
  if (!isReady) {
10570
- setState(LOADING_STATE4);
10705
+ setState(LOADING_STATE5);
10571
10706
  return () => {
10572
10707
  isCancelled = true;
10573
10708
  };
10574
10709
  }
10575
- setState(LOADING_STATE4);
10710
+ setState(LOADING_STATE5);
10576
10711
  coinlist.requirements.getPii().then((pii) => {
10577
10712
  if (isCancelled) return;
10578
10713
  if (pii.kind === "company") {
@@ -10600,7 +10735,7 @@ function useTaxDocument({
10600
10735
  isCancelled = true;
10601
10736
  };
10602
10737
  }, [coinlist, isReady, isOpen, log]);
10603
- const onEditField = useCallback8(
10738
+ const onEditField = useCallback9(
10604
10739
  (field, value) => {
10605
10740
  setState(
10606
10741
  (prev) => prev.type === "EDITING" ? { ...prev, fields: { ...prev.fields, [field]: value } } : prev
@@ -10608,7 +10743,7 @@ function useTaxDocument({
10608
10743
  },
10609
10744
  []
10610
10745
  );
10611
- const onStartEdit = useCallback8(() => {
10746
+ const onStartEdit = useCallback9(() => {
10612
10747
  setState(
10613
10748
  (prev) => prev.type === "REVIEW" ? {
10614
10749
  type: "EDITING",
@@ -10619,7 +10754,7 @@ function useTaxDocument({
10619
10754
  } : prev
10620
10755
  );
10621
10756
  }, []);
10622
- const onSaveEdit = useCallback8(() => {
10757
+ const onSaveEdit = useCallback9(() => {
10623
10758
  setState(
10624
10759
  (prev) => prev.type === "EDITING" ? {
10625
10760
  type: "REVIEW",
@@ -10630,7 +10765,7 @@ function useTaxDocument({
10630
10765
  } : prev
10631
10766
  );
10632
10767
  }, []);
10633
- const onCancelEdit = useCallback8(() => {
10768
+ const onCancelEdit = useCallback9(() => {
10634
10769
  setState(
10635
10770
  (prev) => prev.type === "EDITING" ? {
10636
10771
  type: "REVIEW",
@@ -10641,7 +10776,7 @@ function useTaxDocument({
10641
10776
  } : prev
10642
10777
  );
10643
10778
  }, []);
10644
- const onSign = useCallback8(() => {
10779
+ const onSign = useCallback9(() => {
10645
10780
  if (state.type !== "REVIEW" && state.type !== "SIGN_ONLY") return;
10646
10781
  if (state.type === "REVIEW" && state.fields.dob.trim() !== "" && !isValidUsDate(state.fields.dob)) {
10647
10782
  setState({
@@ -10683,7 +10818,7 @@ function useTaxDocumentModalViewModel({
10683
10818
  onSubmitted
10684
10819
  }) {
10685
10820
  const { state, onEditField, onStartEdit, onSaveEdit, onCancelEdit, onSign } = useTaxDocument({ isOpen });
10686
- useEffect23(() => {
10821
+ useEffect24(() => {
10687
10822
  if (state.type === "SUBMITTED") {
10688
10823
  onSubmitted?.(state.submission);
10689
10824
  onClose();
@@ -10695,7 +10830,7 @@ function useTaxDocumentModalViewModel({
10695
10830
  }
10696
10831
  return { type: "content", title: toTitle(state), screen: toScreen(state) };
10697
10832
  }, [isOpen, state]);
10698
- const onEvent = useCallback9(
10833
+ const onEvent = useCallback10(
10699
10834
  (event) => {
10700
10835
  switch (event.type) {
10701
10836
  case "ON_CLOSE":
@@ -10778,7 +10913,7 @@ function toFieldsUi(fields) {
10778
10913
  }
10779
10914
 
10780
10915
  // src/client/components/requirements/tax-document/TaxDocumentModalContainer.tsx
10781
- import { jsx as jsx64 } from "react/jsx-runtime";
10916
+ import { jsx as jsx63 } from "react/jsx-runtime";
10782
10917
  function TaxDocumentModalContainer({
10783
10918
  isOpen,
10784
10919
  onClose,
@@ -10790,7 +10925,7 @@ function TaxDocumentModalContainer({
10790
10925
  onClose,
10791
10926
  onSubmitted
10792
10927
  });
10793
- return /* @__PURE__ */ jsx64(
10928
+ return /* @__PURE__ */ jsx63(
10794
10929
  TaxDocumentModalView,
10795
10930
  {
10796
10931
  state,
@@ -10800,6 +10935,39 @@ function TaxDocumentModalContainer({
10800
10935
  );
10801
10936
  }
10802
10937
 
10938
+ // src/client/components/requirements/VerificationOverlay.tsx
10939
+ import { jsx as jsx64, jsxs as jsxs45 } from "react/jsx-runtime";
10940
+ function VerificationOverlay({
10941
+ onClose,
10942
+ children
10943
+ }) {
10944
+ return /* @__PURE__ */ jsx64(CoinListStyleScope, { children: /* @__PURE__ */ jsx64(VerificationOverlayBody, { onClose, children }) });
10945
+ }
10946
+ function VerificationOverlayBody({
10947
+ onClose,
10948
+ children
10949
+ }) {
10950
+ return /* @__PURE__ */ jsx64(
10951
+ "div",
10952
+ {
10953
+ role: "dialog",
10954
+ "aria-modal": "true",
10955
+ "aria-label": "Identity verification",
10956
+ className: "clcosdk:fixed clcosdk:inset-0 clcosdk:z-50 clcosdk:flex clcosdk:items-center clcosdk:justify-center clcosdk:bg-overlay clcosdk:p-4",
10957
+ children: /* @__PURE__ */ jsxs45("div", { className: "clcosdk:relative clcosdk:flex clcosdk:max-h-[92vh] clcosdk:w-full clcosdk:max-w-[760px] clcosdk:flex-col clcosdk:overflow-y-auto clcosdk:rounded-2xl clcosdk:bg-background clcosdk:p-6 clcosdk:pt-14", children: [
10958
+ /* @__PURE__ */ jsx64(
10959
+ CloseButton,
10960
+ {
10961
+ onClick: onClose,
10962
+ className: "clcosdk:absolute clcosdk:top-4 clcosdk:right-4"
10963
+ }
10964
+ ),
10965
+ children
10966
+ ] })
10967
+ }
10968
+ );
10969
+ }
10970
+
10803
10971
  // src/client/components/requirements/wallet/ConnectWalletModalView.tsx
10804
10972
  import { useId as useId5 } from "react";
10805
10973
  import { jsx as jsx65, jsxs as jsxs46 } from "react/jsx-runtime";
@@ -10911,10 +11079,10 @@ function Screen2({
10911
11079
  }
10912
11080
 
10913
11081
  // src/client/hooks/requirements/wallet/useConnectWalletModalViewModel.ts
10914
- import { useCallback as useCallback11, useEffect as useEffect25, useMemo as useMemo7 } from "react";
11082
+ import { useCallback as useCallback12, useEffect as useEffect26, useMemo as useMemo7 } from "react";
10915
11083
 
10916
11084
  // src/client/hooks/requirements/data/useConnectWallet.ts
10917
- import { useCallback as useCallback10, useEffect as useEffect24, useRef as useRef16, useState as useState27 } from "react";
11085
+ import { useCallback as useCallback11, useEffect as useEffect25, useRef as useRef16, useState as useState28 } from "react";
10918
11086
 
10919
11087
  // src/client/core/wallets/connect-external-wallet.ts
10920
11088
  var DEFAULT_STATEMENT = "Sign this message to prove you own this wallet. This does not cost gas or move funds.";
@@ -11045,24 +11213,24 @@ function useConnectWallet({
11045
11213
  statement
11046
11214
  }) {
11047
11215
  const { coinlist } = useCoinList();
11048
- const [state, setState] = useState27(
11216
+ const [state, setState] = useState28(
11049
11217
  () => wallet ? { type: "READY", address: wallet.address, sign: IDLE_SIGN2 } : { type: "NEEDS_WALLET" }
11050
11218
  );
11051
11219
  const attempt = useRef16(0);
11052
- useEffect24(() => {
11220
+ useEffect25(() => {
11053
11221
  attempt.current += 1;
11054
11222
  if (!isOpen) return;
11055
11223
  setState(
11056
11224
  wallet ? { type: "READY", address: wallet.address, sign: IDLE_SIGN2 } : { type: "NEEDS_WALLET" }
11057
11225
  );
11058
11226
  }, [isOpen, wallet?.address]);
11059
- useEffect24(
11227
+ useEffect25(
11060
11228
  () => () => {
11061
11229
  attempt.current += 1;
11062
11230
  },
11063
11231
  []
11064
11232
  );
11065
- const onSign = useCallback10(() => {
11233
+ const onSign = useCallback11(() => {
11066
11234
  if (!wallet || state.type !== "READY") return;
11067
11235
  attempt.current += 1;
11068
11236
  const gen = attempt.current;
@@ -11124,7 +11292,7 @@ function useConnectWalletModalViewModel({
11124
11292
  challengeType,
11125
11293
  statement
11126
11294
  });
11127
- useEffect25(() => {
11295
+ useEffect26(() => {
11128
11296
  if (state.type === "CONNECTED") {
11129
11297
  onConnected?.(state.binding);
11130
11298
  onClose();
@@ -11155,7 +11323,7 @@ function useConnectWalletModalViewModel({
11155
11323
  canRequestConnect
11156
11324
  };
11157
11325
  }, [isOpen, state, onRequestConnect]);
11158
- const onEvent = useCallback11(
11326
+ const onEvent = useCallback12(
11159
11327
  (event) => {
11160
11328
  switch (event.type) {
11161
11329
  case "ON_CLOSE":
@@ -11195,63 +11363,12 @@ function ConnectWalletModalContainer({
11195
11363
  );
11196
11364
  }
11197
11365
 
11198
- // src/client/hooks/requirements/checklist/useRequirementsChecklistViewModel.ts
11199
- import { useCallback as useCallback14, useEffect as useEffect28, useMemo as useMemo8, useRef as useRef17, useState as useState30 } from "react";
11200
-
11201
- // src/client/hooks/requirements/checklist/useRequirementsChecklistViewModel.types.ts
11202
- var RequirementItemUi = {
11203
- fromDomain(req, statusInfo, label, description2, addresses = []) {
11204
- return {
11205
- variant: RequirementVariant.fromType(req.type),
11206
- status: statusInfo ? RequirementStatus.fromStatusValue(statusInfo.status) : "required",
11207
- label,
11208
- description: description2,
11209
- multiWallet: req.type === "whitelisted_wallet",
11210
- connectedWallets: addresses.map((address) => ({
11211
- id: address.id,
11212
- address: address.address,
11213
- shortAddress: shortenAddress(address.address)
11214
- }))
11215
- };
11216
- }
11217
- };
11218
- var RequirementVariant = {
11219
- fromType(type) {
11220
- switch (type) {
11221
- case "external_wallet":
11222
- case "whitelisted_wallet":
11223
- return "wallet";
11224
- default:
11225
- return "verification";
11226
- }
11227
- }
11228
- };
11229
- var RequirementStatus = {
11230
- fromStatusValue(status) {
11231
- switch (status) {
11232
- case "not_started":
11233
- case "action_needed":
11234
- return "required";
11235
- case "in_progress":
11236
- return "pending";
11237
- case "completed":
11238
- return "completed";
11239
- case "rejected":
11240
- return "rejected";
11241
- }
11242
- }
11243
- };
11244
- var ChecklistStatus = {
11245
- derive(statuses) {
11246
- if (statuses.some((s) => s.status === "rejected")) return "ineligible";
11247
- if (statuses.every((s) => s.status === "completed")) return "eligible";
11248
- return "inProgress";
11249
- }
11250
- };
11366
+ // src/client/hooks/requirements/useRequirementsChecklistViewModel.ts
11367
+ import { useCallback as useCallback15, useEffect as useEffect29, useMemo as useMemo8, useRef as useRef17, useState as useState31 } from "react";
11251
11368
 
11252
11369
  // src/client/hooks/requirements/data/useOptionAddresses.ts
11253
- import { useCallback as useCallback12, useEffect as useEffect26, useState as useState28 } from "react";
11254
- var LOADING_STATE5 = { type: "LOADING" };
11370
+ import { useCallback as useCallback13, useEffect as useEffect27, useState as useState29 } from "react";
11371
+ var LOADING_STATE6 = { type: "LOADING" };
11255
11372
  var EMPTY_STATE = {
11256
11373
  type: "CONTENT",
11257
11374
  addresses: []
@@ -11260,19 +11377,19 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
11260
11377
  const { coinlist, isReady } = useCoinList();
11261
11378
  const log = useLogger("useOptionAddresses");
11262
11379
  const { data, enabled = true } = options;
11263
- const [addressesState, setAddressesState] = useState28(
11264
- data !== void 0 ? { type: "CONTENT", addresses: data } : LOADING_STATE5
11380
+ const [addressesState, setAddressesState] = useState29(
11381
+ data !== void 0 ? { type: "CONTENT", addresses: data } : LOADING_STATE6
11265
11382
  );
11266
- const [fetchKey, setFetchKey] = useState28(0);
11267
- const refetch = useCallback12(() => setFetchKey((k) => k + 1), []);
11268
- const disconnect = useCallback12(
11383
+ const [fetchKey, setFetchKey] = useState29(0);
11384
+ const refetch = useCallback13(() => setFetchKey((k) => k + 1), []);
11385
+ const disconnect = useCallback13(
11269
11386
  async (addressId) => {
11270
11387
  await coinlist.wallets.remove({ offerId, addressId });
11271
11388
  refetch();
11272
11389
  },
11273
11390
  [coinlist, offerId, refetch]
11274
11391
  );
11275
- useEffect26(() => {
11392
+ useEffect27(() => {
11276
11393
  let isCancelled = false;
11277
11394
  if (!enabled) {
11278
11395
  setAddressesState(
@@ -11284,7 +11401,7 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
11284
11401
  }
11285
11402
  if (!isReady) {
11286
11403
  if (data === void 0) {
11287
- setAddressesState(LOADING_STATE5);
11404
+ setAddressesState(LOADING_STATE6);
11288
11405
  }
11289
11406
  return () => {
11290
11407
  isCancelled = true;
@@ -11301,7 +11418,7 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
11301
11418
  isCancelled = true;
11302
11419
  };
11303
11420
  }
11304
- setAddressesState(LOADING_STATE5);
11421
+ setAddressesState(LOADING_STATE6);
11305
11422
  coinlist.wallets.list({ offerId, offerOptionId }).then((addresses) => {
11306
11423
  if (!isCancelled) {
11307
11424
  log.debug(() => ({
@@ -11328,22 +11445,22 @@ function useOptionAddresses(offerId, offerOptionId, options = {}) {
11328
11445
  }
11329
11446
 
11330
11447
  // src/client/hooks/requirements/data/useRequirements.ts
11331
- import { useCallback as useCallback13, useEffect as useEffect27, useState as useState29 } from "react";
11332
- var LOADING_STATE6 = { type: "LOADING" };
11448
+ import { useCallback as useCallback14, useEffect as useEffect28, useState as useState30 } from "react";
11449
+ var LOADING_STATE7 = { type: "LOADING" };
11333
11450
  function useRequirements(offerId, options = {}) {
11334
11451
  const { coinlist, isReady } = useCoinList();
11335
11452
  const log = useLogger("useRequirements");
11336
11453
  const { data } = options;
11337
- const [requirementsState, setRequirementsState] = useState29(
11338
- data !== void 0 ? { type: "CONTENT", ...data } : LOADING_STATE6
11454
+ const [requirementsState, setRequirementsState] = useState30(
11455
+ data !== void 0 ? { type: "CONTENT", ...data } : LOADING_STATE7
11339
11456
  );
11340
- const [fetchKey, setFetchKey] = useState29(0);
11341
- const refetch = useCallback13(() => setFetchKey((k) => k + 1), []);
11342
- useEffect27(() => {
11457
+ const [fetchKey, setFetchKey] = useState30(0);
11458
+ const refetch = useCallback14(() => setFetchKey((k) => k + 1), []);
11459
+ useEffect28(() => {
11343
11460
  let isCancelled = false;
11344
11461
  if (!isReady) {
11345
11462
  if (data === void 0) {
11346
- setRequirementsState(LOADING_STATE6);
11463
+ setRequirementsState(LOADING_STATE7);
11347
11464
  }
11348
11465
  return () => {
11349
11466
  isCancelled = true;
@@ -11360,7 +11477,7 @@ function useRequirements(offerId, options = {}) {
11360
11477
  isCancelled = true;
11361
11478
  };
11362
11479
  }
11363
- setRequirementsState(LOADING_STATE6);
11480
+ setRequirementsState(LOADING_STATE7);
11364
11481
  Promise.all([
11365
11482
  coinlist.requirements.forOffer(offerId),
11366
11483
  coinlist.requirements.statuses(offerId)
@@ -11397,7 +11514,58 @@ function useRequirements(offerId, options = {}) {
11397
11514
  return { requirementsState, refetch };
11398
11515
  }
11399
11516
 
11400
- // src/client/hooks/requirements/checklist/useRequirementsChecklistViewModel.ts
11517
+ // src/client/hooks/requirements/useRequirementsChecklistViewModel.types.ts
11518
+ var RequirementItemUi = {
11519
+ fromDomain(req, statusInfo, label, description2, addresses = []) {
11520
+ return {
11521
+ variant: RequirementVariant.fromType(req.type),
11522
+ status: statusInfo ? RequirementStatus.fromStatusValue(statusInfo.status) : "required",
11523
+ label,
11524
+ description: description2,
11525
+ multiWallet: req.type === "whitelisted_wallet",
11526
+ connectedWallets: addresses.map((address) => ({
11527
+ id: address.id,
11528
+ address: address.address,
11529
+ shortAddress: shortenAddress(address.address)
11530
+ }))
11531
+ };
11532
+ }
11533
+ };
11534
+ var RequirementVariant = {
11535
+ fromType(type) {
11536
+ switch (type) {
11537
+ case "external_wallet":
11538
+ case "whitelisted_wallet":
11539
+ return "wallet";
11540
+ default:
11541
+ return "verification";
11542
+ }
11543
+ }
11544
+ };
11545
+ var RequirementStatus = {
11546
+ fromStatusValue(status) {
11547
+ switch (status) {
11548
+ case "not_started":
11549
+ case "action_needed":
11550
+ return "required";
11551
+ case "in_progress":
11552
+ return "pending";
11553
+ case "completed":
11554
+ return "completed";
11555
+ case "rejected":
11556
+ return "rejected";
11557
+ }
11558
+ }
11559
+ };
11560
+ var ChecklistStatus = {
11561
+ derive(statuses) {
11562
+ if (statuses.some((s) => s.status === "rejected")) return "ineligible";
11563
+ if (statuses.every((s) => s.status === "completed")) return "eligible";
11564
+ return "inProgress";
11565
+ }
11566
+ };
11567
+
11568
+ // src/client/hooks/requirements/useRequirementsChecklistViewModel.ts
11401
11569
  var DEFAULT_LABELS = {
11402
11570
  kyc_approved: "KYC Verification",
11403
11571
  external_wallet: "External Wallet",
@@ -11439,19 +11607,19 @@ function useRequirementsChecklistViewModel(options) {
11439
11607
  const log = useLogger("useRequirementsChecklistViewModel");
11440
11608
  const { coinlist } = useCoinList();
11441
11609
  const { requirementsState, refetch } = useRequirements(offerId, { data });
11442
- const [expandedId, setExpandedId] = useState30(null);
11443
- const [taxDocumentOpen, setTaxDocumentOpen] = useState30(false);
11444
- const [connectWalletOpen, setConnectWalletOpen] = useState30(false);
11445
- const [verifyingRequirementId, setVerifyingRequirementId] = useState30(null);
11610
+ const [expandedId, setExpandedId] = useState31(null);
11611
+ const [taxDocumentOpen, setTaxDocumentOpen] = useState31(false);
11612
+ const [connectWalletOpen, setConnectWalletOpen] = useState31(false);
11613
+ const [verifyingRequirementId, setVerifyingRequirementId] = useState31(null);
11446
11614
  const isMountedRef = useRef17(true);
11447
- useEffect28(() => {
11615
+ useEffect29(() => {
11448
11616
  isMountedRef.current = true;
11449
11617
  return () => {
11450
11618
  isMountedRef.current = false;
11451
11619
  };
11452
11620
  }, []);
11453
- const [hasWalletRequirement, setHasWalletRequirement] = useState30(false);
11454
- useEffect28(() => {
11621
+ const [hasWalletRequirement, setHasWalletRequirement] = useState31(false);
11622
+ useEffect29(() => {
11455
11623
  if (requirementsState.type === "CONTENT") {
11456
11624
  setHasWalletRequirement(
11457
11625
  (requirementsState.requirements[optionId] ?? []).some(
@@ -11467,14 +11635,14 @@ function useRequirementsChecklistViewModel(options) {
11467
11635
  } = useOptionAddresses(offerId, optionId, {
11468
11636
  enabled: hasWalletRequirement
11469
11637
  });
11470
- const removeWallet = useCallback14(
11638
+ const removeWallet = useCallback15(
11471
11639
  async (addressId) => {
11472
11640
  await disconnect(OfferOptionAddressId(addressId));
11473
11641
  refetch();
11474
11642
  },
11475
11643
  [disconnect, refetch]
11476
11644
  );
11477
- const awaitVerificationResult = useCallback14(
11645
+ const awaitVerificationResult = useCallback15(
11478
11646
  (requirementId, statusBeforeSubmit) => {
11479
11647
  void (async () => {
11480
11648
  const deadline = Date.now() + VERIFICATION_POLL_TIMEOUT_MS;
@@ -11583,7 +11751,7 @@ function useRequirementsChecklistViewModel(options) {
11583
11751
  identityVerificationOptions,
11584
11752
  removeWallet
11585
11753
  ]);
11586
- const handleRequirementAction = useCallback14(
11754
+ const handleRequirementAction = useCallback15(
11587
11755
  (requirement) => {
11588
11756
  const inlineVerification = statusById.get(requirement.id)?.kycLevel !== void 0 && onRequirementActionOverride === void 0;
11589
11757
  if (inlineVerification) {
@@ -11615,7 +11783,7 @@ function useRequirementsChecklistViewModel(options) {
11615
11783
  coinlist
11616
11784
  ]
11617
11785
  );
11618
- const onEvent = useCallback14(
11786
+ const onEvent = useCallback15(
11619
11787
  (event) => {
11620
11788
  switch (event.type) {
11621
11789
  case "ON_TOGGLE_ITEM":
@@ -11712,7 +11880,7 @@ function toVerificationUi(verifyingRequirementId, statusById, identityVerificati
11712
11880
  };
11713
11881
  }
11714
11882
 
11715
- // src/client/components/requirements/checklist/RequirementsChecklistContainer.tsx
11883
+ // src/client/components/requirements/RequirementsChecklistContainer.tsx
11716
11884
  import { Fragment as Fragment10, jsx as jsx67, jsxs as jsxs47 } from "react/jsx-runtime";
11717
11885
  function RequirementsChecklistContainer({
11718
11886
  loading,
@@ -11778,7 +11946,7 @@ function RequirementsChecklistContainer({
11778
11946
  ] });
11779
11947
  }
11780
11948
 
11781
- // src/client/core/observability/pino-client-logger.ts
11949
+ // src/client/core/shared/observability/pino-client-logger.ts
11782
11950
  import { pino } from "pino";
11783
11951
  function pinoClientLogger(options) {
11784
11952
  return loggerOverPino(
@@ -11795,7 +11963,7 @@ function pinoClientLogger(options) {
11795
11963
  }
11796
11964
 
11797
11965
  // src/client/hooks/auth/useCompleteOAuth.ts
11798
- import { useEffect as useEffect29, useRef as useRef18 } from "react";
11966
+ import { useEffect as useEffect30, useRef as useRef18 } from "react";
11799
11967
  function useCompleteOAuth(options) {
11800
11968
  const { coinlist } = useCoinList();
11801
11969
  const log = useLogger("useCompleteOAuth");
@@ -11806,7 +11974,7 @@ function useCompleteOAuth(options) {
11806
11974
  onFailureRef.current = options.onFailure;
11807
11975
  onSuccessRef.current = options.onSuccess;
11808
11976
  const hasStartedExchangeRef = useRef18(false);
11809
- useEffect29(() => {
11977
+ useEffect30(() => {
11810
11978
  if (typeof window === "undefined") return;
11811
11979
  const params = new URLSearchParams(window.location.search);
11812
11980
  if (!params.has("code") && !params.has("error")) return;
@@ -11870,20 +12038,20 @@ function useCompleteOAuth(options) {
11870
12038
  }
11871
12039
 
11872
12040
  // src/client/hooks/checkout/coin-list/token-sale/data/useParticipations.ts
11873
- import { useEffect as useEffect30, useState as useState31 } from "react";
11874
- var LOADING_STATE7 = { type: "LOADING" };
12041
+ import { useEffect as useEffect31, useState as useState32 } from "react";
12042
+ var LOADING_STATE8 = { type: "LOADING" };
11875
12043
  function useParticipations(offerId, options = {}) {
11876
12044
  const { coinlist, isReady } = useCoinList();
11877
12045
  const log = useLogger("useParticipations");
11878
12046
  const { data } = options;
11879
- const [participationsState, setParticipationsState] = useState31(
11880
- data !== void 0 ? { type: "CONTENT", participations: data } : LOADING_STATE7
12047
+ const [participationsState, setParticipationsState] = useState32(
12048
+ data !== void 0 ? { type: "CONTENT", participations: data } : LOADING_STATE8
11881
12049
  );
11882
- useEffect30(() => {
12050
+ useEffect31(() => {
11883
12051
  let isCancelled = false;
11884
12052
  if (!isReady) {
11885
12053
  if (data === void 0) {
11886
- setParticipationsState(LOADING_STATE7);
12054
+ setParticipationsState(LOADING_STATE8);
11887
12055
  }
11888
12056
  return () => {
11889
12057
  isCancelled = true;
@@ -11894,7 +12062,7 @@ function useParticipations(offerId, options = {}) {
11894
12062
  isCancelled = true;
11895
12063
  };
11896
12064
  }
11897
- setParticipationsState(LOADING_STATE7);
12065
+ setParticipationsState(LOADING_STATE8);
11898
12066
  coinlist.tokenSale.list(offerId).then((participations) => {
11899
12067
  if (!isCancelled) {
11900
12068
  log.debug(() => ({
@@ -11921,20 +12089,20 @@ function useParticipations(offerId, options = {}) {
11921
12089
  }
11922
12090
 
11923
12091
  // src/client/hooks/offers/data/useOfferDetails.ts
11924
- import { useEffect as useEffect31, useState as useState32 } from "react";
11925
- var LOADING_STATE8 = { type: "LOADING" };
12092
+ import { useEffect as useEffect32, useState as useState33 } from "react";
12093
+ var LOADING_STATE9 = { type: "LOADING" };
11926
12094
  function useOfferDetails(offerId, options = {}) {
11927
12095
  const { coinlist, isReady } = useCoinList();
11928
12096
  const log = useLogger("useOfferDetails");
11929
12097
  const { data } = options;
11930
- const [offerDetailsState, setOfferDetailsState] = useState32(
11931
- data !== void 0 ? { type: "CONTENT", offerDetail: data } : LOADING_STATE8
12098
+ const [offerDetailsState, setOfferDetailsState] = useState33(
12099
+ data !== void 0 ? { type: "CONTENT", offerDetail: data } : LOADING_STATE9
11932
12100
  );
11933
- useEffect31(() => {
12101
+ useEffect32(() => {
11934
12102
  let isCancelled = false;
11935
12103
  if (!isReady) {
11936
12104
  if (data === void 0) {
11937
- setOfferDetailsState(LOADING_STATE8);
12105
+ setOfferDetailsState(LOADING_STATE9);
11938
12106
  }
11939
12107
  return () => {
11940
12108
  isCancelled = true;
@@ -11945,7 +12113,7 @@ function useOfferDetails(offerId, options = {}) {
11945
12113
  isCancelled = true;
11946
12114
  };
11947
12115
  }
11948
- setOfferDetailsState(LOADING_STATE8);
12116
+ setOfferDetailsState(LOADING_STATE9);
11949
12117
  coinlist.offers.get(offerId).then((offerDetail) => {
11950
12118
  if (!isCancelled) {
11951
12119
  log.debug(() => ({
@@ -11985,66 +12153,6 @@ var OfferAssetCardUi = {
11985
12153
  })
11986
12154
  };
11987
12155
 
11988
- // src/client/hooks/tokens/data/useTokenMetadata.ts
11989
- import { useCallback as useCallback15, useEffect as useEffect32, useState as useState33 } from "react";
11990
- var DISABLED_STATE = { type: "DISABLED" };
11991
- var LOADING_STATE9 = { type: "LOADING" };
11992
- function useTokenMetadata(options) {
11993
- const { chain, address, data, enabled = true } = options;
11994
- const { coinlist, isReady } = useCoinList();
11995
- const log = useLogger("useTokenMetadata");
11996
- const [state, setState] = useState33(
11997
- () => data !== void 0 ? { type: "CONTENT", tokenMetadata: data } : LOADING_STATE9
11998
- );
11999
- const [refetchCount, setRefetchCount] = useState33(0);
12000
- const refetch = useCallback15(() => {
12001
- setRefetchCount((count) => count + 1);
12002
- }, []);
12003
- useEffect32(() => {
12004
- let isCancelled = false;
12005
- const seedActive = data !== void 0 && refetchCount === 0;
12006
- if (!isReady || !enabled || seedActive) {
12007
- return () => {
12008
- isCancelled = true;
12009
- };
12010
- }
12011
- setState(LOADING_STATE9);
12012
- coinlist.tokens.get({ chain, address }).then((tokenMetadata) => {
12013
- if (!isCancelled) {
12014
- log.debug(() => ({
12015
- msg: "settled",
12016
- fields: {
12017
- state: "CONTENT",
12018
- listed: tokenMetadata !== null,
12019
- symbol: tokenMetadata?.symbol ?? null
12020
- }
12021
- }));
12022
- setState({ type: "CONTENT", tokenMetadata });
12023
- }
12024
- }).catch((error) => {
12025
- if (!isCancelled) {
12026
- log.failure(
12027
- () => ({
12028
- msg: "settled",
12029
- fields: { state: "ERROR", reason: "generic-error" }
12030
- }),
12031
- error
12032
- );
12033
- setState({ type: "ERROR", reason: "generic-error" });
12034
- }
12035
- });
12036
- return () => {
12037
- isCancelled = true;
12038
- };
12039
- }, [coinlist, isReady, enabled, chain, address, data, refetchCount, log]);
12040
- return {
12041
- // LOADING would be a lie while disabled: nothing is in flight and nothing
12042
- // will replace it. Settled states (a seed, a previous answer) survive.
12043
- state: !enabled && state.type === "LOADING" ? DISABLED_STATE : state,
12044
- refetch
12045
- };
12046
- }
12047
-
12048
12156
  // src/client/ui/format/date.ts
12049
12157
  function formatMonthYear(date, locale) {
12050
12158
  return new Intl.DateTimeFormat(locale, {
@@ -12133,7 +12241,9 @@ export {
12133
12241
  formatCountdown,
12134
12242
  formatMonthYear,
12135
12243
  formatSaleCardCountdown,
12244
+ offerAssetIconUrl,
12136
12245
  offerIconUrl,
12246
+ offerTokenIdentifier,
12137
12247
  ondoLoadErrorReason,
12138
12248
  pinoClientLogger,
12139
12249
  prepareOndoBuy,
@@ -12142,6 +12252,9 @@ export {
12142
12252
  quoteOverAsks,
12143
12253
  stablecoinIconUrl,
12144
12254
  submitErc20Approval,
12255
+ tokenLogoUrl,
12256
+ tokenMetadataOf,
12257
+ useCheckoutOfferTokenMetadata,
12145
12258
  useCoinList,
12146
12259
  useCoinListSignInCardViewModel,
12147
12260
  useCompleteOAuth,