@debridge-finance/borderless-validation-sdk 0.0.1 → 0.0.3
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 +51 -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 +126 -6
- package/dist/cjs/types/response.js.map +1 -1
- package/dist/cjs/types/validation.js +82 -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 +357 -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 +41 -15
- package/dist/cjs/validator.js.map +1 -1
- package/dist/cjs/whitelists/api-endpoints.js +10 -0
- package/dist/cjs/whitelists/api-endpoints.js.map +1 -0
- 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 +50 -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 +126 -6
- package/dist/esm/types/response.js.map +1 -1
- package/dist/esm/types/validation.js +82 -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 +354 -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 +41 -15
- package/dist/esm/validator.js.map +1 -1
- package/dist/esm/whitelists/api-endpoints.js +7 -0
- package/dist/esm/whitelists/api-endpoints.js.map +1 -0
- 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 +39 -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 +1019 -21
- package/dist/types/types/response.d.ts.map +1 -1
- package/dist/types/types/validation.d.ts +74 -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/api-endpoints.d.ts +2 -0
- package/dist/types/whitelists/api-endpoints.d.ts.map +1 -0
- 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
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { ViolationCode, EvmActionKind, EvmActionOperation, } from "../types/index.js";
|
|
2
|
-
import {
|
|
3
|
-
import { DELEGATION_MANAGER_CONTRACTS } from "../whitelists/evm/index.js";
|
|
4
|
-
import { addressEquals } from "../helpers/address.js";
|
|
5
|
-
import { classifyCaveats, validateExactExecutionPresence, validateExactExecutionContent, validateTimestampEnforcerValue, } from "./evm-caveats.js";
|
|
2
|
+
import { validateSign712DataPresent, validateSign712Domain, validateSign712Delegator, validateSign712Caveats, } from "./evm-sign712-shared.js";
|
|
6
3
|
const SIGN712_METAMASK_ALLOWED_ACTIONS = [
|
|
7
4
|
EvmActionOperation.Budget,
|
|
8
5
|
EvmActionOperation.Wrap,
|
|
@@ -13,23 +10,28 @@ export function validateSign712MetaMaskActions(actions, basePath, realChainId, q
|
|
|
13
10
|
const violations = [];
|
|
14
11
|
for (let i = 0; i < actions.length; i++) {
|
|
15
12
|
const action = actions[i];
|
|
16
|
-
if (action.type !== EvmActionKind.
|
|
13
|
+
if (action.type !== EvmActionKind.Sign712MetaMaskCaveats)
|
|
17
14
|
continue;
|
|
18
15
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
19
16
|
const data = action.data;
|
|
20
|
-
// CRITICAL:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
path: `${actionPath}.data`,
|
|
26
|
-
actual: data,
|
|
27
|
-
});
|
|
17
|
+
// CRITICAL: data structural presence — downstream content checks
|
|
18
|
+
// assume `data.domain` and `data.message` exist.
|
|
19
|
+
const presenceErrors = validateSign712DataPresent(data, actionPath);
|
|
20
|
+
if (presenceErrors.length > 0) {
|
|
21
|
+
violations.push(...presenceErrors);
|
|
28
22
|
continue;
|
|
29
23
|
}
|
|
30
|
-
violations.push(...validateSign712TransactionCalls(action, actionPath), ...validateSign712AllowedActions(action, actionPath), ...validateSign712Domain(data, actionPath, realChainId),
|
|
24
|
+
violations.push(...validateSign712TransactionCalls(action, actionPath), ...validateSign712AllowedActions(action, actionPath), ...validateSign712Domain(data, actionPath, realChainId),
|
|
25
|
+
// Delegator: in quote mode we cannot determine the trust source —
|
|
26
|
+
// skip the check entirely. In execution mode the helper compares
|
|
27
|
+
// against `srcChainAuthorityAddress` (which may itself be
|
|
28
|
+
// `undefined` as a defensive check — preserved by passing through).
|
|
29
|
+
...(quoteMode
|
|
30
|
+
? []
|
|
31
|
+
: validateSign712Delegator(data, actionPath, realChainId, srcChainAuthorityAddress, "srcChainAuthorityAddress")));
|
|
31
32
|
const caveats = (data.message.caveats ?? []);
|
|
32
|
-
|
|
33
|
+
const txCalls = action.details?.transactionCalls ?? [];
|
|
34
|
+
violations.push(...validateSign712Caveats(caveats, action.actionId, txCalls, actionPath, realChainId, expirationTimestamp));
|
|
33
35
|
}
|
|
34
36
|
return violations;
|
|
35
37
|
}
|
|
@@ -62,83 +64,4 @@ function validateSign712AllowedActions(action, actionPath) {
|
|
|
62
64
|
}
|
|
63
65
|
return violations;
|
|
64
66
|
}
|
|
65
|
-
// CRITICAL: domain.name must be "DelegationManager"
|
|
66
|
-
// CRITICAL: domain.chainId must equal the real chainId
|
|
67
|
-
// CRITICAL: domain.verifyingContract must be in the DelegationManager whitelist
|
|
68
|
-
function validateSign712Domain(data, actionPath, realChainId) {
|
|
69
|
-
const violations = [];
|
|
70
|
-
if (data.domain.name !== "DelegationManager") {
|
|
71
|
-
violations.push({
|
|
72
|
-
code: ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
|
|
73
|
-
message: `Sign712MetaMask domain.name must be "DelegationManager"`,
|
|
74
|
-
path: `${actionPath}.data.domain.name`,
|
|
75
|
-
expected: "DelegationManager",
|
|
76
|
-
actual: data.domain.name,
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
if (data.domain.chainId !== realChainId) {
|
|
80
|
-
violations.push({
|
|
81
|
-
code: ViolationCode.Sign712MetaMaskChainIdMismatch,
|
|
82
|
-
message: `Sign712MetaMask domain.chainId does not match the real chainId`,
|
|
83
|
-
path: `${actionPath}.data.domain.chainId`,
|
|
84
|
-
expected: realChainId,
|
|
85
|
-
actual: data.domain.chainId,
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
if (data.domain.verifyingContract === undefined ||
|
|
89
|
-
!isWhitelisted(DELEGATION_MANAGER_CONTRACTS, realChainId, data.domain.verifyingContract)) {
|
|
90
|
-
violations.push({
|
|
91
|
-
code: ViolationCode.Sign712MetaMaskVerifyingContractNotWhitelisted,
|
|
92
|
-
message: `Sign712MetaMask domain.verifyingContract is not whitelisted`,
|
|
93
|
-
path: `${actionPath}.data.domain.verifyingContract`,
|
|
94
|
-
actual: data.domain.verifyingContract,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
return violations;
|
|
98
|
-
}
|
|
99
|
-
// LOW: in execution mode, message.delegator must match srcChainAuthorityAddress
|
|
100
|
-
function validateSign712Delegator(data, actionPath, realChainId, quoteMode, srcChainAuthorityAddress) {
|
|
101
|
-
if (quoteMode)
|
|
102
|
-
return [];
|
|
103
|
-
const delegator = data.message.delegator;
|
|
104
|
-
if (srcChainAuthorityAddress === undefined ||
|
|
105
|
-
delegator === undefined ||
|
|
106
|
-
!addressEquals(realChainId, delegator, srcChainAuthorityAddress)) {
|
|
107
|
-
return [{
|
|
108
|
-
code: ViolationCode.Sign712MetaMaskDelegatorMismatch,
|
|
109
|
-
message: `Sign712MetaMask message.delegator must match srcChainAuthorityAddress`,
|
|
110
|
-
path: `${actionPath}.data.message.delegator`,
|
|
111
|
-
expected: srcChainAuthorityAddress,
|
|
112
|
-
actual: delegator,
|
|
113
|
-
}];
|
|
114
|
-
}
|
|
115
|
-
return [];
|
|
116
|
-
}
|
|
117
|
-
function validateSign712MetaMaskCaveats(caveats, action, actionPath, realChainId, expirationTimestamp) {
|
|
118
|
-
const violations = [];
|
|
119
|
-
const classified = classifyCaveats(caveats, action.actionId, actionPath, realChainId, violations);
|
|
120
|
-
const txCalls = action.details?.transactionCalls ?? [];
|
|
121
|
-
violations.push(...validateExactExecutionPresence(classified, txCalls, actionPath));
|
|
122
|
-
validateExactExecutionContent(classified, txCalls, actionPath, violations);
|
|
123
|
-
// CRITICAL: must have at least one IdEnforcer caveat (replay protection)
|
|
124
|
-
if (!classified.hasIdEnforcer) {
|
|
125
|
-
violations.push({
|
|
126
|
-
code: ViolationCode.Sign712MetaMaskMissingIdEnforcerCaveat,
|
|
127
|
-
message: `Sign712MetaMask must have an IdEnforcer caveat`,
|
|
128
|
-
path: `${actionPath}.data.message.caveats`,
|
|
129
|
-
});
|
|
130
|
-
}
|
|
131
|
-
// CRITICAL: must have exactly one TimestampEnforcer caveat
|
|
132
|
-
if (classified.timestampCount === 0) {
|
|
133
|
-
violations.push({
|
|
134
|
-
code: ViolationCode.Sign712MetaMaskMissingTimestampEnforcerCaveat,
|
|
135
|
-
message: `Sign712MetaMask must have a TimestampEnforcer caveat`,
|
|
136
|
-
path: `${actionPath}.data.message.caveats`,
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
if (classified.firstTimestamp) {
|
|
140
|
-
validateTimestampEnforcerValue(classified.firstTimestamp.caveat, expirationTimestamp, classified.firstTimestamp.index, actionPath, violations);
|
|
141
|
-
}
|
|
142
|
-
return violations;
|
|
143
|
-
}
|
|
144
67
|
//# sourceMappingURL=evm-sign712-metamask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-sign712-metamask.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-metamask.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,EAEb,aAAa,EACb,kBAAkB,GAGrB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"evm-sign712-metamask.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-metamask.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { ViolationCode, } from "../types/index.js";
|
|
2
|
+
import { isWhitelisted } from "../whitelists/types.js";
|
|
3
|
+
import { DELEGATION_MANAGER_CONTRACTS } from "../whitelists/evm/index.js";
|
|
4
|
+
import { addressEquals } from "../helpers/address.js";
|
|
5
|
+
import { classifyCaveats, validateExactExecutionPresence, validateExactExecutionContent, validateTimestampEnforcerValue, } from "./evm-caveats.js";
|
|
6
|
+
// Shared content-validators for `Sign712MetaMaskCaveats` /
|
|
7
|
+
// `Sign712MetaMaskCaveatsWithPlaceholders` payloads. Used both in intent-scope
|
|
8
|
+
// and hook-scope.
|
|
9
|
+
// CRITICAL: `data` must be present and contain `domain` and `message`. If this
|
|
10
|
+
// fails, downstream content-validators must not run (they assume `data.domain`
|
|
11
|
+
// and `data.message` exist).
|
|
12
|
+
export function validateSign712DataPresent(data, actionPath) {
|
|
13
|
+
if (!data || !data.domain || !data.message) {
|
|
14
|
+
return [{
|
|
15
|
+
code: ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
|
|
16
|
+
message: "Sign712MetaMask data is missing domain or message",
|
|
17
|
+
path: `${actionPath}.data`,
|
|
18
|
+
actual: data,
|
|
19
|
+
}];
|
|
20
|
+
}
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
// CRITICAL: domain.name must be "DelegationManager"
|
|
24
|
+
// CRITICAL: domain.chainId must equal the real chainId
|
|
25
|
+
// CRITICAL: domain.verifyingContract must be in the DelegationManager whitelist
|
|
26
|
+
export function validateSign712Domain(data, actionPath, realChainId) {
|
|
27
|
+
const violations = [];
|
|
28
|
+
if (data.domain.name !== "DelegationManager") {
|
|
29
|
+
violations.push({
|
|
30
|
+
code: ViolationCode.Sign712MetaMaskDomainNameNotDelegationManager,
|
|
31
|
+
message: `Sign712MetaMask domain.name must be "DelegationManager"`,
|
|
32
|
+
path: `${actionPath}.data.domain.name`,
|
|
33
|
+
expected: "DelegationManager",
|
|
34
|
+
actual: data.domain.name,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
if (data.domain.chainId !== realChainId) {
|
|
38
|
+
violations.push({
|
|
39
|
+
code: ViolationCode.Sign712MetaMaskChainIdMismatch,
|
|
40
|
+
message: `Sign712MetaMask domain.chainId does not match the real chainId`,
|
|
41
|
+
path: `${actionPath}.data.domain.chainId`,
|
|
42
|
+
expected: realChainId,
|
|
43
|
+
actual: data.domain.chainId,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (data.domain.verifyingContract === undefined
|
|
47
|
+
|| !isWhitelisted(DELEGATION_MANAGER_CONTRACTS, realChainId, data.domain.verifyingContract)) {
|
|
48
|
+
violations.push({
|
|
49
|
+
code: ViolationCode.Sign712MetaMaskVerifyingContractNotWhitelisted,
|
|
50
|
+
message: `Sign712MetaMask domain.verifyingContract is not whitelisted`,
|
|
51
|
+
path: `${actionPath}.data.domain.verifyingContract`,
|
|
52
|
+
actual: data.domain.verifyingContract,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
return violations;
|
|
56
|
+
}
|
|
57
|
+
// CRITICAL: message.delegator must match the address that requested the
|
|
58
|
+
// delegation. The trust source differs per scope (intent uses the trade's
|
|
59
|
+
// `srcChainAuthorityAddress`, hook uses `hook.from`); the comparison itself is
|
|
60
|
+
// shared. Caller passes `expectedDelegator = undefined` to record the violation
|
|
61
|
+
// without an expected value.
|
|
62
|
+
export function validateSign712Delegator(data, actionPath, realChainId, expectedDelegator, expectedSourceLabel) {
|
|
63
|
+
const delegator = data.message.delegator;
|
|
64
|
+
if (expectedDelegator === undefined
|
|
65
|
+
|| delegator === undefined
|
|
66
|
+
|| !addressEquals(realChainId, delegator, expectedDelegator)) {
|
|
67
|
+
return [{
|
|
68
|
+
code: ViolationCode.Sign712MetaMaskDelegatorMismatch,
|
|
69
|
+
message: `Sign712MetaMask message.delegator must match ${expectedSourceLabel}`,
|
|
70
|
+
path: `${actionPath}.data.message.delegator`,
|
|
71
|
+
expected: expectedDelegator,
|
|
72
|
+
actual: delegator,
|
|
73
|
+
}];
|
|
74
|
+
}
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
// CRITICAL: caveats must contain valid IdEnforcer (replay protection),
|
|
78
|
+
// TimestampEnforcer (with correct beforeThreshold), and ExactExecution /
|
|
79
|
+
// ExactExecutionBatch caveats whose content matches `transactionCalls[]`.
|
|
80
|
+
export function validateSign712Caveats(caveats, actionId, transactionCalls, actionPath, realChainId, expirationTimestamp) {
|
|
81
|
+
const violations = [];
|
|
82
|
+
const classified = classifyCaveats(caveats, actionId, actionPath, realChainId, violations);
|
|
83
|
+
violations.push(...validateExactExecutionPresence(classified, transactionCalls, actionPath));
|
|
84
|
+
validateExactExecutionContent(classified, transactionCalls, actionPath, violations);
|
|
85
|
+
// CRITICAL: must have at least one IdEnforcer caveat (replay protection)
|
|
86
|
+
if (!classified.hasIdEnforcer) {
|
|
87
|
+
violations.push({
|
|
88
|
+
code: ViolationCode.Sign712MetaMaskMissingIdEnforcerCaveat,
|
|
89
|
+
message: "Sign712MetaMask must have an IdEnforcer caveat",
|
|
90
|
+
path: `${actionPath}.data.message.caveats`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// CRITICAL: must have exactly one TimestampEnforcer caveat.
|
|
94
|
+
if (classified.timestampCount !== 1) {
|
|
95
|
+
violations.push({
|
|
96
|
+
code: classified.timestampCount === 0
|
|
97
|
+
? ViolationCode.Sign712MetaMaskMissingTimestampEnforcerCaveat
|
|
98
|
+
: ViolationCode.Sign712MetaMaskDuplicateTimestampEnforcerCaveat,
|
|
99
|
+
message: "Sign712MetaMask must have exactly one TimestampEnforcer",
|
|
100
|
+
path: `${actionPath}.data.message.caveats`,
|
|
101
|
+
expected: 1,
|
|
102
|
+
actual: classified.timestampCount,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (classified.firstTimestamp) {
|
|
106
|
+
validateTimestampEnforcerValue(classified.firstTimestamp.caveat, expirationTimestamp, classified.firstTimestamp.index, actionPath, violations);
|
|
107
|
+
}
|
|
108
|
+
return violations;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=evm-sign712-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evm-sign712-shared.js","sourceRoot":"","sources":["../../../src/validations/evm-sign712-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,38 @@ import { EIP7702_DELEGATION_CONTRACTS } from "../whitelists/evm/index.js";
|
|
|
4
4
|
// =============================================
|
|
5
5
|
// Sign7702Authorization constraints
|
|
6
6
|
// =============================================
|
|
7
|
+
// CRITICAL: per-action checks for a `Sign7702Authorization` action.
|
|
8
|
+
// Shared between intent-scope (`validateSign7702Actions`) and hook-scope
|
|
9
|
+
// (`validateHookSign7702Binding`); both wrap this with their scope-specific
|
|
10
|
+
// constraints (intent: position+duplicate; hook: type↔actions binding +
|
|
11
|
+
// `validateHookDelegateOp` for position/count).
|
|
12
|
+
export function validateSign7702Action(action, actionPath, realChainId) {
|
|
13
|
+
const violations = [];
|
|
14
|
+
// HIGH: actions[] must contain exactly one element — Delegate
|
|
15
|
+
const ops = action.actions;
|
|
16
|
+
if (ops.length !== 1 || ops[0] !== EvmActionOperation.Delegate) {
|
|
17
|
+
violations.push({
|
|
18
|
+
code: ViolationCode.Sign7702ActionsNotSingleDelegate,
|
|
19
|
+
message: `Sign7702Authorization actions must contain exactly [Delegate]`,
|
|
20
|
+
path: `${actionPath}.actions`,
|
|
21
|
+
expected: [EvmActionOperation.Delegate],
|
|
22
|
+
actual: action.actions,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
// CRITICAL: data.contractAddress must be in the whitelist
|
|
26
|
+
const data = action.data;
|
|
27
|
+
const contractAddress = data?.contractAddress;
|
|
28
|
+
if (!contractAddress
|
|
29
|
+
|| !isWhitelisted(EIP7702_DELEGATION_CONTRACTS, realChainId, contractAddress)) {
|
|
30
|
+
violations.push({
|
|
31
|
+
code: ViolationCode.Sign7702ContractAddressNotWhitelisted,
|
|
32
|
+
message: `Sign7702Authorization contractAddress is not in the whitelist`,
|
|
33
|
+
path: `${actionPath}.data.contractAddress`,
|
|
34
|
+
actual: contractAddress,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return violations;
|
|
38
|
+
}
|
|
7
39
|
export function validateSign7702Actions(actions, basePath, realChainId) {
|
|
8
40
|
const violations = [];
|
|
9
41
|
let sign7702Count = 0;
|
|
@@ -13,28 +45,7 @@ export function validateSign7702Actions(actions, basePath, realChainId) {
|
|
|
13
45
|
if (action.type !== EvmActionKind.Sign7702Authorization)
|
|
14
46
|
continue;
|
|
15
47
|
const actionPath = `${basePath}.requiredActions[${i}]`;
|
|
16
|
-
|
|
17
|
-
if (action.actions.length !== 1 ||
|
|
18
|
-
action.actions[0] !== EvmActionOperation.Delegate) {
|
|
19
|
-
violations.push({
|
|
20
|
-
code: ViolationCode.Sign7702ActionsNotSingleDelegate,
|
|
21
|
-
message: `Sign7702Authorization actions must contain exactly [Delegate]`,
|
|
22
|
-
path: `${actionPath}.actions`,
|
|
23
|
-
expected: [EvmActionOperation.Delegate],
|
|
24
|
-
actual: action.actions,
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
// CRITICAL: data.contractAddress must be in the whitelist
|
|
28
|
-
const data = action.data;
|
|
29
|
-
const contractAddress = data?.contractAddress;
|
|
30
|
-
if (!contractAddress || !isWhitelisted(EIP7702_DELEGATION_CONTRACTS, realChainId, contractAddress)) {
|
|
31
|
-
violations.push({
|
|
32
|
-
code: ViolationCode.Sign7702ContractAddressNotWhitelisted,
|
|
33
|
-
message: `Sign7702Authorization contractAddress is not in the whitelist`,
|
|
34
|
-
path: `${actionPath}.data.contractAddress`,
|
|
35
|
-
actual: contractAddress,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
48
|
+
violations.push(...validateSign7702Action(action, actionPath, realChainId));
|
|
38
49
|
// HIGH: at most one Sign7702Authorization per intent
|
|
39
50
|
// Note: only the first duplicate will be reported, subsequent ones will be ignored
|
|
40
51
|
sign7702Count++;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evm-sign7702.js","sourceRoot":"","sources":["../../../src/validations/evm-sign7702.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,EAEb,aAAa,EACb,kBAAkB,
|
|
1
|
+
{"version":3,"file":"evm-sign7702.js","sourceRoot":"","sources":["../../../src/validations/evm-sign7702.ts"],"names":[],"mappings":"AAAA,OAAO,EAEH,aAAa,EAEb,aAAa,EACb,kBAAkB,GAIrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAEjE,gDAAgD;AAChD,oCAAoC;AACpC,gDAAgD;AAEhD,oEAAoE;AACpE,yEAAyE;AACzE,4EAA4E;AAC5E,wEAAwE;AACxE,gDAAgD;AAChD,MAAM,UAAU,sBAAsB,CAClC,MAA0E,EAC1E,UAAkB,EAClB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IAEnC,8DAA8D;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAmB,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,kBAAkB,CAAC,QAAQ,EAAE,CAAC;QAC7D,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,aAAa,CAAC,gCAAgC;YACpD,OAAO,EAAE,+DAA+D;YACxE,IAAI,EAAE,GAAG,UAAU,UAAU;YAC7B,QAAQ,EAAE,CAAC,kBAAkB,CAAC,QAAQ,CAAC;YACvC,MAAM,EAAE,MAAM,CAAC,OAAO;SACzB,CAAC,CAAC;IACP,CAAC;IAED,0DAA0D;IAC1D,MAAM,IAAI,GAAG,MAAM,CAAC,IAAgD,CAAC;IACrE,MAAM,eAAe,GAAG,IAAI,EAAE,eAAe,CAAC;IAC9C,IACI,CAAC,eAAe;WACb,CAAC,aAAa,CAAC,4BAA4B,EAAE,WAAW,EAAE,eAAe,CAAC,EAC/E,CAAC;QACC,UAAU,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,aAAa,CAAC,qCAAqC;YACzD,OAAO,EAAE,+DAA+D;YACxE,IAAI,EAAE,GAAG,UAAU,uBAAuB;YAC1C,MAAM,EAAE,eAAe;SAC1B,CAAC,CAAC;IACP,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,uBAAuB,CACnC,OAA4B,EAC5B,QAAgB,EAChB,WAAoB;IAEpB,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,kBAAkB,GAAG,CAAC,CAAC,CAAC;IAE5B,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,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,CAAC,qBAAqB;YAAE,SAAS;QAElE,MAAM,UAAU,GAAG,GAAG,QAAQ,oBAAoB,CAAC,GAAG,CAAC;QACvD,UAAU,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,MAAM,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;QAE5E,qDAAqD;QACrD,mFAAmF;QACnF,aAAa,EAAE,CAAC;QAChB,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YACtB,kBAAkB,GAAG,CAAC,CAAC;QAC3B,CAAC;aAAM,IAAI,aAAa,KAAK,CAAC,EAAE,CAAC;YAC7B,UAAU,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,aAAa,CAAC,8BAA8B;gBAClD,OAAO,EAAE,kEAAkE,kBAAkB,QAAQ,CAAC,EAAE;gBACxG,IAAI,EAAE,GAAG,UAAU,OAAO;gBAC1B,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,aAAa;aACxB,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,OAAO,UAAU,CAAC;AACtB,CAAC"}
|