diff --git a/CHANGELOG.md b/CHANGELOG.md index 821dd8f116a0..9262f31d58c8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] - fix(bridge): show "Auto" slippage for Solana swaps +## [7.46.2] + +### Fixed +- fix: Json rpc and invalid transaction type envelope errors ([#15538](https://github.com/MetaMask/metamask-mobile/pull/15538) + ## [7.46.1] ### Fixed @@ -5410,7 +5415,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - [#957](https://github.com/MetaMask/metamask-mobile/pull/957): fix timeouts (#957) - [#954](https://github.com/MetaMask/metamask-mobile/pull/954): Bugfix: onboarding navigation (#954) -[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.46.1...HEAD +[Unreleased]: https://github.com/MetaMask/metamask-mobile/compare/v7.46.2...HEAD +[7.46.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.46.1...v7.46.2 [7.46.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.46.0...v7.46.1 [7.46.0]: https://github.com/MetaMask/metamask-mobile/compare/v7.45.1...v7.46.0 [7.45.1]: https://github.com/MetaMask/metamask-mobile/compare/v7.45.0...v7.45.1 diff --git a/android/app/build.gradle b/android/app/build.gradle index e31dcdceae8d..3deecc2f9d19 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -178,8 +178,8 @@ android { applicationId "io.metamask" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionName "7.46.1" - versionCode 1862 + versionName "7.46.2" + versionCode 1891 testBuildType System.getProperty('testBuildType', 'debug') missingDimensionStrategy 'react-native-camera', 'general' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" diff --git a/app/components/Views/confirmations/components/confirm/confirm-component.test.tsx b/app/components/Views/confirmations/components/confirm/confirm-component.test.tsx index a32d3204dab4..247115f32891 100644 --- a/app/components/Views/confirmations/components/confirm/confirm-component.test.tsx +++ b/app/components/Views/confirmations/components/confirm/confirm-component.test.tsx @@ -87,6 +87,9 @@ jest.mock('../../../../../core/Engine', () => ({ }, }, }, + TransactionController: { + getTransactions: jest.fn().mockReturnValue([]), + }, }, controllerMessenger: { subscribe: jest.fn(), diff --git a/app/components/Views/confirmations/components/info-root/info-root.test.tsx b/app/components/Views/confirmations/components/info-root/info-root.test.tsx index ed387371e650..2e5fb0ab192d 100644 --- a/app/components/Views/confirmations/components/info-root/info-root.test.tsx +++ b/app/components/Views/confirmations/components/info-root/info-root.test.tsx @@ -44,6 +44,9 @@ jest.mock('../../../../../core/Engine', () => ({ }, }, }, + TransactionController: { + getTransactions: jest.fn().mockReturnValue([]), + }, }, controllerMessenger: { subscribe: jest.fn(), diff --git a/app/util/transaction-controller/index.test.ts b/app/util/transaction-controller/index.test.ts index 2b3e648c5358..320631743c84 100644 --- a/app/util/transaction-controller/index.test.ts +++ b/app/util/transaction-controller/index.test.ts @@ -1,4 +1,10 @@ -import { WalletDevice } from '@metamask/transaction-controller'; +import { + GasFeeEstimateType, + WalletDevice, + type TransactionMeta, + TransactionEnvelopeType, +} from '@metamask/transaction-controller'; +import { cloneDeep } from 'lodash'; //eslint-disable-next-line import/no-namespace import * as TransactionControllerUtils from './index'; import Engine from '../../core/Engine'; @@ -21,9 +27,48 @@ jest.mock('../../store', () => ({ }, })); -const TRANSACTION_MOCK = { from: '0x0', to: '0x1', value: '0x0' }; +const ID_MOCK = 'testId'; + +const EIP_1559_TRANSACTION_PARAMS_MOCK = { + from: '0x1559From', + to: '0x1559To', + value: '0x1559Value', + type: TransactionEnvelopeType.feeMarket, + gas: '0x1559Gas', + maxFeePerGas: '0x1559MaxFeePerGas', + maxPriorityFeePerGas: '0x1559MaxPriorityFeePerGas', +}; + +const LEGACY_TRANSACTION_PARAMS_MOCK = { + from: '0xlegacyFrom', + to: '0xlegacyTo', + value: '0xlegacyValue', + type: TransactionEnvelopeType.legacy, + gas: '0xlegacyGas', + gasPrice: '0xlegacyGasPrice', +}; + const NETWORK_CLIENT_ID_MOCK = 'testNetworkClientId'; +const EIP1559_TRANSACTION_META_MOCK = { + id: ID_MOCK, + txParams: EIP_1559_TRANSACTION_PARAMS_MOCK, +} as TransactionMeta; + +const GAS_PRICE_MOCK = '0x1234'; +const EIP1559_TRANSACTION_META_MOCK_WITH_GAS_FEE_ESTIMATES = { + ...EIP1559_TRANSACTION_META_MOCK, + gasFeeEstimates: { + type: GasFeeEstimateType.GasPrice, + gasPrice: GAS_PRICE_MOCK, + }, +} as unknown as TransactionMeta; + +const LEGACY_TRANSACTION_META_MOCK = { + id: ID_MOCK, + txParams: LEGACY_TRANSACTION_PARAMS_MOCK, +} as TransactionMeta; + const TRANSACTION_OPTIONS_MOCK = { deviceConfirmedOn: WalletDevice.MM_MOBILE, networkClientId: NETWORK_CLIENT_ID_MOCK, @@ -33,6 +78,7 @@ const TRANSACTION_OPTIONS_MOCK = { jest.mock('../../core/Engine', () => ({ context: { TransactionController: { + getTransactions: jest.fn(), addTransaction: jest.fn(), estimateGas: jest.fn(), estimateGasFee: jest.fn(), @@ -59,35 +105,47 @@ describe('Transaction Controller Util', () => { describe('addTransaction', () => { it('should call addTransaction with correct parameters', async () => { - await addTransaction(TRANSACTION_MOCK, TRANSACTION_OPTIONS_MOCK); + await addTransaction( + EIP_1559_TRANSACTION_PARAMS_MOCK, + TRANSACTION_OPTIONS_MOCK, + ); expect( Engine.context.TransactionController.addTransaction, - ).toHaveBeenCalledWith(TRANSACTION_MOCK, TRANSACTION_OPTIONS_MOCK); + ).toHaveBeenCalledWith( + EIP_1559_TRANSACTION_PARAMS_MOCK, + TRANSACTION_OPTIONS_MOCK, + ); }); }); describe('estimateGas', () => { it('should call estimateGas with correct parameters', async () => { - await estimateGas(TRANSACTION_MOCK, NETWORK_CLIENT_ID_MOCK); + await estimateGas( + EIP_1559_TRANSACTION_PARAMS_MOCK, + NETWORK_CLIENT_ID_MOCK, + ); expect( Engine.context.TransactionController.estimateGas, - ).toHaveBeenCalledWith(TRANSACTION_MOCK, NETWORK_CLIENT_ID_MOCK); + ).toHaveBeenCalledWith( + EIP_1559_TRANSACTION_PARAMS_MOCK, + NETWORK_CLIENT_ID_MOCK, + ); }); }); describe('estimateGasFee', () => { it('should call estimateGasFee with correct parameters', async () => { await estimateGasFee({ - transactionParams: TRANSACTION_MOCK, + transactionParams: EIP_1559_TRANSACTION_PARAMS_MOCK, chainId: '0x1', }); expect( Engine.context.TransactionController.estimateGasFee, ).toHaveBeenCalledWith({ - transactionParams: TRANSACTION_MOCK, + transactionParams: EIP_1559_TRANSACTION_PARAMS_MOCK, chainId: '0x1', }); }); @@ -98,7 +156,9 @@ describe('Transaction Controller Util', () => { const proxyMethodsKeys = Object.keys(proxyMethods); proxyMethodsKeys.forEach((key) => { const proxyMethod = proxyMethods[key as keyof typeof proxyMethods]; - proxyMethod(); + // This is to avoid type errors when calling the proxy method, no type can be inferred as this is existence check + // eslint-disable-next-line @typescript-eslint/no-explicit-any + proxyMethod({} as any); expect( Engine.context.TransactionController[ key as keyof typeof proxyMethods @@ -200,4 +260,315 @@ describe('Transaction Controller Util', () => { expect(releaseLockMock).toHaveBeenCalledTimes(1); }); }); + + describe('Gas property sanitization', () => { + function testSanitization({ + expectedCallArgumentIndex = 0, + paramToSanitize = [], + testName, + transactionMock, + updaterFunction, + updaterFunctionName, + updaterFunctionParams, + }: { + expectedCallArgumentIndex?: number; + paramToSanitize?: string[]; + testName: string; + transactionMock: TransactionMeta; + updaterFunction: (...args: Params) => void; + updaterFunctionName: 'updateTransaction' | 'updateEditableParams'; + updaterFunctionParams: Params; + }) { + it(testName, () => { + const clonedUpdaterFunctionParams = cloneDeep(updaterFunctionParams); + + mockGetTransactions([transactionMock]); + + updaterFunction(...clonedUpdaterFunctionParams); + + const calledTxParams = ( + Engine.context.TransactionController?.[ + updaterFunctionName as keyof typeof Engine.context.TransactionController + ] as jest.Mock + ).mock.calls[0][expectedCallArgumentIndex]; + + // Either check txParams or the whole object + const calledTxParamsArguments = + calledTxParams?.txParams || calledTxParams; + + paramToSanitize.forEach((param: string) => { + expect(calledTxParamsArguments[param]).not.toBeDefined(); + }); + + expect(calledTxParamsArguments.type).toBe( + transactionMock.txParams.type, + ); + }); + } + + function mockGetTransactions(transactions: TransactionMeta[]) { + jest + .spyOn(Engine.context.TransactionController, 'getTransactions') + .mockReturnValue(transactions); + } + + describe('updates 1559 gas properties when gasPrice estimation is used', () => { + it('uses requestedTransactionParamsToUpdate values if provided', () => { + const customMaxFeePerGas = '0x5678'; + const customMaxPriorityFeePerGas = '0x9abc'; + + mockGetTransactions([ + EIP1559_TRANSACTION_META_MOCK_WITH_GAS_FEE_ESTIMATES, + ]); + + TransactionControllerUtils.updateTransaction( + { + id: ID_MOCK, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + maxFeePerGas: customMaxFeePerGas, + maxPriorityFeePerGas: customMaxPriorityFeePerGas, + }, + } as TransactionMeta, + 'testNote', + ); + + const updatedParams = ( + Engine.context.TransactionController.updateTransaction as jest.Mock + ).mock.calls[0][0].txParams; + expect(updatedParams.maxFeePerGas).toBe(customMaxFeePerGas); + expect(updatedParams.maxPriorityFeePerGas).toBe( + customMaxPriorityFeePerGas, + ); + }); + + it('falls back to existing txParams values if requested values are not provided', () => { + const existingMaxFeePerGas = '0xabcd'; + const existingMaxPriorityFeePerGas = '0xef01'; + + // Create transaction meta with txParams and gasPrice estimation + const transactionWithExistingParams = { + ...EIP1559_TRANSACTION_META_MOCK_WITH_GAS_FEE_ESTIMATES, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + maxFeePerGas: existingMaxFeePerGas, + maxPriorityFeePerGas: existingMaxPriorityFeePerGas, + }, + } as unknown as TransactionMeta; + + mockGetTransactions([transactionWithExistingParams]); + + // Call without fee values in the requested update + TransactionControllerUtils.updateTransaction( + { + id: ID_MOCK, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }, + } as TransactionMeta, + 'testNote', + ); + + // Verify fallback to existing txParams values + const updatedParams = ( + Engine.context.TransactionController.updateTransaction as jest.Mock + ).mock.calls[0][0].txParams; + expect(updatedParams.maxFeePerGas).toBe(existingMaxFeePerGas); + expect(updatedParams.maxPriorityFeePerGas).toBe( + existingMaxPriorityFeePerGas, + ); + }); + + it('falls back to gasPrice estimation if neither requested nor existing values are available', () => { + // Create transaction meta with only gasPrice estimation + const transactionWithOnlyGasPriceEstimate = { + ...EIP1559_TRANSACTION_META_MOCK_WITH_GAS_FEE_ESTIMATES, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }, + } as TransactionMeta; + + mockGetTransactions([transactionWithOnlyGasPriceEstimate]); + + // Call without fee values + TransactionControllerUtils.updateTransaction( + { + id: ID_MOCK, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + maxFeePerGas: undefined, + maxPriorityFeePerGas: undefined, + }, + } as TransactionMeta, + 'testNote', + ); + + // Verify fallback to gasPrice estimation + const updatedParams = ( + Engine.context.TransactionController.updateTransaction as jest.Mock + ).mock.calls[0][0].txParams; + expect(updatedParams.maxFeePerGas).toBe(GAS_PRICE_MOCK); + expect(updatedParams.maxPriorityFeePerGas).toBe(GAS_PRICE_MOCK); + }); + + it('does not update 1559 gas properties when gasPrice estimation is not used', () => { + // Create transaction meta without gasPrice estimation + const transactionWithoutGasPriceEstimate = { + ...EIP1559_TRANSACTION_META_MOCK_WITH_GAS_FEE_ESTIMATES, + gasFeeEstimates: { + type: 'fee-market', // Not gasPrice + someOtherProperty: 'value', + }, + } as unknown as TransactionMeta; + + mockGetTransactions([transactionWithoutGasPriceEstimate]); + + TransactionControllerUtils.updateTransaction( + { + id: ID_MOCK, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + }, + } as unknown as TransactionMeta, + 'testNote', + ); + + // Verify that the transaction was passed as is + const updatedParams = ( + Engine.context.TransactionController.updateTransaction as jest.Mock + ).mock.calls[0][0].txParams; + expect(updatedParams).toEqual(EIP_1559_TRANSACTION_PARAMS_MOCK); + }); + }); + + describe('does not modify transaction params', () => { + it('when transaction is not exist', () => { + mockGetTransactions([]); + + TransactionControllerUtils.updateTransaction( + EIP1559_TRANSACTION_META_MOCK, + 'testNote', + ); + + expect( + Engine.context.TransactionController.updateTransaction, + ).toHaveBeenCalledWith(EIP1559_TRANSACTION_META_MOCK, 'testNote'); + + TransactionControllerUtils.updateEditableParams( + ID_MOCK, + EIP_1559_TRANSACTION_PARAMS_MOCK, + ); + + expect( + Engine.context.TransactionController.updateEditableParams, + ).toHaveBeenCalledWith(ID_MOCK, EIP_1559_TRANSACTION_PARAMS_MOCK); + }); + + it('when requested transaction params changes does not exist', () => { + mockGetTransactions([EIP1559_TRANSACTION_META_MOCK]); + + TransactionControllerUtils.updateTransaction( + { id: ID_MOCK } as TransactionMeta, + 'testNote', + ); + + expect( + Engine.context.TransactionController.updateTransaction, + ).toHaveBeenCalledWith({ id: ID_MOCK } as TransactionMeta, 'testNote'); + + TransactionControllerUtils.updateEditableParams( + ID_MOCK, + undefined as unknown as Parameters< + typeof TransactionControllerUtils.updateEditableParams + >[1], + ); + + expect( + Engine.context.TransactionController.updateEditableParams, + ).toHaveBeenCalledWith( + ID_MOCK, + undefined as unknown as Parameters< + typeof TransactionControllerUtils.updateEditableParams + >[1], + ); + }); + + it('when transaction type is not legacy or feeMarket', () => { + mockGetTransactions([ + { + ...EIP1559_TRANSACTION_META_MOCK, + txParams: { + ...EIP_1559_TRANSACTION_PARAMS_MOCK, + type: '0x4', + }, + }, + ]); + + TransactionControllerUtils.updateTransaction( + EIP1559_TRANSACTION_META_MOCK, + 'testNote', + ); + + expect( + Engine.context.TransactionController.updateTransaction, + ).toHaveBeenCalledWith(EIP1559_TRANSACTION_META_MOCK, 'testNote'); + + TransactionControllerUtils.updateEditableParams( + ID_MOCK, + EIP_1559_TRANSACTION_PARAMS_MOCK, + ); + + expect( + Engine.context.TransactionController.updateEditableParams, + ).toHaveBeenCalledWith(ID_MOCK, EIP_1559_TRANSACTION_PARAMS_MOCK); + }); + }); + + testSanitization({ + expectedCallArgumentIndex: 0, + paramToSanitize: ['maxFeePerGas', 'maxPriorityFeePerGas'], + testName: + 'updateTransaction removes maxFeePerGas and maxPriorityFeePerGas values for legacy transactions', + transactionMock: LEGACY_TRANSACTION_META_MOCK, + updaterFunction: TransactionControllerUtils.updateTransaction, + updaterFunctionName: 'updateTransaction', + updaterFunctionParams: [EIP1559_TRANSACTION_META_MOCK, 'testNote'], + }); + + testSanitization({ + expectedCallArgumentIndex: 0, + paramToSanitize: ['gasPrice'], + testName: 'updateTransaction removes gasPrice for EIP-1559 transactions', + transactionMock: EIP1559_TRANSACTION_META_MOCK, + updaterFunction: TransactionControllerUtils.updateTransaction, + updaterFunctionName: 'updateTransaction', + updaterFunctionParams: [EIP1559_TRANSACTION_META_MOCK, 'testNote'], + }); + + testSanitization({ + expectedCallArgumentIndex: 1, + paramToSanitize: ['maxFeePerGas', 'maxPriorityFeePerGas'], + testName: + 'updateEditableParams removes maxFeePerGas and maxPriorityFeePerGas values for legacy transactions', + transactionMock: LEGACY_TRANSACTION_META_MOCK, + updaterFunction: TransactionControllerUtils.updateEditableParams, + updaterFunctionName: 'updateEditableParams', + updaterFunctionParams: [ID_MOCK, EIP_1559_TRANSACTION_PARAMS_MOCK], + }); + + testSanitization({ + expectedCallArgumentIndex: 1, + paramToSanitize: ['gasPrice'], + testName: + 'updateEditableParams removes gasPrice for EIP-1559 transactions', + transactionMock: EIP1559_TRANSACTION_META_MOCK, + updaterFunction: TransactionControllerUtils.updateEditableParams, + updaterFunctionName: 'updateEditableParams', + updaterFunctionParams: [ID_MOCK, EIP_1559_TRANSACTION_PARAMS_MOCK], + }); + }); }); diff --git a/app/util/transaction-controller/index.ts b/app/util/transaction-controller/index.ts index 5c8ffccb6eee..a6fc460aa28e 100644 --- a/app/util/transaction-controller/index.ts +++ b/app/util/transaction-controller/index.ts @@ -1,5 +1,7 @@ import { + GasFeeEstimateType, TransactionParams, + TransactionEnvelopeType, TransactionController as BaseTransactionController, } from '@metamask/transaction-controller'; import { Hex } from '@metamask/utils'; @@ -102,6 +104,12 @@ export function updateTransaction( ...args: Parameters ) { const { TransactionController } = Engine.context; + const { txParams, id } = args[0]; + + // This is a temporary fix to ensure legacy transaction confirmations does not override expected gas properties + // Once redesign is complete, this can be removed + sanitizeTransactionParamsGasValues(id, txParams); + return TransactionController.updateTransaction(...args); } @@ -116,6 +124,13 @@ export function updateEditableParams( ...args: Parameters ) { const { TransactionController } = Engine.context; + const id = args[0]; + const txParams = args[1]; + + // This is a temporary fix to ensure legacy transaction confirmations does not override expected gas properties + // Once redesign is complete, this can be removed + sanitizeTransactionParamsGasValues(id, txParams); + return TransactionController.updateEditableParams(...args); } @@ -129,3 +144,45 @@ export const getNetworkNonce = async ( return nextNonce; }; + +function sanitizeTransactionParamsGasValues( + transactionId: string, + requestedTransactionParamsToUpdate: Partial, +) { + const { TransactionController } = Engine.context; + + const transactionMeta = TransactionController?.getTransactions({ + searchCriteria: { id: transactionId }, + })?.[0]; + + if (!transactionMeta || !requestedTransactionParamsToUpdate) { + return; + } + + const envelopeType = transactionMeta.txParams.type; + + if (envelopeType === TransactionEnvelopeType.legacy) { + requestedTransactionParamsToUpdate.type = TransactionEnvelopeType.legacy; + delete requestedTransactionParamsToUpdate.maxFeePerGas; + delete requestedTransactionParamsToUpdate.maxPriorityFeePerGas; + } else if (envelopeType === TransactionEnvelopeType.feeMarket) { + requestedTransactionParamsToUpdate.type = TransactionEnvelopeType.feeMarket; + if ( + transactionMeta?.gasFeeEstimates?.type === GasFeeEstimateType.GasPrice + ) { + // Try picking 1559 gas properties in order to ensure legacy transaction confirmations is setting expected gas properties + // 1. Requested change + // 2. Existing txParams + // 3. Existing gasFeeEstimates + requestedTransactionParamsToUpdate.maxFeePerGas = + requestedTransactionParamsToUpdate?.maxFeePerGas || + transactionMeta?.txParams?.maxFeePerGas || + transactionMeta?.gasFeeEstimates?.gasPrice; + requestedTransactionParamsToUpdate.maxPriorityFeePerGas = + requestedTransactionParamsToUpdate?.maxPriorityFeePerGas || + transactionMeta?.txParams?.maxPriorityFeePerGas || + transactionMeta?.gasFeeEstimates?.gasPrice; + } + delete requestedTransactionParamsToUpdate.gasPrice; + } +} diff --git a/bitrise.yml b/bitrise.yml index e46c585faa75..e3110730e84b 100644 --- a/bitrise.yml +++ b/bitrise.yml @@ -2210,16 +2210,16 @@ app: PROJECT_LOCATION_IOS: ios - opts: is_expand: false - VERSION_NAME: 7.46.1 + VERSION_NAME: 7.46.2 - opts: is_expand: false - VERSION_NUMBER: 1862 + VERSION_NUMBER: 1891 - opts: is_expand: false - FLASK_VERSION_NAME: 7.46.1 + FLASK_VERSION_NAME: 7.46.2 - opts: is_expand: false - FLASK_VERSION_NUMBER: 1862 + FLASK_VERSION_NUMBER: 1891 - opts: is_expand: false ANDROID_APK_LINK: '' diff --git a/ios/MetaMask.xcodeproj/project.pbxproj b/ios/MetaMask.xcodeproj/project.pbxproj index f92b059954ab..2dccede77084 100644 --- a/ios/MetaMask.xcodeproj/project.pbxproj +++ b/ios/MetaMask.xcodeproj/project.pbxproj @@ -1261,7 +1261,7 @@ CODE_SIGN_IDENTITY = "Apple Development"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1862; + CURRENT_PROJECT_VERSION = 1891; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1299,7 +1299,7 @@ "${inherited}", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.46.1; + MARKETING_VERSION = 7.46.2; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1330,7 +1330,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1862; + CURRENT_PROJECT_VERSION = 1891; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1365,7 +1365,7 @@ "${inherited}", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.46.1; + MARKETING_VERSION = 7.46.2; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1395,7 +1395,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1862; + CURRENT_PROJECT_VERSION = 1891; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1432,7 +1432,7 @@ "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.46.1; + MARKETING_VERSION = 7.46.2; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1461,7 +1461,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1862; + CURRENT_PROJECT_VERSION = 1891; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1496,7 +1496,7 @@ "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.46.1; + MARKETING_VERSION = 7.46.2; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = "$(inherited)"; OTHER_LDFLAGS = ( @@ -1620,7 +1620,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMaskDebug.entitlements; CODE_SIGN_IDENTITY = "Apple Development"; CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1862; + CURRENT_PROJECT_VERSION = 1891; DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; DEVELOPMENT_TEAM = 48XVW22RCG; @@ -1657,7 +1657,7 @@ "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.46.1; + MARKETING_VERSION = 7.46.2; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "$(inherited)", @@ -1689,7 +1689,7 @@ CODE_SIGN_ENTITLEMENTS = MetaMask/MetaMask.entitlements; CODE_SIGN_IDENTITY = "iPhone Distribution"; CODE_SIGN_STYLE = Manual; - CURRENT_PROJECT_VERSION = 1862; + CURRENT_PROJECT_VERSION = 1891; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = 48XVW22RCG; "DEVELOPMENT_TEAM[sdk=iphoneos*]" = 48XVW22RCG; @@ -1724,7 +1724,7 @@ "\"$(SRCROOT)/MetaMask/System/Library/Frameworks\"", ); LLVM_LTO = YES; - MARKETING_VERSION = 7.46.1; + MARKETING_VERSION = 7.46.2; ONLY_ACTIVE_ARCH = NO; OTHER_CFLAGS = ( "$(inherited)", diff --git a/package.json b/package.json index b38541554d4f..2a1eef63c3f0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "metamask", - "version": "7.46.1", + "version": "7.46.2", "private": true, "scripts": { "audit:ci": "./scripts/yarn-audit.sh",