Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@metamask/core-monorepo",
"version": "959.0.0",
"version": "960.0.0",
"private": true,
"description": "Monorepo for packages shared between MetaMask clients",
"repository": {
Expand Down
5 changes: 4 additions & 1 deletion packages/bridge-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [71.1.0]

### Added

- Add optional `batchSellDestStablecoins` chain-level feature flag to bridge configuration ([#8705](https://github.com/MetaMask/core/pull/8705))
Expand Down Expand Up @@ -1407,7 +1409,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))

[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@71.0.0...HEAD
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@71.1.0...HEAD
[71.1.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@71.0.0...@metamask/bridge-controller@71.1.0
[71.0.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@70.2.0...@metamask/bridge-controller@71.0.0
[70.2.0]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@70.1.1...@metamask/bridge-controller@70.2.0
[70.1.1]: https://github.com/MetaMask/core/compare/@metamask/bridge-controller@70.1.0...@metamask/bridge-controller@70.1.1
Expand Down
2 changes: 1 addition & 1 deletion packages/bridge-controller/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@metamask/bridge-controller",
"version": "71.0.0",
"version": "71.1.0",
"description": "Manages bridge-related quote fetching functionality for MetaMask",
"keywords": [
"Ethereum",
Expand Down
1 change: 1 addition & 0 deletions packages/bridge-status-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Changed

- Bump `@metamask/bridge-controller` from `^71.0.0` to `^71.1.0` ([#8706](https://github.com/MetaMask/core/pull/8706))
- Bump `@metamask/transaction-controller` from `^65.0.0` to `^65.1.0` ([#8691](https://github.com/MetaMask/core/pull/8691))
- Bump `@metamask/accounts-controller` from `^37.2.0` to `^38.0.0` ([#8665](https://github.com/MetaMask/core/pull/8665))
- Bump `@metamask/messenger` from `^1.1.1` to `^1.2.0` ([#8632](https://github.com/MetaMask/core/pull/8632))
Expand Down
2 changes: 1 addition & 1 deletion packages/bridge-status-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
"dependencies": {
"@metamask/accounts-controller": "^38.0.0",
"@metamask/base-controller": "^9.1.0",
"@metamask/bridge-controller": "^71.0.0",
"@metamask/bridge-controller": "^71.1.0",
"@metamask/controller-utils": "^11.20.0",
"@metamask/gas-fee-controller": "^26.1.1",
"@metamask/keyring-controller": "^25.4.0",
Expand Down
1 change: 1 addition & 0 deletions packages/controller-utils/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- The event still emits a `FailureReason` when retries are exhausted.
- Update `normalizeEnsName` regex to allow ENS names with 3 or more characters (previously required 7 or more) ([#8510](https://github.com/MetaMask/core/pull/8510))
- Update default Sei Mainnet block explorer URL from `seitrace.com` to `seiscan.io` ([#8545](https://github.com/MetaMask/core/pull/8545))
- Update `InfuraNetworkType`, `ChainId`, `NetworksTicker`, `BlockExplorerUrl`, and `NetworkNickname` to include missing Infura networks ([#8680](https://github.com/MetaMask/core/pull/8680))

## [11.20.0]

Expand Down
25 changes: 25 additions & 0 deletions packages/controller-utils/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ export const InfuraNetworkType = {
'optimism-mainnet': 'optimism-mainnet',
'polygon-mainnet': 'polygon-mainnet',
'sei-mainnet': 'sei-mainnet',
'monad-mainnet': 'monad-mainnet',
'megaeth-mainnet': 'megaeth-mainnet',
'avalanche-mainnet': 'avalanche-mainnet',
'zksync-mainnet': 'zksync-mainnet',
} as const;

export type InfuraNetworkType =
Expand Down Expand Up @@ -99,6 +103,9 @@ export enum BuiltInNetworkName {
PolygonMainnet = 'polygon-mainnet',
SeiMainnet = 'sei-mainnet',
MegaETHMainnet = 'megaeth-mainnet',
MonadMainnet = 'monad-mainnet',
AvalancheMainnet = 'avalanche-mainnet',
ZksyncMainnet = 'zksync-mainnet',
}

/**
Expand Down Expand Up @@ -127,6 +134,9 @@ export const ChainId = {
[BuiltInNetworkName.PolygonMainnet]: '0x89', // toHex(137)
[BuiltInNetworkName.SeiMainnet]: '0x531', // toHex(1329)
[BuiltInNetworkName.MegaETHMainnet]: '0x10e6', // toHex(4326)
[BuiltInNetworkName.MonadMainnet]: '0x8f', // toHex(143)
[BuiltInNetworkName.AvalancheMainnet]: '0xa86a', // toHex(43114)
[BuiltInNetworkName.ZksyncMainnet]: '0x144', // toHex(324)
} as const;
export type ChainId = (typeof ChainId)[keyof typeof ChainId];

Expand Down Expand Up @@ -156,6 +166,13 @@ export enum NetworksTicker {
'optimism-mainnet' = 'ETH',
'polygon-mainnet' = 'POL',
'sei-mainnet' = 'SEI',
// eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values
'megaeth-mainnet' = 'ETH',
// eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values
'monad-mainnet' = 'MON',
'avalanche-mainnet' = 'AVAX',
// eslint-disable-next-line @typescript-eslint/no-duplicate-enum-values
'zksync-mainnet' = 'ETH',
rpc = '',
}
/* eslint-enable @typescript-eslint/naming-convention */
Expand All @@ -180,6 +197,10 @@ export const BlockExplorerUrl = {
[BuiltInNetworkName.OptimismMainnet]: 'https://optimistic.etherscan.io',
[BuiltInNetworkName.PolygonMainnet]: 'https://polygonscan.com',
[BuiltInNetworkName.SeiMainnet]: 'https://seiscan.io',
[BuiltInNetworkName.MegaETHMainnet]: 'https://megaeth.blockscout.com',
[BuiltInNetworkName.MonadMainnet]: 'https://monadscan.com',
[BuiltInNetworkName.AvalancheMainnet]: 'https://snowtrace.io',
[BuiltInNetworkName.ZksyncMainnet]: 'https://explorer.zksync.io',
} as const satisfies Record<BuiltInNetworkType, string>;
export type BlockExplorerUrl =
(typeof BlockExplorerUrl)[keyof typeof BlockExplorerUrl];
Expand All @@ -203,6 +224,10 @@ export const NetworkNickname = {
[BuiltInNetworkName.OptimismMainnet]: 'Optimism Mainnet',
[BuiltInNetworkName.PolygonMainnet]: 'Polygon Mainnet',
[BuiltInNetworkName.SeiMainnet]: 'Sei Mainnet',
[BuiltInNetworkName.MegaETHMainnet]: 'MegaETH Mainnet',
[BuiltInNetworkName.MonadMainnet]: 'Monad Mainnet',
[BuiltInNetworkName.AvalancheMainnet]: 'Avalanche Mainnet',
[BuiltInNetworkName.ZksyncMainnet]: 'ZKsync Era',
} as const satisfies Record<BuiltInNetworkType, string>;
export type NetworkNickname =
(typeof NetworkNickname)[keyof typeof NetworkNickname];
Expand Down
1 change: 1 addition & 0 deletions packages/gator-permissions-controller/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

### Added

- Add `payee` rule to execution permission decoding for all known permission types ([#8668](https://github.com/MetaMask/core/pull/8668))
- Support `RedeemerEnforcer` caveat when decoding execution permissions ([#8537](https://github.com/MetaMask/core/pull/8537))
- Permission decoding now recognizes the `RedeemerEnforcer` as an optional caveat on all execution permission types and extracts a `redeemer` rule containing the allowlisted addresses.
- `DecodedPermission` type now includes an optional `rules` property for rules recovered from caveats.
Expand Down
4 changes: 2 additions & 2 deletions packages/gator-permissions-controller/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@
"@metamask/7715-permission-types": "^0.6.0",
"@metamask/abi-utils": "^2.0.3",
"@metamask/base-controller": "^9.1.0",
"@metamask/delegation-core": "^1.1.0",
"@metamask/delegation-deployments": "^0.12.0",
"@metamask/delegation-core": "^2.0.0",
"@metamask/delegation-deployments": "^1.3.0",
"@metamask/messenger": "^1.2.0",
"@metamask/network-controller": "^30.1.0",
"@metamask/snaps-controllers": "^19.0.0",
Expand Down
8 changes: 8 additions & 0 deletions packages/gator-permissions-controller/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,11 @@ export const DELEGATION_FRAMEWORK_VERSION = '1.3.0';
* supported execution permission type.
*/
export const EXECUTION_PERMISSION_REDEEMER_RULE_TYPE = 'redeemer' as const;

/**
* `Rule.type` / `wallet_getSupportedExecutionPermissions` `ruleTypes` entry for
* payee allowlists (AllowedCalldataEnforcer / AllowedTargetsEnforcer). Hosts
* should advertise this for every supported execution permission type that supports
* payee restrictions.
*/
export const EXECUTION_PERMISSION_PAYEE_RULE_TYPE = 'payee' as const;
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,23 @@ export function makeErc20TokenAllowanceRule(
erc20PeriodicEnforcer,
valueLteEnforcer,
nonceEnforcer,
allowedCalldataEnforcer,
allowedTargetsEnforcer,
redeemerEnforcer,
} = enforcers;
return makePermissionRule({
permissionType: 'erc20-token-allowance',
optionalEnforcers: [timestampEnforcer, redeemerEnforcer],
optionalEnforcers: [
timestampEnforcer,
redeemerEnforcer,
allowedCalldataEnforcer,
],
redeemerEnforcer,
payeeEnforcers: {
allowedCalldataEnforcer,
allowedTargetsEnforcer,
singlePayeeEnforcer: allowedCalldataEnforcer,
},
timestampEnforcer,
requiredEnforcers: {
[erc20PeriodicEnforcer]: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,23 @@ export function makeErc20TokenPeriodicRule(
erc20PeriodicEnforcer,
valueLteEnforcer,
nonceEnforcer,
allowedCalldataEnforcer,
allowedTargetsEnforcer,
redeemerEnforcer,
} = enforcers;
return makePermissionRule({
permissionType: 'erc20-token-periodic',
optionalEnforcers: [timestampEnforcer, redeemerEnforcer],
optionalEnforcers: [
timestampEnforcer,
redeemerEnforcer,
allowedCalldataEnforcer,
],
redeemerEnforcer,
payeeEnforcers: {
allowedCalldataEnforcer,
allowedTargetsEnforcer,
singlePayeeEnforcer: allowedCalldataEnforcer,
},
timestampEnforcer,
requiredEnforcers: {
[erc20PeriodicEnforcer]: 1,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,19 @@ import {
CHAIN_ID,
DELEGATOR_CONTRACTS,
} from '@metamask/delegation-deployments';
import { getChecksumAddress } from '@metamask/utils';

import { createPermissionRulesForContracts } from '.';

describe('erc20-token-revocation rule', () => {
const chainId = CHAIN_ID.sepolia;
const contracts = DELEGATOR_CONTRACTS['1.3.0'][chainId];
const { TimestampEnforcer, AllowedCalldataEnforcer, ValueLteEnforcer } =
contracts;
const {
TimestampEnforcer,
AllowedCalldataEnforcer,
ValueLteEnforcer,
RedeemerEnforcer,
} = contracts;
const permissionRules = createPermissionRulesForContracts(contracts);
const rule = permissionRules.find(
(candidate) => candidate.permissionType === 'erc20-token-revocation',
Expand Down Expand Up @@ -217,5 +222,56 @@ describe('erc20-token-revocation rule', () => {

expect(result.expiry).toBe(1720000);
expect(result.data).toStrictEqual({});
expect(result.rules).toBeUndefined();
});

it('includes redeemer rule but not payee when RedeemerEnforcer caveat is present', () => {
const packedAddr = '1111111111111111111111111111111111111111' as const;
const approveSelectorTerms =
'0x0000000000000000000000000000000000000000000000000000000000000000095ea7b3' as const;
const zeroAmountTerms =
'0x00000000000000000000000000000000000000000000000000000000000000240000000000000000000000000000000000000000000000000000000000000000' as const;
const zeroValueLteTerms =
'0x0000000000000000000000000000000000000000000000000000000000000000' as const;
const caveats = [
expiryCaveat,
{
enforcer: AllowedCalldataEnforcer,
terms: approveSelectorTerms,
args: '0x' as const,
},
{
enforcer: AllowedCalldataEnforcer,
terms: zeroAmountTerms,
args: '0x' as const,
},
{
enforcer: ValueLteEnforcer,
terms: zeroValueLteTerms,
args: '0x' as const,
},
{
enforcer: RedeemerEnforcer,
terms: `0x${packedAddr}` as const,
args: '0x' as const,
},
];
const result = rule.validateAndDecodePermission(caveats);
expect(result.isValid).toBe(true);
if (!result.isValid) {
throw new Error('Expected valid result');
}
expect(result.rules).toStrictEqual([
{
type: 'redeemer',
data: {
addresses: [
getChecksumAddress(
'0x1111111111111111111111111111111111111111' as const,
),
],
},
},
]);
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export function makeErc20TokenRevocationRule(
const {
timestampEnforcer,
allowedCalldataEnforcer,
allowedTargetsEnforcer,
valueLteEnforcer,
nonceEnforcer,
redeemerEnforcer,
Expand All @@ -32,6 +33,11 @@ export function makeErc20TokenRevocationRule(
permissionType: 'erc20-token-revocation',
optionalEnforcers: [timestampEnforcer, redeemerEnforcer],
redeemerEnforcer,
payeeEnforcers: {
allowedCalldataEnforcer,
allowedTargetsEnforcer,
singlePayeeEnforcer: allowedCalldataEnforcer,
},
timestampEnforcer,
requiredEnforcers: {
[allowedCalldataEnforcer]: 2,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,23 @@ export function makeErc20TokenStreamRule(
erc20StreamingEnforcer,
valueLteEnforcer,
nonceEnforcer,
allowedCalldataEnforcer,
allowedTargetsEnforcer,
redeemerEnforcer,
} = enforcers;
return makePermissionRule({
permissionType: 'erc20-token-stream',
optionalEnforcers: [timestampEnforcer, redeemerEnforcer],
optionalEnforcers: [
timestampEnforcer,
redeemerEnforcer,
allowedCalldataEnforcer,
],
redeemerEnforcer,
payeeEnforcers: {
allowedCalldataEnforcer,
allowedTargetsEnforcer,
singlePayeeEnforcer: allowedCalldataEnforcer,
},
timestampEnforcer,
requiredEnforcers: {
[erc20StreamingEnforcer]: 1,
Expand Down
Loading
Loading