@formo/analytics 1.27.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/dist/cjs/src/FormoAnalytics.d.ts +69 -12
- package/dist/cjs/src/FormoAnalytics.js +273 -147
- package/dist/cjs/src/event/EventFactory.d.ts +10 -2
- package/dist/cjs/src/event/EventFactory.js +32 -21
- 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/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 +17 -0
- package/dist/cjs/src/types/events.d.ts +4 -3
- 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.js +13 -15
- package/dist/cjs/src/wagmi/utils.d.ts +5 -0
- package/dist/cjs/src/wagmi/utils.js +20 -0
- package/dist/esm/src/FormoAnalytics.d.ts +69 -12
- package/dist/esm/src/FormoAnalytics.js +274 -148
- package/dist/esm/src/event/EventFactory.d.ts +10 -2
- package/dist/esm/src/event/EventFactory.js +34 -23
- 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/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 +17 -0
- package/dist/esm/src/types/events.d.ts +4 -3
- 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.js +14 -16
- package/dist/esm/src/wagmi/utils.d.ts +5 -0
- package/dist/esm/src/wagmi/utils.js +19 -0
- package/dist/index.umd.min.js +1 -1
- package/package.json +15 -3
|
@@ -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 {
|
|
@@ -65,6 +65,7 @@ export interface TransactionAPIEvent {
|
|
|
65
65
|
transactionHash?: string;
|
|
66
66
|
function_name?: string;
|
|
67
67
|
function_args?: Record<string, unknown>;
|
|
68
|
+
builder_codes?: string;
|
|
68
69
|
}
|
|
69
70
|
export interface SignatureAPIEvent {
|
|
70
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
|
|
@@ -3,6 +3,8 @@ import { utf8ToBytes } from "ethereum-cryptography/utils.js";
|
|
|
3
3
|
import { ensureIfUint8Array, isAddress, uint8ArrayToHexString, } from "../validators";
|
|
4
4
|
import { isNullish } from "../validators/object";
|
|
5
5
|
import { BLOCKED_ADDRESSES } from "../constants";
|
|
6
|
+
import { isSolanaAddress, getValidSolanaAddress } from "../solana/address";
|
|
7
|
+
import { SOLANA_CHAIN_IDS } from "../solana/types";
|
|
6
8
|
/**
|
|
7
9
|
* Private helper function to validate and trim an address
|
|
8
10
|
* @param address The address to validate and trim
|
|
@@ -78,4 +80,47 @@ export var toChecksumAddress = function (address) {
|
|
|
78
80
|
}
|
|
79
81
|
return checksumAddress;
|
|
80
82
|
};
|
|
83
|
+
/**
|
|
84
|
+
* Validates an EVM address and returns it in checksummed format.
|
|
85
|
+
* @param address The address to validate
|
|
86
|
+
* @returns The checksummed address or undefined if invalid
|
|
87
|
+
*/
|
|
88
|
+
export var validateAndChecksumAddress = function (address) {
|
|
89
|
+
var validAddress = getValidAddress(address);
|
|
90
|
+
return validAddress ? toChecksumAddress(validAddress) : undefined;
|
|
91
|
+
};
|
|
92
|
+
/**
|
|
93
|
+
* Validates an address for both EVM and Solana chains.
|
|
94
|
+
* For EVM addresses, returns checksummed format.
|
|
95
|
+
* For Solana addresses, returns the Base58 address as-is.
|
|
96
|
+
*
|
|
97
|
+
* When chainId is explicitly provided, validation is strict:
|
|
98
|
+
* - Solana chainId → only Solana validation
|
|
99
|
+
* - Non-Solana chainId → only EVM validation
|
|
100
|
+
* When chainId is omitted, EVM is tried first with Solana fallback.
|
|
101
|
+
*
|
|
102
|
+
* @param address The address to validate
|
|
103
|
+
* @param chainId Optional chain ID to determine address type
|
|
104
|
+
* @returns The validated address or undefined if invalid
|
|
105
|
+
*/
|
|
106
|
+
export var validateAddress = function (address, chainId) {
|
|
107
|
+
var solanaChainIds = Object.values(SOLANA_CHAIN_IDS);
|
|
108
|
+
// Explicit Solana chainId → validate ONLY as Solana
|
|
109
|
+
if (chainId !== undefined && chainId !== null && solanaChainIds.includes(chainId)) {
|
|
110
|
+
return getValidSolanaAddress(address) || undefined;
|
|
111
|
+
}
|
|
112
|
+
// Explicit non-Solana chainId → validate ONLY as EVM
|
|
113
|
+
if (chainId !== undefined && chainId !== null) {
|
|
114
|
+
return validateAndChecksumAddress(address);
|
|
115
|
+
}
|
|
116
|
+
// No chainId → try EVM first, then Solana fallback
|
|
117
|
+
var validEvmAddress = validateAndChecksumAddress(address);
|
|
118
|
+
if (validEvmAddress) {
|
|
119
|
+
return validEvmAddress;
|
|
120
|
+
}
|
|
121
|
+
if (isSolanaAddress(address)) {
|
|
122
|
+
return getValidSolanaAddress(address) || undefined;
|
|
123
|
+
}
|
|
124
|
+
return undefined;
|
|
125
|
+
};
|
|
81
126
|
//# 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,140 @@
|
|
|
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
|
+
/** The 16-byte ERC-8021 marker appended at the very end of calldata */
|
|
24
|
+
var ERC_MARKER = "80218021802180218021802180218021";
|
|
25
|
+
/** Length of the ERC marker in hex characters (16 bytes = 32 hex chars) */
|
|
26
|
+
var ERC_MARKER_HEX_LENGTH = 32;
|
|
27
|
+
/** Supported schema IDs */
|
|
28
|
+
var SCHEMA_ID_CANONICAL = "00";
|
|
29
|
+
var SCHEMA_ID_CUSTOM_REGISTRY = "01";
|
|
30
|
+
/** Comma delimiter (0x2C) used to separate multiple codes */
|
|
31
|
+
var COMMA_BYTE = 0x2c;
|
|
32
|
+
/**
|
|
33
|
+
* Decode the codes field from a hex string into a comma-separated string.
|
|
34
|
+
* Validates that all bytes are printable ASCII (0x20–0x7E).
|
|
35
|
+
*
|
|
36
|
+
* @param codesHex - Hex string of the codes field
|
|
37
|
+
* @returns Comma-separated builder codes string, or undefined if invalid
|
|
38
|
+
*/
|
|
39
|
+
function decodeCodes(codesHex) {
|
|
40
|
+
var bytes = [];
|
|
41
|
+
for (var i = 0; i < codesHex.length; i += 2) {
|
|
42
|
+
var byte = parseInt(codesHex.slice(i, i + 2), 16);
|
|
43
|
+
// Reject NaN (invalid hex), non-printable or non-ASCII bytes
|
|
44
|
+
if (isNaN(byte) || byte < 0x20 || byte > 0x7e) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
bytes.push(byte);
|
|
48
|
+
}
|
|
49
|
+
// Split on comma delimiter and decode each code as ASCII
|
|
50
|
+
var codes = [];
|
|
51
|
+
var current = [];
|
|
52
|
+
for (var _i = 0, bytes_1 = bytes; _i < bytes_1.length; _i++) {
|
|
53
|
+
var byte = bytes_1[_i];
|
|
54
|
+
if (byte === COMMA_BYTE) {
|
|
55
|
+
if (current.length > 0) {
|
|
56
|
+
codes.push(String.fromCharCode.apply(String, current));
|
|
57
|
+
current = [];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
current.push(byte);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
// Push the last code segment
|
|
65
|
+
if (current.length > 0) {
|
|
66
|
+
codes.push(String.fromCharCode.apply(String, current));
|
|
67
|
+
}
|
|
68
|
+
return codes.length > 0 ? codes.join(",") : undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Read codesLength and codes from the hex string ending at the given position.
|
|
72
|
+
*
|
|
73
|
+
* @param hex - Full hex string (lowercase, no 0x prefix)
|
|
74
|
+
* @param endPos - Hex char position where codesLength byte ends (i.e. start of schemaId)
|
|
75
|
+
* @returns Object with decoded codes string and the hex char position where codes start, or undefined
|
|
76
|
+
*/
|
|
77
|
+
function readCodes(hex, endPos) {
|
|
78
|
+
// Read codesLength (1 byte before endPos)
|
|
79
|
+
var codesLengthStart = endPos - 2;
|
|
80
|
+
if (codesLengthStart < 0) {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
var codesLength = parseInt(hex.slice(codesLengthStart, endPos), 16);
|
|
84
|
+
if (codesLength === 0 || isNaN(codesLength)) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
// Read the codes field
|
|
88
|
+
var codesHexLength = codesLength * 2;
|
|
89
|
+
var codesStart = codesLengthStart - codesHexLength;
|
|
90
|
+
if (codesStart < 0) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
var codesHex = hex.slice(codesStart, codesLengthStart);
|
|
94
|
+
var codes = decodeCodes(codesHex);
|
|
95
|
+
if (!codes) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
return { codes: codes, codesStart: codesStart };
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Extract builder codes from transaction calldata by parsing the ERC-8021 suffix.
|
|
102
|
+
*
|
|
103
|
+
* @param data - The transaction calldata hex string (with or without 0x prefix)
|
|
104
|
+
* @returns A comma-separated string of builder codes (e.g. "uniswap,base"), or undefined if no valid ERC-8021 suffix is found
|
|
105
|
+
*/
|
|
106
|
+
export function extractBuilderCodes(data) {
|
|
107
|
+
if (!data || typeof data !== "string") {
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
// Normalize: remove 0x prefix and work with lowercase hex
|
|
111
|
+
var hex = data.startsWith("0x") || data.startsWith("0X")
|
|
112
|
+
? data.slice(2).toLowerCase()
|
|
113
|
+
: data.toLowerCase();
|
|
114
|
+
// Minimum suffix: 1+ byte codes + 1 byte codesLength + 1 byte schemaId + 16 bytes marker = 19 bytes = 38 hex chars
|
|
115
|
+
if (hex.length < 38) {
|
|
116
|
+
return undefined;
|
|
117
|
+
}
|
|
118
|
+
// Step 1: Check last 16 bytes for ERC marker
|
|
119
|
+
var markerStart = hex.length - ERC_MARKER_HEX_LENGTH;
|
|
120
|
+
var marker = hex.slice(markerStart);
|
|
121
|
+
if (marker !== ERC_MARKER) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
// Step 2: Read schemaId (1 byte before the marker)
|
|
125
|
+
var schemaIdStart = markerStart - 2;
|
|
126
|
+
if (schemaIdStart < 0) {
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
var schemaId = hex.slice(schemaIdStart, markerStart);
|
|
130
|
+
// Step 3: Parse based on schemaId
|
|
131
|
+
if (schemaId === SCHEMA_ID_CANONICAL || schemaId === SCHEMA_ID_CUSTOM_REGISTRY) {
|
|
132
|
+
// Both Schema 0 and Schema 1 have codes in the same position
|
|
133
|
+
// (immediately before schemaId when parsing backwards)
|
|
134
|
+
var result = readCodes(hex, schemaIdStart);
|
|
135
|
+
return result === null || result === void 0 ? void 0 : result.codes;
|
|
136
|
+
}
|
|
137
|
+
// Unknown schema - cannot parse
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=builderCode.js.map
|
|
@@ -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/esm/src/version.js
CHANGED
|
@@ -54,7 +54,8 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
54
54
|
};
|
|
55
55
|
import { SignatureStatus, TransactionStatus } from "../types/events";
|
|
56
56
|
import { logger } from "../logger";
|
|
57
|
-
import { encodeWriteContractData, extractFunctionArgs, buildSafeFunctionArgs, } from "./utils";
|
|
57
|
+
import { encodeWriteContractData, concatCalldataWithSuffix, extractFunctionArgs, buildSafeFunctionArgs, } from "./utils";
|
|
58
|
+
import { extractBuilderCodes } from "../utils/builderCode";
|
|
58
59
|
/**
|
|
59
60
|
* Built-in transaction fields that could collide with function args.
|
|
60
61
|
* Defined at module level to avoid recreating on every method call.
|
|
@@ -69,6 +70,7 @@ var RESERVED_FIELDS = new Set([
|
|
|
69
70
|
"transactionHash",
|
|
70
71
|
"function_name",
|
|
71
72
|
"function_args",
|
|
73
|
+
"builder_codes",
|
|
72
74
|
]);
|
|
73
75
|
/**
|
|
74
76
|
* Clean up old entries from a Set to prevent memory leaks.
|
|
@@ -383,7 +385,7 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
383
385
|
chainId: chainId,
|
|
384
386
|
blockNumber: (_a = receipt === null || receipt === void 0 ? void 0 : receipt.blockNumber) === null || _a === void 0 ? void 0 : _a.toString(),
|
|
385
387
|
});
|
|
386
|
-
this.formo.transaction(__assign(__assign(__assign(__assign(__assign({ status: txStatus, chainId: chainId || 0, address: address, transactionHash: transactionHash }, ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.data) && { data: pendingTx.data })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.to) && { to: pendingTx.to })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.value) && { value: pendingTx.value })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.function_name) && { function_name: pendingTx.function_name })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.function_args) && { function_args: pendingTx.function_args })),
|
|
388
|
+
this.formo.transaction(__assign(__assign(__assign(__assign(__assign(__assign({ status: txStatus, chainId: chainId || 0, address: address, transactionHash: transactionHash }, ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.data) && { data: pendingTx.data })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.to) && { to: pendingTx.to })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.value) && { value: pendingTx.value })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.function_name) && { function_name: pendingTx.function_name })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.function_args) && { function_args: pendingTx.function_args })), ((pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.builder_codes) && { builder_codes: pendingTx.builder_codes })),
|
|
387
389
|
// Spread function args as additional properties (only colliding keys are prefixed)
|
|
388
390
|
pendingTx === null || pendingTx === void 0 ? void 0 : pendingTx.safeFunctionArgs);
|
|
389
391
|
// Clean up the pending transaction after confirmation
|
|
@@ -537,7 +539,7 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
537
539
|
var value = (_a = variables.value) === null || _a === void 0 ? void 0 : _a.toString();
|
|
538
540
|
if (mutationType === "writeContract") {
|
|
539
541
|
// For writeContract, extract function info and encode data
|
|
540
|
-
var abi = variables.abi, fnName = variables.functionName, args = variables.args, contractAddress = variables.address;
|
|
542
|
+
var abi = variables.abi, fnName = variables.functionName, args = variables.args, contractAddress = variables.address, dataSuffix = variables.dataSuffix;
|
|
541
543
|
to = contractAddress;
|
|
542
544
|
function_name = fnName;
|
|
543
545
|
if (abi && fnName) {
|
|
@@ -546,7 +548,8 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
546
548
|
// Encode the function data synchronously if viem is available
|
|
547
549
|
var encodedData = encodeWriteContractData(abi, fnName, args);
|
|
548
550
|
if (encodedData) {
|
|
549
|
-
|
|
551
|
+
// Include dataSuffix (ERC-8021 builder code) so extractBuilderCodes sees full calldata
|
|
552
|
+
data = concatCalldataWithSuffix(encodedData, dataSuffix);
|
|
550
553
|
logger.debug("WagmiEventHandler: Encoded writeContract data", data.substring(0, 10));
|
|
551
554
|
}
|
|
552
555
|
}
|
|
@@ -557,14 +560,9 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
557
560
|
data = variables.data;
|
|
558
561
|
to = variables.to;
|
|
559
562
|
}
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
address: userAddress,
|
|
564
|
-
chainId: chainId,
|
|
565
|
-
transactionHash: transactionHash,
|
|
566
|
-
function_name: function_name,
|
|
567
|
-
});
|
|
563
|
+
// Extract builder codes from transaction data (ERC-8021)
|
|
564
|
+
var builder_codes = extractBuilderCodes(data);
|
|
565
|
+
logger.info("WagmiEventHandler: Tracking transaction event", __assign({ status: status_2, mutationType: mutationType, address: userAddress, chainId: chainId, transactionHash: transactionHash, function_name: function_name }, (builder_codes && { builder_codes: builder_codes })));
|
|
568
566
|
// Build safeFunctionArgs with collision handling and struct flattening
|
|
569
567
|
var safeFunctionArgs = buildSafeFunctionArgs(function_args, RESERVED_FIELDS);
|
|
570
568
|
// Store transaction details for BROADCASTED status to use in CONFIRMED/REVERTED
|
|
@@ -572,7 +570,7 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
572
570
|
// Include the sender address to handle wallet switches between broadcast and confirmation
|
|
573
571
|
if (status_2 === TransactionStatus.BROADCASTED && transactionHash) {
|
|
574
572
|
var normalizedHash = transactionHash.toLowerCase();
|
|
575
|
-
var txDetails = __assign(__assign(__assign(__assign(__assign(__assign({ address: userAddress }, (data && { data: data })), (to && { to: to })), (value && { value: value })), (function_name && { function_name: function_name })), (function_args && { function_args: function_args })), (safeFunctionArgs && { safeFunctionArgs: safeFunctionArgs }));
|
|
573
|
+
var txDetails = __assign(__assign(__assign(__assign(__assign(__assign(__assign({ address: userAddress }, (data && { data: data })), (to && { to: to })), (value && { value: value })), (function_name && { function_name: function_name })), (function_args && { function_args: function_args })), (builder_codes && { builder_codes: builder_codes })), (safeFunctionArgs && { safeFunctionArgs: safeFunctionArgs }));
|
|
576
574
|
this.pendingTransactions.set(normalizedHash, txDetails);
|
|
577
575
|
logger.debug("WagmiEventHandler: Stored pending transaction for confirmation", {
|
|
578
576
|
transactionHash: normalizedHash,
|
|
@@ -586,7 +584,7 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
586
584
|
}
|
|
587
585
|
}
|
|
588
586
|
}
|
|
589
|
-
this.formo.transaction(__assign(__assign(__assign(__assign(__assign(__assign({ status: status_2, chainId: chainId || 0, address: userAddress }, (data && { data: data })), (to && { to: to })), (value && { value: value })), (transactionHash && { transactionHash: transactionHash })), (function_name && { function_name: function_name })), (function_args && { function_args: function_args })),
|
|
587
|
+
this.formo.transaction(__assign(__assign(__assign(__assign(__assign(__assign(__assign({ status: status_2, chainId: chainId || 0, address: userAddress }, (data && { data: data })), (to && { to: to })), (value && { value: value })), (transactionHash && { transactionHash: transactionHash })), (function_name && { function_name: function_name })), (function_args && { function_args: function_args })), (builder_codes && { builder_codes: builder_codes })),
|
|
590
588
|
// Spread function args as additional properties (only colliding keys are prefixed)
|
|
591
589
|
safeFunctionArgs);
|
|
592
590
|
}
|
|
@@ -644,7 +642,7 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
644
642
|
* Clean up all subscriptions
|
|
645
643
|
*/
|
|
646
644
|
WagmiEventHandler.prototype.cleanup = function () {
|
|
647
|
-
logger.
|
|
645
|
+
logger.debug("WagmiEventHandler: Cleaning up subscriptions");
|
|
648
646
|
for (var _i = 0, _a = this.unsubscribers; _i < _a.length; _i++) {
|
|
649
647
|
var unsubscribe = _a[_i];
|
|
650
648
|
try {
|
|
@@ -658,7 +656,7 @@ var WagmiEventHandler = /** @class */ (function () {
|
|
|
658
656
|
this.processedMutations.clear();
|
|
659
657
|
this.processedQueries.clear();
|
|
660
658
|
this.pendingTransactions.clear();
|
|
661
|
-
logger.
|
|
659
|
+
logger.debug("WagmiEventHandler: Cleanup complete");
|
|
662
660
|
};
|
|
663
661
|
return WagmiEventHandler;
|
|
664
662
|
}());
|
|
@@ -40,6 +40,11 @@ export interface AbiOutput {
|
|
|
40
40
|
components?: AbiOutput[];
|
|
41
41
|
internalType?: string;
|
|
42
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Concatenate encoded calldata with an optional ERC-8021 dataSuffix (e.g. builder codes).
|
|
45
|
+
* Uses viem's concatHex when available for correct hex handling.
|
|
46
|
+
*/
|
|
47
|
+
export declare function concatCalldataWithSuffix(encodedData: string, dataSuffix: string | undefined): string;
|
|
43
48
|
/**
|
|
44
49
|
* Encode writeContract data using viem's encodeFunctionData
|
|
45
50
|
*
|
|
@@ -76,6 +76,7 @@ function tryLoadViem() {
|
|
|
76
76
|
if (viem === null || viem === void 0 ? void 0 : viem.encodeFunctionData) {
|
|
77
77
|
viemModule = {
|
|
78
78
|
encodeFunctionData: viem.encodeFunctionData,
|
|
79
|
+
concatHex: viem.concatHex,
|
|
79
80
|
};
|
|
80
81
|
return viemModule;
|
|
81
82
|
}
|
|
@@ -86,6 +87,24 @@ function tryLoadViem() {
|
|
|
86
87
|
viemModule = null;
|
|
87
88
|
return null;
|
|
88
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Concatenate encoded calldata with an optional ERC-8021 dataSuffix (e.g. builder codes).
|
|
92
|
+
* Uses viem's concatHex when available for correct hex handling.
|
|
93
|
+
*/
|
|
94
|
+
export function concatCalldataWithSuffix(encodedData, dataSuffix) {
|
|
95
|
+
if (!dataSuffix || dataSuffix === "0x") {
|
|
96
|
+
return encodedData;
|
|
97
|
+
}
|
|
98
|
+
var viem = tryLoadViem();
|
|
99
|
+
if (viem === null || viem === void 0 ? void 0 : viem.concatHex) {
|
|
100
|
+
return viem.concatHex([
|
|
101
|
+
encodedData,
|
|
102
|
+
dataSuffix,
|
|
103
|
+
]);
|
|
104
|
+
}
|
|
105
|
+
var suffixHex = dataSuffix.replace(/^0x/i, "");
|
|
106
|
+
return "".concat(encodedData).concat(suffixHex);
|
|
107
|
+
}
|
|
89
108
|
/**
|
|
90
109
|
* Encode writeContract data using viem's encodeFunctionData
|
|
91
110
|
*
|