@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
|
@@ -2,9 +2,18 @@ import { LogLevel } from "../logger";
|
|
|
2
2
|
import { IFormoEventContext, IFormoEventProperties, SignatureStatus, TransactionStatus } from "./events";
|
|
3
3
|
import { EIP1193Provider } from "./provider";
|
|
4
4
|
import { ReactNode } from "react";
|
|
5
|
+
import { SolanaOptions } from "../solana/types";
|
|
5
6
|
export type Nullable<T> = T | null;
|
|
6
7
|
export type ChainID = number;
|
|
7
8
|
export type Address = string;
|
|
9
|
+
export type ChainNamespace = 'evm' | 'solana';
|
|
10
|
+
export interface ChainState {
|
|
11
|
+
address?: Address;
|
|
12
|
+
chainId?: ChainID;
|
|
13
|
+
}
|
|
14
|
+
export interface EvmChainState extends ChainState {
|
|
15
|
+
provider?: EIP1193Provider;
|
|
16
|
+
}
|
|
8
17
|
export type ValidInputTypes = Uint8Array | bigint | string | number | boolean;
|
|
9
18
|
export interface IFormoAnalytics {
|
|
10
19
|
page(category?: string, name?: string, properties?: IFormoEventProperties, context?: IFormoEventContext, callback?: (...args: unknown[]) => void): Promise<void>;
|
|
@@ -41,6 +50,8 @@ export interface IFormoAnalytics {
|
|
|
41
50
|
to?: string;
|
|
42
51
|
value?: string;
|
|
43
52
|
transactionHash?: string;
|
|
53
|
+
function_name?: string;
|
|
54
|
+
function_args?: Record<string, unknown>;
|
|
44
55
|
}, properties?: IFormoEventProperties, context?: IFormoEventContext, callback?: (...args: unknown[]) => void): Promise<void>;
|
|
45
56
|
identify(params: {
|
|
46
57
|
address: Address;
|
|
@@ -149,6 +160,14 @@ export interface Options {
|
|
|
149
160
|
* @requires @tanstack/react-query@>=5.0.0 (for mutation tracking)
|
|
150
161
|
*/
|
|
151
162
|
wagmi?: WagmiOptions;
|
|
163
|
+
/**
|
|
164
|
+
* Solana Wallet Adapter integration configuration
|
|
165
|
+
* When provided, the SDK will track Solana wallet events in addition to EVM wallet events
|
|
166
|
+
* This works alongside EIP-1193/Wagmi tracking - you can track both EVM and Solana wallets
|
|
167
|
+
* @requires @solana/wallet-adapter-base (optional peer dependency)
|
|
168
|
+
* @requires @solana/wallet-adapter-react (optional peer dependency, for React apps)
|
|
169
|
+
*/
|
|
170
|
+
solana?: SolanaOptions;
|
|
152
171
|
/**
|
|
153
172
|
* Custom API host for sending events through your own domain to bypass ad blockers
|
|
154
173
|
* - If not provided, events are sent directly to events.formo.so
|
|
@@ -172,6 +191,12 @@ export interface Options {
|
|
|
172
191
|
* @example { queryParams: ["via"], pathPattern: "/r/([^/]+)" }
|
|
173
192
|
*/
|
|
174
193
|
referral?: ReferralOptions;
|
|
194
|
+
/**
|
|
195
|
+
* Optional error handler for analytics network failures.
|
|
196
|
+
* Called when event flush fails after all retries.
|
|
197
|
+
* If not provided, errors are silently swallowed.
|
|
198
|
+
*/
|
|
199
|
+
errorHandler?: (err: Error) => void;
|
|
175
200
|
ready?: (formo: IFormoAnalytics) => void;
|
|
176
201
|
}
|
|
177
202
|
export interface FormoAnalyticsProviderProps {
|
|
@@ -44,9 +44,9 @@ export interface DetectAPIEvent {
|
|
|
44
44
|
}
|
|
45
45
|
export interface IdentifyAPIEvent {
|
|
46
46
|
type: "identify";
|
|
47
|
-
address:
|
|
48
|
-
providerName
|
|
49
|
-
rdns
|
|
47
|
+
address: Address;
|
|
48
|
+
providerName?: string;
|
|
49
|
+
rdns?: string;
|
|
50
50
|
userId?: Nullable<string>;
|
|
51
51
|
}
|
|
52
52
|
export interface ChainAPIEvent {
|
|
@@ -59,10 +59,13 @@ export interface TransactionAPIEvent {
|
|
|
59
59
|
status: TransactionStatus;
|
|
60
60
|
chainId: ChainID;
|
|
61
61
|
address: Address;
|
|
62
|
-
data
|
|
63
|
-
to
|
|
64
|
-
value
|
|
62
|
+
data?: string;
|
|
63
|
+
to?: string;
|
|
64
|
+
value?: string;
|
|
65
65
|
transactionHash?: string;
|
|
66
|
+
function_name?: string;
|
|
67
|
+
function_args?: Record<string, unknown>;
|
|
68
|
+
builder_codes?: string;
|
|
66
69
|
}
|
|
67
70
|
export interface SignatureAPIEvent {
|
|
68
71
|
type: "signature";
|
|
@@ -26,4 +26,25 @@ export declare const getValidAddress: (address: Address | null | undefined) => s
|
|
|
26
26
|
*/
|
|
27
27
|
export declare const isBlockedAddress: (address: Address | null | undefined) => boolean;
|
|
28
28
|
export declare const toChecksumAddress: (address: Address) => string;
|
|
29
|
+
/**
|
|
30
|
+
* Validates an EVM address and returns it in checksummed format.
|
|
31
|
+
* @param address The address to validate
|
|
32
|
+
* @returns The checksummed address or undefined if invalid
|
|
33
|
+
*/
|
|
34
|
+
export declare const validateAndChecksumAddress: (address: string) => Address | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Validates an address for both EVM and Solana chains.
|
|
37
|
+
* For EVM addresses, returns checksummed format.
|
|
38
|
+
* For Solana addresses, returns the Base58 address as-is.
|
|
39
|
+
*
|
|
40
|
+
* When chainId is explicitly provided, validation is strict:
|
|
41
|
+
* - Solana chainId → only Solana validation
|
|
42
|
+
* - Non-Solana chainId → only EVM validation
|
|
43
|
+
* When chainId is omitted, EVM is tried first with Solana fallback.
|
|
44
|
+
*
|
|
45
|
+
* @param address The address to validate
|
|
46
|
+
* @param chainId Optional chain ID to determine address type
|
|
47
|
+
* @returns The validated address or undefined if invalid
|
|
48
|
+
*/
|
|
49
|
+
export declare const validateAddress: (address: string, chainId?: number) => Address | undefined;
|
|
29
50
|
//# sourceMappingURL=address.d.ts.map
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.toChecksumAddress = exports.isBlockedAddress = exports.getValidAddress = exports.isValidAddress = void 0;
|
|
3
|
+
exports.validateAddress = exports.validateAndChecksumAddress = exports.toChecksumAddress = exports.isBlockedAddress = exports.getValidAddress = exports.isValidAddress = void 0;
|
|
4
4
|
var keccak_js_1 = require("ethereum-cryptography/keccak.js");
|
|
5
5
|
var utils_js_1 = require("ethereum-cryptography/utils.js");
|
|
6
6
|
var validators_1 = require("../validators");
|
|
7
7
|
var object_1 = require("../validators/object");
|
|
8
8
|
var constants_1 = require("../constants");
|
|
9
|
+
var address_1 = require("../solana/address");
|
|
10
|
+
var types_1 = require("../solana/types");
|
|
9
11
|
/**
|
|
10
12
|
* Private helper function to validate and trim an address
|
|
11
13
|
* @param address The address to validate and trim
|
|
@@ -85,4 +87,49 @@ var toChecksumAddress = function (address) {
|
|
|
85
87
|
return checksumAddress;
|
|
86
88
|
};
|
|
87
89
|
exports.toChecksumAddress = toChecksumAddress;
|
|
90
|
+
/**
|
|
91
|
+
* Validates an EVM address and returns it in checksummed format.
|
|
92
|
+
* @param address The address to validate
|
|
93
|
+
* @returns The checksummed address or undefined if invalid
|
|
94
|
+
*/
|
|
95
|
+
var validateAndChecksumAddress = function (address) {
|
|
96
|
+
var validAddress = (0, exports.getValidAddress)(address);
|
|
97
|
+
return validAddress ? (0, exports.toChecksumAddress)(validAddress) : undefined;
|
|
98
|
+
};
|
|
99
|
+
exports.validateAndChecksumAddress = validateAndChecksumAddress;
|
|
100
|
+
/**
|
|
101
|
+
* Validates an address for both EVM and Solana chains.
|
|
102
|
+
* For EVM addresses, returns checksummed format.
|
|
103
|
+
* For Solana addresses, returns the Base58 address as-is.
|
|
104
|
+
*
|
|
105
|
+
* When chainId is explicitly provided, validation is strict:
|
|
106
|
+
* - Solana chainId → only Solana validation
|
|
107
|
+
* - Non-Solana chainId → only EVM validation
|
|
108
|
+
* When chainId is omitted, EVM is tried first with Solana fallback.
|
|
109
|
+
*
|
|
110
|
+
* @param address The address to validate
|
|
111
|
+
* @param chainId Optional chain ID to determine address type
|
|
112
|
+
* @returns The validated address or undefined if invalid
|
|
113
|
+
*/
|
|
114
|
+
var validateAddress = function (address, chainId) {
|
|
115
|
+
var solanaChainIds = Object.values(types_1.SOLANA_CHAIN_IDS);
|
|
116
|
+
// Explicit Solana chainId → validate ONLY as Solana
|
|
117
|
+
if (chainId !== undefined && chainId !== null && solanaChainIds.includes(chainId)) {
|
|
118
|
+
return (0, address_1.getValidSolanaAddress)(address) || undefined;
|
|
119
|
+
}
|
|
120
|
+
// Explicit non-Solana chainId → validate ONLY as EVM
|
|
121
|
+
if (chainId !== undefined && chainId !== null) {
|
|
122
|
+
return (0, exports.validateAndChecksumAddress)(address);
|
|
123
|
+
}
|
|
124
|
+
// No chainId → try EVM first, then Solana fallback
|
|
125
|
+
var validEvmAddress = (0, exports.validateAndChecksumAddress)(address);
|
|
126
|
+
if (validEvmAddress) {
|
|
127
|
+
return validEvmAddress;
|
|
128
|
+
}
|
|
129
|
+
if ((0, address_1.isSolanaAddress)(address)) {
|
|
130
|
+
return (0, address_1.getValidSolanaAddress)(address) || undefined;
|
|
131
|
+
}
|
|
132
|
+
return undefined;
|
|
133
|
+
};
|
|
134
|
+
exports.validateAddress = validateAddress;
|
|
88
135
|
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ERC-8021 Builder Code Extraction
|
|
3
|
+
*
|
|
4
|
+
* Extracts builder codes from transaction calldata by parsing the ERC-8021
|
|
5
|
+
* data suffix. The suffix is appended to the end of calldata and parsed
|
|
6
|
+
* backwards:
|
|
7
|
+
*
|
|
8
|
+
* [original calldata] [schemaData] [schemaId (1 byte)] [ercMarker (16 bytes)]
|
|
9
|
+
*
|
|
10
|
+
* Schema 0 (canonical registry):
|
|
11
|
+
* [codes (variable ASCII)] [codesLength (1 byte)] [schemaId 0x00] [ercMarker]
|
|
12
|
+
*
|
|
13
|
+
* Schema 1 (custom registry):
|
|
14
|
+
* [registryAddress (20 bytes)] [chainId (variable)] [chainIdLength (1 byte)]
|
|
15
|
+
* [codes (variable ASCII)] [codesLength (1 byte)] [schemaId 0x01] [ercMarker]
|
|
16
|
+
*
|
|
17
|
+
* - ercMarker: 0x80218021802180218021802180218021 (16 bytes)
|
|
18
|
+
* - codes: ASCII-encoded entity codes delimited by 0x2C (comma)
|
|
19
|
+
*
|
|
20
|
+
* @see https://docs.base.org/base-chain/builder-codes/builder-codes
|
|
21
|
+
* @see https://www.erc8021.com/
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Extract builder codes from transaction calldata by parsing the ERC-8021 suffix.
|
|
25
|
+
*
|
|
26
|
+
* @param data - The transaction calldata hex string (with or without 0x prefix)
|
|
27
|
+
* @returns A comma-separated string of builder codes (e.g. "uniswap,base"), or undefined if no valid ERC-8021 suffix is found
|
|
28
|
+
*/
|
|
29
|
+
export declare function extractBuilderCodes(data: string | undefined | null): string | undefined;
|
|
30
|
+
//# sourceMappingURL=builderCode.d.ts.map
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* ERC-8021 Builder Code Extraction
|
|
4
|
+
*
|
|
5
|
+
* Extracts builder codes from transaction calldata by parsing the ERC-8021
|
|
6
|
+
* data suffix. The suffix is appended to the end of calldata and parsed
|
|
7
|
+
* backwards:
|
|
8
|
+
*
|
|
9
|
+
* [original calldata] [schemaData] [schemaId (1 byte)] [ercMarker (16 bytes)]
|
|
10
|
+
*
|
|
11
|
+
* Schema 0 (canonical registry):
|
|
12
|
+
* [codes (variable ASCII)] [codesLength (1 byte)] [schemaId 0x00] [ercMarker]
|
|
13
|
+
*
|
|
14
|
+
* Schema 1 (custom registry):
|
|
15
|
+
* [registryAddress (20 bytes)] [chainId (variable)] [chainIdLength (1 byte)]
|
|
16
|
+
* [codes (variable ASCII)] [codesLength (1 byte)] [schemaId 0x01] [ercMarker]
|
|
17
|
+
*
|
|
18
|
+
* - ercMarker: 0x80218021802180218021802180218021 (16 bytes)
|
|
19
|
+
* - codes: ASCII-encoded entity codes delimited by 0x2C (comma)
|
|
20
|
+
*
|
|
21
|
+
* @see https://docs.base.org/base-chain/builder-codes/builder-codes
|
|
22
|
+
* @see https://www.erc8021.com/
|
|
23
|
+
*/
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.extractBuilderCodes = extractBuilderCodes;
|
|
26
|
+
/** The 16-byte ERC-8021 marker appended at the very end of calldata */
|
|
27
|
+
var ERC_MARKER = "80218021802180218021802180218021";
|
|
28
|
+
/** Length of the ERC marker in hex characters (16 bytes = 32 hex chars) */
|
|
29
|
+
var ERC_MARKER_HEX_LENGTH = 32;
|
|
30
|
+
/** Supported schema IDs */
|
|
31
|
+
var SCHEMA_ID_CANONICAL = "00";
|
|
32
|
+
var SCHEMA_ID_CUSTOM_REGISTRY = "01";
|
|
33
|
+
/** Comma delimiter (0x2C) used to separate multiple codes */
|
|
34
|
+
var COMMA_BYTE = 0x2c;
|
|
35
|
+
/**
|
|
36
|
+
* Decode the codes field from a hex string into a comma-separated string.
|
|
37
|
+
* Validates that all bytes are printable ASCII (0x20–0x7E).
|
|
38
|
+
*
|
|
39
|
+
* @param codesHex - Hex string of the codes field
|
|
40
|
+
* @returns Comma-separated builder codes string, or undefined if invalid
|
|
41
|
+
*/
|
|
42
|
+
function decodeCodes(codesHex) {
|
|
43
|
+
var bytes = [];
|
|
44
|
+
for (var i = 0; i < codesHex.length; i += 2) {
|
|
45
|
+
var byte = parseInt(codesHex.slice(i, i + 2), 16);
|
|
46
|
+
// Reject NaN (invalid hex), non-printable or non-ASCII bytes
|
|
47
|
+
if (isNaN(byte) || byte < 0x20 || byte > 0x7e) {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
bytes.push(byte);
|
|
51
|
+
}
|
|
52
|
+
// Split on comma delimiter and decode each code as ASCII
|
|
53
|
+
var codes = [];
|
|
54
|
+
var current = [];
|
|
55
|
+
for (var _i = 0, bytes_1 = bytes; _i < bytes_1.length; _i++) {
|
|
56
|
+
var byte = bytes_1[_i];
|
|
57
|
+
if (byte === COMMA_BYTE) {
|
|
58
|
+
if (current.length > 0) {
|
|
59
|
+
codes.push(String.fromCharCode.apply(String, current));
|
|
60
|
+
current = [];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
current.push(byte);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// Push the last code segment
|
|
68
|
+
if (current.length > 0) {
|
|
69
|
+
codes.push(String.fromCharCode.apply(String, current));
|
|
70
|
+
}
|
|
71
|
+
return codes.length > 0 ? codes.join(",") : undefined;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Read codesLength and codes from the hex string ending at the given position.
|
|
75
|
+
*
|
|
76
|
+
* @param hex - Full hex string (lowercase, no 0x prefix)
|
|
77
|
+
* @param endPos - Hex char position where codesLength byte ends (i.e. start of schemaId)
|
|
78
|
+
* @returns Object with decoded codes string and the hex char position where codes start, or undefined
|
|
79
|
+
*/
|
|
80
|
+
function readCodes(hex, endPos) {
|
|
81
|
+
// Read codesLength (1 byte before endPos)
|
|
82
|
+
var codesLengthStart = endPos - 2;
|
|
83
|
+
if (codesLengthStart < 0) {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
var codesLength = parseInt(hex.slice(codesLengthStart, endPos), 16);
|
|
87
|
+
if (codesLength === 0 || isNaN(codesLength)) {
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
// Read the codes field
|
|
91
|
+
var codesHexLength = codesLength * 2;
|
|
92
|
+
var codesStart = codesLengthStart - codesHexLength;
|
|
93
|
+
if (codesStart < 0) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
var codesHex = hex.slice(codesStart, codesLengthStart);
|
|
97
|
+
var codes = decodeCodes(codesHex);
|
|
98
|
+
if (!codes) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
return { codes: codes, codesStart: codesStart };
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Extract builder codes from transaction calldata by parsing the ERC-8021 suffix.
|
|
105
|
+
*
|
|
106
|
+
* @param data - The transaction calldata hex string (with or without 0x prefix)
|
|
107
|
+
* @returns A comma-separated string of builder codes (e.g. "uniswap,base"), or undefined if no valid ERC-8021 suffix is found
|
|
108
|
+
*/
|
|
109
|
+
function extractBuilderCodes(data) {
|
|
110
|
+
if (!data || typeof data !== "string") {
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
// Normalize: remove 0x prefix and work with lowercase hex
|
|
114
|
+
var hex = data.startsWith("0x") || data.startsWith("0X")
|
|
115
|
+
? data.slice(2).toLowerCase()
|
|
116
|
+
: data.toLowerCase();
|
|
117
|
+
// Minimum suffix: 1+ byte codes + 1 byte codesLength + 1 byte schemaId + 16 bytes marker = 19 bytes = 38 hex chars
|
|
118
|
+
if (hex.length < 38) {
|
|
119
|
+
return undefined;
|
|
120
|
+
}
|
|
121
|
+
// Step 1: Check last 16 bytes for ERC marker
|
|
122
|
+
var markerStart = hex.length - ERC_MARKER_HEX_LENGTH;
|
|
123
|
+
var marker = hex.slice(markerStart);
|
|
124
|
+
if (marker !== ERC_MARKER) {
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
// Step 2: Read schemaId (1 byte before the marker)
|
|
128
|
+
var schemaIdStart = markerStart - 2;
|
|
129
|
+
if (schemaIdStart < 0) {
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
var schemaId = hex.slice(schemaIdStart, markerStart);
|
|
133
|
+
// Step 3: Parse based on schemaId
|
|
134
|
+
if (schemaId === SCHEMA_ID_CANONICAL || schemaId === SCHEMA_ID_CUSTOM_REGISTRY) {
|
|
135
|
+
// Both Schema 0 and Schema 1 have codes in the same position
|
|
136
|
+
// (immediately before schemaId when parsing backwards)
|
|
137
|
+
var result = readCodes(hex, schemaIdStart);
|
|
138
|
+
return result === null || result === void 0 ? void 0 : result.codes;
|
|
139
|
+
}
|
|
140
|
+
// Unknown schema - cannot parse
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=builderCode.js.map
|
|
@@ -16,6 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./address"), exports);
|
|
18
18
|
__exportStar(require("./base"), exports);
|
|
19
|
+
__exportStar(require("./builderCode"), exports);
|
|
19
20
|
__exportStar(require("./converter"), exports);
|
|
20
21
|
__exportStar(require("./generate"), exports);
|
|
21
22
|
__exportStar(require("./hash"), exports);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "1.
|
|
1
|
+
export declare const version = "1.28.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cjs/src/version.js
CHANGED
|
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.version = void 0;
|
|
4
4
|
// This file is auto-generated by scripts/update-version.js during npm version
|
|
5
5
|
// Do not edit manually - it will be overwritten
|
|
6
|
-
exports.version = '1.
|
|
6
|
+
exports.version = '1.28.0';
|
|
7
7
|
//# sourceMappingURL=version.js.map
|
|
@@ -18,6 +18,16 @@ export declare class WagmiEventHandler {
|
|
|
18
18
|
* Key format: `${mutationId}:${status}`
|
|
19
19
|
*/
|
|
20
20
|
private processedMutations;
|
|
21
|
+
/**
|
|
22
|
+
* Track processed query states to prevent duplicate event emissions
|
|
23
|
+
* Key format: `${queryHash}:${status}`
|
|
24
|
+
*/
|
|
25
|
+
private processedQueries;
|
|
26
|
+
/**
|
|
27
|
+
* Store transaction details from BROADCASTED events for use in CONFIRMED/REVERTED
|
|
28
|
+
* Key: transactionHash, Value: transaction details including the original sender address
|
|
29
|
+
*/
|
|
30
|
+
private pendingTransactions;
|
|
21
31
|
constructor(formoAnalytics: FormoAnalytics, wagmiConfig: WagmiConfig, queryClient?: QueryClient);
|
|
22
32
|
/**
|
|
23
33
|
* Set up listeners for wallet connection, disconnection, and chain changes
|
|
@@ -35,6 +45,20 @@ export declare class WagmiEventHandler {
|
|
|
35
45
|
* Set up mutation tracking for signatures and transactions
|
|
36
46
|
*/
|
|
37
47
|
private setupMutationTracking;
|
|
48
|
+
/**
|
|
49
|
+
* Set up query tracking for transaction confirmations
|
|
50
|
+
* Listens for waitForTransactionReceipt queries to detect CONFIRMED status
|
|
51
|
+
*/
|
|
52
|
+
private setupQueryTracking;
|
|
53
|
+
/**
|
|
54
|
+
* Handle query cache events (transaction confirmations)
|
|
55
|
+
*/
|
|
56
|
+
private handleQueryEvent;
|
|
57
|
+
/**
|
|
58
|
+
* Handle waitForTransactionReceipt query completion
|
|
59
|
+
* Emits CONFIRMED or REVERTED transaction status
|
|
60
|
+
*/
|
|
61
|
+
private handleTransactionReceiptQuery;
|
|
38
62
|
/**
|
|
39
63
|
* Handle mutation cache events (signatures, transactions)
|
|
40
64
|
*/
|