@formo/analytics 1.27.0 → 1.28.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 (74) hide show
  1. package/dist/cjs/src/FormoAnalytics.d.ts +69 -12
  2. package/dist/cjs/src/FormoAnalytics.js +273 -147
  3. package/dist/cjs/src/event/EventFactory.d.ts +10 -2
  4. package/dist/cjs/src/event/EventFactory.js +32 -21
  5. package/dist/cjs/src/index.d.ts +4 -0
  6. package/dist/cjs/src/index.js +6 -0
  7. package/dist/cjs/src/privy/index.d.ts +9 -0
  8. package/dist/cjs/src/privy/index.js +12 -0
  9. package/dist/cjs/src/privy/types.d.ts +176 -0
  10. package/dist/cjs/src/privy/types.js +12 -0
  11. package/dist/cjs/src/privy/utils.d.ts +32 -0
  12. package/dist/cjs/src/privy/utils.js +191 -0
  13. package/dist/cjs/src/session/index.js +2 -1
  14. package/dist/cjs/src/solana/SolanaAdapter.d.ts +211 -0
  15. package/dist/cjs/src/solana/SolanaAdapter.js +975 -0
  16. package/dist/cjs/src/solana/SolanaManager.d.ts +24 -0
  17. package/dist/cjs/src/solana/SolanaManager.js +80 -0
  18. package/dist/cjs/src/solana/address.d.ts +72 -0
  19. package/dist/cjs/src/solana/address.js +176 -0
  20. package/dist/cjs/src/solana/index.d.ts +13 -0
  21. package/dist/cjs/src/solana/index.js +32 -0
  22. package/dist/cjs/src/solana/types.d.ts +206 -0
  23. package/dist/cjs/src/solana/types.js +80 -0
  24. package/dist/cjs/src/types/base.d.ts +17 -0
  25. package/dist/cjs/src/types/events.d.ts +4 -3
  26. package/dist/cjs/src/utils/address.d.ts +21 -0
  27. package/dist/cjs/src/utils/address.js +48 -1
  28. package/dist/cjs/src/utils/builderCode.d.ts +30 -0
  29. package/dist/cjs/src/utils/builderCode.js +143 -0
  30. package/dist/cjs/src/utils/index.d.ts +1 -0
  31. package/dist/cjs/src/utils/index.js +1 -0
  32. package/dist/cjs/src/version.d.ts +1 -1
  33. package/dist/cjs/src/version.js +1 -1
  34. package/dist/cjs/src/wagmi/WagmiEventHandler.js +13 -15
  35. package/dist/cjs/src/wagmi/utils.d.ts +5 -0
  36. package/dist/cjs/src/wagmi/utils.js +20 -0
  37. package/dist/esm/src/FormoAnalytics.d.ts +69 -12
  38. package/dist/esm/src/FormoAnalytics.js +274 -148
  39. package/dist/esm/src/event/EventFactory.d.ts +10 -2
  40. package/dist/esm/src/event/EventFactory.js +34 -23
  41. package/dist/esm/src/index.d.ts +4 -0
  42. package/dist/esm/src/index.js +3 -0
  43. package/dist/esm/src/privy/index.d.ts +9 -0
  44. package/dist/esm/src/privy/index.js +8 -0
  45. package/dist/esm/src/privy/types.d.ts +176 -0
  46. package/dist/esm/src/privy/types.js +11 -0
  47. package/dist/esm/src/privy/utils.d.ts +32 -0
  48. package/dist/esm/src/privy/utils.js +188 -0
  49. package/dist/esm/src/session/index.js +2 -1
  50. package/dist/esm/src/solana/SolanaAdapter.d.ts +211 -0
  51. package/dist/esm/src/solana/SolanaAdapter.js +972 -0
  52. package/dist/esm/src/solana/SolanaManager.d.ts +24 -0
  53. package/dist/esm/src/solana/SolanaManager.js +77 -0
  54. package/dist/esm/src/solana/address.d.ts +72 -0
  55. package/dist/esm/src/solana/address.js +167 -0
  56. package/dist/esm/src/solana/index.d.ts +13 -0
  57. package/dist/esm/src/solana/index.js +13 -0
  58. package/dist/esm/src/solana/types.d.ts +206 -0
  59. package/dist/esm/src/solana/types.js +74 -0
  60. package/dist/esm/src/types/base.d.ts +17 -0
  61. package/dist/esm/src/types/events.d.ts +4 -3
  62. package/dist/esm/src/utils/address.d.ts +21 -0
  63. package/dist/esm/src/utils/address.js +45 -0
  64. package/dist/esm/src/utils/builderCode.d.ts +30 -0
  65. package/dist/esm/src/utils/builderCode.js +140 -0
  66. package/dist/esm/src/utils/index.d.ts +1 -0
  67. package/dist/esm/src/utils/index.js +1 -0
  68. package/dist/esm/src/version.d.ts +1 -1
  69. package/dist/esm/src/version.js +1 -1
  70. package/dist/esm/src/wagmi/WagmiEventHandler.js +14 -16
  71. package/dist/esm/src/wagmi/utils.d.ts +5 -0
  72. package/dist/esm/src/wagmi/utils.js +19 -0
  73. package/dist/index.umd.min.js +1 -1
  74. package/package.json +15 -3
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SolanaManager
3
+ *
4
+ * Manages the lifecycle of the SolanaAdapter, handling lazy initialization
5
+ * and pending configuration. This keeps Solana-specific lifecycle logic out of
6
+ * the main FormoAnalytics class.
7
+ */
8
+ import { FormoAnalytics } from "../FormoAnalytics";
9
+ import { SolanaAdapter } from "./SolanaAdapter";
10
+ import { ISolanaAdapter, SolanaWalletContext, SolanaConnection, SolanaCluster, SolanaOptions } from "./types";
11
+ export declare class SolanaManager {
12
+ private formo;
13
+ private handler?;
14
+ private pendingConnection?;
15
+ private pendingCluster?;
16
+ constructor(formo: FormoAnalytics, options?: SolanaOptions);
17
+ get adapter(): SolanaAdapter | undefined;
18
+ setWallet(wallet: ISolanaAdapter | SolanaWalletContext | null): void;
19
+ setConnection(connection: SolanaConnection | null): void;
20
+ setCluster(cluster: SolanaCluster): void;
21
+ syncWalletState(): void;
22
+ cleanup(): void;
23
+ }
24
+ //# sourceMappingURL=SolanaManager.d.ts.map
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * SolanaManager
4
+ *
5
+ * Manages the lifecycle of the SolanaAdapter, handling lazy initialization
6
+ * and pending configuration. This keeps Solana-specific lifecycle logic out of
7
+ * the main FormoAnalytics class.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.SolanaManager = void 0;
11
+ var logger_1 = require("../logger");
12
+ var SolanaAdapter_1 = require("./SolanaAdapter");
13
+ var SolanaManager = /** @class */ (function () {
14
+ function SolanaManager(formo, options) {
15
+ this.formo = formo;
16
+ if (options === null || options === void 0 ? void 0 : options.wallet) {
17
+ logger_1.logger.info("SolanaManager: Initializing Solana wallet tracking");
18
+ this.handler = new SolanaAdapter_1.SolanaAdapter(formo, {
19
+ wallet: options.wallet,
20
+ connection: options.connection,
21
+ cluster: options.cluster,
22
+ });
23
+ }
24
+ else if (options) {
25
+ // Store pending values for when wallet is set later
26
+ this.pendingConnection = options.connection;
27
+ this.pendingCluster = options.cluster;
28
+ }
29
+ }
30
+ Object.defineProperty(SolanaManager.prototype, "adapter", {
31
+ get: function () {
32
+ return this.handler;
33
+ },
34
+ enumerable: false,
35
+ configurable: true
36
+ });
37
+ SolanaManager.prototype.setWallet = function (wallet) {
38
+ if (this.handler) {
39
+ this.handler.setWallet(wallet);
40
+ }
41
+ else if (wallet) {
42
+ logger_1.logger.info("SolanaManager: Initializing Solana wallet tracking (lazy)");
43
+ this.handler = new SolanaAdapter_1.SolanaAdapter(this.formo, {
44
+ wallet: wallet,
45
+ connection: this.pendingConnection,
46
+ cluster: this.pendingCluster,
47
+ });
48
+ this.pendingConnection = undefined;
49
+ this.pendingCluster = undefined;
50
+ }
51
+ };
52
+ SolanaManager.prototype.setConnection = function (connection) {
53
+ if (this.handler) {
54
+ this.handler.setConnection(connection);
55
+ }
56
+ else {
57
+ this.pendingConnection = connection !== null && connection !== void 0 ? connection : undefined;
58
+ }
59
+ };
60
+ SolanaManager.prototype.setCluster = function (cluster) {
61
+ if (this.handler) {
62
+ this.handler.setCluster(cluster);
63
+ }
64
+ else {
65
+ this.pendingCluster = cluster;
66
+ }
67
+ };
68
+ SolanaManager.prototype.syncWalletState = function () {
69
+ var _a;
70
+ (_a = this.handler) === null || _a === void 0 ? void 0 : _a.syncWalletState();
71
+ };
72
+ SolanaManager.prototype.cleanup = function () {
73
+ var _a;
74
+ (_a = this.handler) === null || _a === void 0 ? void 0 : _a.cleanup();
75
+ this.handler = undefined;
76
+ };
77
+ return SolanaManager;
78
+ }());
79
+ exports.SolanaManager = SolanaManager;
80
+ //# sourceMappingURL=SolanaManager.js.map
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Solana address validation utilities
3
+ *
4
+ * Solana uses Base58 encoded 32-byte public keys as addresses.
5
+ * Format: FDKJvWcJNe6wecbgDYDFPCfgs14aJnVsUfWQRYWLn4Tn (32-44 characters)
6
+ *
7
+ * @see https://solana.com/developers/courses/intro-to-solana/interact-with-wallets
8
+ */
9
+ import { SolanaPublicKey } from "./types";
10
+ /**
11
+ * System program addresses and other special Solana addresses
12
+ * These are valid addresses but may not represent user wallets
13
+ */
14
+ export declare const SOLANA_SYSTEM_ADDRESSES: {
15
+ readonly SYSTEM_PROGRAM: "11111111111111111111111111111111";
16
+ readonly TOKEN_PROGRAM: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";
17
+ readonly TOKEN_2022_PROGRAM: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb";
18
+ readonly ASSOCIATED_TOKEN_PROGRAM: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL";
19
+ readonly RENT_SYSVAR: "SysvarRent111111111111111111111111111111111";
20
+ readonly CLOCK_SYSVAR: "SysvarC1ock11111111111111111111111111111111";
21
+ };
22
+ /**
23
+ * Check if a string is a valid Solana address format
24
+ *
25
+ * This performs format validation only (length and character set).
26
+ * It does NOT validate that the address is a valid point on the Ed25519 curve.
27
+ *
28
+ * @param value The value to check
29
+ * @returns true if the value is a valid Solana address format
30
+ */
31
+ export declare function isSolanaAddress(value: unknown): value is string;
32
+ /**
33
+ * Get a valid Solana address from a string or PublicKey
34
+ *
35
+ * @param address The address to validate (string or PublicKey)
36
+ * @returns The address string if valid, null otherwise
37
+ */
38
+ export declare function getValidSolanaAddress(address: string | SolanaPublicKey | null | undefined): string | null;
39
+ /**
40
+ * Check if a Solana address is a system program or well-known program address
41
+ *
42
+ * @param address The address to check
43
+ * @returns true if the address is a system/program address
44
+ */
45
+ export declare function isSolanaSystemAddress(address: string): boolean;
46
+ /**
47
+ * Check if a Solana address is blocked (should not emit events)
48
+ *
49
+ * For Solana, we block system program addresses as they don't represent user wallets.
50
+ *
51
+ * @param address The address to check
52
+ * @returns true if the address should be blocked
53
+ */
54
+ export declare function isBlockedSolanaAddress(address: string | SolanaPublicKey | null | undefined): boolean;
55
+ /**
56
+ * Convert a Solana PublicKey to a string address
57
+ *
58
+ * @param publicKey The public key to convert
59
+ * @returns The Base58 encoded address string, or null if invalid
60
+ */
61
+ export declare function publicKeyToAddress(publicKey: SolanaPublicKey | null | undefined): string | null;
62
+ /**
63
+ * Check if two Solana addresses are equal (case-sensitive comparison)
64
+ *
65
+ * Unlike EVM addresses, Solana addresses are case-sensitive Base58.
66
+ *
67
+ * @param address1 First address
68
+ * @param address2 Second address
69
+ * @returns true if addresses are equal
70
+ */
71
+ export declare function areSolanaAddressesEqual(address1: string | SolanaPublicKey | null | undefined, address2: string | SolanaPublicKey | null | undefined): boolean;
72
+ //# sourceMappingURL=address.d.ts.map
@@ -0,0 +1,176 @@
1
+ "use strict";
2
+ /**
3
+ * Solana address validation utilities
4
+ *
5
+ * Solana uses Base58 encoded 32-byte public keys as addresses.
6
+ * Format: FDKJvWcJNe6wecbgDYDFPCfgs14aJnVsUfWQRYWLn4Tn (32-44 characters)
7
+ *
8
+ * @see https://solana.com/developers/courses/intro-to-solana/interact-with-wallets
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.SOLANA_SYSTEM_ADDRESSES = void 0;
12
+ exports.isSolanaAddress = isSolanaAddress;
13
+ exports.getValidSolanaAddress = getValidSolanaAddress;
14
+ exports.isSolanaSystemAddress = isSolanaSystemAddress;
15
+ exports.isBlockedSolanaAddress = isBlockedSolanaAddress;
16
+ exports.publicKeyToAddress = publicKeyToAddress;
17
+ exports.areSolanaAddressesEqual = areSolanaAddressesEqual;
18
+ /**
19
+ * Base58 alphabet used by Solana (Bitcoin alphabet)
20
+ */
21
+ var BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
22
+ /**
23
+ * Set for O(1) lookup of valid Base58 characters
24
+ */
25
+ var BASE58_CHAR_SET = new Set(BASE58_ALPHABET);
26
+ /**
27
+ * Minimum length of a Solana address (Base58 encoded)
28
+ * A 32-byte key will be at least 32 characters when Base58 encoded
29
+ */
30
+ var MIN_SOLANA_ADDRESS_LENGTH = 32;
31
+ /**
32
+ * Maximum length of a Solana address (Base58 encoded)
33
+ * A 32-byte key will be at most 44 characters when Base58 encoded
34
+ */
35
+ var MAX_SOLANA_ADDRESS_LENGTH = 44;
36
+ /**
37
+ * System program addresses and other special Solana addresses
38
+ * These are valid addresses but may not represent user wallets
39
+ */
40
+ exports.SOLANA_SYSTEM_ADDRESSES = {
41
+ SYSTEM_PROGRAM: "11111111111111111111111111111111",
42
+ TOKEN_PROGRAM: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA",
43
+ TOKEN_2022_PROGRAM: "TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb",
44
+ ASSOCIATED_TOKEN_PROGRAM: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",
45
+ RENT_SYSVAR: "SysvarRent111111111111111111111111111111111",
46
+ CLOCK_SYSVAR: "SysvarC1ock11111111111111111111111111111111",
47
+ };
48
+ /**
49
+ * Check if a string contains only valid Base58 characters
50
+ */
51
+ function isValidBase58String(str) {
52
+ for (var i = 0; i < str.length; i++) {
53
+ if (!BASE58_CHAR_SET.has(str[i])) {
54
+ return false;
55
+ }
56
+ }
57
+ return true;
58
+ }
59
+ /**
60
+ * Check if a string is a valid Solana address format
61
+ *
62
+ * This performs format validation only (length and character set).
63
+ * It does NOT validate that the address is a valid point on the Ed25519 curve.
64
+ *
65
+ * @param value The value to check
66
+ * @returns true if the value is a valid Solana address format
67
+ */
68
+ function isSolanaAddress(value) {
69
+ if (typeof value !== "string") {
70
+ return false;
71
+ }
72
+ var trimmed = value.trim();
73
+ // Check length bounds
74
+ if (trimmed.length < MIN_SOLANA_ADDRESS_LENGTH ||
75
+ trimmed.length > MAX_SOLANA_ADDRESS_LENGTH) {
76
+ return false;
77
+ }
78
+ // Check character set (Base58)
79
+ return isValidBase58String(trimmed);
80
+ }
81
+ /**
82
+ * Get a valid Solana address from a string or PublicKey
83
+ *
84
+ * @param address The address to validate (string or PublicKey)
85
+ * @returns The address string if valid, null otherwise
86
+ */
87
+ function getValidSolanaAddress(address) {
88
+ if (!address) {
89
+ return null;
90
+ }
91
+ // Handle PublicKey objects
92
+ if (typeof address === "object" && "toBase58" in address) {
93
+ try {
94
+ var base58 = address.toBase58();
95
+ return isSolanaAddress(base58) ? base58 : null;
96
+ }
97
+ catch (_a) {
98
+ return null;
99
+ }
100
+ }
101
+ // Handle strings
102
+ if (typeof address === "string") {
103
+ var trimmed = address.trim();
104
+ return isSolanaAddress(trimmed) ? trimmed : null;
105
+ }
106
+ return null;
107
+ }
108
+ /**
109
+ * Check if a Solana address is a system program or well-known program address
110
+ *
111
+ * @param address The address to check
112
+ * @returns true if the address is a system/program address
113
+ */
114
+ function isSolanaSystemAddress(address) {
115
+ var validAddress = getValidSolanaAddress(address);
116
+ if (!validAddress) {
117
+ return false;
118
+ }
119
+ return Object.values(exports.SOLANA_SYSTEM_ADDRESSES).includes(validAddress);
120
+ }
121
+ /**
122
+ * Check if a Solana address is blocked (should not emit events)
123
+ *
124
+ * For Solana, we block system program addresses as they don't represent user wallets.
125
+ *
126
+ * @param address The address to check
127
+ * @returns true if the address should be blocked
128
+ */
129
+ function isBlockedSolanaAddress(address) {
130
+ var validAddress = getValidSolanaAddress(address);
131
+ if (!validAddress) {
132
+ return false;
133
+ }
134
+ // Block system addresses (includes SYSTEM_PROGRAM, TOKEN_PROGRAM, etc.)
135
+ if (isSolanaSystemAddress(validAddress)) {
136
+ return true;
137
+ }
138
+ return false;
139
+ }
140
+ /**
141
+ * Convert a Solana PublicKey to a string address
142
+ *
143
+ * @param publicKey The public key to convert
144
+ * @returns The Base58 encoded address string, or null if invalid
145
+ */
146
+ function publicKeyToAddress(publicKey) {
147
+ if (!publicKey) {
148
+ return null;
149
+ }
150
+ try {
151
+ var address = publicKey.toBase58();
152
+ return isSolanaAddress(address) ? address : null;
153
+ }
154
+ catch (_a) {
155
+ return null;
156
+ }
157
+ }
158
+ /**
159
+ * Check if two Solana addresses are equal (case-sensitive comparison)
160
+ *
161
+ * Unlike EVM addresses, Solana addresses are case-sensitive Base58.
162
+ *
163
+ * @param address1 First address
164
+ * @param address2 Second address
165
+ * @returns true if addresses are equal
166
+ */
167
+ function areSolanaAddressesEqual(address1, address2) {
168
+ var addr1 = getValidSolanaAddress(address1);
169
+ var addr2 = getValidSolanaAddress(address2);
170
+ if (!addr1 || !addr2) {
171
+ return false;
172
+ }
173
+ // Solana addresses are case-sensitive
174
+ return addr1 === addr2;
175
+ }
176
+ //# sourceMappingURL=address.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Solana integration module
3
+ *
4
+ * Provides integration with Solana Wallet Adapter for wallet event tracking.
5
+ * This module exports the SolanaAdapter and related types.
6
+ *
7
+ * @see https://github.com/anza-xyz/wallet-adapter
8
+ */
9
+ export { SolanaAdapter } from "./SolanaAdapter";
10
+ export { SolanaManager } from "./SolanaManager";
11
+ export * from "./types";
12
+ export * from "./address";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * Solana integration module
4
+ *
5
+ * Provides integration with Solana Wallet Adapter for wallet event tracking.
6
+ * This module exports the SolanaAdapter and related types.
7
+ *
8
+ * @see https://github.com/anza-xyz/wallet-adapter
9
+ */
10
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ var desc = Object.getOwnPropertyDescriptor(m, k);
13
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
14
+ desc = { enumerable: true, get: function() { return m[k]; } };
15
+ }
16
+ Object.defineProperty(o, k2, desc);
17
+ }) : (function(o, m, k, k2) {
18
+ if (k2 === undefined) k2 = k;
19
+ o[k2] = m[k];
20
+ }));
21
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
22
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.SolanaManager = exports.SolanaAdapter = void 0;
26
+ var SolanaAdapter_1 = require("./SolanaAdapter");
27
+ Object.defineProperty(exports, "SolanaAdapter", { enumerable: true, get: function () { return SolanaAdapter_1.SolanaAdapter; } });
28
+ var SolanaManager_1 = require("./SolanaManager");
29
+ Object.defineProperty(exports, "SolanaManager", { enumerable: true, get: function () { return SolanaManager_1.SolanaManager; } });
30
+ __exportStar(require("./types"), exports);
31
+ __exportStar(require("./address"), exports);
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Solana-specific type definitions for wallet event tracking
3
+ *
4
+ * These types provide TypeScript interfaces for Solana Wallet Adapter integration,
5
+ * allowing the SDK to hook into Solana wallet events to track wallet interactions.
6
+ *
7
+ * @see https://github.com/anza-xyz/wallet-adapter
8
+ */
9
+ /**
10
+ * Solana cluster/network types
11
+ * Solana doesn't use chainId like EVM, instead it uses cluster names
12
+ */
13
+ export type SolanaCluster = "mainnet-beta" | "testnet" | "devnet" | "localnet";
14
+ /**
15
+ * Mapping of Solana clusters to numeric chain IDs for consistency with EVM events
16
+ * These IDs are non-standard but provide a way to identify Solana networks in our analytics
17
+ *
18
+ * Using high numbers (900000+) to avoid collision with EVM chain IDs
19
+ * @see https://chainlist.org for EVM chain IDs (typically < 100000)
20
+ */
21
+ export declare const SOLANA_CHAIN_IDS: Record<SolanaCluster, number>;
22
+ /**
23
+ * Reverse mapping from chain ID to cluster name
24
+ */
25
+ export declare const SOLANA_CLUSTERS_BY_ID: Record<number, SolanaCluster>;
26
+ /**
27
+ * Default Solana chain ID (mainnet-beta)
28
+ */
29
+ export declare const DEFAULT_SOLANA_CHAIN_ID: number;
30
+ /**
31
+ * Check if a chain ID belongs to a Solana network.
32
+ */
33
+ export declare function isSolanaChainId(chainId: number | undefined | null): boolean;
34
+ /**
35
+ * Solana PublicKey interface
36
+ * Represents a Solana public key (32 bytes, Base58 encoded)
37
+ */
38
+ export interface SolanaPublicKey {
39
+ toBase58(): string;
40
+ toString(): string;
41
+ toBytes(): Uint8Array;
42
+ equals(other: SolanaPublicKey): boolean;
43
+ }
44
+ /**
45
+ * Solana transaction signature (64 bytes, Base58 encoded)
46
+ */
47
+ export type TransactionSignature = string;
48
+ /**
49
+ * Solana wallet adapter state
50
+ */
51
+ export type WalletAdapterState = "connected" | "disconnected" | "connecting" | "disconnecting";
52
+ /**
53
+ * Solana wallet adapter interface
54
+ * Based on @solana/wallet-adapter-base WalletAdapter
55
+ */
56
+ export interface ISolanaAdapter {
57
+ name: string;
58
+ url: string;
59
+ icon: string;
60
+ readyState: WalletReadyState;
61
+ publicKey: SolanaPublicKey | null;
62
+ connecting: boolean;
63
+ connected: boolean;
64
+ connect(): Promise<void>;
65
+ disconnect(): Promise<void>;
66
+ sendTransaction?(transaction: SolanaTransaction, connection: SolanaConnection, options?: SendTransactionOptions): Promise<TransactionSignature>;
67
+ signTransaction?(transaction: SolanaTransaction): Promise<SolanaTransaction>;
68
+ signAllTransactions?(transactions: SolanaTransaction[]): Promise<SolanaTransaction[]>;
69
+ signMessage?(message: Uint8Array): Promise<Uint8Array>;
70
+ on(event: "connect", listener: (publicKey: SolanaPublicKey) => void): void;
71
+ on(event: "disconnect", listener: () => void): void;
72
+ on(event: "error", listener: (error: WalletError) => void): void;
73
+ on(event: "readyStateChange", listener: (readyState: WalletReadyState) => void): void;
74
+ off(event: string, listener: (...args: unknown[]) => void): void;
75
+ removeAllListeners?(event?: string): void;
76
+ }
77
+ /**
78
+ * Solana wallet ready state
79
+ */
80
+ export declare enum WalletReadyState {
81
+ Installed = "Installed",
82
+ NotDetected = "NotDetected",
83
+ Loadable = "Loadable",
84
+ Unsupported = "Unsupported"
85
+ }
86
+ /**
87
+ * Solana wallet error
88
+ */
89
+ export interface WalletError extends Error {
90
+ error?: unknown;
91
+ }
92
+ /**
93
+ * Solana transaction interface (minimal)
94
+ */
95
+ export interface SolanaTransaction {
96
+ signature?: Uint8Array;
97
+ serialize(): Uint8Array;
98
+ feePayer?: SolanaPublicKey;
99
+ recentBlockhash?: string;
100
+ }
101
+ /**
102
+ * Solana connection interface (minimal)
103
+ */
104
+ export interface SolanaConnection {
105
+ rpcEndpoint: string;
106
+ commitment?: string;
107
+ getSignatureStatus?(signature: string): Promise<{
108
+ value: SignatureStatus | null;
109
+ }>;
110
+ getSignatureStatuses?(signatures: string[]): Promise<{
111
+ value: (SignatureStatus | null)[];
112
+ }>;
113
+ }
114
+ /**
115
+ * Solana signature status
116
+ */
117
+ export interface SignatureStatus {
118
+ slot: number;
119
+ confirmations: number | null;
120
+ err: unknown | null;
121
+ confirmationStatus?: "processed" | "confirmed" | "finalized";
122
+ }
123
+ /**
124
+ * Send transaction options
125
+ */
126
+ export interface SendTransactionOptions {
127
+ skipPreflight?: boolean;
128
+ preflightCommitment?: string;
129
+ maxRetries?: number;
130
+ minContextSlot?: number;
131
+ }
132
+ /**
133
+ * Wallet entry as returned by @solana/wallet-adapter-react useWallet().wallet
134
+ * This is { adapter, readyState }, not a direct adapter.
135
+ */
136
+ export interface SolanaWalletEntry {
137
+ adapter: ISolanaAdapter;
138
+ readyState: WalletReadyState;
139
+ }
140
+ /**
141
+ * @deprecated Use SolanaWalletEntry instead
142
+ */
143
+ export type SolanaWallet = SolanaWalletEntry;
144
+ /**
145
+ * Solana Wallet Context interface
146
+ * Based on @solana/wallet-adapter-react useWallet hook
147
+ * @see https://github.com/anza-xyz/wallet-adapter/blob/master/packages/core/react/src/useWallet.ts
148
+ */
149
+ export interface SolanaWalletContext {
150
+ autoConnect: boolean;
151
+ wallets: SolanaWalletEntry[];
152
+ wallet: SolanaWalletEntry | null;
153
+ publicKey: SolanaPublicKey | null;
154
+ connecting: boolean;
155
+ connected: boolean;
156
+ disconnecting: boolean;
157
+ select(walletName: string | null): void;
158
+ connect(): Promise<void>;
159
+ disconnect(): Promise<void>;
160
+ sendTransaction(transaction: SolanaTransaction, connection: SolanaConnection, options?: SendTransactionOptions): Promise<TransactionSignature>;
161
+ signTransaction?(transaction: SolanaTransaction): Promise<SolanaTransaction>;
162
+ signAllTransactions?(transactions: SolanaTransaction[]): Promise<SolanaTransaction[]>;
163
+ signMessage?(message: Uint8Array): Promise<Uint8Array>;
164
+ }
165
+ /**
166
+ * Solana options for FormoAnalytics
167
+ */
168
+ export interface SolanaOptions {
169
+ /**
170
+ * The Solana wallet adapter instance or wallet context
171
+ * Can be a single wallet adapter or the useWallet() context
172
+ */
173
+ wallet?: ISolanaAdapter | SolanaWalletContext;
174
+ /**
175
+ * The Solana connection for tracking transaction confirmations
176
+ */
177
+ connection?: SolanaConnection;
178
+ /**
179
+ * The Solana cluster/network
180
+ * @default "mainnet-beta"
181
+ */
182
+ cluster?: SolanaCluster;
183
+ }
184
+ /**
185
+ * Internal connection state for Solana event handler.
186
+ * Tracks the last known wallet connection for disconnect event payloads
187
+ * and provides a reentrancy guard for concurrent event handling.
188
+ */
189
+ export interface SolanaConnectionState {
190
+ lastAddress?: string;
191
+ lastChainId?: number;
192
+ isProcessing: boolean;
193
+ }
194
+ /**
195
+ * Unsubscribe function type
196
+ */
197
+ export type UnsubscribeFn = () => void;
198
+ /**
199
+ * Check if an object is a SolanaWalletContext (has wallets array)
200
+ */
201
+ export declare function isSolanaWalletContext(obj: ISolanaAdapter | SolanaWalletContext | undefined | null): obj is SolanaWalletContext;
202
+ /**
203
+ * Check if an object is a ISolanaAdapter
204
+ */
205
+ export declare function isSolanaAdapter(obj: ISolanaAdapter | SolanaWalletContext | undefined | null): obj is ISolanaAdapter;
206
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Solana-specific type definitions for wallet event tracking
4
+ *
5
+ * These types provide TypeScript interfaces for Solana Wallet Adapter integration,
6
+ * allowing the SDK to hook into Solana wallet events to track wallet interactions.
7
+ *
8
+ * @see https://github.com/anza-xyz/wallet-adapter
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.WalletReadyState = exports.DEFAULT_SOLANA_CHAIN_ID = exports.SOLANA_CLUSTERS_BY_ID = exports.SOLANA_CHAIN_IDS = void 0;
12
+ exports.isSolanaChainId = isSolanaChainId;
13
+ exports.isSolanaWalletContext = isSolanaWalletContext;
14
+ exports.isSolanaAdapter = isSolanaAdapter;
15
+ /**
16
+ * Mapping of Solana clusters to numeric chain IDs for consistency with EVM events
17
+ * These IDs are non-standard but provide a way to identify Solana networks in our analytics
18
+ *
19
+ * Using high numbers (900000+) to avoid collision with EVM chain IDs
20
+ * @see https://chainlist.org for EVM chain IDs (typically < 100000)
21
+ */
22
+ exports.SOLANA_CHAIN_IDS = {
23
+ "mainnet-beta": 900001,
24
+ testnet: 900002,
25
+ devnet: 900003,
26
+ localnet: 900004,
27
+ };
28
+ /**
29
+ * Reverse mapping from chain ID to cluster name
30
+ */
31
+ exports.SOLANA_CLUSTERS_BY_ID = {
32
+ 900001: "mainnet-beta",
33
+ 900002: "testnet",
34
+ 900003: "devnet",
35
+ 900004: "localnet",
36
+ };
37
+ /**
38
+ * Default Solana chain ID (mainnet-beta)
39
+ */
40
+ exports.DEFAULT_SOLANA_CHAIN_ID = exports.SOLANA_CHAIN_IDS["mainnet-beta"];
41
+ /**
42
+ * Check if a chain ID belongs to a Solana network.
43
+ */
44
+ function isSolanaChainId(chainId) {
45
+ if (chainId === undefined || chainId === null)
46
+ return false;
47
+ return Object.values(exports.SOLANA_CHAIN_IDS).includes(chainId);
48
+ }
49
+ /**
50
+ * Solana wallet ready state
51
+ */
52
+ var WalletReadyState;
53
+ (function (WalletReadyState) {
54
+ WalletReadyState["Installed"] = "Installed";
55
+ WalletReadyState["NotDetected"] = "NotDetected";
56
+ WalletReadyState["Loadable"] = "Loadable";
57
+ WalletReadyState["Unsupported"] = "Unsupported";
58
+ })(WalletReadyState || (exports.WalletReadyState = WalletReadyState = {}));
59
+ /**
60
+ * Check if an object is a SolanaWalletContext (has wallets array)
61
+ */
62
+ function isSolanaWalletContext(obj) {
63
+ return (obj !== null &&
64
+ obj !== undefined &&
65
+ typeof obj === "object" &&
66
+ "wallets" in obj &&
67
+ Array.isArray(obj.wallets));
68
+ }
69
+ /**
70
+ * Check if an object is a ISolanaAdapter
71
+ */
72
+ function isSolanaAdapter(obj) {
73
+ return (obj !== null &&
74
+ obj !== undefined &&
75
+ typeof obj === "object" &&
76
+ "name" in obj &&
77
+ "connect" in obj &&
78
+ !("wallets" in obj));
79
+ }
80
+ //# sourceMappingURL=types.js.map