@t402/tezos 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 → cjs/exact-direct}/client/index.js +3 -1
  3. package/dist/cjs/exact-direct/client/index.js.map +1 -0
  4. package/dist/{exact-direct → cjs/exact-direct}/facilitator/index.d.ts +1 -1
  5. package/dist/{exact-direct → cjs/exact-direct}/facilitator/index.js +6 -4
  6. package/dist/cjs/exact-direct/facilitator/index.js.map +1 -0
  7. package/dist/{exact-direct → cjs/exact-direct}/server/index.js +5 -3
  8. package/dist/cjs/exact-direct/server/index.js.map +1 -0
  9. package/dist/{index.d.ts → cjs/index.d.ts} +1 -1
  10. package/dist/cjs/index.js.map +1 -0
  11. package/dist/{types-DQMtUOa_.d.cts → cjs/types-mwNZibpp.d.ts} +1 -1
  12. package/dist/{index.mjs → esm/chunk-6MWWSQK7.mjs} +29 -23
  13. package/dist/esm/chunk-6MWWSQK7.mjs.map +1 -0
  14. package/dist/{exact-direct/client/index.d.cts → esm/exact-direct/client/index.d.mts} +1 -1
  15. package/dist/{exact-direct → esm/exact-direct}/client/index.mjs +9 -60
  16. package/dist/esm/exact-direct/client/index.mjs.map +1 -0
  17. package/dist/{exact-direct/facilitator/index.d.cts → esm/exact-direct/facilitator/index.d.mts} +1 -1
  18. package/dist/{exact-direct → esm/exact-direct}/facilitator/index.mjs +14 -77
  19. package/dist/esm/exact-direct/facilitator/index.mjs.map +1 -0
  20. package/dist/{exact-direct → esm/exact-direct}/server/index.mjs +12 -62
  21. package/dist/esm/exact-direct/server/index.mjs.map +1 -0
  22. package/dist/{index.d.cts → esm/index.d.mts} +1 -1
  23. package/dist/esm/index.mjs +69 -0
  24. package/dist/esm/index.mjs.map +1 -0
  25. package/dist/{types-DQMtUOa_.d.ts → esm/types-mwNZibpp.d.mts} +1 -1
  26. package/package.json +9 -7
  27. package/dist/exact-direct/client/index.js.map +0 -1
  28. package/dist/exact-direct/client/index.mjs.map +0 -1
  29. package/dist/exact-direct/facilitator/index.js.map +0 -1
  30. package/dist/exact-direct/facilitator/index.mjs.map +0 -1
  31. package/dist/exact-direct/server/index.js.map +0 -1
  32. package/dist/exact-direct/server/index.mjs.map +0 -1
  33. package/dist/index.js.map +0 -1
  34. package/dist/index.mjs.map +0 -1
  35. /package/dist/{exact-direct → cjs/exact-direct}/server/index.d.ts +0 -0
  36. /package/dist/{index.js → cjs/index.js} +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, Network } from '@t402/core/types';
2
- import { T as TezosSigner } from '../../types-DQMtUOa_.js';
2
+ import { b as TezosSigner } from '../../types-mwNZibpp.js';
3
3
  import { t402Client } from '@t402/core/client';
4
4
 
5
5
  /**
@@ -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 = {};
@@ -89,9 +91,9 @@ function compareAddresses(addr1, addr2) {
89
91
  var ExactDirectTezosClient = class {
90
92
  constructor(signer, config = {}) {
91
93
  this.signer = signer;
94
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
92
95
  void config;
93
96
  }
94
- scheme = SCHEME_EXACT_DIRECT;
95
97
  /**
96
98
  * Create a payment payload by executing the transfer
97
99
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/client/index.ts","../../../../src/constants.ts","../../../../src/types.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/exact-direct/client/scheme.ts","../../../../src/exact-direct/client/register.ts"],"sourcesContent":["/**\n * Tezos Exact-Direct Client\n */\n\nexport {\n ExactDirectTezosClient,\n type ExactDirectTezosClientConfig,\n} from \"./scheme.js\";\n\nexport {\n registerExactDirectTezosClient,\n type TezosClientConfig,\n} from \"./register.js\";\n","/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n","/**\n * Tezos Exact-Direct Client Scheme\n *\n * The client executes the FA2 transfer directly and provides\n * the operation hash as proof of payment.\n */\n\nimport type {\n SchemeNetworkClient,\n PaymentPayload,\n PaymentRequirements,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, TEZOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type { TezosSigner, ExactDirectTezosPayload } from \"../../types.js\";\nimport { isValidTezosAddress } from \"../../types.js\";\nimport { getTokenBySymbol } from \"../../tokens.js\";\nimport { compareAddresses } from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectTezosClient\n */\nexport interface ExactDirectTezosClientConfig {\n /**\n * Whether to verify the operation was successful before returning\n * @default true\n */\n verifyOperation?: boolean;\n}\n\n/**\n * Tezos Exact-Direct Client\n *\n * Implements the client-side payment flow where the client:\n * 1. Receives payment requirements\n * 2. Executes the FA2 transfer operation\n * 3. Returns operation hash as proof\n */\nexport class ExactDirectTezosClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n\n constructor(\n private readonly signer: TezosSigner,\n config: ExactDirectTezosClientConfig = {},\n ) {\n // Config reserved for future use\n void config;\n }\n\n /**\n * Create a payment payload by executing the transfer\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate requirements\n this.validateRequirements(paymentRequirements);\n\n // Get sender address\n const from = await this.signer.getAddress();\n\n // Parse asset to get contract address and token ID\n const assetInfo = this.parseAssetIdentifier(paymentRequirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset identifier: ${paymentRequirements.asset}`);\n }\n\n // Get amount\n const amount = BigInt(paymentRequirements.amount);\n\n // Check balance\n const balance = await this.signer.getBalance(\n assetInfo.contractAddress,\n assetInfo.tokenId,\n );\n if (balance < amount) {\n throw new Error(\n `Insufficient balance: have ${balance}, need ${amount}`,\n );\n }\n\n // Execute transfer\n const opHash = await this.signer.transfer(\n assetInfo.contractAddress,\n assetInfo.tokenId,\n paymentRequirements.payTo,\n amount,\n );\n\n // Create payload\n const payload: ExactDirectTezosPayload = {\n opHash,\n from,\n to: paymentRequirements.payTo,\n amount: paymentRequirements.amount,\n contractAddress: assetInfo.contractAddress,\n tokenId: assetInfo.tokenId,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n\n /**\n * Parse CAIP-19 asset identifier for Tezos FA2\n * Format: tezos:{chainRef}/fa2:{contractAddress}/{tokenId}\n */\n private parseAssetIdentifier(\n asset: string,\n ): { contractAddress: string; tokenId: number } | null {\n // Try parsing CAIP-19 format\n const caipMatch = asset.match(/^tezos:[^/]+\\/fa2:([^/]+)\\/(\\d+)$/);\n if (caipMatch) {\n return {\n contractAddress: caipMatch[1],\n tokenId: parseInt(caipMatch[2], 10),\n };\n }\n\n // Try simple format: contractAddress/tokenId or just contractAddress (default tokenId 0)\n const simpleMatch = asset.match(/^(KT1[a-zA-Z0-9]+)(?:\\/(\\d+))?$/);\n if (simpleMatch) {\n return {\n contractAddress: simpleMatch[1],\n tokenId: simpleMatch[2] ? parseInt(simpleMatch[2], 10) : 0,\n };\n }\n\n return null;\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(`${TEZOS_CAIP2_NAMESPACE}:`)) {\n throw new Error(`Invalid network: ${requirements.network}`);\n }\n\n // Check payTo address\n if (!isValidTezosAddress(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 // Check asset\n const assetInfo = this.parseAssetIdentifier(requirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset: ${requirements.asset}`);\n }\n\n // Verify token is supported (warn for unknown tokens)\n const tokenConfig = getTokenBySymbol(requirements.network, \"USDt\");\n if (tokenConfig && !compareAddresses(tokenConfig.contractAddress, assetInfo.contractAddress)) {\n console.warn(\n `Using non-standard token: ${assetInfo.contractAddress}`,\n );\n }\n }\n}\n\nexport default ExactDirectTezosClient;\n","/**\n * Registration function for Tezos Exact-Direct client\n */\n\nimport { t402Client } from \"@t402/core/client\";\nimport type { Network } from \"@t402/core/types\";\nimport type { TezosSigner } from \"../../types.js\";\nimport {\n ExactDirectTezosClient,\n type ExactDirectTezosClientConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Tezos schemes to a t402Client\n */\nexport interface TezosClientConfig {\n /**\n * The Tezos signer for payment operations\n */\n signer: TezosSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tezos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectTezosClientConfig;\n}\n\n/**\n * Registers Tezos exact-direct payment scheme to a t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for Tezos client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectTezosClient } from \"@t402/tezos/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectTezosClient(client, {\n * signer: myTezosSigner,\n * networks: [\"tezos:NetXdQprcVkpaWU\"]\n * });\n * ```\n */\nexport function registerExactDirectTezosClient(\n client: t402Client,\n config: TezosClientConfig,\n): t402Client {\n const scheme = new ExactDirectTezosClient(config.signer, config.schemeConfig);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n client.register(network, scheme);\n });\n } else {\n // Register wildcard for all Tezos networks\n client.register(\"tezos:*\", scheme);\n }\n\n return client;\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 FacilitatorTezosSigner } from '../../types-DQMtUOa_.js';
2
+ import { a as FacilitatorTezosSigner } from '../../types-mwNZibpp.js';
3
3
  import { t402Facilitator } from '@t402/core/facilitator';
4
4
 
5
5
  /**
@@ -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 = {};
@@ -103,6 +105,10 @@ function getDefaultToken(network) {
103
105
  var ExactDirectTezosFacilitator = class {
104
106
  constructor(signer, config) {
105
107
  this.signer = signer;
108
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
109
+ __publicField(this, "caipFamily", `${TEZOS_CAIP2_NAMESPACE}:*`);
110
+ __publicField(this, "config");
111
+ __publicField(this, "usedOps", /* @__PURE__ */ new Map());
106
112
  this.config = {
107
113
  maxOperationAge: config?.maxOperationAge ?? 3600,
108
114
  usedOpCacheDuration: config?.usedOpCacheDuration ?? 24 * 60 * 60 * 1e3
@@ -110,10 +116,6 @@ var ExactDirectTezosFacilitator = class {
110
116
  };
111
117
  this.startCleanupInterval();
112
118
  }
113
- scheme = SCHEME_EXACT_DIRECT;
114
- caipFamily = `${TEZOS_CAIP2_NAMESPACE}:*`;
115
- config;
116
- usedOps = /* @__PURE__ */ new Map();
117
119
  /**
118
120
  * Get extra data for a supported kind
119
121
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/facilitator/index.ts","../../../../src/constants.ts","../../../../src/types.ts","../../../../src/utils.ts","../../../../src/tokens.ts","../../../../src/exact-direct/facilitator/scheme.ts","../../../../src/exact-direct/facilitator/register.ts"],"sourcesContent":["/**\n * Tezos Exact-Direct Facilitator\n */\n\nexport {\n ExactDirectTezosFacilitator,\n type ExactDirectTezosFacilitatorConfig,\n} from \"./scheme.js\";\n\nexport {\n registerExactDirectTezosFacilitator,\n type TezosFacilitatorConfig,\n} from \"./register.js\";\n","/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos Exact-Direct Facilitator Scheme\n *\n * Verifies FA2 transfer operations and manages replay protection.\n */\n\nimport type {\n SchemeNetworkFacilitator,\n PaymentPayload,\n PaymentRequirements,\n VerifyResponse,\n SettleResponse,\n Network,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, TEZOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type {\n FacilitatorTezosSigner,\n ExactDirectTezosPayload,\n} from \"../../types.js\";\nimport { isValidOperationHash, isTezosNetwork } from \"../../types.js\";\nimport {\n compareAddresses,\n extractFA2TransferDetails,\n} from \"../../utils.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactDirectTezosFacilitator\n */\nexport interface ExactDirectTezosFacilitatorConfig {\n /**\n * Maximum age of operation in seconds (default: 3600 = 1 hour)\n */\n maxOperationAge?: number;\n\n /**\n * Duration to cache used operation hashes (in milliseconds)\n */\n usedOpCacheDuration?: number;\n}\n\n/**\n * Tezos Exact-Direct Facilitator\n *\n * Implements the facilitator-side verification and settlement.\n * For exact-direct, settlement is a no-op since client already executed.\n */\nexport class ExactDirectTezosFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${TEZOS_CAIP2_NAMESPACE}:*`;\n\n private readonly config: Required<ExactDirectTezosFacilitatorConfig>;\n private usedOps: Map<string, number> = new Map();\n\n constructor(\n private readonly signer: FacilitatorTezosSigner,\n config?: ExactDirectTezosFacilitatorConfig,\n ) {\n this.config = {\n maxOperationAge: config?.maxOperationAge ?? 3600,\n usedOpCacheDuration: config?.usedOpCacheDuration ?? 24 * 60 * 60 * 1000, // 24 hours\n };\n\n // Start cleanup interval\n this.startCleanupInterval();\n }\n\n /**\n * Get extra data for a supported kind\n */\n getExtra(network: Network): Record<string, unknown> | undefined {\n const token = getDefaultToken(network);\n if (!token) {\n return undefined;\n }\n return {\n assetSymbol: token.symbol,\n assetDecimals: token.decimals,\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 // Validate scheme\n if (payload.accepted.scheme !== SCHEME_EXACT_DIRECT) {\n return {\n isValid: false,\n invalidReason: \"invalid_scheme\",\n };\n }\n\n // Validate network\n if (!isTezosNetwork(payload.accepted.network)) {\n return {\n isValid: false,\n invalidReason: \"invalid_network\",\n };\n }\n\n // Extract Tezos-specific payload\n const tezosPayload = payload.payload as ExactDirectTezosPayload;\n\n // Validate operation hash format\n if (!isValidOperationHash(tezosPayload.opHash)) {\n return {\n isValid: false,\n invalidReason: \"invalid_operation_hash_format\",\n };\n }\n\n // Check for replay attack\n if (this.isOpUsed(tezosPayload.opHash)) {\n return {\n isValid: false,\n invalidReason: \"operation_already_used\",\n payer: tezosPayload.from,\n };\n }\n\n try {\n // Query operation\n const op = await this.signer.queryOperation(tezosPayload.opHash);\n if (!op) {\n return {\n isValid: false,\n invalidReason: \"operation_not_found\",\n payer: tezosPayload.from,\n };\n }\n\n // Verify operation was successful\n if (op.status !== \"applied\") {\n return {\n isValid: false,\n invalidReason: `operation_not_applied: status is ${op.status}`,\n payer: tezosPayload.from,\n };\n }\n\n // Check operation age\n if (this.config.maxOperationAge > 0) {\n const opTimestamp = new Date(op.timestamp).getTime() / 1000;\n const now = Date.now() / 1000;\n const age = now - opTimestamp;\n if (age > this.config.maxOperationAge) {\n return {\n isValid: false,\n invalidReason: `operation_too_old: ${Math.round(age)} seconds`,\n payer: tezosPayload.from,\n };\n }\n }\n\n // Verify it's a transfer to the correct contract\n if (op.target?.address !== tezosPayload.contractAddress) {\n return {\n isValid: false,\n invalidReason: `contract_mismatch: expected ${tezosPayload.contractAddress}, got ${op.target?.address}`,\n payer: tezosPayload.from,\n };\n }\n\n // Verify entrypoint\n if (op.entrypoint !== \"transfer\") {\n return {\n isValid: false,\n invalidReason: `entrypoint_mismatch: expected transfer, got ${op.entrypoint}`,\n payer: tezosPayload.from,\n };\n }\n\n // Extract transfer details from parameter\n const transferDetails = extractFA2TransferDetails(op.parameter);\n if (!transferDetails) {\n return {\n isValid: false,\n invalidReason: \"could_not_extract_transfer_details\",\n payer: tezosPayload.from,\n };\n }\n\n // Verify sender\n if (!compareAddresses(transferDetails.from, op.sender.address)) {\n return {\n isValid: false,\n invalidReason: `sender_mismatch: parameter says ${transferDetails.from}, but sender is ${op.sender.address}`,\n payer: tezosPayload.from,\n };\n }\n\n // Verify recipient\n if (!compareAddresses(transferDetails.to, requirements.payTo)) {\n return {\n isValid: false,\n invalidReason: `recipient_mismatch: expected ${requirements.payTo}, got ${transferDetails.to}`,\n payer: tezosPayload.from,\n };\n }\n\n // Verify token ID\n if (transferDetails.tokenId !== tezosPayload.tokenId) {\n return {\n isValid: false,\n invalidReason: `token_id_mismatch: expected ${tezosPayload.tokenId}, got ${transferDetails.tokenId}`,\n payer: tezosPayload.from,\n };\n }\n\n // Verify amount\n const expectedAmount = BigInt(requirements.amount);\n const actualAmount = BigInt(transferDetails.amount);\n if (actualAmount < expectedAmount) {\n return {\n isValid: false,\n invalidReason: `insufficient_amount: expected ${expectedAmount}, got ${actualAmount}`,\n payer: tezosPayload.from,\n };\n }\n\n // Mark operation as used\n this.markOpUsed(tezosPayload.opHash);\n\n return {\n isValid: true,\n payer: transferDetails.from,\n };\n } catch (error) {\n return {\n isValid: false,\n invalidReason: `verification_error: ${error instanceof Error ? error.message : String(error)}`,\n payer: tezosPayload.from,\n };\n }\n }\n\n /**\n * Settle a payment (no-op for exact-direct since client already executed)\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 tezosPayload = payload.payload as ExactDirectTezosPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: tezosPayload.opHash,\n network: requirements.network,\n payer: tezosPayload.from,\n };\n }\n\n /**\n * Check if an operation has been used\n */\n private isOpUsed(opHash: string): boolean {\n return this.usedOps.has(opHash);\n }\n\n /**\n * Mark an operation as used\n */\n private markOpUsed(opHash: string): void {\n this.usedOps.set(opHash, Date.now());\n }\n\n /**\n * Start the cleanup interval for used operations\n */\n private startCleanupInterval(): void {\n setInterval(\n () => {\n const cutoff = Date.now() - this.config.usedOpCacheDuration;\n for (const [opHash, usedAt] of this.usedOps.entries()) {\n if (usedAt < cutoff) {\n this.usedOps.delete(opHash);\n }\n }\n },\n 60 * 60 * 1000,\n ); // Cleanup every hour\n }\n}\n\nexport default ExactDirectTezosFacilitator;\n","/**\n * Registration function for Tezos Exact-Direct facilitator\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport type { Network } from \"@t402/core/types\";\nimport type { FacilitatorTezosSigner } from \"../../types.js\";\nimport {\n ExactDirectTezosFacilitator,\n type ExactDirectTezosFacilitatorConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Tezos schemes to a t402Facilitator\n */\nexport interface TezosFacilitatorConfig {\n /**\n * The Tezos signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorTezosSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tezos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectTezosFacilitatorConfig;\n}\n\n/**\n * Registers Tezos exact-direct payment schemes to a t402Facilitator instance.\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for Tezos facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectTezosFacilitator } from \"@t402/tezos/exact-direct/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const facilitator = new t402Facilitator();\n * registerExactDirectTezosFacilitator(facilitator, {\n * signer: myTezosSigner,\n * networks: [\"tezos:NetXdQprcVkpaWU\"]\n * });\n * ```\n */\nexport function registerExactDirectTezosFacilitator(\n facilitator: t402Facilitator,\n config: TezosFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactDirectTezosFacilitator(\n config.signer,\n config.schemeConfig,\n );\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n facilitator.register(network, scheme);\n });\n } else {\n // Register wildcard for all Tezos networks\n facilitator.register(\"tezos:*\", scheme);\n }\n\n return facilitator;\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 = {};
@@ -87,10 +89,10 @@ function isTezosNetwork(network) {
87
89
 
88
90
  // src/exact-direct/server/scheme.ts
89
91
  var ExactDirectTezosServer = class {
90
- scheme = SCHEME_EXACT_DIRECT;
91
- moneyParsers = [];
92
- config;
93
92
  constructor(config = {}) {
93
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
94
+ __publicField(this, "moneyParsers", []);
95
+ __publicField(this, "config");
94
96
  this.config = config;
95
97
  }
96
98
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/server/index.ts","../../../../src/constants.ts","../../../../src/tokens.ts","../../../../src/utils.ts","../../../../src/types.ts","../../../../src/exact-direct/server/scheme.ts","../../../../src/exact-direct/server/register.ts"],"sourcesContent":["/**\n * Tezos Exact-Direct Server\n */\n\nexport {\n ExactDirectTezosServer,\n type ExactDirectTezosServerConfig,\n} from \"./scheme.js\";\n\nexport {\n registerExactDirectTezosServer,\n type TezosServerConfig,\n} from \"./register.js\";\n","/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos Exact-Direct Server Scheme\n *\n * Handles price parsing and payment requirement enhancement for\n * Tezos FA2 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 } from \"../../constants.js\";\nimport { getTokenBySymbol, getDefaultToken, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport { parseAmount } from \"../../utils.js\";\nimport { isTezosNetwork } from \"../../types.js\";\n\n/**\n * Configuration for ExactDirectTezosServer\n */\nexport interface ExactDirectTezosServerConfig {\n /** Preferred token symbol (e.g., \"USDt\"). Defaults to network's default token. */\n preferredToken?: string;\n}\n\n/**\n * Tezos Exact-Direct Server\n *\n * Implements the server-side price parsing and payment requirements enhancement.\n */\nexport class ExactDirectTezosServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectTezosServerConfig;\n\n constructor(config: ExactDirectTezosServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectTezosServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parse price into Tezos-specific amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Validate network\n if (!isTezosNetwork(network)) {\n throw new Error(`Invalid Tezos 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 Tezos-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?.assetSymbol) {\n extra.assetSymbol = supportedKind.extra.assetSymbol;\n }\n if (supportedKind.extra?.assetDecimals) {\n extra.assetDecimals = supportedKind.extra.assetDecimals;\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.contractAddress, token.tokenId),\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n tokenId: token.tokenId,\n },\n };\n }\n\n /**\n * Create a CAIP-19 asset identifier for Tezos FA2\n */\n private createAssetIdentifier(\n network: Network,\n contractAddress: string,\n tokenId: number,\n ): string {\n return `${network}/fa2:${contractAddress}/${tokenId}`;\n }\n\n /**\n * Get the default asset info for a network.\n */\n private getDefaultAsset(\n network: Network,\n ): { contractAddress: string; tokenId: 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 = getTokenBySymbol(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\nexport default ExactDirectTezosServer;\n","/**\n * Registration function for Tezos Exact-Direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport type { Network } from \"@t402/core/types\";\nimport {\n ExactDirectTezosServer,\n type ExactDirectTezosServerConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Tezos schemes to a t402ResourceServer\n */\nexport interface TezosServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tezos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectTezosServerConfig;\n}\n\n/**\n * Registers Tezos exact-direct payment scheme to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for Tezos server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectTezosServer } from \"@t402/tezos/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer();\n * registerExactDirectTezosServer(server, {\n * networks: [\"tezos:NetXdQprcVkpaWU\"]\n * });\n * ```\n */\nexport function registerExactDirectTezosServer(\n server: t402ResourceServer,\n config: TezosServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectTezosServer(config.schemeConfig);\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 Tezos networks\n server.register(\"tezos:*\", scheme);\n }\n\n return server;\n}\n"],"mappings":"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","names":[]}
@@ -1,4 +1,4 @@
1
- export { E as ExactDirectTezosPayload, b as FA2TransferParam, F as FacilitatorTezosSigner, a as TezosOperationResult, T as TezosSigner, d as isTezosNetwork, c as isValidOperationHash, i as isValidTezosAddress } from './types-DQMtUOa_.js';
1
+ export { E as ExactDirectTezosPayload, F as FA2TransferParam, a as FacilitatorTezosSigner, T as TezosOperationResult, b as TezosSigner, i as isTezosNetwork, c as isValidOperationHash, d as isValidTezosAddress } from './types-mwNZibpp.js';
2
2
  import '@t402/core/types';
3
3
 
4
4
  /**
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/index.ts","../../src/constants.ts","../../src/types.ts","../../src/tokens.ts","../../src/utils.ts"],"sourcesContent":["/**\n * @t402/tezos - Tezos (FA2) mechanism for T402 payment protocol\n *\n * This package provides client, server, and facilitator implementations\n * for processing USDT payments on Tezos using the FA2 token standard (TZIP-12).\n *\n * @example\n * ```typescript\n * // Client usage\n * import { registerExactDirectTezosClient } from \"@t402/tezos/exact-direct/client\";\n *\n * // Server usage\n * import { registerExactDirectTezosServer } from \"@t402/tezos/exact-direct/server\";\n *\n * // Facilitator usage\n * import { registerExactDirectTezosFacilitator } from \"@t402/tezos/exact-direct/facilitator\";\n * ```\n *\n * @packageDocumentation\n */\n\n// Constants\nexport * from \"./constants.js\";\n\n// Types\nexport * from \"./types.js\";\n\n// Tokens\nexport * from \"./tokens.js\";\n\n// Utilities\nexport * from \"./utils.js\";\n","/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,sBAAsB;AAG5B,IAAM,wBAAwB;AAG9B,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAG7B,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAG7B,IAAM,0BAA0B;AAChC,IAAM,2BAA2B;AAGjC,IAAM,0BAA0B;AAChC,IAAM,4BAA4B;AAClC,IAAM,kCAAkC;AAGxC,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AACF;AAGO,IAAM,kBAOT;AAAA,EACF,CAAC,mBAAmB,GAAG;AAAA,IACrB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,CAAC,oBAAoB,GAAG;AAAA,IACtB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AACF;;;ACoFO,SAAS,oBAAoB,SAA0B;AAC5D,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,gBAAgB;AACtB,MAAI,CAAC,cAAc,KAAK,OAAO,EAAG,QAAO;AAEzC,SAAO,QAAQ,WAAW;AAC5B;AAKO,SAAS,qBAAqB,QAAyB;AAC5D,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,OAAO,WAAW,GAAG,KAAK,OAAO,WAAW;AACrD;AAKO,SAAS,eAAe,SAA0B;AACvD,SAAO,QAAQ,WAAW,QAAQ;AACpC;;;ACtIO,IAAM,eAA4B;AAAA,EACvC,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,UAAU;AACZ;AAKO,IAAM,iBAAgD;AAAA,EAC3D,CAAC,mBAAmB,GAAG,CAAC,YAAY;AAAA,EACpC,CAAC,oBAAoB,GAAG,CAAC;AAC3B;AAKO,IAAM,iBAA0D;AAAA,EACrE,CAAC,mBAAmB,GAAG;AAAA,EACvB,CAAC,oBAAoB,GAAG;AAC1B;AAKO,SAAS,iBACd,SACA,QACyB;AACzB,QAAM,SAAS,eAAe,OAAO;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO;AAAA,IACZ,CAAC,MAAM,EAAE,OAAO,YAAY,MAAM,OAAO,YAAY;AAAA,EACvD;AACF;AAKO,SAAS,mBACd,SACA,iBACA,SACyB;AACzB,QAAM,SAAS,eAAe,OAAO;AACrC,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,OAAO;AAAA,IACZ,CAAC,MACC,EAAE,gBAAgB,YAAY,MAAM,gBAAgB,YAAY,KAChE,EAAE,YAAY;AAAA,EAClB;AACF;AAKO,SAAS,gBAAgB,SAA0C;AACxE,SAAO,eAAe,OAAO;AAC/B;;;ACxEO,SAAS,iBAAiB,SAAiB;AAChD,SAAO,gBAAgB,OAAO;AAChC;AAKO,SAAS,mBAAmB,SAA0B;AAC3D,SAAQ,mBAAyC,SAAS,OAAO;AACnE;AAKO,SAAS,eAAe,SAGtB;AACP,QAAM,QAAQ,QAAQ,MAAM,GAAG;AAC/B,MAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,SAAO;AAAA,IACL,WAAW,MAAM,CAAC;AAAA,IAClB,WAAW,MAAM,CAAC;AAAA,EACpB;AACF;AAKO,SAAS,eAAe,WAA2B;AACxD,SAAO,GAAG,qBAAqB,IAAI,SAAS;AAC9C;AAKO,SAAS,cAAc,SAAqC;AACjE,SAAO,gBAAgB,OAAO,GAAG;AACnC;AAKO,SAAS,UAAU,SAAqC;AAC7D,SAAO,gBAAgB,OAAO,GAAG;AACnC;AAKO,SAAS,iBAAiB,OAAe,OAAwB;AACtE,MAAI,CAAC,SAAS,CAAC,MAAO,QAAO;AAC7B,SAAO,UAAU;AACnB;AAKO,SAAS,aAAa,QAAgB,UAA0B;AACrE,QAAM,UAAU,OAAO,MAAM,QAAQ;AACrC,QAAM,YAAY,SAAS;AAC3B,QAAM,iBAAiB,SAAS;AAChC,QAAM,gBAAgB,eAAe,SAAS,EAAE,SAAS,UAAU,GAAG;AACtE,SAAO,GAAG,SAAS,IAAI,aAAa;AACtC;AAKO,SAAS,YAAY,QAAgB,UAA0B;AACpE,QAAM,CAAC,OAAO,aAAa,EAAE,IAAI,OAAO,MAAM,GAAG;AACjD,QAAM,mBAAmB,WAAW,OAAO,UAAU,GAAG,EAAE,MAAM,GAAG,QAAQ;AAC3E,SAAO,OAAO,QAAQ,gBAAgB;AACxC;AAKO,SAAS,0BACd,WAMO;AACP,MAAI,CAAC,aAAa,CAAC,MAAM,QAAQ,SAAS,EAAG,QAAO;AAGpD,QAAM,gBAAgB,UAAU,CAAC;AACjC,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,SAAU,QAAO;AAEhE,QAAM,WAAW;AACjB,QAAM,OAAO,SAAS;AACtB,QAAM,MAAM,SAAS;AAMrB,MAAI,CAAC,QAAQ,CAAC,MAAM,QAAQ,GAAG,KAAK,IAAI,WAAW,EAAG,QAAO;AAE7D,QAAM,UAAU,IAAI,CAAC;AACrB,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO;AAAA,IACL;AAAA,IACA,IAAI,QAAQ;AAAA,IACZ,SACE,OAAO,QAAQ,aAAa,WACxB,SAAS,QAAQ,UAAU,EAAE,IAC7B,QAAQ;AAAA,IACd,QAAQ,OAAO,QAAQ,MAAM;AAAA,EAC/B;AACF;","names":[]}
@@ -122,4 +122,4 @@ declare function isValidOperationHash(opHash: string): boolean;
122
122
  */
123
123
  declare function isTezosNetwork(network: string): boolean;
124
124
 
125
- export { type ExactDirectTezosPayload as E, type FacilitatorTezosSigner as F, type TezosSigner as T, type TezosOperationResult as a, type FA2TransferParam as b, isValidOperationHash as c, isTezosNetwork as d, isValidTezosAddress as i };
125
+ export { type ExactDirectTezosPayload as E, type FA2TransferParam as F, type TezosOperationResult as T, type FacilitatorTezosSigner as a, type TezosSigner as b, isValidOperationHash as c, isValidTezosAddress as d, isTezosNetwork as i };
@@ -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 SCHEME_EXACT_DIRECT = "exact-direct";
3
7
  var TEZOS_CAIP2_NAMESPACE = "tezos";
@@ -133,38 +137,40 @@ function extractFA2TransferDetails(parameter) {
133
137
  amount: String(firstTx.amount)
134
138
  };
135
139
  }
140
+
136
141
  export {
137
- DEFAULT_GHOSTNET_INDEXER,
142
+ __publicField,
143
+ SCHEME_EXACT_DIRECT,
144
+ TEZOS_CAIP2_NAMESPACE,
145
+ TEZOS_MAINNET_CAIP2,
146
+ TEZOS_GHOSTNET_CAIP2,
147
+ DEFAULT_MAINNET_RPC,
138
148
  DEFAULT_GHOSTNET_RPC,
139
149
  DEFAULT_MAINNET_INDEXER,
140
- DEFAULT_MAINNET_RPC,
141
- DEFAULT_TOKENS,
142
- FA2_BALANCE_OF_ENTRYPOINT,
150
+ DEFAULT_GHOSTNET_INDEXER,
143
151
  FA2_TRANSFER_ENTRYPOINT,
152
+ FA2_BALANCE_OF_ENTRYPOINT,
144
153
  FA2_UPDATE_OPERATORS_ENTRYPOINT,
145
- NETWORK_CONFIGS,
146
- SCHEME_EXACT_DIRECT,
147
154
  SUPPORTED_NETWORKS,
148
- TEZOS_CAIP2_NAMESPACE,
149
- TEZOS_GHOSTNET_CAIP2,
150
- TEZOS_MAINNET_CAIP2,
151
- TOKEN_REGISTRY,
155
+ NETWORK_CONFIGS,
156
+ isValidTezosAddress,
157
+ isValidOperationHash,
158
+ isTezosNetwork,
152
159
  USDT_MAINNET,
153
- buildNetworkId,
154
- compareAddresses,
155
- extractFA2TransferDetails,
156
- formatAmount,
160
+ TOKEN_REGISTRY,
161
+ DEFAULT_TOKENS,
162
+ getTokenBySymbol,
163
+ getTokenByContract,
157
164
  getDefaultToken,
158
- getIndexerUrl,
159
165
  getNetworkConfig,
160
- getRpcUrl,
161
- getTokenByContract,
162
- getTokenBySymbol,
163
166
  isSupportedNetwork,
164
- isTezosNetwork,
165
- isValidOperationHash,
166
- isValidTezosAddress,
167
+ parseNetworkId,
168
+ buildNetworkId,
169
+ getIndexerUrl,
170
+ getRpcUrl,
171
+ compareAddresses,
172
+ formatAmount,
167
173
  parseAmount,
168
- parseNetworkId
174
+ extractFA2TransferDetails
169
175
  };
170
- //# sourceMappingURL=index.mjs.map
176
+ //# sourceMappingURL=chunk-6MWWSQK7.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/constants.ts","../../src/types.ts","../../src/tokens.ts","../../src/utils.ts"],"sourcesContent":["/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n"],"mappings":"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","names":[]}
@@ -1,5 +1,5 @@
1
1
  import { SchemeNetworkClient, PaymentRequirements, PaymentPayload, Network } from '@t402/core/types';
2
- import { T as TezosSigner } from '../../types-DQMtUOa_.cjs';
2
+ import { b as TezosSigner } from '../../types-mwNZibpp.mjs';
3
3
  import { t402Client } from '@t402/core/client';
4
4
 
5
5
  /**
@@ -1,70 +1,19 @@
1
- // src/constants.ts
2
- var SCHEME_EXACT_DIRECT = "exact-direct";
3
- var TEZOS_CAIP2_NAMESPACE = "tezos";
4
- var TEZOS_MAINNET_CAIP2 = "tezos:NetXdQprcVkpaWU";
5
- var TEZOS_GHOSTNET_CAIP2 = "tezos:NetXnHfVqm9iesp";
6
- var DEFAULT_MAINNET_RPC = "https://mainnet.api.tez.ie";
7
- var DEFAULT_GHOSTNET_RPC = "https://ghostnet.tezos.marigold.dev";
8
- var DEFAULT_MAINNET_INDEXER = "https://api.tzkt.io";
9
- var DEFAULT_GHOSTNET_INDEXER = "https://api.ghostnet.tzkt.io";
10
- var NETWORK_CONFIGS = {
11
- [TEZOS_MAINNET_CAIP2]: {
12
- name: "Tezos Mainnet",
13
- rpcUrl: DEFAULT_MAINNET_RPC,
14
- indexerUrl: DEFAULT_MAINNET_INDEXER
15
- },
16
- [TEZOS_GHOSTNET_CAIP2]: {
17
- name: "Tezos Ghostnet",
18
- rpcUrl: DEFAULT_GHOSTNET_RPC,
19
- indexerUrl: DEFAULT_GHOSTNET_INDEXER
20
- }
21
- };
22
-
23
- // src/types.ts
24
- function isValidTezosAddress(address) {
25
- if (!address) return false;
26
- const prefixPattern = /^(tz1|tz2|tz3|KT1)/;
27
- if (!prefixPattern.test(address)) return false;
28
- return address.length === 36;
29
- }
30
-
31
- // src/tokens.ts
32
- var USDT_MAINNET = {
33
- contractAddress: "KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o",
34
- tokenId: 0,
35
- symbol: "USDt",
36
- name: "Tether USD",
37
- decimals: 6
38
- };
39
- var TOKEN_REGISTRY = {
40
- [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],
41
- [TEZOS_GHOSTNET_CAIP2]: []
42
- };
43
- var DEFAULT_TOKENS = {
44
- [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,
45
- [TEZOS_GHOSTNET_CAIP2]: void 0
46
- };
47
- function getTokenBySymbol(network, symbol) {
48
- const tokens = TOKEN_REGISTRY[network];
49
- if (!tokens) return void 0;
50
- return tokens.find(
51
- (t) => t.symbol.toLowerCase() === symbol.toLowerCase()
52
- );
53
- }
54
-
55
- // src/utils.ts
56
- function compareAddresses(addr1, addr2) {
57
- if (!addr1 || !addr2) return false;
58
- return addr1 === addr2;
59
- }
1
+ import {
2
+ SCHEME_EXACT_DIRECT,
3
+ TEZOS_CAIP2_NAMESPACE,
4
+ __publicField,
5
+ compareAddresses,
6
+ getTokenBySymbol,
7
+ isValidTezosAddress
8
+ } from "../../chunk-6MWWSQK7.mjs";
60
9
 
61
10
  // src/exact-direct/client/scheme.ts
62
11
  var ExactDirectTezosClient = class {
63
12
  constructor(signer, config = {}) {
64
13
  this.signer = signer;
14
+ __publicField(this, "scheme", SCHEME_EXACT_DIRECT);
65
15
  void config;
66
16
  }
67
- scheme = SCHEME_EXACT_DIRECT;
68
17
  /**
69
18
  * Create a payment payload by executing the transfer
70
19
  */
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/exact-direct/client/scheme.ts","../../../../src/exact-direct/client/register.ts"],"sourcesContent":["/**\n * Tezos Exact-Direct Client Scheme\n *\n * The client executes the FA2 transfer directly and provides\n * the operation hash as proof of payment.\n */\n\nimport type {\n SchemeNetworkClient,\n PaymentPayload,\n PaymentRequirements,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT, TEZOS_CAIP2_NAMESPACE } from \"../../constants.js\";\nimport type { TezosSigner, ExactDirectTezosPayload } from \"../../types.js\";\nimport { isValidTezosAddress } from \"../../types.js\";\nimport { getTokenBySymbol } from \"../../tokens.js\";\nimport { compareAddresses } from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectTezosClient\n */\nexport interface ExactDirectTezosClientConfig {\n /**\n * Whether to verify the operation was successful before returning\n * @default true\n */\n verifyOperation?: boolean;\n}\n\n/**\n * Tezos Exact-Direct Client\n *\n * Implements the client-side payment flow where the client:\n * 1. Receives payment requirements\n * 2. Executes the FA2 transfer operation\n * 3. Returns operation hash as proof\n */\nexport class ExactDirectTezosClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n\n constructor(\n private readonly signer: TezosSigner,\n config: ExactDirectTezosClientConfig = {},\n ) {\n // Config reserved for future use\n void config;\n }\n\n /**\n * Create a payment payload by executing the transfer\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Validate requirements\n this.validateRequirements(paymentRequirements);\n\n // Get sender address\n const from = await this.signer.getAddress();\n\n // Parse asset to get contract address and token ID\n const assetInfo = this.parseAssetIdentifier(paymentRequirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset identifier: ${paymentRequirements.asset}`);\n }\n\n // Get amount\n const amount = BigInt(paymentRequirements.amount);\n\n // Check balance\n const balance = await this.signer.getBalance(\n assetInfo.contractAddress,\n assetInfo.tokenId,\n );\n if (balance < amount) {\n throw new Error(\n `Insufficient balance: have ${balance}, need ${amount}`,\n );\n }\n\n // Execute transfer\n const opHash = await this.signer.transfer(\n assetInfo.contractAddress,\n assetInfo.tokenId,\n paymentRequirements.payTo,\n amount,\n );\n\n // Create payload\n const payload: ExactDirectTezosPayload = {\n opHash,\n from,\n to: paymentRequirements.payTo,\n amount: paymentRequirements.amount,\n contractAddress: assetInfo.contractAddress,\n tokenId: assetInfo.tokenId,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n\n /**\n * Parse CAIP-19 asset identifier for Tezos FA2\n * Format: tezos:{chainRef}/fa2:{contractAddress}/{tokenId}\n */\n private parseAssetIdentifier(\n asset: string,\n ): { contractAddress: string; tokenId: number } | null {\n // Try parsing CAIP-19 format\n const caipMatch = asset.match(/^tezos:[^/]+\\/fa2:([^/]+)\\/(\\d+)$/);\n if (caipMatch) {\n return {\n contractAddress: caipMatch[1],\n tokenId: parseInt(caipMatch[2], 10),\n };\n }\n\n // Try simple format: contractAddress/tokenId or just contractAddress (default tokenId 0)\n const simpleMatch = asset.match(/^(KT1[a-zA-Z0-9]+)(?:\\/(\\d+))?$/);\n if (simpleMatch) {\n return {\n contractAddress: simpleMatch[1],\n tokenId: simpleMatch[2] ? parseInt(simpleMatch[2], 10) : 0,\n };\n }\n\n return null;\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(`${TEZOS_CAIP2_NAMESPACE}:`)) {\n throw new Error(`Invalid network: ${requirements.network}`);\n }\n\n // Check payTo address\n if (!isValidTezosAddress(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 // Check asset\n const assetInfo = this.parseAssetIdentifier(requirements.asset);\n if (!assetInfo) {\n throw new Error(`Invalid asset: ${requirements.asset}`);\n }\n\n // Verify token is supported (warn for unknown tokens)\n const tokenConfig = getTokenBySymbol(requirements.network, \"USDt\");\n if (tokenConfig && !compareAddresses(tokenConfig.contractAddress, assetInfo.contractAddress)) {\n console.warn(\n `Using non-standard token: ${assetInfo.contractAddress}`,\n );\n }\n }\n}\n\nexport default ExactDirectTezosClient;\n","/**\n * Registration function for Tezos Exact-Direct client\n */\n\nimport { t402Client } from \"@t402/core/client\";\nimport type { Network } from \"@t402/core/types\";\nimport type { TezosSigner } from \"../../types.js\";\nimport {\n ExactDirectTezosClient,\n type ExactDirectTezosClientConfig,\n} from \"./scheme.js\";\n\n/**\n * Configuration options for registering Tezos schemes to a t402Client\n */\nexport interface TezosClientConfig {\n /**\n * The Tezos signer for payment operations\n */\n signer: TezosSigner;\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (tezos:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectTezosClientConfig;\n}\n\n/**\n * Registers Tezos exact-direct payment scheme to a t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for Tezos client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectTezosClient } from \"@t402/tezos/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectTezosClient(client, {\n * signer: myTezosSigner,\n * networks: [\"tezos:NetXdQprcVkpaWU\"]\n * });\n * ```\n */\nexport function registerExactDirectTezosClient(\n client: t402Client,\n config: TezosClientConfig,\n): t402Client {\n const scheme = new ExactDirectTezosClient(config.signer, config.schemeConfig);\n\n // Register scheme\n if (config.networks && config.networks.length > 0) {\n // Register specific networks\n config.networks.forEach((network) => {\n client.register(network, scheme);\n });\n } else {\n // Register wildcard for all Tezos networks\n client.register(\"tezos:*\", scheme);\n }\n\n return client;\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 FacilitatorTezosSigner } from '../../types-DQMtUOa_.cjs';
2
+ import { a as FacilitatorTezosSigner } from '../../types-mwNZibpp.mjs';
3
3
  import { t402Facilitator } from '@t402/core/facilitator';
4
4
 
5
5
  /**