@solana/connector 0.0.0 → 0.1.1

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 (47) hide show
  1. package/README.md +1460 -0
  2. package/dist/chunk-5ZUVZZWU.mjs +180 -0
  3. package/dist/chunk-5ZUVZZWU.mjs.map +1 -0
  4. package/dist/chunk-6PBQ5CXV.mjs +635 -0
  5. package/dist/chunk-6PBQ5CXV.mjs.map +1 -0
  6. package/dist/chunk-D4JGBIP7.js +314 -0
  7. package/dist/chunk-D4JGBIP7.js.map +1 -0
  8. package/dist/chunk-EGYXJT54.mjs +298 -0
  9. package/dist/chunk-EGYXJT54.mjs.map +1 -0
  10. package/dist/chunk-P4ZLJI4L.js +706 -0
  11. package/dist/chunk-P4ZLJI4L.js.map +1 -0
  12. package/dist/chunk-P5A3XNFF.js +2482 -0
  13. package/dist/chunk-P5A3XNFF.js.map +1 -0
  14. package/dist/chunk-SMUUAKC3.js +186 -0
  15. package/dist/chunk-SMUUAKC3.js.map +1 -0
  16. package/dist/chunk-TAAXHAV2.mjs +2419 -0
  17. package/dist/chunk-TAAXHAV2.mjs.map +1 -0
  18. package/dist/compat.d.mts +47 -0
  19. package/dist/compat.d.ts +47 -0
  20. package/dist/compat.js +98 -0
  21. package/dist/compat.js.map +1 -0
  22. package/dist/compat.mjs +94 -0
  23. package/dist/compat.mjs.map +1 -0
  24. package/dist/headless.d.mts +515 -0
  25. package/dist/headless.d.ts +515 -0
  26. package/dist/headless.js +445 -0
  27. package/dist/headless.js.map +1 -0
  28. package/dist/headless.mjs +4 -0
  29. package/dist/headless.mjs.map +1 -0
  30. package/dist/index.d.mts +14 -0
  31. package/dist/index.d.ts +14 -0
  32. package/dist/index.js +502 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/index.mjs +5 -0
  35. package/dist/index.mjs.map +1 -0
  36. package/dist/react.d.mts +496 -0
  37. package/dist/react.d.ts +496 -0
  38. package/dist/react.js +65 -0
  39. package/dist/react.js.map +1 -0
  40. package/dist/react.mjs +4 -0
  41. package/dist/react.mjs.map +1 -0
  42. package/dist/transaction-signer-D3csM_Mf.d.mts +199 -0
  43. package/dist/transaction-signer-D3csM_Mf.d.ts +199 -0
  44. package/dist/wallet-standard-shim-C1tisl9S.d.ts +926 -0
  45. package/dist/wallet-standard-shim-Cg0GVGwu.d.mts +926 -0
  46. package/package.json +93 -10
  47. package/index.js +0 -1
@@ -0,0 +1,186 @@
1
+ 'use strict';
2
+
3
+ var gill = require('gill');
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key != "symbol" ? key + "" : key, value);
8
+ var SENSITIVE_KEYS = [
9
+ "address",
10
+ "publickey",
11
+ "signature",
12
+ "account",
13
+ "rpcurl",
14
+ "url",
15
+ "apikey",
16
+ "api_key",
17
+ "token",
18
+ "secret",
19
+ "password",
20
+ "private",
21
+ "seed",
22
+ "mnemonic"
23
+ ], LOG_LEVELS = {
24
+ debug: 0,
25
+ info: 1,
26
+ warn: 2,
27
+ error: 3
28
+ }, SecureLogger = class {
29
+ constructor(config = {}) {
30
+ __publicField(this, "config");
31
+ let isDevelopment = typeof process < "u" && process.env?.NODE_ENV === "development";
32
+ this.config = {
33
+ enabled: config.enabled ?? isDevelopment,
34
+ level: config.level ?? "debug",
35
+ redactSensitive: config.redactSensitive ?? !isDevelopment,
36
+ prefix: config.prefix ?? "Connector",
37
+ useGillDebug: config.useGillDebug ?? true
38
+ // Default to using gill's debug system
39
+ };
40
+ }
41
+ /**
42
+ * Log debug information (lowest priority)
43
+ */
44
+ debug(message, data) {
45
+ this.log("debug", message, data);
46
+ }
47
+ /**
48
+ * Log general information
49
+ */
50
+ info(message, data) {
51
+ this.log("info", message, data);
52
+ }
53
+ /**
54
+ * Log warnings
55
+ */
56
+ warn(message, data) {
57
+ this.log("warn", message, data);
58
+ }
59
+ /**
60
+ * Log errors (highest priority)
61
+ */
62
+ error(message, data) {
63
+ this.log("error", message, data);
64
+ }
65
+ /**
66
+ * Internal log method that handles level filtering and redaction
67
+ * Integrates with gill's debug system when enabled
68
+ */
69
+ log(level, message, data) {
70
+ let gillDebugEnabled = this.config.useGillDebug ? gill.isDebugEnabled() : false;
71
+ if (!this.config.enabled && !gillDebugEnabled) return;
72
+ let effectiveLevel = this.config.level;
73
+ if (this.config.useGillDebug && typeof globalThis < "u") {
74
+ let gillLevel = globalThis.__GILL_DEBUG_LEVEL__;
75
+ gillLevel && ["debug", "info", "warn", "error"].includes(gillLevel) && (effectiveLevel = gillLevel);
76
+ }
77
+ if (LOG_LEVELS[level] < LOG_LEVELS[effectiveLevel])
78
+ return;
79
+ let processedData = this.config.redactSensitive ? this.redact(data) : data, fullMessage = processedData !== void 0 ? `${message} ${typeof processedData == "object" ? JSON.stringify(processedData, null, 2) : processedData}` : message;
80
+ if (this.config.useGillDebug && gillDebugEnabled)
81
+ gill.debug(fullMessage, level, this.config.prefix);
82
+ else {
83
+ let prefix = `[${this.config.prefix}]`;
84
+ switch (level) {
85
+ case "debug":
86
+ console.debug(prefix, message, processedData !== void 0 ? processedData : "");
87
+ break;
88
+ case "info":
89
+ console.info(prefix, message, processedData !== void 0 ? processedData : "");
90
+ break;
91
+ case "warn":
92
+ console.warn(prefix, message, processedData !== void 0 ? processedData : "");
93
+ break;
94
+ case "error":
95
+ console.error(prefix, message, processedData !== void 0 ? processedData : "");
96
+ break;
97
+ }
98
+ }
99
+ }
100
+ /**
101
+ * Recursively redact sensitive information from data
102
+ */
103
+ redact(data) {
104
+ if (data == null || typeof data != "object")
105
+ return data;
106
+ if (Array.isArray(data))
107
+ return data.map((item) => this.redact(item));
108
+ let redacted = {};
109
+ for (let [key, value] of Object.entries(data)) {
110
+ let keyLower = key.toLowerCase();
111
+ SENSITIVE_KEYS.some((sensitiveKey) => keyLower.includes(sensitiveKey)) ? redacted[key] = this.maskValue(value) : typeof value == "object" && value !== null ? redacted[key] = this.redact(value) : redacted[key] = value;
112
+ }
113
+ return redacted;
114
+ }
115
+ /**
116
+ * Mask a sensitive value for logging
117
+ * Shows first 4 and last 4 characters for strings longer than 8 chars
118
+ */
119
+ maskValue(value) {
120
+ if (value == null)
121
+ return "***";
122
+ let str = String(value);
123
+ return str.length <= 8 ? "***" : `${str.slice(0, 4)}...${str.slice(-4)}`;
124
+ }
125
+ /**
126
+ * Update logger configuration at runtime
127
+ */
128
+ updateConfig(config) {
129
+ this.config = { ...this.config, ...config };
130
+ }
131
+ /**
132
+ * Get current configuration
133
+ */
134
+ getConfig() {
135
+ return { ...this.config };
136
+ }
137
+ }; new SecureLogger({
138
+ prefix: "Connector"
139
+ });
140
+ function createLogger(prefix, config) {
141
+ return new SecureLogger({ ...config, prefix });
142
+ }
143
+
144
+ // src/utils/transaction-format.ts
145
+ function isWeb3jsTransaction(tx) {
146
+ return tx !== null && typeof tx == "object" && "serialize" in tx && typeof tx.serialize == "function";
147
+ }
148
+ function serializeTransaction(tx) {
149
+ if (isWeb3jsTransaction(tx))
150
+ return tx.serialize({
151
+ requireAllSignatures: false,
152
+ verifySignatures: false
153
+ });
154
+ if (tx instanceof Uint8Array)
155
+ return tx;
156
+ if (ArrayBuffer.isView(tx))
157
+ return new Uint8Array(tx.buffer, tx.byteOffset, tx.byteLength);
158
+ throw new Error("Unsupported transaction format - must be Transaction, VersionedTransaction, or Uint8Array");
159
+ }
160
+ function isLegacyTransaction(bytes) {
161
+ return bytes.length === 0 ? false : (bytes[0] & 128) === 0;
162
+ }
163
+ async function deserializeToWeb3jsTransaction(bytes) {
164
+ if (isLegacyTransaction(bytes)) {
165
+ let { Transaction } = await import('@solana/web3.js');
166
+ return Transaction.from(bytes);
167
+ } else {
168
+ let { VersionedTransaction } = await import('@solana/web3.js');
169
+ return VersionedTransaction.deserialize(bytes);
170
+ }
171
+ }
172
+ function prepareTransactionForWallet(tx) {
173
+ let wasWeb3js = isWeb3jsTransaction(tx);
174
+ return { serialized: serializeTransaction(tx), wasWeb3js };
175
+ }
176
+ async function convertSignedTransaction(signedBytes, wasWeb3js) {
177
+ return wasWeb3js ? await deserializeToWeb3jsTransaction(signedBytes) : signedBytes;
178
+ }
179
+
180
+ exports.__publicField = __publicField;
181
+ exports.convertSignedTransaction = convertSignedTransaction;
182
+ exports.createLogger = createLogger;
183
+ exports.isWeb3jsTransaction = isWeb3jsTransaction;
184
+ exports.prepareTransactionForWallet = prepareTransactionForWallet;
185
+ //# sourceMappingURL=chunk-SMUUAKC3.js.map
186
+ //# sourceMappingURL=chunk-SMUUAKC3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/lib/utils/secure-logger.ts","../src/utils/transaction-format.ts"],"names":["isDebugEnabled","gillDebug"],"mappings":"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","file":"chunk-SMUUAKC3.js","sourcesContent":["/**\n * @solana/connector - Secure Logger\n *\n * Production-safe logger that redacts sensitive information\n * Prevents accidental exposure of addresses, keys, and other PII in logs\n *\n * Integrates with gill's debug system:\n * - Respects `__GILL_DEBUG__` flag (enable/disable logging globally)\n * - Respects `__GILL_DEBUG_LEVEL__` (set minimum log level)\n * - Extends gill's debug with sensitive data redaction\n * - Provides unified logging API across connector and gill\n *\n * Enable gill debug:\n * ```ts\n * window.__GILL_DEBUG__ = true\n * window.__GILL_DEBUG_LEVEL__ = 'debug' // or 'info', 'warn', 'error'\n * ```\n */\n\nimport { isDebugEnabled, debug as gillDebug } from 'gill';\n\nexport type LogLevel = 'debug' | 'info' | 'warn' | 'error';\n\nexport interface SecureLoggerConfig {\n /** Enable logging (defaults to true in development, false in production) */\n enabled?: boolean;\n /** Minimum log level to output */\n level?: LogLevel;\n /** Redact sensitive information in logs (defaults to true in production) */\n redactSensitive?: boolean;\n /** Custom prefix for all log messages */\n prefix?: string;\n /** Use gill's debug system for logging (respects __GILL_DEBUG__ flags) */\n useGillDebug?: boolean;\n}\n\n/**\n * Keys that contain sensitive information that should be redacted\n */\nconst SENSITIVE_KEYS = [\n 'address',\n 'publickey',\n 'signature',\n 'account',\n 'rpcurl',\n 'url',\n 'apikey',\n 'api_key',\n 'token',\n 'secret',\n 'password',\n 'private',\n 'seed',\n 'mnemonic',\n];\n\n/**\n * Log levels in order of severity\n */\nconst LOG_LEVELS: Record<LogLevel, number> = {\n debug: 0,\n info: 1,\n warn: 2,\n error: 3,\n};\n\n/**\n * SecureLogger - Production-safe logging with automatic redaction\n *\n * Features:\n * - Integrates with gill's debug system (respects __GILL_DEBUG__ flags)\n * - Automatic redaction of sensitive data (addresses, keys, URLs)\n * - Configurable log levels (respects __GILL_DEBUG_LEVEL__)\n * - Environment-aware defaults\n * - Deep object traversal for nested sensitive data\n *\n * @example\n * ```ts\n * // Enable gill debug (affects all logging across connector + gill)\n * window.__GILL_DEBUG__ = true\n * window.__GILL_DEBUG_LEVEL__ = 'info' // Optional: filter by level\n *\n * const logger = new SecureLogger({ prefix: 'Connector' });\n *\n * logger.debug('User connected', {\n * address: '7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU', // Auto-redacted in prod\n * wallet: 'Phantom'\n * });\n * // Development: \"User connected { address: '7xKX...gAsU', wallet: 'Phantom' }\"\n * // Production: \"User connected { address: '***', wallet: 'Phantom' }\"\n * ```\n */\nexport class SecureLogger {\n private config: Required<SecureLoggerConfig>;\n\n constructor(config: SecureLoggerConfig = {}) {\n const isDevelopment = typeof process !== 'undefined' && process.env?.NODE_ENV === 'development';\n\n this.config = {\n enabled: config.enabled ?? isDevelopment,\n level: config.level ?? 'debug',\n redactSensitive: config.redactSensitive ?? !isDevelopment,\n prefix: config.prefix ?? 'Connector',\n useGillDebug: config.useGillDebug ?? true, // Default to using gill's debug system\n };\n }\n\n /**\n * Log debug information (lowest priority)\n */\n debug(message: string, data?: unknown): void {\n this.log('debug', message, data);\n }\n\n /**\n * Log general information\n */\n info(message: string, data?: unknown): void {\n this.log('info', message, data);\n }\n\n /**\n * Log warnings\n */\n warn(message: string, data?: unknown): void {\n this.log('warn', message, data);\n }\n\n /**\n * Log errors (highest priority)\n */\n error(message: string, data?: unknown): void {\n this.log('error', message, data);\n }\n\n /**\n * Internal log method that handles level filtering and redaction\n * Integrates with gill's debug system when enabled\n */\n private log(level: LogLevel, message: string, data?: unknown): void {\n // Check if logging is enabled (either via config or gill's debug system)\n const gillDebugEnabled = this.config.useGillDebug ? isDebugEnabled() : false;\n if (!this.config.enabled && !gillDebugEnabled) return;\n\n // Get effective log level (prefer gill's debug level if set)\n let effectiveLevel = this.config.level;\n if (this.config.useGillDebug && typeof globalThis !== 'undefined') {\n const gillLevel = (globalThis as { __GILL_DEBUG_LEVEL__?: string }).__GILL_DEBUG_LEVEL__;\n if (gillLevel && ['debug', 'info', 'warn', 'error'].includes(gillLevel)) {\n effectiveLevel = gillLevel as LogLevel;\n }\n }\n\n // Check if this log level should be output\n if (LOG_LEVELS[level] < LOG_LEVELS[effectiveLevel]) {\n return;\n }\n\n // Process data (redact if enabled)\n const processedData = this.config.redactSensitive ? this.redact(data) : data;\n\n // Format message with data\n const fullMessage =\n processedData !== undefined\n ? `${message} ${typeof processedData === 'object' ? JSON.stringify(processedData, null, 2) : processedData}`\n : message;\n\n // Use gill's debug system if enabled, otherwise fall back to console.*\n if (this.config.useGillDebug && gillDebugEnabled) {\n gillDebug(fullMessage, level as any, this.config.prefix);\n } else {\n const prefix = `[${this.config.prefix}]`;\n switch (level) {\n case 'debug':\n console.debug(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'info':\n console.info(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'warn':\n console.warn(prefix, message, processedData !== undefined ? processedData : '');\n break;\n case 'error':\n console.error(prefix, message, processedData !== undefined ? processedData : '');\n break;\n }\n }\n }\n\n /**\n * Recursively redact sensitive information from data\n */\n private redact(data: unknown): unknown {\n if (data === null || data === undefined) {\n return data;\n }\n\n // Handle primitives\n if (typeof data !== 'object') {\n return data;\n }\n\n // Handle arrays\n if (Array.isArray(data)) {\n return data.map(item => this.redact(item));\n }\n\n // Handle objects\n const redacted: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(data)) {\n const keyLower = key.toLowerCase();\n\n // Check if this key contains sensitive information\n const isSensitive = SENSITIVE_KEYS.some(sensitiveKey => keyLower.includes(sensitiveKey));\n\n if (isSensitive) {\n redacted[key] = this.maskValue(value);\n } else if (typeof value === 'object' && value !== null) {\n redacted[key] = this.redact(value);\n } else {\n redacted[key] = value;\n }\n }\n\n return redacted;\n }\n\n /**\n * Mask a sensitive value for logging\n * Shows first 4 and last 4 characters for strings longer than 8 chars\n */\n private maskValue(value: unknown): string {\n if (value === null || value === undefined) {\n return '***';\n }\n\n const str = String(value);\n\n // For very short strings, just mask completely\n if (str.length <= 8) {\n return '***';\n }\n\n // For longer strings, show first and last 4 characters\n return `${str.slice(0, 4)}...${str.slice(-4)}`;\n }\n\n /**\n * Update logger configuration at runtime\n */\n updateConfig(config: Partial<SecureLoggerConfig>): void {\n this.config = { ...this.config, ...config };\n }\n\n /**\n * Get current configuration\n */\n getConfig(): Required<SecureLoggerConfig> {\n return { ...this.config };\n }\n}\n\n/**\n * Default logger instance for the connector\n * Automatically configured based on NODE_ENV\n */\nexport const logger = new SecureLogger({\n prefix: 'Connector',\n});\n\n/**\n * Create a logger with a custom prefix\n *\n * @example\n * ```ts\n * const walletLogger = createLogger('WalletDetector');\n * walletLogger.debug('Scanning for wallets...');\n * // Output: [WalletDetector] Scanning for wallets...\n * ```\n */\nexport function createLogger(prefix: string, config?: Omit<SecureLoggerConfig, 'prefix'>): SecureLogger {\n return new SecureLogger({ ...config, prefix });\n}\n","/**\n * Transaction Format Utilities\n *\n * Utilities for detecting and converting between different transaction formats:\n * - web3.js Transaction/VersionedTransaction objects\n * - Serialized Uint8Array (Wallet Standard format)\n * - Other TypedArray formats\n *\n * Note: Uses dynamic imports for @solana/web3.js to avoid bundling it\n * since it's only needed for the compat layer.\n */\n\nimport type { Transaction, VersionedTransaction } from '@solana/web3.js';\nimport type { SolanaTransaction } from '../types/transactions';\n\n/**\n * Check if a value is a web3.js Transaction or VersionedTransaction object\n *\n * @param tx - Value to check\n * @returns True if it's a web3.js transaction object\n */\nexport function isWeb3jsTransaction(tx: unknown): tx is Transaction | VersionedTransaction {\n // Duck-typing: if it has a serialize method, it's likely a web3.js transaction\n return tx !== null && typeof tx === 'object' && 'serialize' in tx && typeof tx.serialize === 'function';\n}\n\n/**\n * Serialize a transaction to Uint8Array format (required for Wallet Standard)\n *\n * @param tx - Transaction to serialize (web3.js object, Uint8Array, or TypedArray)\n * @returns Serialized transaction bytes\n * @throws Error if transaction format is unsupported\n */\nexport function serializeTransaction(tx: SolanaTransaction): Uint8Array {\n // web3.js Transaction/VersionedTransaction object\n if (isWeb3jsTransaction(tx)) {\n return tx.serialize({\n requireAllSignatures: false,\n verifySignatures: false,\n });\n }\n\n // Already serialized as Uint8Array\n if (tx instanceof Uint8Array) {\n return tx;\n }\n\n // Other TypedArray format\n if (ArrayBuffer.isView(tx)) {\n return new Uint8Array(tx.buffer, tx.byteOffset, tx.byteLength);\n }\n\n throw new Error('Unsupported transaction format - must be Transaction, VersionedTransaction, or Uint8Array');\n}\n\n/**\n * Check if transaction bytes represent a legacy transaction\n * Legacy transactions have high bit = 0, versioned have high bit = 1\n *\n * @param bytes - Serialized transaction bytes\n * @returns True if legacy transaction\n */\nfunction isLegacyTransaction(bytes: Uint8Array): boolean {\n if (bytes.length === 0) return false;\n // High bit of first byte: 0 = legacy, 1 = versioned\n return (bytes[0] & 0x80) === 0;\n}\n\n/**\n * Deserialize bytes to a web3.js Transaction or VersionedTransaction object\n * Uses dynamic import to avoid bundling @solana/web3.js\n * Automatically detects legacy vs versioned format\n *\n * @param bytes - Serialized transaction bytes\n * @returns Transaction or VersionedTransaction object\n */\nexport async function deserializeToWeb3jsTransaction(bytes: Uint8Array): Promise<Transaction | VersionedTransaction> {\n if (isLegacyTransaction(bytes)) {\n // Legacy transaction - use Transaction.deserialize to preserve legacy-only fields\n const { Transaction } = await import('@solana/web3.js');\n return Transaction.from(bytes);\n } else {\n // Versioned transaction\n const { VersionedTransaction } = await import('@solana/web3.js');\n return VersionedTransaction.deserialize(bytes);\n }\n}\n\n/**\n * Smart converter that preserves the original format\n * Converts to Wallet Standard format (Uint8Array) and tracks original type\n *\n * @param tx - Transaction in any supported format\n * @returns Object with serialized bytes and format flag\n */\nexport function prepareTransactionForWallet(tx: SolanaTransaction): { serialized: Uint8Array; wasWeb3js: boolean } {\n const wasWeb3js = isWeb3jsTransaction(tx);\n const serialized = serializeTransaction(tx);\n return { serialized, wasWeb3js };\n}\n\n/**\n * Convert signed transaction bytes back to original format if needed\n *\n * @param signedBytes - Signed transaction as Uint8Array\n * @param wasWeb3js - Whether the original was a web3.js object\n * @returns Transaction in appropriate format (async if conversion needed)\n * Returns Transaction for legacy, VersionedTransaction for versioned, or Uint8Array if not web3js\n */\nexport async function convertSignedTransaction(\n signedBytes: Uint8Array,\n wasWeb3js: boolean,\n): Promise<Transaction | VersionedTransaction | Uint8Array> {\n if (wasWeb3js) {\n return await deserializeToWeb3jsTransaction(signedBytes);\n }\n return signedBytes;\n}\n"]}