@t402/polkadot 2.4.0 → 2.6.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 (37) hide show
  1. package/dist/{exact-direct → cjs/exact-direct}/client/index.d.ts +1 -1
  2. package/dist/{exact-direct/client/index.cjs → cjs/exact-direct/client/index.js} +5 -3
  3. package/dist/{index.cjs.map → cjs/exact-direct/client/index.js.map} +1 -1
  4. package/dist/{exact-direct → cjs/exact-direct}/facilitator/index.d.ts +1 -1
  5. package/dist/{exact-direct/facilitator/index.cjs → cjs/exact-direct/facilitator/index.js} +8 -6
  6. package/dist/cjs/exact-direct/facilitator/index.js.map +1 -0
  7. package/dist/{exact-direct/server/index.cjs → cjs/exact-direct/server/index.js} +6 -4
  8. package/dist/cjs/exact-direct/server/index.js.map +1 -0
  9. package/dist/{index.d.ts → cjs/index.d.ts} +2 -2
  10. package/dist/{index.cjs → cjs/index.js} +4 -4
  11. package/dist/cjs/index.js.map +1 -0
  12. package/dist/{types-Dbjfcz2Y.d.cts → cjs/types-Bb84eJ4_.d.ts} +1 -1
  13. package/dist/{index.mjs → esm/chunk-BEDKJN2Y.mjs} +28 -22
  14. package/dist/esm/chunk-BEDKJN2Y.mjs.map +1 -0
  15. package/dist/{exact-direct/client/index.d.cts → esm/exact-direct/client/index.d.mts} +1 -1
  16. package/dist/esm/exact-direct/client/index.mjs +71 -0
  17. package/dist/esm/exact-direct/client/index.mjs.map +1 -0
  18. package/dist/{exact-direct/facilitator/index.d.cts → esm/exact-direct/facilitator/index.d.mts} +1 -1
  19. package/dist/{exact-direct → esm/exact-direct}/facilitator/index.mjs +18 -159
  20. package/dist/esm/exact-direct/facilitator/index.mjs.map +1 -0
  21. package/dist/{exact-direct → esm/exact-direct}/server/index.mjs +13 -102
  22. package/dist/esm/exact-direct/server/index.mjs.map +1 -0
  23. package/dist/{index.d.cts → esm/index.d.mts} +2 -2
  24. package/dist/esm/index.mjs +69 -0
  25. package/dist/esm/index.mjs.map +1 -0
  26. package/dist/{types-Dbjfcz2Y.d.ts → esm/types-Bb84eJ4_.d.mts} +1 -1
  27. package/package.json +18 -16
  28. package/dist/exact-direct/client/index.cjs.map +0 -1
  29. package/dist/exact-direct/client/index.mjs +0 -161
  30. package/dist/exact-direct/client/index.mjs.map +0 -1
  31. package/dist/exact-direct/facilitator/index.cjs.map +0 -1
  32. package/dist/exact-direct/facilitator/index.mjs.map +0 -1
  33. package/dist/exact-direct/server/index.cjs.map +0 -1
  34. package/dist/exact-direct/server/index.mjs.map +0 -1
  35. package/dist/index.mjs.map +0 -1
  36. /package/dist/{exact-direct → cjs/exact-direct}/server/index.d.ts +0 -0
  37. /package/dist/{exact-direct/server/index.d.cts → esm/exact-direct/server/index.d.mts} +0 -0
@@ -1,5 +1,5 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayload } from '@t402/core/types';
2
- import { C as ClientPolkadotSigner } from '../../types-Dbjfcz2Y.js';
2
+ import { C as ClientPolkadotSigner } from '../../types-Bb84eJ4_.js';
3
3
 
4
4
  /**
5
5
  * Polkadot Exact-Direct Client Scheme
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/exact-direct/client/index.ts
21
23
  var client_exports = {};
@@ -125,9 +127,9 @@ function isValidAddress(address) {
125
127
 
126
128
  // src/exact-direct/client/scheme.ts
127
129
  var ExactDirectPolkadotClient = class {
128
- scheme = SCHEME_EXACT_DIRECT;
129
- signer;
130
130
  constructor(config) {
131
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
132
+ __publicField(this, "signer");
131
133
  this.signer = config.signer;
132
134
  }
133
135
  /**
@@ -186,4 +188,4 @@ function createExactDirectPolkadotClient(config) {
186
188
  ExactDirectPolkadotClient,
187
189
  createExactDirectPolkadotClient
188
190
  });
189
- //# sourceMappingURL=index.cjs.map
191
+ //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/tokens.ts","../src/utils.ts"],"sourcesContent":["/**\n * @t402/polkadot - Polkadot Asset Hub mechanism for T402\n *\n * This package provides support for USDT payments on Polkadot Asset Hub\n * using the exact-direct scheme.\n *\n * @example\n * ```typescript\n * // Client usage\n * import { createExactDirectPolkadotClient } from '@t402/polkadot/exact-direct/client';\n *\n * const client = createExactDirectPolkadotClient({\n * signer: myPolkadotSigner,\n * });\n *\n * // Server usage\n * import { registerExactDirectPolkadotServer } from '@t402/polkadot/exact-direct/server';\n *\n * registerExactDirectPolkadotServer(server);\n *\n * // Facilitator usage\n * import { createExactDirectPolkadotFacilitator } from '@t402/polkadot/exact-direct/facilitator';\n *\n * const facilitator = createExactDirectPolkadotFacilitator(signer);\n * ```\n */\n\n// Re-export constants\nexport {\n POLKADOT_CAIP2_NAMESPACE,\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n SCHEME_EXACT_DIRECT,\n DEFAULT_POLKADOT_INDEXER,\n DEFAULT_KUSAMA_INDEXER,\n DEFAULT_WESTEND_INDEXER,\n DEFAULT_POLKADOT_RPC,\n DEFAULT_KUSAMA_RPC,\n DEFAULT_WESTEND_RPC,\n POLKADOT_NETWORKS,\n getNetworkConfig,\n isPolkadotNetwork,\n type PolkadotNetworkConfig,\n} from \"./constants.js\";\n\n// Re-export token registry\nexport {\n USDT_POLKADOT,\n USDT_KUSAMA,\n USDT_WESTEND,\n TOKEN_REGISTRY,\n DEFAULT_TOKENS,\n getTokenConfig,\n getDefaultToken,\n getAssetId,\n type TokenConfig,\n} from \"./tokens.js\";\n\n// Re-export types\nexport type {\n ExactDirectPolkadotPayload,\n PolkadotExtrinsicResult,\n PolkadotEvent,\n ParsedAssetTransfer,\n FacilitatorPolkadotSigner,\n ClientPolkadotSigner,\n PolkadotServerConfig,\n PolkadotFacilitatorConfig,\n} from \"./types.js\";\n\n// Re-export utilities\nexport {\n isValidAddress,\n isValidExtrinsicHash,\n isValidBlockHash,\n compareAddresses,\n formatAmount,\n parseAmount,\n extractAssetTransfer,\n extractAssetTransferFromEvents,\n buildExtrinsicId,\n parseExtrinsicId,\n} from \"./utils.js\";\n","/**\n * Polkadot Asset Hub T402 Constants\n *\n * Polkadot Asset Hub (formerly Statemint) is a common-good parachain\n * that hosts assets like USDT on the Polkadot network.\n */\n\n// CAIP-2 namespace for Polkadot\nexport const POLKADOT_CAIP2_NAMESPACE = \"polkadot\";\n\n// CAIP-2 network identifiers (first 32 chars of genesis hash)\n// Polkadot Asset Hub (Parachain ID: 1000)\nexport const POLKADOT_ASSET_HUB_CAIP2 = \"polkadot:68d56f15f85d3136970ec16946040bc1\";\n\n// Kusama Asset Hub (Parachain ID: 1000 on Kusama)\nexport const KUSAMA_ASSET_HUB_CAIP2 = \"polkadot:48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\";\n\n// Westend Asset Hub (Testnet)\nexport const WESTEND_ASSET_HUB_CAIP2 = \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Default indexers (Subscan API)\nexport const DEFAULT_POLKADOT_INDEXER = \"https://assethub-polkadot.api.subscan.io\";\nexport const DEFAULT_KUSAMA_INDEXER = \"https://assethub-kusama.api.subscan.io\";\nexport const DEFAULT_WESTEND_INDEXER = \"https://assethub-westend.api.subscan.io\";\n\n// Default RPC endpoints\nexport const DEFAULT_POLKADOT_RPC = \"wss://polkadot-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_KUSAMA_RPC = \"wss://kusama-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_WESTEND_RPC = \"wss://westend-asset-hub-rpc.polkadot.io\";\n\n// Network configurations\nexport interface PolkadotNetworkConfig {\n readonly name: string;\n readonly caip2: string;\n readonly rpcUrl: string;\n readonly indexerUrl: string;\n readonly genesisHash: string;\n readonly ss58Prefix: number;\n readonly isTestnet: boolean;\n}\n\nexport const POLKADOT_NETWORKS: Record<string, PolkadotNetworkConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n name: \"Polkadot Asset Hub\",\n caip2: POLKADOT_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_POLKADOT_RPC,\n indexerUrl: DEFAULT_POLKADOT_INDEXER,\n genesisHash: \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\",\n ss58Prefix: 0, // Polkadot\n isTestnet: false,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n name: \"Kusama Asset Hub\",\n caip2: KUSAMA_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_KUSAMA_RPC,\n indexerUrl: DEFAULT_KUSAMA_INDEXER,\n genesisHash: \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\",\n ss58Prefix: 2, // Kusama\n isTestnet: false,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n name: \"Westend Asset Hub\",\n caip2: WESTEND_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_WESTEND_RPC,\n indexerUrl: DEFAULT_WESTEND_INDEXER,\n genesisHash: \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n ss58Prefix: 42, // Generic Substrate\n isTestnet: true,\n },\n};\n\n/**\n * Get network configuration by CAIP-2 identifier\n */\nexport function getNetworkConfig(network: string): PolkadotNetworkConfig | undefined {\n return POLKADOT_NETWORKS[network];\n}\n\n/**\n * Check if a network identifier is a Polkadot network\n */\nexport function isPolkadotNetwork(network: string): boolean {\n return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);\n}\n","/**\n * Polkadot Asset Hub Token Registry\n *\n * On Polkadot Asset Hub, tokens are identified by Asset IDs.\n * USDT is Asset ID 1984, created by Tether.\n */\n\nimport {\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Polkadot Asset Hub\n */\nexport interface TokenConfig {\n /** Asset ID on Asset Hub */\n readonly assetId: number;\n /** Token symbol */\n readonly symbol: string;\n /** Token name */\n readonly name: string;\n /** Decimal places */\n readonly decimals: number;\n /** Issuer (creator of the asset) */\n readonly issuer?: string;\n}\n\n/**\n * USDT on Polkadot Asset Hub\n * Asset ID: 1984\n * Decimals: 6\n */\nexport const USDT_POLKADOT: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * USDT on Kusama Asset Hub\n * Asset ID: 1984 (same as Polkadot)\n */\nexport const USDT_KUSAMA: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * Test USDT on Westend Asset Hub (testnet)\n */\nexport const USDT_WESTEND: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Test Tether USD\",\n decimals: 6,\n};\n\n/**\n * Network-specific token registries\n */\nexport const TOKEN_REGISTRY: Record<string, Record<string, TokenConfig>> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n USDT: USDT_POLKADOT,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n USDT: USDT_KUSAMA,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n USDT: USDT_WESTEND,\n },\n};\n\n/**\n * Default tokens per network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,\n [KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,\n [WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND,\n};\n\n/**\n * Get token configuration by network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string = \"USDT\",\n): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol];\n}\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n\n/**\n * Get asset ID for a token on a network\n */\nexport function getAssetId(network: string, symbol: string = \"USDT\"): number | undefined {\n return getTokenConfig(network, symbol)?.assetId;\n}\n","/**\n * Polkadot Asset Hub Utility Functions\n */\n\nimport type { PolkadotExtrinsicResult, ParsedAssetTransfer } from \"./types.js\";\n\n/**\n * Validate a Polkadot SS58 address format\n * SS58 addresses are base58-encoded with a checksum\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== \"string\") {\n return false;\n }\n\n // SS58 addresses typically start with 1 (Polkadot), or have other prefixes\n // Length is typically 47-48 characters for Polkadot addresses\n // For a simple validation, check base58 characters and length\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]{45,50}$/;\n return base58Regex.test(address);\n}\n\n/**\n * Validate an extrinsic hash format\n * Extrinsic hashes are 32-byte hex strings prefixed with 0x\n */\nexport function isValidExtrinsicHash(hash: string): boolean {\n if (!hash || typeof hash !== \"string\") {\n return false;\n }\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Validate a block hash format\n */\nexport function isValidBlockHash(hash: string): boolean {\n return isValidExtrinsicHash(hash); // Same format\n}\n\n/**\n * Compare two SS58 addresses (case-sensitive)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n return addr1 === addr2;\n}\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: string, decimals: number): string {\n const amountBigInt = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n\n if (fractionalPart === 0n) {\n return wholePart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\");\n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse an amount string to the smallest unit (with decimals applied)\n */\nexport function parseAmount(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const wholePart = parts[0] || \"0\";\n const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + fractionalPart).toString();\n}\n\n/**\n * Extract asset transfer details from an extrinsic result\n */\nexport function extractAssetTransfer(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Check if this is an assets.transfer or assets.transferKeepAlive call\n if (result.module !== \"assets\") {\n return null;\n }\n\n if (result.call !== \"transfer\" && result.call !== \"transferKeepAlive\") {\n return null;\n }\n\n // Extract transfer details from args\n const assetId = result.args.id as number | undefined;\n const to = result.args.target as string | undefined;\n const amount = result.args.amount as string | undefined;\n\n if (assetId === undefined || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from: result.signer,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Extract asset transfer from events (alternative method)\n */\nexport function extractAssetTransferFromEvents(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Look for assets.Transferred event\n const transferEvent = result.events.find(\n (e) => e.module === \"assets\" && e.name === \"Transferred\",\n );\n\n if (!transferEvent) {\n return null;\n }\n\n const assetId = transferEvent.data.assetId as number | undefined;\n const from = transferEvent.data.from as string | undefined;\n const to = transferEvent.data.to as string | undefined;\n const amount = transferEvent.data.amount as string | undefined;\n\n if (assetId === undefined || !from || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Build a unique extrinsic identifier from block hash and index\n */\nexport function buildExtrinsicId(blockHash: string, extrinsicIndex: number): string {\n return `${blockHash}-${extrinsicIndex}`;\n}\n\n/**\n * Parse an extrinsic identifier back to components\n */\nexport function parseExtrinsicId(\n extrinsicId: string,\n): { blockHash: string; extrinsicIndex: number } | null {\n const lastDashIndex = extrinsicId.lastIndexOf(\"-\");\n if (lastDashIndex === -1) {\n return null;\n }\n\n const blockHash = extrinsicId.slice(0, lastDashIndex);\n const extrinsicIndex = parseInt(extrinsicId.slice(lastDashIndex + 1), 10);\n\n if (!isValidBlockHash(blockHash) || isNaN(extrinsicIndex)) {\n return null;\n }\n\n return { blockHash, extrinsicIndex };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/exact-direct/client/index.ts","../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/exact-direct/client/scheme.ts"],"sourcesContent":["export {\n ExactDirectPolkadotClient,\n createExactDirectPolkadotClient,\n type ExactDirectPolkadotClientConfig,\n} from \"./scheme.js\";\n","/**\n * Polkadot Asset Hub T402 Constants\n *\n * Polkadot Asset Hub (formerly Statemint) is a common-good parachain\n * that hosts assets like USDT on the Polkadot network.\n */\n\n// CAIP-2 namespace for Polkadot\nexport const POLKADOT_CAIP2_NAMESPACE = \"polkadot\";\n\n// CAIP-2 network identifiers (first 32 chars of genesis hash)\n// Polkadot Asset Hub (Parachain ID: 1000)\nexport const POLKADOT_ASSET_HUB_CAIP2 = \"polkadot:68d56f15f85d3136970ec16946040bc1\";\n\n// Kusama Asset Hub (Parachain ID: 1000 on Kusama)\nexport const KUSAMA_ASSET_HUB_CAIP2 = \"polkadot:48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\";\n\n// Westend Asset Hub (Testnet)\nexport const WESTEND_ASSET_HUB_CAIP2 = \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Default indexers (Subscan API)\nexport const DEFAULT_POLKADOT_INDEXER = \"https://assethub-polkadot.api.subscan.io\";\nexport const DEFAULT_KUSAMA_INDEXER = \"https://assethub-kusama.api.subscan.io\";\nexport const DEFAULT_WESTEND_INDEXER = \"https://assethub-westend.api.subscan.io\";\n\n// Default RPC endpoints\nexport const DEFAULT_POLKADOT_RPC = \"wss://polkadot-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_KUSAMA_RPC = \"wss://kusama-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_WESTEND_RPC = \"wss://westend-asset-hub-rpc.polkadot.io\";\n\n// Network configurations\nexport interface PolkadotNetworkConfig {\n readonly name: string;\n readonly caip2: string;\n readonly rpcUrl: string;\n readonly indexerUrl: string;\n readonly genesisHash: string;\n readonly ss58Prefix: number;\n readonly isTestnet: boolean;\n}\n\nexport const POLKADOT_NETWORKS: Record<string, PolkadotNetworkConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n name: \"Polkadot Asset Hub\",\n caip2: POLKADOT_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_POLKADOT_RPC,\n indexerUrl: DEFAULT_POLKADOT_INDEXER,\n genesisHash: \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\",\n ss58Prefix: 0, // Polkadot\n isTestnet: false,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n name: \"Kusama Asset Hub\",\n caip2: KUSAMA_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_KUSAMA_RPC,\n indexerUrl: DEFAULT_KUSAMA_INDEXER,\n genesisHash: \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\",\n ss58Prefix: 2, // Kusama\n isTestnet: false,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n name: \"Westend Asset Hub\",\n caip2: WESTEND_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_WESTEND_RPC,\n indexerUrl: DEFAULT_WESTEND_INDEXER,\n genesisHash: \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n ss58Prefix: 42, // Generic Substrate\n isTestnet: true,\n },\n};\n\n/**\n * Get network configuration by CAIP-2 identifier\n */\nexport function getNetworkConfig(network: string): PolkadotNetworkConfig | undefined {\n return POLKADOT_NETWORKS[network];\n}\n\n/**\n * Check if a network identifier is a Polkadot network\n */\nexport function isPolkadotNetwork(network: string): boolean {\n return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);\n}\n","/**\n * Polkadot Asset Hub Token Registry\n *\n * On Polkadot Asset Hub, tokens are identified by Asset IDs.\n * USDT is Asset ID 1984, created by Tether.\n */\n\nimport {\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Polkadot Asset Hub\n */\nexport interface TokenConfig {\n /** Asset ID on Asset Hub */\n readonly assetId: number;\n /** Token symbol */\n readonly symbol: string;\n /** Token name */\n readonly name: string;\n /** Decimal places */\n readonly decimals: number;\n /** Issuer (creator of the asset) */\n readonly issuer?: string;\n}\n\n/**\n * USDT on Polkadot Asset Hub\n * Asset ID: 1984\n * Decimals: 6\n */\nexport const USDT_POLKADOT: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * USDT on Kusama Asset Hub\n * Asset ID: 1984 (same as Polkadot)\n */\nexport const USDT_KUSAMA: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * Test USDT on Westend Asset Hub (testnet)\n */\nexport const USDT_WESTEND: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Test Tether USD\",\n decimals: 6,\n};\n\n/**\n * Network-specific token registries\n */\nexport const TOKEN_REGISTRY: Record<string, Record<string, TokenConfig>> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n USDT: USDT_POLKADOT,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n USDT: USDT_KUSAMA,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n USDT: USDT_WESTEND,\n },\n};\n\n/**\n * Default tokens per network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,\n [KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,\n [WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND,\n};\n\n/**\n * Get token configuration by network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string = \"USDT\",\n): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol];\n}\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n\n/**\n * Get asset ID for a token on a network\n */\nexport function getAssetId(network: string, symbol: string = \"USDT\"): number | undefined {\n return getTokenConfig(network, symbol)?.assetId;\n}\n","/**\n * Polkadot Asset Hub Utility Functions\n */\n\nimport type { PolkadotExtrinsicResult, ParsedAssetTransfer } from \"./types.js\";\n\n/**\n * Validate a Polkadot SS58 address format\n * SS58 addresses are base58-encoded with a checksum\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== \"string\") {\n return false;\n }\n\n // SS58 addresses typically start with 1 (Polkadot), or have other prefixes\n // Length is typically 47-48 characters for Polkadot addresses\n // For a simple validation, check base58 characters and length\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]{45,50}$/;\n return base58Regex.test(address);\n}\n\n/**\n * Validate an extrinsic hash format\n * Extrinsic hashes are 32-byte hex strings prefixed with 0x\n */\nexport function isValidExtrinsicHash(hash: string): boolean {\n if (!hash || typeof hash !== \"string\") {\n return false;\n }\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Validate a block hash format\n */\nexport function isValidBlockHash(hash: string): boolean {\n return isValidExtrinsicHash(hash); // Same format\n}\n\n/**\n * Compare two SS58 addresses (case-sensitive)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n return addr1 === addr2;\n}\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: string, decimals: number): string {\n const amountBigInt = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n\n if (fractionalPart === 0n) {\n return wholePart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\");\n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse an amount string to the smallest unit (with decimals applied)\n */\nexport function parseAmount(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const wholePart = parts[0] || \"0\";\n const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + fractionalPart).toString();\n}\n\n/**\n * Extract asset transfer details from an extrinsic result\n */\nexport function extractAssetTransfer(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Check if this is an assets.transfer or assets.transferKeepAlive call\n if (result.module !== \"assets\") {\n return null;\n }\n\n if (result.call !== \"transfer\" && result.call !== \"transferKeepAlive\") {\n return null;\n }\n\n // Extract transfer details from args\n const assetId = result.args.id as number | undefined;\n const to = result.args.target as string | undefined;\n const amount = result.args.amount as string | undefined;\n\n if (assetId === undefined || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from: result.signer,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Extract asset transfer from events (alternative method)\n */\nexport function extractAssetTransferFromEvents(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Look for assets.Transferred event\n const transferEvent = result.events.find(\n (e) => e.module === \"assets\" && e.name === \"Transferred\",\n );\n\n if (!transferEvent) {\n return null;\n }\n\n const assetId = transferEvent.data.assetId as number | undefined;\n const from = transferEvent.data.from as string | undefined;\n const to = transferEvent.data.to as string | undefined;\n const amount = transferEvent.data.amount as string | undefined;\n\n if (assetId === undefined || !from || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Build a unique extrinsic identifier from block hash and index\n */\nexport function buildExtrinsicId(blockHash: string, extrinsicIndex: number): string {\n return `${blockHash}-${extrinsicIndex}`;\n}\n\n/**\n * Parse an extrinsic identifier back to components\n */\nexport function parseExtrinsicId(\n extrinsicId: string,\n): { blockHash: string; extrinsicIndex: number } | null {\n const lastDashIndex = extrinsicId.lastIndexOf(\"-\");\n if (lastDashIndex === -1) {\n return null;\n }\n\n const blockHash = extrinsicId.slice(0, lastDashIndex);\n const extrinsicIndex = parseInt(extrinsicId.slice(lastDashIndex + 1), 10);\n\n if (!isValidBlockHash(blockHash) || isNaN(extrinsicIndex)) {\n return null;\n }\n\n return { blockHash, extrinsicIndex };\n}\n","/**\n * Polkadot Exact-Direct Client Scheme\n *\n * In the exact-direct scheme, the client executes the asset transfer directly\n * and provides the extrinsic hash as proof of payment.\n */\n\nimport type {\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkClient,\n} from \"@t402/core/types\";\nimport type { ClientPolkadotSigner, ExactDirectPolkadotPayload } from \"../../types.js\";\nimport { SCHEME_EXACT_DIRECT, POLKADOT_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport { getAssetId } from \"../../tokens.js\";\nimport { isValidAddress } from \"../../utils.js\";\n\n/**\n * Configuration for the exact-direct client\n */\nexport interface ExactDirectPolkadotClientConfig {\n /** Signer for executing transactions */\n signer: ClientPolkadotSigner;\n}\n\n/**\n * Exact-direct client scheme for Polkadot Asset Hub\n */\nexport class ExactDirectPolkadotClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private readonly signer: ClientPolkadotSigner;\n\n constructor(config: ExactDirectPolkadotClientConfig) {\n this.signer = config.signer;\n }\n\n /**\n * Create a payment payload by executing the transfer\n */\n async createPaymentPayload(\n t402Version: number,\n requirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate requirements\n this.validateRequirements(requirements);\n\n const { network, amount, payTo, extra } = requirements;\n\n // Get asset ID from extra or use default USDT\n const symbol = (extra?.assetSymbol as string) || \"USDT\";\n const assetId = (extra?.assetId as number) ?? getAssetId(network, symbol);\n\n if (assetId === undefined) {\n throw new Error(`Unknown asset ${symbol} on network ${network}`);\n }\n\n // Get sender address\n const from = await this.signer.getAddress();\n\n // Execute the transfer\n const { extrinsicHash, blockHash, extrinsicIndex } =\n await this.signer.transferAsset(assetId, payTo, amount);\n\n // Build the payload\n const polkadotPayload: ExactDirectPolkadotPayload = {\n extrinsicHash,\n blockHash,\n extrinsicIndex,\n from,\n to: payTo,\n amount,\n assetId,\n };\n\n return {\n t402Version,\n payload: polkadotPayload,\n };\n }\n\n /**\n * Validate payment requirements\n */\n private validateRequirements(requirements: PaymentRequirements): void {\n // Check scheme\n if (requirements.scheme !== SCHEME_EXACT_DIRECT) {\n throw new Error(\n `Invalid scheme: expected ${SCHEME_EXACT_DIRECT}, got ${requirements.scheme}`,\n );\n }\n\n // Check network\n if (!requirements.network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`)) {\n throw new Error(`Invalid network: ${requirements.network}`);\n }\n\n // Check payTo address\n if (!isValidAddress(requirements.payTo)) {\n throw new Error(`Invalid payTo address: ${requirements.payTo}`);\n }\n\n // Check amount\n const amount = BigInt(requirements.amount);\n if (amount <= 0n) {\n throw new Error(`Invalid amount: ${requirements.amount}`);\n }\n }\n}\n\n/**\n * Create an exact-direct client for Polkadot\n */\nexport function createExactDirectPolkadotClient(\n config: ExactDirectPolkadotClientConfig,\n): ExactDirectPolkadotClient {\n return new ExactDirectPolkadotClient(config);\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { SchemeNetworkFacilitator, Network, PaymentPayload, PaymentRequirements, VerifyResponse, SettleResponse } from '@t402/core/types';
2
- import { F as FacilitatorPolkadotSigner, d as PolkadotFacilitatorConfig } from '../../types-Dbjfcz2Y.js';
2
+ import { F as FacilitatorPolkadotSigner, c as PolkadotFacilitatorConfig } from '../../types-Bb84eJ4_.js';
3
3
 
4
4
  /**
5
5
  * Polkadot Exact-Direct Facilitator Scheme
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/exact-direct/facilitator/index.ts
21
23
  var facilitator_exports = {};
@@ -184,12 +186,12 @@ function buildExtrinsicId(blockHash, extrinsicIndex) {
184
186
  var DEFAULT_MAX_EXTRINSIC_AGE = 3600;
185
187
  var DEFAULT_CACHE_DURATION = 24 * 60 * 60 * 1e3;
186
188
  var ExactDirectPolkadotFacilitator = class {
187
- scheme = SCHEME_EXACT_DIRECT;
188
- caipFamily = `${POLKADOT_CAIP2_NAMESPACE}:*`;
189
- signer;
190
- config;
191
- usedExtrinsics = /* @__PURE__ */ new Map();
192
189
  constructor(signer, config = {}) {
190
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
191
+ __publicField(this, "caipFamily", `${POLKADOT_CAIP2_NAMESPACE}:*`);
192
+ __publicField(this, "signer");
193
+ __publicField(this, "config");
194
+ __publicField(this, "usedExtrinsics", /* @__PURE__ */ new Map());
193
195
  this.signer = signer;
194
196
  this.config = {
195
197
  maxExtrinsicAge: config.maxExtrinsicAge ?? DEFAULT_MAX_EXTRINSIC_AGE,
@@ -391,4 +393,4 @@ function createExactDirectPolkadotFacilitator(signer, config = {}) {
391
393
  ExactDirectPolkadotFacilitator,
392
394
  createExactDirectPolkadotFacilitator
393
395
  });
394
- //# sourceMappingURL=index.cjs.map
396
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/facilitator/index.ts","../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/exact-direct/facilitator/scheme.ts"],"sourcesContent":["export {\n ExactDirectPolkadotFacilitator,\n createExactDirectPolkadotFacilitator,\n} from \"./scheme.js\";\n","/**\n * Polkadot Asset Hub T402 Constants\n *\n * Polkadot Asset Hub (formerly Statemint) is a common-good parachain\n * that hosts assets like USDT on the Polkadot network.\n */\n\n// CAIP-2 namespace for Polkadot\nexport const POLKADOT_CAIP2_NAMESPACE = \"polkadot\";\n\n// CAIP-2 network identifiers (first 32 chars of genesis hash)\n// Polkadot Asset Hub (Parachain ID: 1000)\nexport const POLKADOT_ASSET_HUB_CAIP2 = \"polkadot:68d56f15f85d3136970ec16946040bc1\";\n\n// Kusama Asset Hub (Parachain ID: 1000 on Kusama)\nexport const KUSAMA_ASSET_HUB_CAIP2 = \"polkadot:48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\";\n\n// Westend Asset Hub (Testnet)\nexport const WESTEND_ASSET_HUB_CAIP2 = \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Default indexers (Subscan API)\nexport const DEFAULT_POLKADOT_INDEXER = \"https://assethub-polkadot.api.subscan.io\";\nexport const DEFAULT_KUSAMA_INDEXER = \"https://assethub-kusama.api.subscan.io\";\nexport const DEFAULT_WESTEND_INDEXER = \"https://assethub-westend.api.subscan.io\";\n\n// Default RPC endpoints\nexport const DEFAULT_POLKADOT_RPC = \"wss://polkadot-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_KUSAMA_RPC = \"wss://kusama-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_WESTEND_RPC = \"wss://westend-asset-hub-rpc.polkadot.io\";\n\n// Network configurations\nexport interface PolkadotNetworkConfig {\n readonly name: string;\n readonly caip2: string;\n readonly rpcUrl: string;\n readonly indexerUrl: string;\n readonly genesisHash: string;\n readonly ss58Prefix: number;\n readonly isTestnet: boolean;\n}\n\nexport const POLKADOT_NETWORKS: Record<string, PolkadotNetworkConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n name: \"Polkadot Asset Hub\",\n caip2: POLKADOT_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_POLKADOT_RPC,\n indexerUrl: DEFAULT_POLKADOT_INDEXER,\n genesisHash: \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\",\n ss58Prefix: 0, // Polkadot\n isTestnet: false,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n name: \"Kusama Asset Hub\",\n caip2: KUSAMA_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_KUSAMA_RPC,\n indexerUrl: DEFAULT_KUSAMA_INDEXER,\n genesisHash: \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\",\n ss58Prefix: 2, // Kusama\n isTestnet: false,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n name: \"Westend Asset Hub\",\n caip2: WESTEND_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_WESTEND_RPC,\n indexerUrl: DEFAULT_WESTEND_INDEXER,\n genesisHash: \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n ss58Prefix: 42, // Generic Substrate\n isTestnet: true,\n },\n};\n\n/**\n * Get network configuration by CAIP-2 identifier\n */\nexport function getNetworkConfig(network: string): PolkadotNetworkConfig | undefined {\n return POLKADOT_NETWORKS[network];\n}\n\n/**\n * Check if a network identifier is a Polkadot network\n */\nexport function isPolkadotNetwork(network: string): boolean {\n return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);\n}\n","/**\n * Polkadot Asset Hub Token Registry\n *\n * On Polkadot Asset Hub, tokens are identified by Asset IDs.\n * USDT is Asset ID 1984, created by Tether.\n */\n\nimport {\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Polkadot Asset Hub\n */\nexport interface TokenConfig {\n /** Asset ID on Asset Hub */\n readonly assetId: number;\n /** Token symbol */\n readonly symbol: string;\n /** Token name */\n readonly name: string;\n /** Decimal places */\n readonly decimals: number;\n /** Issuer (creator of the asset) */\n readonly issuer?: string;\n}\n\n/**\n * USDT on Polkadot Asset Hub\n * Asset ID: 1984\n * Decimals: 6\n */\nexport const USDT_POLKADOT: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * USDT on Kusama Asset Hub\n * Asset ID: 1984 (same as Polkadot)\n */\nexport const USDT_KUSAMA: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * Test USDT on Westend Asset Hub (testnet)\n */\nexport const USDT_WESTEND: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Test Tether USD\",\n decimals: 6,\n};\n\n/**\n * Network-specific token registries\n */\nexport const TOKEN_REGISTRY: Record<string, Record<string, TokenConfig>> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n USDT: USDT_POLKADOT,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n USDT: USDT_KUSAMA,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n USDT: USDT_WESTEND,\n },\n};\n\n/**\n * Default tokens per network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,\n [KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,\n [WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND,\n};\n\n/**\n * Get token configuration by network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string = \"USDT\",\n): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol];\n}\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n\n/**\n * Get asset ID for a token on a network\n */\nexport function getAssetId(network: string, symbol: string = \"USDT\"): number | undefined {\n return getTokenConfig(network, symbol)?.assetId;\n}\n","/**\n * Polkadot Asset Hub Utility Functions\n */\n\nimport type { PolkadotExtrinsicResult, ParsedAssetTransfer } from \"./types.js\";\n\n/**\n * Validate a Polkadot SS58 address format\n * SS58 addresses are base58-encoded with a checksum\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== \"string\") {\n return false;\n }\n\n // SS58 addresses typically start with 1 (Polkadot), or have other prefixes\n // Length is typically 47-48 characters for Polkadot addresses\n // For a simple validation, check base58 characters and length\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]{45,50}$/;\n return base58Regex.test(address);\n}\n\n/**\n * Validate an extrinsic hash format\n * Extrinsic hashes are 32-byte hex strings prefixed with 0x\n */\nexport function isValidExtrinsicHash(hash: string): boolean {\n if (!hash || typeof hash !== \"string\") {\n return false;\n }\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Validate a block hash format\n */\nexport function isValidBlockHash(hash: string): boolean {\n return isValidExtrinsicHash(hash); // Same format\n}\n\n/**\n * Compare two SS58 addresses (case-sensitive)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n return addr1 === addr2;\n}\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: string, decimals: number): string {\n const amountBigInt = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n\n if (fractionalPart === 0n) {\n return wholePart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\");\n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse an amount string to the smallest unit (with decimals applied)\n */\nexport function parseAmount(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const wholePart = parts[0] || \"0\";\n const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + fractionalPart).toString();\n}\n\n/**\n * Extract asset transfer details from an extrinsic result\n */\nexport function extractAssetTransfer(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Check if this is an assets.transfer or assets.transferKeepAlive call\n if (result.module !== \"assets\") {\n return null;\n }\n\n if (result.call !== \"transfer\" && result.call !== \"transferKeepAlive\") {\n return null;\n }\n\n // Extract transfer details from args\n const assetId = result.args.id as number | undefined;\n const to = result.args.target as string | undefined;\n const amount = result.args.amount as string | undefined;\n\n if (assetId === undefined || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from: result.signer,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Extract asset transfer from events (alternative method)\n */\nexport function extractAssetTransferFromEvents(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Look for assets.Transferred event\n const transferEvent = result.events.find(\n (e) => e.module === \"assets\" && e.name === \"Transferred\",\n );\n\n if (!transferEvent) {\n return null;\n }\n\n const assetId = transferEvent.data.assetId as number | undefined;\n const from = transferEvent.data.from as string | undefined;\n const to = transferEvent.data.to as string | undefined;\n const amount = transferEvent.data.amount as string | undefined;\n\n if (assetId === undefined || !from || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Build a unique extrinsic identifier from block hash and index\n */\nexport function buildExtrinsicId(blockHash: string, extrinsicIndex: number): string {\n return `${blockHash}-${extrinsicIndex}`;\n}\n\n/**\n * Parse an extrinsic identifier back to components\n */\nexport function parseExtrinsicId(\n extrinsicId: string,\n): { blockHash: string; extrinsicIndex: number } | null {\n const lastDashIndex = extrinsicId.lastIndexOf(\"-\");\n if (lastDashIndex === -1) {\n return null;\n }\n\n const blockHash = extrinsicId.slice(0, lastDashIndex);\n const extrinsicIndex = parseInt(extrinsicId.slice(lastDashIndex + 1), 10);\n\n if (!isValidBlockHash(blockHash) || isNaN(extrinsicIndex)) {\n return null;\n }\n\n return { blockHash, extrinsicIndex };\n}\n","/**\n * Polkadot Exact-Direct Facilitator Scheme\n *\n * Verifies that a Polkadot asset transfer was executed correctly\n * by querying the Subscan indexer.\n */\n\nimport type {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport { POLKADOT_CAIP2_NAMESPACE, SCHEME_EXACT_DIRECT, getNetworkConfig } from \"../../constants.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\nimport type {\n ExactDirectPolkadotPayload,\n FacilitatorPolkadotSigner,\n PolkadotFacilitatorConfig,\n} from \"../../types.js\";\nimport {\n buildExtrinsicId,\n compareAddresses,\n extractAssetTransfer,\n extractAssetTransferFromEvents,\n isValidBlockHash,\n isValidExtrinsicHash,\n} from \"../../utils.js\";\n\n// Default configuration\nconst DEFAULT_MAX_EXTRINSIC_AGE = 3600; // 1 hour\nconst DEFAULT_CACHE_DURATION = 24 * 60 * 60 * 1000; // 24 hours in ms\n\n/**\n * Exact-direct facilitator scheme for Polkadot Asset Hub\n */\nexport class ExactDirectPolkadotFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${POLKADOT_CAIP2_NAMESPACE}:*`;\n\n private readonly signer: FacilitatorPolkadotSigner;\n private readonly config: Required<PolkadotFacilitatorConfig>;\n private readonly usedExtrinsics = new Map<string, number>();\n\n constructor(\n signer: FacilitatorPolkadotSigner,\n config: PolkadotFacilitatorConfig = {},\n ) {\n this.signer = signer;\n this.config = {\n maxExtrinsicAge: config.maxExtrinsicAge ?? DEFAULT_MAX_EXTRINSIC_AGE,\n usedExtrinsicCacheDuration:\n config.usedExtrinsicCacheDuration ?? DEFAULT_CACHE_DURATION,\n };\n\n // Start cleanup interval\n this.startCleanupInterval();\n }\n\n /**\n * Get extra data for payment requirements\n */\n getExtra(network: Network): Record<string, unknown> | undefined {\n const config = getNetworkConfig(network);\n if (!config) return undefined;\n\n const token = getDefaultToken(network);\n return {\n assetId: token?.assetId,\n assetSymbol: token?.symbol,\n assetDecimals: token?.decimals,\n networkName: config.name,\n };\n }\n\n /**\n * Get facilitator signer addresses for a network\n */\n getSigners(network: Network): string[] {\n return this.signer.getAddresses(network);\n }\n\n /**\n * Verify a payment payload\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const network = requirements.network;\n\n // Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT_DIRECT) {\n return {\n isValid: false,\n invalidReason: `invalid_scheme: expected ${SCHEME_EXACT_DIRECT}, got ${payload.accepted.scheme}`,\n };\n }\n\n // Validate network\n if (payload.accepted.network !== network) {\n return {\n isValid: false,\n invalidReason: `network_mismatch: expected ${network}, got ${payload.accepted.network}`,\n };\n }\n\n // Parse payload\n const polkadotPayload = payload.payload as unknown as ExactDirectPolkadotPayload;\n\n // Validate required fields\n if (!polkadotPayload.extrinsicHash && !polkadotPayload.blockHash) {\n return {\n isValid: false,\n invalidReason: \"missing_extrinsic_identifier: need extrinsicHash or blockHash\",\n };\n }\n\n // Validate extrinsic hash format if provided\n if (polkadotPayload.extrinsicHash && !isValidExtrinsicHash(polkadotPayload.extrinsicHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_extrinsic_hash_format\",\n };\n }\n\n // Validate block hash format if provided\n if (polkadotPayload.blockHash && !isValidBlockHash(polkadotPayload.blockHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_block_hash_format\",\n };\n }\n\n if (!polkadotPayload.from) {\n return {\n isValid: false,\n invalidReason: \"missing_from_address\",\n };\n }\n\n // Build unique identifier for replay protection\n const extrinsicId = polkadotPayload.extrinsicHash ||\n buildExtrinsicId(polkadotPayload.blockHash, polkadotPayload.extrinsicIndex);\n\n // Check for replay attack\n if (this.isExtrinsicUsed(extrinsicId)) {\n return {\n isValid: false,\n invalidReason: \"extrinsic_already_used\",\n payer: polkadotPayload.from,\n };\n }\n\n // Query extrinsic\n const extrinsicResult = await this.signer.queryExtrinsic(\n polkadotPayload.extrinsicHash,\n polkadotPayload.blockHash,\n polkadotPayload.extrinsicIndex,\n );\n\n if (!extrinsicResult) {\n return {\n isValid: false,\n invalidReason: \"extrinsic_not_found\",\n payer: polkadotPayload.from,\n };\n }\n\n // Verify extrinsic was successful\n if (!extrinsicResult.success) {\n return {\n isValid: false,\n invalidReason: \"extrinsic_failed\",\n payer: polkadotPayload.from,\n };\n }\n\n // Check extrinsic age\n if (this.config.maxExtrinsicAge > 0) {\n const extrinsicTime = new Date(extrinsicResult.timestamp).getTime();\n const age = (Date.now() - extrinsicTime) / 1000;\n if (age > this.config.maxExtrinsicAge) {\n return {\n isValid: false,\n invalidReason: `extrinsic_too_old: ${Math.round(age)} seconds`,\n payer: polkadotPayload.from,\n };\n }\n }\n\n // Extract transfer details\n const transfer =\n extractAssetTransfer(extrinsicResult) ||\n extractAssetTransferFromEvents(extrinsicResult);\n\n if (!transfer) {\n return {\n isValid: false,\n invalidReason: \"not_asset_transfer\",\n payer: polkadotPayload.from,\n };\n }\n\n // Verify asset ID\n const expectedAssetId = (requirements.extra?.assetId as number) ?? polkadotPayload.assetId;\n if (transfer.assetId !== expectedAssetId) {\n return {\n isValid: false,\n invalidReason: `asset_mismatch: expected ${expectedAssetId}, got ${transfer.assetId}`,\n payer: polkadotPayload.from,\n };\n }\n\n // Verify recipient\n if (!compareAddresses(transfer.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: `recipient_mismatch: expected ${requirements.payTo}, got ${transfer.to}`,\n payer: polkadotPayload.from,\n };\n }\n\n // Verify amount\n const txAmount = BigInt(transfer.amount);\n const requiredAmount = BigInt(requirements.amount);\n if (txAmount < requiredAmount) {\n return {\n isValid: false,\n invalidReason: `insufficient_amount: expected ${requirements.amount}, got ${transfer.amount}`,\n payer: polkadotPayload.from,\n };\n }\n\n // Mark extrinsic as used\n this.markExtrinsicUsed(extrinsicId);\n\n return {\n isValid: true,\n payer: polkadotPayload.from,\n };\n }\n\n /**\n * Settle a payment (for exact-direct, the transfer is already complete)\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n // Verify first\n const verifyResult = await this.verify(payload, requirements);\n\n if (!verifyResult.isValid) {\n return {\n success: false,\n errorReason: verifyResult.invalidReason || \"verification_failed\",\n payer: verifyResult.payer,\n transaction: \"\",\n network: requirements.network,\n };\n }\n\n const polkadotPayload = payload.payload as unknown as ExactDirectPolkadotPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: polkadotPayload.extrinsicHash ||\n buildExtrinsicId(polkadotPayload.blockHash, polkadotPayload.extrinsicIndex),\n network: requirements.network,\n payer: verifyResult.payer,\n };\n }\n\n /**\n * Check if an extrinsic has been used\n */\n private isExtrinsicUsed(extrinsicId: string): boolean {\n return this.usedExtrinsics.has(extrinsicId);\n }\n\n /**\n * Mark an extrinsic as used\n */\n private markExtrinsicUsed(extrinsicId: string): void {\n this.usedExtrinsics.set(extrinsicId, Date.now());\n }\n\n /**\n * Start the cleanup interval for used extrinsics cache\n */\n private startCleanupInterval(): void {\n setInterval(() => {\n const cutoff = Date.now() - this.config.usedExtrinsicCacheDuration;\n for (const [extrinsicId, timestamp] of this.usedExtrinsics) {\n if (timestamp < cutoff) {\n this.usedExtrinsics.delete(extrinsicId);\n }\n }\n }, 60 * 60 * 1000); // Run every hour\n }\n}\n\n/**\n * Create an exact-direct facilitator for Polkadot\n */\nexport function createExactDirectPolkadotFacilitator(\n signer: FacilitatorPolkadotSigner,\n config: PolkadotFacilitatorConfig = {},\n): ExactDirectPolkadotFacilitator {\n return new ExactDirectPolkadotFacilitator(signer, config);\n}\n"],"mappings":"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","names":[]}
@@ -3,6 +3,7 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
7
  var __export = (target, all) => {
7
8
  for (var name in all)
8
9
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -16,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
16
17
  return to;
17
18
  };
18
19
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
19
21
 
20
22
  // src/exact-direct/server/index.ts
21
23
  var server_exports = {};
@@ -128,10 +130,10 @@ function parseAmount(amount, decimals) {
128
130
 
129
131
  // src/exact-direct/server/scheme.ts
130
132
  var ExactDirectPolkadotServer = class {
131
- scheme = SCHEME_EXACT_DIRECT;
132
- moneyParsers = [];
133
- config;
134
133
  constructor(config = {}) {
134
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
135
+ __publicField(this, "moneyParsers", []);
136
+ __publicField(this, "config");
135
137
  this.config = config;
136
138
  }
137
139
  /**
@@ -274,4 +276,4 @@ function registerExactDirectPolkadotServer(server, config = {}) {
274
276
  createExactDirectPolkadotServer,
275
277
  registerExactDirectPolkadotServer
276
278
  });
277
- //# sourceMappingURL=index.cjs.map
279
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/server/index.ts","../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/exact-direct/server/scheme.ts","../../../../src/exact-direct/server/register.ts"],"sourcesContent":["export {\n ExactDirectPolkadotServer,\n createExactDirectPolkadotServer,\n} from \"./scheme.js\";\n\nexport {\n registerExactDirectPolkadotServer,\n type PolkadotServerRegistrationConfig,\n} from \"./register.js\";\n","/**\n * Polkadot Asset Hub T402 Constants\n *\n * Polkadot Asset Hub (formerly Statemint) is a common-good parachain\n * that hosts assets like USDT on the Polkadot network.\n */\n\n// CAIP-2 namespace for Polkadot\nexport const POLKADOT_CAIP2_NAMESPACE = \"polkadot\";\n\n// CAIP-2 network identifiers (first 32 chars of genesis hash)\n// Polkadot Asset Hub (Parachain ID: 1000)\nexport const POLKADOT_ASSET_HUB_CAIP2 = \"polkadot:68d56f15f85d3136970ec16946040bc1\";\n\n// Kusama Asset Hub (Parachain ID: 1000 on Kusama)\nexport const KUSAMA_ASSET_HUB_CAIP2 = \"polkadot:48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\";\n\n// Westend Asset Hub (Testnet)\nexport const WESTEND_ASSET_HUB_CAIP2 = \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Default indexers (Subscan API)\nexport const DEFAULT_POLKADOT_INDEXER = \"https://assethub-polkadot.api.subscan.io\";\nexport const DEFAULT_KUSAMA_INDEXER = \"https://assethub-kusama.api.subscan.io\";\nexport const DEFAULT_WESTEND_INDEXER = \"https://assethub-westend.api.subscan.io\";\n\n// Default RPC endpoints\nexport const DEFAULT_POLKADOT_RPC = \"wss://polkadot-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_KUSAMA_RPC = \"wss://kusama-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_WESTEND_RPC = \"wss://westend-asset-hub-rpc.polkadot.io\";\n\n// Network configurations\nexport interface PolkadotNetworkConfig {\n readonly name: string;\n readonly caip2: string;\n readonly rpcUrl: string;\n readonly indexerUrl: string;\n readonly genesisHash: string;\n readonly ss58Prefix: number;\n readonly isTestnet: boolean;\n}\n\nexport const POLKADOT_NETWORKS: Record<string, PolkadotNetworkConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n name: \"Polkadot Asset Hub\",\n caip2: POLKADOT_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_POLKADOT_RPC,\n indexerUrl: DEFAULT_POLKADOT_INDEXER,\n genesisHash: \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\",\n ss58Prefix: 0, // Polkadot\n isTestnet: false,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n name: \"Kusama Asset Hub\",\n caip2: KUSAMA_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_KUSAMA_RPC,\n indexerUrl: DEFAULT_KUSAMA_INDEXER,\n genesisHash: \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\",\n ss58Prefix: 2, // Kusama\n isTestnet: false,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n name: \"Westend Asset Hub\",\n caip2: WESTEND_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_WESTEND_RPC,\n indexerUrl: DEFAULT_WESTEND_INDEXER,\n genesisHash: \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n ss58Prefix: 42, // Generic Substrate\n isTestnet: true,\n },\n};\n\n/**\n * Get network configuration by CAIP-2 identifier\n */\nexport function getNetworkConfig(network: string): PolkadotNetworkConfig | undefined {\n return POLKADOT_NETWORKS[network];\n}\n\n/**\n * Check if a network identifier is a Polkadot network\n */\nexport function isPolkadotNetwork(network: string): boolean {\n return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);\n}\n","/**\n * Polkadot Asset Hub Token Registry\n *\n * On Polkadot Asset Hub, tokens are identified by Asset IDs.\n * USDT is Asset ID 1984, created by Tether.\n */\n\nimport {\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Polkadot Asset Hub\n */\nexport interface TokenConfig {\n /** Asset ID on Asset Hub */\n readonly assetId: number;\n /** Token symbol */\n readonly symbol: string;\n /** Token name */\n readonly name: string;\n /** Decimal places */\n readonly decimals: number;\n /** Issuer (creator of the asset) */\n readonly issuer?: string;\n}\n\n/**\n * USDT on Polkadot Asset Hub\n * Asset ID: 1984\n * Decimals: 6\n */\nexport const USDT_POLKADOT: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * USDT on Kusama Asset Hub\n * Asset ID: 1984 (same as Polkadot)\n */\nexport const USDT_KUSAMA: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * Test USDT on Westend Asset Hub (testnet)\n */\nexport const USDT_WESTEND: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Test Tether USD\",\n decimals: 6,\n};\n\n/**\n * Network-specific token registries\n */\nexport const TOKEN_REGISTRY: Record<string, Record<string, TokenConfig>> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n USDT: USDT_POLKADOT,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n USDT: USDT_KUSAMA,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n USDT: USDT_WESTEND,\n },\n};\n\n/**\n * Default tokens per network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,\n [KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,\n [WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND,\n};\n\n/**\n * Get token configuration by network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string = \"USDT\",\n): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol];\n}\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n\n/**\n * Get asset ID for a token on a network\n */\nexport function getAssetId(network: string, symbol: string = \"USDT\"): number | undefined {\n return getTokenConfig(network, symbol)?.assetId;\n}\n","/**\n * Polkadot Asset Hub Utility Functions\n */\n\nimport type { PolkadotExtrinsicResult, ParsedAssetTransfer } from \"./types.js\";\n\n/**\n * Validate a Polkadot SS58 address format\n * SS58 addresses are base58-encoded with a checksum\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== \"string\") {\n return false;\n }\n\n // SS58 addresses typically start with 1 (Polkadot), or have other prefixes\n // Length is typically 47-48 characters for Polkadot addresses\n // For a simple validation, check base58 characters and length\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]{45,50}$/;\n return base58Regex.test(address);\n}\n\n/**\n * Validate an extrinsic hash format\n * Extrinsic hashes are 32-byte hex strings prefixed with 0x\n */\nexport function isValidExtrinsicHash(hash: string): boolean {\n if (!hash || typeof hash !== \"string\") {\n return false;\n }\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Validate a block hash format\n */\nexport function isValidBlockHash(hash: string): boolean {\n return isValidExtrinsicHash(hash); // Same format\n}\n\n/**\n * Compare two SS58 addresses (case-sensitive)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n return addr1 === addr2;\n}\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: string, decimals: number): string {\n const amountBigInt = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n\n if (fractionalPart === 0n) {\n return wholePart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\");\n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse an amount string to the smallest unit (with decimals applied)\n */\nexport function parseAmount(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const wholePart = parts[0] || \"0\";\n const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + fractionalPart).toString();\n}\n\n/**\n * Extract asset transfer details from an extrinsic result\n */\nexport function extractAssetTransfer(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Check if this is an assets.transfer or assets.transferKeepAlive call\n if (result.module !== \"assets\") {\n return null;\n }\n\n if (result.call !== \"transfer\" && result.call !== \"transferKeepAlive\") {\n return null;\n }\n\n // Extract transfer details from args\n const assetId = result.args.id as number | undefined;\n const to = result.args.target as string | undefined;\n const amount = result.args.amount as string | undefined;\n\n if (assetId === undefined || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from: result.signer,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Extract asset transfer from events (alternative method)\n */\nexport function extractAssetTransferFromEvents(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Look for assets.Transferred event\n const transferEvent = result.events.find(\n (e) => e.module === \"assets\" && e.name === \"Transferred\",\n );\n\n if (!transferEvent) {\n return null;\n }\n\n const assetId = transferEvent.data.assetId as number | undefined;\n const from = transferEvent.data.from as string | undefined;\n const to = transferEvent.data.to as string | undefined;\n const amount = transferEvent.data.amount as string | undefined;\n\n if (assetId === undefined || !from || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Build a unique extrinsic identifier from block hash and index\n */\nexport function buildExtrinsicId(blockHash: string, extrinsicIndex: number): string {\n return `${blockHash}-${extrinsicIndex}`;\n}\n\n/**\n * Parse an extrinsic identifier back to components\n */\nexport function parseExtrinsicId(\n extrinsicId: string,\n): { blockHash: string; extrinsicIndex: number } | null {\n const lastDashIndex = extrinsicId.lastIndexOf(\"-\");\n if (lastDashIndex === -1) {\n return null;\n }\n\n const blockHash = extrinsicId.slice(0, lastDashIndex);\n const extrinsicIndex = parseInt(extrinsicId.slice(lastDashIndex + 1), 10);\n\n if (!isValidBlockHash(blockHash) || isNaN(extrinsicIndex)) {\n return null;\n }\n\n return { blockHash, extrinsicIndex };\n}\n","/**\n * Polkadot Exact-Direct Server Scheme\n *\n * Handles price parsing and payment requirement enhancement for\n * Polkadot Asset Hub payments using the exact-direct scheme.\n */\n\nimport type {\n SchemeNetworkServer,\n PaymentRequirements,\n Price,\n AssetAmount,\n Network,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, isPolkadotNetwork } from \"../../constants.js\";\nimport { getDefaultToken, getTokenConfig, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport { parseAmount } from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectPolkadotServer\n */\nexport interface ExactDirectPolkadotServerConfig {\n /** Preferred token symbol (e.g., \"USDT\"). Defaults to network's default token. */\n preferredToken?: string;\n}\n\n/**\n * Polkadot Exact-Direct Server\n *\n * Implements the server-side price parsing and payment requirements enhancement.\n */\nexport class ExactDirectPolkadotServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectPolkadotServerConfig;\n\n constructor(config: ExactDirectPolkadotServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectPolkadotServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse price into Polkadot-specific amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Validate network\n if (!isPolkadotNetwork(network)) {\n throw new Error(`Invalid Polkadot network: ${network}`);\n }\n\n // If already an AssetAmount, return it directly\n if (typeof price === \"object\" && price !== null && \"amount\" in price) {\n if (!price.asset) {\n throw new Error(`Asset must be specified for AssetAmount on network ${network}`);\n }\n return {\n amount: price.amount,\n asset: price.asset,\n extra: price.extra || {},\n };\n }\n\n // Parse Money to decimal number\n const amount = this.parseMoneyToDecimal(price);\n\n // Try each custom money parser in order\n for (const parser of this.moneyParsers) {\n const result = await parser(amount, network);\n if (result !== null) {\n return result;\n }\n }\n\n // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, network);\n }\n\n /**\n * Enhance payment requirements with Polkadot-specific details\n */\n async enhancePaymentRequirements(\n paymentRequirements: PaymentRequirements,\n supportedKind: {\n t402Version: number;\n scheme: string;\n network: Network;\n extra?: Record<string, unknown>;\n },\n facilitatorExtensions: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters\n void facilitatorExtensions;\n\n // Start with existing extra fields\n const extra = { ...paymentRequirements.extra };\n\n // Add any facilitator-provided extra fields\n if (supportedKind.extra?.assetId) {\n extra.assetId = supportedKind.extra.assetId;\n }\n if (supportedKind.extra?.assetSymbol) {\n extra.assetSymbol = supportedKind.extra.assetSymbol;\n }\n if (supportedKind.extra?.assetDecimals) {\n extra.assetDecimals = supportedKind.extra.assetDecimals;\n }\n if (supportedKind.extra?.networkName) {\n extra.networkName = supportedKind.extra.networkName;\n }\n\n return {\n ...paymentRequirements,\n extra,\n };\n }\n\n /**\n * Parse Money (string | number) to a decimal number.\n */\n private parseMoneyToDecimal(money: string | number): number {\n if (typeof money === \"number\") {\n return money;\n }\n\n // Remove $ sign and whitespace, then parse\n const cleanMoney = money.replace(/^\\$/, \"\").trim();\n const amount = parseFloat(cleanMoney);\n\n if (isNaN(amount)) {\n throw new Error(`Invalid money format: ${money}`);\n }\n\n return amount;\n }\n\n /**\n * Default money conversion implementation.\n */\n private defaultMoneyConversion(amount: number, network: Network): AssetAmount {\n const token = this.getDefaultAsset(network);\n\n // Convert decimal amount to token amount\n const tokenAmount = parseAmount(amount.toString(), token.decimals);\n\n return {\n amount: tokenAmount.toString(),\n asset: this.createAssetIdentifier(network, token.assetId),\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n assetId: token.assetId,\n },\n };\n }\n\n /**\n * Create a CAIP-19 asset identifier for Polkadot assets\n */\n private createAssetIdentifier(\n network: Network,\n assetId: number,\n ): string {\n return `${network}/asset:${assetId}`;\n }\n\n /**\n * Get the default asset info for a network.\n */\n private getDefaultAsset(\n network: Network,\n ): { assetId: number; symbol: string; name: string; decimals: number } {\n // If a preferred token is configured, try to use it\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n // Use the network's default token\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n\n /**\n * Get all supported networks\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n}\n\n/**\n * Create an exact-direct server for Polkadot\n */\nexport function createExactDirectPolkadotServer(\n config: ExactDirectPolkadotServerConfig = {},\n): ExactDirectPolkadotServer {\n return new ExactDirectPolkadotServer(config);\n}\n","/**\n * Registration function for Polkadot exact-direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport type { Network } from \"@t402/core/types\";\nimport { POLKADOT_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport { ExactDirectPolkadotServer, type ExactDirectPolkadotServerConfig } from \"./scheme.js\";\n\n/**\n * Configuration for registering Polkadot server schemes\n */\nexport interface PolkadotServerRegistrationConfig extends ExactDirectPolkadotServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (polkadot:*)\n */\n networks?: Network[];\n}\n\n/**\n * Registers Polkadot exact-direct payment scheme to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for Polkadot server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectPolkadotServer } from \"@t402/polkadot/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer();\n * registerExactDirectPolkadotServer(server, {\n * networks: [\"polkadot:68d56f15f85d3136970ec16946040bc1\"]\n * });\n * ```\n */\nexport function registerExactDirectPolkadotServer(\n server: t402ResourceServer,\n config: PolkadotServerRegistrationConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectPolkadotServer(config);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n server.register(network, scheme);\n });\n } else {\n // Register wildcard for all Polkadot networks\n server.register(`${POLKADOT_CAIP2_NAMESPACE}:*`, scheme);\n }\n\n return server;\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
- import { P as PolkadotExtrinsicResult, a as ParsedAssetTransfer } from './types-Dbjfcz2Y.js';
2
- export { C as ClientPolkadotSigner, E as ExactDirectPolkadotPayload, F as FacilitatorPolkadotSigner, b as PolkadotEvent, d as PolkadotFacilitatorConfig, c as PolkadotServerConfig } from './types-Dbjfcz2Y.js';
1
+ import { P as PolkadotExtrinsicResult, a as ParsedAssetTransfer } from './types-Bb84eJ4_.js';
2
+ export { C as ClientPolkadotSigner, E as ExactDirectPolkadotPayload, F as FacilitatorPolkadotSigner, b as PolkadotEvent, c as PolkadotFacilitatorConfig, d as PolkadotServerConfig } from './types-Bb84eJ4_.js';
3
3
  import '@t402/core/types';
4
4
 
5
5
  /**
@@ -18,8 +18,8 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
 
20
20
  // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
23
  DEFAULT_KUSAMA_INDEXER: () => DEFAULT_KUSAMA_INDEXER,
24
24
  DEFAULT_KUSAMA_RPC: () => DEFAULT_KUSAMA_RPC,
25
25
  DEFAULT_POLKADOT_INDEXER: () => DEFAULT_POLKADOT_INDEXER,
@@ -53,7 +53,7 @@ __export(index_exports, {
53
53
  parseAmount: () => parseAmount,
54
54
  parseExtrinsicId: () => parseExtrinsicId
55
55
  });
56
- module.exports = __toCommonJS(index_exports);
56
+ module.exports = __toCommonJS(src_exports);
57
57
 
58
58
  // src/constants.ts
59
59
  var POLKADOT_CAIP2_NAMESPACE = "polkadot";
@@ -290,4 +290,4 @@ function parseExtrinsicId(extrinsicId) {
290
290
  parseAmount,
291
291
  parseExtrinsicId
292
292
  });
293
- //# sourceMappingURL=index.cjs.map
293
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/constants.ts","../../src/tokens.ts","../../src/utils.ts"],"sourcesContent":["/**\n * @t402/polkadot - Polkadot Asset Hub mechanism for T402\n *\n * This package provides support for USDT payments on Polkadot Asset Hub\n * using the exact-direct scheme.\n *\n * @example\n * ```typescript\n * // Client usage\n * import { createExactDirectPolkadotClient } from '@t402/polkadot/exact-direct/client';\n *\n * const client = createExactDirectPolkadotClient({\n * signer: myPolkadotSigner,\n * });\n *\n * // Server usage\n * import { registerExactDirectPolkadotServer } from '@t402/polkadot/exact-direct/server';\n *\n * registerExactDirectPolkadotServer(server);\n *\n * // Facilitator usage\n * import { createExactDirectPolkadotFacilitator } from '@t402/polkadot/exact-direct/facilitator';\n *\n * const facilitator = createExactDirectPolkadotFacilitator(signer);\n * ```\n */\n\n// Re-export constants\nexport {\n POLKADOT_CAIP2_NAMESPACE,\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n SCHEME_EXACT_DIRECT,\n DEFAULT_POLKADOT_INDEXER,\n DEFAULT_KUSAMA_INDEXER,\n DEFAULT_WESTEND_INDEXER,\n DEFAULT_POLKADOT_RPC,\n DEFAULT_KUSAMA_RPC,\n DEFAULT_WESTEND_RPC,\n POLKADOT_NETWORKS,\n getNetworkConfig,\n isPolkadotNetwork,\n type PolkadotNetworkConfig,\n} from \"./constants.js\";\n\n// Re-export token registry\nexport {\n USDT_POLKADOT,\n USDT_KUSAMA,\n USDT_WESTEND,\n TOKEN_REGISTRY,\n DEFAULT_TOKENS,\n getTokenConfig,\n getDefaultToken,\n getAssetId,\n type TokenConfig,\n} from \"./tokens.js\";\n\n// Re-export types\nexport type {\n ExactDirectPolkadotPayload,\n PolkadotExtrinsicResult,\n PolkadotEvent,\n ParsedAssetTransfer,\n FacilitatorPolkadotSigner,\n ClientPolkadotSigner,\n PolkadotServerConfig,\n PolkadotFacilitatorConfig,\n} from \"./types.js\";\n\n// Re-export utilities\nexport {\n isValidAddress,\n isValidExtrinsicHash,\n isValidBlockHash,\n compareAddresses,\n formatAmount,\n parseAmount,\n extractAssetTransfer,\n extractAssetTransferFromEvents,\n buildExtrinsicId,\n parseExtrinsicId,\n} from \"./utils.js\";\n","/**\n * Polkadot Asset Hub T402 Constants\n *\n * Polkadot Asset Hub (formerly Statemint) is a common-good parachain\n * that hosts assets like USDT on the Polkadot network.\n */\n\n// CAIP-2 namespace for Polkadot\nexport const POLKADOT_CAIP2_NAMESPACE = \"polkadot\";\n\n// CAIP-2 network identifiers (first 32 chars of genesis hash)\n// Polkadot Asset Hub (Parachain ID: 1000)\nexport const POLKADOT_ASSET_HUB_CAIP2 = \"polkadot:68d56f15f85d3136970ec16946040bc1\";\n\n// Kusama Asset Hub (Parachain ID: 1000 on Kusama)\nexport const KUSAMA_ASSET_HUB_CAIP2 = \"polkadot:48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\";\n\n// Westend Asset Hub (Testnet)\nexport const WESTEND_ASSET_HUB_CAIP2 = \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Default indexers (Subscan API)\nexport const DEFAULT_POLKADOT_INDEXER = \"https://assethub-polkadot.api.subscan.io\";\nexport const DEFAULT_KUSAMA_INDEXER = \"https://assethub-kusama.api.subscan.io\";\nexport const DEFAULT_WESTEND_INDEXER = \"https://assethub-westend.api.subscan.io\";\n\n// Default RPC endpoints\nexport const DEFAULT_POLKADOT_RPC = \"wss://polkadot-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_KUSAMA_RPC = \"wss://kusama-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_WESTEND_RPC = \"wss://westend-asset-hub-rpc.polkadot.io\";\n\n// Network configurations\nexport interface PolkadotNetworkConfig {\n readonly name: string;\n readonly caip2: string;\n readonly rpcUrl: string;\n readonly indexerUrl: string;\n readonly genesisHash: string;\n readonly ss58Prefix: number;\n readonly isTestnet: boolean;\n}\n\nexport const POLKADOT_NETWORKS: Record<string, PolkadotNetworkConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n name: \"Polkadot Asset Hub\",\n caip2: POLKADOT_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_POLKADOT_RPC,\n indexerUrl: DEFAULT_POLKADOT_INDEXER,\n genesisHash: \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\",\n ss58Prefix: 0, // Polkadot\n isTestnet: false,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n name: \"Kusama Asset Hub\",\n caip2: KUSAMA_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_KUSAMA_RPC,\n indexerUrl: DEFAULT_KUSAMA_INDEXER,\n genesisHash: \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\",\n ss58Prefix: 2, // Kusama\n isTestnet: false,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n name: \"Westend Asset Hub\",\n caip2: WESTEND_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_WESTEND_RPC,\n indexerUrl: DEFAULT_WESTEND_INDEXER,\n genesisHash: \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n ss58Prefix: 42, // Generic Substrate\n isTestnet: true,\n },\n};\n\n/**\n * Get network configuration by CAIP-2 identifier\n */\nexport function getNetworkConfig(network: string): PolkadotNetworkConfig | undefined {\n return POLKADOT_NETWORKS[network];\n}\n\n/**\n * Check if a network identifier is a Polkadot network\n */\nexport function isPolkadotNetwork(network: string): boolean {\n return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);\n}\n","/**\n * Polkadot Asset Hub Token Registry\n *\n * On Polkadot Asset Hub, tokens are identified by Asset IDs.\n * USDT is Asset ID 1984, created by Tether.\n */\n\nimport {\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Polkadot Asset Hub\n */\nexport interface TokenConfig {\n /** Asset ID on Asset Hub */\n readonly assetId: number;\n /** Token symbol */\n readonly symbol: string;\n /** Token name */\n readonly name: string;\n /** Decimal places */\n readonly decimals: number;\n /** Issuer (creator of the asset) */\n readonly issuer?: string;\n}\n\n/**\n * USDT on Polkadot Asset Hub\n * Asset ID: 1984\n * Decimals: 6\n */\nexport const USDT_POLKADOT: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * USDT on Kusama Asset Hub\n * Asset ID: 1984 (same as Polkadot)\n */\nexport const USDT_KUSAMA: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * Test USDT on Westend Asset Hub (testnet)\n */\nexport const USDT_WESTEND: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Test Tether USD\",\n decimals: 6,\n};\n\n/**\n * Network-specific token registries\n */\nexport const TOKEN_REGISTRY: Record<string, Record<string, TokenConfig>> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n USDT: USDT_POLKADOT,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n USDT: USDT_KUSAMA,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n USDT: USDT_WESTEND,\n },\n};\n\n/**\n * Default tokens per network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,\n [KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,\n [WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND,\n};\n\n/**\n * Get token configuration by network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string = \"USDT\",\n): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol];\n}\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n\n/**\n * Get asset ID for a token on a network\n */\nexport function getAssetId(network: string, symbol: string = \"USDT\"): number | undefined {\n return getTokenConfig(network, symbol)?.assetId;\n}\n","/**\n * Polkadot Asset Hub Utility Functions\n */\n\nimport type { PolkadotExtrinsicResult, ParsedAssetTransfer } from \"./types.js\";\n\n/**\n * Validate a Polkadot SS58 address format\n * SS58 addresses are base58-encoded with a checksum\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== \"string\") {\n return false;\n }\n\n // SS58 addresses typically start with 1 (Polkadot), or have other prefixes\n // Length is typically 47-48 characters for Polkadot addresses\n // For a simple validation, check base58 characters and length\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]{45,50}$/;\n return base58Regex.test(address);\n}\n\n/**\n * Validate an extrinsic hash format\n * Extrinsic hashes are 32-byte hex strings prefixed with 0x\n */\nexport function isValidExtrinsicHash(hash: string): boolean {\n if (!hash || typeof hash !== \"string\") {\n return false;\n }\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Validate a block hash format\n */\nexport function isValidBlockHash(hash: string): boolean {\n return isValidExtrinsicHash(hash); // Same format\n}\n\n/**\n * Compare two SS58 addresses (case-sensitive)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n return addr1 === addr2;\n}\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: string, decimals: number): string {\n const amountBigInt = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n\n if (fractionalPart === 0n) {\n return wholePart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\");\n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse an amount string to the smallest unit (with decimals applied)\n */\nexport function parseAmount(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const wholePart = parts[0] || \"0\";\n const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + fractionalPart).toString();\n}\n\n/**\n * Extract asset transfer details from an extrinsic result\n */\nexport function extractAssetTransfer(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Check if this is an assets.transfer or assets.transferKeepAlive call\n if (result.module !== \"assets\") {\n return null;\n }\n\n if (result.call !== \"transfer\" && result.call !== \"transferKeepAlive\") {\n return null;\n }\n\n // Extract transfer details from args\n const assetId = result.args.id as number | undefined;\n const to = result.args.target as string | undefined;\n const amount = result.args.amount as string | undefined;\n\n if (assetId === undefined || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from: result.signer,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Extract asset transfer from events (alternative method)\n */\nexport function extractAssetTransferFromEvents(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Look for assets.Transferred event\n const transferEvent = result.events.find(\n (e) => e.module === \"assets\" && e.name === \"Transferred\",\n );\n\n if (!transferEvent) {\n return null;\n }\n\n const assetId = transferEvent.data.assetId as number | undefined;\n const from = transferEvent.data.from as string | undefined;\n const to = transferEvent.data.to as string | undefined;\n const amount = transferEvent.data.amount as string | undefined;\n\n if (assetId === undefined || !from || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Build a unique extrinsic identifier from block hash and index\n */\nexport function buildExtrinsicId(blockHash: string, extrinsicIndex: number): string {\n return `${blockHash}-${extrinsicIndex}`;\n}\n\n/**\n * Parse an extrinsic identifier back to components\n */\nexport function parseExtrinsicId(\n extrinsicId: string,\n): { blockHash: string; extrinsicIndex: number } | null {\n const lastDashIndex = extrinsicId.lastIndexOf(\"-\");\n if (lastDashIndex === -1) {\n return null;\n }\n\n const blockHash = extrinsicId.slice(0, lastDashIndex);\n const extrinsicIndex = parseInt(extrinsicId.slice(lastDashIndex + 1), 10);\n\n if (!isValidBlockHash(blockHash) || isNaN(extrinsicIndex)) {\n return null;\n }\n\n return { blockHash, extrinsicIndex };\n}\n"],"mappings":"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","names":[]}
@@ -132,4 +132,4 @@ interface PolkadotFacilitatorConfig {
132
132
  usedExtrinsicCacheDuration?: number;
133
133
  }
134
134
 
135
- export type { ClientPolkadotSigner as C, ExactDirectPolkadotPayload as E, FacilitatorPolkadotSigner as F, PolkadotExtrinsicResult as P, ParsedAssetTransfer as a, PolkadotEvent as b, PolkadotServerConfig as c, PolkadotFacilitatorConfig as d };
135
+ export type { ClientPolkadotSigner as C, ExactDirectPolkadotPayload as E, FacilitatorPolkadotSigner as F, PolkadotExtrinsicResult as P, ParsedAssetTransfer as a, PolkadotEvent as b, PolkadotFacilitatorConfig as c, PolkadotServerConfig as d };
@@ -1,3 +1,7 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
3
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
4
+
1
5
  // src/constants.ts
2
6
  var POLKADOT_CAIP2_NAMESPACE = "polkadot";
3
7
  var POLKADOT_ASSET_HUB_CAIP2 = "polkadot:68d56f15f85d3136970ec16946040bc1";
@@ -198,38 +202,40 @@ function parseExtrinsicId(extrinsicId) {
198
202
  }
199
203
  return { blockHash, extrinsicIndex };
200
204
  }
205
+
201
206
  export {
202
- DEFAULT_KUSAMA_INDEXER,
203
- DEFAULT_KUSAMA_RPC,
207
+ __publicField,
208
+ POLKADOT_CAIP2_NAMESPACE,
209
+ POLKADOT_ASSET_HUB_CAIP2,
210
+ KUSAMA_ASSET_HUB_CAIP2,
211
+ WESTEND_ASSET_HUB_CAIP2,
212
+ SCHEME_EXACT_DIRECT,
204
213
  DEFAULT_POLKADOT_INDEXER,
205
- DEFAULT_POLKADOT_RPC,
206
- DEFAULT_TOKENS,
214
+ DEFAULT_KUSAMA_INDEXER,
207
215
  DEFAULT_WESTEND_INDEXER,
216
+ DEFAULT_POLKADOT_RPC,
217
+ DEFAULT_KUSAMA_RPC,
208
218
  DEFAULT_WESTEND_RPC,
209
- KUSAMA_ASSET_HUB_CAIP2,
210
- POLKADOT_ASSET_HUB_CAIP2,
211
- POLKADOT_CAIP2_NAMESPACE,
212
219
  POLKADOT_NETWORKS,
213
- SCHEME_EXACT_DIRECT,
214
- TOKEN_REGISTRY,
215
- USDT_KUSAMA,
220
+ getNetworkConfig,
221
+ isPolkadotNetwork,
216
222
  USDT_POLKADOT,
223
+ USDT_KUSAMA,
217
224
  USDT_WESTEND,
218
- WESTEND_ASSET_HUB_CAIP2,
219
- buildExtrinsicId,
220
- compareAddresses,
221
- extractAssetTransfer,
222
- extractAssetTransferFromEvents,
223
- formatAmount,
224
- getAssetId,
225
- getDefaultToken,
226
- getNetworkConfig,
225
+ TOKEN_REGISTRY,
226
+ DEFAULT_TOKENS,
227
227
  getTokenConfig,
228
- isPolkadotNetwork,
228
+ getDefaultToken,
229
+ getAssetId,
229
230
  isValidAddress,
230
- isValidBlockHash,
231
231
  isValidExtrinsicHash,
232
+ isValidBlockHash,
233
+ compareAddresses,
234
+ formatAmount,
232
235
  parseAmount,
236
+ extractAssetTransfer,
237
+ extractAssetTransferFromEvents,
238
+ buildExtrinsicId,
233
239
  parseExtrinsicId
234
240
  };
235
- //# sourceMappingURL=index.mjs.map
241
+ //# sourceMappingURL=chunk-BEDKJN2Y.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/constants.ts","../../src/tokens.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Polkadot Asset Hub T402 Constants\n *\n * Polkadot Asset Hub (formerly Statemint) is a common-good parachain\n * that hosts assets like USDT on the Polkadot network.\n */\n\n// CAIP-2 namespace for Polkadot\nexport const POLKADOT_CAIP2_NAMESPACE = \"polkadot\";\n\n// CAIP-2 network identifiers (first 32 chars of genesis hash)\n// Polkadot Asset Hub (Parachain ID: 1000)\nexport const POLKADOT_ASSET_HUB_CAIP2 = \"polkadot:68d56f15f85d3136970ec16946040bc1\";\n\n// Kusama Asset Hub (Parachain ID: 1000 on Kusama)\nexport const KUSAMA_ASSET_HUB_CAIP2 = \"polkadot:48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\";\n\n// Westend Asset Hub (Testnet)\nexport const WESTEND_ASSET_HUB_CAIP2 = \"polkadot:e143f23803ac50e8f6f8e62695d1ce9e\";\n\n// Scheme identifier\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// Default indexers (Subscan API)\nexport const DEFAULT_POLKADOT_INDEXER = \"https://assethub-polkadot.api.subscan.io\";\nexport const DEFAULT_KUSAMA_INDEXER = \"https://assethub-kusama.api.subscan.io\";\nexport const DEFAULT_WESTEND_INDEXER = \"https://assethub-westend.api.subscan.io\";\n\n// Default RPC endpoints\nexport const DEFAULT_POLKADOT_RPC = \"wss://polkadot-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_KUSAMA_RPC = \"wss://kusama-asset-hub-rpc.polkadot.io\";\nexport const DEFAULT_WESTEND_RPC = \"wss://westend-asset-hub-rpc.polkadot.io\";\n\n// Network configurations\nexport interface PolkadotNetworkConfig {\n readonly name: string;\n readonly caip2: string;\n readonly rpcUrl: string;\n readonly indexerUrl: string;\n readonly genesisHash: string;\n readonly ss58Prefix: number;\n readonly isTestnet: boolean;\n}\n\nexport const POLKADOT_NETWORKS: Record<string, PolkadotNetworkConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n name: \"Polkadot Asset Hub\",\n caip2: POLKADOT_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_POLKADOT_RPC,\n indexerUrl: DEFAULT_POLKADOT_INDEXER,\n genesisHash: \"0x68d56f15f85d3136970ec16946040bc1752654e906147f7e43e9d539d7c3de2f\",\n ss58Prefix: 0, // Polkadot\n isTestnet: false,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n name: \"Kusama Asset Hub\",\n caip2: KUSAMA_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_KUSAMA_RPC,\n indexerUrl: DEFAULT_KUSAMA_INDEXER,\n genesisHash: \"0x48239ef607d7928874027a43a67689209727dfb3d3dc5e5b03a39bdc2eda771a\",\n ss58Prefix: 2, // Kusama\n isTestnet: false,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n name: \"Westend Asset Hub\",\n caip2: WESTEND_ASSET_HUB_CAIP2,\n rpcUrl: DEFAULT_WESTEND_RPC,\n indexerUrl: DEFAULT_WESTEND_INDEXER,\n genesisHash: \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n ss58Prefix: 42, // Generic Substrate\n isTestnet: true,\n },\n};\n\n/**\n * Get network configuration by CAIP-2 identifier\n */\nexport function getNetworkConfig(network: string): PolkadotNetworkConfig | undefined {\n return POLKADOT_NETWORKS[network];\n}\n\n/**\n * Check if a network identifier is a Polkadot network\n */\nexport function isPolkadotNetwork(network: string): boolean {\n return network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`);\n}\n","/**\n * Polkadot Asset Hub Token Registry\n *\n * On Polkadot Asset Hub, tokens are identified by Asset IDs.\n * USDT is Asset ID 1984, created by Tether.\n */\n\nimport {\n POLKADOT_ASSET_HUB_CAIP2,\n KUSAMA_ASSET_HUB_CAIP2,\n WESTEND_ASSET_HUB_CAIP2,\n} from \"./constants.js\";\n\n/**\n * Token configuration for Polkadot Asset Hub\n */\nexport interface TokenConfig {\n /** Asset ID on Asset Hub */\n readonly assetId: number;\n /** Token symbol */\n readonly symbol: string;\n /** Token name */\n readonly name: string;\n /** Decimal places */\n readonly decimals: number;\n /** Issuer (creator of the asset) */\n readonly issuer?: string;\n}\n\n/**\n * USDT on Polkadot Asset Hub\n * Asset ID: 1984\n * Decimals: 6\n */\nexport const USDT_POLKADOT: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * USDT on Kusama Asset Hub\n * Asset ID: 1984 (same as Polkadot)\n */\nexport const USDT_KUSAMA: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n issuer: \"Tether\",\n};\n\n/**\n * Test USDT on Westend Asset Hub (testnet)\n */\nexport const USDT_WESTEND: TokenConfig = {\n assetId: 1984,\n symbol: \"USDT\",\n name: \"Test Tether USD\",\n decimals: 6,\n};\n\n/**\n * Network-specific token registries\n */\nexport const TOKEN_REGISTRY: Record<string, Record<string, TokenConfig>> = {\n [POLKADOT_ASSET_HUB_CAIP2]: {\n USDT: USDT_POLKADOT,\n },\n [KUSAMA_ASSET_HUB_CAIP2]: {\n USDT: USDT_KUSAMA,\n },\n [WESTEND_ASSET_HUB_CAIP2]: {\n USDT: USDT_WESTEND,\n },\n};\n\n/**\n * Default tokens per network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig> = {\n [POLKADOT_ASSET_HUB_CAIP2]: USDT_POLKADOT,\n [KUSAMA_ASSET_HUB_CAIP2]: USDT_KUSAMA,\n [WESTEND_ASSET_HUB_CAIP2]: USDT_WESTEND,\n};\n\n/**\n * Get token configuration by network and symbol\n */\nexport function getTokenConfig(\n network: string,\n symbol: string = \"USDT\",\n): TokenConfig | undefined {\n return TOKEN_REGISTRY[network]?.[symbol];\n}\n\n/**\n * Get the default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n\n/**\n * Get asset ID for a token on a network\n */\nexport function getAssetId(network: string, symbol: string = \"USDT\"): number | undefined {\n return getTokenConfig(network, symbol)?.assetId;\n}\n","/**\n * Polkadot Asset Hub Utility Functions\n */\n\nimport type { PolkadotExtrinsicResult, ParsedAssetTransfer } from \"./types.js\";\n\n/**\n * Validate a Polkadot SS58 address format\n * SS58 addresses are base58-encoded with a checksum\n */\nexport function isValidAddress(address: string): boolean {\n if (!address || typeof address !== \"string\") {\n return false;\n }\n\n // SS58 addresses typically start with 1 (Polkadot), or have other prefixes\n // Length is typically 47-48 characters for Polkadot addresses\n // For a simple validation, check base58 characters and length\n const base58Regex = /^[1-9A-HJ-NP-Za-km-z]{45,50}$/;\n return base58Regex.test(address);\n}\n\n/**\n * Validate an extrinsic hash format\n * Extrinsic hashes are 32-byte hex strings prefixed with 0x\n */\nexport function isValidExtrinsicHash(hash: string): boolean {\n if (!hash || typeof hash !== \"string\") {\n return false;\n }\n return /^0x[a-fA-F0-9]{64}$/.test(hash);\n}\n\n/**\n * Validate a block hash format\n */\nexport function isValidBlockHash(hash: string): boolean {\n return isValidExtrinsicHash(hash); // Same format\n}\n\n/**\n * Compare two SS58 addresses (case-sensitive)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n return addr1 === addr2;\n}\n\n/**\n * Format an amount with decimals for display\n */\nexport function formatAmount(amount: string, decimals: number): string {\n const amountBigInt = BigInt(amount);\n const divisor = BigInt(10 ** decimals);\n const wholePart = amountBigInt / divisor;\n const fractionalPart = amountBigInt % divisor;\n\n if (fractionalPart === 0n) {\n return wholePart.toString();\n }\n\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n const trimmedFractional = fractionalStr.replace(/0+$/, \"\");\n return `${wholePart}.${trimmedFractional}`;\n}\n\n/**\n * Parse an amount string to the smallest unit (with decimals applied)\n */\nexport function parseAmount(amount: string, decimals: number): string {\n const parts = amount.split(\".\");\n const wholePart = parts[0] || \"0\";\n const fractionalPart = (parts[1] || \"\").padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(wholePart + fractionalPart).toString();\n}\n\n/**\n * Extract asset transfer details from an extrinsic result\n */\nexport function extractAssetTransfer(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Check if this is an assets.transfer or assets.transferKeepAlive call\n if (result.module !== \"assets\") {\n return null;\n }\n\n if (result.call !== \"transfer\" && result.call !== \"transferKeepAlive\") {\n return null;\n }\n\n // Extract transfer details from args\n const assetId = result.args.id as number | undefined;\n const to = result.args.target as string | undefined;\n const amount = result.args.amount as string | undefined;\n\n if (assetId === undefined || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from: result.signer,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Extract asset transfer from events (alternative method)\n */\nexport function extractAssetTransferFromEvents(\n result: PolkadotExtrinsicResult,\n): ParsedAssetTransfer | null {\n if (!result.success) {\n return null;\n }\n\n // Look for assets.Transferred event\n const transferEvent = result.events.find(\n (e) => e.module === \"assets\" && e.name === \"Transferred\",\n );\n\n if (!transferEvent) {\n return null;\n }\n\n const assetId = transferEvent.data.assetId as number | undefined;\n const from = transferEvent.data.from as string | undefined;\n const to = transferEvent.data.to as string | undefined;\n const amount = transferEvent.data.amount as string | undefined;\n\n if (assetId === undefined || !from || !to || !amount) {\n return null;\n }\n\n return {\n assetId,\n from,\n to,\n amount: amount.toString(),\n success: true,\n };\n}\n\n/**\n * Build a unique extrinsic identifier from block hash and index\n */\nexport function buildExtrinsicId(blockHash: string, extrinsicIndex: number): string {\n return `${blockHash}-${extrinsicIndex}`;\n}\n\n/**\n * Parse an extrinsic identifier back to components\n */\nexport function parseExtrinsicId(\n extrinsicId: string,\n): { blockHash: string; extrinsicIndex: number } | null {\n const lastDashIndex = extrinsicId.lastIndexOf(\"-\");\n if (lastDashIndex === -1) {\n return null;\n }\n\n const blockHash = extrinsicId.slice(0, lastDashIndex);\n const extrinsicIndex = parseInt(extrinsicId.slice(lastDashIndex + 1), 10);\n\n if (!isValidBlockHash(blockHash) || isNaN(extrinsicIndex)) {\n return null;\n }\n\n return { blockHash, extrinsicIndex };\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayload } from '@t402/core/types';
2
- import { C as ClientPolkadotSigner } from '../../types-Dbjfcz2Y.cjs';
2
+ import { C as ClientPolkadotSigner } from '../../types-Bb84eJ4_.mjs';
3
3
 
4
4
  /**
5
5
  * Polkadot Exact-Direct Client Scheme
@@ -0,0 +1,71 @@
1
+ import {
2
+ POLKADOT_CAIP2_NAMESPACE,
3
+ SCHEME_EXACT_DIRECT,
4
+ __publicField,
5
+ getAssetId,
6
+ isValidAddress
7
+ } from "../../chunk-BEDKJN2Y.mjs";
8
+
9
+ // src/exact-direct/client/scheme.ts
10
+ var ExactDirectPolkadotClient = class {
11
+ constructor(config) {
12
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
13
+ __publicField(this, "signer");
14
+ this.signer = config.signer;
15
+ }
16
+ /**
17
+ * Create a payment payload by executing the transfer
18
+ */
19
+ async createPaymentPayload(t402Version, requirements) {
20
+ this.validateRequirements(requirements);
21
+ const { network, amount, payTo, extra } = requirements;
22
+ const symbol = extra?.assetSymbol || "USDT";
23
+ const assetId = extra?.assetId ?? getAssetId(network, symbol);
24
+ if (assetId === void 0) {
25
+ throw new Error(`Unknown asset ${symbol} on network ${network}`);
26
+ }
27
+ const from = await this.signer.getAddress();
28
+ const { extrinsicHash, blockHash, extrinsicIndex } = await this.signer.transferAsset(assetId, payTo, amount);
29
+ const polkadotPayload = {
30
+ extrinsicHash,
31
+ blockHash,
32
+ extrinsicIndex,
33
+ from,
34
+ to: payTo,
35
+ amount,
36
+ assetId
37
+ };
38
+ return {
39
+ t402Version,
40
+ payload: polkadotPayload
41
+ };
42
+ }
43
+ /**
44
+ * Validate payment requirements
45
+ */
46
+ validateRequirements(requirements) {
47
+ if (requirements.scheme !== SCHEME_EXACT_DIRECT) {
48
+ throw new Error(
49
+ `Invalid scheme: expected ${SCHEME_EXACT_DIRECT}, got ${requirements.scheme}`
50
+ );
51
+ }
52
+ if (!requirements.network.startsWith(`${POLKADOT_CAIP2_NAMESPACE}:`)) {
53
+ throw new Error(`Invalid network: ${requirements.network}`);
54
+ }
55
+ if (!isValidAddress(requirements.payTo)) {
56
+ throw new Error(`Invalid payTo address: ${requirements.payTo}`);
57
+ }
58
+ const amount = BigInt(requirements.amount);
59
+ if (amount <= 0n) {
60
+ throw new Error(`Invalid amount: ${requirements.amount}`);
61
+ }
62
+ }
63
+ };
64
+ function createExactDirectPolkadotClient(config) {
65
+ return new ExactDirectPolkadotClient(config);
66
+ }
67
+ export {
68
+ ExactDirectPolkadotClient,
69
+ createExactDirectPolkadotClient
70
+ };
71
+ //# sourceMappingURL=index.mjs.map