@debridge-finance/borderless-validation-sdk 0.0.7 → 0.0.8
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/helpers/eip712-types.js +29 -0
- package/dist/cjs/helpers/eip712-types.js.map +1 -0
- package/dist/cjs/helpers/evm-action.js +18 -2
- package/dist/cjs/helpers/evm-action.js.map +1 -1
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +24 -6
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -1
- package/dist/cjs/helpers/evm-token.js +1 -1
- package/dist/cjs/helpers/evm-token.js.map +1 -1
- package/dist/cjs/helpers/placeholder.js +96 -2
- package/dist/cjs/helpers/placeholder.js.map +1 -1
- package/dist/cjs/types/validation.js +22 -0
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/compensation-hook.js +5 -4
- package/dist/cjs/validations/compensation-hook.js.map +1 -1
- package/dist/cjs/validations/evm-caveats.js +7 -8
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +162 -53
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-hook.js +60 -25
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +28 -26
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-permit.js +143 -42
- package/dist/cjs/validations/evm-permit.js.map +1 -1
- package/dist/cjs/validations/evm-permit2.js +25 -35
- package/dist/cjs/validations/evm-permit2.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +10 -5
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +126 -3
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-shared.js +4 -5
- package/dist/cjs/validations/evm-sign712-shared.js.map +1 -1
- package/dist/cjs/validations/evm-sign712.js +3 -23
- package/dist/cjs/validations/evm-sign712.js.map +1 -1
- package/dist/cjs/validations/evm-sign7702.js +4 -5
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/hooks-common.js +247 -29
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent.js +2 -1
- package/dist/cjs/validations/intent.js.map +1 -1
- package/dist/cjs/validations/required-actions.js +4 -2
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +72 -9
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +69 -1
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +30 -3
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
- package/dist/cjs/validations/solana-sign.js +31 -15
- package/dist/cjs/validations/solana-sign.js.map +1 -1
- package/dist/cjs/validations/solana-transaction.js +29 -2
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validator.js +6 -3
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +61 -12
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +7 -2
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/helpers/eip712-types.js +26 -0
- package/dist/esm/helpers/eip712-types.js.map +1 -0
- package/dist/esm/helpers/evm-action.js +16 -2
- package/dist/esm/helpers/evm-action.js.map +1 -1
- package/dist/esm/helpers/evm-gas-compensation-tx.js +24 -6
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -1
- package/dist/esm/helpers/evm-token.js +3 -3
- package/dist/esm/helpers/evm-token.js.map +1 -1
- package/dist/esm/helpers/placeholder.js +95 -2
- package/dist/esm/helpers/placeholder.js.map +1 -1
- package/dist/esm/types/validation.js +22 -0
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/compensation-hook.js +5 -4
- package/dist/esm/validations/compensation-hook.js.map +1 -1
- package/dist/esm/validations/evm-caveats.js +7 -8
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +162 -54
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-hook.js +61 -26
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +29 -27
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-permit.js +144 -43
- package/dist/esm/validations/evm-permit.js.map +1 -1
- package/dist/esm/validations/evm-permit2.js +26 -36
- package/dist/esm/validations/evm-permit2.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +11 -6
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +126 -3
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign712-shared.js +4 -5
- package/dist/esm/validations/evm-sign712-shared.js.map +1 -1
- package/dist/esm/validations/evm-sign712.js +3 -23
- package/dist/esm/validations/evm-sign712.js.map +1 -1
- package/dist/esm/validations/evm-sign7702.js +4 -5
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/hooks-common.js +249 -31
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent.js +4 -3
- package/dist/esm/validations/intent.js.map +1 -1
- package/dist/esm/validations/required-actions.js +5 -3
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +72 -9
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +69 -1
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +30 -3
- package/dist/esm/validations/solana-op-wrap.js.map +1 -1
- package/dist/esm/validations/solana-sign.js +31 -15
- package/dist/esm/validations/solana-sign.js.map +1 -1
- package/dist/esm/validations/solana-transaction.js +29 -2
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validator.js +6 -3
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +61 -12
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +7 -2
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/whitelists/types.js.map +1 -1
- package/dist/types/helpers/eip712-types.d.ts +7 -0
- package/dist/types/helpers/eip712-types.d.ts.map +1 -0
- package/dist/types/helpers/evm-action.d.ts +6 -0
- package/dist/types/helpers/evm-action.d.ts.map +1 -1
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +3 -1
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -1
- package/dist/types/helpers/evm-token.d.ts.map +1 -1
- package/dist/types/helpers/placeholder.d.ts +3 -1
- package/dist/types/helpers/placeholder.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +23 -0
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/compensation-hook.d.ts +2 -1
- package/dist/types/validations/compensation-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-caveats.d.ts +2 -1
- package/dist/types/validations/evm-caveats.d.ts.map +1 -1
- package/dist/types/validations/evm-op-budget.d.ts +8 -0
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-hook.d.ts +2 -1
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/evm-permit.d.ts.map +1 -1
- package/dist/types/validations/evm-permit2.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts +2 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +3 -2
- package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712.d.ts.map +1 -1
- package/dist/types/validations/evm-sign7702.d.ts +3 -2
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/hooks-common.d.ts +5 -1
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/intent.d.ts.map +1 -1
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +2 -1
- package/dist/types/validations/solana-hook.d.ts.map +1 -1
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/solana-transaction.d.ts.map +1 -1
- package/dist/types/validator.d.ts.map +1 -1
- package/dist/types/whitelists/environment-config.d.ts.map +1 -1
- package/dist/types/whitelists/solana/intent-signature.d.ts +1 -0
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
- package/dist/types/whitelists/types.d.ts +9 -0
- package/dist/types/whitelists/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -5,7 +5,8 @@ import { maxUint256 } from "viem";
|
|
|
5
5
|
import { isNativeToken, resolveWrappedTokenAddress } from "../helpers/evm-token.js";
|
|
6
6
|
import { addressEquals, normalizeAddress } from "../helpers/address.js";
|
|
7
7
|
import { sumTradeAmounts } from "../helpers/evm-trade-amounts.js";
|
|
8
|
-
import { getTransactionCalls,
|
|
8
|
+
import { actionUsesTransactionCalls, getTransactionCallRefs, getTransactionCalls, getTransactionCallsContainerPath, } from "../helpers/evm-action.js";
|
|
9
|
+
import { parseIntegerString } from "../helpers/integer.js";
|
|
9
10
|
export function validateBudgetOperations(actions, basePath, request, trades, responseTrades, realChainId, envConfig) {
|
|
10
11
|
const violations = [];
|
|
11
12
|
for (let i = 0; i < actions.length; i++) {
|
|
@@ -15,12 +16,11 @@ export function validateBudgetOperations(actions, basePath, request, trades, res
|
|
|
15
16
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
16
17
|
// Applies to ALL Budget actions regardless of type
|
|
17
18
|
violations.push(...validateBudgetApproveNone(request, actionPath));
|
|
18
|
-
// Token address and calldata checks only apply to actions that
|
|
19
|
-
//
|
|
20
|
-
// validated by the permit/permit2 validators instead.
|
|
19
|
+
// Token address and calldata checks only apply to actions that carry
|
|
20
|
+
// effective transaction calls. Permit/Permit2 are validated separately.
|
|
21
21
|
if (!actionUsesTransactionCalls(action))
|
|
22
22
|
continue;
|
|
23
|
-
violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...
|
|
23
|
+
violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...validateBudgetTransactionValues(action, actionPath), ...validateBudgetCalldata(actions, i, actionPath, request, trades, responseTrades, realChainId, envConfig));
|
|
24
24
|
}
|
|
25
25
|
return violations;
|
|
26
26
|
}
|
|
@@ -36,17 +36,19 @@ function validateBudgetApproveNone(request, actionPath) {
|
|
|
36
36
|
}
|
|
37
37
|
return [];
|
|
38
38
|
}
|
|
39
|
-
// CRITICAL:
|
|
39
|
+
// CRITICAL: effective call target == details.tokenAddress, non-zero, in trades
|
|
40
40
|
function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
41
41
|
const violations = [];
|
|
42
|
-
const
|
|
42
|
+
const txCallRefs = getTransactionCallRefs(action, actionPath);
|
|
43
43
|
const tokenAddress = action.details?.tokenAddress;
|
|
44
|
-
// CRITICAL:
|
|
45
|
-
|
|
44
|
+
// CRITICAL: at least one effective transaction call must be present.
|
|
45
|
+
// Non-AA Transaction actions store it in action.data; AA actions store it
|
|
46
|
+
// in details.transactionCalls[].
|
|
47
|
+
if (txCallRefs.length === 0) {
|
|
46
48
|
violations.push({
|
|
47
49
|
code: ViolationCode.BudgetTransactionCallsMissing,
|
|
48
|
-
message: `Budget must have at least one
|
|
49
|
-
path:
|
|
50
|
+
message: `Budget must have at least one effective transaction call`,
|
|
51
|
+
path: getTransactionCallsContainerPath(action, actionPath),
|
|
50
52
|
actual: [],
|
|
51
53
|
});
|
|
52
54
|
}
|
|
@@ -61,18 +63,21 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
|
61
63
|
}
|
|
62
64
|
// Skip further checks if critical data is missing.
|
|
63
65
|
// It's safe as we already reported the violations for missing the required fields.
|
|
64
|
-
if (
|
|
66
|
+
if (txCallRefs.length === 0 || !tokenAddress)
|
|
65
67
|
return violations;
|
|
66
|
-
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
68
|
+
// CRITICAL: every effective Budget approve/reset call target must equal
|
|
69
|
+
// details.tokenAddress. This covers both one-call and reset+approve shapes.
|
|
70
|
+
for (const txCallRef of txCallRefs) {
|
|
71
|
+
const txTo = txCallRef.call.to;
|
|
72
|
+
if (!txTo || !addressEquals(realChainId, txTo, tokenAddress)) {
|
|
73
|
+
violations.push({
|
|
74
|
+
code: ViolationCode.BudgetTokenAddressMismatch,
|
|
75
|
+
message: `Budget transaction call target must equal details.tokenAddress`,
|
|
76
|
+
path: `${txCallRef.path}.to`,
|
|
77
|
+
expected: tokenAddress,
|
|
78
|
+
actual: txTo,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
76
81
|
}
|
|
77
82
|
// CRITICAL: must be non-zero address
|
|
78
83
|
if (isNativeToken(tokenAddress, realChainId)) {
|
|
@@ -101,70 +106,111 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
|
101
106
|
}
|
|
102
107
|
return violations;
|
|
103
108
|
}
|
|
109
|
+
// CRITICAL: Budget approve/reset calls must not send native value.
|
|
110
|
+
function validateBudgetTransactionValues(action, actionPath) {
|
|
111
|
+
const violations = [];
|
|
112
|
+
const txCallRefs = getTransactionCallRefs(action, actionPath);
|
|
113
|
+
for (const txCallRef of txCallRefs) {
|
|
114
|
+
try {
|
|
115
|
+
const value = parseIntegerString(txCallRef.call.value);
|
|
116
|
+
if (value !== 0n) {
|
|
117
|
+
violations.push({
|
|
118
|
+
code: ViolationCode.BudgetTransactionValueNonZero,
|
|
119
|
+
message: `Budget transaction call value must be zero`,
|
|
120
|
+
path: `${txCallRef.path}.value`,
|
|
121
|
+
expected: "0",
|
|
122
|
+
actual: value.toString(),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
violations.push({
|
|
128
|
+
code: ViolationCode.BudgetTransactionValueNonZero,
|
|
129
|
+
message: `Budget transaction call value is not a valid integer`,
|
|
130
|
+
path: `${txCallRef.path}.value`,
|
|
131
|
+
expected: "0",
|
|
132
|
+
actual: txCallRef.call.value,
|
|
133
|
+
details: error,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return violations;
|
|
138
|
+
}
|
|
104
139
|
// CRITICAL: decode approve calldata, validate spender + amount + allowanceHolder
|
|
105
|
-
// Handles
|
|
106
|
-
|
|
107
|
-
|
|
140
|
+
// Handles both accepted reset shapes:
|
|
141
|
+
// - separate reset action followed by the main Budget action;
|
|
142
|
+
// - one action with reset + main transactionCalls.
|
|
143
|
+
function validateBudgetCalldata(actions, actionIndex, actionPath, request, trades, responseTrades, realChainId, envConfig) {
|
|
144
|
+
const action = actions[actionIndex];
|
|
145
|
+
const txCallRefs = getTransactionCallRefs(action, actionPath);
|
|
108
146
|
// Missing txCalls is reported by validateBudgetTokenAddress
|
|
109
|
-
if (
|
|
147
|
+
if (txCallRefs.length === 0)
|
|
110
148
|
return [];
|
|
111
|
-
const decoded = decodeBudgetApproveCalls(
|
|
149
|
+
const decoded = decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId);
|
|
112
150
|
if ("violations" in decoded)
|
|
113
151
|
return decoded.violations;
|
|
114
152
|
const violations = [];
|
|
115
|
-
|
|
153
|
+
const isSeparateReset = txCallRefs.length === 1 && decoded.amount === 0n;
|
|
154
|
+
violations.push(...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.path, realChainId, envConfig));
|
|
155
|
+
if (isSeparateReset) {
|
|
156
|
+
violations.push(...validateSeparateBudgetResetPair(actions, actionIndex, actionPath, decoded, realChainId));
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
violations.push(...validateBudgetAmount(decoded.amount, decoded.path, request, trades, responseTrades, action, realChainId));
|
|
160
|
+
}
|
|
116
161
|
return violations;
|
|
117
162
|
}
|
|
118
163
|
// Decodes one or two approve calls. Returns the "real" approve.
|
|
119
164
|
// If two calls: first must be approve(spender, 0), second is the real one.
|
|
120
|
-
function decodeBudgetApproveCalls(
|
|
121
|
-
const calldataPath =
|
|
122
|
-
// CRITICAL: at most 2
|
|
123
|
-
if (
|
|
165
|
+
function decodeBudgetApproveCalls(txCallRefs, action, actionPath, realChainId) {
|
|
166
|
+
const calldataPath = getTransactionCallsContainerPath(action, actionPath);
|
|
167
|
+
// CRITICAL: at most 2 effective transaction calls
|
|
168
|
+
if (txCallRefs.length > 2) {
|
|
124
169
|
return { violations: [{
|
|
125
170
|
code: ViolationCode.BudgetTooManyTransactionCalls,
|
|
126
|
-
message: `Budget must have at most 2
|
|
171
|
+
message: `Budget must have at most 2 effective transaction calls`,
|
|
127
172
|
path: calldataPath,
|
|
128
173
|
expected: 2,
|
|
129
|
-
actual:
|
|
174
|
+
actual: txCallRefs.length,
|
|
130
175
|
}] };
|
|
131
176
|
}
|
|
132
|
-
const mainApproveIndex =
|
|
177
|
+
const mainApproveIndex = txCallRefs.length - 1;
|
|
178
|
+
const mainCallRef = txCallRefs[mainApproveIndex];
|
|
133
179
|
// Decode last call — this is always the "real" approve
|
|
134
180
|
let mainApprove;
|
|
135
181
|
try {
|
|
136
|
-
mainApprove = decodeApproveCalldata(
|
|
182
|
+
mainApprove = decodeApproveCalldata(mainCallRef.call.data);
|
|
137
183
|
}
|
|
138
184
|
catch (e) {
|
|
139
185
|
return { violations: [{
|
|
140
186
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
141
187
|
message: `Budget calldata is not valid approve`,
|
|
142
|
-
path: `${
|
|
143
|
-
actual:
|
|
188
|
+
path: `${mainCallRef.path}.data`,
|
|
189
|
+
actual: mainCallRef.call.data,
|
|
144
190
|
details: e,
|
|
145
191
|
}] };
|
|
146
192
|
}
|
|
147
193
|
// If two calls, the first must be a reset: approve(same spender, 0)
|
|
148
|
-
if (
|
|
149
|
-
const resetViolations = validateBudgetResetCall(
|
|
194
|
+
if (txCallRefs.length === 2) {
|
|
195
|
+
const resetViolations = validateBudgetResetCall(txCallRefs[0], mainApprove.spender, realChainId);
|
|
150
196
|
if (resetViolations.length > 0) {
|
|
151
197
|
return { violations: resetViolations };
|
|
152
198
|
}
|
|
153
199
|
}
|
|
154
|
-
return { ...mainApprove,
|
|
200
|
+
return { ...mainApprove, path: `${mainCallRef.path}.data` };
|
|
155
201
|
}
|
|
156
202
|
// Validates the reset call: must be approve(same spender, 0)
|
|
157
|
-
function validateBudgetResetCall(
|
|
203
|
+
function validateBudgetResetCall(txCallRef, expectedSpender, realChainId) {
|
|
158
204
|
let resetApprove;
|
|
159
205
|
try {
|
|
160
|
-
resetApprove = decodeApproveCalldata(
|
|
206
|
+
resetApprove = decodeApproveCalldata(txCallRef.call.data);
|
|
161
207
|
}
|
|
162
208
|
catch (e) {
|
|
163
209
|
return [{
|
|
164
210
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
165
211
|
message: `Budget reset calldata is not valid approve`,
|
|
166
|
-
path: `${
|
|
167
|
-
actual:
|
|
212
|
+
path: `${txCallRef.path}.data`,
|
|
213
|
+
actual: txCallRef.call.data,
|
|
168
214
|
details: e,
|
|
169
215
|
}];
|
|
170
216
|
}
|
|
@@ -174,37 +220,99 @@ function validateBudgetResetCall(txCall, expectedSpender, calldataPath) {
|
|
|
174
220
|
violations.push({
|
|
175
221
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
176
222
|
message: `Budget two-step approve: first call must be approve(spender, 0)`,
|
|
177
|
-
path: `${
|
|
223
|
+
path: `${txCallRef.path}.data`,
|
|
178
224
|
expected: "0",
|
|
179
225
|
actual: resetApprove.amount.toString(),
|
|
180
226
|
});
|
|
181
227
|
}
|
|
182
228
|
// CRITICAL: reset spender must match main spender
|
|
183
|
-
if (resetApprove.spender
|
|
229
|
+
if (!addressEquals(realChainId, resetApprove.spender, expectedSpender)) {
|
|
184
230
|
violations.push({
|
|
185
231
|
code: ViolationCode.BudgetCalldataInvalid,
|
|
186
232
|
message: `Budget two-step approve: reset spender must match main spender`,
|
|
187
|
-
path: `${
|
|
233
|
+
path: `${txCallRef.path}.data`,
|
|
188
234
|
expected: expectedSpender,
|
|
189
235
|
actual: resetApprove.spender,
|
|
190
236
|
});
|
|
191
237
|
}
|
|
192
238
|
return violations;
|
|
193
239
|
}
|
|
240
|
+
export function getBudgetApprovalInfo(action) {
|
|
241
|
+
if (action === undefined ||
|
|
242
|
+
!action.actions.includes(EvmActionOperation.Budget) ||
|
|
243
|
+
!actionUsesTransactionCalls(action) ||
|
|
244
|
+
!action.details?.tokenAddress) {
|
|
245
|
+
return undefined;
|
|
246
|
+
}
|
|
247
|
+
const txCalls = getTransactionCalls(action);
|
|
248
|
+
if (txCalls.length === 0 || txCalls.length > 2)
|
|
249
|
+
return undefined;
|
|
250
|
+
try {
|
|
251
|
+
const approve = decodeApproveCalldata(txCalls[txCalls.length - 1].data);
|
|
252
|
+
return {
|
|
253
|
+
tokenAddress: action.details.tokenAddress,
|
|
254
|
+
allowanceHolder: action.details.allowanceHolder,
|
|
255
|
+
spender: approve.spender,
|
|
256
|
+
amount: approve.amount,
|
|
257
|
+
callCount: txCalls.length,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
catch {
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// HIGH: a standalone zero-reset approve is only valid when it is immediately
|
|
265
|
+
// followed by the main Budget approve for the same token/spender/holder.
|
|
266
|
+
function validateSeparateBudgetResetPair(actions, actionIndex, actionPath, decodedReset, realChainId) {
|
|
267
|
+
const current = getBudgetApprovalInfo(actions[actionIndex]);
|
|
268
|
+
const next = getBudgetApprovalInfo(actions[actionIndex + 1]);
|
|
269
|
+
const paired = current !== undefined &&
|
|
270
|
+
next !== undefined &&
|
|
271
|
+
current.callCount === 1 &&
|
|
272
|
+
next.callCount === 1 &&
|
|
273
|
+
next.amount !== 0n &&
|
|
274
|
+
sameBudgetApprovalTarget(current, next, realChainId);
|
|
275
|
+
if (paired)
|
|
276
|
+
return [];
|
|
277
|
+
return [{
|
|
278
|
+
code: ViolationCode.BudgetResetActionUnpaired,
|
|
279
|
+
message: `Budget zero-reset action must be immediately followed by`
|
|
280
|
+
+ ` the main Budget approve for the same token and spender`,
|
|
281
|
+
path: actionPath,
|
|
282
|
+
actual: {
|
|
283
|
+
tokenAddress: current?.tokenAddress,
|
|
284
|
+
allowanceHolder: current?.allowanceHolder,
|
|
285
|
+
spender: decodedReset.spender,
|
|
286
|
+
amount: decodedReset.amount.toString(),
|
|
287
|
+
next: next ? {
|
|
288
|
+
tokenAddress: next.tokenAddress,
|
|
289
|
+
allowanceHolder: next.allowanceHolder,
|
|
290
|
+
spender: next.spender,
|
|
291
|
+
amount: next.amount.toString(),
|
|
292
|
+
} : undefined,
|
|
293
|
+
},
|
|
294
|
+
}];
|
|
295
|
+
}
|
|
296
|
+
function sameBudgetApprovalTarget(a, b, realChainId) {
|
|
297
|
+
return addressEquals(realChainId, a.tokenAddress, b.tokenAddress) &&
|
|
298
|
+
addressEquals(realChainId, a.spender, b.spender) &&
|
|
299
|
+
a.allowanceHolder !== undefined &&
|
|
300
|
+
b.allowanceHolder !== undefined &&
|
|
301
|
+
addressEquals(realChainId, a.allowanceHolder, b.allowanceHolder);
|
|
302
|
+
}
|
|
194
303
|
// CRITICAL: approve amount validation. The expected amount is
|
|
195
304
|
// `Σ response.trades[i].srcChainTokenIn.amount` over trades whose input
|
|
196
305
|
// token matches the Budget action's token — the same response-side number
|
|
197
306
|
// the API uses for `intent.inputToken[].constraintBudget` and Wrap.value.
|
|
198
|
-
function validateBudgetAmount(approveAmount,
|
|
307
|
+
function validateBudgetAmount(approveAmount, calldataPath, request, trades, responseTrades, action, realChainId) {
|
|
199
308
|
const flag = request.approveAmountFlag;
|
|
200
|
-
const dataPath = `${actionPath}.details.transactionCalls[${mainIndex}].data`;
|
|
201
309
|
// unlimited: must be maxUint256
|
|
202
310
|
if (flag === ApproveAmountFlag.Unlimited) {
|
|
203
311
|
if (approveAmount !== maxUint256) {
|
|
204
312
|
return [{
|
|
205
313
|
code: ViolationCode.BudgetAmountMismatch,
|
|
206
314
|
message: `Budget approve amount must be maxUint256 when approveAmountFlag="unlimited"`,
|
|
207
|
-
path:
|
|
315
|
+
path: calldataPath,
|
|
208
316
|
expected: maxUint256.toString(),
|
|
209
317
|
actual: approveAmount.toString(),
|
|
210
318
|
}];
|
|
@@ -225,7 +333,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
|
|
|
225
333
|
return [{
|
|
226
334
|
code: ViolationCode.BudgetAmountMismatch,
|
|
227
335
|
message: `Budget approve amount does not match sum of trade amounts`,
|
|
228
|
-
path:
|
|
336
|
+
path: calldataPath,
|
|
229
337
|
expected: sumResult.sum.toString(),
|
|
230
338
|
actual: approveAmount.toString(),
|
|
231
339
|
}];
|
|
@@ -233,7 +341,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
|
|
|
233
341
|
return [];
|
|
234
342
|
}
|
|
235
343
|
// CRITICAL: approve target == details.allowanceHolder, both whitelisted
|
|
236
|
-
function validateBudgetAllowanceHolder(approveSpender, action, actionPath,
|
|
344
|
+
function validateBudgetAllowanceHolder(approveSpender, action, actionPath, calldataPath, realChainId, envConfig) {
|
|
237
345
|
const violations = [];
|
|
238
346
|
const allowanceHolder = action.details?.allowanceHolder;
|
|
239
347
|
// CRITICAL: approve target must equal details.allowanceHolder
|
|
@@ -252,7 +360,7 @@ function validateBudgetAllowanceHolder(approveSpender, action, actionPath, mainI
|
|
|
252
360
|
violations.push({
|
|
253
361
|
code: ViolationCode.BudgetAllowanceHolderNotWhitelisted,
|
|
254
362
|
message: `Budget approve spender is not a whitelisted AllowanceHolder`,
|
|
255
|
-
path:
|
|
363
|
+
path: calldataPath,
|
|
256
364
|
actual: approveSpender,
|
|
257
365
|
});
|
|
258
366
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ViolationCode, EvmActionKind, EvmActionOperation, PlaceholderType, BundleHookType, } from "../types/index.js";
|
|
2
2
|
import { isRequestHookV2 } from "../types/request.js";
|
|
3
|
-
import { HookMode, resolveEagerPlaceholders } from "../helpers/placeholder.js";
|
|
3
|
+
import { HookMode, resolveEagerPlaceholders, resolveEagerValuePlaceholders, } from "../helpers/placeholder.js";
|
|
4
4
|
import { extractGasCompensationGroups } from "../helpers/gas-compensation.js";
|
|
5
5
|
import { validateEvmGasCompensationTx } from "../helpers/evm-gas-compensation-tx.js";
|
|
6
6
|
import { parseIntegerString } from "../helpers/integer.js";
|
|
@@ -12,14 +12,14 @@ const SIGN712_HOOK_TYPES = [
|
|
|
12
12
|
EvmActionKind.Sign712MetaMaskCaveats,
|
|
13
13
|
EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders,
|
|
14
14
|
];
|
|
15
|
-
export function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request) {
|
|
15
|
+
export function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request, envConfig) {
|
|
16
16
|
const violations = [];
|
|
17
17
|
if (!isRequestHookV2(hookPayload.hook))
|
|
18
18
|
return violations;
|
|
19
19
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
20
20
|
const action = hookPayload.requiredActions[i];
|
|
21
21
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
22
|
-
violations.push(...validateHookSign7702Binding(action, actionPath, realChainId));
|
|
22
|
+
violations.push(...validateHookSign7702Binding(action, actionPath, realChainId, envConfig));
|
|
23
23
|
}
|
|
24
24
|
if (hookPayload.hook.type === BundleHookType.Direct) {
|
|
25
25
|
violations.push(...validateDirectEvmHookActions(hookPayload, requestHook, basePath));
|
|
@@ -31,12 +31,12 @@ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode,
|
|
|
31
31
|
const expectedDelegate = request.enableAccountAbstraction
|
|
32
32
|
? getExpectedBundleHookDelegate(request.trades, hookPayload.hook.chainId)
|
|
33
33
|
: undefined;
|
|
34
|
-
violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate));
|
|
34
|
+
violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp, expectedDelegate, envConfig));
|
|
35
35
|
}
|
|
36
36
|
violations.push(...validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
|
|
37
|
-
violations.push(...validateHookActionTransactionCallsMatch(hookPayload, basePath));
|
|
37
|
+
violations.push(...validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
|
|
38
38
|
if (requestHook === undefined && mode === HookMode.PreHooks) {
|
|
39
|
-
violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId));
|
|
39
|
+
violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig));
|
|
40
40
|
}
|
|
41
41
|
return violations;
|
|
42
42
|
}
|
|
@@ -47,7 +47,7 @@ export function validateEvmHookActions(hookPayload, requestHook, basePath, mode,
|
|
|
47
47
|
// `Transaction`) would slip through the operation/position checks elsewhere.
|
|
48
48
|
// The per-action [Delegate] + contractAddress checks are shared with intent-scope
|
|
49
49
|
// via `validateSign7702Action`; the type <-> [Delegate] binding is hook-specific.
|
|
50
|
-
function validateHookSign7702Binding(action, actionPath, realChainId) {
|
|
50
|
+
function validateHookSign7702Binding(action, actionPath, realChainId, envConfig) {
|
|
51
51
|
const violations = [];
|
|
52
52
|
const ops = action.actions;
|
|
53
53
|
const hasDelegate = ops.includes(EvmActionOperation.Delegate);
|
|
@@ -63,7 +63,7 @@ function validateHookSign7702Binding(action, actionPath, realChainId) {
|
|
|
63
63
|
});
|
|
64
64
|
}
|
|
65
65
|
if (isSign7702) {
|
|
66
|
-
violations.push(...validateSign7702Action(action, actionPath, realChainId));
|
|
66
|
+
violations.push(...validateSign7702Action(action, actionPath, realChainId, envConfig));
|
|
67
67
|
}
|
|
68
68
|
return violations;
|
|
69
69
|
}
|
|
@@ -110,7 +110,7 @@ function validateDirectAction(action, expectsTransaction, hookChainId, expectedD
|
|
|
110
110
|
// `Sign712MetaMaskCaveatsWithPlaceholders` (when at least one deferred
|
|
111
111
|
// placeholder is declared). transactionCalls form, placeholders match, and
|
|
112
112
|
// EIP-712 content checks (domain, delegator, caveats) are checked per-action below.
|
|
113
|
-
function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate) {
|
|
113
|
+
function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp, expectedDelegate, envConfig) {
|
|
114
114
|
const violations = [];
|
|
115
115
|
const expectedDeferred = collectDeferredPlaceholders(requestHook);
|
|
116
116
|
const hasDeferred = expectedDeferred.length > 0;
|
|
@@ -123,6 +123,7 @@ function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, rea
|
|
|
123
123
|
realChainId,
|
|
124
124
|
expirationTimestamp,
|
|
125
125
|
expectedDelegate,
|
|
126
|
+
envConfig,
|
|
126
127
|
};
|
|
127
128
|
// Collected `message.delegate` values across all delegated actions in this
|
|
128
129
|
// hook — checked for cross-action consistency after the loop.
|
|
@@ -177,7 +178,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
|
|
|
177
178
|
violations.push(...presenceErrors);
|
|
178
179
|
return violations;
|
|
179
180
|
}
|
|
180
|
-
violations.push(...validateSign712Domain(data, actionPath, ctx.realChainId), ...validateSign712Delegator(data, actionPath, ctx.realChainId, ctx.hookFrom, "hook.from"));
|
|
181
|
+
violations.push(...validateSign712Domain(data, actionPath, ctx.realChainId, ctx.envConfig), ...validateSign712Delegator(data, actionPath, ctx.realChainId, ctx.hookFrom, "hook.from"));
|
|
181
182
|
// Scoped delegate check: applies only when the request explicitly
|
|
182
183
|
// pinned a delegate via `trade.srcAllowedSender` on a matching-chain
|
|
183
184
|
// trade (caller set `ctx.expectedDelegate`). Otherwise the API
|
|
@@ -207,7 +208,7 @@ function validateDelegatedAction(action, actionPath, ctx, observedDelegates) {
|
|
|
207
208
|
}
|
|
208
209
|
const caveats = (data.message.caveats ?? []);
|
|
209
210
|
const txCalls = action.details?.transactionCalls ?? [];
|
|
210
|
-
violations.push(...validateSign712Caveats(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp));
|
|
211
|
+
violations.push(...validateSign712Caveats(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp, ctx.envConfig));
|
|
211
212
|
if (ctx.expectedType === EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
212
213
|
const withPlaceholdersData = data;
|
|
213
214
|
const actualPlaceholders = withPlaceholdersData.placeholders ?? [];
|
|
@@ -346,7 +347,7 @@ function validateHookActionCalldata(hookPayload, requestHook, basePath, mode, re
|
|
|
346
347
|
// `Sign712MetaMaskCaveats(WithPlaceholders)` actions — otherwise the user
|
|
347
348
|
// would sign a delegation that wraps a tx targeting / valued differently than
|
|
348
349
|
// the echoed hook fields.
|
|
349
|
-
function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
|
|
350
|
+
function validateHookActionTransactionCallsMatch(hookPayload, requestHook, basePath, mode, responseTrades, realChainId) {
|
|
350
351
|
const violations = [];
|
|
351
352
|
const hook = hookPayload.hook;
|
|
352
353
|
if (!isRequestHookV2(hook))
|
|
@@ -354,40 +355,45 @@ function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
|
|
|
354
355
|
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
355
356
|
const action = hookPayload.requiredActions[i];
|
|
356
357
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
357
|
-
|
|
358
|
+
// Safe skip: Delegate-bearing actions carry EIP-7702 authorization,
|
|
359
|
+
// not the hook transaction.
|
|
360
|
+
if (action.actions.includes(EvmActionOperation.Delegate))
|
|
358
361
|
continue;
|
|
359
|
-
|
|
360
|
-
// `validateSign712TransactionCalls`.
|
|
361
|
-
const tx = action.details?.transactionCalls?.[0];
|
|
362
|
+
const tx = extractEvmHookActionTransaction(action);
|
|
362
363
|
if (!tx)
|
|
363
364
|
continue;
|
|
364
|
-
violations.push(...compareTransactionCallToHook(tx, hook, actionPath));
|
|
365
|
+
violations.push(...compareTransactionCallToHook(tx.triplet, hook, requestHook, actionPath, tx.path, mode, responseTrades, realChainId));
|
|
365
366
|
}
|
|
366
367
|
return violations;
|
|
367
368
|
}
|
|
368
|
-
function compareTransactionCallToHook(tx, hook, actionPath) {
|
|
369
|
+
function compareTransactionCallToHook(tx, hook, requestHook, actionPath, txPath, mode, responseTrades, realChainId) {
|
|
369
370
|
const violations = [];
|
|
370
|
-
if (hook.to !== undefined && tx.to
|
|
371
|
+
if (hook.to !== undefined && !addressEquals(realChainId, tx.to, hook.to)) {
|
|
371
372
|
violations.push({
|
|
372
373
|
code: ViolationCode.HookActionTransactionToMismatch,
|
|
373
|
-
message: "
|
|
374
|
-
path: `${actionPath}.
|
|
374
|
+
message: "hook action transaction target must equal hook.to",
|
|
375
|
+
path: `${actionPath}.${txPath}.to`,
|
|
375
376
|
expected: hook.to,
|
|
376
377
|
actual: tx.to,
|
|
377
378
|
});
|
|
378
379
|
}
|
|
379
|
-
const hookValue = hook
|
|
380
|
+
const hookValue = resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId);
|
|
380
381
|
if (!evmValuesEqual(tx.value, hookValue)) {
|
|
381
382
|
violations.push({
|
|
382
383
|
code: ViolationCode.HookActionTransactionValueMismatch,
|
|
383
|
-
message: "
|
|
384
|
-
path: `${actionPath}.
|
|
384
|
+
message: "hook action transaction value must equal hook.value",
|
|
385
|
+
path: `${actionPath}.${txPath}.value`,
|
|
385
386
|
expected: hookValue,
|
|
386
387
|
actual: tx.value,
|
|
387
388
|
});
|
|
388
389
|
}
|
|
389
390
|
return violations;
|
|
390
391
|
}
|
|
392
|
+
function resolveExpectedHookValue(hook, requestHook, mode, responseTrades, realChainId) {
|
|
393
|
+
if (requestHook?.value === undefined)
|
|
394
|
+
return hook.value ?? "0";
|
|
395
|
+
return resolveEagerValuePlaceholders(requestHook.value, realChainId, requestHook.placeHolders, responseTrades, mode).resolved;
|
|
396
|
+
}
|
|
391
397
|
// Returns true if two EVM-value strings are byte-identical or if both parse as
|
|
392
398
|
// BigInt and represent the same number (e.g. `"0x100"` vs `"256"`). Returns
|
|
393
399
|
// false otherwise.
|
|
@@ -405,7 +411,7 @@ function evmValuesEqual(a, b) {
|
|
|
405
411
|
// gas-compensation transfer — same rules as `compensation-hook.ts` applies to
|
|
406
412
|
// `hook.{to, data, value}`, but here applied to `transactionCalls[0]` so the
|
|
407
413
|
// user does not sign a delegation around a different (malicious) tx.
|
|
408
|
-
function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId) {
|
|
414
|
+
function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId, envConfig) {
|
|
409
415
|
const allGroups = extractGasCompensationGroups(request);
|
|
410
416
|
const matchingGroups = allGroups.filter(g => g.realChainId === realChainId
|
|
411
417
|
&& addressEquals(realChainId, g.sender, hookPayload.hook.from));
|
|
@@ -427,9 +433,10 @@ function validateCompensationHookTransactionCall(hookPayload, basePath, request,
|
|
|
427
433
|
continue;
|
|
428
434
|
violations.push(...validateEvmGasCompensationTx(tx, matchingGroups, realChainId, `${actionPath}.details.transactionCalls[0]`, {
|
|
429
435
|
toMismatch: ViolationCode.CompensationHookEvmToMismatch,
|
|
436
|
+
recipientMismatch: ViolationCode.CompensationHookEvmRecipientMismatch,
|
|
430
437
|
dataInvalid: ViolationCode.CompensationHookEvmDataInvalid,
|
|
431
438
|
valueInvalid: ViolationCode.CompensationHookEvmValueInvalid,
|
|
432
|
-
}));
|
|
439
|
+
}, envConfig.compensationDelegateContracts));
|
|
433
440
|
}
|
|
434
441
|
return violations;
|
|
435
442
|
}
|
|
@@ -471,4 +478,32 @@ function extractEvmHookActionCalldata(action) {
|
|
|
471
478
|
}
|
|
472
479
|
return undefined;
|
|
473
480
|
}
|
|
481
|
+
function extractEvmHookActionTransaction(action) {
|
|
482
|
+
if (action.type === EvmActionKind.Transaction) {
|
|
483
|
+
const data = action.data;
|
|
484
|
+
if (!isTransactionTriplet(data))
|
|
485
|
+
return undefined;
|
|
486
|
+
return { triplet: data, path: "data" };
|
|
487
|
+
}
|
|
488
|
+
if (action.type === EvmActionKind.ProvidePlaceholders) {
|
|
489
|
+
const data = action.data;
|
|
490
|
+
if (!isTransactionTriplet(data?.transaction))
|
|
491
|
+
return undefined;
|
|
492
|
+
return { triplet: data.transaction, path: "data.transaction" };
|
|
493
|
+
}
|
|
494
|
+
if (action.type === EvmActionKind.Sign712MetaMaskCaveats
|
|
495
|
+
|| action.type === EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
496
|
+
const tx = action.details?.transactionCalls?.[0];
|
|
497
|
+
if (!isTransactionTriplet(tx))
|
|
498
|
+
return undefined;
|
|
499
|
+
return { triplet: tx, path: "details.transactionCalls[0]" };
|
|
500
|
+
}
|
|
501
|
+
return undefined;
|
|
502
|
+
}
|
|
503
|
+
function isTransactionTriplet(value) {
|
|
504
|
+
const maybe = value;
|
|
505
|
+
return typeof maybe?.to === "string"
|
|
506
|
+
&& typeof maybe.data === "string"
|
|
507
|
+
&& typeof maybe.value === "string";
|
|
508
|
+
}
|
|
474
509
|
//# sourceMappingURL=evm-op-hook.js.map
|