@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.
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 +175 -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 +188 -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 +175 -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 +185 -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
@@ -44,9 +44,9 @@ export interface DetectAPIEvent {
44
44
  }
45
45
  export interface IdentifyAPIEvent {
46
46
  type: "identify";
47
- address: string;
48
- providerName: string;
49
- rdns: string;
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,5 +1,6 @@
1
1
  export * from "./address";
2
2
  export * from "./base";
3
+ export * from "./builderCode";
3
4
  export * from "./converter";
4
5
  export * from "./generate";
5
6
  export * from "./hash";
@@ -1,5 +1,6 @@
1
1
  export * from "./address";
2
2
  export * from "./base";
3
+ export * from "./builderCode";
3
4
  export * from "./converter";
4
5
  export * from "./generate";
5
6
  export * from "./hash";
@@ -1,2 +1,2 @@
1
- export declare const version = "1.27.0";
1
+ export declare const version = "1.28.0";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,4 +1,4 @@
1
1
  // This file is auto-generated by scripts/update-version.js during npm version
2
2
  // Do not edit manually - it will be overwritten
3
- export var version = '1.27.0';
3
+ export var version = '1.28.0';
4
4
  //# sourceMappingURL=version.js.map
@@ -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
- data = encodedData;
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
- logger.info("WagmiEventHandler: Tracking transaction event", {
561
- status: status_2,
562
- mutationType: mutationType,
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.info("WagmiEventHandler: Cleaning up subscriptions");
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.info("WagmiEventHandler: Cleanup complete");
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
  *