@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
@@ -30,7 +30,7 @@ __export(server_exports, {
30
30
  });
31
31
  module.exports = __toCommonJS(server_exports);
32
32
 
33
- // src/shared/api/http-attributes.ts
33
+ // src/universal/api/http-attributes.ts
34
34
  var empty = {};
35
35
  var concat = (left, right) => ({
36
36
  ...left,
@@ -85,7 +85,7 @@ var Attributes = {
85
85
  getRequestId
86
86
  };
87
87
 
88
- // src/shared/api/http.ts
88
+ // src/universal/api/http.ts
89
89
  var HttpError = class extends Error {
90
90
  constructor(response) {
91
91
  super(`Request failed with ${response.status} status`);
@@ -209,13 +209,13 @@ var Request = {
209
209
  concatAttributes
210
210
  };
211
211
 
212
- // src/shared/api/frontline/config.ts
212
+ // src/universal/api/frontline/config.ts
213
213
  var PUBLIC_API_BASE_URL = "https://api.coinlist.co";
214
214
  var HEADER_API_VERSION = "X-API-Version";
215
215
  var HEADER_IDEMPOTENCY_KEY = "Idempotency-Key";
216
216
  var API_VERSION = "2025-10-17";
217
217
 
218
- // src/shared/types/errors.ts
218
+ // src/universal/types/errors.ts
219
219
  var NotImplementedError = class extends Error {
220
220
  constructor(message = "Not implemented yet") {
221
221
  super(message);
@@ -247,7 +247,7 @@ var MathError = class extends Error {
247
247
  }
248
248
  };
249
249
 
250
- // src/shared/core/observability/log-cause.ts
250
+ // src/universal/core/shared/observability/log-cause.ts
251
251
  function classifyLogCause(error) {
252
252
  if (error instanceof HttpError) {
253
253
  return httpCause(error);
@@ -313,7 +313,7 @@ function apiErrorEventId(error) {
313
313
  return typeof eventId === "string" ? eventId : null;
314
314
  }
315
315
 
316
- // src/shared/core/observability/internal-logger.ts
316
+ // src/universal/core/shared/observability/internal-logger.ts
317
317
  function internalLogger(logger, scope) {
318
318
  return logger ? scopedLogger(logger, scope, {}) : noopInternalLogger;
319
319
  }
@@ -396,7 +396,7 @@ var noopInternalLogger = {
396
396
  wrap: (_op, _params, run) => run()
397
397
  };
398
398
 
399
- // src/shared/api/http-client.ts
399
+ // src/universal/api/http-client.ts
400
400
  var HttpClient = class {
401
401
  constructor(config, middleware = {}, logger = null, options = {}) {
402
402
  this.config = config;
@@ -552,7 +552,7 @@ function describeRequestUnredacted(request) {
552
552
  };
553
553
  }
554
554
 
555
- // src/shared/api/middleware/attach-session-middleware.ts
555
+ // src/universal/api/middleware/attach-session-middleware.ts
556
556
  function attachSessionMiddleware(fetchAccessToken) {
557
557
  return async (request) => {
558
558
  if (!Attributes.isProtected(request.attributes)) {
@@ -578,7 +578,7 @@ function attachSessionMiddleware(fetchAccessToken) {
578
578
  };
579
579
  }
580
580
 
581
- // src/shared/core/utils/crypto.ts
581
+ // src/universal/core/shared/utils/crypto.ts
582
582
  function getUUIDv4() {
583
583
  if (typeof crypto !== "undefined" && typeof crypto.randomUUID === "function") {
584
584
  return crypto.randomUUID();
@@ -601,7 +601,7 @@ function notBlankStringOrNull(value) {
601
601
  }
602
602
  }
603
603
 
604
- // src/shared/api/middleware/idempotency-key.ts
604
+ // src/universal/api/middleware/idempotency-key.ts
605
605
  var idempotencyKeyMiddleware = async (request) => {
606
606
  if (!Attributes.isIdempotent(request.attributes)) {
607
607
  return request;
@@ -619,7 +619,7 @@ var idempotencyKeyMiddleware = async (request) => {
619
619
  };
620
620
  };
621
621
 
622
- // src/shared/api/middleware/request-retry.ts
622
+ // src/universal/api/middleware/request-retry.ts
623
623
  var MAX_ATTEMPTS = 3;
624
624
  var INITIAL_DELAY_MS = 300;
625
625
  var MAX_DELAY_MS = 2e3;
@@ -654,7 +654,7 @@ function defaultDelay(ms) {
654
654
  }
655
655
  var requestRetryMiddleware = createRequestRetryMiddleware();
656
656
 
657
- // src/shared/api/middleware/session-renewal.ts
657
+ // src/universal/api/middleware/session-renewal.ts
658
658
  function renewSessionMiddleware(fetchAccessToken) {
659
659
  return async ({ request, response, retry }) => {
660
660
  if (response.status !== 401) {
@@ -679,7 +679,7 @@ function renewSessionMiddleware(fetchAccessToken) {
679
679
  };
680
680
  }
681
681
 
682
- // src/shared/api/authenticated-api-client.ts
682
+ // src/universal/api/authenticated-api-client.ts
683
683
  var AuthenticatedApiClient = class {
684
684
  constructor(config, fetchAccessToken, additionalBeforeRequest = [], logger = null) {
685
685
  this.httpClient = new HttpClient(
@@ -723,7 +723,7 @@ var ApiClient = class {
723
723
  }
724
724
  };
725
725
 
726
- // src/server/errors.ts
726
+ // src/server/shared/errors.ts
727
727
  var WritableSessionStoreRequiredError = class extends Error {
728
728
  constructor(message = "This operation requires a writable SessionStore. Provide a `setSession` implementation in your SessionStore to persist or clear OAuth sessions.") {
729
729
  super(message);
@@ -731,7 +731,7 @@ var WritableSessionStoreRequiredError = class extends Error {
731
731
  }
732
732
  };
733
733
 
734
- // src/shared/types/oauth-session.ts
734
+ // src/universal/types/oauth-session.ts
735
735
  var ClientCredentialsOAuth = (value) => value;
736
736
  var OAuthRefreshToken = (value) => value;
737
737
  var OAuthSession = {
@@ -892,7 +892,7 @@ var ServerAuthNamespaceImpl = class {
892
892
  }
893
893
  };
894
894
 
895
- // src/shared/api/pagination.ts
895
+ // src/universal/api/pagination.ts
896
896
  async function fetchAllPages(fetchPage, baseParams) {
897
897
  const items = [];
898
898
  let cursor = null;
@@ -908,7 +908,7 @@ async function fetchAllPages(fetchPage, baseParams) {
908
908
  return items;
909
909
  }
910
910
 
911
- // src/shared/types/blockchain/core.ts
911
+ // src/universal/types/blockchain/core.ts
912
912
  var ETHEREUM_CHAINS = {
913
913
  ethereum_mainnet: true,
914
914
  ethereum_sepolia: true,
@@ -925,8 +925,9 @@ var SOLANA_CHAINS = {
925
925
  solana_mainnet: true,
926
926
  solana_devnet: true
927
927
  };
928
+ var isChain = (value) => Object.keys(ETHEREUM_CHAINS).includes(value) || Object.keys(SOLANA_CHAINS).includes(value);
928
929
  var Chain = (value) => {
929
- if (!Object.keys(ETHEREUM_CHAINS).includes(value) && !Object.keys(SOLANA_CHAINS).includes(value)) {
930
+ if (!isChain(value)) {
930
931
  throw new ValidationError(`Unsupported chain: "${value}"`);
931
932
  }
932
933
  return value;
@@ -995,7 +996,7 @@ function combineAmounts(a, b, op) {
995
996
  }
996
997
  var AssetSymbol = (value) => value;
997
998
 
998
- // src/shared/types/offer.ts
999
+ // src/universal/types/offer.ts
999
1000
  var OfferId = (value) => value;
1000
1001
  var OfferSlug = (value) => value;
1001
1002
  var Offer = {
@@ -1014,7 +1015,7 @@ var Offer = {
1014
1015
  logoUrl: dto.logo_url,
1015
1016
  startsAt: new Date(dto.starts_at),
1016
1017
  endsAt: dto.ends_at ? new Date(dto.ends_at) : null,
1017
- tokens: dto.tokens.map(OfferToken.fromDto)
1018
+ tokens: OfferToken.listFromDto(dto.tokens)
1018
1019
  };
1019
1020
  }
1020
1021
  };
@@ -1023,10 +1024,22 @@ var OfferToken = {
1023
1024
  role: dto.role,
1024
1025
  chain: Chain(dto.chain),
1025
1026
  address: EvmContractAddress(dto.address)
1026
- })
1027
+ }),
1028
+ /**
1029
+ * Maps an offer's token list, dropping every token on a chain this SDK does
1030
+ * not name. Frontline's chain registry runs ahead of {@link Chain}, and a
1031
+ * plain `.map` would throw out of `Offer.fromDto` and, through
1032
+ * `PaginatedResponse.fromDto`, reject the whole offers page - which is how
1033
+ * one Base token blanked production's offers list. Dropping costs that
1034
+ * token's metadata alone: `coinlist.tokens.get` takes an `EthereumChain`,
1035
+ * so nobody could have looked it up anyway.
1036
+ *
1037
+ * Same shape as `TokenMetadata.fromRegistryDto`.
1038
+ */
1039
+ listFromDto: (dtos) => dtos.filter((dto) => isChain(dto.chain)).map(OfferToken.fromDto)
1027
1040
  };
1028
1041
 
1029
- // src/shared/types/asset.ts
1042
+ // src/universal/types/asset.ts
1030
1043
  var AssetId = (value) => value;
1031
1044
  var AssetCode = (value) => value;
1032
1045
  var Asset = {
@@ -1038,9 +1051,15 @@ var Asset = {
1038
1051
  })
1039
1052
  };
1040
1053
 
1041
- // src/shared/types/offer-detail.ts
1054
+ // src/universal/types/offer-detail.ts
1042
1055
  var OfferOptionId = (value) => value;
1043
1056
  var OfferOptionSlug = (value) => value;
1057
+ var OfferSwapContract = {
1058
+ fromDto: (dto) => ({
1059
+ chain: Chain(dto.chain),
1060
+ address: EvmContractAddress(dto.address)
1061
+ })
1062
+ };
1044
1063
  var OfferDetail = {
1045
1064
  fromDto: (dto) => {
1046
1065
  if (!Array.isArray(dto.funding_assets)) {
@@ -1078,6 +1097,12 @@ var OfferDetail = {
1078
1097
  `OfferDetail.tokens: expected an array, got ${typeof dto.tokens}`
1079
1098
  );
1080
1099
  }
1100
+ const swapContracts = dto.swap_contracts === void 0 ? [] : dto.swap_contracts;
1101
+ if (!Array.isArray(swapContracts)) {
1102
+ throw new ValidationError(
1103
+ `OfferDetail.swap_contracts: expected an array, got ${typeof swapContracts}`
1104
+ );
1105
+ }
1081
1106
  return {
1082
1107
  id: OfferId(dto.id),
1083
1108
  slug: OfferSlug(dto.slug),
@@ -1085,7 +1110,8 @@ var OfferDetail = {
1085
1110
  name: dto.name,
1086
1111
  asset: Asset.fromDto(dto.asset),
1087
1112
  fundingAssets: dto.funding_assets.map(Asset.fromDto),
1088
- tokens: dto.tokens.map(OfferToken.fromDto),
1113
+ tokens: OfferToken.listFromDto(dto.tokens),
1114
+ swapContracts: swapContracts.map(OfferSwapContract.fromDto),
1089
1115
  about: notBlankStringOrNull(dto.about),
1090
1116
  tagline: dto.tagline,
1091
1117
  bannerUrl: dto.banner_url,
@@ -1139,7 +1165,7 @@ var Milestone = {
1139
1165
  })
1140
1166
  };
1141
1167
 
1142
- // src/shared/types/pagination.ts
1168
+ // src/universal/types/pagination.ts
1143
1169
  var Cursor = (value) => value;
1144
1170
  var PaginatedResponse = {
1145
1171
  fromDto: (dto, itemMapper) => ({
@@ -1164,7 +1190,7 @@ var PaginationParams = {
1164
1190
  }
1165
1191
  };
1166
1192
 
1167
- // src/shared/api/frontline/offers.ts
1193
+ // src/universal/api/frontline/offers.ts
1168
1194
  async function fetchOffers(api, clientCreds) {
1169
1195
  return fetchAllPages((params) => fetchOffersPage(api, params, clientCreds));
1170
1196
  }
@@ -1219,7 +1245,7 @@ var ServerOffersNamespaceImpl = class {
1219
1245
  }
1220
1246
  };
1221
1247
 
1222
- // src/shared/types/requirement.ts
1248
+ // src/universal/types/requirement.ts
1223
1249
  var RequirementId = (value) => value;
1224
1250
  var Requirement = {
1225
1251
  fromDto: (dto) => ({
@@ -1240,7 +1266,7 @@ var RequirementStatusInfo = {
1240
1266
  )
1241
1267
  };
1242
1268
 
1243
- // src/shared/api/frontline/requirements.ts
1269
+ // src/universal/api/frontline/requirements.ts
1244
1270
  async function fetchOfferRequirements(api, offerId, clientCreds) {
1245
1271
  const response = await api.send({
1246
1272
  method: "GET",
@@ -1266,7 +1292,7 @@ async function fetchRequirementStatuses(api, offerId) {
1266
1292
  return RequirementStatusInfo.fromStatusesDto(response);
1267
1293
  }
1268
1294
 
1269
- // src/shared/types/document-submission.ts
1295
+ // src/universal/types/document-submission.ts
1270
1296
  var DocumentSubmission = {
1271
1297
  fromDto: (dto) => ({
1272
1298
  status: dto.status,
@@ -1274,7 +1300,7 @@ var DocumentSubmission = {
1274
1300
  })
1275
1301
  };
1276
1302
 
1277
- // src/shared/api/frontline/documents.ts
1303
+ // src/universal/api/frontline/documents.ts
1278
1304
  async function submitDocument(api, documentType, fields) {
1279
1305
  const dto = await api.send({
1280
1306
  method: "POST",
@@ -1285,14 +1311,14 @@ async function submitDocument(api, documentType, fields) {
1285
1311
  return DocumentSubmission.fromDto(dto);
1286
1312
  }
1287
1313
 
1288
- // src/shared/types/kyc.ts
1314
+ // src/universal/types/kyc.ts
1289
1315
  var KycToken = {
1290
1316
  fromDto: (dto) => ({
1291
1317
  token: dto.token
1292
1318
  })
1293
1319
  };
1294
1320
 
1295
- // src/shared/api/frontline/kyc.ts
1321
+ // src/universal/api/frontline/kyc.ts
1296
1322
  async function createKycToken(api, levelName, reset) {
1297
1323
  const dto = await api.send({
1298
1324
  method: "POST",
@@ -1306,7 +1332,7 @@ async function createKycToken(api, levelName, reset) {
1306
1332
  return KycToken.fromDto(dto);
1307
1333
  }
1308
1334
 
1309
- // src/shared/types/pii.ts
1335
+ // src/universal/types/pii.ts
1310
1336
  var Iso2CountryCode = (value) => value;
1311
1337
  var PiiJurisdiction = {
1312
1338
  fromDto: (dto) => ({
@@ -1334,7 +1360,7 @@ var Pii = {
1334
1360
  })
1335
1361
  };
1336
1362
 
1337
- // src/shared/api/frontline/pii.ts
1363
+ // src/universal/api/frontline/pii.ts
1338
1364
  async function fetchPii(api) {
1339
1365
  const dto = await api.send({
1340
1366
  method: "GET",
@@ -1344,7 +1370,7 @@ async function fetchPii(api) {
1344
1370
  return Pii.fromDto(dto);
1345
1371
  }
1346
1372
 
1347
- // src/shared/core/requirements/requirements-namespace.ts
1373
+ // src/universal/core/requirements/requirements-namespace.ts
1348
1374
  var RequirementsNamespaceImpl = class {
1349
1375
  constructor(ctx) {
1350
1376
  this.ctx = ctx;
@@ -1412,187 +1438,10 @@ var ServerRequirementsNamespaceImpl = class extends RequirementsNamespaceImpl {
1412
1438
  }
1413
1439
  };
1414
1440
 
1415
- // src/shared/api/nabu/config.ts
1441
+ // src/universal/api/nabu/config.ts
1416
1442
  var NABU_BASE_URL = "https://asset.coinlist.co";
1417
1443
 
1418
- // src/shared/types/providers/superstate/swap.ts
1419
- var SwapAuthorization = {
1420
- fromDto: (dto) => ({
1421
- authorized: dto.authorized
1422
- })
1423
- };
1424
- var SwapPreview = {
1425
- fromDto: (dto) => ({
1426
- inputAmount: parseUint256(
1427
- BigInt(dto.pay_input_amount),
1428
- "SwapPreview.pay_input_amount"
1429
- ),
1430
- fee: parseUint256(BigInt(dto.fee), "SwapPreview.fee"),
1431
- outputAmount: parseUint256(
1432
- BigInt(dto.receive_output_amount),
1433
- "SwapPreview.receive_output_amount"
1434
- )
1435
- })
1436
- };
1437
- var SwapStatus = {
1438
- fromDto: (dto) => ({
1439
- stopped: parseUint256(BigInt(dto.stopped), "SwapStatus.stopped"),
1440
- swapLevel: parseUint256(BigInt(dto.swap_level), "SwapStatus.swap_level")
1441
- })
1442
- };
1443
- var TokenAllowance = {
1444
- fromDto: (dto) => ({
1445
- allowance: parseUint256(BigInt(dto.allowance), "TokenAllowance.allowance")
1446
- })
1447
- };
1448
- var TokenBalance = {
1449
- fromDto: (dto) => ({
1450
- balance: parseUint256(BigInt(dto.balance), "TokenBalance.balance")
1451
- })
1452
- };
1453
- var AllowWalletResponse = {
1454
- fromDto: (dto) => {
1455
- switch (dto.action) {
1456
- case "broadcast_transaction":
1457
- return {
1458
- action: "broadcast_transaction",
1459
- to: EvmContractAddress(dto.to),
1460
- data: HexEncodedTransactionData(dto.data)
1461
- };
1462
- case "none":
1463
- return {
1464
- action: "none",
1465
- alreadyAllowed: dto.already_allowed
1466
- };
1467
- default: {
1468
- const _exhaustive = dto;
1469
- return _exhaustive;
1470
- }
1471
- }
1472
- }
1473
- };
1474
-
1475
- // src/shared/api/frontline/providers/superstate/swap.ts
1476
- async function getSwapAuthorization(api, params) {
1477
- const dto = await api.send({
1478
- method: "GET",
1479
- url: "/v1/wallet/authorized",
1480
- queryParams: {
1481
- chain: params.chain,
1482
- contract_address: params.contractAddress,
1483
- wallet_address: params.walletAddress
1484
- },
1485
- attributes: Attributes.protected()
1486
- });
1487
- return SwapAuthorization.fromDto(dto);
1488
- }
1489
- async function getSwapOutputToken(api, params) {
1490
- const dto = await api.send({
1491
- method: "GET",
1492
- url: "/v1/swap/output-token",
1493
- queryParams: {
1494
- chain: params.chain,
1495
- contract_address: params.contractAddress
1496
- },
1497
- attributes: Attributes.protected()
1498
- });
1499
- return toErc20Asset(dto);
1500
- }
1501
- async function getSwapPreview(api, params) {
1502
- const dto = await api.send({
1503
- method: "GET",
1504
- url: "/v1/swap/preview",
1505
- queryParams: {
1506
- chain: params.chain,
1507
- contract_address: params.contractAddress,
1508
- input_token: params.inputToken,
1509
- amount: params.amount.toString()
1510
- },
1511
- attributes: Attributes.protected()
1512
- });
1513
- return SwapPreview.fromDto(dto);
1514
- }
1515
- async function getSwapStatus(api, params) {
1516
- const dto = await api.send({
1517
- method: "GET",
1518
- url: "/v1/swap/status",
1519
- queryParams: {
1520
- chain: params.chain,
1521
- contract_address: params.contractAddress
1522
- },
1523
- attributes: Attributes.protected()
1524
- });
1525
- return SwapStatus.fromDto(dto);
1526
- }
1527
- async function getTokenAllowance(api, params) {
1528
- const dto = await api.send({
1529
- method: "GET",
1530
- url: "/v1/token/allowance",
1531
- queryParams: {
1532
- chain: params.chain,
1533
- token_address: params.tokenAddress,
1534
- owner: params.owner,
1535
- spender: params.spender
1536
- },
1537
- attributes: Attributes.protected()
1538
- });
1539
- return TokenAllowance.fromDto(dto);
1540
- }
1541
- async function getTokenBalance(api, params) {
1542
- const dto = await api.send({
1543
- method: "GET",
1544
- url: "/v1/token/balance",
1545
- queryParams: {
1546
- chain: params.chain,
1547
- token_address: params.tokenAddress,
1548
- owner: params.owner
1549
- },
1550
- attributes: Attributes.protected()
1551
- });
1552
- return TokenBalance.fromDto(dto);
1553
- }
1554
- async function allowWallet(api, params) {
1555
- const dto = await api.send({
1556
- method: "POST",
1557
- url: `/v1/offers/${encodeURIComponent(params.offerId)}/allow-wallet`,
1558
- body: {
1559
- wallet_address: params.walletAddress,
1560
- chain: params.chain,
1561
- signature: params.signature
1562
- },
1563
- attributes: Attributes.protected()
1564
- });
1565
- return AllowWalletResponse.fromDto(dto);
1566
- }
1567
- function toErc20Asset(dto) {
1568
- return {
1569
- name: dto.name,
1570
- symbol: AssetSymbol(dto.symbol),
1571
- decimals: AssetDecimals(dto.decimals)
1572
- };
1573
- }
1574
-
1575
- // src/shared/core/blockchain/erc20/erc20-namespace.ts
1576
- var Erc20NamespaceImpl = class {
1577
- constructor(ctx) {
1578
- this.ctx = ctx;
1579
- this.log = internalLogger(ctx.logger, "ERC20");
1580
- }
1581
- async getAllowance(params) {
1582
- return this.log.wrap("getAllowance", params, async () => {
1583
- await this.ctx.ensureUserAuthenticated();
1584
- return getTokenAllowance(this.ctx.api, params);
1585
- });
1586
- }
1587
- async getBalance(params) {
1588
- return this.log.wrap("getBalance", params, async () => {
1589
- await this.ctx.ensureUserAuthenticated();
1590
- return getTokenBalance(this.ctx.api, params);
1591
- });
1592
- }
1593
- };
1594
-
1595
- // src/shared/types/providers/coin-list/token-sale.ts
1444
+ // src/universal/types/providers/coin-list/token-sale.ts
1596
1445
  var ParticipationId = (value) => value;
1597
1446
  var Blockchain = (value) => value;
1598
1447
  var WalletAddress = (value) => value;
@@ -1639,7 +1488,7 @@ var CreateParticipationParams = {
1639
1488
  })
1640
1489
  };
1641
1490
 
1642
- // src/shared/api/frontline/providers/coin-list/token-sale.ts
1491
+ // src/universal/api/frontline/providers/coin-list/token-sale.ts
1643
1492
  async function fetchParticipations(api, offerId) {
1644
1493
  return fetchAllPages(
1645
1494
  (params) => fetchParticipationsPage(api, params),
@@ -1673,7 +1522,7 @@ async function createParticipation(api, params) {
1673
1522
  return Participation.fromDto(dto);
1674
1523
  }
1675
1524
 
1676
- // src/shared/core/checkout/coin-list/token-sale-namespace.ts
1525
+ // src/universal/core/checkout/coin-list/token-sale-namespace.ts
1677
1526
  var CoinListTokenSaleNamespaceImpl = class {
1678
1527
  constructor(ctx) {
1679
1528
  this.ctx = ctx;
@@ -1705,20 +1554,20 @@ var CoinListTokenSaleNamespaceImpl = class {
1705
1554
  }
1706
1555
  };
1707
1556
 
1708
- // src/shared/core/blockchain/formatters.ts
1557
+ // src/universal/core/shared/blockchain/formatters.ts
1709
1558
  var import_viem = require("viem");
1710
1559
 
1711
- // src/shared/types/blockchain/ui.ts
1560
+ // src/universal/types/blockchain/ui.ts
1712
1561
  var FormattedAmountAssetUi = (value) => value;
1713
1562
 
1714
- // src/shared/core/blockchain/formatters.ts
1563
+ // src/universal/core/shared/blockchain/formatters.ts
1715
1564
  function formatRawAmount(amount) {
1716
1565
  return (0, import_viem.formatUnits)(amount.raw, amount.decimals);
1717
1566
  }
1718
1567
  var NA_AMOUNT_ASSET_UI = FormattedAmountAssetUi("-");
1719
1568
  var USD_FRACTION_DIGITS = AssetDecimals(2);
1720
1569
 
1721
- // src/shared/core/blockchain/chain.ts
1570
+ // src/universal/core/shared/blockchain/chain.ts
1722
1571
  var CHAIN_IDS = {
1723
1572
  ethereum_mainnet: 1,
1724
1573
  ethereum_sepolia: 11155111,
@@ -1734,7 +1583,7 @@ function chainFromId(chainId) {
1734
1583
  return chain;
1735
1584
  }
1736
1585
 
1737
- // src/shared/core/blockchain/math.ts
1586
+ // src/universal/core/shared/blockchain/math.ts
1738
1587
  var import_viem2 = require("viem");
1739
1588
  function blockchainAmountFromRawOrThrow({
1740
1589
  label,
@@ -1758,10 +1607,10 @@ function blockchainAmountFromRawOrThrow({
1758
1607
  }
1759
1608
  }
1760
1609
 
1761
- // src/shared/types/trading.ts
1610
+ // src/universal/types/trading.ts
1762
1611
  var Ticker = (value) => value;
1763
1612
 
1764
- // src/shared/types/providers/ondo/ondo.ts
1613
+ // src/universal/types/providers/ondo/ondo.ts
1765
1614
  var OndoTradingStatus = {
1766
1615
  fromDto: (dto) => {
1767
1616
  if (!dto.tradable) return { type: "not-tradable", side: dto.side };
@@ -1927,7 +1776,7 @@ function parseExpiresAt(value) {
1927
1776
  return date;
1928
1777
  }
1929
1778
 
1930
- // src/shared/api/frontline/providers/ondo/ondo.ts
1779
+ // src/universal/api/frontline/providers/ondo/ondo.ts
1931
1780
  async function getOndoTradingStatus(api, params) {
1932
1781
  const dto = await api.send({
1933
1782
  method: "GET",
@@ -2022,7 +1871,7 @@ function sizeParam(params) {
2022
1871
  return { notional_value: notionalValue };
2023
1872
  }
2024
1873
 
2025
- // src/shared/core/checkout/ondo/ondo-namespace.ts
1874
+ // src/universal/core/checkout/ondo/ondo-namespace.ts
2026
1875
  var OndoNamespaceImpl = class {
2027
1876
  constructor(ctx) {
2028
1877
  this.ctx = ctx;
@@ -2054,7 +1903,164 @@ var OndoNamespaceImpl = class {
2054
1903
  }
2055
1904
  };
2056
1905
 
2057
- // src/shared/core/checkout/superstate/swap-namespace.ts
1906
+ // src/universal/types/providers/superstate/swap.ts
1907
+ var SwapAuthorization = {
1908
+ fromDto: (dto) => ({
1909
+ authorized: dto.authorized
1910
+ })
1911
+ };
1912
+ var SwapPreview = {
1913
+ fromDto: (dto) => ({
1914
+ inputAmount: parseUint256(
1915
+ BigInt(dto.pay_input_amount),
1916
+ "SwapPreview.pay_input_amount"
1917
+ ),
1918
+ fee: parseUint256(BigInt(dto.fee), "SwapPreview.fee"),
1919
+ outputAmount: parseUint256(
1920
+ BigInt(dto.receive_output_amount),
1921
+ "SwapPreview.receive_output_amount"
1922
+ )
1923
+ })
1924
+ };
1925
+ var SwapStatus = {
1926
+ fromDto: (dto) => ({
1927
+ stopped: parseUint256(BigInt(dto.stopped), "SwapStatus.stopped"),
1928
+ swapLevel: parseUint256(BigInt(dto.swap_level), "SwapStatus.swap_level")
1929
+ })
1930
+ };
1931
+ var TokenAllowance = {
1932
+ fromDto: (dto) => ({
1933
+ allowance: parseUint256(BigInt(dto.allowance), "TokenAllowance.allowance")
1934
+ })
1935
+ };
1936
+ var TokenBalance = {
1937
+ fromDto: (dto) => ({
1938
+ balance: parseUint256(BigInt(dto.balance), "TokenBalance.balance")
1939
+ })
1940
+ };
1941
+ var AllowWalletResponse = {
1942
+ fromDto: (dto) => {
1943
+ switch (dto.action) {
1944
+ case "broadcast_transaction":
1945
+ return {
1946
+ action: "broadcast_transaction",
1947
+ to: EvmContractAddress(dto.to),
1948
+ data: HexEncodedTransactionData(dto.data)
1949
+ };
1950
+ case "none":
1951
+ return {
1952
+ action: "none",
1953
+ alreadyAllowed: dto.already_allowed
1954
+ };
1955
+ default: {
1956
+ const _exhaustive = dto;
1957
+ return _exhaustive;
1958
+ }
1959
+ }
1960
+ }
1961
+ };
1962
+
1963
+ // src/universal/api/frontline/providers/superstate/swap.ts
1964
+ async function getSwapAuthorization(api, params) {
1965
+ const dto = await api.send({
1966
+ method: "GET",
1967
+ url: "/v1/wallet/authorized",
1968
+ queryParams: {
1969
+ chain: params.chain,
1970
+ contract_address: params.contractAddress,
1971
+ wallet_address: params.walletAddress
1972
+ },
1973
+ attributes: Attributes.protected()
1974
+ });
1975
+ return SwapAuthorization.fromDto(dto);
1976
+ }
1977
+ async function getSwapOutputToken(api, params) {
1978
+ const dto = await api.send({
1979
+ method: "GET",
1980
+ url: "/v1/swap/output-token",
1981
+ queryParams: {
1982
+ chain: params.chain,
1983
+ contract_address: params.contractAddress
1984
+ },
1985
+ attributes: Attributes.protected()
1986
+ });
1987
+ return toErc20Asset(dto);
1988
+ }
1989
+ async function getSwapPreview(api, params) {
1990
+ const dto = await api.send({
1991
+ method: "GET",
1992
+ url: "/v1/swap/preview",
1993
+ queryParams: {
1994
+ chain: params.chain,
1995
+ contract_address: params.contractAddress,
1996
+ input_token: params.inputToken,
1997
+ amount: params.amount.toString()
1998
+ },
1999
+ attributes: Attributes.protected()
2000
+ });
2001
+ return SwapPreview.fromDto(dto);
2002
+ }
2003
+ async function getSwapStatus(api, params) {
2004
+ const dto = await api.send({
2005
+ method: "GET",
2006
+ url: "/v1/swap/status",
2007
+ queryParams: {
2008
+ chain: params.chain,
2009
+ contract_address: params.contractAddress
2010
+ },
2011
+ attributes: Attributes.protected()
2012
+ });
2013
+ return SwapStatus.fromDto(dto);
2014
+ }
2015
+ async function getTokenAllowance(api, params) {
2016
+ const dto = await api.send({
2017
+ method: "GET",
2018
+ url: "/v1/token/allowance",
2019
+ queryParams: {
2020
+ chain: params.chain,
2021
+ token_address: params.tokenAddress,
2022
+ owner: params.owner,
2023
+ spender: params.spender
2024
+ },
2025
+ attributes: Attributes.protected()
2026
+ });
2027
+ return TokenAllowance.fromDto(dto);
2028
+ }
2029
+ async function getTokenBalance(api, params) {
2030
+ const dto = await api.send({
2031
+ method: "GET",
2032
+ url: "/v1/token/balance",
2033
+ queryParams: {
2034
+ chain: params.chain,
2035
+ token_address: params.tokenAddress,
2036
+ owner: params.owner
2037
+ },
2038
+ attributes: Attributes.protected()
2039
+ });
2040
+ return TokenBalance.fromDto(dto);
2041
+ }
2042
+ async function allowWallet(api, params) {
2043
+ const dto = await api.send({
2044
+ method: "POST",
2045
+ url: `/v1/offers/${encodeURIComponent(params.offerId)}/allow-wallet`,
2046
+ body: {
2047
+ wallet_address: params.walletAddress,
2048
+ chain: params.chain,
2049
+ signature: params.signature
2050
+ },
2051
+ attributes: Attributes.protected()
2052
+ });
2053
+ return AllowWalletResponse.fromDto(dto);
2054
+ }
2055
+ function toErc20Asset(dto) {
2056
+ return {
2057
+ name: dto.name,
2058
+ symbol: AssetSymbol(dto.symbol),
2059
+ decimals: AssetDecimals(dto.decimals)
2060
+ };
2061
+ }
2062
+
2063
+ // src/universal/core/checkout/superstate/swap-namespace.ts
2058
2064
  var SuperstateSwapNamespaceImpl = class {
2059
2065
  constructor(ctx) {
2060
2066
  this.ctx = ctx;
@@ -2092,10 +2098,30 @@ var SuperstateSwapNamespaceImpl = class {
2092
2098
  }
2093
2099
  };
2094
2100
 
2095
- // src/shared/api/nabu/tokens.ts
2101
+ // src/universal/core/shared/blockchain/erc20/erc20-namespace.ts
2102
+ var Erc20NamespaceImpl = class {
2103
+ constructor(ctx) {
2104
+ this.ctx = ctx;
2105
+ this.log = internalLogger(ctx.logger, "ERC20");
2106
+ }
2107
+ async getAllowance(params) {
2108
+ return this.log.wrap("getAllowance", params, async () => {
2109
+ await this.ctx.ensureUserAuthenticated();
2110
+ return getTokenAllowance(this.ctx.api, params);
2111
+ });
2112
+ }
2113
+ async getBalance(params) {
2114
+ return this.log.wrap("getBalance", params, async () => {
2115
+ await this.ctx.ensureUserAuthenticated();
2116
+ return getTokenBalance(this.ctx.api, params);
2117
+ });
2118
+ }
2119
+ };
2120
+
2121
+ // src/universal/api/nabu/tokens.ts
2096
2122
  var import_viem3 = require("viem");
2097
2123
 
2098
- // src/shared/types/token-metadata.ts
2124
+ // src/universal/types/token-metadata.ts
2099
2125
  var TokenLogoUrl = (value) => value;
2100
2126
  var TokenLogo = {
2101
2127
  /** `baseUrl` is the registry origin; registry URLs are root-relative. */
@@ -2178,7 +2204,7 @@ var resolveLogoUrl = (url, baseUrl) => TokenLogoUrl(
2178
2204
  url.startsWith("http") ? url : `${baseUrl.replace(/\/$/, "")}${url}`
2179
2205
  );
2180
2206
 
2181
- // src/shared/api/nabu/tokens.ts
2207
+ // src/universal/api/nabu/tokens.ts
2182
2208
  function createNabuApiClient(baseUrl, logger = null) {
2183
2209
  return new HttpClient({ baseUrl }, {}, logger);
2184
2210
  }
@@ -2269,10 +2295,10 @@ function checksummed(address) {
2269
2295
  }
2270
2296
  }
2271
2297
 
2272
- // src/shared/core/tokens/tokens-namespace.ts
2298
+ // src/universal/core/tokens/tokens-namespace.ts
2273
2299
  var TokensNamespaceImpl = class {
2274
2300
  /**
2275
- * Takes the registry origin rather than a `SharedNamespaceContext`: the
2301
+ * Takes the registry origin rather than a `UniversalNamespaceContext`: the
2276
2302
  * registry is unauthenticated and on its own host, so the frontline sender
2277
2303
  * and the auth check would both be dead weight here.
2278
2304
  */
@@ -2296,7 +2322,7 @@ var TokensNamespaceImpl = class {
2296
2322
  }
2297
2323
  };
2298
2324
 
2299
- // src/shared/types/offer-option-address.ts
2325
+ // src/universal/types/offer-option-address.ts
2300
2326
  var OfferOptionAddressId = (value) => value;
2301
2327
  var OfferOptionAddress = {
2302
2328
  /** Maps the API DTO into the SDK offer-option-address domain model. */
@@ -2318,7 +2344,7 @@ var ConnectExternalWalletParams = {
2318
2344
  })
2319
2345
  };
2320
2346
 
2321
- // src/shared/types/wallet-ownership-challenge.ts
2347
+ // src/universal/types/wallet-ownership-challenge.ts
2322
2348
  var WalletOwnershipChallenge = {
2323
2349
  /** Maps the API DTO into the SDK wallet-ownership-challenge domain model. */
2324
2350
  fromDto: (dto) => ({
@@ -2357,7 +2383,7 @@ var CreateWalletOwnershipChallengeParams = {
2357
2383
  }
2358
2384
  };
2359
2385
 
2360
- // src/shared/api/frontline/wallet-connect.ts
2386
+ // src/universal/api/frontline/wallet-connect.ts
2361
2387
  async function createWalletOwnershipChallenge(api, params) {
2362
2388
  const dto = await api.send({
2363
2389
  method: "POST",
@@ -2394,7 +2420,7 @@ async function removeOptionAddress(api, offerId, addressId) {
2394
2420
  return OfferOptionAddress.fromDto(dto);
2395
2421
  }
2396
2422
 
2397
- // src/shared/core/wallets/wallets-namespace.ts
2423
+ // src/universal/core/wallets/wallets-namespace.ts
2398
2424
  var WalletsNamespaceImpl = class {
2399
2425
  constructor(ctx) {
2400
2426
  this.ctx = ctx;
@@ -2497,7 +2523,7 @@ function createCoinListServer(config) {
2497
2523
  // src/server/core/observability/pino-server-logger.ts
2498
2524
  var import_pino = require("pino");
2499
2525
 
2500
- // src/shared/core/observability/pino-logger.ts
2526
+ // src/universal/core/shared/observability/pino-logger.ts
2501
2527
  function toPinoRecord(event) {
2502
2528
  try {
2503
2529
  const record = {};