@debridge-finance/borderless-validation-sdk 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +164 -0
- package/dist/cjs/helpers/address.js +53 -18
- package/dist/cjs/helpers/address.js.map +1 -1
- package/dist/cjs/helpers/evm-action.js +3 -3
- package/dist/cjs/helpers/evm-action.js.map +1 -1
- package/dist/cjs/helpers/evm-dln-hook-pack.js +87 -0
- package/dist/cjs/helpers/evm-dln-hook-pack.js.map +1 -0
- package/dist/cjs/helpers/evm-gas-compensation-tx.js +102 -0
- package/dist/cjs/helpers/evm-gas-compensation-tx.js.map +1 -0
- package/dist/cjs/helpers/evm-intent-id.js +27 -13
- package/dist/cjs/helpers/evm-intent-id.js.map +1 -1
- package/dist/cjs/helpers/evm-trade-amounts.js +36 -1
- package/dist/cjs/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/cjs/helpers/gas-compensation.js +36 -0
- package/dist/cjs/helpers/gas-compensation.js.map +1 -0
- package/dist/cjs/helpers/hex.js +24 -0
- package/dist/cjs/helpers/hex.js.map +1 -0
- package/dist/cjs/helpers/placeholder.js +174 -0
- package/dist/cjs/helpers/placeholder.js.map +1 -0
- package/dist/cjs/helpers/sets.js +13 -0
- package/dist/cjs/helpers/sets.js.map +1 -0
- package/dist/cjs/types/enums.js +32 -2
- package/dist/cjs/types/enums.js.map +1 -1
- package/dist/cjs/types/request.js +36 -3
- package/dist/cjs/types/request.js.map +1 -1
- package/dist/cjs/types/response.js +125 -5
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +81 -10
- package/dist/cjs/types/validation.js.map +1 -1
- package/dist/cjs/validations/compensation-hook.js +203 -0
- package/dist/cjs/validations/compensation-hook.js.map +1 -0
- package/dist/cjs/validations/evm-caveats.js +4 -14
- package/dist/cjs/validations/evm-caveats.js.map +1 -1
- package/dist/cjs/validations/evm-op-budget.js +13 -10
- package/dist/cjs/validations/evm-op-budget.js.map +1 -1
- package/dist/cjs/validations/evm-op-hook.js +410 -3
- package/dist/cjs/validations/evm-op-hook.js.map +1 -1
- package/dist/cjs/validations/evm-op-wrap.js +10 -7
- package/dist/cjs/validations/evm-op-wrap.js.map +1 -1
- package/dist/cjs/validations/evm-required-actions.js +7 -9
- package/dist/cjs/validations/evm-required-actions.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-metamask.js +17 -94
- package/dist/cjs/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/cjs/validations/evm-sign712-shared.js +116 -0
- package/dist/cjs/validations/evm-sign712-shared.js.map +1 -0
- package/dist/cjs/validations/evm-sign7702.js +34 -22
- package/dist/cjs/validations/evm-sign7702.js.map +1 -1
- package/dist/cjs/validations/hooks-common.js +252 -37
- package/dist/cjs/validations/hooks-common.js.map +1 -1
- package/dist/cjs/validations/intent-destinations.js +197 -0
- package/dist/cjs/validations/intent-destinations.js.map +1 -0
- package/dist/cjs/validations/intent-tokens.js +347 -0
- package/dist/cjs/validations/intent-tokens.js.map +1 -0
- package/dist/cjs/validations/intent.js +288 -0
- package/dist/cjs/validations/intent.js.map +1 -0
- package/dist/cjs/validations/required-actions.js +7 -7
- package/dist/cjs/validations/required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-hook.js +33 -22
- package/dist/cjs/validations/solana-hook.js.map +1 -1
- package/dist/cjs/validations/solana-op-budget.js +56 -18
- package/dist/cjs/validations/solana-op-budget.js.map +1 -1
- package/dist/cjs/validations/solana-op-wrap.js +46 -13
- package/dist/cjs/validations/solana-op-wrap.js.map +1 -1
- package/dist/cjs/validations/solana-required-actions.js +3 -3
- package/dist/cjs/validations/solana-required-actions.js.map +1 -1
- package/dist/cjs/validations/solana-transaction.js +5 -5
- package/dist/cjs/validations/solana-transaction.js.map +1 -1
- package/dist/cjs/validations/trade-grouping.js +139 -1
- package/dist/cjs/validations/trade-grouping.js.map +1 -1
- package/dist/cjs/validations/trades.js +168 -40
- package/dist/cjs/validations/trades.js.map +1 -1
- package/dist/cjs/validator.js +11 -16
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/environment-config.js +47 -28
- package/dist/cjs/whitelists/environment-config.js.map +1 -1
- package/dist/cjs/whitelists/evm/caveat-enforcers.js +21 -5
- package/dist/cjs/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/cjs/whitelists/evm/delegation-manager.js +7 -2
- package/dist/cjs/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/cjs/whitelists/evm/eip7702-delegation.js +7 -2
- package/dist/cjs/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/cjs/whitelists/evm/index.js +14 -1
- package/dist/cjs/whitelists/evm/index.js.map +1 -1
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js +16 -0
- package/dist/cjs/whitelists/evm/metamask-delegation-chains.js.map +1 -0
- package/dist/cjs/whitelists/evm/permit2.js +16 -12
- package/dist/cjs/whitelists/evm/permit2.js.map +1 -1
- package/dist/cjs/whitelists/evm/weth.js +16 -5
- package/dist/cjs/whitelists/evm/weth.js.map +1 -1
- package/dist/cjs/whitelists/solana/intent-signature.js +0 -1
- package/dist/cjs/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/cjs/whitelists/subscription-to-chain-id.js +10 -0
- package/dist/cjs/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/cjs/whitelists/types.js +13 -3
- package/dist/cjs/whitelists/types.js.map +1 -1
- package/dist/esm/helpers/address.js +48 -17
- package/dist/esm/helpers/address.js.map +1 -1
- package/dist/esm/helpers/evm-action.js +3 -3
- package/dist/esm/helpers/evm-action.js.map +1 -1
- package/dist/esm/helpers/evm-dln-hook-pack.js +82 -0
- package/dist/esm/helpers/evm-dln-hook-pack.js.map +1 -0
- package/dist/esm/helpers/evm-gas-compensation-tx.js +99 -0
- package/dist/esm/helpers/evm-gas-compensation-tx.js.map +1 -0
- package/dist/esm/helpers/evm-intent-id.js +27 -13
- package/dist/esm/helpers/evm-intent-id.js.map +1 -1
- package/dist/esm/helpers/evm-trade-amounts.js +36 -1
- package/dist/esm/helpers/evm-trade-amounts.js.map +1 -1
- package/dist/esm/helpers/gas-compensation.js +33 -0
- package/dist/esm/helpers/gas-compensation.js.map +1 -0
- package/dist/esm/helpers/hex.js +20 -0
- package/dist/esm/helpers/hex.js.map +1 -0
- package/dist/esm/helpers/placeholder.js +168 -0
- package/dist/esm/helpers/placeholder.js.map +1 -0
- package/dist/esm/helpers/sets.js +10 -0
- package/dist/esm/helpers/sets.js.map +1 -0
- package/dist/esm/types/enums.js +31 -1
- package/dist/esm/types/enums.js.map +1 -1
- package/dist/esm/types/request.js +37 -4
- package/dist/esm/types/request.js.map +1 -1
- package/dist/esm/types/response.js +124 -4
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +81 -10
- package/dist/esm/types/validation.js.map +1 -1
- package/dist/esm/validations/compensation-hook.js +200 -0
- package/dist/esm/validations/compensation-hook.js.map +1 -0
- package/dist/esm/validations/evm-caveats.js +4 -14
- package/dist/esm/validations/evm-caveats.js.map +1 -1
- package/dist/esm/validations/evm-op-budget.js +13 -10
- package/dist/esm/validations/evm-op-budget.js.map +1 -1
- package/dist/esm/validations/evm-op-hook.js +409 -2
- package/dist/esm/validations/evm-op-hook.js.map +1 -1
- package/dist/esm/validations/evm-op-wrap.js +10 -7
- package/dist/esm/validations/evm-op-wrap.js.map +1 -1
- package/dist/esm/validations/evm-required-actions.js +7 -9
- package/dist/esm/validations/evm-required-actions.js.map +1 -1
- package/dist/esm/validations/evm-sign712-metamask.js +17 -94
- package/dist/esm/validations/evm-sign712-metamask.js.map +1 -1
- package/dist/esm/validations/evm-sign712-shared.js +110 -0
- package/dist/esm/validations/evm-sign712-shared.js.map +1 -0
- package/dist/esm/validations/evm-sign7702.js +33 -22
- package/dist/esm/validations/evm-sign7702.js.map +1 -1
- package/dist/esm/validations/hooks-common.js +251 -38
- package/dist/esm/validations/hooks-common.js.map +1 -1
- package/dist/esm/validations/intent-destinations.js +194 -0
- package/dist/esm/validations/intent-destinations.js.map +1 -0
- package/dist/esm/validations/intent-tokens.js +344 -0
- package/dist/esm/validations/intent-tokens.js.map +1 -0
- package/dist/esm/validations/intent.js +285 -0
- package/dist/esm/validations/intent.js.map +1 -0
- package/dist/esm/validations/required-actions.js +7 -7
- package/dist/esm/validations/required-actions.js.map +1 -1
- package/dist/esm/validations/solana-hook.js +35 -24
- package/dist/esm/validations/solana-hook.js.map +1 -1
- package/dist/esm/validations/solana-op-budget.js +56 -18
- package/dist/esm/validations/solana-op-budget.js.map +1 -1
- package/dist/esm/validations/solana-op-wrap.js +47 -14
- package/dist/esm/validations/solana-op-wrap.js.map +1 -1
- package/dist/esm/validations/solana-required-actions.js +3 -3
- package/dist/esm/validations/solana-required-actions.js.map +1 -1
- package/dist/esm/validations/solana-transaction.js +7 -7
- package/dist/esm/validations/solana-transaction.js.map +1 -1
- package/dist/esm/validations/trade-grouping.js +139 -1
- package/dist/esm/validations/trade-grouping.js.map +1 -1
- package/dist/esm/validations/trades.js +169 -41
- package/dist/esm/validations/trades.js.map +1 -1
- package/dist/esm/validator.js +11 -16
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/environment-config.js +47 -28
- package/dist/esm/whitelists/environment-config.js.map +1 -1
- package/dist/esm/whitelists/evm/caveat-enforcers.js +20 -4
- package/dist/esm/whitelists/evm/caveat-enforcers.js.map +1 -1
- package/dist/esm/whitelists/evm/delegation-manager.js +6 -1
- package/dist/esm/whitelists/evm/delegation-manager.js.map +1 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js +6 -1
- package/dist/esm/whitelists/evm/eip7702-delegation.js.map +1 -1
- package/dist/esm/whitelists/evm/index.js +4 -4
- package/dist/esm/whitelists/evm/index.js.map +1 -1
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js +13 -0
- package/dist/esm/whitelists/evm/metamask-delegation-chains.js.map +1 -0
- package/dist/esm/whitelists/evm/permit2.js +9 -5
- package/dist/esm/whitelists/evm/permit2.js.map +1 -1
- package/dist/esm/whitelists/evm/weth.js +16 -5
- package/dist/esm/whitelists/evm/weth.js.map +1 -1
- package/dist/esm/whitelists/solana/intent-signature.js +0 -1
- package/dist/esm/whitelists/solana/intent-signature.js.map +1 -1
- package/dist/esm/whitelists/subscription-to-chain-id.js +9 -0
- package/dist/esm/whitelists/subscription-to-chain-id.js.map +1 -1
- package/dist/esm/whitelists/types.js +14 -5
- package/dist/esm/whitelists/types.js.map +1 -1
- package/dist/types/helpers/address.d.ts +7 -7
- package/dist/types/helpers/address.d.ts.map +1 -1
- package/dist/types/helpers/evm-dln-hook-pack.d.ts +19 -0
- package/dist/types/helpers/evm-dln-hook-pack.d.ts.map +1 -0
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts +13 -0
- package/dist/types/helpers/evm-gas-compensation-tx.d.ts.map +1 -0
- package/dist/types/helpers/evm-intent-id.d.ts.map +1 -1
- package/dist/types/helpers/evm-trade-amounts.d.ts +2 -2
- package/dist/types/helpers/evm-trade-amounts.d.ts.map +1 -1
- package/dist/types/helpers/gas-compensation.d.ts +10 -0
- package/dist/types/helpers/gas-compensation.d.ts.map +1 -0
- package/dist/types/helpers/hex.d.ts +3 -0
- package/dist/types/helpers/hex.d.ts.map +1 -0
- package/dist/types/helpers/placeholder.d.ts +41 -0
- package/dist/types/helpers/placeholder.d.ts.map +1 -0
- package/dist/types/helpers/sets.d.ts +2 -0
- package/dist/types/helpers/sets.d.ts.map +1 -0
- package/dist/types/types/enums.d.ts +24 -1
- package/dist/types/types/enums.d.ts.map +1 -1
- package/dist/types/types/request.d.ts +21 -11
- package/dist/types/types/request.d.ts.map +1 -1
- package/dist/types/types/response.d.ts +1015 -17
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +73 -11
- package/dist/types/types/validation.d.ts.map +1 -1
- package/dist/types/validations/compensation-hook.d.ts +3 -0
- package/dist/types/validations/compensation-hook.d.ts.map +1 -0
- package/dist/types/validations/evm-caveats.d.ts.map +1 -1
- package/dist/types/validations/evm-op-budget.d.ts +2 -2
- package/dist/types/validations/evm-op-budget.d.ts.map +1 -1
- package/dist/types/validations/evm-op-hook.d.ts +4 -2
- package/dist/types/validations/evm-op-hook.d.ts.map +1 -1
- package/dist/types/validations/evm-op-wrap.d.ts +2 -2
- package/dist/types/validations/evm-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/evm-required-actions.d.ts +2 -2
- package/dist/types/validations/evm-required-actions.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-metamask.d.ts.map +1 -1
- package/dist/types/validations/evm-sign712-shared.d.ts +7 -0
- package/dist/types/validations/evm-sign712-shared.d.ts.map +1 -0
- package/dist/types/validations/evm-sign7702.d.ts +2 -1
- package/dist/types/validations/evm-sign7702.d.ts.map +1 -1
- package/dist/types/validations/hooks-common.d.ts +1 -0
- package/dist/types/validations/hooks-common.d.ts.map +1 -1
- package/dist/types/validations/intent-destinations.d.ts +4 -0
- package/dist/types/validations/intent-destinations.d.ts.map +1 -0
- package/dist/types/validations/intent-tokens.d.ts +4 -0
- package/dist/types/validations/intent-tokens.d.ts.map +1 -0
- package/dist/types/validations/intent.d.ts +5 -0
- package/dist/types/validations/intent.d.ts.map +1 -0
- package/dist/types/validations/required-actions.d.ts +2 -1
- package/dist/types/validations/required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-hook.d.ts +4 -2
- package/dist/types/validations/solana-hook.d.ts.map +1 -1
- package/dist/types/validations/solana-op-budget.d.ts +2 -2
- package/dist/types/validations/solana-op-budget.d.ts.map +1 -1
- package/dist/types/validations/solana-op-wrap.d.ts +2 -2
- package/dist/types/validations/solana-op-wrap.d.ts.map +1 -1
- package/dist/types/validations/solana-required-actions.d.ts +2 -2
- package/dist/types/validations/solana-required-actions.d.ts.map +1 -1
- package/dist/types/validations/solana-transaction.d.ts +3 -3
- package/dist/types/validations/solana-transaction.d.ts.map +1 -1
- package/dist/types/validations/trade-grouping.d.ts +6 -2
- package/dist/types/validations/trade-grouping.d.ts.map +1 -1
- package/dist/types/validations/trades.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/evm/caveat-enforcers.d.ts +8 -0
- package/dist/types/whitelists/evm/caveat-enforcers.d.ts.map +1 -1
- package/dist/types/whitelists/evm/delegation-manager.d.ts +2 -0
- package/dist/types/whitelists/evm/delegation-manager.d.ts.map +1 -1
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts +2 -0
- package/dist/types/whitelists/evm/eip7702-delegation.d.ts.map +1 -1
- package/dist/types/whitelists/evm/index.d.ts +4 -4
- package/dist/types/whitelists/evm/index.d.ts.map +1 -1
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts +3 -0
- package/dist/types/whitelists/evm/metamask-delegation-chains.d.ts.map +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts +1 -0
- package/dist/types/whitelists/evm/permit2.d.ts.map +1 -1
- package/dist/types/whitelists/evm/weth.d.ts.map +1 -1
- package/dist/types/whitelists/solana/intent-signature.d.ts.map +1 -1
- package/dist/types/whitelists/subscription-to-chain-id.d.ts +1 -0
- package/dist/types/whitelists/subscription-to-chain-id.d.ts.map +1 -1
- package/dist/types/whitelists/types.d.ts +1 -1
- package/dist/types/whitelists/types.d.ts.map +1 -1
- package/package.json +4 -3
- package/dist/cjs/helpers/constants.js +0 -6
- package/dist/cjs/helpers/constants.js.map +0 -1
- package/dist/cjs/validations/evm-op-gas-compensation.js +0 -152
- package/dist/cjs/validations/evm-op-gas-compensation.js.map +0 -1
- package/dist/esm/helpers/constants.js +0 -3
- package/dist/esm/helpers/constants.js.map +0 -1
- package/dist/esm/validations/evm-op-gas-compensation.js +0 -149
- package/dist/esm/validations/evm-op-gas-compensation.js.map +0 -1
- package/dist/types/helpers/constants.d.ts +0 -2
- package/dist/types/helpers/constants.d.ts.map +0 -1
- package/dist/types/validations/evm-op-gas-compensation.d.ts +0 -3
- package/dist/types/validations/evm-op-gas-compensation.d.ts.map +0 -1
|
@@ -45,21 +45,11 @@ function classifyCaveats(caveats, actionId, actionPath, realChainId, violations)
|
|
|
45
45
|
// CRITICAL: IdEnforcer ID must equal Number(actionId)
|
|
46
46
|
validateIdEnforcerValue(caveat, actionId, path, violations);
|
|
47
47
|
}
|
|
48
|
-
// CRITICAL: exactly one TimestampEnforcer per action
|
|
49
48
|
if (kind === CaveatKind.Timestamp) {
|
|
50
49
|
result.timestampCount++;
|
|
51
50
|
if (result.timestampCount === 1) {
|
|
52
51
|
result.firstTimestamp = { caveat, index: i };
|
|
53
52
|
}
|
|
54
|
-
else if (result.timestampCount === 2) {
|
|
55
|
-
violations.push({
|
|
56
|
-
code: types_1.ViolationCode.Sign712MetaMaskDuplicateTimestampEnforcerCaveat,
|
|
57
|
-
message: `Sign712MetaMask must have exactly one TimestampEnforcer`,
|
|
58
|
-
path: `${path}.enforcer`,
|
|
59
|
-
expected: 1,
|
|
60
|
-
actual: result.timestampCount,
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
53
|
}
|
|
64
54
|
}
|
|
65
55
|
return result;
|
|
@@ -111,13 +101,13 @@ function validateExactExecutionTerms(caveat, txCall, caveatIndex, actionPath, vi
|
|
|
111
101
|
try {
|
|
112
102
|
decoded = (0, caveat_decoder_1.decodeExactExecution)(caveat.terms);
|
|
113
103
|
}
|
|
114
|
-
catch (
|
|
104
|
+
catch (error) {
|
|
115
105
|
violations.push({
|
|
116
106
|
code: types_1.ViolationCode.Sign712MetaMaskCaveatDecodeError,
|
|
117
107
|
message: `failed to decode ExactExecution caveat terms`,
|
|
118
108
|
path: `${caveatPath}.terms`,
|
|
119
109
|
actual: caveat.terms,
|
|
120
|
-
details:
|
|
110
|
+
details: error,
|
|
121
111
|
});
|
|
122
112
|
return;
|
|
123
113
|
}
|
|
@@ -222,13 +212,13 @@ function validateTimestampEnforcerValue(caveat, expirationTimestamp, caveatIndex
|
|
|
222
212
|
});
|
|
223
213
|
}
|
|
224
214
|
}
|
|
225
|
-
catch (
|
|
215
|
+
catch (error) {
|
|
226
216
|
violations.push({
|
|
227
217
|
code: types_1.ViolationCode.Sign712MetaMaskCaveatDecodeError,
|
|
228
218
|
message: `failed to decode TimestampEnforcer caveat terms`,
|
|
229
219
|
path: `${caveatPath}.terms`,
|
|
230
220
|
actual: caveat.terms,
|
|
231
|
-
details:
|
|
221
|
+
details: error,
|
|
232
222
|
});
|
|
233
223
|
}
|
|
234
224
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-caveats.js","sourceRoot":"","sources":["../../../src/validations/evm-caveats.ts"],"names":[],"mappings":";;;AAgDA,
|
|
1
|
+
{"version":3,"file":"evm-caveats.js","sourceRoot":"","sources":["../../../src/validations/evm-caveats.ts"],"names":[],"mappings":";;;AAgDA,0CA6CC;AAuBD,wEAsBC;AAGD,sEAiBC;AAuID,wEA8BC;AAnUD,oCAIkB;AAClB,+CAAoD;AACpD,2CAK2B;AAC3B,8DAKmC;AAuBnC,IAAY,UAMX;AAND,WAAY,UAAU;IAClB,iDAAO,CAAA;IACP,qDAAS,CAAA;IACT,+DAAc,CAAA;IACd,uDAAU,CAAA;IACV,qDAAS,CAAA;AACb,CAAC,EANW,UAAU,0BAAV,UAAU,QAMrB;AAED,SAAgB,eAAe,CAC3B,OAAiB,EACjB,QAAgB,EAChB,UAAkB,EAClB,WAAoB,EACpB,UAAuB;IAEvB,MAAM,MAAM,GAAsB;QAC9B,aAAa,EAAE,KAAK;QACpB,cAAc,EAAE,CAAC;KACpB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,GAAG,UAAU,yBAAyB,CAAC,GAAG,CAAC;QAExD,MAAM,IAAI,GAAG,oBAAoB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAEvD,0EAA0E;QAC1E,IAAI,IAAI,KAAK,UAAU,CAAC,OAAO,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,2CAA2C;gBAC/D,OAAO,EAAE,yDAAyD;gBAClE,IAAI,EAAE,GAAG,IAAI,WAAW;gBACxB,MAAM,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC,CAAC;YACH,SAAS;QACb,CAAC;QAED,IAAI,IAAI,KAAK,UAAU,CAAC,SAAS;YAAE,MAAM,CAAC,SAAS,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAC3E,IAAI,IAAI,KAAK,UAAU,CAAC,cAAc;YAAE,MAAM,CAAC,cAAc,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACrF,IAAI,IAAI,KAAK,UAAU,CAAC,UAAU,EAAE,CAAC;YACjC,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC;YAC5B,sDAAsD;YACtD,uBAAuB,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,CAAC,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,MAAM,CAAC,cAAc,KAAK,CAAC,EAAE,CAAC;gBAC9B,MAAM,CAAC,cAAc,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;YACjD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,SAAS,oBAAoB,CACzB,MAAc,EACd,WAAoB;IAEpB,IAAI,IAAA,qBAAa,EAAC,wCAAkC,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC/E,OAAO,UAAU,CAAC,SAAS,CAAC;IAEhC,IAAI,IAAA,qBAAa,EAAC,8CAAwC,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;QACrF,OAAO,UAAU,CAAC,cAAc,CAAC;IAErC,IAAI,IAAA,qBAAa,EAAC,2BAAqB,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;QAClE,OAAO,UAAU,CAAC,UAAU,CAAC;IAEjC,IAAI,IAAA,qBAAa,EAAC,kCAA4B,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC;QACzE,OAAO,UAAU,CAAC,SAAS,CAAC;IAEhC,OAAO,UAAU,CAAC,OAAO,CAAC;AAC9B,CAAC;AAED,mEAAmE;AACnE,+DAA+D;AAC/D,SAAgB,8BAA8B,CAC1C,UAA6B,EAC7B,OAAiB,EACjB,UAAkB;IAElB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;QAChD,OAAO,CAAC;gBACJ,IAAI,EAAE,qBAAa,CAAC,0CAA0C;gBAC9D,OAAO,EAAE,iFAAiF;gBAC1F,IAAI,EAAE,GAAG,UAAU,uBAAuB;aAC7C,CAAC,CAAC;IACP,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;QACnD,OAAO,CAAC;gBACJ,IAAI,EAAE,qBAAa,CAAC,+CAA+C;gBACnE,OAAO,EAAE,uFAAuF;gBAChG,IAAI,EAAE,GAAG,UAAU,uBAAuB;gBAC1C,QAAQ,EAAE,OAAO,CAAC,MAAM;gBACxB,MAAM,EAAE,CAAC;aACZ,CAAC,CAAC;IACP,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC;AAED,+DAA+D;AAC/D,SAAgB,6BAA6B,CACzC,UAA6B,EAC7B,OAAiB,EACjB,UAAkB,EAClB,UAAuB;IAEvB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;QAC/C,2BAA2B,CACvB,UAAU,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EACvC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CACrD,CAAC;IACN,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QACzD,gCAAgC,CAC5B,UAAU,CAAC,cAAc,CAAC,MAAM,EAAE,OAAO,EACzC,UAAU,CAAC,cAAc,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAC1D,CAAC;IACN,CAAC;AACL,CAAC;AAED,SAAS,2BAA2B,CAChC,MAAc,EACd,MAAc,EACd,WAAmB,EACnB,UAAkB,EAClB,UAAuB;IAEvB,MAAM,UAAU,GAAG,GAAG,UAAU,yBAAyB,WAAW,GAAG,CAAC;IAExE,IAAI,OAAyB,CAAC;IAC9B,IAAI,CAAC;QACD,OAAO,GAAG,IAAA,qCAAoB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,8CAA8C;YACvD,IAAI,EAAE,GAAG,UAAU,QAAQ;YAC3B,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;QACH,OAAO;IACX,CAAC;IAED,IAAI,CAAC,sBAAsB,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC;QAC3C,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,qCAAqC;YACzD,OAAO,EAAE,8DAA8D;YACvE,IAAI,EAAE,GAAG,UAAU,QAAQ;YAC3B,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,OAAO;SAClB,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,SAAS,gCAAgC,CACrC,MAAc,EACd,OAAiB,EACjB,WAAmB,EACnB,UAAkB,EAClB,UAAuB;IAEvB,MAAM,UAAU,GAAG,GAAG,UAAU,yBAAyB,WAAW,GAAG,CAAC;IAExE,IAAI,OAA2B,CAAC;IAChC,IAAI,CAAC;QACD,OAAO,GAAG,IAAA,0CAAyB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtD,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACT,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,mDAAmD;YAC5D,IAAI,EAAE,GAAG,UAAU,QAAQ;YAC3B,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,OAAO,EAAE,CAAC;SACb,CAAC,CAAC;QACH,OAAO;IACX,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC;QACpC,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,0CAA0C;YAC9D,OAAO,EAAE,+BAA+B,OAAO,CAAC,MAAM,wCAAwC,OAAO,CAAC,MAAM,EAAE;YAC9G,IAAI,EAAE,GAAG,UAAU,QAAQ;YAC3B,QAAQ,EAAE,OAAO,CAAC,MAAM;YACxB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;QACH,OAAO;IACX,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClD,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,0CAA0C;gBAC9D,OAAO,EAAE,oCAAoC,CAAC,mCAAmC,CAAC,GAAG;gBACrF,IAAI,EAAE,GAAG,UAAU,QAAQ;gBAC3B,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;gBACpB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;aACrB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAC3B,OAAyB,EACzB,MAAc;IAEd,OAAO,CACH,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,WAAW,EAAE;QACpD,OAAO,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK;QAC9B,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAC3D,CAAC;AACN,CAAC;AAED,yFAAyF;AACzF,yEAAyE;AACzE,gEAAgE;AAChE,SAAS,uBAAuB,CAC5B,MAAc,EACd,QAAgB,EAChB,UAAkB,EAClB,UAAuB;IAEvB,IAAI,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;QAE9C,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC3B,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,sCAAsC;gBAC1D,OAAO,EAAE,uCAAuC;gBAChD,IAAI,EAAE,GAAG,UAAU,QAAQ;gBAC3B,QAAQ,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE;gBACtD,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE,EAAE;aAC5C,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACL,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,sCAAsC;YAC1D,OAAO,EAAE,+CAA+C;YACxD,IAAI,EAAE,GAAG,UAAU,QAAQ;YAC3B,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,MAAM,CAAC,KAAK;SACvB,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAgB;IACtC,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5B,CAAC;AAED,mEAAmE;AACnE,SAAgB,8BAA8B,CAC1C,MAAc,EACd,mBAA2B,EAC3B,WAAmB,EACnB,UAAkB,EAClB,UAAuB;IAEvB,MAAM,UAAU,GAAG,GAAG,UAAU,yBAAyB,WAAW,GAAG,CAAC;IAExE,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAA,wCAAuB,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAEtD,IAAI,OAAO,CAAC,eAAe,KAAK,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC;YAC1D,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,qBAAa,CAAC,+CAA+C;gBACnE,OAAO,EAAE,8EAA8E;gBACvF,IAAI,EAAE,GAAG,UAAU,QAAQ;gBAC3B,QAAQ,EAAE,mBAAmB;gBAC7B,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC;aAC1C,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,qBAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,iDAAiD;YAC1D,IAAI,EAAE,GAAG,UAAU,QAAQ;YAC3B,MAAM,EAAE,MAAM,CAAC,KAAK;YACpB,OAAO,EAAE,KAAK;SACjB,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
|
|
@@ -9,7 +9,7 @@ const evm_token_1 = require("../helpers/evm-token");
|
|
|
9
9
|
const address_1 = require("../helpers/address");
|
|
10
10
|
const evm_trade_amounts_1 = require("../helpers/evm-trade-amounts");
|
|
11
11
|
const evm_action_1 = require("../helpers/evm-action");
|
|
12
|
-
function validateBudgetOperations(actions, basePath, request, trades, realChainId, envConfig) {
|
|
12
|
+
function validateBudgetOperations(actions, basePath, request, trades, responseTrades, realChainId, envConfig) {
|
|
13
13
|
const violations = [];
|
|
14
14
|
for (let i = 0; i < actions.length; i++) {
|
|
15
15
|
const action = actions[i];
|
|
@@ -19,11 +19,11 @@ function validateBudgetOperations(actions, basePath, request, trades, realChainI
|
|
|
19
19
|
// Applies to ALL Budget actions regardless of type
|
|
20
20
|
violations.push(...validateBudgetApproveNone(request, actionPath));
|
|
21
21
|
// Token address and calldata checks only apply to actions that use transactionCalls
|
|
22
|
-
// (Transaction,
|
|
23
|
-
// by the permit/permit2 validators instead.
|
|
22
|
+
// (Transaction, Sign712MetaMaskCaveats). For Permit/Permit2 (Sign712), these are
|
|
23
|
+
// validated by the permit/permit2 validators instead.
|
|
24
24
|
if (!(0, evm_action_1.actionUsesTransactionCalls)(action))
|
|
25
25
|
continue;
|
|
26
|
-
violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...validateBudgetCalldata(action, actionPath, request, trades, realChainId, envConfig));
|
|
26
|
+
violations.push(...validateBudgetTokenAddress(action, actionPath, trades, realChainId), ...validateBudgetCalldata(action, actionPath, request, trades, responseTrades, realChainId, envConfig));
|
|
27
27
|
}
|
|
28
28
|
return violations;
|
|
29
29
|
}
|
|
@@ -78,7 +78,7 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
|
78
78
|
});
|
|
79
79
|
}
|
|
80
80
|
// CRITICAL: must be non-zero address
|
|
81
|
-
if ((0, evm_token_1.isNativeToken)(tokenAddress)) {
|
|
81
|
+
if ((0, evm_token_1.isNativeToken)(tokenAddress, realChainId)) {
|
|
82
82
|
violations.push({
|
|
83
83
|
code: types_1.ViolationCode.BudgetTokenAddressZero,
|
|
84
84
|
message: `Budget token address must not be the zero address`,
|
|
@@ -106,7 +106,7 @@ function validateBudgetTokenAddress(action, actionPath, trades, realChainId) {
|
|
|
106
106
|
}
|
|
107
107
|
// CRITICAL: decode approve calldata, validate spender + amount + allowanceHolder
|
|
108
108
|
// Handles two-step approve: approve(spender, 0) reset + approve(spender, amount)
|
|
109
|
-
function validateBudgetCalldata(action, actionPath, request, trades, realChainId, envConfig) {
|
|
109
|
+
function validateBudgetCalldata(action, actionPath, request, trades, responseTrades, realChainId, envConfig) {
|
|
110
110
|
const txCalls = (0, evm_action_1.getTransactionCalls)(action);
|
|
111
111
|
// Missing txCalls is reported by validateBudgetTokenAddress
|
|
112
112
|
if (txCalls.length === 0)
|
|
@@ -115,7 +115,7 @@ function validateBudgetCalldata(action, actionPath, request, trades, realChainId
|
|
|
115
115
|
if ("violations" in decoded)
|
|
116
116
|
return decoded.violations;
|
|
117
117
|
const violations = [];
|
|
118
|
-
violations.push(...validateBudgetAmount(decoded.amount, actionPath, decoded.mainApproveIndex, request, trades, action, realChainId), ...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.mainApproveIndex, realChainId, envConfig));
|
|
118
|
+
violations.push(...validateBudgetAmount(decoded.amount, actionPath, decoded.mainApproveIndex, request, trades, responseTrades, action, realChainId), ...validateBudgetAllowanceHolder(decoded.spender, action, actionPath, decoded.mainApproveIndex, realChainId, envConfig));
|
|
119
119
|
return violations;
|
|
120
120
|
}
|
|
121
121
|
// Decodes one or two approve calls. Returns the "real" approve.
|
|
@@ -194,8 +194,11 @@ function validateBudgetResetCall(txCall, expectedSpender, calldataPath) {
|
|
|
194
194
|
}
|
|
195
195
|
return violations;
|
|
196
196
|
}
|
|
197
|
-
// CRITICAL: approve amount validation
|
|
198
|
-
|
|
197
|
+
// CRITICAL: approve amount validation. When `prependOperatingExpenses=true` for
|
|
198
|
+
// a trade, the API increases its contribution to the approve sum by
|
|
199
|
+
// `response.trades[i].srcChainTokenIn.approximateOperatingExpense` — same
|
|
200
|
+
// mechanism as the Wrap deposit value (the wrapped budget is the same number).
|
|
201
|
+
function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, trades, responseTrades, action, realChainId) {
|
|
199
202
|
const flag = request.approveAmountFlag;
|
|
200
203
|
const dataPath = `${actionPath}.details.transactionCalls[${mainIndex}].data`;
|
|
201
204
|
// unlimited: must be maxUint256
|
|
@@ -216,7 +219,7 @@ function validateBudgetAmount(approveAmount, actionPath, mainIndex, request, tra
|
|
|
216
219
|
// Skip if tokenAddress is missing — already reported by validateBudgetTokenAddress
|
|
217
220
|
if (!tokenAddress)
|
|
218
221
|
return [];
|
|
219
|
-
const sumResult = (0, evm_trade_amounts_1.sumTradeAmounts)(trades, tokenAddress, realChainId);
|
|
222
|
+
const sumResult = (0, evm_trade_amounts_1.sumTradeAmounts)(trades, tokenAddress, realChainId, responseTrades);
|
|
220
223
|
if (sumResult.violations)
|
|
221
224
|
return sumResult.violations;
|
|
222
225
|
if (sumResult.skip)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"evm-op-budget.js","sourceRoot":"","sources":["../../../src/validations/evm-op-budget.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,415 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
exports.validateEvmHookActions = validateEvmHookActions;
|
|
4
|
+
const types_1 = require("../types");
|
|
5
|
+
const placeholder_1 = require("../helpers/placeholder");
|
|
6
|
+
const gas_compensation_1 = require("../helpers/gas-compensation");
|
|
7
|
+
const evm_gas_compensation_tx_1 = require("../helpers/evm-gas-compensation-tx");
|
|
8
|
+
const address_1 = require("../helpers/address");
|
|
9
|
+
const evm_sign7702_1 = require("./evm-sign7702");
|
|
10
|
+
const evm_sign712_shared_1 = require("./evm-sign712-shared");
|
|
11
|
+
const SIGN712_HOOK_TYPES = [
|
|
12
|
+
types_1.EvmActionKind.Sign712MetaMaskCaveats,
|
|
13
|
+
types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders,
|
|
14
|
+
];
|
|
15
|
+
function validateEvmHookActions(hookPayload, requestHook, basePath, mode, responseTrades, realChainId, request) {
|
|
16
|
+
const violations = [];
|
|
17
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
18
|
+
const action = hookPayload.requiredActions[i];
|
|
19
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
20
|
+
violations.push(...validateHookSign7702Binding(action, actionPath, realChainId));
|
|
21
|
+
}
|
|
22
|
+
if (hookPayload.hook.type === types_1.BundleHookType.Direct) {
|
|
23
|
+
violations.push(...validateDirectEvmHookActions(hookPayload, requestHook, basePath));
|
|
24
|
+
}
|
|
25
|
+
else { // BundleHookType.Delegated (default)
|
|
26
|
+
violations.push(...validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, request.expirationTimestamp));
|
|
27
|
+
}
|
|
28
|
+
violations.push(...validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId));
|
|
29
|
+
violations.push(...validateHookActionTransactionCallsMatch(hookPayload, basePath));
|
|
30
|
+
if (requestHook === undefined && mode === placeholder_1.HookMode.PreHooks) {
|
|
31
|
+
violations.push(...validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId));
|
|
32
|
+
}
|
|
33
|
+
return violations;
|
|
34
|
+
}
|
|
35
|
+
// CRITICAL: every action that carries the `Delegate` operation must have
|
|
36
|
+
// type `Sign7702Authorization`, and every `Sign7702Authorization` action must
|
|
37
|
+
// carry exactly `[Delegate]` and a whitelisted contractAddress. Without this
|
|
38
|
+
// binding, an action with `actions:[Delegate]` and an arbitrary `type` (e.g.
|
|
39
|
+
// `Transaction`) would slip through the operation/position checks elsewhere.
|
|
40
|
+
// The per-action [Delegate] + contractAddress checks are shared with intent-scope
|
|
41
|
+
// via `validateSign7702Action`; the type <-> [Delegate] binding is hook-specific.
|
|
42
|
+
function validateHookSign7702Binding(action, actionPath, realChainId) {
|
|
43
|
+
const violations = [];
|
|
44
|
+
const ops = action.actions;
|
|
45
|
+
const hasDelegate = ops.includes(types_1.EvmActionOperation.Delegate);
|
|
46
|
+
const isSign7702 = action.type === types_1.EvmActionKind.Sign7702Authorization;
|
|
47
|
+
if (hasDelegate && !isSign7702) {
|
|
48
|
+
violations.push({
|
|
49
|
+
code: types_1.ViolationCode.HookDelegateOpWrongType,
|
|
50
|
+
message: "action with operation [Delegate] must have type"
|
|
51
|
+
+ " Sign7702Authorization",
|
|
52
|
+
path: `${actionPath}.type`,
|
|
53
|
+
expected: types_1.EvmActionKind.Sign7702Authorization,
|
|
54
|
+
actual: action.type,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (isSign7702) {
|
|
58
|
+
violations.push(...(0, evm_sign7702_1.validateSign7702Action)(action, actionPath, realChainId));
|
|
59
|
+
}
|
|
60
|
+
return violations;
|
|
61
|
+
}
|
|
62
|
+
// HIGH: a Direct EVM hook's hook-action must be `Transaction` (when no deferred
|
|
63
|
+
// placeholders are declared) or `ProvidePlaceholders` (when at least one
|
|
64
|
+
// deferred placeholder is declared). chainId and placeholder list are checked
|
|
65
|
+
// per-action below.
|
|
66
|
+
function validateDirectEvmHookActions(hookPayload, requestHook, basePath) {
|
|
67
|
+
const violations = [];
|
|
68
|
+
const expectedDeferred = collectDeferredPlaceholders(requestHook);
|
|
69
|
+
const expectsTransaction = expectedDeferred.length === 0;
|
|
70
|
+
const hookChainId = hookPayload.hook.chainId;
|
|
71
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
72
|
+
const action = hookPayload.requiredActions[i];
|
|
73
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
74
|
+
// Safe skip: Delegate-bearing actions in Direct hooks are reported
|
|
75
|
+
// as `HookDelegateInDirect` by `validateHookDelegateOp`.
|
|
76
|
+
if (action.actions.includes(types_1.EvmActionOperation.Delegate))
|
|
77
|
+
continue;
|
|
78
|
+
violations.push(...validateDirectAction(action, expectsTransaction, hookChainId, expectedDeferred, actionPath));
|
|
79
|
+
}
|
|
80
|
+
return violations;
|
|
81
|
+
}
|
|
82
|
+
function validateDirectAction(action, expectsTransaction, hookChainId, expectedDeferred, actionPath) {
|
|
83
|
+
const expectedType = expectsTransaction
|
|
84
|
+
? types_1.EvmActionKind.Transaction
|
|
85
|
+
: types_1.EvmActionKind.ProvidePlaceholders;
|
|
86
|
+
if (action.type !== expectedType) {
|
|
87
|
+
return [{
|
|
88
|
+
code: types_1.ViolationCode.HookDirectActionTypeInvalid,
|
|
89
|
+
message: `Direct hook action must be of type ${expectedType}`,
|
|
90
|
+
path: `${actionPath}.type`,
|
|
91
|
+
expected: expectedType,
|
|
92
|
+
actual: action.type,
|
|
93
|
+
}];
|
|
94
|
+
}
|
|
95
|
+
if (expectsTransaction) {
|
|
96
|
+
return validateDirectTransactionAction(action.data, hookChainId, actionPath);
|
|
97
|
+
}
|
|
98
|
+
return validateProvidePlaceholdersAction(action.data, hookChainId, expectedDeferred, actionPath);
|
|
99
|
+
}
|
|
100
|
+
// HIGH: a Delegated EVM hook's hook-action must be `Sign712MetaMaskCaveats`
|
|
101
|
+
// (when no deferred placeholders are declared) or
|
|
102
|
+
// `Sign712MetaMaskCaveatsWithPlaceholders` (when at least one deferred
|
|
103
|
+
// placeholder is declared). transactionCalls form, placeholders match, and
|
|
104
|
+
// EIP-712 content checks (domain, delegator, caveats) are checked per-action below.
|
|
105
|
+
function validateDelegatedEvmHookActions(hookPayload, requestHook, basePath, realChainId, expirationTimestamp) {
|
|
106
|
+
const violations = [];
|
|
107
|
+
const expectedDeferred = collectDeferredPlaceholders(requestHook);
|
|
108
|
+
const hasDeferred = expectedDeferred.length > 0;
|
|
109
|
+
const ctx = {
|
|
110
|
+
expectedType: hasDeferred
|
|
111
|
+
? types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders
|
|
112
|
+
: types_1.EvmActionKind.Sign712MetaMaskCaveats,
|
|
113
|
+
expectedDeferred,
|
|
114
|
+
hookFrom: hookPayload.hook.from,
|
|
115
|
+
realChainId,
|
|
116
|
+
expirationTimestamp,
|
|
117
|
+
};
|
|
118
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
119
|
+
const action = hookPayload.requiredActions[i];
|
|
120
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
121
|
+
// Safe skip: Delegate-bearing actions are validated by
|
|
122
|
+
// `validateHookSign7702Binding`.
|
|
123
|
+
if (action.actions.includes(types_1.EvmActionOperation.Delegate))
|
|
124
|
+
continue;
|
|
125
|
+
violations.push(...validateDelegatedAction(action, actionPath, ctx));
|
|
126
|
+
}
|
|
127
|
+
return violations;
|
|
128
|
+
}
|
|
129
|
+
function validateDelegatedAction(action, actionPath, ctx) {
|
|
130
|
+
if (action.type !== ctx.expectedType) {
|
|
131
|
+
return [{
|
|
132
|
+
code: types_1.ViolationCode.HookDelegatedActionTypeInvalid,
|
|
133
|
+
message: `Delegated hook action must be of type ${ctx.expectedType}`,
|
|
134
|
+
path: `${actionPath}.type`,
|
|
135
|
+
expected: ctx.expectedType,
|
|
136
|
+
actual: action.type,
|
|
137
|
+
}];
|
|
138
|
+
}
|
|
139
|
+
const violations = [
|
|
140
|
+
...validateSign712TransactionCalls(action, actionPath),
|
|
141
|
+
];
|
|
142
|
+
// CRITICAL: data structural presence — downstream content checks assume
|
|
143
|
+
// `data.domain` and `data.message` exist.
|
|
144
|
+
const data = action.data;
|
|
145
|
+
const presenceErrors = (0, evm_sign712_shared_1.validateSign712DataPresent)(data, actionPath);
|
|
146
|
+
if (presenceErrors.length > 0) {
|
|
147
|
+
violations.push(...presenceErrors);
|
|
148
|
+
return violations;
|
|
149
|
+
}
|
|
150
|
+
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"));
|
|
151
|
+
const caveats = (data.message.caveats ?? []);
|
|
152
|
+
const txCalls = action.details?.transactionCalls ?? [];
|
|
153
|
+
violations.push(...(0, evm_sign712_shared_1.validateSign712Caveats)(caveats, action.actionId, txCalls, actionPath, ctx.realChainId, ctx.expirationTimestamp));
|
|
154
|
+
if (ctx.expectedType === types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
155
|
+
const withPlaceholdersData = data;
|
|
156
|
+
const actualPlaceholders = withPlaceholdersData.placeholders ?? [];
|
|
157
|
+
if (!placeholderArraysEqual(actualPlaceholders, ctx.expectedDeferred)) {
|
|
158
|
+
violations.push({
|
|
159
|
+
code: types_1.ViolationCode.HookDelegatedPlaceholdersMismatch,
|
|
160
|
+
message: "Sign712MetaMaskCaveatsWithPlaceholders data.placeholders"
|
|
161
|
+
+ " must match the deferred placeholders declared in the request hook",
|
|
162
|
+
path: `${actionPath}.data.placeholders`,
|
|
163
|
+
expected: ctx.expectedDeferred,
|
|
164
|
+
actual: actualPlaceholders,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return violations;
|
|
169
|
+
}
|
|
170
|
+
// CRITICAL: hook-scope `Sign712MetaMaskCaveats(WithPlaceholders)` actions
|
|
171
|
+
// must carry exactly one transactionCall (the wrapped hook tx itself). The API
|
|
172
|
+
// hard-codes `calls = [tx]` for hook scope; an empty or longer array signals
|
|
173
|
+
// that something tampered with the wrapped payload.
|
|
174
|
+
function validateSign712TransactionCalls(action, actionPath) {
|
|
175
|
+
const txCalls = action.details?.transactionCalls ?? [];
|
|
176
|
+
if (txCalls.length === 0) {
|
|
177
|
+
return [{
|
|
178
|
+
code: types_1.ViolationCode.HookSign712TransactionCallsEmpty,
|
|
179
|
+
message: "Sign712MetaMaskCaveats hook action must have exactly one"
|
|
180
|
+
+ " transactionCall (got none)",
|
|
181
|
+
path: `${actionPath}.details.transactionCalls`,
|
|
182
|
+
expected: 1,
|
|
183
|
+
actual: 0,
|
|
184
|
+
}];
|
|
185
|
+
}
|
|
186
|
+
if (txCalls.length > 1) {
|
|
187
|
+
return [{
|
|
188
|
+
code: types_1.ViolationCode.HookSign712TransactionCallsTooMany,
|
|
189
|
+
message: "Sign712MetaMaskCaveats hook action must have exactly one"
|
|
190
|
+
+ " transactionCall",
|
|
191
|
+
path: `${actionPath}.details.transactionCalls`,
|
|
192
|
+
expected: 1,
|
|
193
|
+
actual: txCalls.length,
|
|
194
|
+
}];
|
|
195
|
+
}
|
|
6
196
|
return [];
|
|
7
197
|
}
|
|
198
|
+
function collectDeferredPlaceholders(requestHook) {
|
|
199
|
+
return (requestHook?.placeHolders ?? [])
|
|
200
|
+
.filter(p => p.type === types_1.PlaceholderType.Deferred)
|
|
201
|
+
.map(p => ({ nameVariable: p.nameVariable }));
|
|
202
|
+
}
|
|
203
|
+
function validateDirectTransactionAction(data, hookChainId, actionPath) {
|
|
204
|
+
if (data.chainId === hookChainId)
|
|
205
|
+
return [];
|
|
206
|
+
return [{
|
|
207
|
+
code: types_1.ViolationCode.HookDirectChainIdMismatch,
|
|
208
|
+
message: "Direct hook Transaction data.chainId must equal hook.chainId",
|
|
209
|
+
path: `${actionPath}.data.chainId`,
|
|
210
|
+
expected: hookChainId,
|
|
211
|
+
actual: data.chainId,
|
|
212
|
+
}];
|
|
213
|
+
}
|
|
214
|
+
function validateProvidePlaceholdersAction(data, hookChainId, expectedDeferred, actionPath) {
|
|
215
|
+
const violations = [];
|
|
216
|
+
if (data.transaction.chainId !== hookChainId) {
|
|
217
|
+
violations.push({
|
|
218
|
+
code: types_1.ViolationCode.HookDirectChainIdMismatch,
|
|
219
|
+
message: "ProvidePlaceholders data.transaction.chainId must equal hook.chainId",
|
|
220
|
+
path: `${actionPath}.data.transaction.chainId`,
|
|
221
|
+
expected: hookChainId,
|
|
222
|
+
actual: data.transaction.chainId,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
if (!placeholderArraysEqual(data.placeholders, expectedDeferred)) {
|
|
226
|
+
violations.push({
|
|
227
|
+
code: types_1.ViolationCode.HookDirectPlaceholdersMismatch,
|
|
228
|
+
message: "ProvidePlaceholders data.placeholders must match the deferred"
|
|
229
|
+
+ " placeholders declared in the request hook",
|
|
230
|
+
path: `${actionPath}.data.placeholders`,
|
|
231
|
+
expected: expectedDeferred,
|
|
232
|
+
actual: data.placeholders,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return violations;
|
|
236
|
+
}
|
|
237
|
+
function placeholderArraysEqual(a, b) {
|
|
238
|
+
if (a.length !== b.length)
|
|
239
|
+
return false;
|
|
240
|
+
for (let i = 0; i < a.length; i++) {
|
|
241
|
+
if (a[i].nameVariable !== b[i].nameVariable)
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
// CRITICAL: every EVM hook-action's calldata must equal `request.hook.data`
|
|
247
|
+
// after eager-placeholder substitution (deferred markers must remain in place).
|
|
248
|
+
// Resolution errors themselves are emitted by `validateHookEcho`; here we only
|
|
249
|
+
// report shape mismatches between the action's calldata and the expected value.
|
|
250
|
+
function validateHookActionCalldata(hookPayload, requestHook, basePath, mode, responseTrades, realChainId) {
|
|
251
|
+
// Safe skip: compensation hooks (no requestHook) have no expected calldata
|
|
252
|
+
// to compare against; structural correctness is enforced by
|
|
253
|
+
// `validateCompensationHookStructure` and
|
|
254
|
+
// `validateCompensationHookTransactionCall`.
|
|
255
|
+
if (!requestHook)
|
|
256
|
+
return [];
|
|
257
|
+
const { resolved: expectedCalldata } = (0, placeholder_1.resolveEagerPlaceholders)(requestHook.data, realChainId, requestHook.placeHolders, responseTrades, mode);
|
|
258
|
+
const violations = [];
|
|
259
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
260
|
+
const action = hookPayload.requiredActions[i];
|
|
261
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
262
|
+
// Safe skip: Delegate-bearing actions carry EIP-7702 authorization,
|
|
263
|
+
// not hook calldata.
|
|
264
|
+
if (action.actions.includes(types_1.EvmActionOperation.Delegate))
|
|
265
|
+
continue;
|
|
266
|
+
// Safe skip: actions whose hook-tx calldata cannot be extracted
|
|
267
|
+
// (`Sign712MetaMaskCaveats` with empty `transactionCalls` — reported
|
|
268
|
+
// as `HookSign712TransactionCallsEmpty` by
|
|
269
|
+
// `validateSign712TransactionCalls`; or types like `Permit` /
|
|
270
|
+
// `Permit2` that should not appear in a hook — reported by
|
|
271
|
+
// `validateHookActionsList` as a forbidden operation).
|
|
272
|
+
const extracted = extractEvmHookActionCalldata(action);
|
|
273
|
+
if (!extracted)
|
|
274
|
+
continue;
|
|
275
|
+
if (extracted.calldata !== expectedCalldata) {
|
|
276
|
+
violations.push({
|
|
277
|
+
code: types_1.ViolationCode.HookActionCalldataMismatch,
|
|
278
|
+
message: "hook action calldata does not match request.hook.data after"
|
|
279
|
+
+ " eager-placeholder substitution",
|
|
280
|
+
path: `${actionPath}.${extracted.path}`,
|
|
281
|
+
expected: expectedCalldata,
|
|
282
|
+
actual: extracted.calldata,
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return violations;
|
|
287
|
+
}
|
|
288
|
+
// CRITICAL: `transactionCalls[0].{to, value}` must equal `hook.{to, value}` for
|
|
289
|
+
// `Sign712MetaMaskCaveats(WithPlaceholders)` actions — otherwise the user
|
|
290
|
+
// would sign a delegation that wraps a tx targeting / valued differently than
|
|
291
|
+
// the echoed hook fields.
|
|
292
|
+
function validateHookActionTransactionCallsMatch(hookPayload, basePath) {
|
|
293
|
+
const violations = [];
|
|
294
|
+
const hook = hookPayload.hook;
|
|
295
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
296
|
+
const action = hookPayload.requiredActions[i];
|
|
297
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
298
|
+
if (!SIGN712_HOOK_TYPES.includes(action.type))
|
|
299
|
+
continue;
|
|
300
|
+
// Safe skip: missing transactionCalls reported by
|
|
301
|
+
// `validateSign712TransactionCalls`.
|
|
302
|
+
const tx = action.details?.transactionCalls?.[0];
|
|
303
|
+
if (!tx)
|
|
304
|
+
continue;
|
|
305
|
+
violations.push(...compareTransactionCallToHook(tx, hook, actionPath));
|
|
306
|
+
}
|
|
307
|
+
return violations;
|
|
308
|
+
}
|
|
309
|
+
function compareTransactionCallToHook(tx, hook, actionPath) {
|
|
310
|
+
const violations = [];
|
|
311
|
+
if (hook.to !== undefined && tx.to !== hook.to) {
|
|
312
|
+
violations.push({
|
|
313
|
+
code: types_1.ViolationCode.HookActionTransactionToMismatch,
|
|
314
|
+
message: "transactionCalls[0].to must equal hook.to",
|
|
315
|
+
path: `${actionPath}.details.transactionCalls[0].to`,
|
|
316
|
+
expected: hook.to,
|
|
317
|
+
actual: tx.to,
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
const hookValue = hook.value ?? "0";
|
|
321
|
+
if (!evmValuesEqual(tx.value, hookValue)) {
|
|
322
|
+
violations.push({
|
|
323
|
+
code: types_1.ViolationCode.HookActionTransactionValueMismatch,
|
|
324
|
+
message: "transactionCalls[0].value must equal hook.value",
|
|
325
|
+
path: `${actionPath}.details.transactionCalls[0].value`,
|
|
326
|
+
expected: hookValue,
|
|
327
|
+
actual: tx.value,
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
return violations;
|
|
331
|
+
}
|
|
332
|
+
// Returns true if two EVM-value strings are byte-identical or if both parse as
|
|
333
|
+
// BigInt and represent the same number (e.g. `"0x100"` vs `"256"`). Returns
|
|
334
|
+
// false otherwise.
|
|
335
|
+
function evmValuesEqual(a, b) {
|
|
336
|
+
if (a === b)
|
|
337
|
+
return true;
|
|
338
|
+
try {
|
|
339
|
+
return BigInt(a) === BigInt(b);
|
|
340
|
+
}
|
|
341
|
+
catch {
|
|
342
|
+
return false;
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
// CRITICAL: a compensation hook's wrapped transaction must itself be a valid
|
|
346
|
+
// gas-compensation transfer — same rules as `compensation-hook.ts` applies to
|
|
347
|
+
// `hook.{to, data, value}`, but here applied to `transactionCalls[0]` so the
|
|
348
|
+
// user does not sign a delegation around a different (malicious) tx.
|
|
349
|
+
function validateCompensationHookTransactionCall(hookPayload, basePath, request, realChainId) {
|
|
350
|
+
const allGroups = (0, gas_compensation_1.extractGasCompensationGroups)(request);
|
|
351
|
+
const matchingGroups = allGroups.filter(g => g.realChainId === realChainId
|
|
352
|
+
&& (0, address_1.addressEquals)(realChainId, g.sender, hookPayload.hook.from));
|
|
353
|
+
// Safe skip: from-mismatch reported by `validateCompensationHookStructure`
|
|
354
|
+
// (`CompensationHookFromMismatch`); without a matching group we can't
|
|
355
|
+
// meaningfully classify native vs ERC20.
|
|
356
|
+
if (matchingGroups.length === 0)
|
|
357
|
+
return [];
|
|
358
|
+
const violations = [];
|
|
359
|
+
for (let i = 0; i < hookPayload.requiredActions.length; i++) {
|
|
360
|
+
const action = hookPayload.requiredActions[i];
|
|
361
|
+
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
362
|
+
if (!SIGN712_HOOK_TYPES.includes(action.type))
|
|
363
|
+
continue;
|
|
364
|
+
// Safe skip: missing transactionCalls reported by
|
|
365
|
+
// `validateSign712TransactionCalls`.
|
|
366
|
+
const tx = action.details?.transactionCalls?.[0];
|
|
367
|
+
if (!tx)
|
|
368
|
+
continue;
|
|
369
|
+
violations.push(...(0, evm_gas_compensation_tx_1.validateEvmGasCompensationTx)(tx, matchingGroups, realChainId, `${actionPath}.details.transactionCalls[0]`, {
|
|
370
|
+
toMismatch: types_1.ViolationCode.CompensationHookEvmToMismatch,
|
|
371
|
+
dataInvalid: types_1.ViolationCode.CompensationHookEvmDataInvalid,
|
|
372
|
+
valueInvalid: types_1.ViolationCode.CompensationHookEvmValueInvalid,
|
|
373
|
+
}));
|
|
374
|
+
}
|
|
375
|
+
return violations;
|
|
376
|
+
}
|
|
377
|
+
// Returns the calldata field for an EVM hook-action, plus the relative path
|
|
378
|
+
// to it. `undefined` is reserved for action types that don't carry a
|
|
379
|
+
// hook-tx calldata (e.g. Sign7702Authorization, Permit), or for malformed
|
|
380
|
+
// payloads where the expected nested field is missing — those are reported by
|
|
381
|
+
// dedicated validators (`validateSign712TransactionCalls` for empty
|
|
382
|
+
// transactionCalls, `validateHookActionsList` for forbidden operations).
|
|
383
|
+
function extractEvmHookActionCalldata(action) {
|
|
384
|
+
if (action.type === types_1.EvmActionKind.Transaction) {
|
|
385
|
+
const data = action.data;
|
|
386
|
+
// Safe skip: malformed payload (action.type tampered to mismatch
|
|
387
|
+
// action.data shape). The type/payload mismatch is reported via
|
|
388
|
+
// `HookDirectActionTypeInvalid` / `HookDelegatedActionTypeInvalid`.
|
|
389
|
+
if (typeof data?.data !== "string")
|
|
390
|
+
return undefined;
|
|
391
|
+
return { calldata: data.data, path: "data.data" };
|
|
392
|
+
}
|
|
393
|
+
if (action.type === types_1.EvmActionKind.ProvidePlaceholders) {
|
|
394
|
+
const data = action.data;
|
|
395
|
+
// Safe skip: same as Transaction above.
|
|
396
|
+
if (typeof data?.transaction?.data !== "string")
|
|
397
|
+
return undefined;
|
|
398
|
+
return { calldata: data.transaction.data, path: "data.transaction.data" };
|
|
399
|
+
}
|
|
400
|
+
if (action.type === types_1.EvmActionKind.Sign712MetaMaskCaveats
|
|
401
|
+
|| action.type === types_1.EvmActionKind.Sign712MetaMaskCaveatsWithPlaceholders) {
|
|
402
|
+
// The API wraps a single hook tx into a one-element `transactionCalls`
|
|
403
|
+
// array. Hook scope never produces batch delegations, so `[0]` is the
|
|
404
|
+
// hook-tx call we want. A `transactionCalls` array longer than one is
|
|
405
|
+
// a structural anomaly reported by `validateSign712TransactionCalls`.
|
|
406
|
+
const tx = action.details?.transactionCalls?.[0];
|
|
407
|
+
// Safe skip: empty / missing `transactionCalls` is reported as
|
|
408
|
+
// `HookSign712TransactionCallsEmpty` by `validateSign712TransactionCalls`.
|
|
409
|
+
if (!tx)
|
|
410
|
+
return undefined;
|
|
411
|
+
return { calldata: tx.data, path: "details.transactionCalls[0].data" };
|
|
412
|
+
}
|
|
413
|
+
return undefined;
|
|
414
|
+
}
|
|
8
415
|
//# sourceMappingURL=evm-op-hook.js.map
|