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