@sip-protocol/sdk 0.7.3 → 0.8.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 (263) hide show
  1. package/README.md +267 -0
  2. package/dist/{TransportWebUSB-TQ7WZ4LE.mjs → TransportWebUSB-YQMAGJAJ.mjs} +12 -9
  3. package/dist/browser.d.mts +10 -4
  4. package/dist/browser.d.ts +10 -4
  5. package/dist/browser.js +47556 -19603
  6. package/dist/browser.mjs +628 -48
  7. package/dist/chunk-4GRJ5MAW.mjs +152 -0
  8. package/dist/chunk-5D7A3L3W.mjs +717 -0
  9. package/dist/chunk-64AYA5F5.mjs +7834 -0
  10. package/dist/chunk-GMDGB22A.mjs +379 -0
  11. package/dist/chunk-I534WKN7.mjs +328 -0
  12. package/dist/chunk-IBZVA5Y7.mjs +1003 -0
  13. package/dist/chunk-PRRZAWJE.mjs +223 -0
  14. package/dist/{chunk-UJCSKKID.mjs → chunk-XGB3TDIC.mjs} +13 -1
  15. package/dist/{chunk-3M3HNQCW.mjs → chunk-YWGJ77A2.mjs} +28656 -13103
  16. package/dist/{chunk-6WGN57S2.mjs → chunk-Z3K7W5S3.mjs} +48 -0
  17. package/dist/constants-LHAAUC2T.mjs +51 -0
  18. package/dist/dist-2OGQ7FED.mjs +3957 -0
  19. package/dist/dist-IFHPYLDX.mjs +254 -0
  20. package/dist/fulfillment_proof-ANHVPKTB.mjs +21 -0
  21. package/dist/funding_proof-ICFZ5LHY.mjs +21 -0
  22. package/dist/{index-DIBZHOOQ.d.ts → index-DXh2IGkz.d.ts} +21239 -10304
  23. package/dist/{index-8MQz13eJ.d.mts → index-DeE1ZzA4.d.mts} +21239 -10304
  24. package/dist/index.d.mts +9 -3
  25. package/dist/index.d.ts +9 -3
  26. package/dist/index.js +48396 -19623
  27. package/dist/index.mjs +537 -19
  28. package/dist/interface-Bf7w1PLW.d.mts +679 -0
  29. package/dist/interface-Bf7w1PLW.d.ts +679 -0
  30. package/dist/{noir-DKfEzWy9.d.mts → noir-kzbLVTei.d.mts} +31 -21
  31. package/dist/{noir-DKfEzWy9.d.ts → noir-kzbLVTei.d.ts} +31 -21
  32. package/dist/proofs/halo2.d.mts +151 -0
  33. package/dist/proofs/halo2.d.ts +151 -0
  34. package/dist/proofs/halo2.js +350 -0
  35. package/dist/proofs/halo2.mjs +11 -0
  36. package/dist/proofs/kimchi.d.mts +160 -0
  37. package/dist/proofs/kimchi.d.ts +160 -0
  38. package/dist/proofs/kimchi.js +431 -0
  39. package/dist/proofs/kimchi.mjs +13 -0
  40. package/dist/proofs/noir.d.mts +1 -1
  41. package/dist/proofs/noir.d.ts +1 -1
  42. package/dist/proofs/noir.js +74 -18
  43. package/dist/proofs/noir.mjs +84 -24
  44. package/dist/solana-U3MEGU7W.mjs +280 -0
  45. package/dist/validity_proof-3POXLPNY.mjs +21 -0
  46. package/package.json +44 -11
  47. package/src/adapters/index.ts +41 -0
  48. package/src/adapters/jupiter.ts +571 -0
  49. package/src/adapters/near-intents.ts +135 -0
  50. package/src/advisor/advisor.ts +653 -0
  51. package/src/advisor/index.ts +54 -0
  52. package/src/advisor/tools.ts +303 -0
  53. package/src/advisor/types.ts +164 -0
  54. package/src/chains/ethereum/announcement.ts +536 -0
  55. package/src/chains/ethereum/bnb-optimizations.ts +474 -0
  56. package/src/chains/ethereum/commitment.ts +522 -0
  57. package/src/chains/ethereum/constants.ts +462 -0
  58. package/src/chains/ethereum/deployment.ts +596 -0
  59. package/src/chains/ethereum/gas-estimation.ts +538 -0
  60. package/src/chains/ethereum/index.ts +268 -0
  61. package/src/chains/ethereum/optimizations.ts +614 -0
  62. package/src/chains/ethereum/privacy-adapter.ts +855 -0
  63. package/src/chains/ethereum/registry.ts +584 -0
  64. package/src/chains/ethereum/rpc.ts +905 -0
  65. package/src/chains/ethereum/stealth.ts +491 -0
  66. package/src/chains/ethereum/token.ts +790 -0
  67. package/src/chains/ethereum/transfer.ts +637 -0
  68. package/src/chains/ethereum/types.ts +456 -0
  69. package/src/chains/ethereum/viewing-key.ts +455 -0
  70. package/src/chains/near/commitment.ts +608 -0
  71. package/src/chains/near/constants.ts +284 -0
  72. package/src/chains/near/function-call.ts +871 -0
  73. package/src/chains/near/history.ts +654 -0
  74. package/src/chains/near/implicit-account.ts +840 -0
  75. package/src/chains/near/index.ts +393 -0
  76. package/src/chains/near/native-transfer.ts +658 -0
  77. package/src/chains/near/nep141.ts +775 -0
  78. package/src/chains/near/privacy-adapter.ts +889 -0
  79. package/src/chains/near/resolver.ts +971 -0
  80. package/src/chains/near/rpc.ts +1016 -0
  81. package/src/chains/near/stealth.ts +419 -0
  82. package/src/chains/near/types.ts +317 -0
  83. package/src/chains/near/viewing-key.ts +876 -0
  84. package/src/chains/solana/anchor-transfer.ts +386 -0
  85. package/src/chains/solana/commitment.ts +577 -0
  86. package/src/chains/solana/constants.ts +126 -12
  87. package/src/chains/solana/ephemeral-keys.ts +543 -0
  88. package/src/chains/solana/index.ts +252 -1
  89. package/src/chains/solana/key-derivation.ts +418 -0
  90. package/src/chains/solana/kit-compat.ts +334 -0
  91. package/src/chains/solana/optimizations.ts +560 -0
  92. package/src/chains/solana/privacy-adapter.ts +605 -0
  93. package/src/chains/solana/providers/generic.ts +47 -6
  94. package/src/chains/solana/providers/helius-enhanced-types.ts +336 -0
  95. package/src/chains/solana/providers/helius-enhanced.ts +623 -0
  96. package/src/chains/solana/providers/helius.ts +186 -33
  97. package/src/chains/solana/providers/index.ts +31 -0
  98. package/src/chains/solana/providers/interface.ts +61 -18
  99. package/src/chains/solana/providers/quicknode.ts +409 -0
  100. package/src/chains/solana/providers/triton.ts +426 -0
  101. package/src/chains/solana/providers/webhook.ts +338 -67
  102. package/src/chains/solana/rpc-client.ts +1150 -0
  103. package/src/chains/solana/scan.ts +83 -66
  104. package/src/chains/solana/sol-transfer.ts +732 -0
  105. package/src/chains/solana/spl-transfer.ts +886 -0
  106. package/src/chains/solana/stealth-scanner.ts +703 -0
  107. package/src/chains/solana/sunspot-verifier.ts +453 -0
  108. package/src/chains/solana/transaction-builder.ts +755 -0
  109. package/src/chains/solana/transfer.ts +74 -5
  110. package/src/chains/solana/types.ts +57 -6
  111. package/src/chains/solana/utils.ts +110 -0
  112. package/src/chains/solana/viewing-key.ts +807 -0
  113. package/src/compliance/fireblocks.ts +921 -0
  114. package/src/compliance/index.ts +23 -0
  115. package/src/compliance/range-sas.ts +398 -33
  116. package/src/config/endpoints.ts +100 -0
  117. package/src/crypto.ts +11 -8
  118. package/src/errors.ts +82 -0
  119. package/src/evm/erc4337-relayer.ts +830 -0
  120. package/src/evm/index.ts +47 -0
  121. package/src/fees/calculator.ts +396 -0
  122. package/src/fees/index.ts +87 -0
  123. package/src/fees/near-contract.ts +429 -0
  124. package/src/fees/types.ts +268 -0
  125. package/src/index.ts +686 -1
  126. package/src/intent.ts +6 -3
  127. package/src/logger.ts +324 -0
  128. package/src/network/index.ts +80 -0
  129. package/src/network/proxy.ts +691 -0
  130. package/src/optimizations/index.ts +541 -0
  131. package/src/oracle/types.ts +1 -0
  132. package/src/privacy-backends/arcium-types.ts +727 -0
  133. package/src/privacy-backends/arcium.ts +719 -0
  134. package/src/privacy-backends/combined-privacy.ts +866 -0
  135. package/src/privacy-backends/cspl-token.ts +595 -0
  136. package/src/privacy-backends/cspl-types.ts +512 -0
  137. package/src/privacy-backends/cspl.ts +907 -0
  138. package/src/privacy-backends/health.ts +488 -0
  139. package/src/privacy-backends/inco-types.ts +323 -0
  140. package/src/privacy-backends/inco.ts +616 -0
  141. package/src/privacy-backends/index.ts +254 -4
  142. package/src/privacy-backends/interface.ts +649 -6
  143. package/src/privacy-backends/lru-cache.ts +343 -0
  144. package/src/privacy-backends/magicblock.ts +458 -0
  145. package/src/privacy-backends/mock.ts +258 -0
  146. package/src/privacy-backends/privacycash.ts +13 -17
  147. package/src/privacy-backends/private-swap.ts +570 -0
  148. package/src/privacy-backends/rate-limiter.ts +683 -0
  149. package/src/privacy-backends/registry.ts +414 -2
  150. package/src/privacy-backends/router.ts +283 -3
  151. package/src/privacy-backends/shadowwire.ts +449 -0
  152. package/src/privacy-backends/sip-native.ts +3 -0
  153. package/src/privacy-logger.ts +191 -0
  154. package/src/production-safety.ts +373 -0
  155. package/src/proofs/aggregator.ts +1029 -0
  156. package/src/proofs/browser-composer.ts +1150 -0
  157. package/src/proofs/browser.ts +113 -25
  158. package/src/proofs/cache/index.ts +127 -0
  159. package/src/proofs/cache/interface.ts +545 -0
  160. package/src/proofs/cache/key-generator.ts +188 -0
  161. package/src/proofs/cache/lru-cache.ts +481 -0
  162. package/src/proofs/cache/multi-tier-cache.ts +575 -0
  163. package/src/proofs/cache/persistent-cache.ts +788 -0
  164. package/src/proofs/compliance-proof.ts +872 -0
  165. package/src/proofs/composer/base.ts +923 -0
  166. package/src/proofs/composer/index.ts +25 -0
  167. package/src/proofs/composer/interface.ts +518 -0
  168. package/src/proofs/composer/types.ts +383 -0
  169. package/src/proofs/converters/halo2.ts +452 -0
  170. package/src/proofs/converters/index.ts +208 -0
  171. package/src/proofs/converters/interface.ts +363 -0
  172. package/src/proofs/converters/kimchi.ts +462 -0
  173. package/src/proofs/converters/noir.ts +451 -0
  174. package/src/proofs/fallback.ts +888 -0
  175. package/src/proofs/halo2.ts +42 -0
  176. package/src/proofs/index.ts +471 -0
  177. package/src/proofs/interface.ts +13 -0
  178. package/src/proofs/kimchi.ts +42 -0
  179. package/src/proofs/lazy.ts +1004 -0
  180. package/src/proofs/mock.ts +25 -1
  181. package/src/proofs/noir.ts +110 -29
  182. package/src/proofs/orchestrator.ts +960 -0
  183. package/src/proofs/parallel/concurrency.ts +297 -0
  184. package/src/proofs/parallel/dependency-graph.ts +602 -0
  185. package/src/proofs/parallel/executor.ts +420 -0
  186. package/src/proofs/parallel/index.ts +131 -0
  187. package/src/proofs/parallel/interface.ts +685 -0
  188. package/src/proofs/parallel/worker-pool.ts +644 -0
  189. package/src/proofs/providers/halo2.ts +560 -0
  190. package/src/proofs/providers/index.ts +34 -0
  191. package/src/proofs/providers/kimchi.ts +641 -0
  192. package/src/proofs/validator.ts +881 -0
  193. package/src/proofs/verifier.ts +867 -0
  194. package/src/quantum/index.ts +112 -0
  195. package/src/quantum/winternitz-vault.ts +639 -0
  196. package/src/quantum/wots.ts +611 -0
  197. package/src/settlement/backends/direct-chain.ts +1 -0
  198. package/src/settlement/index.ts +9 -0
  199. package/src/settlement/router.ts +732 -46
  200. package/src/solana/index.ts +72 -0
  201. package/src/solana/jito-relayer.ts +687 -0
  202. package/src/solana/noir-verifier-types.ts +430 -0
  203. package/src/solana/noir-verifier.ts +816 -0
  204. package/src/stealth/address-derivation.ts +193 -0
  205. package/src/stealth/ed25519.ts +431 -0
  206. package/src/stealth/index.ts +233 -0
  207. package/src/stealth/meta-address.ts +221 -0
  208. package/src/stealth/secp256k1.ts +368 -0
  209. package/src/stealth/utils.ts +194 -0
  210. package/src/stealth.ts +50 -1504
  211. package/src/sync/index.ts +106 -0
  212. package/src/sync/manager.ts +504 -0
  213. package/src/sync/mock-provider.ts +318 -0
  214. package/src/sync/oblivious.ts +625 -0
  215. package/src/tokens/index.ts +15 -0
  216. package/src/tokens/registry.ts +301 -0
  217. package/src/utils/deprecation.ts +94 -0
  218. package/src/utils/index.ts +9 -0
  219. package/src/wallet/ethereum/index.ts +68 -0
  220. package/src/wallet/ethereum/metamask-privacy.ts +420 -0
  221. package/src/wallet/ethereum/multi-wallet.ts +646 -0
  222. package/src/wallet/ethereum/privacy-adapter.ts +700 -0
  223. package/src/wallet/ethereum/types.ts +3 -1
  224. package/src/wallet/ethereum/walletconnect-adapter.ts +675 -0
  225. package/src/wallet/hardware/index.ts +10 -0
  226. package/src/wallet/hardware/ledger-privacy.ts +414 -0
  227. package/src/wallet/index.ts +71 -0
  228. package/src/wallet/near/adapter.ts +626 -0
  229. package/src/wallet/near/index.ts +86 -0
  230. package/src/wallet/near/meteor-wallet.ts +1153 -0
  231. package/src/wallet/near/my-near-wallet.ts +790 -0
  232. package/src/wallet/near/wallet-selector.ts +702 -0
  233. package/src/wallet/solana/adapter.ts +6 -4
  234. package/src/wallet/solana/index.ts +13 -0
  235. package/src/wallet/solana/privacy-adapter.ts +567 -0
  236. package/src/wallet/sui/types.ts +6 -4
  237. package/src/zcash/rpc-client.ts +13 -6
  238. package/dist/chunk-2XIVXWHA.mjs +0 -1930
  239. package/dist/chunk-3INS3PR5.mjs +0 -884
  240. package/dist/chunk-3OVABDRH.mjs +0 -17096
  241. package/dist/chunk-7RFRWDCW.mjs +0 -1504
  242. package/dist/chunk-DLDWZFYC.mjs +0 -1495
  243. package/dist/chunk-E6SZWREQ.mjs +0 -57
  244. package/dist/chunk-F6F73W35.mjs +0 -16166
  245. package/dist/chunk-G33LB27A.mjs +0 -16166
  246. package/dist/chunk-HGU6HZRC.mjs +0 -231
  247. package/dist/chunk-L2K34JCU.mjs +0 -1496
  248. package/dist/chunk-OFDBEIEK.mjs +0 -16166
  249. package/dist/chunk-SF7YSLF5.mjs +0 -1515
  250. package/dist/chunk-SN4ZDTVW.mjs +0 -16166
  251. package/dist/chunk-WWUSGOXE.mjs +0 -17129
  252. package/dist/constants-VOI7BSLK.mjs +0 -27
  253. package/dist/index-B71aXVzk.d.ts +0 -13264
  254. package/dist/index-BYZbDjal.d.ts +0 -11390
  255. package/dist/index-CHB3KuOB.d.mts +0 -11859
  256. package/dist/index-CzWPI6Le.d.ts +0 -11859
  257. package/dist/index-pOIIuwfV.d.mts +0 -13264
  258. package/dist/index-xbWjohNq.d.mts +0 -11390
  259. package/dist/solana-4O4K45VU.mjs +0 -46
  260. package/dist/solana-5EMCTPTS.mjs +0 -46
  261. package/dist/solana-NDABAZ6P.mjs +0 -56
  262. package/dist/solana-Q4NAVBTS.mjs +0 -46
  263. package/dist/solana-ZYO63LY5.mjs +0 -46
@@ -0,0 +1,284 @@
1
+ /**
2
+ * NEAR Chain Constants
3
+ *
4
+ * Token addresses, RPC endpoints, and configuration for NEAR same-chain privacy.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+
9
+ /**
10
+ * Get environment variable or return default
11
+ * Works in both Node.js and browser environments
12
+ */
13
+ function getEnvVar(name: string, defaultValue: string): string {
14
+ if (typeof process !== 'undefined' && process.env) {
15
+ return process.env[name] || defaultValue
16
+ }
17
+ return defaultValue
18
+ }
19
+
20
+ /**
21
+ * NEAR RPC endpoints by network
22
+ */
23
+ export const NEAR_RPC_ENDPOINTS = {
24
+ mainnet: getEnvVar('NEAR_MAINNET_RPC', 'https://rpc.mainnet.near.org'),
25
+ testnet: getEnvVar('NEAR_TESTNET_RPC', 'https://rpc.testnet.near.org'),
26
+ betanet: getEnvVar('NEAR_BETANET_RPC', 'https://rpc.betanet.near.org'),
27
+ localnet: getEnvVar('NEAR_LOCALNET_RPC', 'http://localhost:3030'),
28
+ } as const
29
+
30
+ /**
31
+ * NEAR network types
32
+ */
33
+ export type NEARNetwork = keyof typeof NEAR_RPC_ENDPOINTS
34
+
35
+ /**
36
+ * NEAR explorer URLs by network
37
+ */
38
+ export const NEAR_EXPLORER_URLS = {
39
+ mainnet: 'https://nearblocks.io',
40
+ testnet: 'https://testnet.nearblocks.io',
41
+ betanet: 'https://betanet.nearblocks.io',
42
+ localnet: getEnvVar('NEAR_LOCALNET_EXPLORER', 'http://localhost:3000'),
43
+ } as const
44
+
45
+ /**
46
+ * Common NEP-141 token contract addresses on NEAR mainnet
47
+ */
48
+ export const NEAR_TOKEN_CONTRACTS = {
49
+ /** Wrapped NEAR (wNEAR) */
50
+ wNEAR: 'wrap.near',
51
+ /** USD Coin (USDC.e) - Bridged from Ethereum */
52
+ USDC: 'a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48.factory.bridge.near',
53
+ /** Tether USD (USDT.e) - Bridged from Ethereum */
54
+ USDT: 'dac17f958d2ee523a2206206994597c13d831ec7.factory.bridge.near',
55
+ /** Aurora */
56
+ AURORA: 'aaaaaa20d9e0e2461697782ef11675f668207961.factory.bridge.near',
57
+ /** REF Finance */
58
+ REF: 'token.v2.ref-finance.near',
59
+ /** Linear Protocol */
60
+ LINEAR: 'linear-protocol.near',
61
+ /** Meta Pool stNEAR */
62
+ stNEAR: 'meta-pool.near',
63
+ } as const
64
+
65
+ /**
66
+ * Token decimals for NEAR tokens
67
+ */
68
+ export const NEAR_TOKEN_DECIMALS: Record<string, number> = {
69
+ NEAR: 24,
70
+ wNEAR: 24,
71
+ USDC: 6,
72
+ USDT: 6,
73
+ AURORA: 18,
74
+ REF: 18,
75
+ LINEAR: 24,
76
+ stNEAR: 24,
77
+ }
78
+
79
+ /**
80
+ * SIP announcement prefix for NEAR memos
81
+ * Format: SIP:1:<ephemeral_pubkey_hex>:<view_tag_hex>
82
+ */
83
+ export const SIP_MEMO_PREFIX = 'SIP:1:'
84
+
85
+ /**
86
+ * NEAR implicit account length (64 hex characters = 32 bytes)
87
+ */
88
+ export const NEAR_IMPLICIT_ACCOUNT_LENGTH = 64
89
+
90
+ /**
91
+ * Minimum NEAR account ID length (e.g., "a.near")
92
+ */
93
+ export const NEAR_ACCOUNT_ID_MIN_LENGTH = 2
94
+
95
+ /**
96
+ * Maximum NEAR account ID length (64 chars for implicit, longer for named)
97
+ */
98
+ export const NEAR_ACCOUNT_ID_MAX_LENGTH = 64
99
+
100
+ /**
101
+ * Ed25519 key size in bytes
102
+ */
103
+ export const ED25519_KEY_BYTES = 32
104
+
105
+ /**
106
+ * Ed25519 key hex length including '0x' prefix
107
+ */
108
+ export const ED25519_KEY_HEX_LENGTH = 66
109
+
110
+ /**
111
+ * View tag minimum value
112
+ */
113
+ export const VIEW_TAG_MIN = 0
114
+
115
+ /**
116
+ * View tag maximum value (1 byte)
117
+ */
118
+ export const VIEW_TAG_MAX = 255
119
+
120
+ /**
121
+ * Default gas for NEAR transactions (300 TGas)
122
+ */
123
+ export const DEFAULT_GAS = 300_000_000_000_000n
124
+
125
+ /**
126
+ * Minimum storage balance for NEAR accounts (0.00125 NEAR)
127
+ */
128
+ export const STORAGE_BALANCE_MIN = 1_250_000_000_000_000_000_000n
129
+
130
+ /**
131
+ * Default storage deposit for NEP-141 token registration (0.0125 NEAR)
132
+ */
133
+ export const STORAGE_DEPOSIT_DEFAULT = 12_500_000_000_000_000_000_000n
134
+
135
+ /**
136
+ * One yoctoNEAR (smallest unit)
137
+ */
138
+ export const ONE_YOCTO = 1n
139
+
140
+ /**
141
+ * One NEAR in yoctoNEAR
142
+ */
143
+ export const ONE_NEAR = 1_000_000_000_000_000_000_000_000n
144
+
145
+ /**
146
+ * Get explorer URL for a transaction
147
+ */
148
+ export function getExplorerUrl(
149
+ txHash: string,
150
+ network: NEARNetwork = 'mainnet'
151
+ ): string {
152
+ const baseUrl = NEAR_EXPLORER_URLS[network]
153
+ return `${baseUrl}/txns/${txHash}`
154
+ }
155
+
156
+ /**
157
+ * Get explorer URL for an account
158
+ */
159
+ export function getAccountExplorerUrl(
160
+ accountId: string,
161
+ network: NEARNetwork = 'mainnet'
162
+ ): string {
163
+ const baseUrl = NEAR_EXPLORER_URLS[network]
164
+ return `${baseUrl}/address/${accountId}`
165
+ }
166
+
167
+ /**
168
+ * Get token contract address from symbol
169
+ */
170
+ export function getTokenContract(symbol: string): string | undefined {
171
+ return NEAR_TOKEN_CONTRACTS[symbol as keyof typeof NEAR_TOKEN_CONTRACTS]
172
+ }
173
+
174
+ /**
175
+ * Get token decimals from symbol
176
+ *
177
+ * @deprecated Use `getTokenDecimals(symbol, 'near')` from the main SDK export
178
+ * which throws on unknown tokens instead of silently returning 24.
179
+ */
180
+ export function getNEARTokenDecimals(symbol: string): number {
181
+ return NEAR_TOKEN_DECIMALS[symbol] ?? 24 // Default to 24 (NEAR decimals)
182
+ }
183
+
184
+ /**
185
+ * Check if an account ID is an implicit account (64 hex chars)
186
+ */
187
+ export function isImplicitAccount(accountId: string): boolean {
188
+ return (
189
+ accountId.length === NEAR_IMPLICIT_ACCOUNT_LENGTH &&
190
+ /^[0-9a-f]{64}$/i.test(accountId)
191
+ )
192
+ }
193
+
194
+ /**
195
+ * Check if an account ID is a named account (e.g., "alice.near")
196
+ */
197
+ export function isNamedAccount(accountId: string): boolean {
198
+ return (
199
+ !isImplicitAccount(accountId) &&
200
+ /^[a-z0-9._-]+$/.test(accountId) &&
201
+ accountId.includes('.')
202
+ )
203
+ }
204
+
205
+ /**
206
+ * Validate a NEAR account ID format
207
+ */
208
+ export function isValidAccountId(accountId: string): boolean {
209
+ if (!accountId || typeof accountId !== 'string') {
210
+ return false
211
+ }
212
+
213
+ // Implicit accounts: 64 hex characters
214
+ if (isImplicitAccount(accountId)) {
215
+ return true
216
+ }
217
+
218
+ // Named accounts: lowercase alphanumeric with dots, dashes, underscores
219
+ // Min 2 chars, max 64 chars
220
+ if (
221
+ accountId.length >= NEAR_ACCOUNT_ID_MIN_LENGTH &&
222
+ accountId.length <= NEAR_ACCOUNT_ID_MAX_LENGTH &&
223
+ /^[a-z0-9._-]+$/.test(accountId) &&
224
+ !accountId.startsWith('.') &&
225
+ !accountId.startsWith('-') &&
226
+ !accountId.startsWith('_') &&
227
+ !accountId.endsWith('.') &&
228
+ !accountId.endsWith('-') &&
229
+ !accountId.endsWith('_')
230
+ ) {
231
+ return true
232
+ }
233
+
234
+ return false
235
+ }
236
+
237
+ /**
238
+ * Sanitize a URL by masking potential credentials
239
+ *
240
+ * @param url - URL string to sanitize
241
+ * @returns Sanitized URL safe for logging/error messages
242
+ */
243
+ export function sanitizeUrl(url: string): string {
244
+ try {
245
+ const parsed = new URL(url)
246
+
247
+ if (parsed.username || parsed.password) {
248
+ parsed.username = '***'
249
+ parsed.password = ''
250
+ }
251
+
252
+ const sensitivePatterns = [
253
+ 'api-key',
254
+ 'apikey',
255
+ 'api_key',
256
+ 'key',
257
+ 'token',
258
+ 'x-token',
259
+ 'secret',
260
+ 'auth',
261
+ ]
262
+ const keysToMask: string[] = []
263
+ for (const [key] of parsed.searchParams) {
264
+ const keyLower = key.toLowerCase()
265
+ if (
266
+ sensitivePatterns.some(
267
+ (pattern) => keyLower === pattern || keyLower.includes(pattern)
268
+ )
269
+ ) {
270
+ keysToMask.push(key)
271
+ }
272
+ }
273
+ for (const key of keysToMask) {
274
+ parsed.searchParams.set(key, '***')
275
+ }
276
+
277
+ return parsed.toString()
278
+ } catch {
279
+ return url
280
+ .replace(/api-key=[^&]+/gi, 'api-key=***')
281
+ .replace(/apikey=[^&]+/gi, 'apikey=***')
282
+ .replace(/token=[^&]+/gi, 'token=***')
283
+ }
284
+ }