@formo/analytics 1.26.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dist/cjs/src/FormoAnalytics.d.ts +71 -12
- package/dist/cjs/src/FormoAnalytics.js +274 -147
- package/dist/cjs/src/event/EventFactory.d.ts +10 -2
- package/dist/cjs/src/event/EventFactory.js +32 -21
- package/dist/cjs/src/fetch/index.d.ts +10 -2
- package/dist/cjs/src/fetch/index.js +122 -4
- package/dist/cjs/src/index.d.ts +4 -0
- package/dist/cjs/src/index.js +6 -0
- package/dist/cjs/src/privy/index.d.ts +9 -0
- package/dist/cjs/src/privy/index.js +12 -0
- package/dist/cjs/src/privy/types.d.ts +175 -0
- package/dist/cjs/src/privy/types.js +12 -0
- package/dist/cjs/src/privy/utils.d.ts +32 -0
- package/dist/cjs/src/privy/utils.js +188 -0
- package/dist/cjs/src/queue/EventQueue.d.ts +24 -2
- package/dist/cjs/src/queue/EventQueue.js +158 -49
- package/dist/cjs/src/session/index.js +2 -1
- package/dist/cjs/src/solana/SolanaAdapter.d.ts +211 -0
- package/dist/cjs/src/solana/SolanaAdapter.js +975 -0
- package/dist/cjs/src/solana/SolanaManager.d.ts +24 -0
- package/dist/cjs/src/solana/SolanaManager.js +80 -0
- package/dist/cjs/src/solana/address.d.ts +72 -0
- package/dist/cjs/src/solana/address.js +176 -0
- package/dist/cjs/src/solana/index.d.ts +13 -0
- package/dist/cjs/src/solana/index.js +32 -0
- package/dist/cjs/src/solana/types.d.ts +206 -0
- package/dist/cjs/src/solana/types.js +80 -0
- package/dist/cjs/src/types/base.d.ts +25 -0
- package/dist/cjs/src/types/events.d.ts +9 -6
- package/dist/cjs/src/utils/address.d.ts +21 -0
- package/dist/cjs/src/utils/address.js +48 -1
- package/dist/cjs/src/utils/builderCode.d.ts +30 -0
- package/dist/cjs/src/utils/builderCode.js +143 -0
- package/dist/cjs/src/utils/index.d.ts +1 -0
- package/dist/cjs/src/utils/index.js +1 -0
- package/dist/cjs/src/version.d.ts +1 -1
- package/dist/cjs/src/version.js +1 -1
- package/dist/cjs/src/wagmi/WagmiEventHandler.d.ts +24 -0
- package/dist/cjs/src/wagmi/WagmiEventHandler.js +242 -24
- package/dist/cjs/src/wagmi/types.d.ts +31 -0
- package/dist/cjs/src/wagmi/utils.d.ts +79 -0
- package/dist/cjs/src/wagmi/utils.js +218 -0
- package/dist/esm/src/FormoAnalytics.d.ts +71 -12
- package/dist/esm/src/FormoAnalytics.js +275 -148
- package/dist/esm/src/event/EventFactory.d.ts +10 -2
- package/dist/esm/src/event/EventFactory.js +34 -23
- package/dist/esm/src/fetch/index.d.ts +10 -2
- package/dist/esm/src/fetch/index.js +123 -2
- package/dist/esm/src/index.d.ts +4 -0
- package/dist/esm/src/index.js +3 -0
- package/dist/esm/src/privy/index.d.ts +9 -0
- package/dist/esm/src/privy/index.js +8 -0
- package/dist/esm/src/privy/types.d.ts +175 -0
- package/dist/esm/src/privy/types.js +11 -0
- package/dist/esm/src/privy/utils.d.ts +32 -0
- package/dist/esm/src/privy/utils.js +185 -0
- package/dist/esm/src/queue/EventQueue.d.ts +24 -2
- package/dist/esm/src/queue/EventQueue.js +158 -49
- package/dist/esm/src/session/index.js +2 -1
- package/dist/esm/src/solana/SolanaAdapter.d.ts +211 -0
- package/dist/esm/src/solana/SolanaAdapter.js +972 -0
- package/dist/esm/src/solana/SolanaManager.d.ts +24 -0
- package/dist/esm/src/solana/SolanaManager.js +77 -0
- package/dist/esm/src/solana/address.d.ts +72 -0
- package/dist/esm/src/solana/address.js +167 -0
- package/dist/esm/src/solana/index.d.ts +13 -0
- package/dist/esm/src/solana/index.js +13 -0
- package/dist/esm/src/solana/types.d.ts +206 -0
- package/dist/esm/src/solana/types.js +74 -0
- package/dist/esm/src/types/base.d.ts +25 -0
- package/dist/esm/src/types/events.d.ts +9 -6
- package/dist/esm/src/utils/address.d.ts +21 -0
- package/dist/esm/src/utils/address.js +45 -0
- package/dist/esm/src/utils/builderCode.d.ts +30 -0
- package/dist/esm/src/utils/builderCode.js +140 -0
- package/dist/esm/src/utils/index.d.ts +1 -0
- package/dist/esm/src/utils/index.js +1 -0
- package/dist/esm/src/version.d.ts +1 -1
- package/dist/esm/src/version.js +1 -1
- package/dist/esm/src/wagmi/WagmiEventHandler.d.ts +24 -0
- package/dist/esm/src/wagmi/WagmiEventHandler.js +242 -24
- package/dist/esm/src/wagmi/types.d.ts +31 -0
- package/dist/esm/src/wagmi/utils.d.ts +79 -0
- package/dist/esm/src/wagmi/utils.js +211 -0
- package/dist/index.umd.min.js +1 -1
- package/package.json +20 -4
|
@@ -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
|