@t402/tezos 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +161 -0
  2. package/dist/exact-direct/client/index.d.cts +92 -0
  3. package/dist/exact-direct/client/index.d.ts +92 -0
  4. package/dist/exact-direct/client/index.js +204 -0
  5. package/dist/exact-direct/client/index.js.map +1 -0
  6. package/dist/exact-direct/client/index.mjs +176 -0
  7. package/dist/exact-direct/client/index.mjs.map +1 -0
  8. package/dist/exact-direct/facilitator/index.d.cts +110 -0
  9. package/dist/exact-direct/facilitator/index.d.ts +110 -0
  10. package/dist/exact-direct/facilitator/index.js +331 -0
  11. package/dist/exact-direct/facilitator/index.js.map +1 -0
  12. package/dist/exact-direct/facilitator/index.mjs +303 -0
  13. package/dist/exact-direct/facilitator/index.mjs.map +1 -0
  14. package/dist/exact-direct/server/index.d.cts +109 -0
  15. package/dist/exact-direct/server/index.d.ts +109 -0
  16. package/dist/exact-direct/server/index.js +226 -0
  17. package/dist/exact-direct/server/index.js.map +1 -0
  18. package/dist/exact-direct/server/index.mjs +198 -0
  19. package/dist/exact-direct/server/index.mjs.map +1 -0
  20. package/dist/index.d.cts +124 -0
  21. package/dist/index.d.ts +124 -0
  22. package/dist/index.js +228 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/index.mjs +170 -0
  25. package/dist/index.mjs.map +1 -0
  26. package/dist/types-DQMtUOa_.d.cts +125 -0
  27. package/dist/types-DQMtUOa_.d.ts +125 -0
  28. package/package.json +100 -0
  29. package/src/constants.ts +53 -0
  30. package/src/exact-direct/client/index.ts +13 -0
  31. package/src/exact-direct/client/register.ts +71 -0
  32. package/src/exact-direct/client/scheme.ts +177 -0
  33. package/src/exact-direct/facilitator/index.ts +13 -0
  34. package/src/exact-direct/facilitator/register.ts +74 -0
  35. package/src/exact-direct/facilitator/scheme.ts +311 -0
  36. package/src/exact-direct/server/index.ts +13 -0
  37. package/src/exact-direct/server/register.ts +64 -0
  38. package/src/exact-direct/server/scheme.ts +205 -0
  39. package/src/index.ts +32 -0
  40. package/src/tokens.ts +86 -0
  41. package/src/types.ts +160 -0
  42. package/src/utils.ts +128 -0
package/dist/index.js ADDED
@@ -0,0 +1,228 @@
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/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ DEFAULT_GHOSTNET_INDEXER: () => DEFAULT_GHOSTNET_INDEXER,
24
+ DEFAULT_GHOSTNET_RPC: () => DEFAULT_GHOSTNET_RPC,
25
+ DEFAULT_MAINNET_INDEXER: () => DEFAULT_MAINNET_INDEXER,
26
+ DEFAULT_MAINNET_RPC: () => DEFAULT_MAINNET_RPC,
27
+ DEFAULT_TOKENS: () => DEFAULT_TOKENS,
28
+ FA2_BALANCE_OF_ENTRYPOINT: () => FA2_BALANCE_OF_ENTRYPOINT,
29
+ FA2_TRANSFER_ENTRYPOINT: () => FA2_TRANSFER_ENTRYPOINT,
30
+ FA2_UPDATE_OPERATORS_ENTRYPOINT: () => FA2_UPDATE_OPERATORS_ENTRYPOINT,
31
+ NETWORK_CONFIGS: () => NETWORK_CONFIGS,
32
+ SCHEME_EXACT_DIRECT: () => SCHEME_EXACT_DIRECT,
33
+ SUPPORTED_NETWORKS: () => SUPPORTED_NETWORKS,
34
+ TEZOS_CAIP2_NAMESPACE: () => TEZOS_CAIP2_NAMESPACE,
35
+ TEZOS_GHOSTNET_CAIP2: () => TEZOS_GHOSTNET_CAIP2,
36
+ TEZOS_MAINNET_CAIP2: () => TEZOS_MAINNET_CAIP2,
37
+ TOKEN_REGISTRY: () => TOKEN_REGISTRY,
38
+ USDT_MAINNET: () => USDT_MAINNET,
39
+ buildNetworkId: () => buildNetworkId,
40
+ compareAddresses: () => compareAddresses,
41
+ extractFA2TransferDetails: () => extractFA2TransferDetails,
42
+ formatAmount: () => formatAmount,
43
+ getDefaultToken: () => getDefaultToken,
44
+ getIndexerUrl: () => getIndexerUrl,
45
+ getNetworkConfig: () => getNetworkConfig,
46
+ getRpcUrl: () => getRpcUrl,
47
+ getTokenByContract: () => getTokenByContract,
48
+ getTokenBySymbol: () => getTokenBySymbol,
49
+ isSupportedNetwork: () => isSupportedNetwork,
50
+ isTezosNetwork: () => isTezosNetwork,
51
+ isValidOperationHash: () => isValidOperationHash,
52
+ isValidTezosAddress: () => isValidTezosAddress,
53
+ parseAmount: () => parseAmount,
54
+ parseNetworkId: () => parseNetworkId
55
+ });
56
+ module.exports = __toCommonJS(src_exports);
57
+
58
+ // src/constants.ts
59
+ var SCHEME_EXACT_DIRECT = "exact-direct";
60
+ var TEZOS_CAIP2_NAMESPACE = "tezos";
61
+ var TEZOS_MAINNET_CAIP2 = "tezos:NetXdQprcVkpaWU";
62
+ var TEZOS_GHOSTNET_CAIP2 = "tezos:NetXnHfVqm9iesp";
63
+ var DEFAULT_MAINNET_RPC = "https://mainnet.api.tez.ie";
64
+ var DEFAULT_GHOSTNET_RPC = "https://ghostnet.tezos.marigold.dev";
65
+ var DEFAULT_MAINNET_INDEXER = "https://api.tzkt.io";
66
+ var DEFAULT_GHOSTNET_INDEXER = "https://api.ghostnet.tzkt.io";
67
+ var FA2_TRANSFER_ENTRYPOINT = "transfer";
68
+ var FA2_BALANCE_OF_ENTRYPOINT = "balance_of";
69
+ var FA2_UPDATE_OPERATORS_ENTRYPOINT = "update_operators";
70
+ var SUPPORTED_NETWORKS = [
71
+ TEZOS_MAINNET_CAIP2,
72
+ TEZOS_GHOSTNET_CAIP2
73
+ ];
74
+ var NETWORK_CONFIGS = {
75
+ [TEZOS_MAINNET_CAIP2]: {
76
+ name: "Tezos Mainnet",
77
+ rpcUrl: DEFAULT_MAINNET_RPC,
78
+ indexerUrl: DEFAULT_MAINNET_INDEXER
79
+ },
80
+ [TEZOS_GHOSTNET_CAIP2]: {
81
+ name: "Tezos Ghostnet",
82
+ rpcUrl: DEFAULT_GHOSTNET_RPC,
83
+ indexerUrl: DEFAULT_GHOSTNET_INDEXER
84
+ }
85
+ };
86
+
87
+ // src/types.ts
88
+ function isValidTezosAddress(address) {
89
+ if (!address) return false;
90
+ const prefixPattern = /^(tz1|tz2|tz3|KT1)/;
91
+ if (!prefixPattern.test(address)) return false;
92
+ return address.length === 36;
93
+ }
94
+ function isValidOperationHash(opHash) {
95
+ if (!opHash) return false;
96
+ return opHash.startsWith("o") && opHash.length === 51;
97
+ }
98
+ function isTezosNetwork(network) {
99
+ return network.startsWith("tezos:");
100
+ }
101
+
102
+ // src/tokens.ts
103
+ var USDT_MAINNET = {
104
+ contractAddress: "KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o",
105
+ tokenId: 0,
106
+ symbol: "USDt",
107
+ name: "Tether USD",
108
+ decimals: 6
109
+ };
110
+ var TOKEN_REGISTRY = {
111
+ [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],
112
+ [TEZOS_GHOSTNET_CAIP2]: []
113
+ };
114
+ var DEFAULT_TOKENS = {
115
+ [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,
116
+ [TEZOS_GHOSTNET_CAIP2]: void 0
117
+ };
118
+ function getTokenBySymbol(network, symbol) {
119
+ const tokens = TOKEN_REGISTRY[network];
120
+ if (!tokens) return void 0;
121
+ return tokens.find(
122
+ (t) => t.symbol.toLowerCase() === symbol.toLowerCase()
123
+ );
124
+ }
125
+ function getTokenByContract(network, contractAddress, tokenId) {
126
+ const tokens = TOKEN_REGISTRY[network];
127
+ if (!tokens) return void 0;
128
+ return tokens.find(
129
+ (t) => t.contractAddress.toLowerCase() === contractAddress.toLowerCase() && t.tokenId === tokenId
130
+ );
131
+ }
132
+ function getDefaultToken(network) {
133
+ return DEFAULT_TOKENS[network];
134
+ }
135
+
136
+ // src/utils.ts
137
+ function getNetworkConfig(network) {
138
+ return NETWORK_CONFIGS[network];
139
+ }
140
+ function isSupportedNetwork(network) {
141
+ return SUPPORTED_NETWORKS.includes(network);
142
+ }
143
+ function parseNetworkId(network) {
144
+ const parts = network.split(":");
145
+ if (parts.length !== 2) return null;
146
+ return {
147
+ namespace: parts[0],
148
+ reference: parts[1]
149
+ };
150
+ }
151
+ function buildNetworkId(reference) {
152
+ return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;
153
+ }
154
+ function getIndexerUrl(network) {
155
+ return NETWORK_CONFIGS[network]?.indexerUrl;
156
+ }
157
+ function getRpcUrl(network) {
158
+ return NETWORK_CONFIGS[network]?.rpcUrl;
159
+ }
160
+ function compareAddresses(addr1, addr2) {
161
+ if (!addr1 || !addr2) return false;
162
+ return addr1 === addr2;
163
+ }
164
+ function formatAmount(amount, decimals) {
165
+ const divisor = BigInt(10 ** decimals);
166
+ const wholePart = amount / divisor;
167
+ const fractionalPart = amount % divisor;
168
+ const fractionalStr = fractionalPart.toString().padStart(decimals, "0");
169
+ return `${wholePart}.${fractionalStr}`;
170
+ }
171
+ function parseAmount(amount, decimals) {
172
+ const [whole, fractional = ""] = amount.split(".");
173
+ const paddedFractional = fractional.padEnd(decimals, "0").slice(0, decimals);
174
+ return BigInt(whole + paddedFractional);
175
+ }
176
+ function extractFA2TransferDetails(parameter) {
177
+ if (!parameter || !Array.isArray(parameter)) return null;
178
+ const firstTransfer = parameter[0];
179
+ if (!firstTransfer || typeof firstTransfer !== "object") return null;
180
+ const transfer = firstTransfer;
181
+ const from = transfer.from_;
182
+ const txs = transfer.txs;
183
+ if (!from || !Array.isArray(txs) || txs.length === 0) return null;
184
+ const firstTx = txs[0];
185
+ if (!firstTx) return null;
186
+ return {
187
+ from,
188
+ to: firstTx.to_,
189
+ tokenId: typeof firstTx.token_id === "string" ? parseInt(firstTx.token_id, 10) : firstTx.token_id,
190
+ amount: String(firstTx.amount)
191
+ };
192
+ }
193
+ // Annotate the CommonJS export names for ESM import in node:
194
+ 0 && (module.exports = {
195
+ DEFAULT_GHOSTNET_INDEXER,
196
+ DEFAULT_GHOSTNET_RPC,
197
+ DEFAULT_MAINNET_INDEXER,
198
+ DEFAULT_MAINNET_RPC,
199
+ DEFAULT_TOKENS,
200
+ FA2_BALANCE_OF_ENTRYPOINT,
201
+ FA2_TRANSFER_ENTRYPOINT,
202
+ FA2_UPDATE_OPERATORS_ENTRYPOINT,
203
+ NETWORK_CONFIGS,
204
+ SCHEME_EXACT_DIRECT,
205
+ SUPPORTED_NETWORKS,
206
+ TEZOS_CAIP2_NAMESPACE,
207
+ TEZOS_GHOSTNET_CAIP2,
208
+ TEZOS_MAINNET_CAIP2,
209
+ TOKEN_REGISTRY,
210
+ USDT_MAINNET,
211
+ buildNetworkId,
212
+ compareAddresses,
213
+ extractFA2TransferDetails,
214
+ formatAmount,
215
+ getDefaultToken,
216
+ getIndexerUrl,
217
+ getNetworkConfig,
218
+ getRpcUrl,
219
+ getTokenByContract,
220
+ getTokenBySymbol,
221
+ isSupportedNetwork,
222
+ isTezosNetwork,
223
+ isValidOperationHash,
224
+ isValidTezosAddress,
225
+ parseAmount,
226
+ parseNetworkId
227
+ });
228
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/types.ts","../src/tokens.ts","../src/utils.ts"],"sourcesContent":["/**\n * @t402/tezos - Tezos (FA2) mechanism for T402 payment protocol\n *\n * This package provides client, server, and facilitator implementations\n * for processing USDT payments on Tezos using the FA2 token standard (TZIP-12).\n *\n * @example\n * ```typescript\n * // Client usage\n * import { registerExactDirectTezosClient } from \"@t402/tezos/exact-direct/client\";\n *\n * // Server usage\n * import { registerExactDirectTezosServer } from \"@t402/tezos/exact-direct/server\";\n *\n * // Facilitator usage\n * import { registerExactDirectTezosFacilitator } from \"@t402/tezos/exact-direct/facilitator\";\n * ```\n *\n * @packageDocumentation\n */\n\n// Constants\nexport * from \"./constants.js\";\n\n// Types\nexport * from \"./types.js\";\n\n// Tokens\nexport * from \"./tokens.js\";\n\n// Utilities\nexport * from \"./utils.js\";\n","/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n"],"mappings":"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","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,170 @@
1
+ // src/constants.ts
2
+ var SCHEME_EXACT_DIRECT = "exact-direct";
3
+ var TEZOS_CAIP2_NAMESPACE = "tezos";
4
+ var TEZOS_MAINNET_CAIP2 = "tezos:NetXdQprcVkpaWU";
5
+ var TEZOS_GHOSTNET_CAIP2 = "tezos:NetXnHfVqm9iesp";
6
+ var DEFAULT_MAINNET_RPC = "https://mainnet.api.tez.ie";
7
+ var DEFAULT_GHOSTNET_RPC = "https://ghostnet.tezos.marigold.dev";
8
+ var DEFAULT_MAINNET_INDEXER = "https://api.tzkt.io";
9
+ var DEFAULT_GHOSTNET_INDEXER = "https://api.ghostnet.tzkt.io";
10
+ var FA2_TRANSFER_ENTRYPOINT = "transfer";
11
+ var FA2_BALANCE_OF_ENTRYPOINT = "balance_of";
12
+ var FA2_UPDATE_OPERATORS_ENTRYPOINT = "update_operators";
13
+ var SUPPORTED_NETWORKS = [
14
+ TEZOS_MAINNET_CAIP2,
15
+ TEZOS_GHOSTNET_CAIP2
16
+ ];
17
+ var NETWORK_CONFIGS = {
18
+ [TEZOS_MAINNET_CAIP2]: {
19
+ name: "Tezos Mainnet",
20
+ rpcUrl: DEFAULT_MAINNET_RPC,
21
+ indexerUrl: DEFAULT_MAINNET_INDEXER
22
+ },
23
+ [TEZOS_GHOSTNET_CAIP2]: {
24
+ name: "Tezos Ghostnet",
25
+ rpcUrl: DEFAULT_GHOSTNET_RPC,
26
+ indexerUrl: DEFAULT_GHOSTNET_INDEXER
27
+ }
28
+ };
29
+
30
+ // src/types.ts
31
+ function isValidTezosAddress(address) {
32
+ if (!address) return false;
33
+ const prefixPattern = /^(tz1|tz2|tz3|KT1)/;
34
+ if (!prefixPattern.test(address)) return false;
35
+ return address.length === 36;
36
+ }
37
+ function isValidOperationHash(opHash) {
38
+ if (!opHash) return false;
39
+ return opHash.startsWith("o") && opHash.length === 51;
40
+ }
41
+ function isTezosNetwork(network) {
42
+ return network.startsWith("tezos:");
43
+ }
44
+
45
+ // src/tokens.ts
46
+ var USDT_MAINNET = {
47
+ contractAddress: "KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o",
48
+ tokenId: 0,
49
+ symbol: "USDt",
50
+ name: "Tether USD",
51
+ decimals: 6
52
+ };
53
+ var TOKEN_REGISTRY = {
54
+ [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],
55
+ [TEZOS_GHOSTNET_CAIP2]: []
56
+ };
57
+ var DEFAULT_TOKENS = {
58
+ [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,
59
+ [TEZOS_GHOSTNET_CAIP2]: void 0
60
+ };
61
+ function getTokenBySymbol(network, symbol) {
62
+ const tokens = TOKEN_REGISTRY[network];
63
+ if (!tokens) return void 0;
64
+ return tokens.find(
65
+ (t) => t.symbol.toLowerCase() === symbol.toLowerCase()
66
+ );
67
+ }
68
+ function getTokenByContract(network, contractAddress, tokenId) {
69
+ const tokens = TOKEN_REGISTRY[network];
70
+ if (!tokens) return void 0;
71
+ return tokens.find(
72
+ (t) => t.contractAddress.toLowerCase() === contractAddress.toLowerCase() && t.tokenId === tokenId
73
+ );
74
+ }
75
+ function getDefaultToken(network) {
76
+ return DEFAULT_TOKENS[network];
77
+ }
78
+
79
+ // src/utils.ts
80
+ function getNetworkConfig(network) {
81
+ return NETWORK_CONFIGS[network];
82
+ }
83
+ function isSupportedNetwork(network) {
84
+ return SUPPORTED_NETWORKS.includes(network);
85
+ }
86
+ function parseNetworkId(network) {
87
+ const parts = network.split(":");
88
+ if (parts.length !== 2) return null;
89
+ return {
90
+ namespace: parts[0],
91
+ reference: parts[1]
92
+ };
93
+ }
94
+ function buildNetworkId(reference) {
95
+ return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;
96
+ }
97
+ function getIndexerUrl(network) {
98
+ return NETWORK_CONFIGS[network]?.indexerUrl;
99
+ }
100
+ function getRpcUrl(network) {
101
+ return NETWORK_CONFIGS[network]?.rpcUrl;
102
+ }
103
+ function compareAddresses(addr1, addr2) {
104
+ if (!addr1 || !addr2) return false;
105
+ return addr1 === addr2;
106
+ }
107
+ function formatAmount(amount, decimals) {
108
+ const divisor = BigInt(10 ** decimals);
109
+ const wholePart = amount / divisor;
110
+ const fractionalPart = amount % divisor;
111
+ const fractionalStr = fractionalPart.toString().padStart(decimals, "0");
112
+ return `${wholePart}.${fractionalStr}`;
113
+ }
114
+ function parseAmount(amount, decimals) {
115
+ const [whole, fractional = ""] = amount.split(".");
116
+ const paddedFractional = fractional.padEnd(decimals, "0").slice(0, decimals);
117
+ return BigInt(whole + paddedFractional);
118
+ }
119
+ function extractFA2TransferDetails(parameter) {
120
+ if (!parameter || !Array.isArray(parameter)) return null;
121
+ const firstTransfer = parameter[0];
122
+ if (!firstTransfer || typeof firstTransfer !== "object") return null;
123
+ const transfer = firstTransfer;
124
+ const from = transfer.from_;
125
+ const txs = transfer.txs;
126
+ if (!from || !Array.isArray(txs) || txs.length === 0) return null;
127
+ const firstTx = txs[0];
128
+ if (!firstTx) return null;
129
+ return {
130
+ from,
131
+ to: firstTx.to_,
132
+ tokenId: typeof firstTx.token_id === "string" ? parseInt(firstTx.token_id, 10) : firstTx.token_id,
133
+ amount: String(firstTx.amount)
134
+ };
135
+ }
136
+ export {
137
+ DEFAULT_GHOSTNET_INDEXER,
138
+ DEFAULT_GHOSTNET_RPC,
139
+ DEFAULT_MAINNET_INDEXER,
140
+ DEFAULT_MAINNET_RPC,
141
+ DEFAULT_TOKENS,
142
+ FA2_BALANCE_OF_ENTRYPOINT,
143
+ FA2_TRANSFER_ENTRYPOINT,
144
+ FA2_UPDATE_OPERATORS_ENTRYPOINT,
145
+ NETWORK_CONFIGS,
146
+ SCHEME_EXACT_DIRECT,
147
+ SUPPORTED_NETWORKS,
148
+ TEZOS_CAIP2_NAMESPACE,
149
+ TEZOS_GHOSTNET_CAIP2,
150
+ TEZOS_MAINNET_CAIP2,
151
+ TOKEN_REGISTRY,
152
+ USDT_MAINNET,
153
+ buildNetworkId,
154
+ compareAddresses,
155
+ extractFA2TransferDetails,
156
+ formatAmount,
157
+ getDefaultToken,
158
+ getIndexerUrl,
159
+ getNetworkConfig,
160
+ getRpcUrl,
161
+ getTokenByContract,
162
+ getTokenBySymbol,
163
+ isSupportedNetwork,
164
+ isTezosNetwork,
165
+ isValidOperationHash,
166
+ isValidTezosAddress,
167
+ parseAmount,
168
+ parseNetworkId
169
+ };
170
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/constants.ts","../src/types.ts","../src/tokens.ts","../src/utils.ts"],"sourcesContent":["/**\n * Tezos mechanism constants\n */\n\n// Scheme identifiers\nexport const SCHEME_EXACT_DIRECT = \"exact-direct\";\n\n// CAIP-2 namespace\nexport const TEZOS_CAIP2_NAMESPACE = \"tezos\";\n\n// CAIP-2 network identifiers (derived from genesis block hash)\nexport const TEZOS_MAINNET_CAIP2 = \"tezos:NetXdQprcVkpaWU\";\nexport const TEZOS_GHOSTNET_CAIP2 = \"tezos:NetXnHfVqm9iesp\";\n\n// Default RPC endpoints\nexport const DEFAULT_MAINNET_RPC = \"https://mainnet.api.tez.ie\";\nexport const DEFAULT_GHOSTNET_RPC = \"https://ghostnet.tezos.marigold.dev\";\n\n// Default indexer API endpoints (TzKT)\nexport const DEFAULT_MAINNET_INDEXER = \"https://api.tzkt.io\";\nexport const DEFAULT_GHOSTNET_INDEXER = \"https://api.ghostnet.tzkt.io\";\n\n// FA2 token standard (TZIP-12)\nexport const FA2_TRANSFER_ENTRYPOINT = \"transfer\";\nexport const FA2_BALANCE_OF_ENTRYPOINT = \"balance_of\";\nexport const FA2_UPDATE_OPERATORS_ENTRYPOINT = \"update_operators\";\n\n// Supported networks\nexport const SUPPORTED_NETWORKS = [\n TEZOS_MAINNET_CAIP2,\n TEZOS_GHOSTNET_CAIP2,\n] as const;\n\n// Network configurations\nexport const NETWORK_CONFIGS: Record<\n string,\n {\n name: string;\n rpcUrl: string;\n indexerUrl: string;\n }\n> = {\n [TEZOS_MAINNET_CAIP2]: {\n name: \"Tezos Mainnet\",\n rpcUrl: DEFAULT_MAINNET_RPC,\n indexerUrl: DEFAULT_MAINNET_INDEXER,\n },\n [TEZOS_GHOSTNET_CAIP2]: {\n name: \"Tezos Ghostnet\",\n rpcUrl: DEFAULT_GHOSTNET_RPC,\n indexerUrl: DEFAULT_GHOSTNET_INDEXER,\n },\n};\n","/**\n * Tezos mechanism types\n */\n\nimport type { Network } from \"@t402/core/types\";\n\n/**\n * Exact-direct payment payload for Tezos\n */\nexport type ExactDirectTezosPayload = {\n /** Operation hash (o...) */\n opHash: string;\n /** Sender address (tz1/tz2/tz3...) */\n from: string;\n /** Recipient address */\n to: string;\n /** Amount in smallest units */\n amount: string;\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n};\n\n/**\n * Tezos signer interface for client-side operations\n */\nexport interface TezosSigner {\n /** Get the signer's address */\n getAddress(): Promise<string>;\n\n /**\n * Execute an FA2 transfer\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param to Recipient address\n * @param amount Amount to transfer\n * @returns Operation hash\n */\n transfer(\n contractAddress: string,\n tokenId: number,\n to: string,\n amount: bigint,\n ): Promise<string>;\n\n /**\n * Get token balance\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check (optional, defaults to signer address)\n * @returns Balance in smallest units\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address?: string,\n ): Promise<bigint>;\n}\n\n/**\n * Tezos signer interface for facilitator operations\n */\nexport interface FacilitatorTezosSigner {\n /** Get facilitator addresses for a network */\n getAddresses(network: Network): string[];\n\n /**\n * Query an operation by hash\n * @param opHash Operation hash\n * @returns Operation result or null if not found\n */\n queryOperation(opHash: string): Promise<TezosOperationResult | null>;\n\n /**\n * Get token balance for an address\n * @param contractAddress FA2 contract address\n * @param tokenId Token ID\n * @param address Address to check\n * @returns Balance as string\n */\n getBalance(\n contractAddress: string,\n tokenId: number,\n address: string,\n ): Promise<string>;\n}\n\n/**\n * Tezos operation result from indexer\n */\nexport interface TezosOperationResult {\n /** Operation hash */\n hash: string;\n /** Block level */\n level: number;\n /** Timestamp */\n timestamp: string;\n /** Status: applied, failed, backtracked, skipped */\n status: \"applied\" | \"failed\" | \"backtracked\" | \"skipped\";\n /** Sender address */\n sender: {\n address: string;\n };\n /** Target contract (for contract calls) */\n target?: {\n address: string;\n };\n /** Entrypoint called */\n entrypoint?: string;\n /** Parameter value */\n parameter?: unknown;\n /** Amount transferred (in mutez for XTZ) */\n amount?: number;\n /** Errors if failed */\n errors?: Array<{\n type: string;\n message?: string;\n }>;\n}\n\n/**\n * FA2 transfer parameter structure\n */\nexport interface FA2TransferParam {\n from_: string;\n txs: Array<{\n to_: string;\n token_id: number;\n amount: string;\n }>;\n}\n\n/**\n * Check if a string is a valid Tezos address\n */\nexport function isValidTezosAddress(address: string): boolean {\n if (!address) return false;\n // tz1, tz2, tz3 for implicit accounts, KT1 for contracts\n const prefixPattern = /^(tz1|tz2|tz3|KT1)/;\n if (!prefixPattern.test(address)) return false;\n // Base58 check - length should be 36 characters\n return address.length === 36;\n}\n\n/**\n * Check if a string is a valid Tezos operation hash\n */\nexport function isValidOperationHash(opHash: string): boolean {\n if (!opHash) return false;\n // Operation hashes start with 'o' and are 51 characters\n return opHash.startsWith(\"o\") && opHash.length === 51;\n}\n\n/**\n * Check if a network is a Tezos network\n */\nexport function isTezosNetwork(network: string): boolean {\n return network.startsWith(\"tezos:\");\n}\n","/**\n * Tezos token registry\n */\n\nimport { TEZOS_MAINNET_CAIP2, TEZOS_GHOSTNET_CAIP2 } from \"./constants.js\";\n\n/**\n * Token configuration for Tezos FA2 tokens\n */\nexport interface TokenConfig {\n /** FA2 contract address (KT1...) */\n contractAddress: string;\n /** Token ID within the FA2 contract */\n tokenId: number;\n /** Token symbol */\n symbol: string;\n /** Token name */\n name: string;\n /** Token decimals */\n decimals: number;\n}\n\n/**\n * USDT on Tezos Mainnet\n */\nexport const USDT_MAINNET: TokenConfig = {\n contractAddress: \"KT1XnTn74bUtxHfDtBmm2bGZAQfhPbvKWR8o\",\n tokenId: 0,\n symbol: \"USDt\",\n name: \"Tether USD\",\n decimals: 6,\n};\n\n/**\n * Token registry by network\n */\nexport const TOKEN_REGISTRY: Record<string, TokenConfig[]> = {\n [TEZOS_MAINNET_CAIP2]: [USDT_MAINNET],\n [TEZOS_GHOSTNET_CAIP2]: [],\n};\n\n/**\n * Default token for each network\n */\nexport const DEFAULT_TOKENS: Record<string, TokenConfig | undefined> = {\n [TEZOS_MAINNET_CAIP2]: USDT_MAINNET,\n [TEZOS_GHOSTNET_CAIP2]: undefined,\n};\n\n/**\n * Get token by symbol for a network\n */\nexport function getTokenBySymbol(\n network: string,\n symbol: string,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) => t.symbol.toLowerCase() === symbol.toLowerCase(),\n );\n}\n\n/**\n * Get token by contract address and token ID\n */\nexport function getTokenByContract(\n network: string,\n contractAddress: string,\n tokenId: number,\n): TokenConfig | undefined {\n const tokens = TOKEN_REGISTRY[network];\n if (!tokens) return undefined;\n return tokens.find(\n (t) =>\n t.contractAddress.toLowerCase() === contractAddress.toLowerCase() &&\n t.tokenId === tokenId,\n );\n}\n\n/**\n * Get default token for a network\n */\nexport function getDefaultToken(network: string): TokenConfig | undefined {\n return DEFAULT_TOKENS[network];\n}\n","/**\n * Tezos utility functions\n */\n\nimport {\n NETWORK_CONFIGS,\n TEZOS_CAIP2_NAMESPACE,\n SUPPORTED_NETWORKS,\n} from \"./constants.js\";\n\n/**\n * Get network configuration\n */\nexport function getNetworkConfig(network: string) {\n return NETWORK_CONFIGS[network];\n}\n\n/**\n * Check if a network is supported\n */\nexport function isSupportedNetwork(network: string): boolean {\n return (SUPPORTED_NETWORKS as readonly string[]).includes(network);\n}\n\n/**\n * Parse a CAIP-2 network identifier to extract the chain reference\n */\nexport function parseNetworkId(network: string): {\n namespace: string;\n reference: string;\n} | null {\n const parts = network.split(\":\");\n if (parts.length !== 2) return null;\n return {\n namespace: parts[0],\n reference: parts[1],\n };\n}\n\n/**\n * Build a CAIP-2 network identifier\n */\nexport function buildNetworkId(reference: string): string {\n return `${TEZOS_CAIP2_NAMESPACE}:${reference}`;\n}\n\n/**\n * Get indexer URL for a network\n */\nexport function getIndexerUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.indexerUrl;\n}\n\n/**\n * Get RPC URL for a network\n */\nexport function getRpcUrl(network: string): string | undefined {\n return NETWORK_CONFIGS[network]?.rpcUrl;\n}\n\n/**\n * Compare two Tezos addresses (case-insensitive for base58)\n */\nexport function compareAddresses(addr1: string, addr2: string): boolean {\n if (!addr1 || !addr2) return false;\n return addr1 === addr2;\n}\n\n/**\n * Format amount with decimals\n */\nexport function formatAmount(amount: bigint, decimals: number): string {\n const divisor = BigInt(10 ** decimals);\n const wholePart = amount / divisor;\n const fractionalPart = amount % divisor;\n const fractionalStr = fractionalPart.toString().padStart(decimals, \"0\");\n return `${wholePart}.${fractionalStr}`;\n}\n\n/**\n * Parse amount string to bigint\n */\nexport function parseAmount(amount: string, decimals: number): bigint {\n const [whole, fractional = \"\"] = amount.split(\".\");\n const paddedFractional = fractional.padEnd(decimals, \"0\").slice(0, decimals);\n return BigInt(whole + paddedFractional);\n}\n\n/**\n * Extract FA2 transfer details from operation parameter\n */\nexport function extractFA2TransferDetails(\n parameter: unknown,\n): {\n from: string;\n to: string;\n tokenId: number;\n amount: string;\n} | null {\n if (!parameter || !Array.isArray(parameter)) return null;\n\n // FA2 transfer parameter is an array of { from_: string, txs: [...] }\n const firstTransfer = parameter[0];\n if (!firstTransfer || typeof firstTransfer !== \"object\") return null;\n\n const transfer = firstTransfer as Record<string, unknown>;\n const from = transfer.from_ as string;\n const txs = transfer.txs as Array<{\n to_: string;\n token_id: number | string;\n amount: number | string;\n }>;\n\n if (!from || !Array.isArray(txs) || txs.length === 0) return null;\n\n const firstTx = txs[0];\n if (!firstTx) return null;\n\n return {\n from,\n to: firstTx.to_,\n tokenId:\n typeof firstTx.token_id === \"string\"\n ? parseInt(firstTx.token_id, 10)\n : firstTx.token_id,\n amount: String(firstTx.amount),\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,125 @@
1
+ import { Network } from '@t402/core/types';
2
+
3
+ /**
4
+ * Tezos mechanism types
5
+ */
6
+
7
+ /**
8
+ * Exact-direct payment payload for Tezos
9
+ */
10
+ type ExactDirectTezosPayload = {
11
+ /** Operation hash (o...) */
12
+ opHash: string;
13
+ /** Sender address (tz1/tz2/tz3...) */
14
+ from: string;
15
+ /** Recipient address */
16
+ to: string;
17
+ /** Amount in smallest units */
18
+ amount: string;
19
+ /** FA2 contract address (KT1...) */
20
+ contractAddress: string;
21
+ /** Token ID within the FA2 contract */
22
+ tokenId: number;
23
+ };
24
+ /**
25
+ * Tezos signer interface for client-side operations
26
+ */
27
+ interface TezosSigner {
28
+ /** Get the signer's address */
29
+ getAddress(): Promise<string>;
30
+ /**
31
+ * Execute an FA2 transfer
32
+ * @param contractAddress FA2 contract address
33
+ * @param tokenId Token ID
34
+ * @param to Recipient address
35
+ * @param amount Amount to transfer
36
+ * @returns Operation hash
37
+ */
38
+ transfer(contractAddress: string, tokenId: number, to: string, amount: bigint): Promise<string>;
39
+ /**
40
+ * Get token balance
41
+ * @param contractAddress FA2 contract address
42
+ * @param tokenId Token ID
43
+ * @param address Address to check (optional, defaults to signer address)
44
+ * @returns Balance in smallest units
45
+ */
46
+ getBalance(contractAddress: string, tokenId: number, address?: string): Promise<bigint>;
47
+ }
48
+ /**
49
+ * Tezos signer interface for facilitator operations
50
+ */
51
+ interface FacilitatorTezosSigner {
52
+ /** Get facilitator addresses for a network */
53
+ getAddresses(network: Network): string[];
54
+ /**
55
+ * Query an operation by hash
56
+ * @param opHash Operation hash
57
+ * @returns Operation result or null if not found
58
+ */
59
+ queryOperation(opHash: string): Promise<TezosOperationResult | null>;
60
+ /**
61
+ * Get token balance for an address
62
+ * @param contractAddress FA2 contract address
63
+ * @param tokenId Token ID
64
+ * @param address Address to check
65
+ * @returns Balance as string
66
+ */
67
+ getBalance(contractAddress: string, tokenId: number, address: string): Promise<string>;
68
+ }
69
+ /**
70
+ * Tezos operation result from indexer
71
+ */
72
+ interface TezosOperationResult {
73
+ /** Operation hash */
74
+ hash: string;
75
+ /** Block level */
76
+ level: number;
77
+ /** Timestamp */
78
+ timestamp: string;
79
+ /** Status: applied, failed, backtracked, skipped */
80
+ status: "applied" | "failed" | "backtracked" | "skipped";
81
+ /** Sender address */
82
+ sender: {
83
+ address: string;
84
+ };
85
+ /** Target contract (for contract calls) */
86
+ target?: {
87
+ address: string;
88
+ };
89
+ /** Entrypoint called */
90
+ entrypoint?: string;
91
+ /** Parameter value */
92
+ parameter?: unknown;
93
+ /** Amount transferred (in mutez for XTZ) */
94
+ amount?: number;
95
+ /** Errors if failed */
96
+ errors?: Array<{
97
+ type: string;
98
+ message?: string;
99
+ }>;
100
+ }
101
+ /**
102
+ * FA2 transfer parameter structure
103
+ */
104
+ interface FA2TransferParam {
105
+ from_: string;
106
+ txs: Array<{
107
+ to_: string;
108
+ token_id: number;
109
+ amount: string;
110
+ }>;
111
+ }
112
+ /**
113
+ * Check if a string is a valid Tezos address
114
+ */
115
+ declare function isValidTezosAddress(address: string): boolean;
116
+ /**
117
+ * Check if a string is a valid Tezos operation hash
118
+ */
119
+ declare function isValidOperationHash(opHash: string): boolean;
120
+ /**
121
+ * Check if a network is a Tezos network
122
+ */
123
+ declare function isTezosNetwork(network: string): boolean;
124
+
125
+ export { type ExactDirectTezosPayload as E, type FacilitatorTezosSigner as F, type TezosSigner as T, type TezosOperationResult as a, type FA2TransferParam as b, isValidOperationHash as c, isTezosNetwork as d, isValidTezosAddress as i };