@t402/near 2.3.1 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -1
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.js +13 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/upto/index.d.ts +81 -0
- package/dist/cjs/upto/index.js +41 -0
- package/dist/cjs/upto/index.js.map +1 -0
- package/dist/esm/chunk-BYL5JL2F.mjs +15 -0
- package/dist/esm/chunk-BYL5JL2F.mjs.map +1 -0
- package/dist/esm/index.d.mts +1 -0
- package/dist/esm/index.mjs +4 -0
- package/dist/esm/upto/index.d.mts +81 -0
- package/dist/esm/upto/index.mjs +7 -0
- package/dist/esm/upto/index.mjs.map +1 -0
- package/package.json +14 -4
package/README.md
CHANGED
|
@@ -169,5 +169,12 @@ pnpm lint
|
|
|
169
169
|
|
|
170
170
|
- `@t402/core` - Core protocol types and client
|
|
171
171
|
- `@t402/fetch` - HTTP wrapper with automatic payment handling
|
|
172
|
-
- `@t402/evm` - EVM
|
|
172
|
+
- `@t402/evm` - EVM implementation
|
|
173
|
+
- `@t402/svm` - Solana implementation
|
|
174
|
+
- `@t402/ton` - TON implementation
|
|
175
|
+
- `@t402/tron` - TRON implementation
|
|
173
176
|
- `@t402/aptos` - Aptos implementation
|
|
177
|
+
- `@t402/tezos` - Tezos implementation
|
|
178
|
+
- `@t402/polkadot` - Polkadot Asset Hub implementation
|
|
179
|
+
- `@t402/stacks` - Stacks implementation
|
|
180
|
+
- `@t402/cosmos` - Cosmos (Noble) implementation
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { C as ClientNearSigner, E as ExactDirectNearPayload, f as FacilitatorNea
|
|
|
3
3
|
export { ExactDirectNearClient, ExactDirectNearClientConfig, NearClientConfig, registerExactDirectNearClient } from './exact-direct/client/index.js';
|
|
4
4
|
export { ExactDirectNearServer, ExactDirectNearServerConfig, NearResourceServerConfig, registerExactDirectNearServer } from './exact-direct/server/index.js';
|
|
5
5
|
export { ExactDirectNearFacilitator, ExactDirectNearFacilitatorConfig, NearFacilitatorConfig, registerExactDirectNearFacilitator } from './exact-direct/facilitator/index.js';
|
|
6
|
+
export { UptoNearAuthorization, UptoNearExtra, UptoNearPayload, UptoNearSettlement, isUptoNearPayload } from './upto/index.js';
|
|
6
7
|
import '@t402/core/types';
|
|
7
8
|
import '@t402/core/client';
|
|
8
9
|
import '@t402/core/server';
|
package/dist/cjs/index.js
CHANGED
|
@@ -52,6 +52,7 @@ __export(src_exports, {
|
|
|
52
52
|
getTokenConfig: () => getTokenConfig,
|
|
53
53
|
isNetworkSupported: () => isNetworkSupported,
|
|
54
54
|
isTransactionSuccessful: () => isTransactionSuccessful,
|
|
55
|
+
isUptoNearPayload: () => isUptoNearPayload,
|
|
55
56
|
isValidAccountId: () => isValidAccountId,
|
|
56
57
|
normalizeNetwork: () => normalizeNetwork,
|
|
57
58
|
parseFtTransferArgs: () => parseFtTransferArgs,
|
|
@@ -663,6 +664,17 @@ function registerExactDirectNearFacilitator(facilitator, config) {
|
|
|
663
664
|
facilitator.register(config.networks, scheme);
|
|
664
665
|
return facilitator;
|
|
665
666
|
}
|
|
667
|
+
|
|
668
|
+
// src/upto/types.ts
|
|
669
|
+
function isUptoNearPayload(data) {
|
|
670
|
+
if (typeof data !== "object" || data === null) return false;
|
|
671
|
+
const p = data;
|
|
672
|
+
if (typeof p.txHash !== "string" || !p.txHash) return false;
|
|
673
|
+
if (typeof p.paymentNonce !== "string" || !p.paymentNonce) return false;
|
|
674
|
+
if (typeof p.authorization !== "object" || p.authorization === null) return false;
|
|
675
|
+
const auth = p.authorization;
|
|
676
|
+
return typeof auth.from === "string" && typeof auth.facilitator === "string" && typeof auth.tokenContract === "string" && typeof auth.maxAmount === "string" && !!auth.from && !!auth.facilitator;
|
|
677
|
+
}
|
|
666
678
|
// Annotate the CommonJS export names for ESM import in node:
|
|
667
679
|
0 && (module.exports = {
|
|
668
680
|
DEFAULT_FT_TRANSFER_GAS,
|
|
@@ -697,6 +709,7 @@ function registerExactDirectNearFacilitator(facilitator, config) {
|
|
|
697
709
|
getTokenConfig,
|
|
698
710
|
isNetworkSupported,
|
|
699
711
|
isTransactionSuccessful,
|
|
712
|
+
isUptoNearPayload,
|
|
700
713
|
isValidAccountId,
|
|
701
714
|
normalizeNetwork,
|
|
702
715
|
parseFtTransferArgs,
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/constants.ts","../../src/tokens.ts","../../src/utils.ts","../../src/exact-direct/client/scheme.ts","../../src/exact-direct/client/register.ts","../../src/exact-direct/server/scheme.ts","../../src/exact-direct/server/register.ts","../../src/exact-direct/facilitator/scheme.ts","../../src/exact-direct/facilitator/register.ts"],"sourcesContent":["/**\n * @t402/near - NEAR Protocol Implementation for T402\n *\n * This package provides NEAR blockchain support for the T402 payment protocol.\n * It implements the exact-direct scheme using NEP-141 (fungible token standard).\n *\n * @example\n * ```typescript\n * // Client usage\n * import { ExactDirectNearScheme } from '@t402/near/exact-direct/client';\n *\n * const client = new ExactDirectNearScheme(signer);\n * const payload = await client.createPaymentPayload(2, requirements);\n *\n * // Server usage\n * import { ExactDirectNearScheme } from '@t402/near/exact-direct/server';\n *\n * const server = new ExactDirectNearScheme();\n * const assetAmount = await server.parsePrice(1.50, 'near:mainnet');\n * ```\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// Exact-Direct scheme exports\nexport * from \"./exact-direct/index.js\";\n","/**\n * NEAR Network Constants\n *\n * This module provides constants for NEAR blockchain integration including:\n * - CAIP-2 network identifiers\n * - RPC endpoints\n * - NEP-141 function names\n * - Default gas amounts\n */\n\n/**\n * CAIP-2 Network Identifiers for NEAR\n */\nexport const NEAR_MAINNET_CAIP2 = \"near:mainnet\";\nexport const NEAR_TESTNET_CAIP2 = \"near:testnet\";\n\n/**\n * Supported NEAR networks\n */\nexport const NEAR_NETWORKS = [NEAR_MAINNET_CAIP2, NEAR_TESTNET_CAIP2] as const;\n\nexport type NearNetwork = (typeof NEAR_NETWORKS)[number];\n\n/**\n * NEAR network IDs (for wallet connection)\n */\nexport const NEAR_NETWORK_IDS: Record<string, string> = {\n [NEAR_MAINNET_CAIP2]: \"mainnet\",\n [NEAR_TESTNET_CAIP2]: \"testnet\",\n};\n\n/**\n * Default RPC endpoints\n */\nexport const NEAR_MAINNET_RPC = \"https://rpc.mainnet.near.org\";\nexport const NEAR_TESTNET_RPC = \"https://rpc.testnet.near.org\";\n\n/**\n * Network RPC endpoint mapping\n */\nexport const NETWORK_RPC_ENDPOINTS: Record<string, string> = {\n [NEAR_MAINNET_CAIP2]: NEAR_MAINNET_RPC,\n [NEAR_TESTNET_CAIP2]: NEAR_TESTNET_RPC,\n};\n\n/**\n * NEP-141 Fungible Token Standard function names\n * @see https://nomicon.io/Standards/Tokens/FungibleToken/Core\n */\nexport const NEP141_FT_TRANSFER = \"ft_transfer\";\nexport const NEP141_FT_BALANCE_OF = \"ft_balance_of\";\nexport const NEP141_STORAGE_DEPOSIT = \"storage_deposit\";\nexport const NEP141_STORAGE_BALANCE_OF = \"storage_balance_of\";\n\n/**\n * Default gas amounts for NEP-141 transfers\n * NEAR gas is measured in TGas (1 TGas = 10^12 gas)\n */\nexport const DEFAULT_FT_TRANSFER_GAS = \"30000000000000\"; // 30 TGas\nexport const DEFAULT_STORAGE_DEPOSIT_GAS = \"10000000000000\"; // 10 TGas\n\n/**\n * Required deposits for NEP-141 operations\n * ft_transfer requires 1 yoctoNEAR attached deposit\n */\nexport const FT_TRANSFER_DEPOSIT = \"1\"; // 1 yoctoNEAR\nexport const DEFAULT_STORAGE_DEPOSIT = \"1250000000000000000000\"; // 0.00125 NEAR\n\n/**\n * Scheme identifier for exact-direct payments\n */\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n/**\n * Default timeout for payment validity (in seconds)\n */\nexport const DEFAULT_VALIDITY_DURATION = 3600; // 1 hour\n\n/**\n * Maximum transaction age to accept (in milliseconds)\n */\nexport const MAX_TRANSACTION_AGE = 5 * 60 * 1000; // 5 minutes\n\n/**\n * CAIP-2 namespace for NEAR\n */\nexport const NEAR_CAIP2_NAMESPACE = \"near\";\n","/**\n * NEAR Token Registry\n *\n * Defines supported tokens (NEP-141 fungible tokens) for each NEAR network.\n */\n\nimport { NEAR_MAINNET_CAIP2, NEAR_TESTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration\n */\nexport interface TokenConfig {\n /** Contract address/account ID */\n contractId: string;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n /** Priority for selection (lower = higher priority) */\n priority: number;\n}\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [NEAR_MAINNET_CAIP2]: [\n {\n // USDC on NEAR (Rainbow Bridge)\n contractId: \"17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n priority: 1,\n },\n {\n // USDT on NEAR\n contractId: \"usdt.tether-token.near\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n priority: 2,\n },\n ],\n [NEAR_TESTNET_CAIP2]: [\n {\n // Fake USDC on testnet\n contractId: \"usdc.fakes.testnet\",\n symbol: \"USDC\",\n name: \"USD Coin (Testnet)\",\n decimals: 6,\n priority: 1,\n },\n ],\n};\n\n/**\n * Get token configuration by symbol\n * @param network - CAIP-2 network identifier\n * @param symbol - Token symbol (e.g., \"USDC\")\n * @returns Token configuration or undefined\n */\nexport function getTokenConfig(network: string, symbol: string): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find((t) => t.symbol.toUpperCase() === symbol.toUpperCase());\n}\n\n/**\n * Get token configuration by contract ID\n * @param network - CAIP-2 network identifier\n * @param contractId - Token contract account ID\n * @returns Token configuration or undefined\n */\nexport function getTokenByContract(network: string, contractId: string): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find((t) => t.contractId === contractId);\n}\n\n/**\n * Get the default token for a network\n * Returns the token with highest priority (lowest priority number)\n * @param network - CAIP-2 network identifier\n * @returns Default token configuration or undefined\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens || tokens.length === 0) return undefined;\n return [...tokens].sort((a, b) => a.priority - b.priority)[0];\n}\n\n/**\n * Get all tokens for a network\n * @param network - CAIP-2 network identifier\n * @returns Array of token configurations\n */\nexport function getNetworkTokens(network: string): TokenConfig[] {\n return TOKEN_REGISTRY[network] || [];\n}\n\n/**\n * Check if a network is supported\n * @param network - CAIP-2 network identifier\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n}\n","/**\n * NEAR Utility Functions\n *\n * Helper functions for NEAR address validation, network normalization,\n * and RPC interactions.\n */\n\nimport { NEAR_CAIP2_NAMESPACE, NETWORK_RPC_ENDPOINTS, type NearNetwork } from \"./constants.js\";\nimport type {\n NearRpcRequest,\n NearRpcResponse,\n TransactionResult,\n FtTransferArgs,\n} from \"./types.js\";\n\n/**\n * Normalize a network identifier to CAIP-2 format\n * @param network - Network identifier (e.g., \"mainnet\", \"near:mainnet\")\n * @returns CAIP-2 formatted network identifier\n */\nexport function normalizeNetwork(network: string): NearNetwork {\n // Already in CAIP-2 format\n if (network.startsWith(`${NEAR_CAIP2_NAMESPACE}:`)) {\n return network as NearNetwork;\n }\n // Convert shorthand to CAIP-2\n return `${NEAR_CAIP2_NAMESPACE}:${network}` as NearNetwork;\n}\n\n/**\n * Extract network ID from CAIP-2 identifier\n * @param network - CAIP-2 network identifier\n * @returns Network ID (e.g., \"mainnet\")\n */\nexport function extractNetworkId(network: string): string {\n if (network.includes(\":\")) {\n return network.split(\":\")[1];\n }\n return network;\n}\n\n/**\n * Validate a NEAR account ID\n * NEAR account IDs must:\n * - Be 2-64 characters\n * - Contain only lowercase alphanumeric, underscores, hyphens\n * - Not start with a hyphen or underscore\n * @param accountId - Account ID to validate\n * @returns Whether the account ID is valid\n */\nexport function isValidAccountId(accountId: string): boolean {\n if (!accountId || accountId.length < 2 || accountId.length > 64) {\n return false;\n }\n // NEAR account ID regex\n const regex = /^[a-z0-9]([a-z0-9_-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9_-]*[a-z0-9])?)*$/;\n return regex.test(accountId);\n}\n\n/**\n * Get RPC endpoint for a network\n * @param network - CAIP-2 network identifier\n * @returns RPC endpoint URL\n */\nexport function getRpcEndpoint(network: string): string {\n const normalizedNetwork = normalizeNetwork(network);\n return NETWORK_RPC_ENDPOINTS[normalizedNetwork] || NETWORK_RPC_ENDPOINTS[\"near:mainnet\"];\n}\n\n/**\n * Make a JSON-RPC call to NEAR\n * @param network - CAIP-2 network identifier\n * @param method - RPC method name\n * @param params - Method parameters\n * @returns RPC response result\n */\nexport async function rpcCall<T>(\n network: string,\n method: string,\n params: NearRpcRequest[\"params\"],\n): Promise<T> {\n const endpoint = getRpcEndpoint(network);\n\n const request: NearRpcRequest = {\n jsonrpc: \"2.0\",\n id: `t402-${Date.now()}`,\n method,\n params,\n };\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n\n const data = (await response.json()) as NearRpcResponse<T>;\n\n if (data.error) {\n throw new Error(`NEAR RPC error: ${data.error.message}`);\n }\n\n return data.result as T;\n}\n\n/**\n * Query a transaction by hash\n * @param network - CAIP-2 network identifier\n * @param txHash - Transaction hash\n * @param senderAccountId - Sender account ID\n * @returns Transaction result\n */\nexport async function queryTransaction(\n network: string,\n txHash: string,\n senderAccountId: string,\n): Promise<TransactionResult> {\n return rpcCall<TransactionResult>(network, \"tx\", [txHash, senderAccountId]);\n}\n\n/**\n * Query token balance\n * @param network - CAIP-2 network identifier\n * @param accountId - Account to query\n * @param tokenContract - Token contract address\n * @returns Balance as bigint\n */\nexport async function queryTokenBalance(\n network: string,\n accountId: string,\n tokenContract: string,\n): Promise<bigint> {\n try {\n const result = await rpcCall<{ result: number[] }>(network, \"query\", {\n request_type: \"call_function\",\n finality: \"final\",\n account_id: tokenContract,\n method_name: \"ft_balance_of\",\n args_base64: btoa(JSON.stringify({ account_id: accountId })),\n });\n\n // Result is a byte array representing the JSON response\n const bytes = new Uint8Array(result.result);\n const text = new TextDecoder().decode(bytes);\n // Remove quotes from JSON string response\n const balance = text.replace(/\"/g, \"\");\n return BigInt(balance);\n } catch (error) {\n console.error(\"Error fetching token balance:\", error);\n return 0n;\n }\n}\n\n/**\n * Parse ft_transfer args from base64 encoded string\n * @param argsBase64 - Base64 encoded JSON arguments\n * @returns Parsed ft_transfer arguments\n */\nexport function parseFtTransferArgs(argsBase64: string): FtTransferArgs | null {\n try {\n const argsJson = atob(argsBase64);\n return JSON.parse(argsJson) as FtTransferArgs;\n } catch {\n // Try parsing as raw JSON (some nodes return it differently)\n try {\n return JSON.parse(argsBase64) as FtTransferArgs;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Check if a transaction succeeded\n * @param status - Transaction status\n * @returns Whether the transaction succeeded\n */\nexport function isTransactionSuccessful(status: {\n SuccessValue?: string;\n Failure?: unknown;\n}): boolean {\n return status.SuccessValue !== undefined && status.Failure === undefined;\n}\n\n/**\n * Format amount for display (with decimals)\n * @param amount - Amount in smallest units\n * @param decimals - Number of decimal places\n * @returns Formatted amount string\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const whole = amount / divisor;\n const remainder = amount % divisor;\n const decimal = remainder.toString().padStart(decimals, \"0\").slice(0, 2);\n return `${whole}.${decimal}`;\n}\n\n/**\n * Convert decimal amount to token units\n * @param decimalAmount - Amount with decimals (e.g., \"1.50\")\n * @param decimals - Token decimals\n * @returns Amount in smallest units\n */\nexport function toTokenUnits(decimalAmount: string | number, decimals: number): bigint {\n const amount = typeof decimalAmount === \"string\" ? parseFloat(decimalAmount) : decimalAmount;\n if (isNaN(amount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n const multiplier = 10 ** decimals;\n return BigInt(Math.floor(amount * multiplier));\n}\n","/**\n * NEAR Client Scheme Implementation - Exact Direct\n *\n * Creates payment payloads for NEAR NEP-141 transfers using the exact-direct scheme.\n * In this scheme, the client executes the ft_transfer directly and provides\n * the transaction hash as proof of payment.\n */\n\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@t402/core/types\";\nimport type { ClientNearSigner, ExactDirectNearPayload } from \"../../types.js\";\nimport {\n SCHEME_EXACT_DIRECT,\n DEFAULT_FT_TRANSFER_GAS,\n FT_TRANSFER_DEPOSIT,\n} from \"../../constants.js\";\nimport { normalizeNetwork, isValidAccountId } from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectNearClient\n */\nexport interface ExactDirectNearClientConfig {\n /** Override the gas amount for ft_transfer */\n gasAmount?: string;\n /** Optional memo to include in the transfer */\n memo?: string;\n}\n\n/**\n * NEAR client implementation for the Exact-Direct payment scheme.\n *\n * Executes NEP-141 ft_transfer and returns the transaction hash as proof.\n */\nexport class ExactDirectNearClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n\n /**\n * Creates a new ExactDirectNearScheme instance.\n *\n * @param signer - The NEAR signer for client operations\n * @param config - Optional configuration overrides\n */\n constructor(\n private readonly signer: ClientNearSigner,\n private readonly config: ExactDirectNearClientConfig = {},\n ) {}\n\n /**\n * Creates a payment payload by executing the transfer.\n *\n * Unlike other schemes where the client creates a signed message for\n * the facilitator to execute, the exact-direct scheme has the client\n * execute the transfer directly. The transaction hash is then used\n * as proof of payment.\n *\n * @param t402Version - The t402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload with transaction hash\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Normalize and validate network\n normalizeNetwork(paymentRequirements.network);\n\n // Validate required fields\n if (!paymentRequirements.asset) {\n throw new Error(\"Asset (token contract address) is required\");\n }\n if (!paymentRequirements.payTo) {\n throw new Error(\"PayTo address is required\");\n }\n if (!paymentRequirements.amount) {\n throw new Error(\"Amount is required\");\n }\n\n // Validate addresses\n if (!isValidAccountId(paymentRequirements.payTo)) {\n throw new Error(`Invalid recipient account ID: ${paymentRequirements.payTo}`);\n }\n if (!isValidAccountId(this.signer.accountId)) {\n throw new Error(`Invalid sender account ID: ${this.signer.accountId}`);\n }\n\n const tokenContract = paymentRequirements.asset;\n const recipient = paymentRequirements.payTo;\n const amount = paymentRequirements.amount;\n\n // Build ft_transfer arguments\n const ftTransferArgs: Record<string, unknown> = {\n receiver_id: recipient,\n amount: amount,\n };\n\n if (this.config.memo) {\n ftTransferArgs.memo = this.config.memo;\n }\n\n // Execute the transfer\n const txHash = await this.signer.signAndSendTransaction(\n tokenContract,\n \"ft_transfer\",\n ftTransferArgs,\n this.config.gasAmount || DEFAULT_FT_TRANSFER_GAS,\n FT_TRANSFER_DEPOSIT,\n );\n\n // Build the payload\n const payload: ExactDirectNearPayload = {\n txHash,\n from: this.signer.accountId,\n to: recipient,\n amount: amount,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n}\n","/**\n * Registration function for NEAR Exact-Direct client\n */\n\nimport { t402Client, PaymentPolicy } from \"@t402/core/client\";\nimport { Network } from \"@t402/core/types\";\nimport type { ClientNearSigner } from \"../../types.js\";\nimport { ExactDirectNearClient, type ExactDirectNearClientConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering NEAR schemes to a t402Client\n */\nexport interface NearClientConfig {\n /**\n * The NEAR signer to use for creating payment payloads\n */\n signer: ClientNearSigner;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (near:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration (gas amounts, memo)\n */\n schemeConfig?: ExactDirectNearClientConfig;\n}\n\n/**\n * Registers NEAR exact-direct payment schemes to a t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for NEAR client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectNearClient } from \"@t402/near/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectNearClient(client, {\n * signer: {\n * accountId: \"alice.near\",\n * signAndSendTransaction: async (receiverId, methodName, args, gas, deposit) => {\n * // Sign and send using wallet\n * return txHash;\n * }\n * }\n * });\n * ```\n */\nexport function registerExactDirectNearClient(\n client: t402Client,\n config: NearClientConfig,\n): t402Client {\n const scheme = new ExactDirectNearClient(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 NEAR networks\n client.register(\"near:*\", scheme);\n }\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach((policy) => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * NEAR Server Scheme Implementation - Exact Direct\n *\n * Handles price parsing and payment requirement enhancement for\n * NEAR NEP-141 payments using the exact-direct scheme.\n */\n\nimport type {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT } from \"../../constants.js\";\nimport { getDefaultToken, getTokenConfig, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport { normalizeNetwork, toTokenUnits } from \"../../utils.js\";\n\n/**\n * Configuration options for ExactDirectNearServer\n */\nexport interface ExactDirectNearServerConfig {\n /** Preferred token symbol (e.g., \"USDC\"). Defaults to network's highest priority token. */\n preferredToken?: string;\n}\n\n/**\n * NEAR server implementation for the Exact-Direct payment scheme.\n * Handles price parsing and converts user-friendly amounts to token amounts.\n */\nexport class ExactDirectNearServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectNearServerConfig;\n\n constructor(config: ExactDirectNearServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n * Multiple parsers can be registered - they will be tried in registration order.\n * Each parser receives a decimal amount (e.g., 1.50 for $1.50).\n * If a parser returns null, the next parser in the chain will be tried.\n * The default parser is always the final fallback.\n *\n * @param parser - Custom function to convert amount to AssetAmount (or null to skip)\n * @returns The server instance for chaining\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectNearServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parses a price into an asset amount.\n * If price is already an AssetAmount, returns it directly.\n * If price is Money (string | number), parses to decimal and tries custom parsers.\n * Falls back to default conversion if all custom parsers return null.\n *\n * @param price - The price to parse\n * @param network - The network to use\n * @returns Promise that resolves to the parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Normalize network to CAIP-2 format\n const normalizedNetwork = normalizeNetwork(network);\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 address 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, normalizedNetwork);\n if (result !== null) {\n return result;\n }\n }\n\n // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, normalizedNetwork);\n }\n\n /**\n * Build payment requirements for this scheme/network combination.\n *\n * @param paymentRequirements - Base payment requirements with amount/asset already set\n * @param supportedKind - The supported kind from facilitator's /supported endpoint\n * @param extensionKeys - Extensions supported by the facilitator\n * @returns Enhanced payment requirements ready to be sent to clients\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 extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters to satisfy linter\n void extensionKeys;\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 * Handles formats like \"$1.50\", \"1.50\", 1.50, etc.\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 * Converts decimal amount to the preferred token on the specified network.\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 = toTokenUnits(amount, token.decimals);\n\n return {\n amount: tokenAmount.toString(),\n asset: token.contractId,\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n },\n };\n }\n\n /**\n * Get the default asset info for a network.\n * Priority: configured preferredToken > network default\n */\n private getDefaultAsset(network: Network): {\n contractId: string;\n symbol: string;\n name: string;\n decimals: number;\n } {\n // If a preferred token is configured, try to use it\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n // Use the network's default token (sorted by priority)\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n\n /**\n * Get all supported networks\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n}\n","/**\n * Registration function for NEAR Exact-Direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport { Network } from \"@t402/core/types\";\nimport { ExactDirectNearServer, type ExactDirectNearServerConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering NEAR schemes to a t402ResourceServer\n */\nexport interface NearResourceServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (near:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration (preferred token, etc.)\n */\n schemeConfig?: ExactDirectNearServerConfig;\n}\n\n/**\n * Registers NEAR exact-direct payment schemes to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for NEAR resource server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectNearServer } from \"@t402/near/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer(facilitatorClient);\n * registerExactDirectNearServer(server, {});\n *\n * // Or with specific token preference\n * registerExactDirectNearServer(server, {\n * schemeConfig: { preferredToken: \"USDT\" }\n * });\n * ```\n */\nexport function registerExactDirectNearServer(\n server: t402ResourceServer,\n config: NearResourceServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectNearServer(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 NEAR networks\n server.register(\"near:*\", scheme);\n }\n\n return server;\n}\n","/**\n * NEAR Facilitator Scheme Implementation - Exact Direct\n *\n * Verifies and settles NEAR NEP-141 payments using the exact-direct scheme.\n * The facilitator verifies that the client's transaction was successful\n * and matches the payment requirements.\n */\n\nimport type {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport type { FacilitatorNearSigner, ExactDirectNearPayload, FtTransferArgs } from \"../../types.js\";\nimport { SCHEME_EXACT_DIRECT, NEAR_CAIP2_NAMESPACE, MAX_TRANSACTION_AGE } from \"../../constants.js\";\nimport {\n normalizeNetwork,\n isTransactionSuccessful,\n parseFtTransferArgs,\n isValidAccountId,\n} from \"../../utils.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactDirectNearFacilitator\n */\nexport interface ExactDirectNearFacilitatorConfig {\n /** Maximum age of a transaction to accept (in milliseconds) */\n maxTransactionAge?: number;\n /** Duration to cache used transaction hashes (in milliseconds) */\n usedTxCacheDuration?: number;\n}\n\n/**\n * NEAR facilitator implementation for the Exact-Direct payment scheme.\n * Verifies transaction proofs and confirms payments.\n */\nexport class ExactDirectNearFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${NEAR_CAIP2_NAMESPACE}:*`;\n\n private readonly config: Required<ExactDirectNearFacilitatorConfig>;\n private usedTxs: Map<string, number> = new Map();\n\n constructor(\n private readonly signer: FacilitatorNearSigner,\n config?: ExactDirectNearFacilitatorConfig,\n ) {\n this.config = {\n maxTransactionAge: config?.maxTransactionAge ?? MAX_TRANSACTION_AGE,\n usedTxCacheDuration: config?.usedTxCacheDuration ?? 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 signer addresses for a network\n */\n getSigners(network: Network): string[] {\n return this.signer.getAddresses(network);\n }\n\n /**\n * Verify a payment payload\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const network = normalizeNetwork(requirements.network);\n\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 (normalizeNetwork(payload.accepted.network) !== network) {\n return {\n isValid: false,\n invalidReason: \"network_mismatch\",\n };\n }\n\n // Parse payload\n const nearPayload = payload.payload as ExactDirectNearPayload;\n if (!nearPayload.txHash) {\n return {\n isValid: false,\n invalidReason: \"missing_tx_hash\",\n };\n }\n if (!nearPayload.from || !isValidAccountId(nearPayload.from)) {\n return {\n isValid: false,\n invalidReason: \"invalid_from_address\",\n };\n }\n\n // Check for replay attack\n if (this.isTxUsed(nearPayload.txHash)) {\n return {\n isValid: false,\n invalidReason: \"transaction_already_used\",\n payer: nearPayload.from,\n };\n }\n\n try {\n // Query the transaction\n const tx = await this.signer.queryTransaction(nearPayload.txHash, nearPayload.from);\n\n // Check transaction succeeded\n if (!isTransactionSuccessful(tx.status)) {\n return {\n isValid: false,\n invalidReason: \"transaction_failed\",\n payer: nearPayload.from,\n };\n }\n\n // Verify the transaction was to the correct token contract\n if (tx.transaction.receiver_id !== requirements.asset) {\n return {\n isValid: false,\n invalidReason: \"wrong_token_contract\",\n payer: nearPayload.from,\n };\n }\n\n // Find and verify ft_transfer action\n let ftTransferArgs: FtTransferArgs | null = null;\n for (const action of tx.transaction.actions) {\n if (action.FunctionCall?.method_name === \"ft_transfer\") {\n ftTransferArgs = parseFtTransferArgs(action.FunctionCall.args);\n break;\n }\n }\n\n if (!ftTransferArgs) {\n return {\n isValid: false,\n invalidReason: \"no_ft_transfer_action\",\n payer: nearPayload.from,\n };\n }\n\n // Verify recipient\n if (ftTransferArgs.receiver_id !== requirements.payTo) {\n return {\n isValid: false,\n invalidReason: \"wrong_recipient\",\n payer: nearPayload.from,\n };\n }\n\n // Verify amount\n const txAmount = BigInt(ftTransferArgs.amount);\n const requiredAmount = BigInt(requirements.amount);\n if (txAmount < requiredAmount) {\n return {\n isValid: false,\n invalidReason: \"insufficient_amount\",\n payer: nearPayload.from,\n };\n }\n\n // Mark transaction as used\n this.markTxUsed(nearPayload.txHash);\n\n return {\n isValid: true,\n payer: nearPayload.from,\n };\n } catch {\n return {\n isValid: false,\n invalidReason: \"transaction_not_found\",\n payer: nearPayload.from,\n };\n }\n }\n\n /**\n * Settle a payment - for exact-direct, the transfer is already complete\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n // Verify first\n const verifyResult = await this.verify(payload, requirements);\n if (!verifyResult.isValid) {\n return {\n success: false,\n errorReason: verifyResult.invalidReason || \"verification_failed\",\n payer: verifyResult.payer,\n transaction: \"\",\n network: normalizeNetwork(requirements.network),\n };\n }\n\n const nearPayload = payload.payload as ExactDirectNearPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: nearPayload.txHash,\n network: normalizeNetwork(requirements.network),\n payer: nearPayload.from,\n };\n }\n\n /**\n * Check if a transaction has been used\n */\n private isTxUsed(txHash: string): boolean {\n return this.usedTxs.has(txHash);\n }\n\n /**\n * Mark a transaction as used\n */\n private markTxUsed(txHash: string): void {\n this.usedTxs.set(txHash, Date.now());\n }\n\n /**\n * Start the cleanup interval for used transactions\n */\n private startCleanupInterval(): void {\n setInterval(\n () => {\n const cutoff = Date.now() - this.config.usedTxCacheDuration;\n for (const [txHash, usedAt] of this.usedTxs.entries()) {\n if (usedAt < cutoff) {\n this.usedTxs.delete(txHash);\n }\n }\n },\n 60 * 60 * 1000,\n ); // Cleanup every hour\n }\n}\n","/**\n * Registration function for NEAR Exact-Direct facilitator\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport { Network } from \"@t402/core/types\";\nimport type { FacilitatorNearSigner } from \"../../types.js\";\nimport { ExactDirectNearFacilitator, type ExactDirectNearFacilitatorConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering NEAR schemes to a t402Facilitator\n */\nexport interface NearFacilitatorConfig {\n /**\n * The NEAR signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorNearSigner;\n\n /**\n * Networks to register (single network or array of networks)\n * Examples: \"near:mainnet\", [\"near:mainnet\", \"near:testnet\"]\n */\n networks: Network | Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectNearFacilitatorConfig;\n}\n\n/**\n * Registers NEAR exact-direct payment schemes to a t402Facilitator instance.\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for NEAR facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectNearFacilitator } from \"@t402/near/exact-direct/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const facilitator = new t402Facilitator();\n *\n * // Single network\n * registerExactDirectNearFacilitator(facilitator, {\n * signer: myNearSigner,\n * networks: \"near:mainnet\"\n * });\n *\n * // Multiple networks\n * registerExactDirectNearFacilitator(facilitator, {\n * signer: myNearSigner,\n * networks: [\"near:mainnet\", \"near:testnet\"]\n * });\n * ```\n */\nexport function registerExactDirectNearFacilitator(\n facilitator: t402Facilitator,\n config: NearFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactDirectNearFacilitator(config.signer, config.schemeConfig);\n\n // Register scheme with specified networks\n facilitator.register(config.networks, scheme);\n\n return facilitator;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/constants.ts","../../src/tokens.ts","../../src/utils.ts","../../src/exact-direct/client/scheme.ts","../../src/exact-direct/client/register.ts","../../src/exact-direct/server/scheme.ts","../../src/exact-direct/server/register.ts","../../src/exact-direct/facilitator/scheme.ts","../../src/exact-direct/facilitator/register.ts","../../src/upto/types.ts"],"sourcesContent":["/**\n * @t402/near - NEAR Protocol Implementation for T402\n *\n * This package provides NEAR blockchain support for the T402 payment protocol.\n * It implements the exact-direct scheme using NEP-141 (fungible token standard).\n *\n * @example\n * ```typescript\n * // Client usage\n * import { ExactDirectNearScheme } from '@t402/near/exact-direct/client';\n *\n * const client = new ExactDirectNearScheme(signer);\n * const payload = await client.createPaymentPayload(2, requirements);\n *\n * // Server usage\n * import { ExactDirectNearScheme } from '@t402/near/exact-direct/server';\n *\n * const server = new ExactDirectNearScheme();\n * const assetAmount = await server.parsePrice(1.50, 'near:mainnet');\n * ```\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// Exact-Direct scheme exports\nexport * from \"./exact-direct/index.js\";\n\n// Upto scheme exports\nexport * from \"./upto/index.js\";\n","/**\n * NEAR Network Constants\n *\n * This module provides constants for NEAR blockchain integration including:\n * - CAIP-2 network identifiers\n * - RPC endpoints\n * - NEP-141 function names\n * - Default gas amounts\n */\n\n/**\n * CAIP-2 Network Identifiers for NEAR\n */\nexport const NEAR_MAINNET_CAIP2 = \"near:mainnet\";\nexport const NEAR_TESTNET_CAIP2 = \"near:testnet\";\n\n/**\n * Supported NEAR networks\n */\nexport const NEAR_NETWORKS = [NEAR_MAINNET_CAIP2, NEAR_TESTNET_CAIP2] as const;\n\nexport type NearNetwork = (typeof NEAR_NETWORKS)[number];\n\n/**\n * NEAR network IDs (for wallet connection)\n */\nexport const NEAR_NETWORK_IDS: Record<string, string> = {\n [NEAR_MAINNET_CAIP2]: \"mainnet\",\n [NEAR_TESTNET_CAIP2]: \"testnet\",\n};\n\n/**\n * Default RPC endpoints\n */\nexport const NEAR_MAINNET_RPC = \"https://rpc.mainnet.near.org\";\nexport const NEAR_TESTNET_RPC = \"https://rpc.testnet.near.org\";\n\n/**\n * Network RPC endpoint mapping\n */\nexport const NETWORK_RPC_ENDPOINTS: Record<string, string> = {\n [NEAR_MAINNET_CAIP2]: NEAR_MAINNET_RPC,\n [NEAR_TESTNET_CAIP2]: NEAR_TESTNET_RPC,\n};\n\n/**\n * NEP-141 Fungible Token Standard function names\n * @see https://nomicon.io/Standards/Tokens/FungibleToken/Core\n */\nexport const NEP141_FT_TRANSFER = \"ft_transfer\";\nexport const NEP141_FT_BALANCE_OF = \"ft_balance_of\";\nexport const NEP141_STORAGE_DEPOSIT = \"storage_deposit\";\nexport const NEP141_STORAGE_BALANCE_OF = \"storage_balance_of\";\n\n/**\n * Default gas amounts for NEP-141 transfers\n * NEAR gas is measured in TGas (1 TGas = 10^12 gas)\n */\nexport const DEFAULT_FT_TRANSFER_GAS = \"30000000000000\"; // 30 TGas\nexport const DEFAULT_STORAGE_DEPOSIT_GAS = \"10000000000000\"; // 10 TGas\n\n/**\n * Required deposits for NEP-141 operations\n * ft_transfer requires 1 yoctoNEAR attached deposit\n */\nexport const FT_TRANSFER_DEPOSIT = \"1\"; // 1 yoctoNEAR\nexport const DEFAULT_STORAGE_DEPOSIT = \"1250000000000000000000\"; // 0.00125 NEAR\n\n/**\n * Scheme identifier for exact-direct payments\n */\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n/**\n * Default timeout for payment validity (in seconds)\n */\nexport const DEFAULT_VALIDITY_DURATION = 3600; // 1 hour\n\n/**\n * Maximum transaction age to accept (in milliseconds)\n */\nexport const MAX_TRANSACTION_AGE = 5 * 60 * 1000; // 5 minutes\n\n/**\n * CAIP-2 namespace for NEAR\n */\nexport const NEAR_CAIP2_NAMESPACE = \"near\";\n","/**\n * NEAR Token Registry\n *\n * Defines supported tokens (NEP-141 fungible tokens) for each NEAR network.\n */\n\nimport { NEAR_MAINNET_CAIP2, NEAR_TESTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration\n */\nexport interface TokenConfig {\n /** Contract address/account ID */\n contractId: string;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Decimal places */\n decimals: number;\n /** Priority for selection (lower = higher priority) */\n priority: number;\n}\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [NEAR_MAINNET_CAIP2]: [\n {\n // USDC on NEAR (Rainbow Bridge)\n contractId: \"17208628f84f5d6ad33f0da3bbbeb27ffcb398eac501a31bd6ad2011e36133a1\",\n symbol: \"USDC\",\n name: \"USD Coin\",\n decimals: 6,\n priority: 1,\n },\n {\n // USDT on NEAR\n contractId: \"usdt.tether-token.near\",\n symbol: \"USDT\",\n name: \"Tether USD\",\n decimals: 6,\n priority: 2,\n },\n ],\n [NEAR_TESTNET_CAIP2]: [\n {\n // Fake USDC on testnet\n contractId: \"usdc.fakes.testnet\",\n symbol: \"USDC\",\n name: \"USD Coin (Testnet)\",\n decimals: 6,\n priority: 1,\n },\n ],\n};\n\n/**\n * Get token configuration by symbol\n * @param network - CAIP-2 network identifier\n * @param symbol - Token symbol (e.g., \"USDC\")\n * @returns Token configuration or undefined\n */\nexport function getTokenConfig(network: string, symbol: string): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find((t) => t.symbol.toUpperCase() === symbol.toUpperCase());\n}\n\n/**\n * Get token configuration by contract ID\n * @param network - CAIP-2 network identifier\n * @param contractId - Token contract account ID\n * @returns Token configuration or undefined\n */\nexport function getTokenByContract(network: string, contractId: string): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find((t) => t.contractId === contractId);\n}\n\n/**\n * Get the default token for a network\n * Returns the token with highest priority (lowest priority number)\n * @param network - CAIP-2 network identifier\n * @returns Default token configuration or undefined\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens || tokens.length === 0) return undefined;\n return [...tokens].sort((a, b) => a.priority - b.priority)[0];\n}\n\n/**\n * Get all tokens for a network\n * @param network - CAIP-2 network identifier\n * @returns Array of token configurations\n */\nexport function getNetworkTokens(network: string): TokenConfig[] {\n return TOKEN_REGISTRY[network] || [];\n}\n\n/**\n * Check if a network is supported\n * @param network - CAIP-2 network identifier\n */\nexport function isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n}\n","/**\n * NEAR Utility Functions\n *\n * Helper functions for NEAR address validation, network normalization,\n * and RPC interactions.\n */\n\nimport { NEAR_CAIP2_NAMESPACE, NETWORK_RPC_ENDPOINTS, type NearNetwork } from \"./constants.js\";\nimport type {\n NearRpcRequest,\n NearRpcResponse,\n TransactionResult,\n FtTransferArgs,\n} from \"./types.js\";\n\n/**\n * Normalize a network identifier to CAIP-2 format\n * @param network - Network identifier (e.g., \"mainnet\", \"near:mainnet\")\n * @returns CAIP-2 formatted network identifier\n */\nexport function normalizeNetwork(network: string): NearNetwork {\n // Already in CAIP-2 format\n if (network.startsWith(`${NEAR_CAIP2_NAMESPACE}:`)) {\n return network as NearNetwork;\n }\n // Convert shorthand to CAIP-2\n return `${NEAR_CAIP2_NAMESPACE}:${network}` as NearNetwork;\n}\n\n/**\n * Extract network ID from CAIP-2 identifier\n * @param network - CAIP-2 network identifier\n * @returns Network ID (e.g., \"mainnet\")\n */\nexport function extractNetworkId(network: string): string {\n if (network.includes(\":\")) {\n return network.split(\":\")[1];\n }\n return network;\n}\n\n/**\n * Validate a NEAR account ID\n * NEAR account IDs must:\n * - Be 2-64 characters\n * - Contain only lowercase alphanumeric, underscores, hyphens\n * - Not start with a hyphen or underscore\n * @param accountId - Account ID to validate\n * @returns Whether the account ID is valid\n */\nexport function isValidAccountId(accountId: string): boolean {\n if (!accountId || accountId.length < 2 || accountId.length > 64) {\n return false;\n }\n // NEAR account ID regex\n const regex = /^[a-z0-9]([a-z0-9_-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9_-]*[a-z0-9])?)*$/;\n return regex.test(accountId);\n}\n\n/**\n * Get RPC endpoint for a network\n * @param network - CAIP-2 network identifier\n * @returns RPC endpoint URL\n */\nexport function getRpcEndpoint(network: string): string {\n const normalizedNetwork = normalizeNetwork(network);\n return NETWORK_RPC_ENDPOINTS[normalizedNetwork] || NETWORK_RPC_ENDPOINTS[\"near:mainnet\"];\n}\n\n/**\n * Make a JSON-RPC call to NEAR\n * @param network - CAIP-2 network identifier\n * @param method - RPC method name\n * @param params - Method parameters\n * @returns RPC response result\n */\nexport async function rpcCall<T>(\n network: string,\n method: string,\n params: NearRpcRequest[\"params\"],\n): Promise<T> {\n const endpoint = getRpcEndpoint(network);\n\n const request: NearRpcRequest = {\n jsonrpc: \"2.0\",\n id: `t402-${Date.now()}`,\n method,\n params,\n };\n\n const response = await fetch(endpoint, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(request),\n });\n\n const data = (await response.json()) as NearRpcResponse<T>;\n\n if (data.error) {\n throw new Error(`NEAR RPC error: ${data.error.message}`);\n }\n\n return data.result as T;\n}\n\n/**\n * Query a transaction by hash\n * @param network - CAIP-2 network identifier\n * @param txHash - Transaction hash\n * @param senderAccountId - Sender account ID\n * @returns Transaction result\n */\nexport async function queryTransaction(\n network: string,\n txHash: string,\n senderAccountId: string,\n): Promise<TransactionResult> {\n return rpcCall<TransactionResult>(network, \"tx\", [txHash, senderAccountId]);\n}\n\n/**\n * Query token balance\n * @param network - CAIP-2 network identifier\n * @param accountId - Account to query\n * @param tokenContract - Token contract address\n * @returns Balance as bigint\n */\nexport async function queryTokenBalance(\n network: string,\n accountId: string,\n tokenContract: string,\n): Promise<bigint> {\n try {\n const result = await rpcCall<{ result: number[] }>(network, \"query\", {\n request_type: \"call_function\",\n finality: \"final\",\n account_id: tokenContract,\n method_name: \"ft_balance_of\",\n args_base64: btoa(JSON.stringify({ account_id: accountId })),\n });\n\n // Result is a byte array representing the JSON response\n const bytes = new Uint8Array(result.result);\n const text = new TextDecoder().decode(bytes);\n // Remove quotes from JSON string response\n const balance = text.replace(/\"/g, \"\");\n return BigInt(balance);\n } catch (error) {\n console.error(\"Error fetching token balance:\", error);\n return 0n;\n }\n}\n\n/**\n * Parse ft_transfer args from base64 encoded string\n * @param argsBase64 - Base64 encoded JSON arguments\n * @returns Parsed ft_transfer arguments\n */\nexport function parseFtTransferArgs(argsBase64: string): FtTransferArgs | null {\n try {\n const argsJson = atob(argsBase64);\n return JSON.parse(argsJson) as FtTransferArgs;\n } catch {\n // Try parsing as raw JSON (some nodes return it differently)\n try {\n return JSON.parse(argsBase64) as FtTransferArgs;\n } catch {\n return null;\n }\n }\n}\n\n/**\n * Check if a transaction succeeded\n * @param status - Transaction status\n * @returns Whether the transaction succeeded\n */\nexport function isTransactionSuccessful(status: {\n SuccessValue?: string;\n Failure?: unknown;\n}): boolean {\n return status.SuccessValue !== undefined && status.Failure === undefined;\n}\n\n/**\n * Format amount for display (with decimals)\n * @param amount - Amount in smallest units\n * @param decimals - Number of decimal places\n * @returns Formatted amount string\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const whole = amount / divisor;\n const remainder = amount % divisor;\n const decimal = remainder.toString().padStart(decimals, \"0\").slice(0, 2);\n return `${whole}.${decimal}`;\n}\n\n/**\n * Convert decimal amount to token units\n * @param decimalAmount - Amount with decimals (e.g., \"1.50\")\n * @param decimals - Token decimals\n * @returns Amount in smallest units\n */\nexport function toTokenUnits(decimalAmount: string | number, decimals: number): bigint {\n const amount = typeof decimalAmount === \"string\" ? parseFloat(decimalAmount) : decimalAmount;\n if (isNaN(amount)) {\n throw new Error(`Invalid amount: ${decimalAmount}`);\n }\n const multiplier = 10 ** decimals;\n return BigInt(Math.floor(amount * multiplier));\n}\n","/**\n * NEAR Client Scheme Implementation - Exact Direct\n *\n * Creates payment payloads for NEAR NEP-141 transfers using the exact-direct scheme.\n * In this scheme, the client executes the ft_transfer directly and provides\n * the transaction hash as proof of payment.\n */\n\nimport type { PaymentPayload, PaymentRequirements, SchemeNetworkClient } from \"@t402/core/types\";\nimport type { ClientNearSigner, ExactDirectNearPayload } from \"../../types.js\";\nimport {\n SCHEME_EXACT_DIRECT,\n DEFAULT_FT_TRANSFER_GAS,\n FT_TRANSFER_DEPOSIT,\n} from \"../../constants.js\";\nimport { normalizeNetwork, isValidAccountId } from \"../../utils.js\";\n\n/**\n * Configuration for ExactDirectNearClient\n */\nexport interface ExactDirectNearClientConfig {\n /** Override the gas amount for ft_transfer */\n gasAmount?: string;\n /** Optional memo to include in the transfer */\n memo?: string;\n}\n\n/**\n * NEAR client implementation for the Exact-Direct payment scheme.\n *\n * Executes NEP-141 ft_transfer and returns the transaction hash as proof.\n */\nexport class ExactDirectNearClient implements SchemeNetworkClient {\n readonly scheme = SCHEME_EXACT_DIRECT;\n\n /**\n * Creates a new ExactDirectNearScheme instance.\n *\n * @param signer - The NEAR signer for client operations\n * @param config - Optional configuration overrides\n */\n constructor(\n private readonly signer: ClientNearSigner,\n private readonly config: ExactDirectNearClientConfig = {},\n ) {}\n\n /**\n * Creates a payment payload by executing the transfer.\n *\n * Unlike other schemes where the client creates a signed message for\n * the facilitator to execute, the exact-direct scheme has the client\n * execute the transfer directly. The transaction hash is then used\n * as proof of payment.\n *\n * @param t402Version - The t402 protocol version\n * @param paymentRequirements - The payment requirements\n * @returns Promise resolving to a payment payload with transaction hash\n */\n async createPaymentPayload(\n t402Version: number,\n paymentRequirements: PaymentRequirements,\n ): Promise<Pick<PaymentPayload, \"t402Version\" | \"payload\">> {\n // Normalize and validate network\n normalizeNetwork(paymentRequirements.network);\n\n // Validate required fields\n if (!paymentRequirements.asset) {\n throw new Error(\"Asset (token contract address) is required\");\n }\n if (!paymentRequirements.payTo) {\n throw new Error(\"PayTo address is required\");\n }\n if (!paymentRequirements.amount) {\n throw new Error(\"Amount is required\");\n }\n\n // Validate addresses\n if (!isValidAccountId(paymentRequirements.payTo)) {\n throw new Error(`Invalid recipient account ID: ${paymentRequirements.payTo}`);\n }\n if (!isValidAccountId(this.signer.accountId)) {\n throw new Error(`Invalid sender account ID: ${this.signer.accountId}`);\n }\n\n const tokenContract = paymentRequirements.asset;\n const recipient = paymentRequirements.payTo;\n const amount = paymentRequirements.amount;\n\n // Build ft_transfer arguments\n const ftTransferArgs: Record<string, unknown> = {\n receiver_id: recipient,\n amount: amount,\n };\n\n if (this.config.memo) {\n ftTransferArgs.memo = this.config.memo;\n }\n\n // Execute the transfer\n const txHash = await this.signer.signAndSendTransaction(\n tokenContract,\n \"ft_transfer\",\n ftTransferArgs,\n this.config.gasAmount || DEFAULT_FT_TRANSFER_GAS,\n FT_TRANSFER_DEPOSIT,\n );\n\n // Build the payload\n const payload: ExactDirectNearPayload = {\n txHash,\n from: this.signer.accountId,\n to: recipient,\n amount: amount,\n };\n\n return {\n t402Version,\n payload,\n };\n }\n}\n","/**\n * Registration function for NEAR Exact-Direct client\n */\n\nimport { t402Client, PaymentPolicy } from \"@t402/core/client\";\nimport { Network } from \"@t402/core/types\";\nimport type { ClientNearSigner } from \"../../types.js\";\nimport { ExactDirectNearClient, type ExactDirectNearClientConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering NEAR schemes to a t402Client\n */\nexport interface NearClientConfig {\n /**\n * The NEAR signer to use for creating payment payloads\n */\n signer: ClientNearSigner;\n\n /**\n * Optional policies to apply to the client\n */\n policies?: PaymentPolicy[];\n\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (near:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration (gas amounts, memo)\n */\n schemeConfig?: ExactDirectNearClientConfig;\n}\n\n/**\n * Registers NEAR exact-direct payment schemes to a t402Client instance.\n *\n * @param client - The t402Client instance to register schemes to\n * @param config - Configuration for NEAR client registration\n * @returns The client instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectNearClient } from \"@t402/near/exact-direct/client\";\n * import { t402Client } from \"@t402/core/client\";\n *\n * const client = new t402Client();\n * registerExactDirectNearClient(client, {\n * signer: {\n * accountId: \"alice.near\",\n * signAndSendTransaction: async (receiverId, methodName, args, gas, deposit) => {\n * // Sign and send using wallet\n * return txHash;\n * }\n * }\n * });\n * ```\n */\nexport function registerExactDirectNearClient(\n client: t402Client,\n config: NearClientConfig,\n): t402Client {\n const scheme = new ExactDirectNearClient(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 NEAR networks\n client.register(\"near:*\", scheme);\n }\n\n // Apply policies if provided\n if (config.policies) {\n config.policies.forEach((policy) => {\n client.registerPolicy(policy);\n });\n }\n\n return client;\n}\n","/**\n * NEAR Server Scheme Implementation - Exact Direct\n *\n * Handles price parsing and payment requirement enhancement for\n * NEAR NEP-141 payments using the exact-direct scheme.\n */\n\nimport type {\n AssetAmount,\n Network,\n PaymentRequirements,\n Price,\n SchemeNetworkServer,\n MoneyParser,\n} from \"@t402/core/types\";\nimport { SCHEME_EXACT_DIRECT } from \"../../constants.js\";\nimport { getDefaultToken, getTokenConfig, TOKEN_REGISTRY } from \"../../tokens.js\";\nimport { normalizeNetwork, toTokenUnits } from \"../../utils.js\";\n\n/**\n * Configuration options for ExactDirectNearServer\n */\nexport interface ExactDirectNearServerConfig {\n /** Preferred token symbol (e.g., \"USDC\"). Defaults to network's highest priority token. */\n preferredToken?: string;\n}\n\n/**\n * NEAR server implementation for the Exact-Direct payment scheme.\n * Handles price parsing and converts user-friendly amounts to token amounts.\n */\nexport class ExactDirectNearServer implements SchemeNetworkServer {\n readonly scheme = SCHEME_EXACT_DIRECT;\n private moneyParsers: MoneyParser[] = [];\n private config: ExactDirectNearServerConfig;\n\n constructor(config: ExactDirectNearServerConfig = {}) {\n this.config = config;\n }\n\n /**\n * Register a custom money parser in the parser chain.\n * Multiple parsers can be registered - they will be tried in registration order.\n * Each parser receives a decimal amount (e.g., 1.50 for $1.50).\n * If a parser returns null, the next parser in the chain will be tried.\n * The default parser is always the final fallback.\n *\n * @param parser - Custom function to convert amount to AssetAmount (or null to skip)\n * @returns The server instance for chaining\n */\n registerMoneyParser(parser: MoneyParser): ExactDirectNearServer {\n this.moneyParsers.push(parser);\n return this;\n }\n\n /**\n * Parses a price into an asset amount.\n * If price is already an AssetAmount, returns it directly.\n * If price is Money (string | number), parses to decimal and tries custom parsers.\n * Falls back to default conversion if all custom parsers return null.\n *\n * @param price - The price to parse\n * @param network - The network to use\n * @returns Promise that resolves to the parsed asset amount\n */\n async parsePrice(price: Price, network: Network): Promise<AssetAmount> {\n // Normalize network to CAIP-2 format\n const normalizedNetwork = normalizeNetwork(network);\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 address 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, normalizedNetwork);\n if (result !== null) {\n return result;\n }\n }\n\n // All custom parsers returned null, use default conversion\n return this.defaultMoneyConversion(amount, normalizedNetwork);\n }\n\n /**\n * Build payment requirements for this scheme/network combination.\n *\n * @param paymentRequirements - Base payment requirements with amount/asset already set\n * @param supportedKind - The supported kind from facilitator's /supported endpoint\n * @param extensionKeys - Extensions supported by the facilitator\n * @returns Enhanced payment requirements ready to be sent to clients\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 extensionKeys: string[],\n ): Promise<PaymentRequirements> {\n // Mark unused parameters to satisfy linter\n void extensionKeys;\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 * Handles formats like \"$1.50\", \"1.50\", 1.50, etc.\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 * Converts decimal amount to the preferred token on the specified network.\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 = toTokenUnits(amount, token.decimals);\n\n return {\n amount: tokenAmount.toString(),\n asset: token.contractId,\n extra: {\n symbol: token.symbol,\n name: token.name,\n decimals: token.decimals,\n },\n };\n }\n\n /**\n * Get the default asset info for a network.\n * Priority: configured preferredToken > network default\n */\n private getDefaultAsset(network: Network): {\n contractId: string;\n symbol: string;\n name: string;\n decimals: number;\n } {\n // If a preferred token is configured, try to use it\n if (this.config.preferredToken) {\n const preferred = getTokenConfig(network, this.config.preferredToken);\n if (preferred) return preferred;\n }\n\n // Use the network's default token (sorted by priority)\n const defaultToken = getDefaultToken(network);\n if (defaultToken) return defaultToken;\n\n throw new Error(`No tokens configured for network ${network}`);\n }\n\n /**\n * Get all supported networks\n */\n static getSupportedNetworks(): string[] {\n return Object.keys(TOKEN_REGISTRY);\n }\n\n /**\n * Check if a network is supported\n */\n static isNetworkSupported(network: string): boolean {\n return network in TOKEN_REGISTRY;\n }\n}\n","/**\n * Registration function for NEAR Exact-Direct server\n */\n\nimport { t402ResourceServer } from \"@t402/core/server\";\nimport { Network } from \"@t402/core/types\";\nimport { ExactDirectNearServer, type ExactDirectNearServerConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering NEAR schemes to a t402ResourceServer\n */\nexport interface NearResourceServerConfig {\n /**\n * Optional specific networks to register\n * If not provided, registers wildcard support (near:*)\n */\n networks?: Network[];\n\n /**\n * Optional scheme configuration (preferred token, etc.)\n */\n schemeConfig?: ExactDirectNearServerConfig;\n}\n\n/**\n * Registers NEAR exact-direct payment schemes to a t402ResourceServer instance.\n *\n * @param server - The t402ResourceServer instance to register schemes to\n * @param config - Configuration for NEAR resource server registration\n * @returns The server instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectNearServer } from \"@t402/near/exact-direct/server\";\n * import { t402ResourceServer } from \"@t402/core/server\";\n *\n * const server = new t402ResourceServer(facilitatorClient);\n * registerExactDirectNearServer(server, {});\n *\n * // Or with specific token preference\n * registerExactDirectNearServer(server, {\n * schemeConfig: { preferredToken: \"USDT\" }\n * });\n * ```\n */\nexport function registerExactDirectNearServer(\n server: t402ResourceServer,\n config: NearResourceServerConfig = {},\n): t402ResourceServer {\n const scheme = new ExactDirectNearServer(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 NEAR networks\n server.register(\"near:*\", scheme);\n }\n\n return server;\n}\n","/**\n * NEAR Facilitator Scheme Implementation - Exact Direct\n *\n * Verifies and settles NEAR NEP-141 payments using the exact-direct scheme.\n * The facilitator verifies that the client's transaction was successful\n * and matches the payment requirements.\n */\n\nimport type {\n Network,\n PaymentPayload,\n PaymentRequirements,\n SchemeNetworkFacilitator,\n SettleResponse,\n VerifyResponse,\n} from \"@t402/core/types\";\nimport type { FacilitatorNearSigner, ExactDirectNearPayload, FtTransferArgs } from \"../../types.js\";\nimport { SCHEME_EXACT_DIRECT, NEAR_CAIP2_NAMESPACE, MAX_TRANSACTION_AGE } from \"../../constants.js\";\nimport {\n normalizeNetwork,\n isTransactionSuccessful,\n parseFtTransferArgs,\n isValidAccountId,\n} from \"../../utils.js\";\nimport { getDefaultToken } from \"../../tokens.js\";\n\n/**\n * Configuration for ExactDirectNearFacilitator\n */\nexport interface ExactDirectNearFacilitatorConfig {\n /** Maximum age of a transaction to accept (in milliseconds) */\n maxTransactionAge?: number;\n /** Duration to cache used transaction hashes (in milliseconds) */\n usedTxCacheDuration?: number;\n}\n\n/**\n * NEAR facilitator implementation for the Exact-Direct payment scheme.\n * Verifies transaction proofs and confirms payments.\n */\nexport class ExactDirectNearFacilitator implements SchemeNetworkFacilitator {\n readonly scheme = SCHEME_EXACT_DIRECT;\n readonly caipFamily = `${NEAR_CAIP2_NAMESPACE}:*`;\n\n private readonly config: Required<ExactDirectNearFacilitatorConfig>;\n private usedTxs: Map<string, number> = new Map();\n\n constructor(\n private readonly signer: FacilitatorNearSigner,\n config?: ExactDirectNearFacilitatorConfig,\n ) {\n this.config = {\n maxTransactionAge: config?.maxTransactionAge ?? MAX_TRANSACTION_AGE,\n usedTxCacheDuration: config?.usedTxCacheDuration ?? 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 signer addresses for a network\n */\n getSigners(network: Network): string[] {\n return this.signer.getAddresses(network);\n }\n\n /**\n * Verify a payment payload\n */\n async verify(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<VerifyResponse> {\n const network = normalizeNetwork(requirements.network);\n\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 (normalizeNetwork(payload.accepted.network) !== network) {\n return {\n isValid: false,\n invalidReason: \"network_mismatch\",\n };\n }\n\n // Parse payload\n const nearPayload = payload.payload as ExactDirectNearPayload;\n if (!nearPayload.txHash) {\n return {\n isValid: false,\n invalidReason: \"missing_tx_hash\",\n };\n }\n if (!nearPayload.from || !isValidAccountId(nearPayload.from)) {\n return {\n isValid: false,\n invalidReason: \"invalid_from_address\",\n };\n }\n\n // Check for replay attack\n if (this.isTxUsed(nearPayload.txHash)) {\n return {\n isValid: false,\n invalidReason: \"transaction_already_used\",\n payer: nearPayload.from,\n };\n }\n\n try {\n // Query the transaction\n const tx = await this.signer.queryTransaction(nearPayload.txHash, nearPayload.from);\n\n // Check transaction succeeded\n if (!isTransactionSuccessful(tx.status)) {\n return {\n isValid: false,\n invalidReason: \"transaction_failed\",\n payer: nearPayload.from,\n };\n }\n\n // Verify the transaction was to the correct token contract\n if (tx.transaction.receiver_id !== requirements.asset) {\n return {\n isValid: false,\n invalidReason: \"wrong_token_contract\",\n payer: nearPayload.from,\n };\n }\n\n // Find and verify ft_transfer action\n let ftTransferArgs: FtTransferArgs | null = null;\n for (const action of tx.transaction.actions) {\n if (action.FunctionCall?.method_name === \"ft_transfer\") {\n ftTransferArgs = parseFtTransferArgs(action.FunctionCall.args);\n break;\n }\n }\n\n if (!ftTransferArgs) {\n return {\n isValid: false,\n invalidReason: \"no_ft_transfer_action\",\n payer: nearPayload.from,\n };\n }\n\n // Verify recipient\n if (ftTransferArgs.receiver_id !== requirements.payTo) {\n return {\n isValid: false,\n invalidReason: \"wrong_recipient\",\n payer: nearPayload.from,\n };\n }\n\n // Verify amount\n const txAmount = BigInt(ftTransferArgs.amount);\n const requiredAmount = BigInt(requirements.amount);\n if (txAmount < requiredAmount) {\n return {\n isValid: false,\n invalidReason: \"insufficient_amount\",\n payer: nearPayload.from,\n };\n }\n\n // Mark transaction as used\n this.markTxUsed(nearPayload.txHash);\n\n return {\n isValid: true,\n payer: nearPayload.from,\n };\n } catch {\n return {\n isValid: false,\n invalidReason: \"transaction_not_found\",\n payer: nearPayload.from,\n };\n }\n }\n\n /**\n * Settle a payment - for exact-direct, the transfer is already complete\n */\n async settle(\n payload: PaymentPayload,\n requirements: PaymentRequirements,\n ): Promise<SettleResponse> {\n // Verify first\n const verifyResult = await this.verify(payload, requirements);\n if (!verifyResult.isValid) {\n return {\n success: false,\n errorReason: verifyResult.invalidReason || \"verification_failed\",\n payer: verifyResult.payer,\n transaction: \"\",\n network: normalizeNetwork(requirements.network),\n };\n }\n\n const nearPayload = payload.payload as ExactDirectNearPayload;\n\n // For exact-direct, settlement is already complete\n return {\n success: true,\n transaction: nearPayload.txHash,\n network: normalizeNetwork(requirements.network),\n payer: nearPayload.from,\n };\n }\n\n /**\n * Check if a transaction has been used\n */\n private isTxUsed(txHash: string): boolean {\n return this.usedTxs.has(txHash);\n }\n\n /**\n * Mark a transaction as used\n */\n private markTxUsed(txHash: string): void {\n this.usedTxs.set(txHash, Date.now());\n }\n\n /**\n * Start the cleanup interval for used transactions\n */\n private startCleanupInterval(): void {\n setInterval(\n () => {\n const cutoff = Date.now() - this.config.usedTxCacheDuration;\n for (const [txHash, usedAt] of this.usedTxs.entries()) {\n if (usedAt < cutoff) {\n this.usedTxs.delete(txHash);\n }\n }\n },\n 60 * 60 * 1000,\n ); // Cleanup every hour\n }\n}\n","/**\n * Registration function for NEAR Exact-Direct facilitator\n */\n\nimport { t402Facilitator } from \"@t402/core/facilitator\";\nimport { Network } from \"@t402/core/types\";\nimport type { FacilitatorNearSigner } from \"../../types.js\";\nimport { ExactDirectNearFacilitator, type ExactDirectNearFacilitatorConfig } from \"./scheme.js\";\n\n/**\n * Configuration options for registering NEAR schemes to a t402Facilitator\n */\nexport interface NearFacilitatorConfig {\n /**\n * The NEAR signer for facilitator operations (verify and settle)\n */\n signer: FacilitatorNearSigner;\n\n /**\n * Networks to register (single network or array of networks)\n * Examples: \"near:mainnet\", [\"near:mainnet\", \"near:testnet\"]\n */\n networks: Network | Network[];\n\n /**\n * Optional scheme configuration\n */\n schemeConfig?: ExactDirectNearFacilitatorConfig;\n}\n\n/**\n * Registers NEAR exact-direct payment schemes to a t402Facilitator instance.\n *\n * @param facilitator - The t402Facilitator instance to register schemes to\n * @param config - Configuration for NEAR facilitator registration\n * @returns The facilitator instance for chaining\n *\n * @example\n * ```typescript\n * import { registerExactDirectNearFacilitator } from \"@t402/near/exact-direct/facilitator\";\n * import { t402Facilitator } from \"@t402/core/facilitator\";\n *\n * const facilitator = new t402Facilitator();\n *\n * // Single network\n * registerExactDirectNearFacilitator(facilitator, {\n * signer: myNearSigner,\n * networks: \"near:mainnet\"\n * });\n *\n * // Multiple networks\n * registerExactDirectNearFacilitator(facilitator, {\n * signer: myNearSigner,\n * networks: [\"near:mainnet\", \"near:testnet\"]\n * });\n * ```\n */\nexport function registerExactDirectNearFacilitator(\n facilitator: t402Facilitator,\n config: NearFacilitatorConfig,\n): t402Facilitator {\n const scheme = new ExactDirectNearFacilitator(config.signer, config.schemeConfig);\n\n // Register scheme with specified networks\n facilitator.register(config.networks, scheme);\n\n return facilitator;\n}\n","/**\n * NEAR Up-To Scheme Types\n *\n * Defines the payload and extra types for the NEAR upto payment scheme.\n * The upto scheme uses an escrow pattern:\n * 1. Client ft_transfers maxAmount to the facilitator's NEAR account\n * 2. Facilitator verifies the transfer\n * 3. Facilitator forwards settleAmount to payTo and refunds (maxAmount - settleAmount)\n *\n * Note: NEAR NEP-141 tokens don't have native approve/transferFrom.\n * This implementation uses an escrow pattern instead.\n */\n\n/**\n * Authorization metadata for NEAR upto payments.\n * Contains the transfer details for verification.\n */\nexport type UptoNearAuthorization = {\n /** Sender's NEAR account ID (e.g., \"alice.near\") */\n from: string;\n\n /** Facilitator's NEAR account ID that receives the initial transfer */\n facilitator: string;\n\n /** NEP-141 token contract ID (e.g., \"usdt.tether-token.near\") */\n tokenContract: string;\n\n /** Maximum authorized amount in smallest units (as string) */\n maxAmount: string;\n};\n\n/**\n * NEAR upto payment payload.\n * Contains the transaction hash of the client's transfer to the facilitator.\n */\nexport type UptoNearPayload = {\n /** NEAR transaction hash of the transfer to facilitator */\n txHash: string;\n\n /** Authorization metadata for verification */\n authorization: UptoNearAuthorization;\n\n /** Unique nonce for replay protection (hex string) */\n paymentNonce: string;\n};\n\n/**\n * Extra fields for upto scheme payment requirements on NEAR.\n * Included in the PaymentRequirements.extra field.\n */\nexport type UptoNearExtra = {\n /** Facilitator account ID that will receive the initial transfer */\n facilitator?: string;\n\n /** Maximum payment amount authorized */\n maxAmount?: string;\n\n /** Minimum acceptable settlement amount */\n minAmount?: string;\n\n /** Billing unit (e.g., \"token\", \"request\", \"second\") */\n unit?: string;\n\n /** Price per unit in smallest denomination */\n unitPrice?: string;\n};\n\n/**\n * Settlement data for NEAR upto scheme.\n */\nexport type UptoNearSettlement = {\n /** Actual amount to settle (must be <= maxAmount) */\n settleAmount: string;\n\n /** Usage details for auditing */\n usageDetails?: {\n unitsConsumed?: number;\n unitPrice?: string;\n unitType?: string;\n startTime?: number;\n endTime?: number;\n };\n};\n\n/**\n * Type guard for UptoNearPayload.\n *\n * Checks that the data has the correct structure for a NEAR upto payload,\n * distinguishing it from exact-direct payloads.\n *\n * @param data - The data to check\n * @returns True if the data is a valid UptoNearPayload\n */\nexport function isUptoNearPayload(data: unknown): data is UptoNearPayload {\n if (typeof data !== \"object\" || data === null) return false;\n const p = data as Record<string, unknown>;\n if (typeof p.txHash !== \"string\" || !p.txHash) return false;\n if (typeof p.paymentNonce !== \"string\" || !p.paymentNonce) return false;\n if (typeof p.authorization !== \"object\" || p.authorization === null) return false;\n\n const auth = p.authorization as Record<string, unknown>;\n return (\n typeof auth.from === \"string\" &&\n typeof auth.facilitator === \"string\" &&\n typeof auth.tokenContract === \"string\" &&\n typeof auth.maxAmount === \"string\" &&\n !!auth.from &&\n !!auth.facilitator\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEAR Up-To Scheme Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the payload and extra types for the NEAR upto payment scheme.
|
|
5
|
+
* The upto scheme uses an escrow pattern:
|
|
6
|
+
* 1. Client ft_transfers maxAmount to the facilitator's NEAR account
|
|
7
|
+
* 2. Facilitator verifies the transfer
|
|
8
|
+
* 3. Facilitator forwards settleAmount to payTo and refunds (maxAmount - settleAmount)
|
|
9
|
+
*
|
|
10
|
+
* Note: NEAR NEP-141 tokens don't have native approve/transferFrom.
|
|
11
|
+
* This implementation uses an escrow pattern instead.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Authorization metadata for NEAR upto payments.
|
|
15
|
+
* Contains the transfer details for verification.
|
|
16
|
+
*/
|
|
17
|
+
type UptoNearAuthorization = {
|
|
18
|
+
/** Sender's NEAR account ID (e.g., "alice.near") */
|
|
19
|
+
from: string;
|
|
20
|
+
/** Facilitator's NEAR account ID that receives the initial transfer */
|
|
21
|
+
facilitator: string;
|
|
22
|
+
/** NEP-141 token contract ID (e.g., "usdt.tether-token.near") */
|
|
23
|
+
tokenContract: string;
|
|
24
|
+
/** Maximum authorized amount in smallest units (as string) */
|
|
25
|
+
maxAmount: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* NEAR upto payment payload.
|
|
29
|
+
* Contains the transaction hash of the client's transfer to the facilitator.
|
|
30
|
+
*/
|
|
31
|
+
type UptoNearPayload = {
|
|
32
|
+
/** NEAR transaction hash of the transfer to facilitator */
|
|
33
|
+
txHash: string;
|
|
34
|
+
/** Authorization metadata for verification */
|
|
35
|
+
authorization: UptoNearAuthorization;
|
|
36
|
+
/** Unique nonce for replay protection (hex string) */
|
|
37
|
+
paymentNonce: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Extra fields for upto scheme payment requirements on NEAR.
|
|
41
|
+
* Included in the PaymentRequirements.extra field.
|
|
42
|
+
*/
|
|
43
|
+
type UptoNearExtra = {
|
|
44
|
+
/** Facilitator account ID that will receive the initial transfer */
|
|
45
|
+
facilitator?: string;
|
|
46
|
+
/** Maximum payment amount authorized */
|
|
47
|
+
maxAmount?: string;
|
|
48
|
+
/** Minimum acceptable settlement amount */
|
|
49
|
+
minAmount?: string;
|
|
50
|
+
/** Billing unit (e.g., "token", "request", "second") */
|
|
51
|
+
unit?: string;
|
|
52
|
+
/** Price per unit in smallest denomination */
|
|
53
|
+
unitPrice?: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Settlement data for NEAR upto scheme.
|
|
57
|
+
*/
|
|
58
|
+
type UptoNearSettlement = {
|
|
59
|
+
/** Actual amount to settle (must be <= maxAmount) */
|
|
60
|
+
settleAmount: string;
|
|
61
|
+
/** Usage details for auditing */
|
|
62
|
+
usageDetails?: {
|
|
63
|
+
unitsConsumed?: number;
|
|
64
|
+
unitPrice?: string;
|
|
65
|
+
unitType?: string;
|
|
66
|
+
startTime?: number;
|
|
67
|
+
endTime?: number;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Type guard for UptoNearPayload.
|
|
72
|
+
*
|
|
73
|
+
* Checks that the data has the correct structure for a NEAR upto payload,
|
|
74
|
+
* distinguishing it from exact-direct payloads.
|
|
75
|
+
*
|
|
76
|
+
* @param data - The data to check
|
|
77
|
+
* @returns True if the data is a valid UptoNearPayload
|
|
78
|
+
*/
|
|
79
|
+
declare function isUptoNearPayload(data: unknown): data is UptoNearPayload;
|
|
80
|
+
|
|
81
|
+
export { type UptoNearAuthorization, type UptoNearExtra, type UptoNearPayload, type UptoNearSettlement, isUptoNearPayload };
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/upto/index.ts
|
|
21
|
+
var upto_exports = {};
|
|
22
|
+
__export(upto_exports, {
|
|
23
|
+
isUptoNearPayload: () => isUptoNearPayload
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(upto_exports);
|
|
26
|
+
|
|
27
|
+
// src/upto/types.ts
|
|
28
|
+
function isUptoNearPayload(data) {
|
|
29
|
+
if (typeof data !== "object" || data === null) return false;
|
|
30
|
+
const p = data;
|
|
31
|
+
if (typeof p.txHash !== "string" || !p.txHash) return false;
|
|
32
|
+
if (typeof p.paymentNonce !== "string" || !p.paymentNonce) return false;
|
|
33
|
+
if (typeof p.authorization !== "object" || p.authorization === null) return false;
|
|
34
|
+
const auth = p.authorization;
|
|
35
|
+
return typeof auth.from === "string" && typeof auth.facilitator === "string" && typeof auth.tokenContract === "string" && typeof auth.maxAmount === "string" && !!auth.from && !!auth.facilitator;
|
|
36
|
+
}
|
|
37
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
38
|
+
0 && (module.exports = {
|
|
39
|
+
isUptoNearPayload
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/upto/index.ts","../../../src/upto/types.ts"],"sourcesContent":["/**\n * Up-To Scheme for NEAR\n *\n * The upto scheme enables usage-based billing on NEAR using an escrow pattern.\n * The client ft_transfers maxAmount to the facilitator, which then forwards\n * the actual settlement amount to the payTo address and refunds the rest.\n *\n * @example\n * ```typescript\n * import { UptoNearPayload, UptoNearExtra, isUptoNearPayload } from \"@t402/near/upto\";\n *\n * // Check if a payload is an upto NEAR payload\n * if (isUptoNearPayload(data)) {\n * console.log(data.txHash);\n * console.log(data.authorization.maxAmount);\n * }\n * ```\n *\n * @module\n */\n\nexport type {\n UptoNearAuthorization,\n UptoNearPayload,\n UptoNearExtra,\n UptoNearSettlement,\n} from \"./types.js\";\n\nexport { isUptoNearPayload } from \"./types.js\";\n","/**\n * NEAR Up-To Scheme Types\n *\n * Defines the payload and extra types for the NEAR upto payment scheme.\n * The upto scheme uses an escrow pattern:\n * 1. Client ft_transfers maxAmount to the facilitator's NEAR account\n * 2. Facilitator verifies the transfer\n * 3. Facilitator forwards settleAmount to payTo and refunds (maxAmount - settleAmount)\n *\n * Note: NEAR NEP-141 tokens don't have native approve/transferFrom.\n * This implementation uses an escrow pattern instead.\n */\n\n/**\n * Authorization metadata for NEAR upto payments.\n * Contains the transfer details for verification.\n */\nexport type UptoNearAuthorization = {\n /** Sender's NEAR account ID (e.g., \"alice.near\") */\n from: string;\n\n /** Facilitator's NEAR account ID that receives the initial transfer */\n facilitator: string;\n\n /** NEP-141 token contract ID (e.g., \"usdt.tether-token.near\") */\n tokenContract: string;\n\n /** Maximum authorized amount in smallest units (as string) */\n maxAmount: string;\n};\n\n/**\n * NEAR upto payment payload.\n * Contains the transaction hash of the client's transfer to the facilitator.\n */\nexport type UptoNearPayload = {\n /** NEAR transaction hash of the transfer to facilitator */\n txHash: string;\n\n /** Authorization metadata for verification */\n authorization: UptoNearAuthorization;\n\n /** Unique nonce for replay protection (hex string) */\n paymentNonce: string;\n};\n\n/**\n * Extra fields for upto scheme payment requirements on NEAR.\n * Included in the PaymentRequirements.extra field.\n */\nexport type UptoNearExtra = {\n /** Facilitator account ID that will receive the initial transfer */\n facilitator?: string;\n\n /** Maximum payment amount authorized */\n maxAmount?: string;\n\n /** Minimum acceptable settlement amount */\n minAmount?: string;\n\n /** Billing unit (e.g., \"token\", \"request\", \"second\") */\n unit?: string;\n\n /** Price per unit in smallest denomination */\n unitPrice?: string;\n};\n\n/**\n * Settlement data for NEAR upto scheme.\n */\nexport type UptoNearSettlement = {\n /** Actual amount to settle (must be <= maxAmount) */\n settleAmount: string;\n\n /** Usage details for auditing */\n usageDetails?: {\n unitsConsumed?: number;\n unitPrice?: string;\n unitType?: string;\n startTime?: number;\n endTime?: number;\n };\n};\n\n/**\n * Type guard for UptoNearPayload.\n *\n * Checks that the data has the correct structure for a NEAR upto payload,\n * distinguishing it from exact-direct payloads.\n *\n * @param data - The data to check\n * @returns True if the data is a valid UptoNearPayload\n */\nexport function isUptoNearPayload(data: unknown): data is UptoNearPayload {\n if (typeof data !== \"object\" || data === null) return false;\n const p = data as Record<string, unknown>;\n if (typeof p.txHash !== \"string\" || !p.txHash) return false;\n if (typeof p.paymentNonce !== \"string\" || !p.paymentNonce) return false;\n if (typeof p.authorization !== \"object\" || p.authorization === null) return false;\n\n const auth = p.authorization as Record<string, unknown>;\n return (\n typeof auth.from === \"string\" &&\n typeof auth.facilitator === \"string\" &&\n typeof auth.tokenContract === \"string\" &&\n typeof auth.maxAmount === \"string\" &&\n !!auth.from &&\n !!auth.facilitator\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC6FO,SAAS,kBAAkB,MAAwC;AACxE,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,WAAW,YAAY,CAAC,EAAE,OAAQ,QAAO;AACtD,MAAI,OAAO,EAAE,iBAAiB,YAAY,CAAC,EAAE,aAAc,QAAO;AAClE,MAAI,OAAO,EAAE,kBAAkB,YAAY,EAAE,kBAAkB,KAAM,QAAO;AAE5E,QAAM,OAAO,EAAE;AACf,SACE,OAAO,KAAK,SAAS,YACrB,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,kBAAkB,YAC9B,OAAO,KAAK,cAAc,YAC1B,CAAC,CAAC,KAAK,QACP,CAAC,CAAC,KAAK;AAEX;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/upto/types.ts
|
|
2
|
+
function isUptoNearPayload(data) {
|
|
3
|
+
if (typeof data !== "object" || data === null) return false;
|
|
4
|
+
const p = data;
|
|
5
|
+
if (typeof p.txHash !== "string" || !p.txHash) return false;
|
|
6
|
+
if (typeof p.paymentNonce !== "string" || !p.paymentNonce) return false;
|
|
7
|
+
if (typeof p.authorization !== "object" || p.authorization === null) return false;
|
|
8
|
+
const auth = p.authorization;
|
|
9
|
+
return typeof auth.from === "string" && typeof auth.facilitator === "string" && typeof auth.tokenContract === "string" && typeof auth.maxAmount === "string" && !!auth.from && !!auth.facilitator;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
isUptoNearPayload
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=chunk-BYL5JL2F.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/upto/types.ts"],"sourcesContent":["/**\n * NEAR Up-To Scheme Types\n *\n * Defines the payload and extra types for the NEAR upto payment scheme.\n * The upto scheme uses an escrow pattern:\n * 1. Client ft_transfers maxAmount to the facilitator's NEAR account\n * 2. Facilitator verifies the transfer\n * 3. Facilitator forwards settleAmount to payTo and refunds (maxAmount - settleAmount)\n *\n * Note: NEAR NEP-141 tokens don't have native approve/transferFrom.\n * This implementation uses an escrow pattern instead.\n */\n\n/**\n * Authorization metadata for NEAR upto payments.\n * Contains the transfer details for verification.\n */\nexport type UptoNearAuthorization = {\n /** Sender's NEAR account ID (e.g., \"alice.near\") */\n from: string;\n\n /** Facilitator's NEAR account ID that receives the initial transfer */\n facilitator: string;\n\n /** NEP-141 token contract ID (e.g., \"usdt.tether-token.near\") */\n tokenContract: string;\n\n /** Maximum authorized amount in smallest units (as string) */\n maxAmount: string;\n};\n\n/**\n * NEAR upto payment payload.\n * Contains the transaction hash of the client's transfer to the facilitator.\n */\nexport type UptoNearPayload = {\n /** NEAR transaction hash of the transfer to facilitator */\n txHash: string;\n\n /** Authorization metadata for verification */\n authorization: UptoNearAuthorization;\n\n /** Unique nonce for replay protection (hex string) */\n paymentNonce: string;\n};\n\n/**\n * Extra fields for upto scheme payment requirements on NEAR.\n * Included in the PaymentRequirements.extra field.\n */\nexport type UptoNearExtra = {\n /** Facilitator account ID that will receive the initial transfer */\n facilitator?: string;\n\n /** Maximum payment amount authorized */\n maxAmount?: string;\n\n /** Minimum acceptable settlement amount */\n minAmount?: string;\n\n /** Billing unit (e.g., \"token\", \"request\", \"second\") */\n unit?: string;\n\n /** Price per unit in smallest denomination */\n unitPrice?: string;\n};\n\n/**\n * Settlement data for NEAR upto scheme.\n */\nexport type UptoNearSettlement = {\n /** Actual amount to settle (must be <= maxAmount) */\n settleAmount: string;\n\n /** Usage details for auditing */\n usageDetails?: {\n unitsConsumed?: number;\n unitPrice?: string;\n unitType?: string;\n startTime?: number;\n endTime?: number;\n };\n};\n\n/**\n * Type guard for UptoNearPayload.\n *\n * Checks that the data has the correct structure for a NEAR upto payload,\n * distinguishing it from exact-direct payloads.\n *\n * @param data - The data to check\n * @returns True if the data is a valid UptoNearPayload\n */\nexport function isUptoNearPayload(data: unknown): data is UptoNearPayload {\n if (typeof data !== \"object\" || data === null) return false;\n const p = data as Record<string, unknown>;\n if (typeof p.txHash !== \"string\" || !p.txHash) return false;\n if (typeof p.paymentNonce !== \"string\" || !p.paymentNonce) return false;\n if (typeof p.authorization !== \"object\" || p.authorization === null) return false;\n\n const auth = p.authorization as Record<string, unknown>;\n return (\n typeof auth.from === \"string\" &&\n typeof auth.facilitator === \"string\" &&\n typeof auth.tokenContract === \"string\" &&\n typeof auth.maxAmount === \"string\" &&\n !!auth.from &&\n !!auth.facilitator\n );\n}\n"],"mappings":";AA6FO,SAAS,kBAAkB,MAAwC;AACxE,MAAI,OAAO,SAAS,YAAY,SAAS,KAAM,QAAO;AACtD,QAAM,IAAI;AACV,MAAI,OAAO,EAAE,WAAW,YAAY,CAAC,EAAE,OAAQ,QAAO;AACtD,MAAI,OAAO,EAAE,iBAAiB,YAAY,CAAC,EAAE,aAAc,QAAO;AAClE,MAAI,OAAO,EAAE,kBAAkB,YAAY,EAAE,kBAAkB,KAAM,QAAO;AAE5E,QAAM,OAAO,EAAE;AACf,SACE,OAAO,KAAK,SAAS,YACrB,OAAO,KAAK,gBAAgB,YAC5B,OAAO,KAAK,kBAAkB,YAC9B,OAAO,KAAK,cAAc,YAC1B,CAAC,CAAC,KAAK,QACP,CAAC,CAAC,KAAK;AAEX;","names":[]}
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -3,6 +3,7 @@ export { C as ClientNearSigner, E as ExactDirectNearPayload, f as FacilitatorNea
|
|
|
3
3
|
export { ExactDirectNearClient, ExactDirectNearClientConfig, NearClientConfig, registerExactDirectNearClient } from './exact-direct/client/index.mjs';
|
|
4
4
|
export { ExactDirectNearServer, ExactDirectNearServerConfig, NearResourceServerConfig, registerExactDirectNearServer } from './exact-direct/server/index.mjs';
|
|
5
5
|
export { ExactDirectNearFacilitator, ExactDirectNearFacilitatorConfig, NearFacilitatorConfig, registerExactDirectNearFacilitator } from './exact-direct/facilitator/index.mjs';
|
|
6
|
+
export { UptoNearAuthorization, UptoNearExtra, UptoNearPayload, UptoNearSettlement, isUptoNearPayload } from './upto/index.mjs';
|
|
6
7
|
import '@t402/core/types';
|
|
7
8
|
import '@t402/core/client';
|
|
8
9
|
import '@t402/core/server';
|
package/dist/esm/index.mjs
CHANGED
|
@@ -50,6 +50,9 @@ import {
|
|
|
50
50
|
rpcCall,
|
|
51
51
|
toTokenUnits
|
|
52
52
|
} from "./chunk-WANNPL6S.mjs";
|
|
53
|
+
import {
|
|
54
|
+
isUptoNearPayload
|
|
55
|
+
} from "./chunk-BYL5JL2F.mjs";
|
|
53
56
|
export {
|
|
54
57
|
DEFAULT_FT_TRANSFER_GAS,
|
|
55
58
|
DEFAULT_STORAGE_DEPOSIT,
|
|
@@ -83,6 +86,7 @@ export {
|
|
|
83
86
|
getTokenConfig,
|
|
84
87
|
isNetworkSupported,
|
|
85
88
|
isTransactionSuccessful,
|
|
89
|
+
isUptoNearPayload,
|
|
86
90
|
isValidAccountId,
|
|
87
91
|
normalizeNetwork,
|
|
88
92
|
parseFtTransferArgs,
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* NEAR Up-To Scheme Types
|
|
3
|
+
*
|
|
4
|
+
* Defines the payload and extra types for the NEAR upto payment scheme.
|
|
5
|
+
* The upto scheme uses an escrow pattern:
|
|
6
|
+
* 1. Client ft_transfers maxAmount to the facilitator's NEAR account
|
|
7
|
+
* 2. Facilitator verifies the transfer
|
|
8
|
+
* 3. Facilitator forwards settleAmount to payTo and refunds (maxAmount - settleAmount)
|
|
9
|
+
*
|
|
10
|
+
* Note: NEAR NEP-141 tokens don't have native approve/transferFrom.
|
|
11
|
+
* This implementation uses an escrow pattern instead.
|
|
12
|
+
*/
|
|
13
|
+
/**
|
|
14
|
+
* Authorization metadata for NEAR upto payments.
|
|
15
|
+
* Contains the transfer details for verification.
|
|
16
|
+
*/
|
|
17
|
+
type UptoNearAuthorization = {
|
|
18
|
+
/** Sender's NEAR account ID (e.g., "alice.near") */
|
|
19
|
+
from: string;
|
|
20
|
+
/** Facilitator's NEAR account ID that receives the initial transfer */
|
|
21
|
+
facilitator: string;
|
|
22
|
+
/** NEP-141 token contract ID (e.g., "usdt.tether-token.near") */
|
|
23
|
+
tokenContract: string;
|
|
24
|
+
/** Maximum authorized amount in smallest units (as string) */
|
|
25
|
+
maxAmount: string;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* NEAR upto payment payload.
|
|
29
|
+
* Contains the transaction hash of the client's transfer to the facilitator.
|
|
30
|
+
*/
|
|
31
|
+
type UptoNearPayload = {
|
|
32
|
+
/** NEAR transaction hash of the transfer to facilitator */
|
|
33
|
+
txHash: string;
|
|
34
|
+
/** Authorization metadata for verification */
|
|
35
|
+
authorization: UptoNearAuthorization;
|
|
36
|
+
/** Unique nonce for replay protection (hex string) */
|
|
37
|
+
paymentNonce: string;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Extra fields for upto scheme payment requirements on NEAR.
|
|
41
|
+
* Included in the PaymentRequirements.extra field.
|
|
42
|
+
*/
|
|
43
|
+
type UptoNearExtra = {
|
|
44
|
+
/** Facilitator account ID that will receive the initial transfer */
|
|
45
|
+
facilitator?: string;
|
|
46
|
+
/** Maximum payment amount authorized */
|
|
47
|
+
maxAmount?: string;
|
|
48
|
+
/** Minimum acceptable settlement amount */
|
|
49
|
+
minAmount?: string;
|
|
50
|
+
/** Billing unit (e.g., "token", "request", "second") */
|
|
51
|
+
unit?: string;
|
|
52
|
+
/** Price per unit in smallest denomination */
|
|
53
|
+
unitPrice?: string;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Settlement data for NEAR upto scheme.
|
|
57
|
+
*/
|
|
58
|
+
type UptoNearSettlement = {
|
|
59
|
+
/** Actual amount to settle (must be <= maxAmount) */
|
|
60
|
+
settleAmount: string;
|
|
61
|
+
/** Usage details for auditing */
|
|
62
|
+
usageDetails?: {
|
|
63
|
+
unitsConsumed?: number;
|
|
64
|
+
unitPrice?: string;
|
|
65
|
+
unitType?: string;
|
|
66
|
+
startTime?: number;
|
|
67
|
+
endTime?: number;
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Type guard for UptoNearPayload.
|
|
72
|
+
*
|
|
73
|
+
* Checks that the data has the correct structure for a NEAR upto payload,
|
|
74
|
+
* distinguishing it from exact-direct payloads.
|
|
75
|
+
*
|
|
76
|
+
* @param data - The data to check
|
|
77
|
+
* @returns True if the data is a valid UptoNearPayload
|
|
78
|
+
*/
|
|
79
|
+
declare function isUptoNearPayload(data: unknown): data is UptoNearPayload;
|
|
80
|
+
|
|
81
|
+
export { type UptoNearAuthorization, type UptoNearExtra, type UptoNearPayload, type UptoNearSettlement, isUptoNearPayload };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@t402/near",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"main": "./dist/cjs/index.js",
|
|
5
5
|
"module": "./dist/esm/index.js",
|
|
6
6
|
"types": "./dist/cjs/index.d.ts",
|
|
@@ -18,12 +18,12 @@
|
|
|
18
18
|
"description": "t402 Payment Protocol NEAR Implementation",
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@eslint/js": "^9.24.0",
|
|
21
|
-
"@types/node": "^
|
|
21
|
+
"@types/node": "^25.2.0",
|
|
22
22
|
"@typescript-eslint/eslint-plugin": "^8.29.1",
|
|
23
23
|
"@typescript-eslint/parser": "^8.29.1",
|
|
24
24
|
"eslint": "^9.24.0",
|
|
25
25
|
"eslint-plugin-import": "^2.31.0",
|
|
26
|
-
"eslint-plugin-jsdoc": "^
|
|
26
|
+
"eslint-plugin-jsdoc": "^62.5.0",
|
|
27
27
|
"eslint-plugin-prettier": "^5.2.6",
|
|
28
28
|
"glob": "^13.0.0",
|
|
29
29
|
"prettier": "3.5.2",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"vitest": "^3.2.4"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@t402/core": "2.
|
|
38
|
+
"@t402/core": "2.4.0"
|
|
39
39
|
},
|
|
40
40
|
"exports": {
|
|
41
41
|
".": {
|
|
@@ -77,6 +77,16 @@
|
|
|
77
77
|
"types": "./dist/cjs/exact-direct/facilitator/index.d.ts",
|
|
78
78
|
"default": "./dist/cjs/exact-direct/facilitator/index.js"
|
|
79
79
|
}
|
|
80
|
+
},
|
|
81
|
+
"./upto": {
|
|
82
|
+
"import": {
|
|
83
|
+
"types": "./dist/esm/upto/index.d.mts",
|
|
84
|
+
"default": "./dist/esm/upto/index.mjs"
|
|
85
|
+
},
|
|
86
|
+
"require": {
|
|
87
|
+
"types": "./dist/cjs/upto/index.d.ts",
|
|
88
|
+
"default": "./dist/cjs/upto/index.js"
|
|
89
|
+
}
|
|
80
90
|
}
|
|
81
91
|
},
|
|
82
92
|
"files": [
|